diff options
| author | Thomas Gleixner <[email protected]> | 2020-06-11 15:17:57 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <[email protected]> | 2020-06-11 15:17:57 +0200 | 
| commit | f77d26a9fc525286bcef3d4f98b52e17482cf49c (patch) | |
| tree | 6b179c9aa84787773cb601a14a64255e2912154b /drivers/gpu/drm/amd/amdgpu | |
| parent | b6bea24d41519e8c31e4798f1c1a3f67e540c5d0 (diff) | |
| parent | f0178fc01fe46bab6a95415f5647d1a74efcad1b (diff) | |
Merge branch 'x86/entry' into ras/core
to fixup conflicts in arch/x86/kernel/cpu/mce/core.c so MCE specific follow
up patches can be applied without creating a horrible merge conflict
afterwards.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
140 files changed, 7455 insertions, 3334 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index c2bbcdd9c875..210d57a4afc8 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -55,7 +55,7 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \  	amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o amdgpu_ids.o \  	amdgpu_gmc.o amdgpu_mmhub.o amdgpu_xgmi.o amdgpu_csa.o amdgpu_ras.o amdgpu_vm_cpu.o \  	amdgpu_vm_sdma.o amdgpu_discovery.o amdgpu_ras_eeprom.o amdgpu_nbio.o \ -	amdgpu_umc.o smu_v11_0_i2c.o +	amdgpu_umc.o smu_v11_0_i2c.o amdgpu_fru_eeprom.o  amdgpu-$(CONFIG_PERF_EVENTS) += amdgpu_pmu.o diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 2992a49ad4a5..cd913986863e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -28,6 +28,18 @@  #ifndef __AMDGPU_H__  #define __AMDGPU_H__ +#ifdef pr_fmt +#undef pr_fmt +#endif + +#define pr_fmt(fmt) "amdgpu: " fmt + +#ifdef dev_fmt +#undef dev_fmt +#endif + +#define dev_fmt(fmt) "amdgpu: " fmt +  #include "amdgpu_ctx.h"  #include <linux/atomic.h> @@ -161,6 +173,7 @@ extern int amdgpu_gpu_recovery;  extern int amdgpu_emu_mode;  extern uint amdgpu_smu_memory_pool_size;  extern uint amdgpu_dc_feature_mask; +extern uint amdgpu_dc_debug_mask;  extern uint amdgpu_dm_abm_level;  extern struct amdgpu_mgpu_info mgpu_info;  extern int amdgpu_ras_enable; @@ -177,6 +190,8 @@ extern int sched_policy;  static const int sched_policy = KFD_SCHED_POLICY_HWS;  #endif +extern int amdgpu_tmz; +  #ifdef CONFIG_DRM_AMDGPU_SI  extern int amdgpu_si_support;  #endif @@ -190,8 +205,6 @@ extern int amdgpu_cik_support;  #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS	        3000  #define AMDGPU_MAX_USEC_TIMEOUT			100000	/* 100 ms */  #define AMDGPU_FENCE_JIFFIES_TIMEOUT		(HZ / 2) -/* AMDGPU_IB_POOL_SIZE must be a power of 2 */ -#define AMDGPU_IB_POOL_SIZE			16  #define AMDGPU_DEBUGFS_MAX_COMPONENTS		32  #define AMDGPUFB_CONN_LIMIT			4  #define AMDGPU_BIOS_NUM_SCRATCH			16 @@ -439,7 +452,9 @@ struct amdgpu_fpriv {  int amdgpu_file_to_fpriv(struct file *filp, struct amdgpu_fpriv **fpriv);  int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm, -		  unsigned size, struct amdgpu_ib *ib); +		  unsigned size, +		  enum amdgpu_ib_pool_type pool, +		  struct amdgpu_ib *ib);  void amdgpu_ib_free(struct amdgpu_device *adev, struct amdgpu_ib *ib,  		    struct dma_fence *f);  int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs, @@ -512,7 +527,7 @@ static inline void amdgpu_set_ib_value(struct amdgpu_cs_parser *p,  /*   * Writeback   */ -#define AMDGPU_MAX_WB 128	/* Reserve at most 128 WB slots for amdgpu-owned rings. */ +#define AMDGPU_MAX_WB 256	/* Reserve at most 256 WB slots for amdgpu-owned rings. */  struct amdgpu_wb {  	struct amdgpu_bo	*wb_obj; @@ -724,6 +739,7 @@ struct amdgpu_device {  	uint32_t			rev_id;  	uint32_t			external_rev_id;  	unsigned long			flags; +	unsigned long			apu_flags;  	int				usec_timeout;  	const struct amdgpu_asic_funcs	*asic_funcs;  	bool				shutdown; @@ -751,7 +767,6 @@ struct amdgpu_device {  	uint8_t				*bios;  	uint32_t			bios_size;  	struct amdgpu_bo		*stolen_vga_memory; -	struct amdgpu_bo		*discovery_memory;  	uint32_t			bios_scratch_reg_offset;  	uint32_t			bios_scratch[AMDGPU_BIOS_NUM_SCRATCH]; @@ -843,7 +858,8 @@ struct amdgpu_device {  	unsigned			num_rings;  	struct amdgpu_ring		*rings[AMDGPU_MAX_RINGS];  	bool				ib_pool_ready; -	struct amdgpu_sa_manager	ring_tmp_bo; +	struct amdgpu_sa_manager	ib_pools[AMDGPU_IB_POOL_MAX]; +	struct amdgpu_sched		gpu_sched[AMDGPU_HW_IP_NUM][AMDGPU_RING_PRIO_MAX];  	/* interrupts */  	struct amdgpu_irq		irq; @@ -903,7 +919,9 @@ struct amdgpu_device {  	struct amdgpu_display_manager dm;  	/* discovery */ -	uint8_t				*discovery; +	uint8_t				*discovery_bin; +	uint32_t			discovery_tmr_size; +	struct amdgpu_bo		*discovery_memory;  	/* mes */  	bool                            enable_mes; @@ -923,7 +941,7 @@ struct amdgpu_device {  	atomic64_t gart_pin_size;  	/* soc15 register offset based on ip, instance and  segment */ -	uint32_t 		*reg_offset[MAX_HWIP][HWIP_MAX_INSTANCE]; +	uint32_t		*reg_offset[MAX_HWIP][HWIP_MAX_INSTANCE];  	/* delayed work_func for deferring clockgating during resume */  	struct delayed_work     delayed_init_work; @@ -935,9 +953,6 @@ struct amdgpu_device {  	/* link all shadow bo */  	struct list_head                shadow_list;  	struct mutex                    shadow_list_lock; -	/* keep an lru list of rings by HW IP */ -	struct list_head		ring_lru_list; -	spinlock_t			ring_lru_list_lock;  	/* record hw reset is performed */  	bool has_hw_reset; @@ -945,9 +960,8 @@ struct amdgpu_device {  	/* s3/s4 mask */  	bool                            in_suspend; +	bool				in_hibernate; -	/* record last mm index being written through WREG32*/ -	unsigned long last_mm_index;  	bool                            in_gpu_reset;  	enum pp_mp1_state               mp1_state;  	struct mutex  lock_reset; @@ -966,14 +980,19 @@ struct amdgpu_device {  	uint64_t			unique_id;  	uint64_t	df_perfmon_config_assign_mask[AMDGPU_MAX_DF_PERFMONS]; -	/* device pstate */ -	int				pstate;  	/* enable runtime pm on the device */  	bool                            runpm;  	bool                            in_runpm;  	bool                            pm_sysfs_en;  	bool                            ucode_sysfs_en; + +	/* Chip product information */ +	char				product_number[16]; +	char				product_name[32]; +	char				serial[16]; + +	struct amdgpu_autodump		autodump;  };  static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) @@ -990,10 +1009,10 @@ int amdgpu_gpu_wait_for_idle(struct amdgpu_device *adev);  void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,  			       uint32_t *buf, size_t size, bool write); -uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg, +uint32_t amdgpu_device_rreg(struct amdgpu_device *adev, uint32_t reg, +			    uint32_t acc_flags); +void amdgpu_device_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,  			uint32_t acc_flags); -void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v, -		    uint32_t acc_flags);  void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg, uint32_t v,  		    uint32_t acc_flags);  void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value); @@ -1010,25 +1029,20 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  /*   * Registers read & write functions.   */ - -#define AMDGPU_REGS_IDX       (1<<0)  #define AMDGPU_REGS_NO_KIQ    (1<<1) -#define AMDGPU_REGS_KIQ       (1<<2) -#define RREG32_NO_KIQ(reg) amdgpu_mm_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ) -#define WREG32_NO_KIQ(reg, v) amdgpu_mm_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ) +#define RREG32_NO_KIQ(reg) amdgpu_device_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ) +#define WREG32_NO_KIQ(reg, v) amdgpu_device_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ) -#define RREG32_KIQ(reg) amdgpu_mm_rreg(adev, (reg), AMDGPU_REGS_KIQ) -#define WREG32_KIQ(reg, v) amdgpu_mm_wreg(adev, (reg), (v), AMDGPU_REGS_KIQ) +#define RREG32_KIQ(reg) amdgpu_kiq_rreg(adev, (reg)) +#define WREG32_KIQ(reg, v) amdgpu_kiq_wreg(adev, (reg), (v))  #define RREG8(reg) amdgpu_mm_rreg8(adev, (reg))  #define WREG8(reg, v) amdgpu_mm_wreg8(adev, (reg), (v)) -#define RREG32(reg) amdgpu_mm_rreg(adev, (reg), 0) -#define RREG32_IDX(reg) amdgpu_mm_rreg(adev, (reg), AMDGPU_REGS_IDX) -#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_mm_rreg(adev, (reg), 0)) -#define WREG32(reg, v) amdgpu_mm_wreg(adev, (reg), (v), 0) -#define WREG32_IDX(reg, v) amdgpu_mm_wreg(adev, (reg), (v), AMDGPU_REGS_IDX) +#define RREG32(reg) amdgpu_device_rreg(adev, (reg), 0) +#define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", amdgpu_device_rreg(adev, (reg), 0)) +#define WREG32(reg, v) amdgpu_device_wreg(adev, (reg), (v), 0)  #define REG_SET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)  #define REG_GET(FIELD, v) (((v) << FIELD##_SHIFT) & FIELD##_MASK)  #define RREG32_PCIE(reg) adev->pcie_rreg(adev, (reg)) @@ -1065,7 +1079,7 @@ int emu_soc_asic_init(struct amdgpu_device *adev);  		tmp_ |= ((val) & ~(mask));			\  		WREG32_PLL(reg, tmp_);				\  	} while (0) -#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_mm_rreg((adev), (reg), false)) +#define DREG32_SYS(sqf, adev, reg) seq_printf((sqf), #reg " : 0x%08X\n", amdgpu_device_rreg((adev), (reg), false))  #define RREG32_IO(reg) amdgpu_io_rreg(adev, (reg))  #define WREG32_IO(reg, v) amdgpu_io_wreg(adev, (reg), (v)) @@ -1248,5 +1262,9 @@ _name##_show(struct device *dev,					\  									\  static struct device_attribute pmu_attr_##_name = __ATTR_RO(_name) -#endif +static inline bool amdgpu_is_tmz(struct amdgpu_device *adev) +{ +       return adev->gmc.tmz_enabled; +} +#endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c index 1e41367ef74e..956cbbda4793 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c @@ -444,7 +444,6 @@ static int amdgpu_atif_handler(struct amdgpu_device *adev,  		DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count); -		/* todo: add DC handling */  		if ((req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) &&  		    !amdgpu_device_has_dc_support(adev)) {  			struct amdgpu_encoder *enc = atif->encoder_for_bl; @@ -463,6 +462,27 @@ static int amdgpu_atif_handler(struct amdgpu_device *adev,  #endif  			}  		} +#if defined(CONFIG_DRM_AMD_DC) +#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) +		if ((req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) && +		    amdgpu_device_has_dc_support(adev)) { +			struct amdgpu_display_manager *dm = &adev->dm; +			struct backlight_device *bd = dm->backlight_dev; + +			if (bd) { +				DRM_DEBUG_DRIVER("Changing brightness to %d\n", +						 req.backlight_level); + +				/* +				 * XXX backlight_device_set_brightness() is +				 * hardwired to post BACKLIGHT_UPDATE_SYSFS. +				 * It probably should accept 'reason' parameter. +				 */ +				backlight_device_set_brightness(bd, req.backlight_level); +			} +		} +#endif +#endif  		if (req.pending & ATIF_DGPU_DISPLAY_EVENT) {  			if (adev->flags & AMD_IS_PX) {  				pm_runtime_get_sync(adev->ddev->dev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c index abfbe89e805e..ad59ac4423b8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c @@ -564,6 +564,13 @@ uint32_t amdgpu_amdkfd_get_num_gws(struct kgd_dev *kgd)  	return adev->gds.gws_size;  } +uint32_t amdgpu_amdkfd_get_asic_rev_id(struct kgd_dev *kgd) +{ +	struct amdgpu_device *adev = (struct amdgpu_device *)kgd; + +	return adev->rev_id; +} +  int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine,  				uint32_t vmid, uint64_t gpu_addr,  				uint32_t *ib_cmd, uint32_t ib_len) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 13feb313e9b3..53b4126373a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -65,6 +65,7 @@ struct kgd_mem {  	struct amdgpu_sync sync;  	bool aql_queue; +	bool is_imported;  };  /* KFD Memory Eviction */ @@ -148,6 +149,9 @@ int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev);  void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd); +int amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev, +					int queue_bit); +  /* Shared API */  int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size,  				void **mem_obj, uint64_t *gpu_addr, @@ -175,13 +179,14 @@ uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd);  uint64_t amdgpu_amdkfd_get_unique_id(struct kgd_dev *kgd);  uint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd);  uint32_t amdgpu_amdkfd_get_num_gws(struct kgd_dev *kgd); +uint32_t amdgpu_amdkfd_get_asic_rev_id(struct kgd_dev *kgd);  uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev *dst, struct kgd_dev *src);  /* Read user wptr from a specified user address space with page fault   * disabled. The memory must be pinned and mapped to the hardware when   * this is called in hqd_load functions, so it should never fault in   * the first place. This resolves a circular lock dependency involving - * four locks, including the DQM lock and mmap_sem. + * four locks, including the DQM lock and mmap_lock.   */  #define read_user_wptr(mmptr, wptr, dst)				\  	({								\ @@ -218,7 +223,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(  		void *vm, struct kgd_mem **mem,  		uint64_t *offset, uint32_t flags);  int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( -		struct kgd_dev *kgd, struct kgd_mem *mem); +		struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size);  int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(  		struct kgd_dev *kgd, struct kgd_mem *mem, void *vm);  int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu( 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 4ec6d0c03201..691c89705bcd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c @@ -543,6 +543,9 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, void *mqd,  	uint32_t temp;  	struct v10_compute_mqd *m = get_mqd(mqd); +	if (adev->in_gpu_reset) +		return -EIO; +  #if 0  	unsigned long flags;  	int retry; 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 0b7e78748540..c6944739183a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c @@ -237,7 +237,7 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,  			     CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1);  	WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, data); -	/* read_user_ptr may take the mm->mmap_sem. +	/* read_user_ptr may take the mm->mmap_lock.  	 * release srbm_mutex to avoid circular dependency between  	 * srbm_mutex->mm_sem->reservation_ww_class_mutex->srbm_mutex.  	 */ 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 ccd635b812b5..2f4bdc80a6b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c @@ -224,7 +224,7 @@ static int kgd_hqd_load(struct kgd_dev *kgd, void *mqd, uint32_t pipe_id,  			     CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1);  	WREG32(mmCP_HQD_PQ_DOORBELL_CONTROL, data); -	/* read_user_ptr may take the mm->mmap_sem. +	/* read_user_ptr may take the mm->mmap_lock.  	 * release srbm_mutex to avoid circular dependency between  	 * srbm_mutex->mm_sem->reservation_ww_class_mutex->srbm_mutex.  	 */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 9dff792c9290..b91b5171270f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -362,13 +362,13 @@ static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm)  	ret = amdgpu_vm_validate_pt_bos(adev, vm, amdgpu_amdkfd_validate,  					¶m);  	if (ret) { -		pr_err("amdgpu: failed to validate PT BOs\n"); +		pr_err("failed to validate PT BOs\n");  		return ret;  	}  	ret = amdgpu_amdkfd_validate(¶m, pd);  	if (ret) { -		pr_err("amdgpu: failed to validate PD\n"); +		pr_err("failed to validate PD\n");  		return ret;  	} @@ -377,7 +377,7 @@ static int vm_validate_pt_pd_bos(struct amdgpu_vm *vm)  	if (vm->use_cpu_for_update) {  		ret = amdgpu_bo_kmap(pd, NULL);  		if (ret) { -			pr_err("amdgpu: failed to kmap PD, ret=%d\n", ret); +			pr_err("failed to kmap PD, ret=%d\n", ret);  			return ret;  		}  	} @@ -660,15 +660,15 @@ static int reserve_bo_and_vm(struct kgd_mem *mem,  	ret = ttm_eu_reserve_buffers(&ctx->ticket, &ctx->list,  				     false, &ctx->duplicates); -	if (!ret) -		ctx->reserved = true; -	else { -		pr_err("Failed to reserve buffers in ttm\n"); +	if (ret) { +		pr_err("Failed to reserve buffers in ttm.\n");  		kfree(ctx->vm_pd);  		ctx->vm_pd = NULL; +		return ret;  	} -	return ret; +	ctx->reserved = true; +	return 0;  }  /** @@ -733,17 +733,15 @@ static int reserve_bo_and_cond_vms(struct kgd_mem *mem,  	ret = ttm_eu_reserve_buffers(&ctx->ticket, &ctx->list,  				     false, &ctx->duplicates); -	if (!ret) -		ctx->reserved = true; -	else -		pr_err("Failed to reserve buffers in ttm.\n"); -  	if (ret) { +		pr_err("Failed to reserve buffers in ttm.\n");  		kfree(ctx->vm_pd);  		ctx->vm_pd = NULL; +		return ret;  	} -	return ret; +	ctx->reserved = true; +	return 0;  }  /** @@ -1279,31 +1277,30 @@ err:  }  int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( -		struct kgd_dev *kgd, struct kgd_mem *mem) +		struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size)  {  	struct amdkfd_process_info *process_info = mem->process_info;  	unsigned long bo_size = mem->bo->tbo.mem.size;  	struct kfd_bo_va_list *entry, *tmp;  	struct bo_vm_reservation_context ctx;  	struct ttm_validate_buffer *bo_list_entry; +	unsigned int mapped_to_gpu_memory;  	int ret; +	bool is_imported = 0;  	mutex_lock(&mem->lock); - -	if (mem->mapped_to_gpu_memory > 0) { -		pr_debug("BO VA 0x%llx size 0x%lx is still mapped.\n", -				mem->va, bo_size); -		mutex_unlock(&mem->lock); -		return -EBUSY; -	} - +	mapped_to_gpu_memory = mem->mapped_to_gpu_memory; +	is_imported = mem->is_imported;  	mutex_unlock(&mem->lock);  	/* lock is not needed after this, since mem is unused and will  	 * be freed anyway  	 */ -	/* No more MMU notifiers */ -	amdgpu_mn_unregister(mem->bo); +	if (mapped_to_gpu_memory > 0) { +		pr_debug("BO VA 0x%llx size 0x%lx is still mapped.\n", +				mem->va, bo_size); +		return -EBUSY; +	}  	/* Make sure restore workers don't access the BO any more */  	bo_list_entry = &mem->validate_list; @@ -1311,6 +1308,9 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(  	list_del(&bo_list_entry->head);  	mutex_unlock(&process_info->lock); +	/* No more MMU notifiers */ +	amdgpu_mn_unregister(mem->bo); +  	ret = reserve_bo_and_cond_vms(mem, NULL, BO_VM_ALL, &ctx);  	if (unlikely(ret))  		return ret; @@ -1342,8 +1342,19 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(  		kfree(mem->bo->tbo.sg);  	} +	/* Update the size of the BO being freed if it was allocated from +	 * VRAM and is not imported. +	 */ +	if (size) { +		if ((mem->bo->preferred_domains == AMDGPU_GEM_DOMAIN_VRAM) && +		    (!is_imported)) +			*size = bo_size; +		else +			*size = 0; +	} +  	/* Free the BO*/ -	amdgpu_bo_unref(&mem->bo); +	drm_gem_object_put_unlocked(&mem->bo->tbo.base);  	mutex_destroy(&mem->lock);  	kfree(mem); @@ -1382,9 +1393,9 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(  	 * concurrently and the queues are actually stopped  	 */  	if (amdgpu_ttm_tt_get_usermm(bo->tbo.ttm)) { -		down_write(¤t->mm->mmap_sem); +		mmap_write_lock(current->mm);  		is_invalid_userptr = atomic_read(&mem->invalid); -		up_write(¤t->mm->mmap_sem); +		mmap_write_unlock(current->mm);  	}  	mutex_lock(&mem->lock); @@ -1688,7 +1699,8 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,  		| KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE  		| KFD_IOC_ALLOC_MEM_FLAGS_EXECUTABLE; -	(*mem)->bo = amdgpu_bo_ref(bo); +	drm_gem_object_get(&bo->tbo.base); +	(*mem)->bo = bo;  	(*mem)->va = va;  	(*mem)->domain = (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM) ?  		AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT; @@ -1696,6 +1708,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd,  	(*mem)->process_info = avm->process_info;  	add_kgd_mem_to_kfd_bo_list(*mem, avm->process_info, false);  	amdgpu_sync_create(&(*mem)->sync); +	(*mem)->is_imported = true;  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c index d1495e1c9289..d9b35df33806 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_benchmark.c @@ -40,7 +40,7 @@ static int amdgpu_benchmark_do_move(struct amdgpu_device *adev, unsigned size,  	for (i = 0; i < n; i++) {  		struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;  		r = amdgpu_copy_buffer(ring, saddr, daddr, size, NULL, &fence, -				       false, false); +				       false, false, false);  		if (r)  			goto exit_do_move;  		r = dma_fence_wait(fence, false); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index 031b094607bd..78ac6dbe70d8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c @@ -60,8 +60,6 @@ static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device,  {  	CGS_FUNC_ADEV;  	switch (space) { -	case CGS_IND_REG__MMIO: -		return RREG32_IDX(index);  	case CGS_IND_REG__PCIE:  		return RREG32_PCIE(index);  	case CGS_IND_REG__SMC: @@ -77,6 +75,8 @@ static uint32_t amdgpu_cgs_read_ind_register(struct cgs_device *cgs_device,  	case CGS_IND_REG__AUDIO_ENDPT:  		DRM_ERROR("audio endpt register access not implemented.\n");  		return 0; +	default: +		BUG();  	}  	WARN(1, "Invalid indirect register space");  	return 0; @@ -88,8 +88,6 @@ static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,  {  	CGS_FUNC_ADEV;  	switch (space) { -	case CGS_IND_REG__MMIO: -		return WREG32_IDX(index, value);  	case CGS_IND_REG__PCIE:  		return WREG32_PCIE(index, value);  	case CGS_IND_REG__SMC: @@ -105,6 +103,8 @@ static void amdgpu_cgs_write_ind_register(struct cgs_device *cgs_device,  	case CGS_IND_REG__AUDIO_ENDPT:  		DRM_ERROR("audio endpt register access not implemented.\n");  		return; +	default: +		BUG();  	}  	WARN(1, "Invalid indirect register space");  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index af91627b19b0..19070226a945 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -924,7 +924,8 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,  		ring = to_amdgpu_ring(entity->rq->sched);  		r =  amdgpu_ib_get(adev, vm, ring->funcs->parse_cs ? -				   chunk_ib->ib_bytes : 0, ib); +				   chunk_ib->ib_bytes : 0, +				   AMDGPU_IB_POOL_DELAYED, ib);  		if (r) {  			DRM_ERROR("Failed to get ib !\n");  			return r; @@ -1207,7 +1208,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  {  	struct amdgpu_fpriv *fpriv = p->filp->driver_priv;  	struct drm_sched_entity *entity = p->entity; -	enum drm_sched_priority priority;  	struct amdgpu_bo_list_entry *e;  	struct amdgpu_job *job;  	uint64_t seq; @@ -1257,7 +1257,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  	trace_amdgpu_cs_ioctl(job);  	amdgpu_vm_bo_trace_cs(&fpriv->vm, &p->ticket); -	priority = job->base.s_priority;  	drm_sched_entity_push_job(&job->base, entity);  	amdgpu_vm_move_to_lru_tail(p->adev, &fpriv->vm); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c index 6ed36a2c5f73..8842c55d4490 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c @@ -26,6 +26,7 @@  #include "amdgpu.h"  #include "amdgpu_sched.h"  #include "amdgpu_ras.h" +#include <linux/nospec.h>  #define to_amdgpu_ctx_entity(e)	\  	container_of((e), struct amdgpu_ctx_entity, entity) @@ -72,13 +73,30 @@ static enum gfx_pipe_priority amdgpu_ctx_sched_prio_to_compute_prio(enum drm_sch  	}  } -static int amdgpu_ctx_init_entity(struct amdgpu_ctx *ctx, const u32 hw_ip, const u32 ring) +static unsigned int amdgpu_ctx_prio_sched_to_hw(struct amdgpu_device *adev, +						 enum drm_sched_priority prio, +						 u32 hw_ip) +{ +	unsigned int hw_prio; + +	hw_prio = (hw_ip == AMDGPU_HW_IP_COMPUTE) ? +			amdgpu_ctx_sched_prio_to_compute_prio(prio) : +			AMDGPU_RING_PRIO_DEFAULT; +	hw_ip = array_index_nospec(hw_ip, AMDGPU_HW_IP_NUM); +	if (adev->gpu_sched[hw_ip][hw_prio].num_scheds == 0) +		hw_prio = AMDGPU_RING_PRIO_DEFAULT; + +	return hw_prio; +} + +static int amdgpu_ctx_init_entity(struct amdgpu_ctx *ctx, u32 hw_ip, +				   const u32 ring)  {  	struct amdgpu_device *adev = ctx->adev;  	struct amdgpu_ctx_entity *entity;  	struct drm_gpu_scheduler **scheds = NULL, *sched = NULL;  	unsigned num_scheds = 0; -	enum gfx_pipe_priority hw_prio; +	unsigned int hw_prio;  	enum drm_sched_priority priority;  	int r; @@ -90,52 +108,16 @@ static int amdgpu_ctx_init_entity(struct amdgpu_ctx *ctx, const u32 hw_ip, const  	entity->sequence = 1;  	priority = (ctx->override_priority == DRM_SCHED_PRIORITY_UNSET) ?  				ctx->init_priority : ctx->override_priority; -	switch (hw_ip) { -	case AMDGPU_HW_IP_GFX: -		sched = &adev->gfx.gfx_ring[0].sched; -		scheds = &sched; -		num_scheds = 1; -		break; -	case AMDGPU_HW_IP_COMPUTE: -		hw_prio = amdgpu_ctx_sched_prio_to_compute_prio(priority); -		scheds = adev->gfx.compute_prio_sched[hw_prio]; -		num_scheds = adev->gfx.num_compute_sched[hw_prio]; -		break; -	case AMDGPU_HW_IP_DMA: -		scheds = adev->sdma.sdma_sched; -		num_scheds = adev->sdma.num_sdma_sched; -		break; -	case AMDGPU_HW_IP_UVD: -		sched = &adev->uvd.inst[0].ring.sched; -		scheds = &sched; -		num_scheds = 1; -		break; -	case AMDGPU_HW_IP_VCE: -		sched = &adev->vce.ring[0].sched; -		scheds = &sched; -		num_scheds = 1; -		break; -	case AMDGPU_HW_IP_UVD_ENC: -		sched = &adev->uvd.inst[0].ring_enc[0].sched; -		scheds = &sched; -		num_scheds = 1; -		break; -	case AMDGPU_HW_IP_VCN_DEC: -		sched = drm_sched_pick_best(adev->vcn.vcn_dec_sched, -					    adev->vcn.num_vcn_dec_sched); -		scheds = &sched; -		num_scheds = 1; -		break; -	case AMDGPU_HW_IP_VCN_ENC: -		sched = drm_sched_pick_best(adev->vcn.vcn_enc_sched, -					    adev->vcn.num_vcn_enc_sched); +	hw_prio = amdgpu_ctx_prio_sched_to_hw(adev, priority, hw_ip); + +	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 (hw_ip == AMDGPU_HW_IP_VCN_ENC || hw_ip == AMDGPU_HW_IP_VCN_DEC) { +		sched = drm_sched_pick_best(scheds, num_scheds);  		scheds = &sched;  		num_scheds = 1; -		break; -	case AMDGPU_HW_IP_VCN_JPEG: -		scheds = adev->jpeg.jpeg_sched; -		num_scheds =  adev->jpeg.num_jpeg_sched; -		break;  	}  	r = drm_sched_entity_init(&entity->entity, priority, scheds, num_scheds, @@ -178,7 +160,6 @@ static int amdgpu_ctx_init(struct amdgpu_device *adev,  	ctx->override_priority = DRM_SCHED_PRIORITY_UNSET;  	return 0; -  }  static void amdgpu_ctx_fini_entity(struct amdgpu_ctx_entity *entity) @@ -525,7 +506,7 @@ static void amdgpu_ctx_set_entity_priority(struct amdgpu_ctx *ctx,  					    enum drm_sched_priority priority)  {  	struct amdgpu_device *adev = ctx->adev; -	enum gfx_pipe_priority hw_prio; +	unsigned int hw_prio;  	struct drm_gpu_scheduler **scheds = NULL;  	unsigned num_scheds; @@ -534,9 +515,11 @@ static void amdgpu_ctx_set_entity_priority(struct amdgpu_ctx *ctx,  	/* set hw priority */  	if (hw_ip == AMDGPU_HW_IP_COMPUTE) { -		hw_prio = amdgpu_ctx_sched_prio_to_compute_prio(priority); -		scheds = adev->gfx.compute_prio_sched[hw_prio]; -		num_scheds = adev->gfx.num_compute_sched[hw_prio]; +		hw_prio = amdgpu_ctx_prio_sched_to_hw(adev, priority, +						      AMDGPU_HW_IP_COMPUTE); +		hw_prio = array_index_nospec(hw_prio, AMDGPU_RING_PRIO_MAX); +		scheds = adev->gpu_sched[hw_ip][hw_prio].sched; +		num_scheds = adev->gpu_sched[hw_ip][hw_prio].num_scheds;  		drm_sched_entity_modify_sched(&aentity->entity, scheds,  					      num_scheds);  	} @@ -665,78 +648,3 @@ void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr)  	idr_destroy(&mgr->ctx_handles);  	mutex_destroy(&mgr->lock);  } - - -static void amdgpu_ctx_init_compute_sched(struct amdgpu_device *adev) -{ -	int num_compute_sched_normal = 0; -	int num_compute_sched_high = AMDGPU_MAX_COMPUTE_RINGS - 1; -	int i; - -	/* use one drm sched array, gfx.compute_sched to store both high and -	 * normal priority drm compute schedulers */ -	for (i = 0; i < adev->gfx.num_compute_rings; i++) { -		if (!adev->gfx.compute_ring[i].has_high_prio) -			adev->gfx.compute_sched[num_compute_sched_normal++] = -				&adev->gfx.compute_ring[i].sched; -		else -			adev->gfx.compute_sched[num_compute_sched_high--] = -				&adev->gfx.compute_ring[i].sched; -	} - -	/* compute ring only has two priority for now */ -	i = AMDGPU_GFX_PIPE_PRIO_NORMAL; -	adev->gfx.compute_prio_sched[i] = &adev->gfx.compute_sched[0]; -	adev->gfx.num_compute_sched[i] = num_compute_sched_normal; - -	i = AMDGPU_GFX_PIPE_PRIO_HIGH; -	if (num_compute_sched_high == (AMDGPU_MAX_COMPUTE_RINGS - 1)) { -		/* When compute has no high priority rings then use */ -		/* normal priority sched array */ -		adev->gfx.compute_prio_sched[i] = &adev->gfx.compute_sched[0]; -		adev->gfx.num_compute_sched[i] = num_compute_sched_normal; -	} else { -		adev->gfx.compute_prio_sched[i] = -			&adev->gfx.compute_sched[num_compute_sched_high - 1]; -		adev->gfx.num_compute_sched[i] = -			adev->gfx.num_compute_rings - num_compute_sched_normal; -	} -} - -void amdgpu_ctx_init_sched(struct amdgpu_device *adev) -{ -	int i, j; - -	amdgpu_ctx_init_compute_sched(adev); -	for (i = 0; i < adev->gfx.num_gfx_rings; i++) { -		adev->gfx.gfx_sched[i] = &adev->gfx.gfx_ring[i].sched; -		adev->gfx.num_gfx_sched++; -	} - -	for (i = 0; i < adev->sdma.num_instances; i++) { -		adev->sdma.sdma_sched[i] = &adev->sdma.instance[i].ring.sched; -		adev->sdma.num_sdma_sched++; -	} - -	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { -		if (adev->vcn.harvest_config & (1 << i)) -			continue; -		adev->vcn.vcn_dec_sched[adev->vcn.num_vcn_dec_sched++] = -			&adev->vcn.inst[i].ring_dec.sched; -	} - -	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { -		if (adev->vcn.harvest_config & (1 << i)) -			continue; -		for (j = 0; j < adev->vcn.num_enc_rings; ++j) -			adev->vcn.vcn_enc_sched[adev->vcn.num_vcn_enc_sched++] = -				&adev->vcn.inst[i].ring_enc[j].sched; -	} - -	for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { -		if (adev->jpeg.harvest_config & (1 << i)) -			continue; -		adev->jpeg.jpeg_sched[adev->jpeg.num_jpeg_sched++] = -			&adev->jpeg.inst[i].ring_dec.sched; -	} -} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h index de490f183af2..f54e10314661 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h @@ -88,7 +88,4 @@ void amdgpu_ctx_mgr_entity_fini(struct amdgpu_ctx_mgr *mgr);  long amdgpu_ctx_mgr_entity_flush(struct amdgpu_ctx_mgr *mgr, long timeout);  void amdgpu_ctx_mgr_fini(struct amdgpu_ctx_mgr *mgr); -void amdgpu_ctx_init_sched(struct amdgpu_device *adev); - -  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c index c0f9a651dc06..d33cb344be69 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c @@ -27,7 +27,7 @@  #include <linux/pci.h>  #include <linux/uaccess.h>  #include <linux/pm_runtime.h> - +#include <linux/poll.h>  #include <drm/drm_debugfs.h>  #include "amdgpu.h" @@ -74,8 +74,82 @@ int amdgpu_debugfs_add_files(struct amdgpu_device *adev,  	return 0;  } +int amdgpu_debugfs_wait_dump(struct amdgpu_device *adev) +{ +#if defined(CONFIG_DEBUG_FS) +	unsigned long timeout = 600 * HZ; +	int ret; + +	wake_up_interruptible(&adev->autodump.gpu_hang); + +	ret = wait_for_completion_interruptible_timeout(&adev->autodump.dumping, timeout); +	if (ret == 0) { +		pr_err("autodump: timeout, move on to gpu recovery\n"); +		return -ETIMEDOUT; +	} +#endif +	return 0; +} +  #if defined(CONFIG_DEBUG_FS) +static int amdgpu_debugfs_autodump_open(struct inode *inode, struct file *file) +{ +	struct amdgpu_device *adev = inode->i_private; +	int ret; + +	file->private_data = adev; + +	mutex_lock(&adev->lock_reset); +	if (adev->autodump.dumping.done) { +		reinit_completion(&adev->autodump.dumping); +		ret = 0; +	} else { +		ret = -EBUSY; +	} +	mutex_unlock(&adev->lock_reset); + +	return ret; +} + +static int amdgpu_debugfs_autodump_release(struct inode *inode, struct file *file) +{ +	struct amdgpu_device *adev = file->private_data; + +	complete_all(&adev->autodump.dumping); +	return 0; +} + +static unsigned int amdgpu_debugfs_autodump_poll(struct file *file, struct poll_table_struct *poll_table) +{ +	struct amdgpu_device *adev = file->private_data; + +	poll_wait(file, &adev->autodump.gpu_hang, poll_table); + +	if (adev->in_gpu_reset) +		return POLLIN | POLLRDNORM | POLLWRNORM; + +	return 0; +} + +static const struct file_operations autodump_debug_fops = { +	.owner = THIS_MODULE, +	.open = amdgpu_debugfs_autodump_open, +	.poll = amdgpu_debugfs_autodump_poll, +	.release = amdgpu_debugfs_autodump_release, +}; + +static void amdgpu_debugfs_autodump_init(struct amdgpu_device *adev) +{ +	init_completion(&adev->autodump.dumping); +	complete_all(&adev->autodump.dumping); +	init_waitqueue_head(&adev->autodump.gpu_hang); + +	debugfs_create_file("amdgpu_autodump", 0600, +		adev->ddev->primary->debugfs_root, +		adev, &autodump_debug_fops); +} +  /**   * amdgpu_debugfs_process_reg_op - Handle MMIO register reads/writes   * @@ -152,11 +226,16 @@ static int  amdgpu_debugfs_process_reg_op(bool read, struct file *f,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	if (use_bank) {  		if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) ||  		    (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return -EINVAL;  		}  		mutex_lock(&adev->grbm_idx_mutex); @@ -207,6 +286,7 @@ end:  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -255,6 +335,10 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	while (size) {  		uint32_t value; @@ -263,6 +347,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,  		if (r) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return r;  		} @@ -275,6 +360,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -304,6 +390,10 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	while (size) {  		uint32_t value; @@ -311,6 +401,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user  		if (r) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return r;  		} @@ -325,6 +416,7 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -354,6 +446,10 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	while (size) {  		uint32_t value; @@ -362,6 +458,7 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,  		if (r) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return r;  		} @@ -374,6 +471,7 @@ static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -403,6 +501,10 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	while (size) {  		uint32_t value; @@ -410,6 +512,7 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user  		if (r) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return r;  		} @@ -424,6 +527,7 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -453,6 +557,10 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	while (size) {  		uint32_t value; @@ -461,6 +569,7 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,  		if (r) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return r;  		} @@ -473,6 +582,7 @@ static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -502,6 +612,10 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	while (size) {  		uint32_t value; @@ -509,6 +623,7 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *  		if (r) {  			pm_runtime_mark_last_busy(adev->ddev->dev);  			pm_runtime_put_autosuspend(adev->ddev->dev); +			amdgpu_virt_disable_access_debugfs(adev);  			return r;  		} @@ -523,6 +638,7 @@ static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -651,16 +767,24 @@ static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	r = amdgpu_dpm_read_sensor(adev, idx, &values[0], &valuesize);  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); -	if (r) +	if (r) { +		amdgpu_virt_disable_access_debugfs(adev);  		return r; +	} -	if (size > valuesize) +	if (size > valuesize) { +		amdgpu_virt_disable_access_debugfs(adev);  		return -EINVAL; +	}  	outsize = 0;  	x = 0; @@ -673,6 +797,7 @@ static ssize_t amdgpu_debugfs_sensor_read(struct file *f, char __user *buf,  		}  	} +	amdgpu_virt_disable_access_debugfs(adev);  	return !r ? outsize : r;  } @@ -720,6 +845,10 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	/* switch to the specific se/sh/cu */  	mutex_lock(&adev->grbm_idx_mutex);  	amdgpu_gfx_select_se_sh(adev, se, sh, cu); @@ -734,16 +863,20 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,  	pm_runtime_mark_last_busy(adev->ddev->dev);  	pm_runtime_put_autosuspend(adev->ddev->dev); -	if (!x) +	if (!x) { +		amdgpu_virt_disable_access_debugfs(adev);  		return -EINVAL; +	}  	while (size && (offset < x * 4)) {  		uint32_t value;  		value = data[offset >> 2];  		r = put_user(value, (uint32_t *)buf); -		if (r) +		if (r) { +			amdgpu_virt_disable_access_debugfs(adev);  			return r; +		}  		result += 4;  		buf += 4; @@ -751,6 +884,7 @@ static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf,  		size -= 4;  	} +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -805,6 +939,10 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,  	if (r < 0)  		return r; +	r = amdgpu_virt_enable_access_debugfs(adev); +	if (r < 0) +		return r; +  	/* switch to the specific se/sh/cu */  	mutex_lock(&adev->grbm_idx_mutex);  	amdgpu_gfx_select_se_sh(adev, se, sh, cu); @@ -840,6 +978,7 @@ static ssize_t amdgpu_debugfs_gpr_read(struct file *f, char __user *buf,  err:  	kfree(data); +	amdgpu_virt_disable_access_debugfs(adev);  	return result;  } @@ -1369,6 +1508,8 @@ int amdgpu_debugfs_init(struct amdgpu_device *adev)  	amdgpu_ras_debugfs_create_all(adev); +	amdgpu_debugfs_autodump_init(adev); +  	return amdgpu_debugfs_add_files(adev, amdgpu_debugfs_list,  					ARRAY_SIZE(amdgpu_debugfs_list));  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h index de12d1101526..2803884d338d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.h @@ -31,6 +31,11 @@ struct amdgpu_debugfs {  	unsigned		num_files;  }; +struct amdgpu_autodump { +	struct completion		dumping; +	struct wait_queue_head		gpu_hang; +}; +  int amdgpu_debugfs_regs_init(struct amdgpu_device *adev);  int amdgpu_debugfs_init(struct amdgpu_device *adev);  void amdgpu_debugfs_fini(struct amdgpu_device *adev); @@ -40,3 +45,4 @@ int amdgpu_debugfs_add_files(struct amdgpu_device *adev,  int amdgpu_debugfs_fence_init(struct amdgpu_device *adev);  int amdgpu_debugfs_firmware_init(struct amdgpu_device *adev);  int amdgpu_debugfs_gem_init(struct amdgpu_device *adev); +int amdgpu_debugfs_wait_dump(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 559dc24ef436..a027a8f7b281 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -64,9 +64,11 @@  #include "amdgpu_xgmi.h"  #include "amdgpu_ras.h"  #include "amdgpu_pmu.h" +#include "amdgpu_fru_eeprom.h"  #include <linux/suspend.h>  #include <drm/task_barrier.h> +#include <linux/pm_runtime.h>  MODULE_FIRMWARE("amdgpu/vega10_gpu_info.bin");  MODULE_FIRMWARE("amdgpu/vega12_gpu_info.bin"); @@ -138,6 +140,72 @@ static DEVICE_ATTR(pcie_replay_count, S_IRUGO,  static void amdgpu_device_get_pcie_info(struct amdgpu_device *adev);  /** + * DOC: product_name + * + * The amdgpu driver provides a sysfs API for reporting the product name + * for the device + * The file serial_number is used for this and returns the product name + * as returned from the FRU. + * NOTE: This is only available for certain server cards + */ + +static ssize_t amdgpu_device_get_product_name(struct device *dev, +		struct device_attribute *attr, char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = ddev->dev_private; + +	return snprintf(buf, PAGE_SIZE, "%s\n", adev->product_name); +} + +static DEVICE_ATTR(product_name, S_IRUGO, +		amdgpu_device_get_product_name, NULL); + +/** + * DOC: product_number + * + * The amdgpu driver provides a sysfs API for reporting the part number + * for the device + * The file serial_number is used for this and returns the part number + * as returned from the FRU. + * NOTE: This is only available for certain server cards + */ + +static ssize_t amdgpu_device_get_product_number(struct device *dev, +		struct device_attribute *attr, char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = ddev->dev_private; + +	return snprintf(buf, PAGE_SIZE, "%s\n", adev->product_number); +} + +static DEVICE_ATTR(product_number, S_IRUGO, +		amdgpu_device_get_product_number, NULL); + +/** + * DOC: serial_number + * + * The amdgpu driver provides a sysfs API for reporting the serial number + * for the device + * The file serial_number is used for this and returns the serial number + * as returned from the FRU. + * NOTE: This is only available for certain server cards + */ + +static ssize_t amdgpu_device_get_serial_number(struct device *dev, +		struct device_attribute *attr, char *buf) +{ +	struct drm_device *ddev = dev_get_drvdata(dev); +	struct amdgpu_device *adev = ddev->dev_private; + +	return snprintf(buf, PAGE_SIZE, "%s\n", adev->serial); +} + +static DEVICE_ATTR(serial_number, S_IRUGO, +		amdgpu_device_get_serial_number, NULL); + +/**   * amdgpu_device_supports_boco - Is the device a dGPU with HG/PX power control   *   * @dev: drm_device pointer @@ -231,10 +299,10 @@ void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,  }  /* - * MMIO register access helper functions. + * device register access helper functions.   */  /** - * amdgpu_mm_rreg - read a memory mapped IO register + * amdgpu_device_rreg - read a register   *   * @adev: amdgpu_device pointer   * @reg: dword aligned register offset @@ -242,25 +310,19 @@ void amdgpu_device_vram_access(struct amdgpu_device *adev, loff_t pos,   *   * Returns the 32 bit value from the offset specified.   */ -uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg, -			uint32_t acc_flags) +uint32_t amdgpu_device_rreg(struct amdgpu_device *adev, uint32_t reg, +			    uint32_t acc_flags)  {  	uint32_t ret; -	if ((acc_flags & AMDGPU_REGS_KIQ) || (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))) +	if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))  		return amdgpu_kiq_rreg(adev, reg); -	if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX)) +	if ((reg * 4) < adev->rmmio_size)  		ret = readl(((void __iomem *)adev->rmmio) + (reg * 4)); -	else { -		unsigned long flags; - -		spin_lock_irqsave(&adev->mmio_idx_lock, flags); -		writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4)); -		ret = readl(((void __iomem *)adev->rmmio) + (mmMM_DATA * 4)); -		spin_unlock_irqrestore(&adev->mmio_idx_lock, flags); -	} -	trace_amdgpu_mm_rreg(adev->pdev->device, reg, ret); +	else +		ret = adev->pcie_rreg(adev, (reg * 4)); +	trace_amdgpu_device_rreg(adev->pdev->device, reg, ret);  	return ret;  } @@ -306,28 +368,19 @@ void amdgpu_mm_wreg8(struct amdgpu_device *adev, uint32_t offset, uint8_t value)  		BUG();  } -void static inline amdgpu_mm_wreg_mmio(struct amdgpu_device *adev, uint32_t reg, uint32_t v, uint32_t acc_flags) +void static inline amdgpu_device_wreg_no_kiq(struct amdgpu_device *adev, uint32_t reg, +					     uint32_t v, uint32_t acc_flags)  { -	trace_amdgpu_mm_wreg(adev->pdev->device, reg, v); +	trace_amdgpu_device_wreg(adev->pdev->device, reg, v); -	if ((reg * 4) < adev->rmmio_size && !(acc_flags & AMDGPU_REGS_IDX)) +	if ((reg * 4) < adev->rmmio_size)  		writel(v, ((void __iomem *)adev->rmmio) + (reg * 4)); -	else { -		unsigned long flags; - -		spin_lock_irqsave(&adev->mmio_idx_lock, flags); -		writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4)); -		writel(v, ((void __iomem *)adev->rmmio) + (mmMM_DATA * 4)); -		spin_unlock_irqrestore(&adev->mmio_idx_lock, flags); -	} - -	if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) { -		udelay(500); -	} +	else +		adev->pcie_wreg(adev, (reg * 4), v);  }  /** - * amdgpu_mm_wreg - write to a memory mapped IO register + * amdgpu_device_wreg - write to a register   *   * @adev: amdgpu_device pointer   * @reg: dword aligned register offset @@ -336,17 +389,13 @@ void static inline amdgpu_mm_wreg_mmio(struct amdgpu_device *adev, uint32_t reg,   *   * Writes the value specified to the offset specified.   */ -void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v, -		    uint32_t acc_flags) +void amdgpu_device_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v, +			uint32_t acc_flags)  { -	if (adev->asic_type >= CHIP_VEGA10 && reg == 0) { -		adev->last_mm_index = v; -	} - -	if ((acc_flags & AMDGPU_REGS_KIQ) || (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))) +	if (!(acc_flags & AMDGPU_REGS_NO_KIQ) && amdgpu_sriov_runtime(adev))  		return amdgpu_kiq_wreg(adev, reg, v); -	amdgpu_mm_wreg_mmio(adev, reg, v, acc_flags); +	amdgpu_device_wreg_no_kiq(adev, reg, v, acc_flags);  }  /* @@ -365,7 +414,7 @@ void amdgpu_mm_wreg_mmio_rlc(struct amdgpu_device *adev, uint32_t reg, uint32_t  			return adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, v);  	} -	amdgpu_mm_wreg_mmio(adev, reg, v, acc_flags); +	amdgpu_device_wreg_no_kiq(adev, reg, v, acc_flags);  }  /** @@ -397,20 +446,12 @@ u32 amdgpu_io_rreg(struct amdgpu_device *adev, u32 reg)   */  void amdgpu_io_wreg(struct amdgpu_device *adev, u32 reg, u32 v)  { -	if (adev->asic_type >= CHIP_VEGA10 && reg == 0) { -		adev->last_mm_index = v; -	} -  	if ((reg * 4) < adev->rio_mem_size)  		iowrite32(v, adev->rio_mem + (reg * 4));  	else {  		iowrite32((reg * 4), adev->rio_mem + (mmMM_INDEX * 4));  		iowrite32(v, adev->rio_mem + (mmMM_DATA * 4));  	} - -	if (adev->asic_type >= CHIP_VEGA10 && reg == 1 && adev->last_mm_index == 0x5702C) { -		udelay(500); -	}  }  /** @@ -1126,6 +1167,8 @@ static int amdgpu_device_check_arguments(struct amdgpu_device *adev)  	adev->firmware.load_type = amdgpu_ucode_get_load_type(adev, amdgpu_fw_load_type); +	amdgpu_gmc_tmz_set(adev); +  	return 0;  } @@ -1147,7 +1190,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero  		return;  	if (state == VGA_SWITCHEROO_ON) { -		pr_info("amdgpu: switched on\n"); +		pr_info("switched on\n");  		/* don't suspend or resume card normally */  		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING; @@ -1161,7 +1204,7 @@ static void amdgpu_switcheroo_set_state(struct pci_dev *pdev, enum vga_switchero  		dev->switch_power_state = DRM_SWITCH_POWER_ON;  		drm_kms_helper_poll_enable(dev);  	} else { -		pr_info("amdgpu: switched off\n"); +		pr_info("switched off\n");  		drm_kms_helper_poll_disable(dev);  		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;  		amdgpu_device_suspend(dev, true); @@ -1524,9 +1567,9 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)  		chip_name = "vega12";  		break;  	case CHIP_RAVEN: -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			chip_name = "raven2"; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			chip_name = "picasso";  		else  			chip_name = "raven"; @@ -1574,8 +1617,10 @@ static int amdgpu_device_parse_gpu_info_fw(struct amdgpu_device *adev)  			(const struct gpu_info_firmware_v1_0 *)(adev->firmware.gpu_info_fw->data +  								le32_to_cpu(hdr->header.ucode_array_offset_bytes)); -		if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10) +		if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10) { +			amdgpu_discovery_get_gfx_info(adev);  			goto parse_soc_bounding_box; +		}  		adev->gfx.config.max_shader_engines = le32_to_cpu(gpu_info_fw->gc_num_se);  		adev->gfx.config.max_cu_per_sh = le32_to_cpu(gpu_info_fw->gc_num_cu_per_sh); @@ -1721,19 +1766,31 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)  		return -EINVAL;  	} -	r = amdgpu_device_parse_gpu_info_fw(adev); -	if (r) -		return r; - -	if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10) -		amdgpu_discovery_get_gfx_info(adev); -  	amdgpu_amdkfd_device_probe(adev);  	if (amdgpu_sriov_vf(adev)) { +		/* handle vbios stuff prior full access mode for new handshake */ +		if (adev->virt.req_init_data_ver == 1) { +			if (!amdgpu_get_bios(adev)) { +				DRM_ERROR("failed to get vbios\n"); +				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; +			} +		} +	} + +	/* we need to send REQ_GPU here for legacy handshaker otherwise the vbios +	 * will not be prepared by host for this VF */ +	if (amdgpu_sriov_vf(adev) && adev->virt.req_init_data_ver < 1) {  		r = amdgpu_virt_request_full_gpu(adev, true);  		if (r) -			return -EAGAIN; +			return r;  	}  	adev->pm.pp_feature = amdgpu_pp_feature_mask; @@ -1763,6 +1820,14 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)  		}  		/* get the vbios after the asic_funcs are set up */  		if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_COMMON) { +			r = amdgpu_device_parse_gpu_info_fw(adev); +			if (r) +				return r; + +			/* skip vbios handling for new handshake */ +			if (amdgpu_sriov_vf(adev) && adev->virt.req_init_data_ver == 1) +				continue; +  			/* Read BIOS */  			if (!amdgpu_get_bios(adev))  				return -EINVAL; @@ -1889,6 +1954,12 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)  	if (r)  		return r; +	if (amdgpu_sriov_vf(adev) && adev->virt.req_init_data_ver > 0) { +		r = amdgpu_virt_request_full_gpu(adev, true); +		if (r) +			return -EAGAIN; +	} +  	for (i = 0; i < adev->num_ip_blocks; i++) {  		if (!adev->ip_blocks[i].status.valid)  			continue; @@ -1975,6 +2046,8 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev)  		amdgpu_xgmi_add_device(adev);  	amdgpu_amdkfd_device_init(adev); +	amdgpu_fru_get_product_info(adev); +  init_failed:  	if (amdgpu_sriov_vf(adev))  		amdgpu_virt_release_full_gpu(adev, true); @@ -2008,8 +2081,24 @@ static void amdgpu_device_fill_reset_magic(struct amdgpu_device *adev)   */  static bool amdgpu_device_check_vram_lost(struct amdgpu_device *adev)  { -	return !!memcmp(adev->gart.ptr, adev->reset_magic, -			AMDGPU_RESET_MAGIC_NUM); +	if (memcmp(adev->gart.ptr, adev->reset_magic, +			AMDGPU_RESET_MAGIC_NUM)) +		return true; + +	if (!adev->in_gpu_reset) +		return false; + +	/* +	 * For all ASICs with baco/mode1 reset, the VRAM is +	 * always assumed to be lost. +	 */ +	switch (amdgpu_asic_reset_method(adev)) { +	case AMD_RESET_METHOD_BACO: +	case AMD_RESET_METHOD_MODE1: +		return true; +	default: +		return false; +	}  }  /** @@ -2155,6 +2244,8 @@ static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)  		adev->ip_blocks[i].status.late_initialized = true;  	} +	amdgpu_ras_set_error_query_ready(adev, true); +  	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_GATE);  	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_GATE); @@ -2187,7 +2278,8 @@ static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)  				if (gpu_instance->adev->flags & AMD_IS_APU)  					continue; -				r = amdgpu_xgmi_set_pstate(gpu_instance->adev, 0); +				r = amdgpu_xgmi_set_pstate(gpu_instance->adev, +						AMDGPU_XGMI_PSTATE_MIN);  				if (r) {  					DRM_ERROR("pstate setting failed (%d).\n", r);  					break; @@ -2340,6 +2432,8 @@ static int amdgpu_device_ip_suspend_phase1(struct amdgpu_device *adev)  {  	int i, r; +	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); +	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE);  	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {  		if (!adev->ip_blocks[i].status.valid) @@ -2767,12 +2861,12 @@ static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)  	 * By default timeout for non compute jobs is 10000.  	 * And there is no timeout enforced on compute jobs.  	 * In SR-IOV or passthrough mode, timeout for compute -	 * jobs are 10000 by default. +	 * jobs are 60000 by default.  	 */  	adev->gfx_timeout = msecs_to_jiffies(10000);  	adev->sdma_timeout = adev->video_timeout = adev->gfx_timeout;  	if (amdgpu_sriov_vf(adev) || amdgpu_passthrough(adev)) -		adev->compute_timeout = adev->gfx_timeout; +		adev->compute_timeout =  msecs_to_jiffies(60000);  	else  		adev->compute_timeout = MAX_SCHEDULE_TIMEOUT; @@ -2823,6 +2917,14 @@ static int amdgpu_device_get_job_timeout_settings(struct amdgpu_device *adev)  	return ret;  } +static const struct attribute *amdgpu_dev_attributes[] = { +	&dev_attr_product_name.attr, +	&dev_attr_product_number.attr, +	&dev_attr_serial_number.attr, +	&dev_attr_pcie_replay_count.attr, +	NULL +}; +  /**   * amdgpu_device_init - initialize the driver   * @@ -2924,9 +3026,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	INIT_LIST_HEAD(&adev->shadow_list);  	mutex_init(&adev->shadow_list_lock); -	INIT_LIST_HEAD(&adev->ring_lru_list); -	spin_lock_init(&adev->ring_lru_list_lock); -  	INIT_DELAYED_WORK(&adev->delayed_init_work,  			  amdgpu_device_delayed_init_work_handler);  	INIT_DELAYED_WORK(&adev->gfx.gfx_off_delay_work, @@ -2935,7 +3034,7 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	INIT_WORK(&adev->xgmi_reset_work, amdgpu_device_xgmi_reset_func);  	adev->gfx.gfx_off_req_count = 1; -	adev->pm.ac_power = power_supply_is_system_supplied() > 0 ? true : false; +	adev->pm.ac_power = power_supply_is_system_supplied() > 0;  	/* Registers mapping */  	/* TODO: block userspace mapping of io register */ @@ -2984,18 +3083,8 @@ int amdgpu_device_init(struct amdgpu_device *adev,  	if (amdgpu_mes && adev->asic_type >= CHIP_NAVI10)  		adev->enable_mes = true; -	if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10) { -		r = amdgpu_discovery_init(adev); -		if (r) { -			dev_err(adev->dev, "amdgpu_discovery_init failed\n"); -			return r; -		} -	} - -	/* early init functions */ -	r = amdgpu_device_ip_early_init(adev); -	if (r) -		return r; +	/* detect hw virtualization here */ +	amdgpu_detect_virtualization(adev);  	r = amdgpu_device_get_job_timeout_settings(adev);  	if (r) { @@ -3003,6 +3092,11 @@ int amdgpu_device_init(struct amdgpu_device *adev,  		return r;  	} +	/* early init functions */ +	r = amdgpu_device_ip_early_init(adev); +	if (r) +		return r; +  	/* doorbell bar mapping and doorbell index init*/  	amdgpu_device_doorbell_init(adev); @@ -3109,14 +3203,13 @@ fence_driver_init:  		goto failed;  	} -	DRM_DEBUG("SE %d, SH per SE %d, CU per SH %d, active_cu_number %d\n", +	dev_info(adev->dev, +		"SE %d, SH per SE %d, CU per SH %d, active_cu_number %d\n",  			adev->gfx.config.max_shader_engines,  			adev->gfx.config.max_sh_per_se,  			adev->gfx.config.max_cu_per_sh,  			adev->gfx.cu_info.number); -	amdgpu_ctx_init_sched(adev); -  	adev->accel_working = true;  	amdgpu_vm_check_compute_bug(adev); @@ -3181,9 +3274,9 @@ fence_driver_init:  	queue_delayed_work(system_wq, &adev->delayed_init_work,  			   msecs_to_jiffies(AMDGPU_RESUME_MS)); -	r = device_create_file(adev->dev, &dev_attr_pcie_replay_count); +	r = sysfs_create_files(&adev->dev->kobj, amdgpu_dev_attributes);  	if (r) { -		dev_err(adev->dev, "Could not create pcie_replay_count"); +		dev_err(adev->dev, "Could not create amdgpu device attr\n");  		return r;  	} @@ -3266,9 +3359,10 @@ void amdgpu_device_fini(struct amdgpu_device *adev)  	adev->rmmio = NULL;  	amdgpu_device_doorbell_fini(adev); -	device_remove_file(adev->dev, &dev_attr_pcie_replay_count);  	if (adev->ucode_sysfs_en)  		amdgpu_ucode_sysfs_fini(adev); + +	sysfs_remove_files(&adev->dev->kobj, amdgpu_dev_attributes);  	if (IS_ENABLED(CONFIG_PERF_EVENTS))  		amdgpu_pmu_fini(adev);  	if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10) @@ -3354,15 +3448,12 @@ int amdgpu_device_suspend(struct drm_device *dev, bool fbcon)  		}  	} -	amdgpu_device_set_pg_state(adev, AMD_PG_STATE_UNGATE); -	amdgpu_device_set_cg_state(adev, AMD_CG_STATE_UNGATE); - -	amdgpu_amdkfd_suspend(adev, !fbcon); -  	amdgpu_ras_suspend(adev);  	r = amdgpu_device_ip_suspend_phase1(adev); +	amdgpu_amdkfd_suspend(adev, !fbcon); +  	/* evict vram memory */  	amdgpu_bo_evict_vram(adev); @@ -3739,6 +3830,8 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,  	if (r)  		return r; +	amdgpu_amdkfd_pre_reset(adev); +  	/* Resume IP prior to SMC */  	r = amdgpu_device_ip_reinit_early_sriov(adev);  	if (r) @@ -3833,6 +3926,8 @@ static int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,  	int i, r = 0;  	bool need_full_reset  = *need_full_reset_arg; +	amdgpu_debugfs_wait_dump(adev); +  	/* block all schedulers and reset given job's ring */  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {  		struct amdgpu_ring *ring = adev->rings[i]; @@ -4037,6 +4132,64 @@ static void amdgpu_device_unlock_adev(struct amdgpu_device *adev)  	mutex_unlock(&adev->lock_reset);  } +static void amdgpu_device_resume_display_audio(struct amdgpu_device *adev) +{ +	struct pci_dev *p = NULL; + +	p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus), +			adev->pdev->bus->number, 1); +	if (p) { +		pm_runtime_enable(&(p->dev)); +		pm_runtime_resume(&(p->dev)); +	} +} + +static int amdgpu_device_suspend_display_audio(struct amdgpu_device *adev) +{ +	enum amd_reset_method reset_method; +	struct pci_dev *p = NULL; +	u64 expires; + +	/* +	 * For now, only BACO and mode1 reset are confirmed +	 * to suffer the audio issue without proper suspended. +	 */ +	reset_method = amdgpu_asic_reset_method(adev); +	if ((reset_method != AMD_RESET_METHOD_BACO) && +	     (reset_method != AMD_RESET_METHOD_MODE1)) +		return -EINVAL; + +	p = pci_get_domain_bus_and_slot(pci_domain_nr(adev->pdev->bus), +			adev->pdev->bus->number, 1); +	if (!p) +		return -ENODEV; + +	expires = pm_runtime_autosuspend_expiration(&(p->dev)); +	if (!expires) +		/* +		 * If we cannot get the audio device autosuspend delay, +		 * a fixed 4S interval will be used. Considering 3S is +		 * the audio controller default autosuspend delay setting. +		 * 4S used here is guaranteed to cover that. +		 */ +		expires = ktime_get_mono_fast_ns() + NSEC_PER_SEC * 4ULL; + +	while (!pm_runtime_status_suspended(&(p->dev))) { +		if (!pm_runtime_suspend(&(p->dev))) +			break; + +		if (expires < ktime_get_mono_fast_ns()) { +			dev_warn(adev->dev, "failed to suspend display audio\n"); +			/* TODO: abort the succeeding gpu reset? */ +			return -ETIMEDOUT; +		} +	} + +	pm_runtime_disable(&(p->dev)); + +	return 0; +} +  /**   * amdgpu_device_gpu_recover - reset the asic and recover scheduler   * @@ -4052,7 +4205,8 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  			      struct amdgpu_job *job)  {  	struct list_head device_list, *device_list_handle =  NULL; -	bool need_full_reset, job_signaled; +	bool need_full_reset = false; +	bool job_signaled = false;  	struct amdgpu_hive_info *hive = NULL;  	struct amdgpu_device *tmp_adev = NULL;  	int i, r = 0; @@ -4060,6 +4214,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  	bool use_baco =  		(amdgpu_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) ?  		true : false; +	bool audio_suspended = false;  	/*  	 * Flush RAM to disk so that after reboot @@ -4073,16 +4228,9 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  		emergency_restart();  	} -	need_full_reset = job_signaled = false; -	INIT_LIST_HEAD(&device_list); -  	dev_info(adev->dev, "GPU %s begin!\n",  		(in_ras_intr && !use_baco) ? "jobs stop":"reset"); -	cancel_delayed_work_sync(&adev->delayed_init_work); - -	hive = amdgpu_get_xgmi_hive(adev, false); -  	/*  	 * Here we trylock to avoid chain of resets executing from  	 * either trigger by jobs on different adevs in XGMI hive or jobs on @@ -4090,39 +4238,25 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  	 * We always reset all schedulers for device and all devices for XGMI  	 * hive so that should take care of them too.  	 */ - +	hive = amdgpu_get_xgmi_hive(adev, true);  	if (hive && !mutex_trylock(&hive->reset_lock)) {  		DRM_INFO("Bailing on TDR for s_job:%llx, hive: %llx as another already in progress",  			  job ? job->base.id : -1, hive->hive_id); +		mutex_unlock(&hive->hive_lock);  		return 0;  	} -	/* Start with adev pre asic reset first for soft reset check.*/ -	if (!amdgpu_device_lock_adev(adev, !hive)) { -		DRM_INFO("Bailing on TDR for s_job:%llx, as another already in progress", -			  job ? job->base.id : -1); -		return 0; -	} - -	/* Block kfd: SRIOV would do it separately */ -	if (!amdgpu_sriov_vf(adev)) -                amdgpu_amdkfd_pre_reset(adev); - -	/* Build list of devices to reset */ -	if  (adev->gmc.xgmi.num_physical_nodes > 1) { -		if (!hive) { -			/*unlock kfd: SRIOV would do it separately */ -			if (!amdgpu_sriov_vf(adev)) -		                amdgpu_amdkfd_post_reset(adev); -			amdgpu_device_unlock_adev(adev); +	/* +	 * Build list of devices to reset. +	 * In case we are in XGMI hive mode, resort the device list +	 * to put adev in the 1st position. +	 */ +	INIT_LIST_HEAD(&device_list); +	if (adev->gmc.xgmi.num_physical_nodes > 1) { +		if (!hive)  			return -ENODEV; -		} - -		/* -		 * In case we are in XGMI hive mode device reset is done for all the -		 * nodes in the hive to retrain all XGMI links and hence the reset -		 * sequence is executed in loop on all nodes. -		 */ +		if (!list_is_first(&adev->gmc.xgmi.head, &hive->device_list)) +			list_rotate_to_front(&adev->gmc.xgmi.head, &hive->device_list);  		device_list_handle = &hive->device_list;  	} else {  		list_add_tail(&adev->gmc.xgmi.head, &device_list); @@ -4131,19 +4265,40 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  	/* block all schedulers and reset given job's ring */  	list_for_each_entry(tmp_adev, device_list_handle, gmc.xgmi.head) { -		if (tmp_adev != adev) { -			amdgpu_device_lock_adev(tmp_adev, false); -			if (!amdgpu_sriov_vf(tmp_adev)) -			                amdgpu_amdkfd_pre_reset(tmp_adev); +		if (!amdgpu_device_lock_adev(tmp_adev, !hive)) { +			DRM_INFO("Bailing on TDR for s_job:%llx, as another already in progress", +				  job ? job->base.id : -1); +			mutex_unlock(&hive->hive_lock); +			return 0;  		}  		/* +		 * Try to put the audio codec into suspend state +		 * before gpu reset started. +		 * +		 * Due to the power domain of the graphics device +		 * is shared with AZ power domain. Without this, +		 * we may change the audio hardware from behind +		 * the audio driver's back. That will trigger +		 * some audio codec errors. +		 */ +		if (!amdgpu_device_suspend_display_audio(tmp_adev)) +			audio_suspended = true; + +		amdgpu_ras_set_error_query_ready(tmp_adev, false); + +		cancel_delayed_work_sync(&tmp_adev->delayed_init_work); + +		if (!amdgpu_sriov_vf(tmp_adev)) +			amdgpu_amdkfd_pre_reset(tmp_adev); + +		/*  		 * Mark these ASICs to be reseted as untracked first  		 * And add them back after reset completed  		 */  		amdgpu_unregister_gpu_instance(tmp_adev); -		amdgpu_fbdev_set_suspend(adev, 1); +		amdgpu_fbdev_set_suspend(tmp_adev, 1);  		/* disable ras on ALL IPs */  		if (!(in_ras_intr && !use_baco) && @@ -4163,7 +4318,6 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  		}  	} -  	if (in_ras_intr && !use_baco)  		goto skip_sched_resume; @@ -4174,30 +4328,14 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,  	 * job->base holds a reference to parent fence  	 */  	if (job && job->base.s_fence->parent && -	    dma_fence_is_signaled(job->base.s_fence->parent)) +	    dma_fence_is_signaled(job->base.s_fence->parent)) {  		job_signaled = true; - -	if (job_signaled) {  		dev_info(adev->dev, "Guilty job already signaled, skipping HW reset");  		goto skip_hw_reset;  	} - -	/* Guilty job will be freed after this*/ -	r = amdgpu_device_pre_asic_reset(adev, job, &need_full_reset); -	if (r) { -		/*TODO Should we stop ?*/ -		DRM_ERROR("GPU pre asic reset failed with err, %d for drm dev, %s ", -			  r, adev->ddev->unique); -		adev->asic_reset_res = r; -	} -  retry:	/* Rest of adevs pre asic reset from XGMI hive. */  	list_for_each_entry(tmp_adev, device_list_handle, gmc.xgmi.head) { - -		if (tmp_adev == adev) -			continue; -  		r = amdgpu_device_pre_asic_reset(tmp_adev,  						 NULL,  						 &need_full_reset); @@ -4259,11 +4397,15 @@ skip_sched_resume:  		/*unlock kfd: SRIOV would do it separately */  		if (!(in_ras_intr && !use_baco) && !amdgpu_sriov_vf(tmp_adev))  	                amdgpu_amdkfd_post_reset(tmp_adev); +		if (audio_suspended) +			amdgpu_device_resume_display_audio(tmp_adev);  		amdgpu_device_unlock_adev(tmp_adev);  	} -	if (hive) +	if (hive) {  		mutex_unlock(&hive->reset_lock); +		mutex_unlock(&hive->hive_lock); +	}  	if (r)  		dev_info(adev->dev, "GPU reset end with ret = %d\n", r); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_df.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_df.h index 057f6ea645d7..61a26c15c8dd 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_df.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_df.h @@ -52,9 +52,6 @@ struct amdgpu_df_funcs {  	uint64_t (*get_fica)(struct amdgpu_device *adev, uint32_t ficaa_val);  	void (*set_fica)(struct amdgpu_device *adev, uint32_t ficaa_val,  			 uint32_t ficadl_val, uint32_t ficadh_val); -	uint64_t (*get_dram_base_addr)(struct amdgpu_device *adev, -				       uint32_t df_inst); -	uint32_t (*get_df_inst_id)(struct amdgpu_device *adev);  };  struct amdgpu_df { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index 27d8ae19a7a4..b5d6274952a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -23,9 +23,7 @@  #include "amdgpu.h"  #include "amdgpu_discovery.h" -#include "soc15_common.h"  #include "soc15_hw_ip.h" -#include "nbio/nbio_2_3_offset.h"  #include "discovery.h"  #define mmRCC_CONFIG_MEMSIZE	0xde3 @@ -135,9 +133,10 @@ static int hw_id_map[MAX_HWIP] = {  static int amdgpu_discovery_read_binary(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_SIZE; +	uint64_t pos = vram_size - adev->discovery_tmr_size; -	amdgpu_device_vram_access(adev, pos, (uint32_t *)binary, DISCOVERY_TMR_SIZE, false); +	amdgpu_device_vram_access(adev, pos, (uint32_t *)binary, +				  adev->discovery_tmr_size, false);  	return 0;  } @@ -158,7 +157,7 @@ static inline bool amdgpu_discovery_verify_checksum(uint8_t *data, uint32_t size  	return !!(amdgpu_discovery_calculate_checksum(data, size) == expected);  } -int amdgpu_discovery_init(struct amdgpu_device *adev) +static int amdgpu_discovery_init(struct amdgpu_device *adev)  {  	struct table_info *info;  	struct binary_header *bhdr; @@ -169,17 +168,18 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)  	uint16_t checksum;  	int r; -	adev->discovery = kzalloc(DISCOVERY_TMR_SIZE, GFP_KERNEL); -	if (!adev->discovery) +	adev->discovery_tmr_size = DISCOVERY_TMR_SIZE; +	adev->discovery_bin = kzalloc(adev->discovery_tmr_size, GFP_KERNEL); +	if (!adev->discovery_bin)  		return -ENOMEM; -	r = amdgpu_discovery_read_binary(adev, adev->discovery); +	r = amdgpu_discovery_read_binary(adev, adev->discovery_bin);  	if (r) {  		DRM_ERROR("failed to read ip discovery binary\n");  		goto out;  	} -	bhdr = (struct binary_header *)adev->discovery; +	bhdr = (struct binary_header *)adev->discovery_bin;  	if (le32_to_cpu(bhdr->binary_signature) != BINARY_SIGNATURE) {  		DRM_ERROR("invalid ip discovery binary signature\n"); @@ -192,7 +192,7 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)  	size = bhdr->binary_size - offset;  	checksum = bhdr->binary_checksum; -	if (!amdgpu_discovery_verify_checksum(adev->discovery + offset, +	if (!amdgpu_discovery_verify_checksum(adev->discovery_bin + offset,  					      size, checksum)) {  		DRM_ERROR("invalid ip discovery binary checksum\n");  		r = -EINVAL; @@ -202,7 +202,7 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)  	info = &bhdr->table_list[IP_DISCOVERY];  	offset = le16_to_cpu(info->offset);  	checksum = le16_to_cpu(info->checksum); -	ihdr = (struct ip_discovery_header *)(adev->discovery + offset); +	ihdr = (struct ip_discovery_header *)(adev->discovery_bin + offset);  	if (le32_to_cpu(ihdr->signature) != DISCOVERY_TABLE_SIGNATURE) {  		DRM_ERROR("invalid ip discovery data table signature\n"); @@ -210,7 +210,7 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)  		goto out;  	} -	if (!amdgpu_discovery_verify_checksum(adev->discovery + offset, +	if (!amdgpu_discovery_verify_checksum(adev->discovery_bin + offset,  					      ihdr->size, checksum)) {  		DRM_ERROR("invalid ip discovery data table checksum\n");  		r = -EINVAL; @@ -220,9 +220,9 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)  	info = &bhdr->table_list[GC];  	offset = le16_to_cpu(info->offset);  	checksum = le16_to_cpu(info->checksum); -	ghdr = (struct gpu_info_header *)(adev->discovery + offset); +	ghdr = (struct gpu_info_header *)(adev->discovery_bin + offset); -	if (!amdgpu_discovery_verify_checksum(adev->discovery + offset, +	if (!amdgpu_discovery_verify_checksum(adev->discovery_bin + offset,  				              ghdr->size, checksum)) {  		DRM_ERROR("invalid gc data table checksum\n");  		r = -EINVAL; @@ -232,16 +232,16 @@ int amdgpu_discovery_init(struct amdgpu_device *adev)  	return 0;  out: -	kfree(adev->discovery); -	adev->discovery = NULL; +	kfree(adev->discovery_bin); +	adev->discovery_bin = NULL;  	return r;  }  void amdgpu_discovery_fini(struct amdgpu_device *adev)  { -	kfree(adev->discovery); -	adev->discovery = NULL; +	kfree(adev->discovery_bin); +	adev->discovery_bin = NULL;  }  int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev) @@ -257,14 +257,16 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  	uint8_t num_base_address;  	int hw_ip;  	int i, j, k; +	int r; -	if (!adev->discovery) { -		DRM_ERROR("ip discovery uninitialized\n"); -		return -EINVAL; +	r = amdgpu_discovery_init(adev); +	if (r) { +		DRM_ERROR("amdgpu_discovery_init failed\n"); +		return r;  	} -	bhdr = (struct binary_header *)adev->discovery; -	ihdr = (struct ip_discovery_header *)(adev->discovery + +	bhdr = (struct binary_header *)adev->discovery_bin; +	ihdr = (struct ip_discovery_header *)(adev->discovery_bin +  			le16_to_cpu(bhdr->table_list[IP_DISCOVERY].offset));  	num_dies = le16_to_cpu(ihdr->num_dies); @@ -272,7 +274,7 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)  	for (i = 0; i < num_dies; i++) {  		die_offset = le16_to_cpu(ihdr->die_info[i].die_offset); -		dhdr = (struct die_header *)(adev->discovery + die_offset); +		dhdr = (struct die_header *)(adev->discovery_bin + die_offset);  		num_ips = le16_to_cpu(dhdr->num_ips);  		ip_offset = die_offset + sizeof(*dhdr); @@ -286,7 +288,7 @@ 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->discovery + ip_offset); +			ip = (struct ip *)(adev->discovery_bin + ip_offset);  			num_base_address = ip->num_base_address;  			DRM_DEBUG("%s(%d) #%d v%d.%d.%d:\n", @@ -335,24 +337,24 @@ int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,  	uint16_t num_ips;  	int i, j; -	if (!adev->discovery) { +	if (!adev->discovery_bin) {  		DRM_ERROR("ip discovery uninitialized\n");  		return -EINVAL;  	} -	bhdr = (struct binary_header *)adev->discovery; -	ihdr = (struct ip_discovery_header *)(adev->discovery + +	bhdr = (struct binary_header *)adev->discovery_bin; +	ihdr = (struct ip_discovery_header *)(adev->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->discovery + die_offset); +		dhdr = (struct die_header *)(adev->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->discovery + ip_offset); +			ip = (struct ip *)(adev->discovery_bin + ip_offset);  			if (le16_to_cpu(ip->hw_id) == hw_id) {  				if (major) @@ -375,13 +377,13 @@ int amdgpu_discovery_get_gfx_info(struct amdgpu_device *adev)  	struct binary_header *bhdr;  	struct gc_info_v1_0 *gc_info; -	if (!adev->discovery) { +	if (!adev->discovery_bin) {  		DRM_ERROR("ip discovery uninitialized\n");  		return -EINVAL;  	} -	bhdr = (struct binary_header *)adev->discovery; -	gc_info = (struct gc_info_v1_0 *)(adev->discovery + +	bhdr = (struct binary_header *)adev->discovery_bin; +	gc_info = (struct gc_info_v1_0 *)(adev->discovery_bin +  			le16_to_cpu(bhdr->table_list[GC].offset));  	adev->gfx.config.max_shader_engines = le32_to_cpu(gc_info->gc_num_se); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h index ba78e15d9b05..d50d597c45ed 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.h @@ -26,7 +26,6 @@  #define DISCOVERY_TMR_SIZE  (64 << 10) -int amdgpu_discovery_init(struct amdgpu_device *adev);  void amdgpu_discovery_fini(struct amdgpu_device *adev);  int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev);  int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 84cee27cd7ef..f7143d927b6d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c @@ -523,7 +523,8 @@ uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev,  			break;  		case CHIP_RAVEN:  			/* enable S/G on PCO and RV2 */ -			if (adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) +			if ((adev->apu_flags & AMD_APU_IS_RAVEN2) || +			    (adev->apu_flags & AMD_APU_IS_PICASSO))  				domain |= AMDGPU_GEM_DOMAIN_GTT;  			break;  		default: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c index ffeb20f11c07..43d8ed7dbd00 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c @@ -38,6 +38,7 @@  #include <drm/amdgpu_drm.h>  #include <linux/dma-buf.h>  #include <linux/dma-fence-array.h> +#include <linux/pci-p2pdma.h>  /**   * amdgpu_gem_prime_vmap - &dma_buf_ops.vmap implementation @@ -179,6 +180,9 @@ static int amdgpu_dma_buf_attach(struct dma_buf *dmabuf,  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);  	int r; +	if (pci_p2pdma_distance_many(adev->pdev, &attach->dev, 1, true) < 0) +		attach->peer2peer = false; +  	if (attach->dev->driver == adev->dev->driver)  		return 0; @@ -272,14 +276,21 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach,  	struct dma_buf *dma_buf = attach->dmabuf;  	struct drm_gem_object *obj = dma_buf->priv;  	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); +	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);  	struct sg_table *sgt;  	long r;  	if (!bo->pin_count) { -		/* move buffer into GTT */ +		/* move buffer into GTT or VRAM */  		struct ttm_operation_ctx ctx = { false, false }; +		unsigned domains = AMDGPU_GEM_DOMAIN_GTT; -		amdgpu_bo_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_GTT); +		if (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM && +		    attach->peer2peer) { +			bo->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; +			domains |= AMDGPU_GEM_DOMAIN_VRAM; +		} +		amdgpu_bo_placement_from_domain(bo, domains);  		r = ttm_bo_validate(&bo->tbo, &bo->placement, &ctx);  		if (r)  			return ERR_PTR(r); @@ -289,20 +300,34 @@ static struct sg_table *amdgpu_dma_buf_map(struct dma_buf_attachment *attach,  		return ERR_PTR(-EBUSY);  	} -	sgt = drm_prime_pages_to_sg(bo->tbo.ttm->pages, bo->tbo.num_pages); -	if (IS_ERR(sgt)) -		return sgt; - -	if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir, -			      DMA_ATTR_SKIP_CPU_SYNC)) -		goto error_free; +	switch (bo->tbo.mem.mem_type) { +	case TTM_PL_TT: +		sgt = drm_prime_pages_to_sg(bo->tbo.ttm->pages, +					    bo->tbo.num_pages); +		if (IS_ERR(sgt)) +			return sgt; + +		if (!dma_map_sg_attrs(attach->dev, sgt->sgl, sgt->nents, dir, +				      DMA_ATTR_SKIP_CPU_SYNC)) +			goto error_free; +		break; + +	case TTM_PL_VRAM: +		r = amdgpu_vram_mgr_alloc_sgt(adev, &bo->tbo.mem, attach->dev, +					      dir, &sgt); +		if (r) +			return ERR_PTR(r); +		break; +	default: +		return ERR_PTR(-EINVAL); +	}  	return sgt;  error_free:  	sg_free_table(sgt);  	kfree(sgt); -	return ERR_PTR(-ENOMEM); +	return ERR_PTR(-EBUSY);  }  /** @@ -318,9 +343,18 @@ static void amdgpu_dma_buf_unmap(struct dma_buf_attachment *attach,  				 struct sg_table *sgt,  				 enum dma_data_direction dir)  { -	dma_unmap_sg(attach->dev, sgt->sgl, sgt->nents, dir); -	sg_free_table(sgt); -	kfree(sgt); +	struct dma_buf *dma_buf = attach->dmabuf; +	struct drm_gem_object *obj = dma_buf->priv; +	struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); +	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); + +	if (sgt->sgl->page_link) { +		dma_unmap_sg(attach->dev, sgt->sgl, sgt->nents, dir); +		sg_free_table(sgt); +		kfree(sgt); +	} else { +		amdgpu_vram_mgr_free_sgt(adev, attach->dev, dir, sgt); +	}  }  /** @@ -514,6 +548,7 @@ amdgpu_dma_buf_move_notify(struct dma_buf_attachment *attach)  }  static const struct dma_buf_attach_ops amdgpu_dma_buf_attach_ops = { +	.allow_peer2peer = true,  	.move_notify = amdgpu_dma_buf_move_notify  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c index ba1bb95a3cf9..d2a105e3bf7c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c @@ -856,7 +856,7 @@ void amdgpu_add_thermal_controller(struct amdgpu_device *adev)  				const char *name = pp_lib_thermal_controller_names[controller->ucType];  				info.addr = controller->ucI2cAddress >> 1;  				strlcpy(info.type, name, sizeof(info.type)); -				i2c_new_device(&adev->pm.i2c_bus->adapter, &info); +				i2c_new_client_device(&adev->pm.i2c_bus->adapter, &info);  			}  		} else {  			DRM_INFO("Unknown thermal controller type %d at 0x%02x %s fan control\n", @@ -1188,3 +1188,13 @@ int amdgpu_dpm_set_df_cstate(struct amdgpu_device *adev,  	return ret;  } + +int amdgpu_dpm_allow_xgmi_power_down(struct amdgpu_device *adev, bool en) +{ +	struct smu_context *smu = &adev->smu; + +	if (is_support_sw_smu(adev)) +		return smu_allow_xgmi_power_down(smu, en); + +	return 0; +}
\ No newline at end of file diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h index 936d85aa0fbc..6a8aae70a0e6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h @@ -450,6 +450,7 @@ struct amdgpu_pm {  	/* Used for I2C access to various EEPROMs on relevant ASICs */  	struct i2c_adapter smu_i2c; +	struct list_head	pm_attr_list;  };  #define R600_SSTU_DFLT                               0 @@ -538,4 +539,6 @@ int amdgpu_dpm_baco_enter(struct amdgpu_device *adev);  int amdgpu_dpm_set_df_cstate(struct amdgpu_device *adev,  			     uint32_t cstate); +int amdgpu_dpm_allow_xgmi_power_down(struct amdgpu_device *adev, bool en); +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index 8ea86ffdea0d..126e74758a34 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -85,9 +85,11 @@   * - 3.34.0 - Non-DC can flip correctly between buffers with different pitches   * - 3.35.0 - Add drm_amdgpu_info_device::tcc_disabled_mask   * - 3.36.0 - Allow reading more status registers on si/cik + * - 3.37.0 - L2 is invalidated before SDMA IBs, needed for correctness + * - 3.38.0 - Add AMDGPU_IB_FLAG_EMIT_MEM_SYNC   */  #define KMS_DRIVER_MAJOR	3 -#define KMS_DRIVER_MINOR	36 +#define KMS_DRIVER_MINOR	38  #define KMS_DRIVER_PATCHLEVEL	0  int amdgpu_vram_limit = 0; @@ -138,12 +140,14 @@ int amdgpu_emu_mode = 0;  uint amdgpu_smu_memory_pool_size = 0;  /* FBC (bit 0) disabled by default*/  uint amdgpu_dc_feature_mask = 0; +uint amdgpu_dc_debug_mask = 0;  int amdgpu_async_gfx_ring = 1;  int amdgpu_mcbp = 0;  int amdgpu_discovery = -1;  int amdgpu_mes = 0;  int amdgpu_noretry;  int amdgpu_force_asic_type = -1; +int amdgpu_tmz = 0;  struct amdgpu_mgpu_info mgpu_info = {  	.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex), @@ -687,13 +691,12 @@ MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (defau  /**   * DOC: hws_gws_support(bool) - * Whether HWS support gws barriers. Default value: false (not supported) - * This will be replaced with a MEC firmware version check once firmware - * is ready + * Assume that HWS supports GWS barriers regardless of what firmware version + * check says. Default value: false (rely on MEC2 firmware version check).   */  bool hws_gws_support;  module_param(hws_gws_support, bool, 0444); -MODULE_PARM_DESC(hws_gws_support, "MEC FW support gws barriers (false = not supported (Default), true = supported)"); +MODULE_PARM_DESC(hws_gws_support, "Assume MEC2 FW supports GWS barriers (false = rely on FW version check (Default), true = force supported)");  /**    * DOC: queue_preemption_timeout_ms (int) @@ -713,6 +716,13 @@ MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");  module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);  /** + * DOC: dcdebugmask (uint) + * Override display features enabled. See enum DC_DEBUG_MASK in drivers/gpu/drm/amd/include/amd_shared.h. + */ +MODULE_PARM_DESC(dcdebugmask, "all debug options disabled (default))"); +module_param_named(dcdebugmask, amdgpu_dc_debug_mask, uint, 0444); + +/**   * DOC: abmlevel (uint)   * Override the default ABM (Adaptive Backlight Management) level used for DC   * enabled hardware. Requires DMCU to be supported and loaded. @@ -728,6 +738,16 @@ uint amdgpu_dm_abm_level = 0;  MODULE_PARM_DESC(abmlevel, "ABM level (0 = off (default), 1-4 = backlight reduction level) ");  module_param_named(abmlevel, amdgpu_dm_abm_level, uint, 0444); +/** + * DOC: tmz (int) + * Trusted Memory Zone (TMZ) is a method to protect data being written + * to or read from memory. + * + * The default value: 0 (off).  TODO: change to auto till it is completed. + */ +MODULE_PARM_DESC(tmz, "Enable TMZ feature (-1 = auto, 0 = off (default), 1 = on)"); +module_param_named(tmz, amdgpu_tmz, int, 0444); +  static const struct pci_device_id pciidlist[] = {  #ifdef  CONFIG_DRM_AMDGPU_SI  	{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI}, @@ -1163,14 +1183,6 @@ static int amdgpu_pmops_resume(struct device *dev)  {  	struct drm_device *drm_dev = dev_get_drvdata(dev); -	/* GPU comes up enabled by the bios on resume */ -	if (amdgpu_device_supports_boco(drm_dev) || -	    amdgpu_device_supports_baco(drm_dev)) { -		pm_runtime_disable(dev); -		pm_runtime_set_active(dev); -		pm_runtime_enable(dev); -	} -  	return amdgpu_device_resume(drm_dev, true);  } @@ -1180,7 +1192,9 @@ static int amdgpu_pmops_freeze(struct device *dev)  	struct amdgpu_device *adev = drm_dev->dev_private;  	int r; +	adev->in_hibernate = true;  	r = amdgpu_device_suspend(drm_dev, true); +	adev->in_hibernate = false;  	if (r)  		return r;  	return amdgpu_asic_reset(adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c index 9ae7b61f696a..25ddb482466a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c @@ -133,8 +133,7 @@ static int amdgpufb_create_pinned_object(struct amdgpu_fbdev *rfbdev,  	u32 cpp;  	u64 flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED |  			       AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS     | -			       AMDGPU_GEM_CREATE_VRAM_CLEARED 	     | -			       AMDGPU_GEM_CREATE_CPU_GTT_USWC; +			       AMDGPU_GEM_CREATE_VRAM_CLEARED;  	info = drm_get_format_info(adev->ddev, mode_cmd);  	cpp = info->cpp[0]; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c index 7531527067df..d878fe7fee51 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c @@ -192,14 +192,22 @@ int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **f,   * Used For polling fence.   * Returns 0 on success, -ENOMEM on failure.   */ -int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s) +int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s, +			      uint32_t timeout)  {  	uint32_t seq; +	signed long r;  	if (!s)  		return -EINVAL;  	seq = ++ring->fence_drv.sync_seq; +	r = amdgpu_fence_wait_polling(ring, +				      seq - ring->fence_drv.num_fences_mask, +				      timeout); +	if (r < 1) +		return -ETIMEDOUT; +  	amdgpu_ring_emit_fence(ring, ring->fence_drv.gpu_addr,  			       seq, 0); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c new file mode 100644 index 000000000000..815c072ac4da --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c @@ -0,0 +1,185 @@ +/* + * 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. + * + */ +#include <linux/pci.h> + +#include "amdgpu.h" +#include "amdgpu_i2c.h" +#include "smu_v11_0_i2c.h" +#include "atom.h" + +#define I2C_PRODUCT_INFO_ADDR		0xAC +#define I2C_PRODUCT_INFO_ADDR_SIZE	0x2 +#define I2C_PRODUCT_INFO_OFFSET		0xC0 + +bool is_fru_eeprom_supported(struct amdgpu_device *adev) +{ +	/* TODO: Gaming SKUs don't have the FRU EEPROM. +	 * Use this hack to address hangs on modprobe on gaming SKUs +	 * until a proper solution can be implemented by only supporting +	 * the explicit chip IDs for VG20 Server cards +	 * +	 * TODO: Add list of supported Arcturus DIDs once confirmed +	 */ +	if ((adev->asic_type == CHIP_VEGA20 && adev->pdev->device == 0x66a0) || +	    (adev->asic_type == CHIP_VEGA20 && adev->pdev->device == 0x66a1) || +	    (adev->asic_type == CHIP_VEGA20 && adev->pdev->device == 0x66a4)) +		return true; +	return false; +} + +int amdgpu_fru_read_eeprom(struct amdgpu_device *adev, uint32_t addrptr, +			   unsigned char *buff) +{ +	int ret, size; +	struct i2c_msg msg = { +			.addr   = I2C_PRODUCT_INFO_ADDR, +			.flags  = I2C_M_RD, +			.buf    = buff, +	}; +	buff[0] = 0; +	buff[1] = addrptr; +	msg.len = I2C_PRODUCT_INFO_ADDR_SIZE + 1; +	ret = i2c_transfer(&adev->pm.smu_i2c, &msg, 1); + +	if (ret < 1) { +		DRM_WARN("FRU: Failed to get size field"); +		return ret; +	} + +	/* The size returned by the i2c requires subtraction of 0xC0 since the +	 * size apparently always reports as 0xC0+actual size. +	 */ +	size = buff[2] - I2C_PRODUCT_INFO_OFFSET; +	/* Add 1 since address field was 1 byte */ +	buff[1] = addrptr + 1; + +	msg.len = I2C_PRODUCT_INFO_ADDR_SIZE + size; +	ret = i2c_transfer(&adev->pm.smu_i2c, &msg, 1); + +	if (ret < 1) { +		DRM_WARN("FRU: Failed to get data field"); +		return ret; +	} + +	return size; +} + +int amdgpu_fru_get_product_info(struct amdgpu_device *adev) +{ +	unsigned char buff[34]; +	int addrptr = 0, size = 0; + +	if (!is_fru_eeprom_supported(adev)) +		return 0; + +	/* If algo exists, it means that the i2c_adapter's initialized */ +	if (!adev->pm.smu_i2c.algo) { +		DRM_WARN("Cannot access FRU, EEPROM accessor not initialized"); +		return 0; +	} + +	/* There's a lot of repetition here. This is due to the FRU having +	 * variable-length fields. To get the information, we have to find the +	 * size of each field, and then keep reading along and reading along +	 * until we get all of the data that we want. We use addrptr to track +	 * the address as we go +	 */ + +	/* The first fields are all of size 1-byte, from 0-7 are offsets that +	 * contain information that isn't useful to us. +	 * Bytes 8-a are all 1-byte and refer to the size of the entire struct, +	 * and the language field, so just start from 0xb, manufacturer size +	 */ +	addrptr = 0xb; +	size = amdgpu_fru_read_eeprom(adev, addrptr, buff); +	if (size < 1) { +		DRM_ERROR("Failed to read FRU Manufacturer, ret:%d", size); +		return size; +	} + +	/* Increment the addrptr by the size of the field, and 1 due to the +	 * size field being 1 byte. This pattern continues below. +	 */ +	addrptr += size + 1; +	size = amdgpu_fru_read_eeprom(adev, addrptr, buff); +	if (size < 1) { +		DRM_ERROR("Failed to read FRU product name, ret:%d", size); +		return size; +	} + +	/* Product name should only be 32 characters. Any more, +	 * and something could be wrong. Cap it at 32 to be safe +	 */ +	if (size > 32) { +		DRM_WARN("FRU Product Number is larger than 32 characters. This is likely a mistake"); +		size = 32; +	} +	/* Start at 2 due to buff using fields 0 and 1 for the address */ +	memcpy(adev->product_name, &buff[2], size); +	adev->product_name[size] = '\0'; + +	addrptr += size + 1; +	size = amdgpu_fru_read_eeprom(adev, addrptr, buff); +	if (size < 1) { +		DRM_ERROR("Failed to read FRU product number, ret:%d", size); +		return size; +	} + +	/* Product number should only be 16 characters. Any more, +	 * and something could be wrong. Cap it at 16 to be safe +	 */ +	if (size > 16) { +		DRM_WARN("FRU Product Number is larger than 16 characters. This is likely a mistake"); +		size = 16; +	} +	memcpy(adev->product_number, &buff[2], size); +	adev->product_number[size] = '\0'; + +	addrptr += size + 1; +	size = amdgpu_fru_read_eeprom(adev, addrptr, buff); + +	if (size < 1) { +		DRM_ERROR("Failed to read FRU product version, ret:%d", size); +		return size; +	} + +	addrptr += size + 1; +	size = amdgpu_fru_read_eeprom(adev, addrptr, buff); + +	if (size < 1) { +		DRM_ERROR("Failed to read FRU serial number, ret:%d", size); +		return size; +	} + +	/* Serial number should only be 16 characters. Any more, +	 * and something could be wrong. Cap it at 16 to be safe +	 */ +	if (size > 16) { +		DRM_WARN("FRU Serial Number is larger than 16 characters. This is likely a mistake"); +		size = 16; +	} +	memcpy(adev->serial, &buff[2], size); +	adev->serial[size] = '\0'; + +	return 0; +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.h new file mode 100644 index 000000000000..968115c97e33 --- /dev/null +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.h @@ -0,0 +1,29 @@ +/* + * 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 + * 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_PRODINFO_H__ +#define __AMDGPU_PRODINFO_H__ + +int amdgpu_fru_get_product_info(struct amdgpu_device *adev); + +#endif  // __AMDGPU_PRODINFO_H__ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c index 4277125a79ee..4ed9958af94e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c @@ -29,6 +29,7 @@  #include <linux/module.h>  #include <linux/pagemap.h>  #include <linux/pci.h> +#include <linux/dma-buf.h>  #include <drm/amdgpu_drm.h>  #include <drm/drm_debugfs.h> @@ -161,16 +162,17 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,  	struct amdgpu_bo_list_entry vm_pd;  	struct list_head list, duplicates; +	struct dma_fence *fence = NULL;  	struct ttm_validate_buffer tv;  	struct ww_acquire_ctx ticket;  	struct amdgpu_bo_va *bo_va; -	int r; +	long r;  	INIT_LIST_HEAD(&list);  	INIT_LIST_HEAD(&duplicates);  	tv.bo = &bo->tbo; -	tv.num_shared = 1; +	tv.num_shared = 2;  	list_add(&tv.head, &list);  	amdgpu_vm_get_pd_bo(vm, &list, &vm_pd); @@ -178,28 +180,34 @@ void amdgpu_gem_object_close(struct drm_gem_object *obj,  	r = ttm_eu_reserve_buffers(&ticket, &list, false, &duplicates);  	if (r) {  		dev_err(adev->dev, "leaking bo va because " -			"we fail to reserve bo (%d)\n", r); +			"we fail to reserve bo (%ld)\n", r);  		return;  	}  	bo_va = amdgpu_vm_bo_find(vm, bo); -	if (bo_va && --bo_va->ref_count == 0) { -		amdgpu_vm_bo_rmv(adev, bo_va); - -		if (amdgpu_vm_ready(vm)) { -			struct dma_fence *fence = NULL; +	if (!bo_va || --bo_va->ref_count) +		goto out_unlock; -			r = amdgpu_vm_clear_freed(adev, vm, &fence); -			if (unlikely(r)) { -				dev_err(adev->dev, "failed to clear page " -					"tables on GEM object close (%d)\n", r); -			} +	amdgpu_vm_bo_rmv(adev, bo_va); +	if (!amdgpu_vm_ready(vm)) +		goto out_unlock; -			if (fence) { -				amdgpu_bo_fence(bo, fence, true); -				dma_fence_put(fence); -			} -		} +	fence = dma_resv_get_excl(bo->tbo.base.resv); +	if (fence) { +		amdgpu_bo_fence(bo, fence, true); +		fence = NULL;  	} + +	r = amdgpu_vm_clear_freed(adev, vm, &fence); +	if (r || !fence) +		goto out_unlock; + +	amdgpu_bo_fence(bo, fence, true); +	dma_fence_put(fence); + +out_unlock: +	if (unlikely(r < 0)) +		dev_err(adev->dev, "failed to clear page " +			"tables on GEM object close (%ld)\n", r);  	ttm_eu_backoff_reservation(&ticket, &list);  } @@ -226,7 +234,8 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,  		      AMDGPU_GEM_CREATE_CPU_GTT_USWC |  		      AMDGPU_GEM_CREATE_VRAM_CLEARED |  		      AMDGPU_GEM_CREATE_VM_ALWAYS_VALID | -		      AMDGPU_GEM_CREATE_EXPLICIT_SYNC)) +		      AMDGPU_GEM_CREATE_EXPLICIT_SYNC | +		      AMDGPU_GEM_CREATE_ENCRYPTED))  		return -EINVAL; @@ -234,6 +243,11 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,  	if (args->in.domains & ~AMDGPU_GEM_DOMAIN_MASK)  		return -EINVAL; +	if (!amdgpu_is_tmz(adev) && (flags & AMDGPU_GEM_CREATE_ENCRYPTED)) { +		DRM_NOTE_ONCE("Cannot allocate secure buffer since TMZ is disabled\n"); +		return -EINVAL; +	} +  	/* create a gem object to contain this object in */  	if (args->in.domains & (AMDGPU_GEM_DOMAIN_GDS |  	    AMDGPU_GEM_DOMAIN_GWS | AMDGPU_GEM_DOMAIN_OA)) { @@ -854,7 +868,8 @@ static int amdgpu_debugfs_gem_bo_info(int id, void *ptr, void *data)  	attachment = READ_ONCE(bo->tbo.base.import_attach);  	if (attachment) -		seq_printf(m, " imported from %p", dma_buf); +		seq_printf(m, " imported from %p%s", dma_buf, +			   attachment->peer2peer ? " P2P" : "");  	else if (dma_buf)  		seq_printf(m, " exported as %p", dma_buf); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index 6b9c9193cdfa..d612033a23ac 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c @@ -48,7 +48,7 @@ int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,  	return bit;  } -void amdgpu_gfx_bit_to_mec_queue(struct amdgpu_device *adev, int bit, +void amdgpu_queue_mask_bit_to_mec_queue(struct amdgpu_device *adev, int bit,  				 int *mec, int *pipe, int *queue)  {  	*queue = bit % adev->gfx.mec.num_queue_per_pipe; @@ -274,7 +274,7 @@ static int amdgpu_gfx_kiq_acquire(struct amdgpu_device *adev,  		if (test_bit(queue_bit, adev->gfx.mec.queue_bitmap))  			continue; -		amdgpu_gfx_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue); +		amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue);  		/*  		 * 1. Using pipes 2/3 from MEC 2 seems cause problems. @@ -304,10 +304,6 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,  	spin_lock_init(&kiq->ring_lock); -	r = amdgpu_device_wb_get(adev, &kiq->reg_val_offs); -	if (r) -		return r; -  	ring->adev = NULL;  	ring->ring_obj = NULL;  	ring->use_doorbell = true; @@ -318,9 +314,11 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,  		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);  	r = amdgpu_ring_init(adev, ring, 1024, -			     irq, AMDGPU_CP_KIQ_IRQ_DRIVER0); +			     irq, AMDGPU_CP_KIQ_IRQ_DRIVER0, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		dev_warn(adev->dev, "(%d) failed to init kiq ring\n", r); @@ -329,7 +327,6 @@ int amdgpu_gfx_kiq_init_ring(struct amdgpu_device *adev,  void amdgpu_gfx_kiq_free_ring(struct amdgpu_ring *ring)  { -	amdgpu_device_wb_free(ring->adev, ring->adev->gfx.kiq.reg_val_offs);  	amdgpu_ring_fini(ring);  } @@ -488,6 +485,19 @@ int amdgpu_gfx_disable_kcq(struct amdgpu_device *adev)  	return amdgpu_ring_test_helper(kiq_ring);  } +int amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev, +					int queue_bit) +{ +	int mec, pipe, queue; +	int set_resource_bit = 0; + +	amdgpu_queue_mask_bit_to_mec_queue(adev, queue_bit, &mec, &pipe, &queue); + +	set_resource_bit = mec * 4 * 8 + pipe * 8 + queue; + +	return set_resource_bit; +} +  int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)  {  	struct amdgpu_kiq *kiq = &adev->gfx.kiq; @@ -510,7 +520,7 @@ int amdgpu_gfx_enable_kcq(struct amdgpu_device *adev)  			break;  		} -		queue_mask |= (1ull << i); +		queue_mask |= (1ull << amdgpu_queue_mask_bit_to_set_resource_bit(adev, i));  	}  	DRM_INFO("kiq ring mec %d pipe %d q %d\n", kiq_ring->me, kiq_ring->pipe, @@ -670,16 +680,23 @@ uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)  {  	signed long r, cnt = 0;  	unsigned long flags; -	uint32_t seq; +	uint32_t seq, reg_val_offs = 0, value = 0;  	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	struct amdgpu_ring *ring = &kiq->ring;  	BUG_ON(!ring->funcs->emit_rreg);  	spin_lock_irqsave(&kiq->ring_lock, flags); +	if (amdgpu_device_wb_get(adev, ®_val_offs)) { +		pr_err("critical bug! too many kiq readers\n"); +		goto failed_unlock; +	}  	amdgpu_ring_alloc(ring, 32); -	amdgpu_ring_emit_rreg(ring, reg); -	amdgpu_fence_emit_polling(ring, &seq); +	amdgpu_ring_emit_rreg(ring, reg, reg_val_offs); +	r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +	if (r) +		goto failed_undo; +  	amdgpu_ring_commit(ring);  	spin_unlock_irqrestore(&kiq->ring_lock, flags); @@ -705,9 +722,18 @@ uint32_t amdgpu_kiq_rreg(struct amdgpu_device *adev, uint32_t reg)  	if (cnt > MAX_KIQ_REG_TRY)  		goto failed_kiq_read; -	return adev->wb.wb[kiq->reg_val_offs]; +	mb(); +	value = adev->wb.wb[reg_val_offs]; +	amdgpu_device_wb_free(adev, reg_val_offs); +	return value; +failed_undo: +	amdgpu_ring_undo(ring); +failed_unlock: +	spin_unlock_irqrestore(&kiq->ring_lock, flags);  failed_kiq_read: +	if (reg_val_offs) +		amdgpu_device_wb_free(adev, reg_val_offs);  	pr_err("failed to read reg:%x\n", reg);  	return ~0;  } @@ -725,7 +751,10 @@ void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)  	spin_lock_irqsave(&kiq->ring_lock, flags);  	amdgpu_ring_alloc(ring, 32);  	amdgpu_ring_emit_wreg(ring, reg, v); -	amdgpu_fence_emit_polling(ring, &seq); +	r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +	if (r) +		goto failed_undo; +  	amdgpu_ring_commit(ring);  	spin_unlock_irqrestore(&kiq->ring_lock, flags); @@ -754,6 +783,9 @@ void amdgpu_kiq_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v)  	return; +failed_undo: +	amdgpu_ring_undo(ring); +	spin_unlock_irqrestore(&kiq->ring_lock, flags);  failed_kiq_write:  	pr_err("failed to write reg:%x\n", reg);  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h index 5825692d07e4..d43c11671a38 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h @@ -103,7 +103,6 @@ struct amdgpu_kiq {  	struct amdgpu_ring	ring;  	struct amdgpu_irq_src	irq;  	const struct kiq_pm4_funcs *pmf; -	uint32_t			reg_val_offs;  };  /* @@ -286,13 +285,8 @@ struct amdgpu_gfx {  	bool				me_fw_write_wait;  	bool				cp_fw_write_wait;  	struct amdgpu_ring		gfx_ring[AMDGPU_MAX_GFX_RINGS]; -	struct drm_gpu_scheduler	*gfx_sched[AMDGPU_MAX_GFX_RINGS]; -	uint32_t			num_gfx_sched;  	unsigned			num_gfx_rings;  	struct amdgpu_ring		compute_ring[AMDGPU_MAX_COMPUTE_RINGS]; -	struct drm_gpu_scheduler        **compute_prio_sched[AMDGPU_GFX_PIPE_PRIO_MAX]; -	struct drm_gpu_scheduler	*compute_sched[AMDGPU_MAX_COMPUTE_RINGS]; -	uint32_t                        num_compute_sched[AMDGPU_GFX_PIPE_PRIO_MAX];  	unsigned			num_compute_rings;  	struct amdgpu_irq_src		eop_irq;  	struct amdgpu_irq_src		priv_reg_irq; @@ -370,7 +364,7 @@ void amdgpu_gfx_graphics_queue_acquire(struct amdgpu_device *adev);  int amdgpu_gfx_mec_queue_to_bit(struct amdgpu_device *adev, int mec,  				int pipe, int queue); -void amdgpu_gfx_bit_to_mec_queue(struct amdgpu_device *adev, int bit, +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); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 5884ab590486..acabb57aa8af 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c @@ -136,8 +136,8 @@ uint64_t amdgpu_gmc_agp_addr(struct ttm_buffer_object *bo)  /**   * amdgpu_gmc_vram_location - try to find VRAM location   * - * @adev: amdgpu device structure holding all necessary informations - * @mc: memory controller structure holding memory informations + * @adev: amdgpu device structure holding all necessary information + * @mc: memory controller structure holding memory information   * @base: base address at which to put VRAM   *   * Function will try to place VRAM at base address provided @@ -165,8 +165,8 @@ void amdgpu_gmc_vram_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc,  /**   * amdgpu_gmc_gart_location - try to find GART location   * - * @adev: amdgpu device structure holding all necessary informations - * @mc: memory controller structure holding memory informations + * @adev: amdgpu device structure holding all necessary information + * @mc: memory controller structure holding memory information   *   * Function will place try to place GART before or after VRAM.   * @@ -207,8 +207,8 @@ void amdgpu_gmc_gart_location(struct amdgpu_device *adev, struct amdgpu_gmc *mc)  /**   * amdgpu_gmc_agp_location - try to find AGP location - * @adev: amdgpu device structure holding all necessary informations - * @mc: memory controller structure holding memory informations + * @adev: amdgpu device structure holding all necessary information + * @mc: memory controller structure holding memory information   *   * Function will place try to find a place for the AGP BAR in the MC address   * space. @@ -373,3 +373,38 @@ int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev)  	return 0;  } + +/** + * amdgpu_tmz_set -- check and set if a device supports TMZ + * @adev: amdgpu_device pointer + * + * Check and set if an the device @adev supports Trusted Memory + * Zones (TMZ). + */ +void amdgpu_gmc_tmz_set(struct amdgpu_device *adev) +{ +	switch (adev->asic_type) { +	case CHIP_RAVEN: +	case CHIP_RENOIR: +	case CHIP_NAVI10: +	case CHIP_NAVI14: +	case CHIP_NAVI12: +		/* Don't enable it by default yet. +		 */ +		if (amdgpu_tmz < 1) { +			adev->gmc.tmz_enabled = false; +			dev_info(adev->dev, +				 "Trusted Memory Zone (TMZ) feature disabled as experimental (default)\n"); +		} else { +			adev->gmc.tmz_enabled = true; +			dev_info(adev->dev, +				 "Trusted Memory Zone (TMZ) feature enabled as experimental (cmd line)\n"); +		} +		break; +	default: +		adev->gmc.tmz_enabled = false; +		dev_warn(adev->dev, +			 "Trusted Memory Zone (TMZ) feature not supported\n"); +		break; +	} +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h index 7546da0cc70c..2bd9423c1dab 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h @@ -213,6 +213,8 @@ struct amdgpu_gmc {  	} fault_hash[AMDGPU_GMC_FAULT_HASH_SIZE];  	uint64_t		last_fault:AMDGPU_GMC_FAULT_RING_ORDER; +	bool tmz_enabled; +  	const struct amdgpu_gmc_funcs	*gmc_funcs;  	struct amdgpu_xgmi xgmi; @@ -276,4 +278,6 @@ int amdgpu_gmc_ras_late_init(struct amdgpu_device *adev);  void amdgpu_gmc_ras_fini(struct amdgpu_device *adev);  int amdgpu_gmc_allocate_vm_inv_eng(struct amdgpu_device *adev); +extern void amdgpu_gmc_tmz_set(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 ccbd7acfc4cb..b91853fd66d3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c @@ -61,12 +61,13 @@   * Returns 0 on success, error on failure.   */  int amdgpu_ib_get(struct amdgpu_device *adev, struct amdgpu_vm *vm, -		  unsigned size, struct amdgpu_ib *ib) +		  unsigned size, enum amdgpu_ib_pool_type pool_type, +		  struct amdgpu_ib *ib)  {  	int r;  	if (size) { -		r = amdgpu_sa_bo_new(&adev->ring_tmp_bo, +		r = amdgpu_sa_bo_new(&adev->ib_pools[pool_type],  				      &ib->sa_bo, size, 256);  		if (r) {  			dev_err(adev->dev, "failed to get a new IB (%d)\n", r); @@ -131,6 +132,7 @@ 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;  	unsigned i;  	int r = 0; @@ -159,6 +161,12 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		return -EINVAL;  	} +	if ((ib->flags & AMDGPU_IB_FLAGS_SECURE) && +	    (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE)) { +		dev_err(adev->dev, "secure submissions not supported on compute rings\n"); +		return -EINVAL; +	} +  	alloc_size = ring->funcs->emit_frame_size + num_ibs *  		ring->funcs->emit_ib_size; @@ -181,6 +189,9 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		dma_fence_put(tmp);  	} +	if ((ib->flags & AMDGPU_IB_FLAG_EMIT_MEM_SYNC) && ring->funcs->emit_mem_sync) +		ring->funcs->emit_mem_sync(ring); +  	if (ring->funcs->insert_start)  		ring->funcs->insert_start(ring); @@ -215,6 +226,14 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		amdgpu_ring_emit_cntxcntl(ring, status);  	} +	/* Setup initial TMZiness and send it off. +	 */ +	secure = false; +	if (job && ring->funcs->emit_frame_cntl) { +		secure = ib->flags & AMDGPU_IB_FLAGS_SECURE; +		amdgpu_ring_emit_frame_cntl(ring, true, secure); +	} +  	for (i = 0; i < num_ibs; ++i) {  		ib = &ibs[i]; @@ -226,12 +245,20 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,  		    !amdgpu_sriov_vf(adev)) /* for SRIOV preemption, Preamble CE ib must be inserted anyway */  			continue; +		if (job && ring->funcs->emit_frame_cntl) { +			if (secure != !!(ib->flags & AMDGPU_IB_FLAGS_SECURE)) { +				amdgpu_ring_emit_frame_cntl(ring, false, secure); +				secure = !secure; +				amdgpu_ring_emit_frame_cntl(ring, true, secure); +			} +		} +  		amdgpu_ring_emit_ib(ring, job, ib, status);  		status &= ~AMDGPU_HAVE_CTX_SWITCH;  	} -	if (ring->funcs->emit_tmz) -		amdgpu_ring_emit_tmz(ring, false); +	if (job && ring->funcs->emit_frame_cntl) +		amdgpu_ring_emit_frame_cntl(ring, false, secure);  #ifdef CONFIG_X86_64  	if (!(adev->flags & AMD_IS_APU)) @@ -280,22 +307,32 @@ int amdgpu_ib_schedule(struct amdgpu_ring *ring, unsigned num_ibs,   */  int amdgpu_ib_pool_init(struct amdgpu_device *adev)  { -	int r; +	unsigned size; +	int r, i; -	if (adev->ib_pool_ready) { +	if (adev->ib_pool_ready)  		return 0; -	} -	r = amdgpu_sa_bo_manager_init(adev, &adev->ring_tmp_bo, -				      AMDGPU_IB_POOL_SIZE*64*1024, -				      AMDGPU_GPU_PAGE_SIZE, -				      AMDGPU_GEM_DOMAIN_GTT); -	if (r) { -		return r; -	} +	for (i = 0; i < AMDGPU_IB_POOL_MAX; i++) { +		if (i == AMDGPU_IB_POOL_DIRECT) +			size = PAGE_SIZE * 2; +		else +			size = AMDGPU_IB_POOL_SIZE; + +		r = amdgpu_sa_bo_manager_init(adev, &adev->ib_pools[i], +					      size, AMDGPU_GPU_PAGE_SIZE, +					      AMDGPU_GEM_DOMAIN_GTT); +		if (r) +			goto error; +	}  	adev->ib_pool_ready = true;  	return 0; + +error: +	while (i--) +		amdgpu_sa_bo_manager_fini(adev, &adev->ib_pools[i]); +	return r;  }  /** @@ -308,10 +345,14 @@ int amdgpu_ib_pool_init(struct amdgpu_device *adev)   */  void amdgpu_ib_pool_fini(struct amdgpu_device *adev)  { -	if (adev->ib_pool_ready) { -		amdgpu_sa_bo_manager_fini(adev, &adev->ring_tmp_bo); -		adev->ib_pool_ready = false; -	} +	int i; + +	if (!adev->ib_pool_ready) +		return; + +	for (i = 0; i < AMDGPU_IB_POOL_MAX; i++) +		amdgpu_sa_bo_manager_fini(adev, &adev->ib_pools[i]); +	adev->ib_pool_ready = false;  }  /** @@ -326,9 +367,9 @@ void amdgpu_ib_pool_fini(struct amdgpu_device *adev)   */  int amdgpu_ib_ring_tests(struct amdgpu_device *adev)  { -	unsigned i; -	int r, ret = 0;  	long tmo_gfx, tmo_mm; +	int r, ret = 0; +	unsigned i;  	tmo_mm = tmo_gfx = AMDGPU_IB_TEST_TIMEOUT;  	if (amdgpu_sriov_vf(adev)) { @@ -406,10 +447,16 @@ static int amdgpu_debugfs_sa_info(struct seq_file *m, void *data)  	struct drm_device *dev = node->minor->dev;  	struct amdgpu_device *adev = dev->dev_private; -	amdgpu_sa_bo_dump_debug_info(&adev->ring_tmp_bo, m); +	seq_printf(m, "--------------------- DELAYED --------------------- \n"); +	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_DELAYED], +				     m); +	seq_printf(m, "-------------------- IMMEDIATE -------------------- \n"); +	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_IMMEDIATE], +				     m); +	seq_printf(m, "--------------------- DIRECT ---------------------- \n"); +	amdgpu_sa_bo_dump_debug_info(&adev->ib_pools[AMDGPU_IB_POOL_DIRECT], m);  	return 0; -  }  static const struct drm_info_list amdgpu_debugfs_sa_list[] = { diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c index 3a67f6c046d4..fe92dcd94d4a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c @@ -282,7 +282,7 @@ static int amdgpu_vmid_grab_reserved(struct amdgpu_vm *vm,  	    !dma_fence_is_later(updates, (*id)->flushed_updates))  	    updates = NULL; -	if ((*id)->owner != vm->direct.fence_context || +	if ((*id)->owner != vm->immediate.fence_context ||  	    job->vm_pd_addr != (*id)->pd_gpu_addr ||  	    updates || !(*id)->last_flush ||  	    ((*id)->last_flush->context != fence_context && @@ -349,7 +349,7 @@ static int amdgpu_vmid_grab_used(struct amdgpu_vm *vm,  		struct dma_fence *flushed;  		/* Check all the prerequisites to using this VMID */ -		if ((*id)->owner != vm->direct.fence_context) +		if ((*id)->owner != vm->immediate.fence_context)  			continue;  		if ((*id)->pd_gpu_addr != job->vm_pd_addr) @@ -448,7 +448,7 @@ int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring,  	}  	id->pd_gpu_addr = job->vm_pd_addr; -	id->owner = vm->direct.fence_context; +	id->owner = vm->immediate.fence_context;  	if (job->vm_needs_flush) {  		dma_fence_put(id->last_flush); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c index 5ed4227f304b..0cc4c67f95f7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c @@ -260,7 +260,7 @@ int amdgpu_irq_init(struct amdgpu_device *adev)  		nvec = pci_alloc_irq_vectors(adev->pdev, 1, 1, flags);  		if (nvec > 0) {  			adev->irq.msi_enabled = true; -			dev_dbg(adev->dev, "amdgpu: using MSI/MSI-X.\n"); +			dev_dbg(adev->dev, "using MSI/MSI-X.\n");  		}  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c index 4981e443a884..47207188c569 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c @@ -33,6 +33,7 @@ static void amdgpu_job_timedout(struct drm_sched_job *s_job)  	struct amdgpu_ring *ring = to_amdgpu_ring(s_job->sched);  	struct amdgpu_job *job = to_amdgpu_job(s_job);  	struct amdgpu_task_info ti; +	struct amdgpu_device *adev = ring->adev;  	memset(&ti, 0, sizeof(struct amdgpu_task_info)); @@ -49,10 +50,13 @@ static void 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); -	if (amdgpu_device_should_recover_gpu(ring->adev)) +	if (amdgpu_device_should_recover_gpu(ring->adev)) {  		amdgpu_device_gpu_recover(ring->adev, job); -	else +	} else {  		drm_sched_suspend_timeout(&ring->sched); +		if (amdgpu_sriov_vf(adev)) +			adev->virt.tdr_debug = true; +	}  }  int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, @@ -87,7 +91,8 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,  }  int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size, -			     struct amdgpu_job **job) +		enum amdgpu_ib_pool_type pool_type, +		struct amdgpu_job **job)  {  	int r; @@ -95,7 +100,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size,  	if (r)  		return r; -	r = amdgpu_ib_get(adev, NULL, size, &(*job)->ibs[0]); +	r = amdgpu_ib_get(adev, NULL, size, pool_type, &(*job)->ibs[0]);  	if (r)  		kfree(*job); @@ -140,7 +145,6 @@ void amdgpu_job_free(struct amdgpu_job *job)  int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity,  		      void *owner, struct dma_fence **f)  { -	enum drm_sched_priority priority;  	int r;  	if (!f) @@ -152,7 +156,6 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity,  	*f = dma_fence_get(&job->base.s_fence->finished);  	amdgpu_job_free_resources(job); -	priority = job->base.s_priority;  	drm_sched_entity_push_job(&job->base, entity);  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h index 3f7b8433d179..81caac9b958a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h @@ -38,6 +38,7 @@  #define AMDGPU_JOB_GET_VMID(job) ((job) ? (job)->vmid : 0)  struct amdgpu_fence; +enum amdgpu_ib_pool_type;  struct amdgpu_job {  	struct drm_sched_job    base; @@ -61,14 +62,12 @@ struct amdgpu_job {  	/* user fence handling */  	uint64_t		uf_addr;  	uint64_t		uf_sequence; -  };  int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs,  		     struct amdgpu_job **job, struct amdgpu_vm *vm);  int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev, unsigned size, -			     struct amdgpu_job **job); - +		enum amdgpu_ib_pool_type pool, struct amdgpu_job **job);  void amdgpu_job_free_resources(struct amdgpu_job *job);  void amdgpu_job_free(struct amdgpu_job *job);  int amdgpu_job_submit(struct amdgpu_job *job, struct drm_sched_entity *entity, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c index 5727f00afc8e..d31d65e6b039 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.c @@ -144,7 +144,8 @@ static int amdgpu_jpeg_dec_set_reg(struct amdgpu_ring *ring, uint32_t handle,  	const unsigned ib_size_dw = 16;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h index bd9ef9cc86de..5131a0a1bc8a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_jpeg.h @@ -43,8 +43,6 @@ struct amdgpu_jpeg {  	uint8_t	num_jpeg_inst;  	struct amdgpu_jpeg_inst inst[AMDGPU_MAX_JPEG_INSTANCES];  	struct amdgpu_jpeg_reg internal; -	struct drm_gpu_scheduler *jpeg_sched[AMDGPU_MAX_JPEG_INSTANCES]; -	uint32_t num_jpeg_sched;  	unsigned harvest_config;  	struct delayed_work idle_work;  	enum amd_powergating_state cur_state; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index fd1dc3236eca..d7e17e34fee1 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -183,18 +183,18 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)  	/* Call ACPI methods: require modeset init  	 * but failure is not fatal  	 */ -	if (!r) { -		acpi_status = amdgpu_acpi_init(adev); -		if (acpi_status) -			dev_dbg(&dev->pdev->dev, -				"Error during ACPI methods call\n"); -	} + +	acpi_status = amdgpu_acpi_init(adev); +	if (acpi_status) +		dev_dbg(&dev->pdev->dev, "Error during ACPI methods call\n");  	if (adev->runpm) { -		dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NEVER_SKIP); +		/* only need to skip on ATPX */ +		if (amdgpu_device_supports_boco(dev) && +		    !amdgpu_is_atpx_hybrid()) +			dev_pm_set_driver_flags(dev->dev, DPM_FLAG_NO_DIRECT_COMPLETE);  		pm_runtime_use_autosuspend(dev->dev);  		pm_runtime_set_autosuspend_delay(dev->dev, 5000); -		pm_runtime_set_active(dev->dev);  		pm_runtime_allow(dev->dev);  		pm_runtime_mark_last_busy(dev->dev);  		pm_runtime_put_autosuspend(dev->dev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h index 919bd566ba3c..edaac242ff85 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h @@ -77,7 +77,6 @@ struct amdgpu_nbio_funcs {  				      u32 *flags);  	void (*ih_control)(struct amdgpu_device *adev);  	void (*init_registers)(struct amdgpu_device *adev); -	void (*detect_hw_virt)(struct amdgpu_device *adev);  	void (*remap_hdp_registers)(struct amdgpu_device *adev);  	void (*handle_ras_controller_intr_no_bifring)(struct amdgpu_device *adev);  	void (*handle_ras_err_event_athub_intr_no_bifring)(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index c687f5415b3f..3d822eba9a5d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -753,7 +753,7 @@ int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, struct dma_fence **fence)  	return amdgpu_copy_buffer(ring, shadow_addr, parent_addr,  				  amdgpu_bo_size(shadow), NULL, fence, -				  true, false); +				  true, false, false);  }  /** diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h index 5e39ecd8cc28..7d41f7b9a340 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h @@ -229,6 +229,17 @@ static inline bool amdgpu_bo_explicit_sync(struct amdgpu_bo *bo)  	return bo->flags & AMDGPU_GEM_CREATE_EXPLICIT_SYNC;  } +/** + * amdgpu_bo_encrypted - test if the BO is encrypted + * @bo: pointer to a buffer object + * + * Return true if the buffer object is encrypted, false otherwise. + */ +static inline bool amdgpu_bo_encrypted(struct amdgpu_bo *bo) +{ +	return bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED; +} +  bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo);  void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index abe94a55ecad..775e389c9a13 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -154,17 +154,17 @@ int amdgpu_dpm_read_sensor(struct amdgpu_device *adev, enum amd_pp_sensors senso   *   */ -static ssize_t amdgpu_get_dpm_state(struct device *dev, -				    struct device_attribute *attr, -				    char *buf) +static ssize_t amdgpu_get_power_dpm_state(struct device *dev, +					  struct device_attribute *attr, +					  char *buf)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	enum amd_pm_state_type pm;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -189,18 +189,18 @@ static ssize_t amdgpu_get_dpm_state(struct device *dev,  			(pm == POWER_STATE_TYPE_BALANCED) ? "balanced" : "performance");  } -static ssize_t amdgpu_set_dpm_state(struct device *dev, -				    struct device_attribute *attr, -				    const char *buf, -				    size_t count) +static ssize_t amdgpu_set_power_dpm_state(struct device *dev, +					  struct device_attribute *attr, +					  const char *buf, +					  size_t count)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	enum amd_pm_state_type  state;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	if (strncmp("battery", buf, strlen("battery")) == 0)  		state = POWER_STATE_TYPE_BATTERY; @@ -294,17 +294,17 @@ static ssize_t amdgpu_set_dpm_state(struct device *dev,   *   */ -static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev, -						struct device_attribute *attr, -								char *buf) +static ssize_t amdgpu_get_power_dpm_force_performance_level(struct device *dev, +							    struct device_attribute *attr, +							    char *buf)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	enum amd_dpm_forced_level level = 0xff;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -332,10 +332,10 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev,  			"unknown");  } -static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, -						       struct device_attribute *attr, -						       const char *buf, -						       size_t count) +static ssize_t amdgpu_set_power_dpm_force_performance_level(struct device *dev, +							    struct device_attribute *attr, +							    const char *buf, +							    size_t count)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private; @@ -343,8 +343,8 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,  	enum amd_dpm_forced_level current_level = 0xff;  	int ret = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	if (strncmp("low", buf, strlen("low")) == 0) {  		level = AMD_DPM_FORCED_LEVEL_LOW; @@ -383,6 +383,15 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,  		return count;  	} +	if (adev->asic_type == CHIP_RAVEN) { +		if (!(adev->apu_flags & AMD_APU_IS_RAVEN2)) { +			if (current_level != AMD_DPM_FORCED_LEVEL_MANUAL && level == AMD_DPM_FORCED_LEVEL_MANUAL) +				amdgpu_gfx_off_ctrl(adev, false); +			else if (current_level == AMD_DPM_FORCED_LEVEL_MANUAL && level != AMD_DPM_FORCED_LEVEL_MANUAL) +				amdgpu_gfx_off_ctrl(adev, true); +		} +	} +  	/* profile_exit setting is valid only when current mode is in profile mode */  	if (!(current_level & (AMD_DPM_FORCED_LEVEL_PROFILE_STANDARD |  	    AMD_DPM_FORCED_LEVEL_PROFILE_MIN_SCLK | @@ -436,6 +445,9 @@ static ssize_t amdgpu_get_pp_num_states(struct device *dev,  	struct pp_states_info data;  	int i, buf_len, ret; +	if (adev->in_gpu_reset) +		return -EPERM; +  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0)  		return ret; @@ -444,8 +456,11 @@ static ssize_t amdgpu_get_pp_num_states(struct device *dev,  		ret = smu_get_power_num_states(&adev->smu, &data);  		if (ret)  			return ret; -	} else if (adev->powerplay.pp_funcs->get_pp_num_states) +	} else if (adev->powerplay.pp_funcs->get_pp_num_states) {  		amdgpu_dpm_get_pp_num_states(adev, &data); +	} else { +		memset(&data, 0, sizeof(data)); +	}  	pm_runtime_mark_last_busy(ddev->dev);  	pm_runtime_put_autosuspend(ddev->dev); @@ -472,8 +487,8 @@ static ssize_t amdgpu_get_pp_cur_state(struct device *dev,  	enum amd_pm_state_type pm = 0;  	int i = 0, ret = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -511,8 +526,8 @@ static ssize_t amdgpu_get_pp_force_state(struct device *dev,  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	if (adev->pp_force_state_enabled)  		return amdgpu_get_pp_cur_state(dev, attr, buf); @@ -531,8 +546,8 @@ static ssize_t amdgpu_set_pp_force_state(struct device *dev,  	unsigned long idx;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	if (strlen(buf) == 1)  		adev->pp_force_state_enabled = false; @@ -589,8 +604,8 @@ static ssize_t amdgpu_get_pp_table(struct device *dev,  	char *table = NULL;  	int size, ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -631,8 +646,8 @@ static ssize_t amdgpu_set_pp_table(struct device *dev,  	struct amdgpu_device *adev = ddev->dev_private;  	int ret = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -736,8 +751,8 @@ static ssize_t amdgpu_set_pp_od_clk_voltage(struct device *dev,  	const char delimiter[3] = {' ', '\n', '\0'};  	uint32_t type; -	if (amdgpu_sriov_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	if (count > 127)  		return -EINVAL; @@ -828,8 +843,8 @@ static ssize_t amdgpu_get_pp_od_clk_voltage(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -870,18 +885,18 @@ static ssize_t amdgpu_get_pp_od_clk_voltage(struct device *dev,   * the corresponding bit from original ppfeature masks and input the   * new ppfeature masks.   */ -static ssize_t amdgpu_set_pp_feature_status(struct device *dev, -		struct device_attribute *attr, -		const char *buf, -		size_t count) +static ssize_t amdgpu_set_pp_features(struct device *dev, +				      struct device_attribute *attr, +				      const char *buf, +				      size_t count)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	uint64_t featuremask;  	int ret; -	if (amdgpu_sriov_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = kstrtou64(buf, 0, &featuremask);  	if (ret) @@ -914,17 +929,17 @@ static ssize_t amdgpu_set_pp_feature_status(struct device *dev,  	return count;  } -static ssize_t amdgpu_get_pp_feature_status(struct device *dev, -		struct device_attribute *attr, -		char *buf) +static ssize_t amdgpu_get_pp_features(struct device *dev, +				      struct device_attribute *attr, +				      char *buf)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -982,8 +997,8 @@ static ssize_t amdgpu_get_pp_dpm_sclk(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1048,8 +1063,8 @@ static ssize_t amdgpu_set_pp_dpm_sclk(struct device *dev,  	int ret;  	uint32_t mask = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret) @@ -1082,8 +1097,8 @@ static ssize_t amdgpu_get_pp_dpm_mclk(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1112,8 +1127,8 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,  	uint32_t mask = 0;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -			return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret) @@ -1146,8 +1161,8 @@ static ssize_t amdgpu_get_pp_dpm_socclk(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1176,8 +1191,8 @@ static ssize_t amdgpu_set_pp_dpm_socclk(struct device *dev,  	int ret;  	uint32_t mask = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret) @@ -1212,8 +1227,8 @@ static ssize_t amdgpu_get_pp_dpm_fclk(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1242,8 +1257,8 @@ static ssize_t amdgpu_set_pp_dpm_fclk(struct device *dev,  	int ret;  	uint32_t mask = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret) @@ -1278,8 +1293,8 @@ static ssize_t amdgpu_get_pp_dpm_dcefclk(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1308,8 +1323,8 @@ static ssize_t amdgpu_set_pp_dpm_dcefclk(struct device *dev,  	int ret;  	uint32_t mask = 0; -	if (amdgpu_sriov_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret) @@ -1344,8 +1359,8 @@ static ssize_t amdgpu_get_pp_dpm_pcie(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1374,8 +1389,8 @@ static ssize_t amdgpu_set_pp_dpm_pcie(struct device *dev,  	int ret;  	uint32_t mask = 0; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = amdgpu_read_mask(buf, count, &mask);  	if (ret) @@ -1410,8 +1425,8 @@ static ssize_t amdgpu_get_pp_sclk_od(struct device *dev,  	uint32_t value = 0;  	int ret; -	if (amdgpu_sriov_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1438,8 +1453,8 @@ static ssize_t amdgpu_set_pp_sclk_od(struct device *dev,  	int ret;  	long int value; -	if (amdgpu_sriov_vf(adev)) -		return -EINVAL; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = kstrtol(buf, 0, &value); @@ -1479,8 +1494,8 @@ static ssize_t amdgpu_get_pp_mclk_od(struct device *dev,  	uint32_t value = 0;  	int ret; -	if (amdgpu_sriov_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1507,8 +1522,8 @@ static ssize_t amdgpu_set_pp_mclk_od(struct device *dev,  	int ret;  	long int value; -	if (amdgpu_sriov_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = kstrtol(buf, 0, &value); @@ -1568,8 +1583,8 @@ static ssize_t amdgpu_get_pp_power_profile_mode(struct device *dev,  	ssize_t size;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1606,15 +1621,15 @@ static ssize_t amdgpu_set_pp_power_profile_mode(struct device *dev,  	long int profile_mode = 0;  	const char delimiter[3] = {' ', '\n', '\0'}; +	if (adev->in_gpu_reset) +		return -EPERM; +  	tmp[0] = *(buf);  	tmp[1] = '\0';  	ret = kstrtol(tmp, 0, &profile_mode);  	if (ret)  		return -EINVAL; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return -EINVAL; -  	if (profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {  		if (count < 2 || count > 127)  			return -EINVAL; @@ -1660,16 +1675,16 @@ static ssize_t amdgpu_set_pp_power_profile_mode(struct device *dev,   * The SMU firmware computes a percentage of load based on the   * aggregate activity level in the IP cores.   */ -static ssize_t amdgpu_get_busy_percent(struct device *dev, -		struct device_attribute *attr, -		char *buf) +static ssize_t amdgpu_get_gpu_busy_percent(struct device *dev, +					   struct device_attribute *attr, +					   char *buf)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	int r, value, size = sizeof(value); -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	r = pm_runtime_get_sync(ddev->dev);  	if (r < 0) @@ -1696,16 +1711,16 @@ static ssize_t amdgpu_get_busy_percent(struct device *dev,   * The SMU firmware computes a percentage of load based on the   * aggregate activity level in the IP cores.   */ -static ssize_t amdgpu_get_memory_busy_percent(struct device *dev, -		struct device_attribute *attr, -		char *buf) +static ssize_t amdgpu_get_mem_busy_percent(struct device *dev, +					   struct device_attribute *attr, +					   char *buf)  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private;  	int r, value, size = sizeof(value); -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	r = pm_runtime_get_sync(ddev->dev);  	if (r < 0) @@ -1742,11 +1757,17 @@ static ssize_t amdgpu_get_pcie_bw(struct device *dev,  {  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private; -	uint64_t count0, count1; +	uint64_t count0 = 0, count1 = 0;  	int ret; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM; + +	if (adev->flags & AMD_IS_APU) +		return -ENODATA; + +	if (!adev->asic_funcs->get_pcie_usage) +		return -ENODATA;  	ret = pm_runtime_get_sync(ddev->dev);  	if (ret < 0) @@ -1778,8 +1799,8 @@ static ssize_t amdgpu_get_unique_id(struct device *dev,  	struct drm_device *ddev = dev_get_drvdata(dev);  	struct amdgpu_device *adev = ddev->dev_private; -	if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) -		return 0; +	if (adev->in_gpu_reset) +		return -EPERM;  	if (adev->unique_id)  		return snprintf(buf, PAGE_SIZE, "%016llx\n", adev->unique_id); @@ -1787,57 +1808,185 @@ static ssize_t amdgpu_get_unique_id(struct device *dev,  	return 0;  } -static DEVICE_ATTR(power_dpm_state, S_IRUGO | S_IWUSR, amdgpu_get_dpm_state, amdgpu_set_dpm_state); -static DEVICE_ATTR(power_dpm_force_performance_level, S_IRUGO | S_IWUSR, -		   amdgpu_get_dpm_forced_performance_level, -		   amdgpu_set_dpm_forced_performance_level); -static DEVICE_ATTR(pp_num_states, S_IRUGO, amdgpu_get_pp_num_states, NULL); -static DEVICE_ATTR(pp_cur_state, S_IRUGO, amdgpu_get_pp_cur_state, NULL); -static DEVICE_ATTR(pp_force_state, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_force_state, -		amdgpu_set_pp_force_state); -static DEVICE_ATTR(pp_table, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_table, -		amdgpu_set_pp_table); -static DEVICE_ATTR(pp_dpm_sclk, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_dpm_sclk, -		amdgpu_set_pp_dpm_sclk); -static DEVICE_ATTR(pp_dpm_mclk, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_dpm_mclk, -		amdgpu_set_pp_dpm_mclk); -static DEVICE_ATTR(pp_dpm_socclk, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_dpm_socclk, -		amdgpu_set_pp_dpm_socclk); -static DEVICE_ATTR(pp_dpm_fclk, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_dpm_fclk, -		amdgpu_set_pp_dpm_fclk); -static DEVICE_ATTR(pp_dpm_dcefclk, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_dpm_dcefclk, -		amdgpu_set_pp_dpm_dcefclk); -static DEVICE_ATTR(pp_dpm_pcie, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_dpm_pcie, -		amdgpu_set_pp_dpm_pcie); -static DEVICE_ATTR(pp_sclk_od, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_sclk_od, -		amdgpu_set_pp_sclk_od); -static DEVICE_ATTR(pp_mclk_od, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_mclk_od, -		amdgpu_set_pp_mclk_od); -static DEVICE_ATTR(pp_power_profile_mode, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_power_profile_mode, -		amdgpu_set_pp_power_profile_mode); -static DEVICE_ATTR(pp_od_clk_voltage, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_od_clk_voltage, -		amdgpu_set_pp_od_clk_voltage); -static DEVICE_ATTR(gpu_busy_percent, S_IRUGO, -		amdgpu_get_busy_percent, NULL); -static DEVICE_ATTR(mem_busy_percent, S_IRUGO, -		amdgpu_get_memory_busy_percent, NULL); -static DEVICE_ATTR(pcie_bw, S_IRUGO, amdgpu_get_pcie_bw, NULL); -static DEVICE_ATTR(pp_features, S_IRUGO | S_IWUSR, -		amdgpu_get_pp_feature_status, -		amdgpu_set_pp_feature_status); -static DEVICE_ATTR(unique_id, S_IRUGO, amdgpu_get_unique_id, NULL); +static struct amdgpu_device_attr amdgpu_device_attrs[] = { +	AMDGPU_DEVICE_ATTR_RW(power_dpm_state,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(power_dpm_force_performance_level,	ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RO(pp_num_states,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(pp_cur_state,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_force_state,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_table,					ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_dpm_sclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(pp_dpm_mclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(pp_dpm_socclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(pp_dpm_fclk,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF), +	AMDGPU_DEVICE_ATTR_RW(pp_dpm_dcefclk,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_dpm_pcie,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_sclk_od,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_mclk_od,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_power_profile_mode,			ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_od_clk_voltage,			ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(gpu_busy_percent,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(mem_busy_percent,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(pcie_bw,					ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RW(pp_features,				ATTR_FLAG_BASIC), +	AMDGPU_DEVICE_ATTR_RO(unique_id,				ATTR_FLAG_BASIC), +}; + +static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_attr *attr, +			       uint32_t mask, enum amdgpu_device_attr_states *states) +{ +	struct device_attribute *dev_attr = &attr->dev_attr; +	const char *attr_name = dev_attr->attr.name; +	struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; +	enum amd_asic_type asic_type = adev->asic_type; + +	if (!(attr->flags & mask)) { +		*states = ATTR_STATE_UNSUPPORTED; +		return 0; +	} + +#define DEVICE_ATTR_IS(_name)	(!strcmp(attr_name, #_name)) + +	if (DEVICE_ATTR_IS(pp_dpm_socclk)) { +		if (asic_type < CHIP_VEGA10) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(pp_dpm_dcefclk)) { +		if (asic_type < CHIP_VEGA10 || asic_type == CHIP_ARCTURUS) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(pp_dpm_fclk)) { +		if (asic_type < CHIP_VEGA20) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(pp_dpm_pcie)) { +		if (asic_type == CHIP_ARCTURUS) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(pp_od_clk_voltage)) { +		*states = ATTR_STATE_UNSUPPORTED; +		if ((is_support_sw_smu(adev) && adev->smu.od_enabled) || +		    (!is_support_sw_smu(adev) && hwmgr->od_enabled)) +			*states = ATTR_STATE_SUPPORTED; +	} else if (DEVICE_ATTR_IS(mem_busy_percent)) { +		if (adev->flags & AMD_IS_APU || asic_type == CHIP_VEGA10) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(pcie_bw)) { +		/* PCIe Perf counters won't work on APU nodes */ +		if (adev->flags & AMD_IS_APU) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(unique_id)) { +		if (!adev->unique_id) +			*states = ATTR_STATE_UNSUPPORTED; +	} else if (DEVICE_ATTR_IS(pp_features)) { +		if (adev->flags & AMD_IS_APU || asic_type < CHIP_VEGA10) +			*states = ATTR_STATE_UNSUPPORTED; +	} + +	if (asic_type == CHIP_ARCTURUS) { +		/* Arcturus does not support standalone mclk/socclk/fclk level setting */ +		if (DEVICE_ATTR_IS(pp_dpm_mclk) || +		    DEVICE_ATTR_IS(pp_dpm_socclk) || +		    DEVICE_ATTR_IS(pp_dpm_fclk)) { +			dev_attr->attr.mode &= ~S_IWUGO; +			dev_attr->store = NULL; +		} +	} + +#undef DEVICE_ATTR_IS + +	return 0; +} + + +static int amdgpu_device_attr_create(struct amdgpu_device *adev, +				     struct amdgpu_device_attr *attr, +				     uint32_t mask, struct list_head *attr_list) +{ +	int ret = 0; +	struct device_attribute *dev_attr = &attr->dev_attr; +	const char *name = dev_attr->attr.name; +	enum amdgpu_device_attr_states attr_states = ATTR_STATE_SUPPORTED; +	struct amdgpu_device_attr_entry *attr_entry; + +	int (*attr_update)(struct amdgpu_device *adev, struct amdgpu_device_attr *attr, +			   uint32_t mask, enum amdgpu_device_attr_states *states) = default_attr_update; + +	BUG_ON(!attr); + +	attr_update = attr->attr_update ? attr_update : default_attr_update; + +	ret = attr_update(adev, attr, mask, &attr_states); +	if (ret) { +		dev_err(adev->dev, "failed to update device file %s, ret = %d\n", +			name, ret); +		return ret; +	} + +	if (attr_states == ATTR_STATE_UNSUPPORTED) +		return 0; + +	ret = device_create_file(adev->dev, dev_attr); +	if (ret) { +		dev_err(adev->dev, "failed to create device file %s, ret = %d\n", +			name, ret); +	} + +	attr_entry = kmalloc(sizeof(*attr_entry), GFP_KERNEL); +	if (!attr_entry) +		return -ENOMEM; + +	attr_entry->attr = attr; +	INIT_LIST_HEAD(&attr_entry->entry); + +	list_add_tail(&attr_entry->entry, attr_list); + +	return ret; +} + +static void amdgpu_device_attr_remove(struct amdgpu_device *adev, struct amdgpu_device_attr *attr) +{ +	struct device_attribute *dev_attr = &attr->dev_attr; + +	device_remove_file(adev->dev, dev_attr); +} + +static void amdgpu_device_attr_remove_groups(struct amdgpu_device *adev, +					     struct list_head *attr_list); + +static int amdgpu_device_attr_create_groups(struct amdgpu_device *adev, +					    struct amdgpu_device_attr *attrs, +					    uint32_t counts, +					    uint32_t mask, +					    struct list_head *attr_list) +{ +	int ret = 0; +	uint32_t i = 0; + +	for (i = 0; i < counts; i++) { +		ret = amdgpu_device_attr_create(adev, &attrs[i], mask, attr_list); +		if (ret) +			goto failed; +	} + +	return 0; + +failed: +	amdgpu_device_attr_remove_groups(adev, attr_list); + +	return ret; +} + +static void amdgpu_device_attr_remove_groups(struct amdgpu_device *adev, +					     struct list_head *attr_list) +{ +	struct amdgpu_device_attr_entry *entry, *entry_tmp; + +	if (list_empty(attr_list)) +		return ; + +	list_for_each_entry_safe(entry, entry_tmp, attr_list, entry) { +		amdgpu_device_attr_remove(adev, entry->attr); +		list_del(&entry->entry); +		kfree(entry); +	} +}  static ssize_t amdgpu_hwmon_show_temp(struct device *dev,  				      struct device_attribute *attr, @@ -1847,6 +1996,9 @@ static ssize_t amdgpu_hwmon_show_temp(struct device *dev,  	int channel = to_sensor_dev_attr(attr)->index;  	int r, temp = 0, size = sizeof(temp); +	if (adev->in_gpu_reset) +		return -EPERM; +  	if (channel >= PP_TEMP_MAX)  		return -EINVAL; @@ -1978,6 +2130,9 @@ static ssize_t amdgpu_hwmon_get_pwm1_enable(struct device *dev,  	u32 pwm_mode = 0;  	int ret; +	if (adev->in_gpu_reset) +		return -EPERM; +  	ret = pm_runtime_get_sync(adev->ddev->dev);  	if (ret < 0)  		return ret; @@ -2009,6 +2164,9 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev,  	int err, ret;  	int value; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = kstrtoint(buf, 10, &value);  	if (err)  		return err; @@ -2058,6 +2216,9 @@ static ssize_t amdgpu_hwmon_set_pwm1(struct device *dev,  	u32 value;  	u32 pwm_mode; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = pm_runtime_get_sync(adev->ddev->dev);  	if (err < 0)  		return err; @@ -2107,6 +2268,9 @@ static ssize_t amdgpu_hwmon_get_pwm1(struct device *dev,  	int err;  	u32 speed = 0; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = pm_runtime_get_sync(adev->ddev->dev);  	if (err < 0)  		return err; @@ -2137,6 +2301,9 @@ static ssize_t amdgpu_hwmon_get_fan1_input(struct device *dev,  	int err;  	u32 speed = 0; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = pm_runtime_get_sync(adev->ddev->dev);  	if (err < 0)  		return err; @@ -2166,6 +2333,9 @@ static ssize_t amdgpu_hwmon_get_fan1_min(struct device *dev,  	u32 size = sizeof(min_rpm);  	int r; +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2191,6 +2361,9 @@ static ssize_t amdgpu_hwmon_get_fan1_max(struct device *dev,  	u32 size = sizeof(max_rpm);  	int r; +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2215,6 +2388,9 @@ static ssize_t amdgpu_hwmon_get_fan1_target(struct device *dev,  	int err;  	u32 rpm = 0; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = pm_runtime_get_sync(adev->ddev->dev);  	if (err < 0)  		return err; @@ -2244,6 +2420,9 @@ static ssize_t amdgpu_hwmon_set_fan1_target(struct device *dev,  	u32 value;  	u32 pwm_mode; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = pm_runtime_get_sync(adev->ddev->dev);  	if (err < 0)  		return err; @@ -2290,6 +2469,9 @@ static ssize_t amdgpu_hwmon_get_fan1_enable(struct device *dev,  	u32 pwm_mode = 0;  	int ret; +	if (adev->in_gpu_reset) +		return -EPERM; +  	ret = pm_runtime_get_sync(adev->ddev->dev);  	if (ret < 0)  		return ret; @@ -2322,6 +2504,9 @@ static ssize_t amdgpu_hwmon_set_fan1_enable(struct device *dev,  	int value;  	u32 pwm_mode; +	if (adev->in_gpu_reset) +		return -EPERM; +  	err = kstrtoint(buf, 10, &value);  	if (err)  		return err; @@ -2362,6 +2547,9 @@ static ssize_t amdgpu_hwmon_show_vddgfx(struct device *dev,  	u32 vddgfx;  	int r, size = sizeof(vddgfx); +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2394,6 +2582,9 @@ static ssize_t amdgpu_hwmon_show_vddnb(struct device *dev,  	u32 vddnb;  	int r, size = sizeof(vddnb); +	if (adev->in_gpu_reset) +		return -EPERM; +  	/* only APUs have vddnb */  	if  (!(adev->flags & AMD_IS_APU))  		return -EINVAL; @@ -2431,6 +2622,9 @@ static ssize_t amdgpu_hwmon_show_power_avg(struct device *dev,  	int r, size = sizeof(u32);  	unsigned uw; +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2467,6 +2661,9 @@ static ssize_t amdgpu_hwmon_show_power_cap_max(struct device *dev,  	ssize_t size;  	int r; +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2496,6 +2693,9 @@ static ssize_t amdgpu_hwmon_show_power_cap(struct device *dev,  	ssize_t size;  	int r; +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2526,6 +2726,9 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev,  	int err;  	u32 value; +	if (adev->in_gpu_reset) +		return -EPERM; +  	if (amdgpu_sriov_vf(adev))  		return -EINVAL; @@ -2564,6 +2767,9 @@ static ssize_t amdgpu_hwmon_show_sclk(struct device *dev,  	uint32_t sclk;  	int r, size = sizeof(sclk); +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -2596,6 +2802,9 @@ static ssize_t amdgpu_hwmon_show_mclk(struct device *dev,  	uint32_t mclk;  	int r, size = sizeof(mclk); +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(adev->ddev->dev);  	if (r < 0)  		return r; @@ -3238,8 +3447,8 @@ int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_versio  int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)  { -	struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;  	int ret; +	uint32_t mask = 0;  	if (adev->pm.sysfs_initialized)  		return 0; @@ -3247,6 +3456,8 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)  	if (adev->pm.dpm_enabled == 0)  		return 0; +	INIT_LIST_HEAD(&adev->pm.pm_attr_list); +  	adev->pm.int_hwmon_dev = hwmon_device_register_with_groups(adev->dev,  								   DRIVER_NAME, adev,  								   hwmon_groups); @@ -3257,160 +3468,26 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)  		return ret;  	} -	ret = device_create_file(adev->dev, &dev_attr_power_dpm_state); -	if (ret) { -		DRM_ERROR("failed to create device file for dpm state\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_power_dpm_force_performance_level); -	if (ret) { -		DRM_ERROR("failed to create device file for dpm state\n"); -		return ret; -	} - - -	ret = device_create_file(adev->dev, &dev_attr_pp_num_states); -	if (ret) { -		DRM_ERROR("failed to create device file pp_num_states\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_pp_cur_state); -	if (ret) { -		DRM_ERROR("failed to create device file pp_cur_state\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_pp_force_state); -	if (ret) { -		DRM_ERROR("failed to create device file pp_force_state\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_pp_table); -	if (ret) { -		DRM_ERROR("failed to create device file pp_table\n"); -		return ret; -	} - -	ret = device_create_file(adev->dev, &dev_attr_pp_dpm_sclk); -	if (ret) { -		DRM_ERROR("failed to create device file pp_dpm_sclk\n"); -		return ret; -	} - -	/* Arcturus does not support standalone mclk/socclk/fclk level setting */ -	if (adev->asic_type == CHIP_ARCTURUS) { -		dev_attr_pp_dpm_mclk.attr.mode &= ~S_IWUGO; -		dev_attr_pp_dpm_mclk.store = NULL; - -		dev_attr_pp_dpm_socclk.attr.mode &= ~S_IWUGO; -		dev_attr_pp_dpm_socclk.store = NULL; - -		dev_attr_pp_dpm_fclk.attr.mode &= ~S_IWUGO; -		dev_attr_pp_dpm_fclk.store = NULL; +	switch (amdgpu_virt_get_sriov_vf_mode(adev)) { +	case SRIOV_VF_MODE_ONE_VF: +		mask = ATTR_FLAG_ONEVF; +		break; +	case SRIOV_VF_MODE_MULTI_VF: +		mask = 0; +		break; +	case SRIOV_VF_MODE_BARE_METAL: +	default: +		mask = ATTR_FLAG_MASK_ALL; +		break;  	} -	ret = device_create_file(adev->dev, &dev_attr_pp_dpm_mclk); -	if (ret) { -		DRM_ERROR("failed to create device file pp_dpm_mclk\n"); -		return ret; -	} -	if (adev->asic_type >= CHIP_VEGA10) { -		ret = device_create_file(adev->dev, &dev_attr_pp_dpm_socclk); -		if (ret) { -			DRM_ERROR("failed to create device file pp_dpm_socclk\n"); -			return ret; -		} -		if (adev->asic_type != CHIP_ARCTURUS) { -			ret = device_create_file(adev->dev, &dev_attr_pp_dpm_dcefclk); -			if (ret) { -				DRM_ERROR("failed to create device file pp_dpm_dcefclk\n"); -				return ret; -			} -		} -	} -	if (adev->asic_type >= CHIP_VEGA20) { -		ret = device_create_file(adev->dev, &dev_attr_pp_dpm_fclk); -		if (ret) { -			DRM_ERROR("failed to create device file pp_dpm_fclk\n"); -			return ret; -		} -	} -	if (adev->asic_type != CHIP_ARCTURUS) { -		ret = device_create_file(adev->dev, &dev_attr_pp_dpm_pcie); -		if (ret) { -			DRM_ERROR("failed to create device file pp_dpm_pcie\n"); -			return ret; -		} -	} -	ret = device_create_file(adev->dev, &dev_attr_pp_sclk_od); -	if (ret) { -		DRM_ERROR("failed to create device file pp_sclk_od\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_pp_mclk_od); -	if (ret) { -		DRM_ERROR("failed to create device file pp_mclk_od\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, -			&dev_attr_pp_power_profile_mode); -	if (ret) { -		DRM_ERROR("failed to create device file	" -				"pp_power_profile_mode\n"); -		return ret; -	} -	if ((is_support_sw_smu(adev) && adev->smu.od_enabled) || -	    (!is_support_sw_smu(adev) && hwmgr->od_enabled)) { -		ret = device_create_file(adev->dev, -				&dev_attr_pp_od_clk_voltage); -		if (ret) { -			DRM_ERROR("failed to create device file	" -					"pp_od_clk_voltage\n"); -			return ret; -		} -	} -	ret = device_create_file(adev->dev, -			&dev_attr_gpu_busy_percent); -	if (ret) { -		DRM_ERROR("failed to create device file	" -				"gpu_busy_level\n"); -		return ret; -	} -	/* APU does not have its own dedicated memory */ -	if (!(adev->flags & AMD_IS_APU) && -	     (adev->asic_type != CHIP_VEGA10)) { -		ret = device_create_file(adev->dev, -				&dev_attr_mem_busy_percent); -		if (ret) { -			DRM_ERROR("failed to create device file	" -					"mem_busy_percent\n"); -			return ret; -		} -	} -	/* PCIe Perf counters won't work on APU nodes */ -	if (!(adev->flags & AMD_IS_APU)) { -		ret = device_create_file(adev->dev, &dev_attr_pcie_bw); -		if (ret) { -			DRM_ERROR("failed to create device file pcie_bw\n"); -			return ret; -		} -	} -	if (adev->unique_id) -		ret = device_create_file(adev->dev, &dev_attr_unique_id); -	if (ret) { -		DRM_ERROR("failed to create device file unique_id\n"); +	ret = amdgpu_device_attr_create_groups(adev, +					       amdgpu_device_attrs, +					       ARRAY_SIZE(amdgpu_device_attrs), +					       mask, +					       &adev->pm.pm_attr_list); +	if (ret)  		return ret; -	} - -	if ((adev->asic_type >= CHIP_VEGA10) && -	    !(adev->flags & AMD_IS_APU)) { -		ret = device_create_file(adev->dev, -				&dev_attr_pp_features); -		if (ret) { -			DRM_ERROR("failed to create device file	" -					"pp_features\n"); -			return ret; -		} -	}  	adev->pm.sysfs_initialized = true; @@ -3419,51 +3496,13 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)  void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev)  { -	struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle; -  	if (adev->pm.dpm_enabled == 0)  		return;  	if (adev->pm.int_hwmon_dev)  		hwmon_device_unregister(adev->pm.int_hwmon_dev); -	device_remove_file(adev->dev, &dev_attr_power_dpm_state); -	device_remove_file(adev->dev, &dev_attr_power_dpm_force_performance_level); - -	device_remove_file(adev->dev, &dev_attr_pp_num_states); -	device_remove_file(adev->dev, &dev_attr_pp_cur_state); -	device_remove_file(adev->dev, &dev_attr_pp_force_state); -	device_remove_file(adev->dev, &dev_attr_pp_table); - -	device_remove_file(adev->dev, &dev_attr_pp_dpm_sclk); -	device_remove_file(adev->dev, &dev_attr_pp_dpm_mclk); -	if (adev->asic_type >= CHIP_VEGA10) { -		device_remove_file(adev->dev, &dev_attr_pp_dpm_socclk); -		if (adev->asic_type != CHIP_ARCTURUS) -			device_remove_file(adev->dev, &dev_attr_pp_dpm_dcefclk); -	} -	if (adev->asic_type != CHIP_ARCTURUS) -		device_remove_file(adev->dev, &dev_attr_pp_dpm_pcie); -	if (adev->asic_type >= CHIP_VEGA20) -		device_remove_file(adev->dev, &dev_attr_pp_dpm_fclk); -	device_remove_file(adev->dev, &dev_attr_pp_sclk_od); -	device_remove_file(adev->dev, &dev_attr_pp_mclk_od); -	device_remove_file(adev->dev, -			&dev_attr_pp_power_profile_mode); -	if ((is_support_sw_smu(adev) && adev->smu.od_enabled) || -	    (!is_support_sw_smu(adev) && hwmgr->od_enabled)) -		device_remove_file(adev->dev, -				&dev_attr_pp_od_clk_voltage); -	device_remove_file(adev->dev, &dev_attr_gpu_busy_percent); -	if (!(adev->flags & AMD_IS_APU) && -	     (adev->asic_type != CHIP_VEGA10)) -		device_remove_file(adev->dev, &dev_attr_mem_busy_percent); -	if (!(adev->flags & AMD_IS_APU)) -		device_remove_file(adev->dev, &dev_attr_pcie_bw); -	if (adev->unique_id) -		device_remove_file(adev->dev, &dev_attr_unique_id); -	if ((adev->asic_type >= CHIP_VEGA10) && -	    !(adev->flags & AMD_IS_APU)) -		device_remove_file(adev->dev, &dev_attr_pp_features); + +	amdgpu_device_attr_remove_groups(adev, &adev->pm.pm_attr_list);  }  void amdgpu_pm_compute_clocks(struct amdgpu_device *adev) @@ -3626,6 +3665,9 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data)  	u32 flags = 0;  	int r; +	if (adev->in_gpu_reset) +		return -EPERM; +  	r = pm_runtime_get_sync(dev->dev);  	if (r < 0)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h index 5db0ef86e84c..d9ae2b49a402 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h @@ -30,6 +30,55 @@ struct cg_flag_name  	const char *name;  }; +enum amdgpu_device_attr_flags { +	ATTR_FLAG_BASIC = (1 << 0), +	ATTR_FLAG_ONEVF = (1 << 16), +}; + +#define ATTR_FLAG_TYPE_MASK	(0x0000ffff) +#define ATTR_FLAG_MODE_MASK	(0xffff0000) +#define ATTR_FLAG_MASK_ALL	(0xffffffff) + +enum amdgpu_device_attr_states { +	ATTR_STATE_UNSUPPORTED = 0, +	ATTR_STATE_SUPPORTED, +}; + +struct amdgpu_device_attr { +	struct device_attribute dev_attr; +	enum amdgpu_device_attr_flags flags; +	int (*attr_update)(struct amdgpu_device *adev, struct amdgpu_device_attr *attr, +			   uint32_t mask, enum amdgpu_device_attr_states *states); + +}; + +struct amdgpu_device_attr_entry { +	struct list_head entry; +	struct amdgpu_device_attr *attr; +}; + +#define to_amdgpu_device_attr(_dev_attr) \ +	container_of(_dev_attr, struct amdgpu_device_attr, dev_attr) + +#define __AMDGPU_DEVICE_ATTR(_name, _mode, _show, _store, _flags, ...)	\ +	{ .dev_attr = __ATTR(_name, _mode, _show, _store),		\ +	  .flags = _flags,						\ +	  ##__VA_ARGS__, } + +#define AMDGPU_DEVICE_ATTR(_name, _mode, _flags, ...)			\ +	__AMDGPU_DEVICE_ATTR(_name, _mode,				\ +			     amdgpu_get_##_name, amdgpu_set_##_name,	\ +			     _flags, ##__VA_ARGS__) + +#define AMDGPU_DEVICE_ATTR_RW(_name, _flags, ...)			\ +	AMDGPU_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR,			\ +			   _flags, ##__VA_ARGS__) + +#define AMDGPU_DEVICE_ATTR_RO(_name, _flags, ...)			\ +	__AMDGPU_DEVICE_ATTR(_name, S_IRUGO,				\ +			     amdgpu_get_##_name, NULL,			\ +			     _flags, ##__VA_ARGS__) +  void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev);  int amdgpu_pm_sysfs_init(struct amdgpu_device *adev);  int amdgpu_pm_virt_sysfs_init(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index deaa26808841..7301fdcfb8bc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -37,11 +37,11 @@  #include "amdgpu_ras.h" -static void psp_set_funcs(struct amdgpu_device *adev); -  static int psp_sysfs_init(struct amdgpu_device *adev);  static void psp_sysfs_fini(struct amdgpu_device *adev); +static int psp_load_smu_fw(struct psp_context *psp); +  /*   * Due to DF Cstate management centralized to PMFW, the firmware   * loading sequence will be updated as below: @@ -80,8 +80,6 @@ static int psp_early_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	struct psp_context *psp = &adev->psp; -	psp_set_funcs(adev); -  	switch (adev->asic_type) {  	case CHIP_VEGA10:  	case CHIP_VEGA12: @@ -201,6 +199,7 @@ psp_cmd_submit_buf(struct psp_context *psp,  	int index;  	int timeout = 2000;  	bool ras_intr = false; +	bool skip_unsupport = false;  	mutex_lock(&psp->mutex); @@ -232,6 +231,9 @@ psp_cmd_submit_buf(struct psp_context *psp,  		amdgpu_asic_invalidate_hdp(psp->adev, NULL);  	} +	/* We allow TEE_ERROR_NOT_SUPPORTED for VMR command in SRIOV */ +	skip_unsupport = (psp->cmd_buf_mem->resp.status == 0xffff000a) && amdgpu_sriov_vf(psp->adev); +  	/* In some cases, psp response status is not 0 even there is no  	 * problem while the command is submitted. Some version of PSP FW  	 * doesn't write 0 to that field. @@ -239,7 +241,7 @@ psp_cmd_submit_buf(struct psp_context *psp,  	 * during psp initialization to avoid breaking hw_init and it doesn't  	 * return -EINVAL.  	 */ -	if ((psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) { +	if (!skip_unsupport && (psp->cmd_buf_mem->resp.status || !timeout) && !ras_intr) {  		if (ucode)  			DRM_WARN("failed to load ucode id (%d) ",  				  ucode->ucode_id); @@ -268,7 +270,7 @@ static void psp_prep_tmr_cmd_buf(struct psp_context *psp,  				 struct psp_gfx_cmd_resp *cmd,  				 uint64_t tmr_mc, uint32_t size)  { -	if (psp_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(psp->adev))  		cmd->cmd_id = GFX_CMD_ID_SETUP_VMR;  	else  		cmd->cmd_id = GFX_CMD_ID_SETUP_TMR; @@ -662,6 +664,121 @@ int psp_xgmi_initialize(struct psp_context *psp)  	return ret;  } +int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) +{ +	struct ta_xgmi_shared_memory *xgmi_cmd; +	int ret; + +	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; +	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); + +	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID; + +	/* Invoke xgmi ta to get hive id */ +	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); +	if (ret) +		return ret; + +	*hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id; + +	return 0; +} + +int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) +{ +	struct ta_xgmi_shared_memory *xgmi_cmd; +	int ret; + +	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; +	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); + +	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID; + +	/* Invoke xgmi ta to get the node id */ +	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); +	if (ret) +		return ret; + +	*node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id; + +	return 0; +} + +int psp_xgmi_get_topology_info(struct psp_context *psp, +			       int number_devices, +			       struct psp_xgmi_topology_info *topology) +{ +	struct ta_xgmi_shared_memory *xgmi_cmd; +	struct ta_xgmi_cmd_get_topology_info_input *topology_info_input; +	struct ta_xgmi_cmd_get_topology_info_output *topology_info_output; +	int i; +	int ret; + +	if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES) +		return -EINVAL; + +	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; +	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); + +	/* Fill in the shared memory with topology information as input */ +	topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info; +	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO; +	topology_info_input->num_nodes = number_devices; + +	for (i = 0; i < topology_info_input->num_nodes; i++) { +		topology_info_input->nodes[i].node_id = topology->nodes[i].node_id; +		topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops; +		topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled; +		topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine; +	} + +	/* Invoke xgmi ta to get the topology information */ +	ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO); +	if (ret) +		return ret; + +	/* Read the output topology information from the shared memory */ +	topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info; +	topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes; +	for (i = 0; i < topology->num_nodes; i++) { +		topology->nodes[i].node_id = topology_info_output->nodes[i].node_id; +		topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops; +		topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled; +		topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine; +	} + +	return 0; +} + +int psp_xgmi_set_topology_info(struct psp_context *psp, +			       int number_devices, +			       struct psp_xgmi_topology_info *topology) +{ +	struct ta_xgmi_shared_memory *xgmi_cmd; +	struct ta_xgmi_cmd_get_topology_info_input *topology_info_input; +	int i; + +	if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES) +		return -EINVAL; + +	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; +	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); + +	topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info; +	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO; +	topology_info_input->num_nodes = number_devices; + +	for (i = 0; i < topology_info_input->num_nodes; i++) { +		topology_info_input->nodes[i].node_id = topology->nodes[i].node_id; +		topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops; +		topology_info_input->nodes[i].is_sharing_enabled = 1; +		topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine; +	} + +	/* Invoke xgmi ta to set topology information */ +	return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); +} +  // ras begin  static int psp_ras_init_shared_buf(struct psp_context *psp)  { @@ -744,13 +861,40 @@ static int psp_ras_unload(struct psp_context *psp)  int psp_ras_invoke(struct psp_context *psp, uint32_t ta_cmd_id)  { +	struct ta_ras_shared_memory *ras_cmd; +	int ret; + +	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; +  	/*  	 * TODO: bypass the loading in sriov for now  	 */  	if (amdgpu_sriov_vf(psp->adev))  		return 0; -	return psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id); +	ret = psp_ta_invoke(psp, ta_cmd_id, psp->ras.session_id); + +	if (amdgpu_ras_intr_triggered()) +		return ret; + +	if (ras_cmd->if_version > RAS_TA_HOST_IF_VER) +	{ +		DRM_WARN("RAS: Unsupported Interface"); +		return -EINVAL; +	} + +	if (!ret) { +		if (ras_cmd->ras_out_message.flags.err_inject_switch_disable_flag) { +			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) +			dev_warn(psp->adev->dev, +				 "RAS internal register access blocked\n"); +	} + +	return ret;  }  int psp_ras_enable_features(struct psp_context *psp, @@ -834,6 +978,33 @@ static int psp_ras_initialize(struct psp_context *psp)  	return 0;  } + +int psp_ras_trigger_error(struct psp_context *psp, +			  struct ta_ras_trigger_error_input *info) +{ +	struct ta_ras_shared_memory *ras_cmd; +	int ret; + +	if (!psp->ras.ras_initialized) +		return -EINVAL; + +	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; +	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory)); + +	ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR; +	ras_cmd->ras_in_message.trigger_error = *info; + +	ret = psp_ras_invoke(psp, ras_cmd->cmd_id); +	if (ret) +		return -EINVAL; + +	/* If err_event_athub occurs error inject was successful, however +	   return status from TA is no long reliable */ +	if (amdgpu_ras_intr_triggered()) +		return 0; + +	return ras_cmd->ras_status; +}  // ras end  // HDCP start @@ -884,6 +1055,7 @@ static int psp_hdcp_load(struct psp_context *psp)  	if (!ret) {  		psp->hdcp_context.hdcp_initialized = true;  		psp->hdcp_context.session_id = cmd->resp.session_id; +		mutex_init(&psp->hdcp_context.mutex);  	}  	kfree(cmd); @@ -1029,6 +1201,7 @@ static int psp_dtm_load(struct psp_context *psp)  	if (!ret) {  		psp->dtm_context.dtm_initialized = true;  		psp->dtm_context.session_id = cmd->resp.session_id; +		mutex_init(&psp->dtm_context.mutex);  	}  	kfree(cmd); @@ -1169,16 +1342,20 @@ static int psp_hw_start(struct psp_context *psp)  	}  	/* -	 * For those ASICs with DF Cstate management centralized +	 * For ASICs with DF Cstate management centralized  	 * to PMFW, TMR setup should be performed after PMFW  	 * loaded and before other non-psp firmware loaded.  	 */ -	if (!psp->pmfw_centralized_cstate_management) { -		ret = psp_tmr_load(psp); -		if (ret) { -			DRM_ERROR("PSP load tmr failed!\n"); +	if (psp->pmfw_centralized_cstate_management) { +		ret = psp_load_smu_fw(psp); +		if (ret)  			return ret; -		} +	} + +	ret = psp_tmr_load(psp); +	if (ret) { +		DRM_ERROR("PSP load tmr failed!\n"); +		return ret;  	}  	return 0; @@ -1355,7 +1532,7 @@ static int psp_prep_load_ip_fw_cmd_buf(struct amdgpu_firmware_info *ucode,  }  static int psp_execute_np_fw_load(struct psp_context *psp, -			       struct amdgpu_firmware_info *ucode) +			          struct amdgpu_firmware_info *ucode)  {  	int ret = 0; @@ -1369,64 +1546,96 @@ static int psp_execute_np_fw_load(struct psp_context *psp,  	return ret;  } +static int psp_load_smu_fw(struct psp_context *psp) +{ +	int ret; +	struct amdgpu_device* adev = psp->adev; +	struct amdgpu_firmware_info *ucode = +			&adev->firmware.ucode[AMDGPU_UCODE_ID_SMC]; +	struct amdgpu_ras *ras = psp->ras.ras; + +	if (!ucode->fw || amdgpu_sriov_vf(psp->adev)) +		return 0; + + +	if (adev->in_gpu_reset && ras && ras->supported) { +		ret = amdgpu_dpm_set_mp1_state(adev, PP_MP1_STATE_UNLOAD); +		if (ret) { +			DRM_WARN("Failed to set MP1 state prepare for reload\n"); +		} +	} + +	ret = psp_execute_np_fw_load(psp, ucode); + +	if (ret) +		DRM_ERROR("PSP load smu failed!\n"); + +	return ret; +} + +static bool fw_load_skip_check(struct psp_context *psp, +			       struct amdgpu_firmware_info *ucode) +{ +	if (!ucode->fw) +		return true; + +	if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC && +	    (psp_smu_reload_quirk(psp) || +	     psp->autoload_supported || +	     psp->pmfw_centralized_cstate_management)) +		return true; + +	if (amdgpu_sriov_vf(psp->adev) && +	   (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA2 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA3 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA4 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA5 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA6 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA7 +	    || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G +	    || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL +	    || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM +	    || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM +	    || ucode->ucode_id == AMDGPU_UCODE_ID_SMC)) +		/*skip ucode loading in SRIOV VF */ +		return true; + +	if (psp->autoload_supported && +	    (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC1_JT || +	     ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC2_JT)) +		/* skip mec JT when autoload is enabled */ +		return true; + +	return false; +} +  static int psp_np_fw_load(struct psp_context *psp)  {  	int i, ret;  	struct amdgpu_firmware_info *ucode;  	struct amdgpu_device* adev = psp->adev; -	if (psp->autoload_supported || -	    psp->pmfw_centralized_cstate_management) { -		ucode = &adev->firmware.ucode[AMDGPU_UCODE_ID_SMC]; -		if (!ucode->fw || amdgpu_sriov_vf(adev)) -			goto out; - -		ret = psp_execute_np_fw_load(psp, ucode); +	if (psp->autoload_supported && +	    !psp->pmfw_centralized_cstate_management) { +		ret = psp_load_smu_fw(psp);  		if (ret)  			return ret;  	} -	if (psp->pmfw_centralized_cstate_management) { -		ret = psp_tmr_load(psp); -		if (ret) { -			DRM_ERROR("PSP load tmr failed!\n"); -			return ret; -		} -	} - -out:  	for (i = 0; i < adev->firmware.max_ucodes; i++) {  		ucode = &adev->firmware.ucode[i]; -		if (!ucode->fw) -			continue;  		if (ucode->ucode_id == AMDGPU_UCODE_ID_SMC && -		    (psp_smu_reload_quirk(psp) || -		     psp->autoload_supported || -		     psp->pmfw_centralized_cstate_management)) -			continue; - -		if (amdgpu_sriov_vf(adev) && -		   (ucode->ucode_id == AMDGPU_UCODE_ID_SDMA0 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA1 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA2 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA3 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA4 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA5 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA6 -		    || ucode->ucode_id == AMDGPU_UCODE_ID_SDMA7 -                    || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_G -	            || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL -	            || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_GPM_MEM -	            || ucode->ucode_id == AMDGPU_UCODE_ID_RLC_RESTORE_LIST_SRM_MEM -	            || ucode->ucode_id == AMDGPU_UCODE_ID_SMC)) -			/*skip ucode loading in SRIOV VF */ +		    !fw_load_skip_check(psp, ucode)) { +			ret = psp_load_smu_fw(psp); +			if (ret) +				return ret;  			continue; +		} -		if (psp->autoload_supported && -		    (ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC1_JT || -		     ucode->ucode_id == AMDGPU_UCODE_ID_CP_MEC2_JT)) -			/* skip mec JT when autoload is enabled */ +		if (fw_load_skip_check(psp, ucode))  			continue;  		psp_print_fw_hdr(psp, ucode); @@ -1438,17 +1647,12 @@ out:  		/* Start rlc autoload after psp recieved all the gfx firmware */  		if (psp->autoload_supported && ucode->ucode_id == (amdgpu_sriov_vf(adev) ?  		    AMDGPU_UCODE_ID_CP_MEC2 : AMDGPU_UCODE_ID_RLC_G)) { -			ret = psp_rlc_autoload(psp); +			ret = psp_rlc_autoload_start(psp);  			if (ret) {  				DRM_ERROR("Failed to start rlc autoload\n");  				return ret;  			}  		} -#if 0 -		/* check if firmware loaded sucessfully */ -		if (!amdgpu_psp_check_fw_loading_status(adev, i)) -			return -EINVAL; -#endif  	}  	return 0; @@ -1806,19 +2010,110 @@ int psp_ring_cmd_submit(struct psp_context *psp,  	return 0;  } -static bool psp_check_fw_loading_status(struct amdgpu_device *adev, -					enum AMDGPU_UCODE_ID ucode_type) +int psp_init_asd_microcode(struct psp_context *psp, +			   const char *chip_name)  { -	struct amdgpu_firmware_info *ucode = NULL; +	struct amdgpu_device *adev = psp->adev; +	char fw_name[30]; +	const struct psp_firmware_header_v1_0 *asd_hdr; +	int err = 0; -	if (!adev->firmware.fw_size) -		return false; +	if (!chip_name) { +		dev_err(adev->dev, "invalid chip name for asd microcode\n"); +		return -EINVAL; +	} -	ucode = &adev->firmware.ucode[ucode_type]; -	if (!ucode->fw || !ucode->ucode_size) -		return false; +	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); +	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); +	if (err) +		goto out; + +	err = amdgpu_ucode_validate(adev->psp.asd_fw); +	if (err) +		goto out; + +	asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; +	adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version); +	adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version); +	adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes); +	adev->psp.asd_start_addr = (uint8_t *)asd_hdr + +				le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes); +	return 0; +out: +	dev_err(adev->dev, "fail to initialize asd microcode\n"); +	release_firmware(adev->psp.asd_fw); +	adev->psp.asd_fw = NULL; +	return err; +} + +int psp_init_sos_microcode(struct psp_context *psp, +			   const char *chip_name) +{ +	struct amdgpu_device *adev = psp->adev; +	char fw_name[30]; +	const struct psp_firmware_header_v1_0 *sos_hdr; +	const struct psp_firmware_header_v1_1 *sos_hdr_v1_1; +	const struct psp_firmware_header_v1_2 *sos_hdr_v1_2; +	int err = 0; + +	if (!chip_name) { +		dev_err(adev->dev, "invalid chip name for sos microcode\n"); +		return -EINVAL; +	} + +	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name); +	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); +	if (err) +		goto out; + +	err = amdgpu_ucode_validate(adev->psp.sos_fw); +	if (err) +		goto out; + +	sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; +	amdgpu_ucode_print_psp_hdr(&sos_hdr->header); + +	switch (sos_hdr->header.header_version_major) { +	case 1: +		adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version); +		adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version); +		adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes); +		adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes); +		adev->psp.sys_start_addr = (uint8_t *)sos_hdr + +				le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes); +		adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + +				le32_to_cpu(sos_hdr->sos_offset_bytes); +		if (sos_hdr->header.header_version_minor == 1) { +			sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; +			adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes); +			adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr + +					le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes); +			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes); +			adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + +					le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes); +		} +		if (sos_hdr->header.header_version_minor == 2) { +			sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; +			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes); +			adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + +						    le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes); +		} +		break; +	default: +		dev_err(adev->dev, +			"unsupported psp sos firmware\n"); +		err = -EINVAL; +		goto out; +	} + +	return 0; +out: +	dev_err(adev->dev, +		"failed to init sos firmware\n"); +	release_firmware(adev->psp.sos_fw); +	adev->psp.sos_fw = NULL; -	return psp_compare_sram_data(&adev->psp, ucode, ucode_type); +	return err;  }  static int psp_set_clockgating_state(void *handle, @@ -1957,16 +2252,6 @@ static void psp_sysfs_fini(struct amdgpu_device *adev)  	device_remove_file(adev->dev, &dev_attr_usbc_pd_fw);  } -static const struct amdgpu_psp_funcs psp_funcs = { -	.check_fw_loading_status = psp_check_fw_loading_status, -}; - -static void psp_set_funcs(struct amdgpu_device *adev) -{ -	if (NULL == adev->firmware.funcs) -		adev->firmware.funcs = &psp_funcs; -} -  const struct amdgpu_ip_block_version psp_v3_1_ip_block =  {  	.type = AMD_IP_BLOCK_TYPE_PSP, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h index 297435c0c7c1..2a56ad996d83 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h @@ -93,22 +93,8 @@ struct psp_funcs  			    enum psp_ring_type ring_type);  	int (*ring_destroy)(struct psp_context *psp,  			    enum psp_ring_type ring_type); -	bool (*compare_sram_data)(struct psp_context *psp, -				  struct amdgpu_firmware_info *ucode, -				  enum AMDGPU_UCODE_ID ucode_type);  	bool (*smu_reload_quirk)(struct psp_context *psp);  	int (*mode1_reset)(struct psp_context *psp); -	int (*xgmi_get_node_id)(struct psp_context *psp, uint64_t *node_id); -	int (*xgmi_get_hive_id)(struct psp_context *psp, uint64_t *hive_id); -	int (*xgmi_get_topology_info)(struct psp_context *psp, int number_devices, -				      struct psp_xgmi_topology_info *topology); -	int (*xgmi_set_topology_info)(struct psp_context *psp, int number_devices, -				      struct psp_xgmi_topology_info *topology); -	bool (*support_vmr_ring)(struct psp_context *psp); -	int (*ras_trigger_error)(struct psp_context *psp, -			struct ta_ras_trigger_error_input *info); -	int (*ras_cure_posion)(struct psp_context *psp, uint64_t *mode_ptr); -	int (*rlc_autoload_start)(struct psp_context *psp);  	int (*mem_training_init)(struct psp_context *psp);  	void (*mem_training_fini)(struct psp_context *psp);  	int (*mem_training)(struct psp_context *psp, uint32_t ops); @@ -161,6 +147,7 @@ struct psp_hdcp_context {  	struct amdgpu_bo	*hdcp_shared_bo;  	uint64_t		hdcp_shared_mc_addr;  	void			*hdcp_shared_buf; +	struct mutex		mutex;  };  struct psp_dtm_context { @@ -169,6 +156,7 @@ struct psp_dtm_context {  	struct amdgpu_bo	*dtm_shared_bo;  	uint64_t		dtm_shared_mc_addr;  	void			*dtm_shared_buf; +	struct mutex		mutex;  };  #define MEM_TRAIN_SYSTEM_SIGNATURE		0x54534942 @@ -306,8 +294,6 @@ struct amdgpu_psp_funcs {  #define psp_ring_create(psp, type) (psp)->funcs->ring_create((psp), (type))  #define psp_ring_stop(psp, type) (psp)->funcs->ring_stop((psp), (type))  #define psp_ring_destroy(psp, type) ((psp)->funcs->ring_destroy((psp), (type))) -#define psp_compare_sram_data(psp, ucode, type) \ -		(psp)->funcs->compare_sram_data((psp), (ucode), (type))  #define psp_init_microcode(psp) \  		((psp)->funcs->init_microcode ? (psp)->funcs->init_microcode((psp)) : 0)  #define psp_bootloader_load_kdb(psp) \ @@ -318,22 +304,8 @@ struct amdgpu_psp_funcs {  		((psp)->funcs->bootloader_load_sos ? (psp)->funcs->bootloader_load_sos((psp)) : 0)  #define psp_smu_reload_quirk(psp) \  		((psp)->funcs->smu_reload_quirk ? (psp)->funcs->smu_reload_quirk((psp)) : false) -#define psp_support_vmr_ring(psp) \ -		((psp)->funcs->support_vmr_ring ? (psp)->funcs->support_vmr_ring((psp)) : false)  #define psp_mode1_reset(psp) \  		((psp)->funcs->mode1_reset ? (psp)->funcs->mode1_reset((psp)) : false) -#define psp_xgmi_get_node_id(psp, node_id) \ -		((psp)->funcs->xgmi_get_node_id ? (psp)->funcs->xgmi_get_node_id((psp), (node_id)) : -EINVAL) -#define psp_xgmi_get_hive_id(psp, hive_id) \ -		((psp)->funcs->xgmi_get_hive_id ? (psp)->funcs->xgmi_get_hive_id((psp), (hive_id)) : -EINVAL) -#define psp_xgmi_get_topology_info(psp, num_device, topology) \ -		((psp)->funcs->xgmi_get_topology_info ? \ -		(psp)->funcs->xgmi_get_topology_info((psp), (num_device), (topology)) : -EINVAL) -#define psp_xgmi_set_topology_info(psp, num_device, topology) \ -		((psp)->funcs->xgmi_set_topology_info ?	 \ -		(psp)->funcs->xgmi_set_topology_info((psp), (num_device), (topology)) : -EINVAL) -#define psp_rlc_autoload(psp) \ -		((psp)->funcs->rlc_autoload_start ? (psp)->funcs->rlc_autoload_start((psp)) : 0)  #define psp_mem_training_init(psp) \  	((psp)->funcs->mem_training_init ? (psp)->funcs->mem_training_init((psp)) : 0)  #define psp_mem_training_fini(psp) \ @@ -341,15 +313,6 @@ struct amdgpu_psp_funcs {  #define psp_mem_training(psp, ops) \  	((psp)->funcs->mem_training ? (psp)->funcs->mem_training((psp), (ops)) : 0) -#define amdgpu_psp_check_fw_loading_status(adev, i) (adev)->firmware.funcs->check_fw_loading_status((adev), (i)) - -#define psp_ras_trigger_error(psp, info) \ -	((psp)->funcs->ras_trigger_error ? \ -	(psp)->funcs->ras_trigger_error((psp), (info)) : -EINVAL) -#define psp_ras_cure_posion(psp, addr) \ -	((psp)->funcs->ras_cure_posion ? \ -	(psp)->funcs->ras_cure_posion(psp, (addr)) : -EINVAL) -  #define psp_ring_get_wptr(psp) (psp)->funcs->ring_get_wptr((psp))  #define psp_ring_set_wptr(psp, value) (psp)->funcs->ring_set_wptr((psp), (value)) @@ -377,10 +340,21 @@ int psp_update_vcn_sram(struct amdgpu_device *adev, int inst_idx,  int psp_xgmi_initialize(struct psp_context *psp);  int psp_xgmi_terminate(struct psp_context *psp);  int psp_xgmi_invoke(struct psp_context *psp, uint32_t ta_cmd_id); +int psp_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id); +int psp_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id); +int psp_xgmi_get_topology_info(struct psp_context *psp, +			       int number_devices, +			       struct psp_xgmi_topology_info *topology); +int psp_xgmi_set_topology_info(struct psp_context *psp, +			       int number_devices, +			       struct psp_xgmi_topology_info *topology);  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); +  int psp_hdcp_invoke(struct psp_context *psp, uint32_t ta_cmd_id);  int psp_dtm_invoke(struct psp_context *psp, uint32_t ta_cmd_id); @@ -393,4 +367,8 @@ int psp_ring_cmd_submit(struct psp_context *psp,  			uint64_t cmd_buf_mc_addr,  			uint64_t fence_mc_addr,  			int index); +int psp_init_asd_microcode(struct psp_context *psp, +			   const char *chip_name); +int psp_init_sos_microcode(struct psp_context *psp, +			   const char *chip_name);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index ab379b44679c..50fe08bf2f72 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c @@ -80,6 +80,20 @@ atomic_t amdgpu_ras_in_intr = ATOMIC_INIT(0);  static bool amdgpu_ras_check_bad_page(struct amdgpu_device *adev,  				uint64_t addr); +void amdgpu_ras_set_error_query_ready(struct amdgpu_device *adev, bool ready) +{ +	if (adev && amdgpu_ras_get_context(adev)) +		amdgpu_ras_get_context(adev)->error_query_ready = ready; +} + +bool amdgpu_ras_get_error_query_ready(struct amdgpu_device *adev) +{ +	if (adev && amdgpu_ras_get_context(adev)) +		return amdgpu_ras_get_context(adev)->error_query_ready; + +	return false; +} +  static ssize_t amdgpu_ras_debugfs_read(struct file *f, char __user *buf,  					size_t size, loff_t *pos)  { @@ -281,8 +295,9 @@ static ssize_t amdgpu_ras_debugfs_ctrl_write(struct file *f, const char __user *  	struct ras_debug_if data;  	int ret = 0; -	if (amdgpu_ras_intr_triggered()) { -		DRM_WARN("RAS WARN: error injection currently inaccessible\n"); +	if (!amdgpu_ras_get_error_query_ready(adev)) { +		dev_warn(adev->dev, "RAS WARN: error injection " +				"currently inaccessible\n");  		return size;  	} @@ -310,7 +325,8 @@ static ssize_t amdgpu_ras_debugfs_ctrl_write(struct file *f, const char __user *  		/* umc ce/ue error injection for a bad page is not allowed */  		if ((data.head.block == AMDGPU_RAS_BLOCK__UMC) &&  		    amdgpu_ras_check_bad_page(adev, data.inject.address)) { -			DRM_WARN("RAS WARN: 0x%llx has been marked as bad before error injection!\n", +			dev_warn(adev->dev, "RAS WARN: 0x%llx has been marked " +					"as bad before error injection!\n",  					data.inject.address);  			break;  		} @@ -399,7 +415,7 @@ static ssize_t amdgpu_ras_sysfs_read(struct device *dev,  		.head = obj->head,  	}; -	if (amdgpu_ras_intr_triggered()) +	if (!amdgpu_ras_get_error_query_ready(obj->adev))  		return snprintf(buf, PAGE_SIZE,  				"Query currently inaccessible\n"); @@ -486,6 +502,29 @@ struct ras_manager *amdgpu_ras_find_obj(struct amdgpu_device *adev,  }  /* obj end */ +void amdgpu_ras_parse_status_code(struct amdgpu_device* adev, +				  const char* 		invoke_type, +				  const char* 		block_name, +				  enum ta_ras_status 	ret) +{ +	switch (ret) { +	case TA_RAS_STATUS__SUCCESS: +		return; +	case TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE: +		dev_warn(adev->dev, +			"RAS WARN: %s %s currently unavailable\n", +			invoke_type, +			block_name); +		break; +	default: +		dev_err(adev->dev, +			"RAS ERROR: %s %s error failed ret 0x%X\n", +			invoke_type, +			block_name, +			ret); +	} +} +  /* feature ctl begin */  static int amdgpu_ras_is_feature_allowed(struct amdgpu_device *adev,  		struct ras_common_if *head) @@ -549,19 +588,23 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,  		struct ras_common_if *head, bool enable)  {  	struct amdgpu_ras *con = amdgpu_ras_get_context(adev); -	union ta_ras_cmd_input info; +	union ta_ras_cmd_input *info;  	int ret;  	if (!con)  		return -EINVAL; +        info = kzalloc(sizeof(union ta_ras_cmd_input), GFP_KERNEL); +	if (!info) +		return -ENOMEM; +  	if (!enable) { -		info.disable_features = (struct ta_ras_disable_features_input) { +		info->disable_features = (struct ta_ras_disable_features_input) {  			.block_id =  amdgpu_ras_block_to_ta(head->block),  			.error_type = amdgpu_ras_error_to_ta(head->type),  		};  	} else { -		info.enable_features = (struct ta_ras_enable_features_input) { +		info->enable_features = (struct ta_ras_enable_features_input) {  			.block_id =  amdgpu_ras_block_to_ta(head->block),  			.error_type = amdgpu_ras_error_to_ta(head->type),  		}; @@ -570,26 +613,33 @@ int amdgpu_ras_feature_enable(struct amdgpu_device *adev,  	/* Do not enable if it is not allowed. */  	WARN_ON(enable && !amdgpu_ras_is_feature_allowed(adev, head));  	/* Are we alerady in that state we are going to set? */ -	if (!(!!enable ^ !!amdgpu_ras_is_feature_enabled(adev, head))) -		return 0; +	if (!(!!enable ^ !!amdgpu_ras_is_feature_enabled(adev, head))) { +		ret = 0; +		goto out; +	}  	if (!amdgpu_ras_intr_triggered()) { -		ret = psp_ras_enable_features(&adev->psp, &info, enable); +		ret = psp_ras_enable_features(&adev->psp, info, enable);  		if (ret) { -			DRM_ERROR("RAS ERROR: %s %s feature failed ret %d\n", -					enable ? "enable":"disable", -					ras_block_str(head->block), -					ret); +			amdgpu_ras_parse_status_code(adev, +						     enable ? "enable":"disable", +						     ras_block_str(head->block), +						    (enum ta_ras_status)ret);  			if (ret == TA_RAS_STATUS__RESET_NEEDED) -				return -EAGAIN; -			return -EINVAL; +				ret = -EAGAIN; +			else +				ret = -EINVAL; + +			goto out;  		}  	}  	/* setup the obj */  	__amdgpu_ras_feature_enable(adev, head, enable); - -	return 0; +	ret = 0; +out: +	kfree(info); +	return ret;  }  /* Only used in device probe stage and called only once. */ @@ -618,7 +668,8 @@ int amdgpu_ras_feature_enable_on_boot(struct amdgpu_device *adev,  			if (ret == -EINVAL) {  				ret = __amdgpu_ras_feature_enable(adev, head, 1);  				if (!ret) -					DRM_INFO("RAS INFO: %s setup object\n", +					dev_info(adev->dev, +						"RAS INFO: %s setup object\n",  						ras_block_str(head->block));  			}  		} else { @@ -744,17 +795,48 @@ int amdgpu_ras_error_query(struct amdgpu_device *adev,  	info->ce_count = obj->err_data.ce_count;  	if (err_data.ce_count) { -		dev_info(adev->dev, "%ld correctable errors detected in %s block\n", -			 obj->err_data.ce_count, ras_block_str(info->head.block)); +		dev_info(adev->dev, "%ld correctable hardware errors " +					"detected in %s block, no user " +					"action is needed.\n", +					obj->err_data.ce_count, +					ras_block_str(info->head.block));  	}  	if (err_data.ue_count) { -		dev_info(adev->dev, "%ld uncorrectable errors detected in %s block\n", -			 obj->err_data.ue_count, ras_block_str(info->head.block)); +		dev_info(adev->dev, "%ld uncorrectable hardware errors " +					"detected in %s block\n", +					obj->err_data.ue_count, +					ras_block_str(info->head.block));  	}  	return 0;  } +/* Trigger XGMI/WAFL error */ +int amdgpu_ras_error_inject_xgmi(struct amdgpu_device *adev, +				 struct ta_ras_trigger_error_input *block_info) +{ +	int ret; + +	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW)) +		dev_warn(adev->dev, "Failed to disallow df cstate"); + +	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); + +	if (amdgpu_ras_intr_triggered()) +		return ret; + +	if (amdgpu_dpm_allow_xgmi_power_down(adev, true)) +		dev_warn(adev->dev, "Failed to allow XGMI power down"); + +	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW)) +		dev_warn(adev->dev, "Failed to allow df cstate"); + +	return ret; +} +  /* wrapper of psp_ras_trigger_error */  int amdgpu_ras_error_inject(struct amdgpu_device *adev,  		struct ras_inject_if *info) @@ -788,20 +870,22 @@ int amdgpu_ras_error_inject(struct amdgpu_device *adev,  		break;  	case AMDGPU_RAS_BLOCK__UMC:  	case AMDGPU_RAS_BLOCK__MMHUB: -	case AMDGPU_RAS_BLOCK__XGMI_WAFL:  	case AMDGPU_RAS_BLOCK__PCIE_BIF:  		ret = psp_ras_trigger_error(&adev->psp, &block_info);  		break; +	case AMDGPU_RAS_BLOCK__XGMI_WAFL: +		ret = amdgpu_ras_error_inject_xgmi(adev, &block_info); +		break;  	default: -		DRM_INFO("%s error injection is not supported yet\n", +		dev_info(adev->dev, "%s error injection is not supported yet\n",  			 ras_block_str(info->head.block));  		ret = -EINVAL;  	} -	if (ret) -		DRM_ERROR("RAS ERROR: inject %s error failed ret %d\n", -				ras_block_str(info->head.block), -				ret); +	amdgpu_ras_parse_status_code(adev, +				     "inject", +				     ras_block_str(info->head.block), +				     (enum ta_ras_status)ret);  	return ret;  } @@ -1430,9 +1514,10 @@ static void amdgpu_ras_do_recovery(struct work_struct *work)  	struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev, false);  	/* Build list of devices to query RAS related errors */ -	if  (hive && adev->gmc.xgmi.num_physical_nodes > 1) { +	if  (hive && adev->gmc.xgmi.num_physical_nodes > 1)  		device_list_handle = &hive->device_list; -	} else { +	else { +		INIT_LIST_HEAD(&device_list);  		list_add_tail(&adev->gmc.xgmi.head, &device_list);  		device_list_handle = &device_list;  	} @@ -1535,7 +1620,7 @@ static int amdgpu_ras_save_bad_pages(struct amdgpu_device *adev)  							&data->bps[control->num_recs],  							true,  							save_count)) { -			DRM_ERROR("Failed to save EEPROM table data!"); +			dev_err(adev->dev, "Failed to save EEPROM table data!");  			return -EIO;  		} @@ -1563,7 +1648,7 @@ static int amdgpu_ras_load_bad_pages(struct amdgpu_device *adev)  	if (amdgpu_ras_eeprom_process_recods(control, bps, false,  		control->num_recs)) { -		DRM_ERROR("Failed to load EEPROM table records!"); +		dev_err(adev->dev, "Failed to load EEPROM table records!");  		ret = -EIO;  		goto out;  	} @@ -1637,7 +1722,8 @@ int amdgpu_ras_reserve_bad_pages(struct amdgpu_device *adev)  					       AMDGPU_GPU_PAGE_SIZE,  					       AMDGPU_GEM_DOMAIN_VRAM,  					       &bo, NULL)) -			DRM_WARN("RAS WARN: reserve vram for retired page %llx fail\n", bp); +			dev_warn(adev->dev, "RAS WARN: reserve vram for " +					"retired page %llx fail\n", bp);  		data->bps_bo[i] = bo;  		data->last_reserved = i + 1; @@ -1725,7 +1811,7 @@ free:  	kfree(*data);  	con->eh_data = NULL;  out: -	DRM_WARN("Failed to initialize ras recovery!\n"); +	dev_warn(adev->dev, "Failed to initialize ras recovery!\n");  	return ret;  } @@ -1787,18 +1873,18 @@ static void amdgpu_ras_check_supported(struct amdgpu_device *adev,  		return;  	if (amdgpu_atomfirmware_mem_ecc_supported(adev)) { -		DRM_INFO("HBM ECC is active.\n"); +		dev_info(adev->dev, "HBM ECC is active.\n");  		*hw_supported |= (1 << AMDGPU_RAS_BLOCK__UMC |  				1 << AMDGPU_RAS_BLOCK__DF);  	} else -		DRM_INFO("HBM ECC is not presented.\n"); +		dev_info(adev->dev, "HBM ECC is not presented.\n");  	if (amdgpu_atomfirmware_sram_ecc_supported(adev)) { -		DRM_INFO("SRAM ECC is active.\n"); +		dev_info(adev->dev, "SRAM ECC is active.\n");  		*hw_supported |= ~(1 << AMDGPU_RAS_BLOCK__UMC |  				1 << AMDGPU_RAS_BLOCK__DF);  	} else -		DRM_INFO("SRAM ECC is not presented.\n"); +		dev_info(adev->dev, "SRAM ECC is not presented.\n");  	/* hw_supported needs to be aligned with RAS block mask. */  	*hw_supported &= AMDGPU_RAS_BLOCK_MASK; @@ -1855,7 +1941,7 @@ int amdgpu_ras_init(struct amdgpu_device *adev)  	if (amdgpu_ras_fs_init(adev))  		goto fs_out; -	DRM_INFO("RAS INFO: ras initialized successfully, " +	dev_info(adev->dev, "RAS INFO: ras initialized successfully, "  			"hardware ability[%x] ras_mask[%x]\n",  			con->hw_supported, con->supported);  	return 0; @@ -2037,7 +2123,8 @@ void amdgpu_ras_global_ras_isr(struct amdgpu_device *adev)  		return;  	if (atomic_cmpxchg(&amdgpu_ras_in_intr, 0, 1) == 0) { -		DRM_WARN("RAS event of type ERREVENT_ATHUB_INTERRUPT detected!\n"); +		dev_info(adev->dev, "uncorrectable hardware error" +			"(ERREVENT_ATHUB_INTERRUPT) detected!\n");  		amdgpu_ras_reset_gpu(adev);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h index 55c3eceb390d..e7df5d8429f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h @@ -334,6 +334,8 @@ struct amdgpu_ras {  	uint32_t flags;  	bool reboot;  	struct amdgpu_ras_eeprom_control eeprom_control; + +	bool error_query_ready;  };  struct ras_fs_data { @@ -629,4 +631,6 @@ static inline void amdgpu_ras_intr_cleared(void)  void amdgpu_ras_global_ras_isr(struct amdgpu_device *adev); +void amdgpu_ras_set_error_query_ready(struct amdgpu_device *adev, bool ready); +  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c index a7e1d0425ed0..13ea8ebc421c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c @@ -162,11 +162,13 @@ void amdgpu_ring_undo(struct amdgpu_ring *ring)   * Returns 0 on success, error on failure.   */  int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, -		     unsigned max_dw, struct amdgpu_irq_src *irq_src, -		     unsigned irq_type) +		     unsigned int max_dw, struct amdgpu_irq_src *irq_src, +		     unsigned int irq_type, unsigned int hw_prio)  {  	int r, i;  	int sched_hw_submission = amdgpu_sched_hw_submission; +	u32 *num_sched; +	u32 hw_ip;  	/* Set the hw submission limit higher for KIQ because  	 * it's used for a number of gfx/compute tasks by both @@ -258,6 +260,13 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,  	ring->priority = DRM_SCHED_PRIORITY_NORMAL;  	mutex_init(&ring->priority_mutex); +	if (!ring->no_scheduler) { +		hw_ip = ring->funcs->type; +		num_sched = &adev->gpu_sched[hw_ip][hw_prio].num_scheds; +		adev->gpu_sched[hw_ip][hw_prio].sched[(*num_sched)++] = +			&ring->sched; +	} +  	for (i = 0; i < DRM_SCHED_PRIORITY_MAX; ++i)  		atomic_set(&ring->num_jobs[i], 0); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h index 9a443013d70d..be218754629a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h @@ -30,11 +30,15 @@  /* max number of rings */  #define AMDGPU_MAX_RINGS		28 +#define AMDGPU_MAX_HWIP_RINGS		8  #define AMDGPU_MAX_GFX_RINGS		2  #define AMDGPU_MAX_COMPUTE_RINGS	8  #define AMDGPU_MAX_VCE_RINGS		3  #define AMDGPU_MAX_UVD_ENC_RINGS	2 +#define AMDGPU_RING_PRIO_DEFAULT	1 +#define AMDGPU_RING_PRIO_MAX		AMDGPU_GFX_PIPE_PRIO_MAX +  /* some special values for the owner field */  #define AMDGPU_FENCE_OWNER_UNDEFINED	((void *)0ul)  #define AMDGPU_FENCE_OWNER_VM		((void *)1ul) @@ -46,17 +50,30 @@  #define to_amdgpu_ring(s) container_of((s), struct amdgpu_ring, sched) +#define AMDGPU_IB_POOL_SIZE	(1024 * 1024) +  enum amdgpu_ring_type { -	AMDGPU_RING_TYPE_GFX, -	AMDGPU_RING_TYPE_COMPUTE, -	AMDGPU_RING_TYPE_SDMA, -	AMDGPU_RING_TYPE_UVD, -	AMDGPU_RING_TYPE_VCE, -	AMDGPU_RING_TYPE_KIQ, -	AMDGPU_RING_TYPE_UVD_ENC, -	AMDGPU_RING_TYPE_VCN_DEC, -	AMDGPU_RING_TYPE_VCN_ENC, -	AMDGPU_RING_TYPE_VCN_JPEG +	AMDGPU_RING_TYPE_GFX		= AMDGPU_HW_IP_GFX, +	AMDGPU_RING_TYPE_COMPUTE	= AMDGPU_HW_IP_COMPUTE, +	AMDGPU_RING_TYPE_SDMA		= AMDGPU_HW_IP_DMA, +	AMDGPU_RING_TYPE_UVD		= AMDGPU_HW_IP_UVD, +	AMDGPU_RING_TYPE_VCE		= AMDGPU_HW_IP_VCE, +	AMDGPU_RING_TYPE_UVD_ENC	= AMDGPU_HW_IP_UVD_ENC, +	AMDGPU_RING_TYPE_VCN_DEC	= AMDGPU_HW_IP_VCN_DEC, +	AMDGPU_RING_TYPE_VCN_ENC	= AMDGPU_HW_IP_VCN_ENC, +	AMDGPU_RING_TYPE_VCN_JPEG	= AMDGPU_HW_IP_VCN_JPEG, +	AMDGPU_RING_TYPE_KIQ +}; + +enum amdgpu_ib_pool_type { +	/* Normal submissions to the top of the pipeline. */ +	AMDGPU_IB_POOL_DELAYED, +	/* Immediate submissions to the bottom of the pipeline. */ +	AMDGPU_IB_POOL_IMMEDIATE, +	/* Direct submission to the ring buffer during init and reset. */ +	AMDGPU_IB_POOL_DIRECT, + +	AMDGPU_IB_POOL_MAX  };  struct amdgpu_device; @@ -65,6 +82,11 @@ struct amdgpu_ib;  struct amdgpu_cs_parser;  struct amdgpu_job; +struct amdgpu_sched { +	u32				num_scheds; +	struct drm_gpu_scheduler	*sched[AMDGPU_MAX_HWIP_RINGS]; +}; +  /*   * Fences.   */ @@ -96,7 +118,8 @@ void amdgpu_fence_driver_suspend(struct amdgpu_device *adev);  void amdgpu_fence_driver_resume(struct amdgpu_device *adev);  int amdgpu_fence_emit(struct amdgpu_ring *ring, struct dma_fence **fence,  		      unsigned flags); -int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s); +int amdgpu_fence_emit_polling(struct amdgpu_ring *ring, uint32_t *s, +			      uint32_t timeout);  bool amdgpu_fence_process(struct amdgpu_ring *ring);  int amdgpu_fence_wait_empty(struct amdgpu_ring *ring);  signed long amdgpu_fence_wait_polling(struct amdgpu_ring *ring, @@ -159,17 +182,20 @@ 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_rreg)(struct amdgpu_ring *ring, uint32_t reg); +	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);  	void (*emit_reg_wait)(struct amdgpu_ring *ring, uint32_t reg,  			      uint32_t val, uint32_t mask);  	void (*emit_reg_write_reg_wait)(struct amdgpu_ring *ring,  					uint32_t reg0, uint32_t reg1,  					uint32_t ref, uint32_t mask); -	void (*emit_tmz)(struct amdgpu_ring *ring, bool start); +	void (*emit_frame_cntl)(struct amdgpu_ring *ring, bool start, +				bool secure);  	/* Try to soft recover the ring to make the fence signal */  	void (*soft_recovery)(struct amdgpu_ring *ring, unsigned vmid);  	int (*preempt_ib)(struct amdgpu_ring *ring); +	void (*emit_mem_sync)(struct amdgpu_ring *ring);  };  struct amdgpu_ring { @@ -214,12 +240,12 @@ struct amdgpu_ring {  	unsigned		vm_inv_eng;  	struct dma_fence	*vmid_wait;  	bool			has_compute_vm_bug; +	bool			no_scheduler;  	atomic_t		num_jobs[DRM_SCHED_PRIORITY_MAX];  	struct mutex		priority_mutex;  	/* protected by priority_mutex */  	int			priority; -	bool			has_high_prio;  #if defined(CONFIG_DEBUG_FS)  	struct dentry *ent; @@ -241,11 +267,11 @@ 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_rreg(r, d) (r)->funcs->emit_rreg((r), (d)) +#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))  #define amdgpu_ring_emit_reg_write_reg_wait(r, d0, d1, v, m) (r)->funcs->emit_reg_write_reg_wait((r), (d0), (d1), (v), (m)) -#define amdgpu_ring_emit_tmz(r, b) (r)->funcs->emit_tmz((r), (b)) +#define amdgpu_ring_emit_frame_cntl(r, b, s) (r)->funcs->emit_frame_cntl((r), (b), (s))  #define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib)))  #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)) @@ -257,8 +283,8 @@ void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib);  void amdgpu_ring_commit(struct amdgpu_ring *ring);  void amdgpu_ring_undo(struct amdgpu_ring *ring);  int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, -		     unsigned ring_size, struct amdgpu_irq_src *irq_src, -		     unsigned irq_type); +		     unsigned int ring_size, struct amdgpu_irq_src *irq_src, +		     unsigned int irq_type, unsigned int prio);  void amdgpu_ring_fini(struct amdgpu_ring *ring);  void amdgpu_ring_emit_reg_write_reg_wait_helper(struct amdgpu_ring *ring,  						uint32_t reg0, uint32_t val0, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h index 4b352206354b..e5b8fb8e75c5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h @@ -61,8 +61,6 @@ struct amdgpu_sdma_ras_funcs {  struct amdgpu_sdma {  	struct amdgpu_sdma_instance instance[AMDGPU_MAX_SDMA_INSTANCES]; -	struct drm_gpu_scheduler    *sdma_sched[AMDGPU_MAX_SDMA_INSTANCES]; -	uint32_t		    num_sdma_sched;  	struct amdgpu_irq_src	trap_irq;  	struct amdgpu_irq_src	illegal_inst_irq;  	struct amdgpu_irq_src	ecc_irq; @@ -91,7 +89,8 @@ struct amdgpu_buffer_funcs {  				 /* dst addr in bytes */  				 uint64_t dst_offset,  				 /* number of byte to transfer */ -				 uint32_t byte_count); +				 uint32_t byte_count, +				 bool tmz);  	/* maximum bytes in a single operation */  	uint32_t	fill_max_bytes; @@ -109,7 +108,7 @@ struct amdgpu_buffer_funcs {  				 uint32_t byte_count);  }; -#define amdgpu_emit_copy_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_copy_buffer((ib),  (s), (d), (b)) +#define amdgpu_emit_copy_buffer(adev, ib, s, d, b, t) (adev)->mman.buffer_funcs->emit_copy_buffer((ib),  (s), (d), (b), (t))  #define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b))  struct amdgpu_sdma_instance * diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c index b86392253696..b87ca171986a 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c @@ -249,6 +249,11 @@ int amdgpu_sync_resv(struct amdgpu_device *adev, struct amdgpu_sync *sync,  		    owner != AMDGPU_FENCE_OWNER_UNDEFINED)  			continue; +		/* Never sync to VM updates either. */ +		if (fence_owner == AMDGPU_FENCE_OWNER_VM && +		    owner != AMDGPU_FENCE_OWNER_UNDEFINED) +			continue; +  		/* Ignore fences depending on the sync mode */  		switch (mode) {  		case AMDGPU_SYNC_ALWAYS: diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c index b158230af8db..2f4d5ca9894f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_test.c @@ -44,7 +44,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)  	/* Number of tests =  	 * (Total GTT - IB pool - writeback page - ring buffers) / test size  	 */ -	n = adev->gmc.gart_size - AMDGPU_IB_POOL_SIZE*64*1024; +	n = adev->gmc.gart_size - AMDGPU_IB_POOL_SIZE;  	for (i = 0; i < AMDGPU_MAX_RINGS; ++i)  		if (adev->rings[i])  			n -= adev->rings[i]->ring_size; @@ -124,7 +124,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)  		amdgpu_bo_kunmap(gtt_obj[i]);  		r = amdgpu_copy_buffer(ring, gart_addr, vram_addr, -				       size, NULL, &fence, false, false); +				       size, NULL, &fence, false, false, false);  		if (r) {  			DRM_ERROR("Failed GTT->VRAM copy %d\n", i); @@ -170,7 +170,7 @@ static void amdgpu_do_test_moves(struct amdgpu_device *adev)  		amdgpu_bo_kunmap(vram_obj);  		r = amdgpu_copy_buffer(ring, vram_addr, gart_addr, -				       size, NULL, &fence, false, false); +				       size, NULL, &fence, false, false, false);  		if (r) {  			DRM_ERROR("Failed VRAM->GTT copy %d\n", i); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h index 63e734a125fb..5da20fc166d9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h @@ -35,7 +35,7 @@  #define AMDGPU_JOB_GET_TIMELINE_NAME(job) \  	 job->base.s_fence->finished.ops->get_timeline_name(&job->base.s_fence->finished) -TRACE_EVENT(amdgpu_mm_rreg, +TRACE_EVENT(amdgpu_device_rreg,  	    TP_PROTO(unsigned did, uint32_t reg, uint32_t value),  	    TP_ARGS(did, reg, value),  	    TP_STRUCT__entry( @@ -54,7 +54,7 @@ TRACE_EVENT(amdgpu_mm_rreg,  		      (unsigned long)__entry->value)  ); -TRACE_EVENT(amdgpu_mm_wreg, +TRACE_EVENT(amdgpu_device_wreg,  	    TP_PROTO(unsigned did, uint32_t reg, uint32_t value),  	    TP_ARGS(did, reg, value),  	    TP_STRUCT__entry( diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 6309ff72bd78..e59c01a83dac 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -62,11 +62,6 @@  #define AMDGPU_TTM_VRAM_MAX_DW_READ	(size_t)128 -static int amdgpu_map_buffer(struct ttm_buffer_object *bo, -			     struct ttm_mem_reg *mem, unsigned num_pages, -			     uint64_t offset, unsigned window, -			     struct amdgpu_ring *ring, -			     uint64_t *addr);  /**   * amdgpu_init_mem_type - Initialize a memory manager for a specific type of @@ -277,7 +272,7 @@ static uint64_t amdgpu_mm_node_addr(struct ttm_buffer_object *bo,   *   */  static struct drm_mm_node *amdgpu_find_mm_node(struct ttm_mem_reg *mem, -					       unsigned long *offset) +					       uint64_t *offset)  {  	struct drm_mm_node *mm_node = mem->mm_node; @@ -289,91 +284,191 @@ static struct drm_mm_node *amdgpu_find_mm_node(struct ttm_mem_reg *mem,  }  /** + * amdgpu_ttm_map_buffer - Map memory into the GART windows + * @bo: buffer object to map + * @mem: memory object to map + * @mm_node: drm_mm node object to map + * @num_pages: number of pages to map + * @offset: offset into @mm_node where to start + * @window: which GART window to use + * @ring: DMA ring to use for the copy + * @tmz: if we should setup a TMZ enabled mapping + * @addr: resulting address inside the MC address space + * + * Setup one of the GART windows to access a specific piece of memory or return + * the physical address for local memory. + */ +static int amdgpu_ttm_map_buffer(struct ttm_buffer_object *bo, +				 struct ttm_mem_reg *mem, +				 struct drm_mm_node *mm_node, +				 unsigned num_pages, uint64_t offset, +				 unsigned window, struct amdgpu_ring *ring, +				 bool tmz, uint64_t *addr) +{ +	struct amdgpu_device *adev = ring->adev; +	struct amdgpu_job *job; +	unsigned num_dw, num_bytes; +	struct dma_fence *fence; +	uint64_t src_addr, dst_addr; +	void *cpu_addr; +	uint64_t flags; +	unsigned int i; +	int r; + +	BUG_ON(adev->mman.buffer_funcs->copy_max_bytes < +	       AMDGPU_GTT_MAX_TRANSFER_SIZE * 8); + +	/* Map only what can't be accessed directly */ +	if (!tmz && mem->start != AMDGPU_BO_INVALID_OFFSET) { +		*addr = amdgpu_mm_node_addr(bo, mm_node, mem) + offset; +		return 0; +	} + +	*addr = adev->gmc.gart_start; +	*addr += (u64)window * AMDGPU_GTT_MAX_TRANSFER_SIZE * +		AMDGPU_GPU_PAGE_SIZE; +	*addr += offset & ~PAGE_MASK; + +	num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8); +	num_bytes = num_pages * 8; + +	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4 + num_bytes, +				     AMDGPU_IB_POOL_DELAYED, &job); +	if (r) +		return r; + +	src_addr = num_dw * 4; +	src_addr += job->ibs[0].gpu_addr; + +	dst_addr = amdgpu_bo_gpu_offset(adev->gart.bo); +	dst_addr += window * AMDGPU_GTT_MAX_TRANSFER_SIZE * 8; +	amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr, +				dst_addr, num_bytes, false); + +	amdgpu_ring_pad_ib(ring, &job->ibs[0]); +	WARN_ON(job->ibs[0].length_dw > num_dw); + +	flags = amdgpu_ttm_tt_pte_flags(adev, bo->ttm, mem); +	if (tmz) +		flags |= AMDGPU_PTE_TMZ; + +	cpu_addr = &job->ibs[0].ptr[num_dw]; + +	if (mem->mem_type == TTM_PL_TT) { +		struct ttm_dma_tt *dma; +		dma_addr_t *dma_address; + +		dma = container_of(bo->ttm, struct ttm_dma_tt, ttm); +		dma_address = &dma->dma_address[offset >> PAGE_SHIFT]; +		r = amdgpu_gart_map(adev, 0, num_pages, dma_address, flags, +				    cpu_addr); +		if (r) +			goto error_free; +	} else { +		dma_addr_t dma_address; + +		dma_address = (mm_node->start << PAGE_SHIFT) + offset; +		dma_address += adev->vm_manager.vram_base_offset; + +		for (i = 0; i < num_pages; ++i) { +			r = amdgpu_gart_map(adev, i << PAGE_SHIFT, 1, +					    &dma_address, flags, cpu_addr); +			if (r) +				goto error_free; + +			dma_address += PAGE_SIZE; +		} +	} + +	r = amdgpu_job_submit(job, &adev->mman.entity, +			      AMDGPU_FENCE_OWNER_UNDEFINED, &fence); +	if (r) +		goto error_free; + +	dma_fence_put(fence); + +	return r; + +error_free: +	amdgpu_job_free(job); +	return r; +} + +/**   * amdgpu_copy_ttm_mem_to_mem - Helper function for copy + * @adev: amdgpu device + * @src: buffer/address where to read from + * @dst: buffer/address where to write to + * @size: number of bytes to copy + * @tmz: if a secure copy should be used + * @resv: resv object to sync to + * @f: Returns the last fence if multiple jobs are submitted.   *   * The function copies @size bytes from {src->mem + src->offset} to   * {dst->mem + dst->offset}. src->bo and dst->bo could be same BO for a   * move and different for a BO to BO copy.   * - * @f: Returns the last fence if multiple jobs are submitted.   */  int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev, -			       struct amdgpu_copy_mem *src, -			       struct amdgpu_copy_mem *dst, -			       uint64_t size, +			       const struct amdgpu_copy_mem *src, +			       const struct amdgpu_copy_mem *dst, +			       uint64_t size, bool tmz,  			       struct dma_resv *resv,  			       struct dma_fence **f)  { +	const uint32_t GTT_MAX_BYTES = (AMDGPU_GTT_MAX_TRANSFER_SIZE * +					AMDGPU_GPU_PAGE_SIZE); + +	uint64_t src_node_size, dst_node_size, src_offset, dst_offset;  	struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring;  	struct drm_mm_node *src_mm, *dst_mm; -	uint64_t src_node_start, dst_node_start, src_node_size, -		 dst_node_size, src_page_offset, dst_page_offset;  	struct dma_fence *fence = NULL;  	int r = 0; -	const uint64_t GTT_MAX_BYTES = (AMDGPU_GTT_MAX_TRANSFER_SIZE * -					AMDGPU_GPU_PAGE_SIZE);  	if (!adev->mman.buffer_funcs_enabled) {  		DRM_ERROR("Trying to move memory with ring turned off.\n");  		return -EINVAL;  	} -	src_mm = amdgpu_find_mm_node(src->mem, &src->offset); -	src_node_start = amdgpu_mm_node_addr(src->bo, src_mm, src->mem) + -					     src->offset; -	src_node_size = (src_mm->size << PAGE_SHIFT) - src->offset; -	src_page_offset = src_node_start & (PAGE_SIZE - 1); +	src_offset = src->offset; +	src_mm = amdgpu_find_mm_node(src->mem, &src_offset); +	src_node_size = (src_mm->size << PAGE_SHIFT) - src_offset; -	dst_mm = amdgpu_find_mm_node(dst->mem, &dst->offset); -	dst_node_start = amdgpu_mm_node_addr(dst->bo, dst_mm, dst->mem) + -					     dst->offset; -	dst_node_size = (dst_mm->size << PAGE_SHIFT) - dst->offset; -	dst_page_offset = dst_node_start & (PAGE_SIZE - 1); +	dst_offset = dst->offset; +	dst_mm = amdgpu_find_mm_node(dst->mem, &dst_offset); +	dst_node_size = (dst_mm->size << PAGE_SHIFT) - dst_offset;  	mutex_lock(&adev->mman.gtt_window_lock);  	while (size) { -		unsigned long cur_size; -		uint64_t from = src_node_start, to = dst_node_start; +		uint32_t src_page_offset = src_offset & ~PAGE_MASK; +		uint32_t dst_page_offset = dst_offset & ~PAGE_MASK;  		struct dma_fence *next; +		uint32_t cur_size; +		uint64_t from, to;  		/* Copy size cannot exceed GTT_MAX_BYTES. So if src or dst  		 * begins at an offset, then adjust the size accordingly  		 */ -		cur_size = min3(min(src_node_size, dst_node_size), size, -				GTT_MAX_BYTES); -		if (cur_size + src_page_offset > GTT_MAX_BYTES || -		    cur_size + dst_page_offset > GTT_MAX_BYTES) -			cur_size -= max(src_page_offset, dst_page_offset); - -		/* Map only what needs to be accessed. Map src to window 0 and -		 * dst to window 1 -		 */ -		if (src->mem->start == AMDGPU_BO_INVALID_OFFSET) { -			r = amdgpu_map_buffer(src->bo, src->mem, -					PFN_UP(cur_size + src_page_offset), -					src_node_start, 0, ring, -					&from); -			if (r) -				goto error; -			/* Adjust the offset because amdgpu_map_buffer returns -			 * start of mapped page -			 */ -			from += src_page_offset; -		} +		cur_size = max(src_page_offset, dst_page_offset); +		cur_size = min(min3(src_node_size, dst_node_size, size), +			       (uint64_t)(GTT_MAX_BYTES - cur_size)); + +		/* Map src to window 0 and dst to window 1. */ +		r = amdgpu_ttm_map_buffer(src->bo, src->mem, src_mm, +					  PFN_UP(cur_size + src_page_offset), +					  src_offset, 0, ring, tmz, &from); +		if (r) +			goto error; -		if (dst->mem->start == AMDGPU_BO_INVALID_OFFSET) { -			r = amdgpu_map_buffer(dst->bo, dst->mem, -					PFN_UP(cur_size + dst_page_offset), -					dst_node_start, 1, ring, -					&to); -			if (r) -				goto error; -			to += dst_page_offset; -		} +		r = amdgpu_ttm_map_buffer(dst->bo, dst->mem, dst_mm, +					  PFN_UP(cur_size + dst_page_offset), +					  dst_offset, 1, ring, tmz, &to); +		if (r) +			goto error;  		r = amdgpu_copy_buffer(ring, from, to, cur_size, -				       resv, &next, false, true); +				       resv, &next, false, true, tmz);  		if (r)  			goto error; @@ -386,23 +481,20 @@ int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev,  		src_node_size -= cur_size;  		if (!src_node_size) { -			src_node_start = amdgpu_mm_node_addr(src->bo, ++src_mm, -							     src->mem); -			src_node_size = (src_mm->size << PAGE_SHIFT); -			src_page_offset = 0; +			++src_mm; +			src_node_size = src_mm->size << PAGE_SHIFT; +			src_offset = 0;  		} else { -			src_node_start += cur_size; -			src_page_offset = src_node_start & (PAGE_SIZE - 1); +			src_offset += cur_size;  		} +  		dst_node_size -= cur_size;  		if (!dst_node_size) { -			dst_node_start = amdgpu_mm_node_addr(dst->bo, ++dst_mm, -							     dst->mem); -			dst_node_size = (dst_mm->size << PAGE_SHIFT); -			dst_page_offset = 0; +			++dst_mm; +			dst_node_size = dst_mm->size << PAGE_SHIFT; +			dst_offset = 0;  		} else { -			dst_node_start += cur_size; -			dst_page_offset = dst_node_start & (PAGE_SIZE - 1); +			dst_offset += cur_size;  		}  	}  error: @@ -425,6 +517,7 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,  			    struct ttm_mem_reg *old_mem)  {  	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); +	struct amdgpu_bo *abo = ttm_to_amdgpu_bo(bo);  	struct amdgpu_copy_mem src, dst;  	struct dma_fence *fence = NULL;  	int r; @@ -438,14 +531,14 @@ static int amdgpu_move_blit(struct ttm_buffer_object *bo,  	r = amdgpu_ttm_copy_mem_to_mem(adev, &src, &dst,  				       new_mem->num_pages << PAGE_SHIFT, +				       amdgpu_bo_encrypted(abo),  				       bo->base.resv, &fence);  	if (r)  		goto error;  	/* clear the space being freed */  	if (old_mem->mem_type == TTM_PL_VRAM && -	    (ttm_to_amdgpu_bo(bo)->flags & -	     AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE)) { +	    (abo->flags & AMDGPU_GEM_CREATE_VRAM_WIPE_ON_RELEASE)) {  		struct dma_fence *wipe_fence = NULL;  		r = amdgpu_fill_buffer(ttm_to_amdgpu_bo(bo), AMDGPU_POISON, @@ -742,8 +835,8 @@ static void amdgpu_ttm_io_mem_free(struct ttm_bo_device *bdev, struct ttm_mem_re  static unsigned long amdgpu_ttm_io_mem_pfn(struct ttm_buffer_object *bo,  					   unsigned long page_offset)  { +	uint64_t offset = (page_offset << PAGE_SHIFT);  	struct drm_mm_node *mm; -	unsigned long offset = (page_offset << PAGE_SHIFT);  	mm = amdgpu_find_mm_node(&bo->mem, &offset);  	return (bo->mem.bus.base >> PAGE_SHIFT) + mm->start + @@ -766,18 +859,6 @@ struct amdgpu_ttm_tt {  };  #ifdef CONFIG_DRM_AMDGPU_USERPTR -/* flags used by HMM internal, not related to CPU/GPU PTE flags */ -static const uint64_t hmm_range_flags[HMM_PFN_FLAG_MAX] = { -	(1 << 0), /* HMM_PFN_VALID */ -	(1 << 1), /* HMM_PFN_WRITE */ -}; - -static const uint64_t hmm_range_values[HMM_PFN_VALUE_MAX] = { -	0xfffffffffffffffeUL, /* HMM_PFN_ERROR */ -	0, /* HMM_PFN_NONE */ -	0xfffffffffffffffcUL /* HMM_PFN_SPECIAL */ -}; -  /**   * amdgpu_ttm_tt_get_user_pages - get device accessible pages that back user   * memory and start HMM tracking CPU page table update @@ -816,23 +897,20 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages)  		goto out;  	}  	range->notifier = &bo->notifier; -	range->flags = hmm_range_flags; -	range->values = hmm_range_values; -	range->pfn_shift = PAGE_SHIFT;  	range->start = bo->notifier.interval_tree.start;  	range->end = bo->notifier.interval_tree.last + 1; -	range->default_flags = hmm_range_flags[HMM_PFN_VALID]; +	range->default_flags = HMM_PFN_REQ_FAULT;  	if (!amdgpu_ttm_tt_is_readonly(ttm)) -		range->default_flags |= range->flags[HMM_PFN_WRITE]; +		range->default_flags |= HMM_PFN_REQ_WRITE; -	range->pfns = kvmalloc_array(ttm->num_pages, sizeof(*range->pfns), -				     GFP_KERNEL); -	if (unlikely(!range->pfns)) { +	range->hmm_pfns = kvmalloc_array(ttm->num_pages, +					 sizeof(*range->hmm_pfns), GFP_KERNEL); +	if (unlikely(!range->hmm_pfns)) {  		r = -ENOMEM;  		goto out_free_ranges;  	} -	down_read(&mm->mmap_sem); +	mmap_read_lock(mm);  	vma = find_vma(mm, start);  	if (unlikely(!vma || start < vma->vm_start)) {  		r = -EFAULT; @@ -843,36 +921,32 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages)  		r = -EPERM;  		goto out_unlock;  	} -	up_read(&mm->mmap_sem); +	mmap_read_unlock(mm);  	timeout = jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT);  retry:  	range->notifier_seq = mmu_interval_read_begin(&bo->notifier); -	down_read(&mm->mmap_sem); +	mmap_read_lock(mm);  	r = hmm_range_fault(range); -	up_read(&mm->mmap_sem); -	if (unlikely(r <= 0)) { +	mmap_read_unlock(mm); +	if (unlikely(r)) {  		/*  		 * FIXME: This timeout should encompass the retry from  		 * mmu_interval_read_retry() as well.  		 */ -		if ((r == 0 || r == -EBUSY) && !time_after(jiffies, timeout)) +		if (r == -EBUSY && !time_after(jiffies, timeout))  			goto retry;  		goto out_free_pfns;  	} -	for (i = 0; i < ttm->num_pages; i++) { -		/* FIXME: The pages cannot be touched outside the notifier_lock */ -		pages[i] = hmm_device_entry_to_page(range, range->pfns[i]); -		if (unlikely(!pages[i])) { -			pr_err("Page fault failed for pfn[%lu] = 0x%llx\n", -			       i, range->pfns[i]); -			r = -ENOMEM; - -			goto out_free_pfns; -		} -	} +	/* +	 * Due to default_flags, all pages are HMM_PFN_VALID or +	 * hmm_range_fault() fails. FIXME: The pages cannot be touched outside +	 * the notifier_lock, and mmu_interval_read_retry() must be done first. +	 */ +	for (i = 0; i < ttm->num_pages; i++) +		pages[i] = hmm_pfn_to_page(range->hmm_pfns[i]);  	gtt->range = range;  	mmput(mm); @@ -880,9 +954,9 @@ retry:  	return 0;  out_unlock: -	up_read(&mm->mmap_sem); +	mmap_read_unlock(mm);  out_free_pfns: -	kvfree(range->pfns); +	kvfree(range->hmm_pfns);  out_free_ranges:  	kfree(range);  out: @@ -907,7 +981,7 @@ bool amdgpu_ttm_tt_get_user_pages_done(struct ttm_tt *ttm)  	DRM_DEBUG_DRIVER("user_pages_done 0x%llx pages 0x%lx\n",  		gtt->userptr, ttm->num_pages); -	WARN_ONCE(!gtt->range || !gtt->range->pfns, +	WARN_ONCE(!gtt->range || !gtt->range->hmm_pfns,  		"No user pages to check\n");  	if (gtt->range) { @@ -917,7 +991,7 @@ bool amdgpu_ttm_tt_get_user_pages_done(struct ttm_tt *ttm)  		 */  		r = mmu_interval_read_retry(gtt->range->notifier,  					 gtt->range->notifier_seq); -		kvfree(gtt->range->pfns); +		kvfree(gtt->range->hmm_pfns);  		kfree(gtt->range);  		gtt->range = NULL;  	} @@ -1008,8 +1082,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)  		for (i = 0; i < ttm->num_pages; i++) {  			if (ttm->pages[i] != -				hmm_device_entry_to_page(gtt->range, -					      gtt->range->pfns[i])) +			    hmm_pfn_to_page(gtt->range->hmm_pfns[i]))  				break;  		} @@ -1027,6 +1100,9 @@ int amdgpu_ttm_gart_bind(struct amdgpu_device *adev,  	struct amdgpu_ttm_tt *gtt = (void *)ttm;  	int r; +	if (amdgpu_bo_encrypted(abo)) +		flags |= AMDGPU_PTE_TMZ; +  	if (abo->flags & AMDGPU_GEM_CREATE_CP_MQD_GFX9) {  		uint64_t page_idx = 1; @@ -1539,6 +1615,9 @@ static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,  	switch (bo->mem.mem_type) {  	case TTM_PL_TT: +		if (amdgpu_bo_is_amdgpu_bo(bo) && +		    amdgpu_bo_encrypted(ttm_to_amdgpu_bo(bo))) +			return false;  		return true;  	case TTM_PL_VRAM: @@ -1587,8 +1666,9 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,  	if (bo->mem.mem_type != TTM_PL_VRAM)  		return -EIO; -	nodes = amdgpu_find_mm_node(&abo->tbo.mem, &offset); -	pos = (nodes->start << PAGE_SHIFT) + offset; +	pos = offset; +	nodes = amdgpu_find_mm_node(&abo->tbo.mem, &pos); +	pos += (nodes->start << PAGE_SHIFT);  	while (len && pos < adev->gmc.mc_vram_size) {  		uint64_t aligned_pos = pos & ~(uint64_t)3; @@ -1857,17 +1937,19 @@ int amdgpu_ttm_init(struct amdgpu_device *adev)  		return r;  	/* -	 * reserve one TMR (64K) memory at the top of VRAM which holds +	 * reserve TMR memory at the top of VRAM which holds  	 * IP Discovery data and is protected by PSP.  	 */ -	r = amdgpu_bo_create_kernel_at(adev, -				       adev->gmc.real_vram_size - DISCOVERY_TMR_SIZE, -				       DISCOVERY_TMR_SIZE, -				       AMDGPU_GEM_DOMAIN_VRAM, -				       &adev->discovery_memory, -				       NULL); -	if (r) -		return r; +	if (adev->discovery_tmr_size > 0) { +		r = amdgpu_bo_create_kernel_at(adev, +			adev->gmc.real_vram_size - adev->discovery_tmr_size, +			adev->discovery_tmr_size, +			AMDGPU_GEM_DOMAIN_VRAM, +			&adev->discovery_memory, +			NULL); +		if (r) +			return r; +	}  	DRM_INFO("amdgpu: %uM of VRAM memory ready\n",  		 (unsigned) (adev->gmc.real_vram_size / (1024 * 1024))); @@ -2015,75 +2097,14 @@ int amdgpu_mmap(struct file *filp, struct vm_area_struct *vma)  	return ttm_bo_mmap(filp, vma, &adev->mman.bdev);  } -static int amdgpu_map_buffer(struct ttm_buffer_object *bo, -			     struct ttm_mem_reg *mem, unsigned num_pages, -			     uint64_t offset, unsigned window, -			     struct amdgpu_ring *ring, -			     uint64_t *addr) -{ -	struct amdgpu_ttm_tt *gtt = (void *)bo->ttm; -	struct amdgpu_device *adev = ring->adev; -	struct ttm_tt *ttm = bo->ttm; -	struct amdgpu_job *job; -	unsigned num_dw, num_bytes; -	dma_addr_t *dma_address; -	struct dma_fence *fence; -	uint64_t src_addr, dst_addr; -	uint64_t flags; -	int r; - -	BUG_ON(adev->mman.buffer_funcs->copy_max_bytes < -	       AMDGPU_GTT_MAX_TRANSFER_SIZE * 8); - -	*addr = adev->gmc.gart_start; -	*addr += (u64)window * AMDGPU_GTT_MAX_TRANSFER_SIZE * -		AMDGPU_GPU_PAGE_SIZE; - -	num_dw = ALIGN(adev->mman.buffer_funcs->copy_num_dw, 8); -	num_bytes = num_pages * 8; - -	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4 + num_bytes, &job); -	if (r) -		return r; - -	src_addr = num_dw * 4; -	src_addr += job->ibs[0].gpu_addr; - -	dst_addr = amdgpu_bo_gpu_offset(adev->gart.bo); -	dst_addr += window * AMDGPU_GTT_MAX_TRANSFER_SIZE * 8; -	amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_addr, -				dst_addr, num_bytes); - -	amdgpu_ring_pad_ib(ring, &job->ibs[0]); -	WARN_ON(job->ibs[0].length_dw > num_dw); - -	dma_address = >t->ttm.dma_address[offset >> PAGE_SHIFT]; -	flags = amdgpu_ttm_tt_pte_flags(adev, ttm, mem); -	r = amdgpu_gart_map(adev, 0, num_pages, dma_address, flags, -			    &job->ibs[0].ptr[num_dw]); -	if (r) -		goto error_free; - -	r = amdgpu_job_submit(job, &adev->mman.entity, -			      AMDGPU_FENCE_OWNER_UNDEFINED, &fence); -	if (r) -		goto error_free; - -	dma_fence_put(fence); - -	return r; - -error_free: -	amdgpu_job_free(job); -	return r; -} -  int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,  		       uint64_t dst_offset, uint32_t byte_count,  		       struct dma_resv *resv,  		       struct dma_fence **fence, bool direct_submit, -		       bool vm_needs_flush) +		       bool vm_needs_flush, bool tmz)  { +	enum amdgpu_ib_pool_type pool = direct_submit ? AMDGPU_IB_POOL_DIRECT : +		AMDGPU_IB_POOL_DELAYED;  	struct amdgpu_device *adev = ring->adev;  	struct amdgpu_job *job; @@ -2101,7 +2122,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_job_alloc_with_ib(adev, num_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4, pool, &job);  	if (r)  		return r; @@ -2123,7 +2144,7 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,  		uint32_t cur_size_in_bytes = min(byte_count, max_bytes);  		amdgpu_emit_copy_buffer(adev, &job->ibs[0], src_offset, -					dst_offset, cur_size_in_bytes); +					dst_offset, cur_size_in_bytes, tmz);  		src_offset += cur_size_in_bytes;  		dst_offset += cur_size_in_bytes; @@ -2190,7 +2211,8 @@ int amdgpu_fill_buffer(struct amdgpu_bo *bo,  	/* for IB padding */  	num_dw += 64; -	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(adev, num_dw * 4, AMDGPU_IB_POOL_DELAYED, +				     &job);  	if (r)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index bd05bbb4878d..4351d02644a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -24,8 +24,9 @@  #ifndef __AMDGPU_TTM_H__  #define __AMDGPU_TTM_H__ -#include "amdgpu.h" +#include <linux/dma-direction.h>  #include <drm/gpu_scheduler.h> +#include "amdgpu.h"  #define AMDGPU_PL_GDS		(TTM_PL_PRIV + 0)  #define AMDGPU_PL_GWS		(TTM_PL_PRIV + 1) @@ -74,6 +75,15 @@ uint64_t amdgpu_gtt_mgr_usage(struct ttm_mem_type_manager *man);  int amdgpu_gtt_mgr_recover(struct ttm_mem_type_manager *man);  u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo); +int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, +			      struct ttm_mem_reg *mem, +			      struct device *dev, +			      enum dma_data_direction dir, +			      struct sg_table **sgt); +void amdgpu_vram_mgr_free_sgt(struct amdgpu_device *adev, +			      struct device *dev, +			      enum dma_data_direction dir, +			      struct sg_table *sgt);  uint64_t amdgpu_vram_mgr_usage(struct ttm_mem_type_manager *man);  uint64_t amdgpu_vram_mgr_vis_usage(struct ttm_mem_type_manager *man); @@ -87,11 +97,11 @@ int amdgpu_copy_buffer(struct amdgpu_ring *ring, uint64_t src_offset,  		       uint64_t dst_offset, uint32_t byte_count,  		       struct dma_resv *resv,  		       struct dma_fence **fence, bool direct_submit, -		       bool vm_needs_flush); +		       bool vm_needs_flush, bool tmz);  int amdgpu_ttm_copy_mem_to_mem(struct amdgpu_device *adev, -			       struct amdgpu_copy_mem *src, -			       struct amdgpu_copy_mem *dst, -			       uint64_t size, +			       const struct amdgpu_copy_mem *src, +			       const struct amdgpu_copy_mem *dst, +			       uint64_t size, bool tmz,  			       struct dma_resv *resv,  			       struct dma_fence **f);  int amdgpu_fill_buffer(struct amdgpu_bo *bo, diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index 9ef312428231..65bb25e31d45 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c @@ -403,8 +403,8 @@ FW_VERSION_ATTR(mec_fw_version, 0444, gfx.mec_fw_version);  FW_VERSION_ATTR(mec2_fw_version, 0444, gfx.mec2_fw_version);  FW_VERSION_ATTR(sos_fw_version, 0444, psp.sos_fw_version);  FW_VERSION_ATTR(asd_fw_version, 0444, psp.asd_fw_version); -FW_VERSION_ATTR(ta_ras_fw_version, 0444, psp.ta_fw_version); -FW_VERSION_ATTR(ta_xgmi_fw_version, 0444, psp.ta_fw_version); +FW_VERSION_ATTR(ta_ras_fw_version, 0444, psp.ta_ras_ucode_version); +FW_VERSION_ATTR(ta_xgmi_fw_version, 0444, psp.ta_xgmi_ucode_version);  FW_VERSION_ATTR(smc_fw_version, 0444, pm.fw_version);  FW_VERSION_ATTR(sdma_fw_version, 0444, sdma.instance[0].fw_version);  FW_VERSION_ATTR(sdma2_fw_version, 0444, sdma.instance[1].fw_version); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c index 9dd51f0d2c11..af1b1ccf613c 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c @@ -110,7 +110,8 @@ int amdgpu_umc_process_ras_data_cb(struct amdgpu_device *adev,  		 * even NOMEM error is encountered  		 */  		if(!err_data->err_addr) -			DRM_WARN("Failed to alloc memory for umc error address record!\n"); +			dev_warn(adev->dev, "Failed to alloc memory for " +					"umc error address record!\n");  		/* umc query_ras_error_address is also responsible for clearing  		 * error status @@ -120,10 +121,14 @@ int amdgpu_umc_process_ras_data_cb(struct amdgpu_device *adev,  	/* only uncorrectable error needs gpu reset */  	if (err_data->ue_count) { +		dev_info(adev->dev, "%ld uncorrectable hardware errors " +				"detected in UMC block\n", +				err_data->ue_count); +  		if (err_data->err_addr_cnt &&  		    amdgpu_ras_add_bad_pages(adev, err_data->err_addr,  						err_data->err_addr_cnt)) -			DRM_WARN("Failed to add ras bad page!\n"); +			dev_warn(adev->dev, "Failed to add ras bad page!\n");  		amdgpu_ras_reset_gpu(adev);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c index 5fd32ad1c575..5100ebe8858d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c @@ -1056,7 +1056,8 @@ static int amdgpu_uvd_send_msg(struct amdgpu_ring *ring, struct amdgpu_bo *bo,  			goto err;  	} -	r = amdgpu_job_alloc_with_ib(adev, 64, &job); +	r = amdgpu_job_alloc_with_ib(adev, 64, direct ? AMDGPU_IB_POOL_DIRECT : +				     AMDGPU_IB_POOL_DELAYED, &job);  	if (r)  		goto err; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c index 59ddba137946..ecaa2d7483b2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c @@ -446,7 +446,8 @@ static int amdgpu_vce_get_create_msg(struct amdgpu_ring *ring, uint32_t handle,  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +				     AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; @@ -524,7 +525,9 @@ static int amdgpu_vce_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,  	struct dma_fence *f = NULL;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +				     direct ? AMDGPU_IB_POOL_DIRECT : +				     AMDGPU_IB_POOL_DELAYED, &job);  	if (r)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c index a41272fbcba2..2badbc0355f2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.c @@ -56,19 +56,23 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work);  int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  { -	unsigned long bo_size; +	unsigned long bo_size, fw_shared_bo_size;  	const char *fw_name;  	const struct common_firmware_header *hdr;  	unsigned char fw_check;  	int i, r;  	INIT_DELAYED_WORK(&adev->vcn.idle_work, amdgpu_vcn_idle_work_handler); +	mutex_init(&adev->vcn.vcn_pg_lock); +	atomic_set(&adev->vcn.total_submission_cnt, 0); +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) +		atomic_set(&adev->vcn.inst[i].dpg_enc_submission_cnt, 0);  	switch (adev->asic_type) {  	case CHIP_RAVEN: -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			fw_name = FIRMWARE_RAVEN2; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			fw_name = FIRMWARE_PICASSO;  		else  			fw_name = FIRMWARE_RAVEN; @@ -178,6 +182,17 @@ int amdgpu_vcn_sw_init(struct amdgpu_device *adev)  				return r;  			}  		} + +		r = amdgpu_bo_create_kernel(adev, AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)), +				PAGE_SIZE, AMDGPU_GEM_DOMAIN_VRAM, &adev->vcn.inst[i].fw_shared_bo, +				&adev->vcn.inst[i].fw_shared_gpu_addr, &adev->vcn.inst[i].fw_shared_cpu_addr); +		if (r) { +			dev_err(adev->dev, "VCN %d (%d) failed to allocate firmware shared bo\n", i, r); +			return r; +		} + +		fw_shared_bo_size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo); +		adev->vcn.inst[i].saved_shm_bo = kvmalloc(fw_shared_bo_size, GFP_KERNEL);  	}  	return 0; @@ -192,6 +207,12 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)  	for (j = 0; j < adev->vcn.num_vcn_inst; ++j) {  		if (adev->vcn.harvest_config & (1 << j))  			continue; + +		kvfree(adev->vcn.inst[j].saved_shm_bo); +		amdgpu_bo_free_kernel(&adev->vcn.inst[j].fw_shared_bo, +					  &adev->vcn.inst[j].fw_shared_gpu_addr, +					  (void **)&adev->vcn.inst[j].fw_shared_cpu_addr); +  		if (adev->vcn.indirect_sram) {  			amdgpu_bo_free_kernel(&adev->vcn.inst[j].dpg_sram_bo,  						  &adev->vcn.inst[j].dpg_sram_gpu_addr, @@ -210,6 +231,7 @@ int amdgpu_vcn_sw_fini(struct amdgpu_device *adev)  	}  	release_firmware(adev->vcn.fw); +	mutex_destroy(&adev->vcn.vcn_pg_lock);  	return 0;  } @@ -236,6 +258,17 @@ int amdgpu_vcn_suspend(struct amdgpu_device *adev)  			return -ENOMEM;  		memcpy_fromio(adev->vcn.inst[i].saved_bo, ptr, size); + +		if (adev->vcn.inst[i].fw_shared_bo == NULL) +			return 0; + +		if (!adev->vcn.inst[i].saved_shm_bo) +			return -ENOMEM; + +		size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo); +		ptr = adev->vcn.inst[i].fw_shared_cpu_addr; + +		memcpy_fromio(adev->vcn.inst[i].saved_shm_bo, ptr, size);  	}  	return 0;  } @@ -273,6 +306,17 @@ int amdgpu_vcn_resume(struct amdgpu_device *adev)  			}  			memset_io(ptr, 0, size);  		} + +		if (adev->vcn.inst[i].fw_shared_bo == NULL) +			return -EINVAL; + +		size = amdgpu_bo_size(adev->vcn.inst[i].fw_shared_bo); +		ptr = adev->vcn.inst[i].fw_shared_cpu_addr; + +		if (adev->vcn.inst[i].saved_shm_bo != NULL) +			memcpy_toio(ptr, adev->vcn.inst[i].saved_shm_bo, size); +		else +			memset_io(ptr, 0, size);  	}  	return 0;  } @@ -295,7 +339,8 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)  		if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)	{  			struct dpg_pause_state new_state; -			if (fence[j]) +			if (fence[j] || +				unlikely(atomic_read(&adev->vcn.inst[j].dpg_enc_submission_cnt)))  				new_state.fw_based = VCN_DPG_STATE__PAUSE;  			else  				new_state.fw_based = VCN_DPG_STATE__UNPAUSE; @@ -307,8 +352,7 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)  		fences += fence[j];  	} -	if (fences == 0) { -		amdgpu_gfx_off_ctrl(adev, true); +	if (!fences && !atomic_read(&adev->vcn.total_submission_cnt)) {  		amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN,  		       AMD_PG_STATE_GATE);  	} else { @@ -319,36 +363,46 @@ static void amdgpu_vcn_idle_work_handler(struct work_struct *work)  void amdgpu_vcn_ring_begin_use(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; -	bool set_clocks = !cancel_delayed_work_sync(&adev->vcn.idle_work); -	if (set_clocks) { -		amdgpu_gfx_off_ctrl(adev, false); -		amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN, -		       AMD_PG_STATE_UNGATE); -	} +	atomic_inc(&adev->vcn.total_submission_cnt); +	cancel_delayed_work_sync(&adev->vcn.idle_work); + +	mutex_lock(&adev->vcn.vcn_pg_lock); +	amdgpu_device_ip_set_powergating_state(adev, AMD_IP_BLOCK_TYPE_VCN, +	       AMD_PG_STATE_UNGATE);  	if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG)	{  		struct dpg_pause_state new_state; -		unsigned int fences = 0; -		unsigned int i; -		for (i = 0; i < adev->vcn.num_enc_rings; ++i) { -			fences += amdgpu_fence_count_emitted(&adev->vcn.inst[ring->me].ring_enc[i]); -		} -		if (fences) +		if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) { +			atomic_inc(&adev->vcn.inst[ring->me].dpg_enc_submission_cnt);  			new_state.fw_based = VCN_DPG_STATE__PAUSE; -		else -			new_state.fw_based = VCN_DPG_STATE__UNPAUSE; +		} else { +			unsigned int fences = 0; +			unsigned int i; -		if (ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) -			new_state.fw_based = VCN_DPG_STATE__PAUSE; +			for (i = 0; i < adev->vcn.num_enc_rings; ++i) +				fences += amdgpu_fence_count_emitted(&adev->vcn.inst[ring->me].ring_enc[i]); + +			if (fences || atomic_read(&adev->vcn.inst[ring->me].dpg_enc_submission_cnt)) +				new_state.fw_based = VCN_DPG_STATE__PAUSE; +			else +				new_state.fw_based = VCN_DPG_STATE__UNPAUSE; +		}  		adev->vcn.pause_dpg_mode(adev, ring->me, &new_state);  	} +	mutex_unlock(&adev->vcn.vcn_pg_lock);  }  void amdgpu_vcn_ring_end_use(struct amdgpu_ring *ring)  { +	if (ring->adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG && +		ring->funcs->type == AMDGPU_RING_TYPE_VCN_ENC) +		atomic_dec(&ring->adev->vcn.inst[ring->me].dpg_enc_submission_cnt); + +	atomic_dec(&ring->adev->vcn.total_submission_cnt); +  	schedule_delayed_work(&ring->adev->vcn.idle_work, VCN_IDLE_TIMEOUT);  } @@ -390,7 +444,8 @@ static int amdgpu_vcn_dec_send_msg(struct amdgpu_ring *ring,  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(adev, 64, &job); +	r = amdgpu_job_alloc_with_ib(adev, 64, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		goto err; @@ -557,7 +612,8 @@ static int amdgpu_vcn_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t hand  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; @@ -610,7 +666,8 @@ static int amdgpu_vcn_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t han  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h index 6fe057329de2..90aa12b22725 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vcn.h @@ -132,6 +132,13 @@  		}										\  	} while (0) +#define AMDGPU_VCN_MULTI_QUEUE_FLAG	(1 << 8) + +enum fw_queue_mode { +	FW_QUEUE_RING_RESET = 1, +	FW_QUEUE_DPG_HOLD_OFF = 2, +}; +  enum engine_status_constants {  	UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON = 0x2AAAA0,  	UVD_PGFSM_STATUS__UVDM_UVDU_PWR_ON_2_0 = 0xAAAA0, @@ -179,10 +186,15 @@ struct amdgpu_vcn_inst {  	struct amdgpu_irq_src	irq;  	struct amdgpu_vcn_reg	external;  	struct amdgpu_bo	*dpg_sram_bo; +	struct amdgpu_bo	*fw_shared_bo;  	struct dpg_pause_state	pause_state;  	void			*dpg_sram_cpu_addr;  	uint64_t		dpg_sram_gpu_addr;  	uint32_t		*dpg_sram_curr_addr; +	atomic_t		dpg_enc_submission_cnt; +	void			*fw_shared_cpu_addr; +	uint64_t		fw_shared_gpu_addr; +	void			*saved_shm_bo;  };  struct amdgpu_vcn { @@ -196,16 +208,28 @@ struct amdgpu_vcn {  	uint8_t	num_vcn_inst;  	struct amdgpu_vcn_inst	 inst[AMDGPU_MAX_VCN_INSTANCES];  	struct amdgpu_vcn_reg	 internal; -	struct drm_gpu_scheduler *vcn_enc_sched[AMDGPU_MAX_VCN_ENC_RINGS]; -	struct drm_gpu_scheduler *vcn_dec_sched[AMDGPU_MAX_VCN_INSTANCES]; -	uint32_t		 num_vcn_enc_sched; -	uint32_t		 num_vcn_dec_sched; +	struct mutex		 vcn_pg_lock; +	atomic_t		 total_submission_cnt;  	unsigned	harvest_config;  	int (*pause_dpg_mode)(struct amdgpu_device *adev,  		int inst_idx, struct dpg_pause_state *new_state);  }; +struct amdgpu_fw_shared_multi_queue { +	uint8_t decode_queue_mode; +	uint8_t encode_generalpurpose_queue_mode; +	uint8_t encode_lowlatency_queue_mode; +	uint8_t encode_realtime_queue_mode; +	uint8_t padding[4]; +}; + +struct amdgpu_fw_shared { +	uint32_t present_flag_0; +	uint8_t pad[53]; +	struct amdgpu_fw_shared_multi_queue multi_queue; +} __attribute__((__packed__)); +  int amdgpu_vcn_sw_init(struct amdgpu_device *adev);  int amdgpu_vcn_sw_fini(struct amdgpu_device *adev);  int amdgpu_vcn_suspend(struct amdgpu_device *adev); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c index adc813cde8e2..f3b38c9e04ca 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c @@ -38,7 +38,8 @@ bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)  void amdgpu_virt_init_setting(struct amdgpu_device *adev)  {  	/* enable virtual display */ -	adev->mode_info.num_crtc = 1; +	if (adev->mode_info.num_crtc == 0) +		adev->mode_info.num_crtc = 1;  	adev->enable_virtual_display = true;  	adev->ddev->driver->driver_features &= ~DRIVER_ATOMIC;  	adev->cg_flags = 0; @@ -59,7 +60,10 @@ void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev,  	amdgpu_ring_alloc(ring, 32);  	amdgpu_ring_emit_reg_write_reg_wait(ring, reg0, reg1,  					    ref, mask); -	amdgpu_fence_emit_polling(ring, &seq); +	r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +	if (r) +		goto failed_undo; +  	amdgpu_ring_commit(ring);  	spin_unlock_irqrestore(&kiq->ring_lock, flags); @@ -81,6 +85,9 @@ void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev,  	return; +failed_undo: +	amdgpu_ring_undo(ring); +	spin_unlock_irqrestore(&kiq->ring_lock, flags);  failed_kiq:  	pr_err("failed to write reg %x wait reg %x\n", reg0, reg1);  } @@ -152,6 +159,19 @@ int amdgpu_virt_reset_gpu(struct amdgpu_device *adev)  	return 0;  } +void amdgpu_virt_request_init_data(struct amdgpu_device *adev) +{ +	struct amdgpu_virt *virt = &adev->virt; + +	if (virt->ops && virt->ops->req_init_data) +		virt->ops->req_init_data(adev); + +	if (adev->virt.req_init_data_ver > 0) +		DRM_INFO("host supports REQ_INIT_DATA handshake\n"); +	else +		DRM_WARN("host doesn't support REQ_INIT_DATA handshake\n"); +} +  /**   * amdgpu_virt_wait_reset() - wait for reset gpu completed   * @amdgpu:	amdgpu device. @@ -287,3 +307,82 @@ void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)  		}  	}  } + +void amdgpu_detect_virtualization(struct amdgpu_device *adev) +{ +	uint32_t reg; + +	switch (adev->asic_type) { +	case CHIP_TONGA: +	case CHIP_FIJI: +		reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER); +		break; +	case CHIP_VEGA10: +	case CHIP_VEGA20: +	case CHIP_NAVI10: +	case CHIP_NAVI12: +	case CHIP_ARCTURUS: +		reg = RREG32(mmRCC_IOV_FUNC_IDENTIFIER); +		break; +	default: /* other chip doesn't support SRIOV */ +		reg = 0; +		break; +	} + +	if (reg & 1) +		adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; + +	if (reg & 0x80000000) +		adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; + +	if (!reg) { +		if (is_virtual_machine())	/* passthrough mode exclus sriov mod */ +			adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; +	} +} + +bool amdgpu_virt_access_debugfs_is_mmio(struct amdgpu_device *adev) +{ +	return amdgpu_sriov_is_debug(adev) ? true : false; +} + +bool amdgpu_virt_access_debugfs_is_kiq(struct amdgpu_device *adev) +{ +	return amdgpu_sriov_is_normal(adev) ? true : false; +} + +int amdgpu_virt_enable_access_debugfs(struct amdgpu_device *adev) +{ +	if (!amdgpu_sriov_vf(adev) || +	    amdgpu_virt_access_debugfs_is_kiq(adev)) +		return 0; + +	if (amdgpu_virt_access_debugfs_is_mmio(adev)) +		adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME; +	else +		return -EPERM; + +	return 0; +} + +void amdgpu_virt_disable_access_debugfs(struct amdgpu_device *adev) +{ +	if (amdgpu_sriov_vf(adev)) +		adev->virt.caps |= AMDGPU_SRIOV_CAPS_RUNTIME; +} + +enum amdgpu_sriov_vf_mode amdgpu_virt_get_sriov_vf_mode(struct amdgpu_device *adev) +{ +	enum amdgpu_sriov_vf_mode mode; + +	if (amdgpu_sriov_vf(adev)) { +		if (amdgpu_sriov_is_pp_one_vf(adev)) +			mode = SRIOV_VF_MODE_ONE_VF; +		else +			mode = SRIOV_VF_MODE_MULTI_VF; +	} else { +		mode = SRIOV_VF_MODE_BARE_METAL; +	} + +	return mode; +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h index f0128f745bd2..b90e822cebd7 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h @@ -30,6 +30,17 @@  #define AMDGPU_PASSTHROUGH_MODE        (1 << 3) /* thw whole GPU is pass through for VM */  #define AMDGPU_SRIOV_CAPS_RUNTIME      (1 << 4) /* is out of full access mode */ +/* all asic after AI use this offset */ +#define mmRCC_IOV_FUNC_IDENTIFIER 0xDE5 +/* tonga/fiji use this offset */ +#define mmBIF_IOV_FUNC_IDENTIFIER 0x1503 + +enum amdgpu_sriov_vf_mode { +	SRIOV_VF_MODE_BARE_METAL = 0, +	SRIOV_VF_MODE_ONE_VF, +	SRIOV_VF_MODE_MULTI_VF, +}; +  struct amdgpu_mm_table {  	struct amdgpu_bo	*bo;  	uint32_t		*cpu_addr; @@ -54,6 +65,7 @@ struct amdgpu_vf_error_buffer {  struct amdgpu_virt_ops {  	int (*req_full_gpu)(struct amdgpu_device *adev, bool init);  	int (*rel_full_gpu)(struct amdgpu_device *adev, bool init); +	int (*req_init_data)(struct amdgpu_device *adev);  	int (*reset_gpu)(struct amdgpu_device *adev);  	int (*wait_reset)(struct amdgpu_device *adev);  	void (*trans_msg)(struct amdgpu_device *adev, u32 req, u32 data1, u32 data2, u32 data3); @@ -83,6 +95,8 @@ enum AMDGIM_FEATURE_FLAG {  	AMDGIM_FEATURE_GIM_LOAD_UCODES   = 0x2,  	/* VRAM LOST by GIM */  	AMDGIM_FEATURE_GIM_FLR_VRAMLOST = 0x4, +	/* MM bandwidth */ +	AMDGIM_FEATURE_GIM_MM_BW_MGR = 0x8,  	/* PP ONE VF MODE in GIM */  	AMDGIM_FEATURE_PP_ONE_VF = (1 << 4),  }; @@ -256,6 +270,8 @@ struct amdgpu_virt {  	struct amdgpu_virt_fw_reserve	fw_reserve;  	uint32_t gim_feature;  	uint32_t reg_access_mode; +	int req_init_data_ver; +	bool tdr_debug;  };  #define amdgpu_sriov_enabled(adev) \ @@ -287,6 +303,10 @@ static inline bool is_virtual_machine(void)  #define amdgpu_sriov_is_pp_one_vf(adev) \  	((adev)->virt.gim_feature & AMDGIM_FEATURE_PP_ONE_VF) +#define amdgpu_sriov_is_debug(adev) \ +	((!adev->in_gpu_reset) && adev->virt.tdr_debug) +#define amdgpu_sriov_is_normal(adev) \ +	((!adev->in_gpu_reset) && (!adev->virt.tdr_debug))  bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev);  void amdgpu_virt_init_setting(struct amdgpu_device *adev); @@ -296,6 +316,7 @@ void amdgpu_virt_kiq_reg_write_reg_wait(struct amdgpu_device *adev,  int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init);  int amdgpu_virt_release_full_gpu(struct amdgpu_device *adev, bool init);  int amdgpu_virt_reset_gpu(struct amdgpu_device *adev); +void amdgpu_virt_request_init_data(struct amdgpu_device *adev);  int amdgpu_virt_wait_reset(struct amdgpu_device *adev);  int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev);  void amdgpu_virt_free_mm_table(struct amdgpu_device *adev); @@ -303,4 +324,11 @@ int amdgpu_virt_fw_reserve_get_checksum(void *obj, unsigned long obj_size,  					unsigned int key,  					unsigned int chksum);  void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev); +void amdgpu_detect_virtualization(struct amdgpu_device *adev); + +bool amdgpu_virt_can_access_debugfs(struct amdgpu_device *adev); +int amdgpu_virt_enable_access_debugfs(struct amdgpu_device *adev); +void amdgpu_virt_disable_access_debugfs(struct amdgpu_device *adev); + +enum amdgpu_sriov_vf_mode amdgpu_virt_get_sriov_vf_mode(struct amdgpu_device *adev);  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 6d9252a27916..7417754e9141 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -82,7 +82,7 @@ struct amdgpu_prt_cb {  	struct dma_fence_cb cb;  }; -/** +/*   * vm eviction_lock can be taken in MMU notifiers. Make sure no reclaim-FS   * happens while holding this lock anywhere to prevent deadlocks when   * an MMU notifier runs in reclaim-FS context. @@ -726,7 +726,7 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm)   * @adev: amdgpu_device pointer   * @vm: VM to clear BO from   * @bo: BO to clear - * @direct: use a direct update + * @immediate: use an immediate update   *   * Root PD needs to be reserved when calling this.   * @@ -736,7 +736,7 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm)  static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  			      struct amdgpu_vm *vm,  			      struct amdgpu_bo *bo, -			      bool direct) +			      bool immediate)  {  	struct ttm_operation_ctx ctx = { true, false };  	unsigned level = adev->vm_manager.root_level; @@ -795,7 +795,7 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  	memset(¶ms, 0, sizeof(params));  	params.adev = adev;  	params.vm = vm; -	params.direct = direct; +	params.immediate = immediate;  	r = vm->update_funcs->prepare(¶ms, NULL, AMDGPU_SYNC_EXPLICIT);  	if (r) @@ -850,11 +850,11 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,   * @adev: amdgpu_device pointer   * @vm: requesting vm   * @level: the page table level - * @direct: use a direct update + * @immediate: use a immediate update   * @bp: resulting BO allocation parameters   */  static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm, -			       int level, bool direct, +			       int level, bool immediate,  			       struct amdgpu_bo_param *bp)  {  	memset(bp, 0, sizeof(*bp)); @@ -870,7 +870,7 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	else if (!vm->root.base.bo || vm->root.base.bo->shadow)  		bp->flags |= AMDGPU_GEM_CREATE_SHADOW;  	bp->type = ttm_bo_type_kernel; -	bp->no_wait_gpu = direct; +	bp->no_wait_gpu = immediate;  	if (vm->root.base.bo)  		bp->resv = vm->root.base.bo->tbo.base.resv;  } @@ -881,7 +881,7 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm,   * @adev: amdgpu_device pointer   * @vm: VM to allocate page tables for   * @cursor: Which page table to allocate - * @direct: use a direct update + * @immediate: use an immediate update   *   * Make sure a specific page table or directory is allocated.   * @@ -892,7 +892,7 @@ static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm,  static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  			       struct amdgpu_vm *vm,  			       struct amdgpu_vm_pt_cursor *cursor, -			       bool direct) +			       bool immediate)  {  	struct amdgpu_vm_pt *entry = cursor->entry;  	struct amdgpu_bo_param bp; @@ -913,7 +913,7 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  	if (entry->base.bo)  		return 0; -	amdgpu_vm_bo_param(adev, vm, cursor->level, direct, &bp); +	amdgpu_vm_bo_param(adev, vm, cursor->level, immediate, &bp);  	r = amdgpu_bo_create(adev, &bp, &pt);  	if (r) @@ -925,7 +925,7 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  	pt->parent = amdgpu_bo_ref(cursor->parent->base.bo);  	amdgpu_vm_bo_base_init(&entry->base, vm, pt); -	r = amdgpu_vm_clear_bo(adev, vm, pt, direct); +	r = amdgpu_vm_clear_bo(adev, vm, pt, immediate);  	if (r)  		goto error_free_pt; @@ -1276,7 +1276,7 @@ static void amdgpu_vm_invalidate_pds(struct amdgpu_device *adev,   *   * @adev: amdgpu_device pointer   * @vm: requested vm - * @direct: submit directly to the paging queue + * @immediate: submit immediately to the paging queue   *   * Makes sure all directories are up to date.   * @@ -1284,7 +1284,7 @@ static void amdgpu_vm_invalidate_pds(struct amdgpu_device *adev,   * 0 for success, error for failure.   */  int amdgpu_vm_update_pdes(struct amdgpu_device *adev, -			  struct amdgpu_vm *vm, bool direct) +			  struct amdgpu_vm *vm, bool immediate)  {  	struct amdgpu_vm_update_params params;  	int r; @@ -1295,7 +1295,7 @@ int amdgpu_vm_update_pdes(struct amdgpu_device *adev,  	memset(¶ms, 0, sizeof(params));  	params.adev = adev;  	params.vm = vm; -	params.direct = direct; +	params.immediate = immediate;  	r = vm->update_funcs->prepare(¶ms, NULL, AMDGPU_SYNC_EXPLICIT);  	if (r) @@ -1446,20 +1446,24 @@ static int amdgpu_vm_update_ptes(struct amdgpu_vm_update_params *params,  		uint64_t incr, entry_end, pe_start;  		struct amdgpu_bo *pt; -		if (flags & (AMDGPU_PTE_VALID | AMDGPU_PTE_PRT)) { +		if (!params->unlocked) {  			/* make sure that the page tables covering the  			 * address range are actually allocated  			 */  			r = amdgpu_vm_alloc_pts(params->adev, params->vm, -						&cursor, params->direct); +						&cursor, params->immediate);  			if (r)  				return r;  		}  		shift = amdgpu_vm_level_shift(adev, cursor.level);  		parent_shift = amdgpu_vm_level_shift(adev, cursor.level - 1); -		if (adev->asic_type < CHIP_VEGA10 && -		    (flags & AMDGPU_PTE_VALID)) { +		if (params->unlocked) { +			/* Unlocked updates are only allowed on the leaves */ +			if (amdgpu_vm_pt_descendant(adev, &cursor)) +				continue; +		} else if (adev->asic_type < CHIP_VEGA10 && +			   (flags & AMDGPU_PTE_VALID)) {  			/* No huge page support before GMC v9 */  			if (cursor.level != AMDGPU_VM_PTB) {  				if (!amdgpu_vm_pt_descendant(adev, &cursor)) @@ -1557,7 +1561,8 @@ static int amdgpu_vm_update_ptes(struct amdgpu_vm_update_params *params,   *   * @adev: amdgpu_device pointer   * @vm: requested vm - * @direct: direct submission in a page fault + * @immediate: immediate submission in a page fault + * @unlocked: unlocked invalidation during MM callback   * @resv: fences we need to sync to   * @start: start of mapped range   * @last: last mapped entry @@ -1572,8 +1577,8 @@ static int amdgpu_vm_update_ptes(struct amdgpu_vm_update_params *params,   * 0 for success, -EINVAL for failure.   */  static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev, -				       struct amdgpu_vm *vm, bool direct, -				       struct dma_resv *resv, +				       struct amdgpu_vm *vm, bool immediate, +				       bool unlocked, struct dma_resv *resv,  				       uint64_t start, uint64_t last,  				       uint64_t flags, uint64_t addr,  				       dma_addr_t *pages_addr, @@ -1586,8 +1591,9 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,  	memset(¶ms, 0, sizeof(params));  	params.adev = adev;  	params.vm = vm; -	params.direct = direct; +	params.immediate = immediate;  	params.pages_addr = pages_addr; +	params.unlocked = unlocked;  	/* Implicitly sync to command submissions in the same VM before  	 * unmapping. Sync to moving fences before mapping. @@ -1603,11 +1609,12 @@ static int amdgpu_vm_bo_update_mapping(struct amdgpu_device *adev,  		goto error_unlock;  	} -	if (flags & (AMDGPU_PTE_VALID | AMDGPU_PTE_PRT)) { -		struct amdgpu_bo *root = vm->root.base.bo; +	if (!unlocked && !dma_fence_is_signaled(vm->last_unlocked)) { +		struct dma_fence *tmp = dma_fence_get_stub(); -		if (!dma_fence_is_signaled(vm->last_direct)) -			amdgpu_bo_fence(root, vm->last_direct, true); +		amdgpu_bo_fence(vm->root.base.bo, vm->last_unlocked, true); +		swap(vm->last_unlocked, tmp); +		dma_fence_put(tmp);  	}  	r = vm->update_funcs->prepare(¶ms, resv, sync_mode); @@ -1721,7 +1728,7 @@ static int amdgpu_vm_bo_split_mapping(struct amdgpu_device *adev,  		}  		last = min((uint64_t)mapping->last, start + max_entries - 1); -		r = amdgpu_vm_bo_update_mapping(adev, vm, false, resv, +		r = amdgpu_vm_bo_update_mapping(adev, vm, false, false, resv,  						start, last, flags, addr,  						dma_addr, fence);  		if (r) @@ -1784,6 +1791,10 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev, struct amdgpu_bo_va *bo_va,  	if (bo) {  		flags = amdgpu_ttm_tt_pte_flags(adev, bo->tbo.ttm, mem); + +		if (amdgpu_bo_encrypted(bo)) +			flags |= AMDGPU_PTE_TMZ; +  		bo_adev = amdgpu_ttm_adev(bo->tbo.bdev);  	} else {  		flags = 0x0; @@ -2014,7 +2025,7 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,  		    mapping->start < AMDGPU_GMC_HOLE_START)  			init_pte_value = AMDGPU_PTE_DEFAULT_ATC; -		r = amdgpu_vm_bo_update_mapping(adev, vm, false, resv, +		r = amdgpu_vm_bo_update_mapping(adev, vm, false, false, resv,  						mapping->start, mapping->last,  						init_pte_value, 0, NULL, &f);  		amdgpu_vm_free_mapping(adev, vm, mapping, f); @@ -2124,11 +2135,8 @@ struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev,  	if (bo && amdgpu_xgmi_same_hive(adev, amdgpu_ttm_adev(bo->tbo.bdev)) &&  	    (bo->preferred_domains & AMDGPU_GEM_DOMAIN_VRAM)) {  		bo_va->is_xgmi = true; -		mutex_lock(&adev->vm_manager.lock_pstate);  		/* Power up XGMI if it can be potentially used */ -		if (++adev->vm_manager.xgmi_map_counter == 1) -			amdgpu_xgmi_set_pstate(adev, 1); -		mutex_unlock(&adev->vm_manager.lock_pstate); +		amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MAX_VEGA20);  	}  	return bo_va; @@ -2551,12 +2559,8 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,  	dma_fence_put(bo_va->last_pt_update); -	if (bo && bo_va->is_xgmi) { -		mutex_lock(&adev->vm_manager.lock_pstate); -		if (--adev->vm_manager.xgmi_map_counter == 0) -			amdgpu_xgmi_set_pstate(adev, 0); -		mutex_unlock(&adev->vm_manager.lock_pstate); -	} +	if (bo && bo_va->is_xgmi) +		amdgpu_xgmi_set_pstate(adev, AMDGPU_XGMI_PSTATE_MIN);  	kfree(bo_va);  } @@ -2585,7 +2589,7 @@ bool amdgpu_vm_evictable(struct amdgpu_bo *bo)  		return false;  	/* Don't evict VM page tables while they are updated */ -	if (!dma_fence_is_signaled(bo_base->vm->last_direct)) { +	if (!dma_fence_is_signaled(bo_base->vm->last_unlocked)) {  		amdgpu_vm_eviction_unlock(bo_base->vm);  		return false;  	} @@ -2762,7 +2766,7 @@ long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout)  	if (timeout <= 0)  		return timeout; -	return dma_fence_wait_timeout(vm->last_direct, true, timeout); +	return dma_fence_wait_timeout(vm->last_unlocked, true, timeout);  }  /** @@ -2798,7 +2802,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	/* create scheduler entities for page table updates */ -	r = drm_sched_entity_init(&vm->direct, DRM_SCHED_PRIORITY_NORMAL, +	r = drm_sched_entity_init(&vm->immediate, DRM_SCHED_PRIORITY_NORMAL,  				  adev->vm_manager.vm_pte_scheds,  				  adev->vm_manager.vm_pte_num_scheds, NULL);  	if (r) @@ -2808,7 +2812,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,  				  adev->vm_manager.vm_pte_scheds,  				  adev->vm_manager.vm_pte_num_scheds, NULL);  	if (r) -		goto error_free_direct; +		goto error_free_immediate;  	vm->pte_support_ats = false;  	vm->is_compute_context = false; @@ -2834,7 +2838,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	else  		vm->update_funcs = &amdgpu_vm_sdma_funcs;  	vm->last_update = NULL; -	vm->last_direct = dma_fence_get_stub(); +	vm->last_unlocked = dma_fence_get_stub();  	mutex_init(&vm->eviction_lock);  	vm->evicting = false; @@ -2888,11 +2892,11 @@ error_free_root:  	vm->root.base.bo = NULL;  error_free_delayed: -	dma_fence_put(vm->last_direct); +	dma_fence_put(vm->last_unlocked);  	drm_sched_entity_destroy(&vm->delayed); -error_free_direct: -	drm_sched_entity_destroy(&vm->direct); +error_free_immediate: +	drm_sched_entity_destroy(&vm->immediate);  	return r;  } @@ -2996,10 +3000,17 @@ int amdgpu_vm_make_compute(struct amdgpu_device *adev, struct amdgpu_vm *vm,  		   !amdgpu_gmc_vram_full_visible(&adev->gmc)),  		  "CPU update of VM recommended only for large BAR system\n"); -	if (vm->use_cpu_for_update) +	if (vm->use_cpu_for_update) { +		/* Sync with last SDMA update/clear before switching to CPU */ +		r = amdgpu_bo_sync_wait(vm->root.base.bo, +					AMDGPU_FENCE_OWNER_UNDEFINED, true); +		if (r) +			goto free_idr; +  		vm->update_funcs = &amdgpu_vm_cpu_funcs; -	else +	} else {  		vm->update_funcs = &amdgpu_vm_sdma_funcs; +	}  	dma_fence_put(vm->last_update);  	vm->last_update = NULL;  	vm->is_compute_context = true; @@ -3089,8 +3100,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  		vm->pasid = 0;  	} -	dma_fence_wait(vm->last_direct, false); -	dma_fence_put(vm->last_direct); +	dma_fence_wait(vm->last_unlocked, false); +	dma_fence_put(vm->last_unlocked);  	list_for_each_entry_safe(mapping, tmp, &vm->freed, list) {  		if (mapping->flags & AMDGPU_PTE_PRT && prt_fini_needed) { @@ -3107,7 +3118,7 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)  	amdgpu_bo_unref(&root);  	WARN_ON(vm->root.base.bo); -	drm_sched_entity_destroy(&vm->direct); +	drm_sched_entity_destroy(&vm->immediate);  	drm_sched_entity_destroy(&vm->delayed);  	if (!RB_EMPTY_ROOT(&vm->va.rb_root)) { @@ -3166,9 +3177,6 @@ void amdgpu_vm_manager_init(struct amdgpu_device *adev)  	idr_init(&adev->vm_manager.pasid_idr);  	spin_lock_init(&adev->vm_manager.pasid_lock); - -	adev->vm_manager.xgmi_map_counter = 0; -	mutex_init(&adev->vm_manager.lock_pstate);  }  /** @@ -3343,8 +3351,8 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, unsigned int pasid,  		value = 0;  	} -	r = amdgpu_vm_bo_update_mapping(adev, vm, true, NULL, addr, addr + 1, -					flags, value, NULL, NULL); +	r = amdgpu_vm_bo_update_mapping(adev, vm, true, false, NULL, addr, +					addr + 1, flags, value, NULL, NULL);  	if (r)  		goto error_unlock; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h index 06fe30e1492d..c8e68d7890bf 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h @@ -54,6 +54,9 @@ struct amdgpu_bo_list_entry;  #define AMDGPU_PTE_SYSTEM	(1ULL << 1)  #define AMDGPU_PTE_SNOOPED	(1ULL << 2) +/* RV+ */ +#define AMDGPU_PTE_TMZ		(1ULL << 3) +  /* VI only */  #define AMDGPU_PTE_EXECUTABLE	(1ULL << 4) @@ -203,9 +206,14 @@ struct amdgpu_vm_update_params {  	struct amdgpu_vm *vm;  	/** -	 * @direct: if changes should be made directly +	 * @immediate: if changes should be made immediately  	 */ -	bool direct; +	bool immediate; + +	/** +	 * @unlocked: true if the root BO is not locked +	 */ +	bool unlocked;  	/**  	 * @pages_addr: @@ -271,11 +279,11 @@ struct amdgpu_vm {  	struct dma_fence	*last_update;  	/* Scheduler entities for page table updates */ -	struct drm_sched_entity	direct; +	struct drm_sched_entity	immediate;  	struct drm_sched_entity	delayed; -	/* Last submission to the scheduler entities */ -	struct dma_fence	*last_direct; +	/* Last unlocked submission to the scheduler entities */ +	struct dma_fence	*last_unlocked;  	unsigned int		pasid;  	/* dedicated to vm */ @@ -349,10 +357,6 @@ struct amdgpu_vm_manager {  	 */  	struct idr				pasid_idr;  	spinlock_t				pasid_lock; - -	/* counter of mapped memory through xgmi */ -	uint32_t				xgmi_map_counter; -	struct mutex				lock_pstate;  };  #define amdgpu_vm_copy_pte(adev, ib, pe, src, count) ((adev)->vm_manager.vm_pte_funcs->copy_pte((ib), (pe), (src), (count))) @@ -380,7 +384,7 @@ int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm,  			      void *param);  int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job, bool need_pipe_sync);  int amdgpu_vm_update_pdes(struct amdgpu_device *adev, -			  struct amdgpu_vm *vm, bool direct); +			  struct amdgpu_vm *vm, bool immediate);  int amdgpu_vm_clear_freed(struct amdgpu_device *adev,  			  struct amdgpu_vm *vm,  			  struct dma_fence **fence); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c index e38516304070..39c704a1fb0e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c @@ -84,7 +84,7 @@ static int amdgpu_vm_cpu_update(struct amdgpu_vm_update_params *p,  	pe += (unsigned long)amdgpu_bo_kptr(bo); -	trace_amdgpu_vm_set_ptes(pe, addr, count, incr, flags, p->direct); +	trace_amdgpu_vm_set_ptes(pe, addr, count, incr, flags, p->immediate);  	for (i = 0; i < count; i++) {  		value = p->pages_addr ? diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c index cf96c335b258..8d9c6feba660 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c @@ -61,10 +61,12 @@ static int amdgpu_vm_sdma_prepare(struct amdgpu_vm_update_params *p,  				  struct dma_resv *resv,  				  enum amdgpu_sync_mode sync_mode)  { +	enum amdgpu_ib_pool_type pool = p->immediate ? AMDGPU_IB_POOL_IMMEDIATE +		: AMDGPU_IB_POOL_DELAYED;  	unsigned int ndw = AMDGPU_VM_SDMA_MIN_NUM_DW;  	int r; -	r = amdgpu_job_alloc_with_ib(p->adev, ndw * 4, &p->job); +	r = amdgpu_job_alloc_with_ib(p->adev, ndw * 4, pool, &p->job);  	if (r)  		return r; @@ -90,11 +92,11 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p,  {  	struct amdgpu_ib *ib = p->job->ibs;  	struct drm_sched_entity *entity; -	struct dma_fence *f, *tmp;  	struct amdgpu_ring *ring; +	struct dma_fence *f;  	int r; -	entity = p->direct ? &p->vm->direct : &p->vm->delayed; +	entity = p->immediate ? &p->vm->immediate : &p->vm->delayed;  	ring = container_of(entity->rq->sched, struct amdgpu_ring, sched);  	WARN_ON(ib->length_dw == 0); @@ -104,15 +106,16 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p,  	if (r)  		goto error; -	if (p->direct) { -		tmp = dma_fence_get(f); -		swap(p->vm->last_direct, tmp); +	if (p->unlocked) { +		struct dma_fence *tmp = dma_fence_get(f); + +		swap(p->vm->last_unlocked, f);  		dma_fence_put(tmp);  	} else { -		dma_resv_add_shared_fence(p->vm->root.base.bo->tbo.base.resv, f); +		amdgpu_bo_fence(p->vm->root.base.bo, f, true);  	} -	if (fence && !p->direct) +	if (fence && !p->immediate)  		swap(*fence, f);  	dma_fence_put(f);  	return 0; @@ -142,7 +145,7 @@ static void amdgpu_vm_sdma_copy_ptes(struct amdgpu_vm_update_params *p,  	src += p->num_dw_left * 4;  	pe += amdgpu_gmc_sign_extend(bo->tbo.offset); -	trace_amdgpu_vm_copy_ptes(pe, src, count, p->direct); +	trace_amdgpu_vm_copy_ptes(pe, src, count, p->immediate);  	amdgpu_vm_copy_pte(p->adev, ib, pe, src, count);  } @@ -169,7 +172,7 @@ static void amdgpu_vm_sdma_set_ptes(struct amdgpu_vm_update_params *p,  	struct amdgpu_ib *ib = p->job->ibs;  	pe += amdgpu_gmc_sign_extend(bo->tbo.offset); -	trace_amdgpu_vm_set_ptes(pe, addr, count, incr, flags, p->direct); +	trace_amdgpu_vm_set_ptes(pe, addr, count, incr, flags, p->immediate);  	if (count < 3) {  		amdgpu_vm_write_pte(p->adev, ib, pe, addr | flags,  				    count, incr); @@ -198,6 +201,8 @@ static int amdgpu_vm_sdma_update(struct amdgpu_vm_update_params *p,  				 uint64_t addr, unsigned count, uint32_t incr,  				 uint64_t flags)  { +	enum amdgpu_ib_pool_type pool = p->immediate ? AMDGPU_IB_POOL_IMMEDIATE +		: AMDGPU_IB_POOL_DELAYED;  	unsigned int i, ndw, nptes;  	uint64_t *pte;  	int r; @@ -223,7 +228,8 @@ static int amdgpu_vm_sdma_update(struct amdgpu_vm_update_params *p,  			ndw = max(ndw, AMDGPU_VM_SDMA_MIN_NUM_DW);  			ndw = min(ndw, AMDGPU_VM_SDMA_MAX_NUM_DW); -			r = amdgpu_job_alloc_with_ib(p->adev, ndw * 4, &p->job); +			r = amdgpu_job_alloc_with_ib(p->adev, ndw * 4, pool, +						     &p->job);  			if (r)  				return r; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 82a3299e53c0..d399e5893170 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -22,6 +22,7 @@   * Authors: Christian König   */ +#include <linux/dma-mapping.h>  #include "amdgpu.h"  #include "amdgpu_vm.h"  #include "amdgpu_atomfirmware.h" @@ -148,6 +149,15 @@ static DEVICE_ATTR(mem_info_vis_vram_used, S_IRUGO,  static DEVICE_ATTR(mem_info_vram_vendor, S_IRUGO,  		   amdgpu_mem_info_vram_vendor, NULL); +static const struct attribute *amdgpu_vram_mgr_attributes[] = { +	&dev_attr_mem_info_vram_total.attr, +	&dev_attr_mem_info_vis_vram_total.attr, +	&dev_attr_mem_info_vram_used.attr, +	&dev_attr_mem_info_vis_vram_used.attr, +	&dev_attr_mem_info_vram_vendor.attr, +	NULL +}; +  /**   * amdgpu_vram_mgr_init - init VRAM manager and DRM MM   * @@ -172,31 +182,9 @@ static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man,  	man->priv = mgr;  	/* Add the two VRAM-related sysfs files */ -	ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_total); -	if (ret) { -		DRM_ERROR("Failed to create device file mem_info_vram_total\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_total); -	if (ret) { -		DRM_ERROR("Failed to create device file mem_info_vis_vram_total\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_used); -	if (ret) { -		DRM_ERROR("Failed to create device file mem_info_vram_used\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_mem_info_vis_vram_used); -	if (ret) { -		DRM_ERROR("Failed to create device file mem_info_vis_vram_used\n"); -		return ret; -	} -	ret = device_create_file(adev->dev, &dev_attr_mem_info_vram_vendor); -	if (ret) { -		DRM_ERROR("Failed to create device file mem_info_vram_vendor\n"); -		return ret; -	} +	ret = sysfs_create_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes); +	if (ret) +		DRM_ERROR("Failed to register sysfs\n");  	return 0;  } @@ -219,11 +207,7 @@ static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man)  	spin_unlock(&mgr->lock);  	kfree(mgr);  	man->priv = NULL; -	device_remove_file(adev->dev, &dev_attr_mem_info_vram_total); -	device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_total); -	device_remove_file(adev->dev, &dev_attr_mem_info_vram_used); -	device_remove_file(adev->dev, &dev_attr_mem_info_vis_vram_used); -	device_remove_file(adev->dev, &dev_attr_mem_info_vram_vendor); +	sysfs_remove_files(&adev->dev->kobj, amdgpu_vram_mgr_attributes);  	return 0;  } @@ -459,6 +443,104 @@ static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man,  }  /** + * amdgpu_vram_mgr_alloc_sgt - allocate and fill a sg table + * + * @adev: amdgpu device pointer + * @mem: TTM memory object + * @dev: the other device + * @dir: dma direction + * @sgt: resulting sg table + * + * Allocate and fill a sg table from a VRAM allocation. + */ +int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev, +			      struct ttm_mem_reg *mem, +			      struct device *dev, +			      enum dma_data_direction dir, +			      struct sg_table **sgt) +{ +	struct drm_mm_node *node; +	struct scatterlist *sg; +	int num_entries = 0; +	unsigned int pages; +	int i, r; + +	*sgt = kmalloc(sizeof(*sg), GFP_KERNEL); +	if (!*sgt) +		return -ENOMEM; + +	for (pages = mem->num_pages, node = mem->mm_node; +	     pages; pages -= node->size, ++node) +		++num_entries; + +	r = sg_alloc_table(*sgt, num_entries, GFP_KERNEL); +	if (r) +		goto error_free; + +	for_each_sg((*sgt)->sgl, sg, num_entries, i) +		sg->length = 0; + +	node = mem->mm_node; +	for_each_sg((*sgt)->sgl, sg, num_entries, i) { +		phys_addr_t phys = (node->start << PAGE_SHIFT) + +			adev->gmc.aper_base; +		size_t size = node->size << PAGE_SHIFT; +		dma_addr_t addr; + +		++node; +		addr = dma_map_resource(dev, phys, size, dir, +					DMA_ATTR_SKIP_CPU_SYNC); +		r = dma_mapping_error(dev, addr); +		if (r) +			goto error_unmap; + +		sg_set_page(sg, NULL, size, 0); +		sg_dma_address(sg) = addr; +		sg_dma_len(sg) = size; +	} +	return 0; + +error_unmap: +	for_each_sg((*sgt)->sgl, sg, num_entries, i) { +		if (!sg->length) +			continue; + +		dma_unmap_resource(dev, sg->dma_address, +				   sg->length, dir, +				   DMA_ATTR_SKIP_CPU_SYNC); +	} +	sg_free_table(*sgt); + +error_free: +	kfree(*sgt); +	return r; +} + +/** + * amdgpu_vram_mgr_alloc_sgt - allocate and fill a sg table + * + * @adev: amdgpu device pointer + * @sgt: sg table to free + * + * Free a previously allocate sg table. + */ +void amdgpu_vram_mgr_free_sgt(struct amdgpu_device *adev, +			      struct device *dev, +			      enum dma_data_direction dir, +			      struct sg_table *sgt) +{ +	struct scatterlist *sg; +	int i; + +	for_each_sg(sgt->sgl, sg, sgt->nents, i) +		dma_unmap_resource(dev, sg->dma_address, +				   sg->length, dir, +				   DMA_ATTR_SKIP_CPU_SYNC); +	sg_free_table(sgt); +	kfree(sgt); +} + +/**   * amdgpu_vram_mgr_usage - how many bytes are used in this domain   *   * @man: TTM memory type manager diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c index 95b3327168ac..91837a991319 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.c @@ -325,9 +325,18 @@ success:  static void amdgpu_xgmi_sysfs_rem_dev_info(struct amdgpu_device *adev,  					  struct amdgpu_hive_info *hive)  { +	char node[10]; +	memset(node, 0, sizeof(node)); +  	device_remove_file(adev->dev, &dev_attr_xgmi_device_id); -	sysfs_remove_link(&adev->dev->kobj, adev->ddev->unique); -	sysfs_remove_link(hive->kobj, adev->ddev->unique); +	device_remove_file(adev->dev, &dev_attr_xgmi_error); + +	if (adev != hive->adev) +		sysfs_remove_link(&adev->dev->kobj,"xgmi_hive_info"); + +	sprintf(node, "node%d", hive->number_devices); +	sysfs_remove_link(hive->kobj, node); +  } @@ -373,7 +382,13 @@ struct amdgpu_hive_info *amdgpu_get_xgmi_hive(struct amdgpu_device *adev, int lo  	if (lock)  		mutex_lock(&tmp->hive_lock); -	tmp->pstate = -1; +	tmp->pstate = AMDGPU_XGMI_PSTATE_UNKNOWN; +	tmp->hi_req_gpu = NULL; +	/* +	 * hive pstate on boot is high in vega20 so we have to go to low +	 * pstate on after boot. +	 */ +	tmp->hi_req_count = AMDGPU_MAX_XGMI_DEVICE_PER_HIVE;  	mutex_unlock(&xgmi_mutex);  	return tmp; @@ -383,56 +398,59 @@ int amdgpu_xgmi_set_pstate(struct amdgpu_device *adev, int pstate)  {  	int ret = 0;  	struct amdgpu_hive_info *hive = amdgpu_get_xgmi_hive(adev, 0); -	struct amdgpu_device *tmp_adev; -	bool update_hive_pstate = true; -	bool is_high_pstate = pstate && adev->asic_type == CHIP_VEGA20; +	struct amdgpu_device *request_adev = hive->hi_req_gpu ? +						hive->hi_req_gpu : adev; +	bool is_hi_req = pstate == AMDGPU_XGMI_PSTATE_MAX_VEGA20; +	bool init_low = hive->pstate == AMDGPU_XGMI_PSTATE_UNKNOWN; -	if (!hive) +	/* fw bug so temporarily disable pstate switching */ +	return 0; + +	if (!hive || adev->asic_type != CHIP_VEGA20)  		return 0;  	mutex_lock(&hive->hive_lock); -	if (hive->pstate == pstate) { -		adev->pstate = is_high_pstate ? pstate : adev->pstate; +	if (is_hi_req) +		hive->hi_req_count++; +	else +		hive->hi_req_count--; + +	/* +	 * Vega20 only needs single peer to request pstate high for the hive to +	 * go high but all peers must request pstate low for the hive to go low +	 */ +	if (hive->pstate == pstate || +			(!is_hi_req && hive->hi_req_count && !init_low))  		goto out; -	} -	dev_dbg(adev->dev, "Set xgmi pstate %d.\n", pstate); +	dev_dbg(request_adev->dev, "Set xgmi pstate %d.\n", pstate); -	ret = amdgpu_dpm_set_xgmi_pstate(adev, pstate); +	ret = amdgpu_dpm_set_xgmi_pstate(request_adev, pstate);  	if (ret) { -		dev_err(adev->dev, +		dev_err(request_adev->dev,  			"XGMI: Set pstate failure on device %llx, hive %llx, ret %d", -			adev->gmc.xgmi.node_id, -			adev->gmc.xgmi.hive_id, ret); +			request_adev->gmc.xgmi.node_id, +			request_adev->gmc.xgmi.hive_id, ret);  		goto out;  	} -	/* Update device pstate */ -	adev->pstate = pstate; - -	/* -	 * Update the hive pstate only all devices of the hive -	 * are in the same pstate -	 */ -	list_for_each_entry(tmp_adev, &hive->device_list, gmc.xgmi.head) { -		if (tmp_adev->pstate != adev->pstate) { -			update_hive_pstate = false; -			break; -		} -	} -	if (update_hive_pstate || is_high_pstate) +	if (init_low) +		hive->pstate = hive->hi_req_count ? +					hive->pstate : AMDGPU_XGMI_PSTATE_MIN; +	else {  		hive->pstate = pstate; - +		hive->hi_req_gpu = pstate != AMDGPU_XGMI_PSTATE_MIN ? +							adev : NULL; +	}  out:  	mutex_unlock(&hive->hive_lock); -  	return ret;  }  int amdgpu_xgmi_update_topology(struct amdgpu_hive_info *hive, struct amdgpu_device *adev)  { -	int ret = -EINVAL; +	int ret;  	/* Each psp need to set the latest topology */  	ret = psp_xgmi_set_topology_info(&adev->psp, @@ -507,9 +525,6 @@ int amdgpu_xgmi_add_device(struct amdgpu_device *adev)  		goto exit;  	} -	/* Set default device pstate */ -	adev->pstate = -1; -  	top_info = &adev->psp.xgmi_context.top_info;  	list_add_tail(&adev->gmc.xgmi.head, &hive->device_list); @@ -577,14 +592,14 @@ int amdgpu_xgmi_remove_device(struct amdgpu_device *adev)  	if (!hive)  		return -EINVAL; -	if (!(hive->number_devices--)) { +	task_barrier_rem_task(&hive->tb); +	amdgpu_xgmi_sysfs_rem_dev_info(adev, hive); +	mutex_unlock(&hive->hive_lock); + +	if(!(--hive->number_devices)){  		amdgpu_xgmi_sysfs_destroy(adev, hive);  		mutex_destroy(&hive->hive_lock);  		mutex_destroy(&hive->reset_lock); -	} else { -		task_barrier_rem_task(&hive->tb); -		amdgpu_xgmi_sysfs_rem_dev_info(adev, hive); -		mutex_unlock(&hive->hive_lock);  	}  	return psp_xgmi_terminate(&adev->psp); @@ -604,6 +619,8 @@ int amdgpu_xgmi_ras_late_init(struct amdgpu_device *adev)  	    adev->gmc.xgmi.num_physical_nodes == 0)  		return 0; +	amdgpu_xgmi_reset_ras_error_count(adev); +  	if (!adev->gmc.xgmi.ras_if) {  		adev->gmc.xgmi.ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL);  		if (!adev->gmc.xgmi.ras_if) @@ -641,31 +658,34 @@ void amdgpu_xgmi_ras_fini(struct amdgpu_device *adev)  uint64_t amdgpu_xgmi_get_relative_phy_addr(struct amdgpu_device *adev,  					   uint64_t addr)  { -	uint32_t df_inst_id; -	uint64_t dram_base_addr = 0; -	const struct amdgpu_df_funcs *df_funcs = adev->df.funcs; - -	if ((!df_funcs)                 || -	    (!df_funcs->get_df_inst_id) || -	    (!df_funcs->get_dram_base_addr)) { -		dev_warn(adev->dev, -			 "XGMI: relative phy_addr algorithm is not supported\n"); -		return addr; -	} - -	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_DISALLOW)) { -		dev_warn(adev->dev, -			 "failed to disable DF-Cstate, DF register may not be accessible\n"); -		return addr; -	} +	struct amdgpu_xgmi *xgmi = &adev->gmc.xgmi; +	return (addr + xgmi->physical_node_id * xgmi->node_segment_size); +} -	df_inst_id = df_funcs->get_df_inst_id(adev); -	dram_base_addr = df_funcs->get_dram_base_addr(adev, df_inst_id); +static void pcs_clear_status(struct amdgpu_device *adev, uint32_t pcs_status_reg) +{ +	WREG32_PCIE(pcs_status_reg, 0xFFFFFFFF); +	WREG32_PCIE(pcs_status_reg, 0); +} -	if (amdgpu_dpm_set_df_cstate(adev, DF_CSTATE_ALLOW)) -		dev_warn(adev->dev, "failed to enable DF-Cstate\n"); +void amdgpu_xgmi_reset_ras_error_count(struct amdgpu_device *adev) +{ +	uint32_t i; -	return addr + dram_base_addr; +	switch (adev->asic_type) { +	case CHIP_ARCTURUS: +		for (i = 0; i < ARRAY_SIZE(xgmi_pcs_err_status_reg_arct); i++) +			pcs_clear_status(adev, +					 xgmi_pcs_err_status_reg_arct[i]); +		break; +	case CHIP_VEGA20: +		for (i = 0; i < ARRAY_SIZE(xgmi_pcs_err_status_reg_vg20); i++) +			pcs_clear_status(adev, +					 xgmi_pcs_err_status_reg_vg20[i]); +		break; +	default: +		break; +	}  }  static int amdgpu_xgmi_query_pcs_error_status(struct amdgpu_device *adev, @@ -758,6 +778,8 @@ int amdgpu_xgmi_query_ras_error_count(struct amdgpu_device *adev,  		break;  	} +	amdgpu_xgmi_reset_ras_error_count(adev); +  	err_data->ue_count += ue_cnt;  	err_data->ce_count += ce_cnt; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h index 4a92067fe595..6999eab16a72 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_xgmi.h @@ -25,6 +25,7 @@  #include <drm/task_barrier.h>  #include "amdgpu_psp.h" +  struct amdgpu_hive_info {  	uint64_t		hive_id;  	struct list_head	device_list; @@ -33,8 +34,14 @@ struct amdgpu_hive_info {  	struct kobject *kobj;  	struct device_attribute dev_attr;  	struct amdgpu_device *adev; -	int pstate; /*0 -- low , 1 -- high , -1 unknown*/ +	int hi_req_count; +	struct amdgpu_device *hi_req_gpu;  	struct task_barrier tb; +	enum { +		AMDGPU_XGMI_PSTATE_MIN, +		AMDGPU_XGMI_PSTATE_MAX_VEGA20, +		AMDGPU_XGMI_PSTATE_UNKNOWN +	} pstate;  };  struct amdgpu_pcs_ras_field { @@ -56,6 +63,7 @@ uint64_t amdgpu_xgmi_get_relative_phy_addr(struct amdgpu_device *adev,  					   uint64_t addr);  int amdgpu_xgmi_query_ras_error_count(struct amdgpu_device *adev,  				      void *ras_error_status); +void amdgpu_xgmi_reset_ras_error_count(struct amdgpu_device *adev);  static inline bool amdgpu_xgmi_same_hive(struct amdgpu_device *adev,  		struct amdgpu_device *bo_adev) diff --git a/drivers/gpu/drm/amd/amdgpu/atom.c b/drivers/gpu/drm/amd/amdgpu/atom.c index cae426c7c086..4cfc786699c7 100644 --- a/drivers/gpu/drm/amd/amdgpu/atom.c +++ b/drivers/gpu/drm/amd/amdgpu/atom.c @@ -54,6 +54,8 @@  #define PLL_INDEX	2  #define PLL_DATA	3 +#define ATOM_CMD_TIMEOUT_SEC	20 +  typedef struct {  	struct atom_context *ctx;  	uint32_t *ps, *ws; @@ -744,8 +746,9 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)  			cjiffies = jiffies;  			if (time_after(cjiffies, ctx->last_jump_jiffies)) {  				cjiffies -= ctx->last_jump_jiffies; -				if ((jiffies_to_msecs(cjiffies) > 10000)) { -					DRM_ERROR("atombios stuck in loop for more than 10secs aborting\n"); +				if ((jiffies_to_msecs(cjiffies) > ATOM_CMD_TIMEOUT_SEC*1000)) { +					DRM_ERROR("atombios stuck in loop for more than %dsecs aborting\n", +						  ATOM_CMD_TIMEOUT_SEC);  					ctx->abort = true;  				}  			} else { diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 006f21ef7ddf..fe306d0f73f7 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c @@ -1358,8 +1358,6 @@ static int cik_asic_reset(struct amdgpu_device *adev)  	int r;  	if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		r = amdgpu_dpm_baco_reset(adev);  	} else {  		r = cik_asic_pci_config_reset(adev); @@ -1811,12 +1809,6 @@ static uint32_t cik_get_rev_id(struct amdgpu_device *adev)  		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;  } -static void cik_detect_hw_virtualization(struct amdgpu_device *adev) -{ -	if (is_virtual_machine()) /* passthrough mode */ -		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -} -  static void cik_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)  {  	if (!ring || !ring->funcs->emit_wreg) { @@ -2179,8 +2171,6 @@ static const struct amdgpu_ip_block_version cik_common_ip_block =  int cik_set_ip_blocks(struct amdgpu_device *adev)  { -	cik_detect_hw_virtualization(adev); -  	switch (adev->asic_type) {  	case CHIP_BONAIRE:  		amdgpu_device_ip_block_add(adev, &cik_common_ip_block); diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c index 580d3f93d670..20f108818b2b 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c @@ -320,8 +320,6 @@ static void cik_sdma_gfx_stop(struct amdgpu_device *adev)  		WREG32(mmSDMA0_GFX_RB_CNTL + sdma_offsets[i], rb_cntl);  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], 0);  	} -	sdma0->sched.ready = false; -	sdma1->sched.ready = false;  }  /** @@ -679,7 +677,8 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err0; @@ -980,7 +979,8 @@ static int cik_sdma_sw_init(void *handle)  				     &adev->sdma.trap_irq,  				     (i == 0) ?  				     AMDGPU_SDMA_IRQ_INSTANCE0 : -				     AMDGPU_SDMA_IRQ_INSTANCE1); +				     AMDGPU_SDMA_IRQ_INSTANCE1, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -1313,7 +1313,8 @@ static void cik_sdma_set_irq_funcs(struct amdgpu_device *adev)  static void cik_sdma_emit_copy_buffer(struct amdgpu_ib *ib,  				      uint64_t src_offset,  				      uint64_t dst_offset, -				      uint32_t byte_count) +				      uint32_t byte_count, +				      bool tmz)  {  	ib->ptr[ib->length_dw++] = SDMA_PACKET(SDMA_OPCODE_COPY, SDMA_COPY_SUB_OPCODE_LINEAR, 0);  	ib->ptr[ib->length_dw++] = byte_count; diff --git a/drivers/gpu/drm/amd/amdgpu/cikd.h b/drivers/gpu/drm/amd/amdgpu/cikd.h index cee6e8a3ad9c..5f3f6ebfb387 100644 --- a/drivers/gpu/drm/amd/amdgpu/cikd.h +++ b/drivers/gpu/drm/amd/amdgpu/cikd.h @@ -450,7 +450,7 @@  #              define PACKET3_DMA_DATA_CMD_SAIC    (1 << 28)  #              define PACKET3_DMA_DATA_CMD_DAIC    (1 << 29)  #              define PACKET3_DMA_DATA_CMD_RAW_WAIT  (1 << 30) -#define	PACKET3_AQUIRE_MEM				0x58 +#define	PACKET3_ACQUIRE_MEM				0x58  #define	PACKET3_REWIND					0x59  #define	PACKET3_LOAD_UCONFIG_REG			0x5E  #define	PACKET3_LOAD_SH_REG				0x5F diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c index 2512e7ebfedf..e38744d06f4e 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v10_0.c @@ -2303,9 +2303,9 @@ static void dce_v10_0_hide_cursor(struct drm_crtc *crtc)  	struct amdgpu_device *adev = crtc->dev->dev_private;  	u32 tmp; -	tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); +	tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);  	tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0); -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);  }  static void dce_v10_0_show_cursor(struct drm_crtc *crtc) @@ -2319,10 +2319,10 @@ static void dce_v10_0_show_cursor(struct drm_crtc *crtc)  	WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,  	       lower_32_bits(amdgpu_crtc->cursor_addr)); -	tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); +	tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);  	tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);  	tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2); -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);  }  static int dce_v10_0_cursor_move_locked(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index 0dde22db9848..2584ff74423b 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -2382,9 +2382,9 @@ static void dce_v11_0_hide_cursor(struct drm_crtc *crtc)  	struct amdgpu_device *adev = crtc->dev->dev_private;  	u32 tmp; -	tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); +	tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);  	tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 0); -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);  }  static void dce_v11_0_show_cursor(struct drm_crtc *crtc) @@ -2398,10 +2398,10 @@ static void dce_v11_0_show_cursor(struct drm_crtc *crtc)  	WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,  	       lower_32_bits(amdgpu_crtc->cursor_addr)); -	tmp = RREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset); +	tmp = RREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset);  	tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_EN, 1);  	tmp = REG_SET_FIELD(tmp, CUR_CONTROL, CURSOR_MODE, 2); -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, tmp);  }  static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c index 84219534bd38..d05c39f9ae40 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v6_0.c @@ -2194,9 +2194,9 @@ static void dce_v6_0_hide_cursor(struct drm_crtc *crtc)  	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);  	struct amdgpu_device *adev = crtc->dev->dev_private; -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, -		   (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | -		   (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, +	       (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | +	       (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));  } @@ -2211,10 +2211,10 @@ static void dce_v6_0_show_cursor(struct drm_crtc *crtc)  	WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,  	       lower_32_bits(amdgpu_crtc->cursor_addr)); -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, -		   CUR_CONTROL__CURSOR_EN_MASK | -		   (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | -		   (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, +	       CUR_CONTROL__CURSOR_EN_MASK | +	       (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | +	       (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));  } diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c index 3a640702d7d1..ad0f8adb6a2b 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v8_0.c @@ -2205,9 +2205,9 @@ static void dce_v8_0_hide_cursor(struct drm_crtc *crtc)  	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);  	struct amdgpu_device *adev = crtc->dev->dev_private; -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, -		   (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | -		   (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, +	       (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | +	       (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));  }  static void dce_v8_0_show_cursor(struct drm_crtc *crtc) @@ -2220,10 +2220,10 @@ static void dce_v8_0_show_cursor(struct drm_crtc *crtc)  	WREG32(mmCUR_SURFACE_ADDRESS + amdgpu_crtc->crtc_offset,  	       lower_32_bits(amdgpu_crtc->cursor_addr)); -	WREG32_IDX(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, -		   CUR_CONTROL__CURSOR_EN_MASK | -		   (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | -		   (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT)); +	WREG32(mmCUR_CONTROL + amdgpu_crtc->crtc_offset, +	       CUR_CONTROL__CURSOR_EN_MASK | +	       (CURSOR_24_8_PRE_MULT << CUR_CONTROL__CURSOR_MODE__SHIFT) | +	       (CURSOR_URGENT_1_2 << CUR_CONTROL__CURSOR_URGENT_CONTROL__SHIFT));  }  static int dce_v8_0_cursor_move_locked(struct drm_crtc *crtc, diff --git a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c index 13e12be667fc..d5ff7b6331ff 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_virtual.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_virtual.c @@ -172,8 +172,9 @@ static void dce_virtual_crtc_disable(struct drm_crtc *crtc)  {  	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); -	dce_virtual_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); +	drm_crtc_vblank_off(crtc); +	amdgpu_crtc->enabled = false;  	amdgpu_crtc->pll_id = ATOM_PPLL_INVALID;  	amdgpu_crtc->encoder = NULL;  	amdgpu_crtc->connector = NULL; @@ -286,7 +287,7 @@ static int dce_virtual_get_modes(struct drm_connector *connector)  	static const struct mode_size {  		int w;  		int h; -	} common_modes[17] = { +	} common_modes[21] = {  		{ 640,  480},  		{ 720,  480},  		{ 800,  600}, @@ -303,10 +304,14 @@ static int dce_virtual_get_modes(struct drm_connector *connector)  		{1680, 1050},  		{1600, 1200},  		{1920, 1080}, -		{1920, 1200} +		{1920, 1200}, +		{4096, 3112}, +		{3656, 2664}, +		{3840, 2160}, +		{4096, 2160},  	}; -	for (i = 0; i < 17; i++) { +	for (i = 0; i < 21; i++) {  		mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);  		drm_mode_probed_add(connector, mode);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/df_v3_6.c b/drivers/gpu/drm/amd/amdgpu/df_v3_6.c index 5a1bd8ed1a6c..a7b8292cefee 100644 --- a/drivers/gpu/drm/amd/amdgpu/df_v3_6.c +++ b/drivers/gpu/drm/amd/amdgpu/df_v3_6.c @@ -686,58 +686,6 @@ static void df_v3_6_pmc_get_count(struct amdgpu_device *adev,  	}  } -static uint64_t df_v3_6_get_dram_base_addr(struct amdgpu_device *adev, -					   uint32_t df_inst) -{ -	uint32_t base_addr_reg_val 	= 0; -	uint64_t base_addr	 	= 0; - -	base_addr_reg_val = RREG32_PCIE(smnDF_CS_UMC_AON0_DramBaseAddress0 + -					df_inst * DF_3_6_SMN_REG_INST_DIST); - -	if (REG_GET_FIELD(base_addr_reg_val, -			  DF_CS_UMC_AON0_DramBaseAddress0, -			  AddrRngVal) == 0) { -		DRM_WARN("address range not valid"); -		return 0; -	} - -	base_addr = REG_GET_FIELD(base_addr_reg_val, -				  DF_CS_UMC_AON0_DramBaseAddress0, -				  DramBaseAddr); - -	return base_addr << 28; -} - -static uint32_t df_v3_6_get_df_inst_id(struct amdgpu_device *adev) -{ -	uint32_t xgmi_node_id	= 0; -	uint32_t df_inst_id 	= 0; - -	/* Walk through DF dst nodes to find current XGMI node */ -	for (df_inst_id = 0; df_inst_id < DF_3_6_INST_CNT; df_inst_id++) { - -		xgmi_node_id = RREG32_PCIE(smnDF_CS_UMC_AON0_DramLimitAddress0 + -					   df_inst_id * DF_3_6_SMN_REG_INST_DIST); -		xgmi_node_id = REG_GET_FIELD(xgmi_node_id, -					     DF_CS_UMC_AON0_DramLimitAddress0, -					     DstFabricID); - -		/* TODO: establish reason dest fabric id is offset by 7 */ -		xgmi_node_id = xgmi_node_id >> 7; - -		if (adev->gmc.xgmi.physical_node_id == xgmi_node_id) -			break; -	} - -	if (df_inst_id == DF_3_6_INST_CNT) { -		DRM_WARN("cant match df dst id with gpu node"); -		return 0; -	} - -	return df_inst_id; -} -  const struct amdgpu_df_funcs df_v3_6_funcs = {  	.sw_init = df_v3_6_sw_init,  	.sw_fini = df_v3_6_sw_fini, @@ -752,6 +700,4 @@ const struct amdgpu_df_funcs df_v3_6_funcs = {  	.pmc_get_count = df_v3_6_pmc_get_count,  	.get_fica = df_v3_6_get_fica,  	.set_fica = df_v3_6_set_fica, -	.get_dram_base_addr = df_v3_6_get_dram_base_addr, -	.get_df_inst_id = df_v3_6_get_df_inst_id  }; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c index d78059fd2c72..bd5dd4f64311 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c @@ -138,6 +138,1062 @@ static const struct soc15_reg_golden golden_settings_gc_10_0_nv10[] =  	/* Pending on emulation bring up */  }; +static const struct soc15_reg_golden golden_settings_gc_rlc_spm_10_0_nv10[] = +{ +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xe0000000, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xec), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xec), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xfc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xfc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x104), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x104), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x118), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x118), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x11c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x11c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x120), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x120), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x124), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x124), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xdc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xdc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x110), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x110), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x114), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x114), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x108), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x108), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x128), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x128), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x12c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x12c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x138), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x138), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x13c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x13c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x130), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x130), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x134), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x134), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x140), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x140), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x144), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x144), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x150), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x150), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x154), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x154), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x148), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x148), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x158), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x158), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x15c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x15c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x168), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x168), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x16c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x16c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x160), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x160), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x164), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x164), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x170), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x170), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x174), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x174), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x180), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x180), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x184), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x184), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x178), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x178), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x17c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x17c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x188), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x188), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x198), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x198), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x19c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x19c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x190), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x190), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x194), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x194), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLOBALS_SAMPLE_SKEW, 0x000000FF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLOBALS_MUXSEL_SKEW, 0x000000FF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLE_SKEW, 0x000000FF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLE_SKEW, 0x000000FF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_MUXSEL_SKEW, 0x000000FF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_MUXSEL_SKEW, 0x000000FF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_DESER_START_SKEW, 0x000000FF, 0x33), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xFFFFFFFF, 0xe0000000) +}; +  static const struct soc15_reg_golden golden_settings_gc_10_1_1[] =  {  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmCB_HW_CONTROL_4, 0xffffffff, 0x003c0014), @@ -272,14 +1328,1694 @@ static const struct soc15_reg_golden golden_settings_gc_10_1_nv14[] =  	/* Pending on emulation bring up */  }; +static const struct soc15_reg_golden golden_settings_gc_rlc_spm_10_1_nv14[] = +{ +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xE0000000L, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1e), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1e), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1e), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1e), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1e), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1e), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xdc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xec), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x104), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x108), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x110), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x114), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x118), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x11c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x130), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x134), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x138), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x13c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x128), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x12c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x120), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x124), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x140), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x144), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x150), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x154), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x148), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x158), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x15c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x168), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x16c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x160), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x164), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x170), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x174), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x180), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x184), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x178), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x17c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x188), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x198), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x19c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x190), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x194), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1a0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1a4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1b0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1b4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1a8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1ac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1b8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1bc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1c8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1cc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1c0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1c4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLOBALS_SAMPLE_SKEW, 0x000000FF, 0x26), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLOBALS_MUXSEL_SKEW, 0x000000FF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLE_SKEW, 0x000000FF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLE_SKEW, 0x000000FF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_MUXSEL_SKEW, 0x000000FF, 0x1f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_MUXSEL_SKEW, 0x000000FF, 0x25), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_DESER_START_SKEW, 0x000000FF, 0x3b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xFFFFFFFF, 0xe0000000) +}; +  static const struct soc15_reg_golden golden_settings_gc_10_1_2_nv12[] =  {  	/* Pending on emulation bring up */  }; +static const struct soc15_reg_golden golden_settings_gc_rlc_spm_10_1_2_nv12[] = +{ +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xe0000000L, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x2), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x3), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x20), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x24), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x28), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x38), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x3c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x18), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x50), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x54), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x58), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x5c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x48), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x40), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x44), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1a), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x60), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x64), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x70), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x74), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x68), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x6c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x78), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x7c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x88), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x8c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x80), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x84), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x90), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x94), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x98), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x9c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xa8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xac), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xbc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xb4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xc8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xcc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xec), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xec), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x16), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xf8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xfc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xfc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x17), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x100), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x13), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x104), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x104), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xe0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x118), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x118), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x11c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x11c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x120), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x120), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x124), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x124), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xdc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xdc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x110), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x110), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x114), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x114), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x14), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x108), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x108), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x10c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x19), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0xd8), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1b), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x128), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x128), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x12c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x12c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x138), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x138), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x13c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x13c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x130), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x130), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x12), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x134), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x134), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xf), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x140), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x140), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x144), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x144), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x150), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x150), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x154), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x154), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x148), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x148), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x14c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x7), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x158), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x158), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x15c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x15c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x168), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x168), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xa), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x16c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x16c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x9), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x160), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x160), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x164), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x164), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x170), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x170), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x174), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x174), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x180), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x180), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x184), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x184), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x178), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x178), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x17c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x17c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x188), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x188), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x18c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x5), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x198), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x198), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xc), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x19c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x19c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x190), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x190), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xe), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x194), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x194), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x30), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xd), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x34), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x11), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1d), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x4), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0x1f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_ADDR, 0xFFFFFFFF, 0x2c), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLB_SAMPLEDELAY_IND_DATA, 0xFFFFFFFF, 0xb), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLOBALS_SAMPLE_SKEW, 0x000000FF, 0x1f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_GLOBALS_MUXSEL_SKEW, 0x000000FF, 0x22), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLE_SKEW, 0x000000FF, 0x1), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_SAMPLE_SKEW, 0x000000FF, 0x6), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_MUXSEL_SKEW, 0x000000FF, 0x10), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x10000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_SE_MUXSEL_SKEW, 0x000000FF, 0x15), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xffffff, 0x0), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmRLC_SPM_DESER_START_SKEW, 0x000000FF, 0x35), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmGRBM_GFX_INDEX, 0xFFFFFFFF, 0xe0000000) +}; +  #define DEFAULT_SH_MEM_CONFIG \  	((SH_MEM_ADDRESS_MODE_64 << SH_MEM_CONFIG__ADDRESS_MODE__SHIFT) | \ -	 (SH_MEM_ALIGNMENT_MODE_DWORD << SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | \ +	 (SH_MEM_ALIGNMENT_MODE_UNALIGNED << SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT) | \  	 (SH_MEM_RETRY_MODE_ALL << SH_MEM_CONFIG__RETRY_MODE__SHIFT) | \  	 (3 << SH_MEM_CONFIG__INITIAL_INST_PREFETCH__SHIFT)) @@ -301,7 +3037,7 @@ static int gfx_v10_0_rlc_backdoor_autoload_enable(struct amdgpu_device *adev);  static int gfx_v10_0_wait_for_rlc_autoload_complete(struct amdgpu_device *adev);  static void gfx_v10_0_ring_emit_ce_meta(struct amdgpu_ring *ring, bool resume);  static void gfx_v10_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume); -static void gfx_v10_0_ring_emit_tmz(struct amdgpu_ring *ring, bool start); +static void gfx_v10_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start, bool secure);  static void gfx10_kiq_set_resources(struct amdgpu_ring *kiq_ring, uint64_t queue_mask)  { @@ -431,6 +3167,9 @@ static void gfx_v10_0_init_golden_registers(struct amdgpu_device *adev)  		soc15_program_register_sequence(adev,  						golden_settings_gc_10_0_nv10,  						(const u32)ARRAY_SIZE(golden_settings_gc_10_0_nv10)); +		soc15_program_register_sequence(adev, +						golden_settings_gc_rlc_spm_10_0_nv10, +						(const u32)ARRAY_SIZE(golden_settings_gc_rlc_spm_10_0_nv10));  		break;  	case CHIP_NAVI14:  		soc15_program_register_sequence(adev, @@ -439,6 +3178,9 @@ static void gfx_v10_0_init_golden_registers(struct amdgpu_device *adev)  		soc15_program_register_sequence(adev,  						golden_settings_gc_10_1_nv14,  						(const u32)ARRAY_SIZE(golden_settings_gc_10_1_nv14)); +		soc15_program_register_sequence(adev, +						golden_settings_gc_rlc_spm_10_1_nv14, +						(const u32)ARRAY_SIZE(golden_settings_gc_rlc_spm_10_1_nv14));  		break;  	case CHIP_NAVI12:  		soc15_program_register_sequence(adev, @@ -447,6 +3189,9 @@ static void gfx_v10_0_init_golden_registers(struct amdgpu_device *adev)  		soc15_program_register_sequence(adev,  						golden_settings_gc_10_1_2_nv12,  						(const u32)ARRAY_SIZE(golden_settings_gc_10_1_2_nv12)); +		soc15_program_register_sequence(adev, +						golden_settings_gc_rlc_spm_10_1_2_nv12, +						(const u32)ARRAY_SIZE(golden_settings_gc_rlc_spm_10_1_2_nv12));  		break;  	default:  		break; @@ -557,7 +3302,8 @@ static int gfx_v10_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	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, &ib); +	r = amdgpu_ib_get(adev, NULL, 16, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err1; @@ -1298,7 +4044,8 @@ static int gfx_v10_0_gfx_ring_init(struct amdgpu_device *adev, int ring_id,  	irq_type = AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP + ring->pipe;  	r = amdgpu_ring_init(adev, ring, 1024, -			     &adev->gfx.eop_irq, irq_type); +			     &adev->gfx.eop_irq, irq_type, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r;  	return 0; @@ -1309,7 +4056,8 @@ static int gfx_v10_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  {  	int r;  	unsigned irq_type; -	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; +	struct amdgpu_ring *ring; +	unsigned int hw_prio;  	ring = &adev->gfx.compute_ring[ring_id]; @@ -1328,10 +4076,11 @@ static int gfx_v10_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	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->queue) ? +			AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_GFX_PIPE_PRIO_NORMAL;  	/* type-2 packets are deprecated on MEC, use type-3 instead */  	r = amdgpu_ring_init(adev, ring, 1024, -			     &adev->gfx.eop_irq, irq_type); +			     &adev->gfx.eop_irq, irq_type, hw_prio);  	if (r)  		return r; @@ -1829,9 +4578,9 @@ static int gfx_v10_0_init_csb(struct amdgpu_device *adev)  	/* csib */  	WREG32_SOC15_RLC(GC, 0, mmRLC_CSIB_ADDR_HI, -		     adev->gfx.rlc.clear_state_gpu_addr >> 32); +			 adev->gfx.rlc.clear_state_gpu_addr >> 32);  	WREG32_SOC15_RLC(GC, 0, mmRLC_CSIB_ADDR_LO, -		     adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc); +			 adev->gfx.rlc.clear_state_gpu_addr & 0xfffffffc);  	WREG32_SOC15_RLC(GC, 0, mmRLC_CSIB_LENGTH, adev->gfx.rlc.clear_state_size);  	return 0; @@ -2441,10 +5190,6 @@ static int gfx_v10_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1); -	if (!enable) { -		for (i = 0; i < adev->gfx.num_gfx_rings; i++) -			adev->gfx.gfx_ring[i].sched.ready = false; -	}  	WREG32_SOC15_RLC(GC, 0, mmCP_ME_CNTL, tmp);  	for (i = 0; i < adev->usec_timeout; i++) { @@ -2923,16 +5668,12 @@ static int gfx_v10_0_cp_gfx_resume(struct amdgpu_device *adev)  static void gfx_v10_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  { -	int i; -  	if (enable) {  		WREG32_SOC15(GC, 0, mmCP_MEC_CNTL, 0);  	} else {  		WREG32_SOC15(GC, 0, mmCP_MEC_CNTL,  			     (CP_MEC_CNTL__MEC_ME1_HALT_MASK |  			      CP_MEC_CNTL__MEC_ME2_HALT_MASK)); -		for (i = 0; i < adev->gfx.num_compute_rings; i++) -			adev->gfx.compute_ring[i].sched.ready = false;  		adev->gfx.kiq.ring.sched.ready = false;  	}  	udelay(50); @@ -3268,11 +6009,8 @@ static void gfx_v10_0_compute_mqd_set_priority(struct amdgpu_ring *ring, struct  	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {  		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring->queue)) {  			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH; -			ring->has_high_prio = true;  			mqd->cp_hqd_queue_priority =  				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM; -		} else { -			ring->has_high_prio = false;  		}  	}  } @@ -3802,14 +6540,16 @@ static int gfx_v10_0_hw_init(void *handle)  		 * loaded firstly, so in direct type, it has to load smc ucode  		 * here before rlc.  		 */ -		r = smu_load_microcode(&adev->smu); -		if (r) -			return r; +		if (adev->smu.ppt_funcs != NULL) { +			r = smu_load_microcode(&adev->smu); +			if (r) +				return r; -		r = smu_check_fw_status(&adev->smu); -		if (r) { -			pr_err("SMC firmware status is not correct\n"); -			return r; +			r = smu_check_fw_status(&adev->smu); +			if (r) { +				pr_err("SMC firmware status is not correct\n"); +				return r; +			}  		}  	} @@ -4273,7 +7013,7 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,  		/* ===  CGCG /CGLS for GFX 3D Only === */  		gfx_v10_0_update_3d_clock_gating(adev, enable);  		/* ===  MGCG + MGLS === */ -		/* gfx_v10_0_update_medium_grain_clock_gating(adev, enable); */ +		gfx_v10_0_update_medium_grain_clock_gating(adev, enable);  	}  	if (adev->cg_flags & @@ -4292,14 +7032,21 @@ static int gfx_v10_0_update_gfx_clock_gating(struct amdgpu_device *adev,  static void gfx_v10_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  { -	u32 data; +	u32 reg, data; -	data = RREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL); +	reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		data = RREG32_NO_KIQ(reg); +	else +		data = RREG32(reg);  	data &= ~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK;  	data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT; -	WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		WREG32_SOC15_NO_KIQ(GC, 0, mmRLC_SPM_MC_CNTL, data); +	else +		WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data);  }  static bool gfx_v10_0_check_rlcg_range(struct amdgpu_device *adev, @@ -4341,6 +7088,20 @@ static const struct amdgpu_rlc_funcs gfx_v10_0_rlc_funcs = {  	.reset = gfx_v10_0_rlc_reset,  	.start = gfx_v10_0_rlc_start,  	.update_spm_vmid = gfx_v10_0_update_spm_vmid, +}; + +static const struct amdgpu_rlc_funcs gfx_v10_0_rlc_funcs_sriov = { +	.is_rlc_enabled = gfx_v10_0_is_rlc_enabled, +	.set_safe_mode = gfx_v10_0_set_safe_mode, +	.unset_safe_mode = gfx_v10_0_unset_safe_mode, +	.init = gfx_v10_0_rlc_init, +	.get_csb_size = gfx_v10_0_get_csb_size, +	.get_csb_buffer = gfx_v10_0_get_csb_buffer, +	.resume = gfx_v10_0_rlc_resume, +	.stop = gfx_v10_0_rlc_stop, +	.reset = gfx_v10_0_rlc_reset, +	.start = gfx_v10_0_rlc_start, +	.update_spm_vmid = gfx_v10_0_update_spm_vmid,  	.rlcg_wreg = gfx_v10_rlcg_wreg,  	.is_rlcg_access_range = gfx_v10_0_is_rlcg_access_range,  }; @@ -4350,14 +7111,14 @@ static int gfx_v10_0_set_powergating_state(void *handle,  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	bool enable = (state == AMD_PG_STATE_GATE); + +	if (amdgpu_sriov_vf(adev)) +		return 0; +  	switch (adev->asic_type) {  	case CHIP_NAVI10:  	case CHIP_NAVI14: -		if (!enable) { -			amdgpu_gfx_off_ctrl(adev, false); -			cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work); -		} else -			amdgpu_gfx_off_ctrl(adev, true); +		amdgpu_gfx_off_ctrl(adev, enable);  		break;  	default:  		break; @@ -4370,6 +7131,9 @@ static int gfx_v10_0_set_clockgating_state(void *handle,  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	if (amdgpu_sriov_vf(adev)) +		return 0; +  	switch (adev->asic_type) {  	case CHIP_NAVI10:  	case CHIP_NAVI14: @@ -4682,7 +7446,8 @@ static void gfx_v10_0_ring_emit_sb(struct amdgpu_ring *ring)  	amdgpu_ring_write(ring, 0);  } -static void gfx_v10_0_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags) +static void gfx_v10_0_ring_emit_cntxcntl(struct amdgpu_ring *ring, +					 uint32_t flags)  {  	uint32_t dw2 = 0; @@ -4690,8 +7455,6 @@ static void gfx_v10_0_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flag  		gfx_v10_0_ring_emit_ce_meta(ring,  				    (!amdgpu_sriov_vf(ring->adev) && flags & AMDGPU_IB_PREEMPTED) ? true : false); -	gfx_v10_0_ring_emit_tmz(ring, true); -  	dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */  	if (flags & AMDGPU_HAVE_CTX_SWITCH) {  		/* set load_global_config & load_global_uconfig */ @@ -4848,16 +7611,19 @@ static void gfx_v10_0_ring_emit_de_meta(struct amdgpu_ring *ring, bool resume)  					   sizeof(de_payload) >> 2);  } -static void gfx_v10_0_ring_emit_tmz(struct amdgpu_ring *ring, bool start) +static void gfx_v10_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start, +				    bool secure)  { +	uint32_t v = secure ? FRAME_TMZ : 0; +  	amdgpu_ring_write(ring, PACKET3(PACKET3_FRAME_CONTROL, 0)); -	amdgpu_ring_write(ring, FRAME_CMD(start ? 0 : 1)); /* frame_end */ +	amdgpu_ring_write(ring, v | FRAME_CMD(start ? 0 : 1));  } -static void gfx_v10_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg) +static void gfx_v10_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg, +				     uint32_t reg_val_offs)  {  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));  	amdgpu_ring_write(ring, 0 |	/* src: register*/ @@ -4866,9 +7632,9 @@ static void gfx_v10_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg)  	amdgpu_ring_write(ring, reg);  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  }  static void gfx_v10_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, @@ -4918,6 +7684,19 @@ static void gfx_v10_0_ring_emit_reg_write_reg_wait(struct amdgpu_ring *ring,  							   ref, mask);  } +static void gfx_v10_0_ring_soft_recovery(struct amdgpu_ring *ring, +					 unsigned vmid) +{ +	struct amdgpu_device *adev = ring->adev; +	uint32_t value = 0; + +	value = REG_SET_FIELD(value, SQ_CMD, CMD, 0x03); +	value = REG_SET_FIELD(value, SQ_CMD, MODE, 0x01); +	value = REG_SET_FIELD(value, SQ_CMD, CHECK_VMID, 1); +	value = REG_SET_FIELD(value, SQ_CMD, VM_ID, vmid); +	WREG32_SOC15(GC, 0, mmSQ_CMD, value); +} +  static void  gfx_v10_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev,  				      uint32_t me, uint32_t pipe, @@ -5241,6 +8020,29 @@ static int gfx_v10_0_kiq_irq(struct amdgpu_device *adev,  	return 0;  } +static void gfx_v10_0_emit_mem_sync(struct amdgpu_ring *ring) +{ +	const unsigned int gcr_cntl = +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_INV(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_WB(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_INV(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_WB(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_INV(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GLV_INV(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_INV(1) | +			PACKET3_ACQUIRE_MEM_GCR_CNTL_GLI_INV(1); + +	/* ACQUIRE_MEM - make one or more surfaces valid for use by the subsequent operations */ +	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 6)); +	amdgpu_ring_write(ring, 0); /* 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 */ +	amdgpu_ring_write(ring, gcr_cntl); /* GCR_CNTL */ +} +  static const struct amd_ip_funcs gfx_v10_0_ip_funcs = {  	.name = "gfx_v10_0",  	.early_init = gfx_v10_0_early_init, @@ -5288,7 +8090,8 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {  		3 + /* CNTX_CTRL */  		5 + /* HDP_INVL */  		8 + 8 + /* FENCE x2 */ -		2, /* SWITCH_BUFFER */ +		2 + /* SWITCH_BUFFER */ +		8, /* gfx_v10_0_emit_mem_sync */  	.emit_ib_size =	4, /* gfx_v10_0_ring_emit_ib_gfx */  	.emit_ib = gfx_v10_0_ring_emit_ib_gfx,  	.emit_fence = gfx_v10_0_ring_emit_fence, @@ -5305,10 +8108,12 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {  	.init_cond_exec = gfx_v10_0_ring_emit_init_cond_exec,  	.patch_cond_exec = gfx_v10_0_ring_emit_patch_cond_exec,  	.preempt_ib = gfx_v10_0_ring_preempt_ib, -	.emit_tmz = gfx_v10_0_ring_emit_tmz, +	.emit_frame_cntl = gfx_v10_0_ring_emit_frame_cntl,  	.emit_wreg = gfx_v10_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v10_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait, +	.soft_recovery = gfx_v10_0_ring_soft_recovery, +	.emit_mem_sync = gfx_v10_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = { @@ -5328,7 +8133,8 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {  		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +  		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +  		2 + /* gfx_v10_0_ring_emit_vm_flush */ -		8 + 8 + 8, /* gfx_v10_0_ring_emit_fence x3 for user fence, vm fence */ +		8 + 8 + 8 + /* gfx_v10_0_ring_emit_fence x3 for user fence, vm fence */ +		8, /* gfx_v10_0_emit_mem_sync */  	.emit_ib_size =	7, /* gfx_v10_0_ring_emit_ib_compute */  	.emit_ib = gfx_v10_0_ring_emit_ib_compute,  	.emit_fence = gfx_v10_0_ring_emit_fence, @@ -5343,6 +8149,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {  	.emit_wreg = gfx_v10_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v10_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait, +	.emit_mem_sync = gfx_v10_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_kiq = { @@ -5429,9 +8236,11 @@ static void gfx_v10_0_set_rlc_funcs(struct amdgpu_device *adev)  	switch (adev->asic_type) {  	case CHIP_NAVI10:  	case CHIP_NAVI14: -	case CHIP_NAVI12:  		adev->gfx.rlc.funcs = &gfx_v10_0_rlc_funcs;  		break; +	case CHIP_NAVI12: +		adev->gfx.rlc.funcs = &gfx_v10_0_rlc_funcs_sriov; +		break;  	default:  		break;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c index 31f44d05e606..79c52c7a02e3 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c @@ -1914,7 +1914,8 @@ static int gfx_v6_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	WREG32(scratch, 0xCAFEDEAD);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err1; @@ -1950,7 +1951,6 @@ err1:  static void gfx_v6_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  { -	int i;  	if (enable) {  		WREG32(mmCP_ME_CNTL, 0);  	} else { @@ -1958,10 +1958,6 @@ static void gfx_v6_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  				      CP_ME_CNTL__PFP_HALT_MASK |  				      CP_ME_CNTL__CE_HALT_MASK));  		WREG32(mmSCRATCH_UMSK, 0); -		for (i = 0; i < adev->gfx.num_gfx_rings; i++) -			adev->gfx.gfx_ring[i].sched.ready = false; -		for (i = 0; i < adev->gfx.num_compute_rings; i++) -			adev->gfx.compute_ring[i].sched.ready = false;  	}  	udelay(50);  } @@ -3114,7 +3110,9 @@ static int gfx_v6_0_sw_init(void *handle)  		ring->ring_obj = NULL;  		sprintf(ring->name, "gfx");  		r = amdgpu_ring_init(adev, ring, 1024, -				     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP); +				     &adev->gfx.eop_irq, +				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -3136,7 +3134,8 @@ static int gfx_v6_0_sw_init(void *handle)  		sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue);  		irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe;  		r = amdgpu_ring_init(adev, ring, 1024, -				     &adev->gfx.eop_irq, irq_type); +				     &adev->gfx.eop_irq, irq_type, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -3466,6 +3465,18 @@ static int gfx_v6_0_set_powergating_state(void *handle,  	return 0;  } +static void gfx_v6_0_emit_mem_sync(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); +	amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | +			  PACKET3_TC_ACTION_ENA | +			  PACKET3_SH_KCACHE_ACTION_ENA | +			  PACKET3_SH_ICACHE_ACTION_ENA);  /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE */ +	amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ +} +  static const struct amd_ip_funcs gfx_v6_0_ip_funcs = {  	.name = "gfx_v6_0",  	.early_init = gfx_v6_0_early_init, @@ -3496,7 +3507,8 @@ static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_gfx = {  		14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */  		7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */  		SI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + 6 + /* gfx_v6_0_ring_emit_vm_flush */ -		3 + 2, /* gfx_v6_ring_emit_cntxcntl including vgt flush */ +		3 + 2 + /* gfx_v6_ring_emit_cntxcntl including vgt flush */ +		5, /* SURFACE_SYNC */  	.emit_ib_size = 6, /* gfx_v6_0_ring_emit_ib */  	.emit_ib = gfx_v6_0_ring_emit_ib,  	.emit_fence = gfx_v6_0_ring_emit_fence, @@ -3507,6 +3519,7 @@ static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_gfx = {  	.insert_nop = amdgpu_ring_insert_nop,  	.emit_cntxcntl = gfx_v6_ring_emit_cntxcntl,  	.emit_wreg = gfx_v6_0_ring_emit_wreg, +	.emit_mem_sync = gfx_v6_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute = { @@ -3520,7 +3533,8 @@ static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute = {  		5 + 5 + /* hdp flush / invalidate */  		7 + /* gfx_v6_0_ring_emit_pipeline_sync */  		SI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v6_0_ring_emit_vm_flush */ -		14 + 14 + 14, /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ +		14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ +		5, /* SURFACE_SYNC */  	.emit_ib_size = 6, /* gfx_v6_0_ring_emit_ib */  	.emit_ib = gfx_v6_0_ring_emit_ib,  	.emit_fence = gfx_v6_0_ring_emit_fence, @@ -3530,6 +3544,7 @@ static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute = {  	.test_ib = gfx_v6_0_ring_test_ib,  	.insert_nop = amdgpu_ring_insert_nop,  	.emit_wreg = gfx_v6_0_ring_emit_wreg, +	.emit_mem_sync = gfx_v6_0_emit_mem_sync,  };  static void gfx_v6_0_set_ring_funcs(struct amdgpu_device *adev) diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 733d398c61cc..0cc011f9190d 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c @@ -2364,7 +2364,8 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	WREG32(scratch, 0xCAFEDEAD);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err1; @@ -2431,15 +2432,12 @@ err1:   */  static void gfx_v7_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  { -	int i; - -	if (enable) { +	if (enable)  		WREG32(mmCP_ME_CNTL, 0); -	} else { -		WREG32(mmCP_ME_CNTL, (CP_ME_CNTL__ME_HALT_MASK | CP_ME_CNTL__PFP_HALT_MASK | CP_ME_CNTL__CE_HALT_MASK)); -		for (i = 0; i < adev->gfx.num_gfx_rings; i++) -			adev->gfx.gfx_ring[i].sched.ready = false; -	} +	else +		WREG32(mmCP_ME_CNTL, (CP_ME_CNTL__ME_HALT_MASK | +				      CP_ME_CNTL__PFP_HALT_MASK | +				      CP_ME_CNTL__CE_HALT_MASK));  	udelay(50);  } @@ -2700,15 +2698,11 @@ static void gfx_v7_0_ring_set_wptr_compute(struct amdgpu_ring *ring)   */  static void gfx_v7_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  { -	int i; - -	if (enable) { +	if (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)); -		for (i = 0; i < adev->gfx.num_compute_rings; i++) -			adev->gfx.compute_ring[i].sched.ready = false; -	} +	else +		WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | +				       CP_MEC_CNTL__MEC_ME2_HALT_MASK));  	udelay(50);  } @@ -4439,7 +4433,8 @@ static int gfx_v7_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	/* type-2 packets are deprecated on MEC, use type-3 instead */  	r = amdgpu_ring_init(adev, ring, 1024, -			&adev->gfx.eop_irq, irq_type); +			     &adev->gfx.eop_irq, irq_type, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -4511,7 +4506,9 @@ static int gfx_v7_0_sw_init(void *handle)  		ring->ring_obj = NULL;  		sprintf(ring->name, "gfx");  		r = amdgpu_ring_init(adev, ring, 1024, -				     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP); +				     &adev->gfx.eop_irq, +				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -5001,6 +4998,32 @@ static int gfx_v7_0_set_powergating_state(void *handle,  	return 0;  } +static void gfx_v7_0_emit_mem_sync(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); +	amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | +			  PACKET3_TC_ACTION_ENA | +			  PACKET3_SH_KCACHE_ACTION_ENA | +			  PACKET3_SH_ICACHE_ACTION_ENA);  /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE */ +	amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ +} + +static void gfx_v7_0_emit_mem_sync_compute(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5)); +	amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | +			  PACKET3_TC_ACTION_ENA | +			  PACKET3_SH_KCACHE_ACTION_ENA | +			  PACKET3_SH_ICACHE_ACTION_ENA);  /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);	/* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0xff);		/* 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 const struct amd_ip_funcs gfx_v7_0_ip_funcs = {  	.name = "gfx_v7_0",  	.early_init = gfx_v7_0_early_init, @@ -5033,7 +5056,8 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {  		12 + 12 + 12 + /* gfx_v7_0_ring_emit_fence_gfx x3 for user fence, vm fence */  		7 + 4 + /* gfx_v7_0_ring_emit_pipeline_sync */  		CIK_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + 6 + /* gfx_v7_0_ring_emit_vm_flush */ -		3 + 4, /* gfx_v7_ring_emit_cntxcntl including vgt flush*/ +		3 + 4 + /* gfx_v7_ring_emit_cntxcntl including vgt flush*/ +		5, /* SURFACE_SYNC */  	.emit_ib_size = 4, /* gfx_v7_0_ring_emit_ib_gfx */  	.emit_ib = gfx_v7_0_ring_emit_ib_gfx,  	.emit_fence = gfx_v7_0_ring_emit_fence_gfx, @@ -5048,6 +5072,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = {  	.emit_cntxcntl = gfx_v7_ring_emit_cntxcntl,  	.emit_wreg = gfx_v7_0_ring_emit_wreg,  	.soft_recovery = gfx_v7_0_ring_soft_recovery, +	.emit_mem_sync = gfx_v7_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = { @@ -5064,7 +5089,8 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {  		5 + /* hdp invalidate */  		7 + /* gfx_v7_0_ring_emit_pipeline_sync */  		CIK_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v7_0_ring_emit_vm_flush */ -		7 + 7 + 7, /* gfx_v7_0_ring_emit_fence_compute x3 for user fence, vm fence */ +		7 + 7 + 7 + /* gfx_v7_0_ring_emit_fence_compute x3 for user fence, vm fence */ +		7, /* gfx_v7_0_emit_mem_sync_compute */  	.emit_ib_size =	7, /* gfx_v7_0_ring_emit_ib_compute */  	.emit_ib = gfx_v7_0_ring_emit_ib_compute,  	.emit_fence = gfx_v7_0_ring_emit_fence_compute, @@ -5077,6 +5103,7 @@ static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = {  	.insert_nop = amdgpu_ring_insert_nop,  	.pad_ib = amdgpu_ring_generic_pad_ib,  	.emit_wreg = gfx_v7_0_ring_emit_wreg, +	.emit_mem_sync = gfx_v7_0_emit_mem_sync_compute,  };  static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev) diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index fc32586ef80b..1d4128227ffd 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -888,7 +888,8 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	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, &ib); +	r = amdgpu_ib_get(adev, NULL, 16, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err1; @@ -1550,7 +1551,8 @@ static int gfx_v8_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)  	/* allocate an indirect buffer to put the commands in */  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, total_size, &ib); +	r = amdgpu_ib_get(adev, NULL, total_size, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r) {  		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);  		return r; @@ -1892,6 +1894,7 @@ static int gfx_v8_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	int r;  	unsigned irq_type;  	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; +	unsigned int hw_prio;  	ring = &adev->gfx.compute_ring[ring_id]; @@ -1911,9 +1914,11 @@ static int gfx_v8_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  		+ ((ring->me - 1) * adev->gfx.mec.num_pipe_per_mec)  		+ ring->pipe; +	hw_prio = amdgpu_gfx_is_high_priority_compute_queue(adev, ring->queue) ? +			AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_RING_PRIO_DEFAULT;  	/* type-2 packets are deprecated on MEC, use type-3 instead */  	r = amdgpu_ring_init(adev, ring, 1024, -			&adev->gfx.eop_irq, irq_type); +			     &adev->gfx.eop_irq, irq_type, hw_prio);  	if (r)  		return r; @@ -2017,7 +2022,8 @@ static int gfx_v8_0_sw_init(void *handle)  		}  		r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, -				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP); +				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -4120,7 +4126,6 @@ static int gfx_v8_0_rlc_resume(struct amdgpu_device *adev)  static void gfx_v8_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  { -	int i;  	u32 tmp = RREG32(mmCP_ME_CNTL);  	if (enable) { @@ -4131,8 +4136,6 @@ static void gfx_v8_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  		tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, 1);  		tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, 1);  		tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, 1); -		for (i = 0; i < adev->gfx.num_gfx_rings; i++) -			adev->gfx.gfx_ring[i].sched.ready = false;  	}  	WREG32(mmCP_ME_CNTL, tmp);  	udelay(50); @@ -4320,14 +4323,10 @@ static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)  static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  { -	int i; -  	if (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)); -		for (i = 0; i < adev->gfx.num_compute_rings; i++) -			adev->gfx.compute_ring[i].sched.ready = false;  		adev->gfx.kiq.ring.sched.ready = false;  	}  	udelay(50); @@ -4437,11 +4436,8 @@ static void gfx_v8_0_mqd_set_priority(struct amdgpu_ring *ring, struct vi_mqd *m  	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {  		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring->queue)) {  			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH; -			ring->has_high_prio = true;  			mqd->cp_hqd_queue_priority =  				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM; -		} else { -			ring->has_high_prio = false;  		}  	}  } @@ -5619,12 +5615,18 @@ static void gfx_v8_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  {  	u32 data; -	data = RREG32(mmRLC_SPM_VMID); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		data = RREG32_NO_KIQ(mmRLC_SPM_VMID); +	else +		data = RREG32(mmRLC_SPM_VMID);  	data &= ~RLC_SPM_VMID__RLC_SPM_VMID_MASK;  	data |= (vmid & RLC_SPM_VMID__RLC_SPM_VMID_MASK) << RLC_SPM_VMID__RLC_SPM_VMID__SHIFT; -	WREG32(mmRLC_SPM_VMID, data); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		WREG32_NO_KIQ(mmRLC_SPM_VMID, data); +	else +		WREG32(mmRLC_SPM_VMID, data);  }  static const struct amdgpu_rlc_funcs iceland_rlc_funcs = { @@ -6387,10 +6389,10 @@ static void gfx_v8_0_ring_emit_patch_cond_exec(struct amdgpu_ring *ring, unsigne  		ring->ring[offset] = (ring->ring_size >> 2) - offset + cur;  } -static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg) +static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg, +				    uint32_t reg_val_offs)  {  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));  	amdgpu_ring_write(ring, 0 |	/* src: register*/ @@ -6399,9 +6401,9 @@ static void gfx_v8_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg)  	amdgpu_ring_write(ring, reg);  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  }  static void gfx_v8_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, @@ -6815,6 +6817,34 @@ static int gfx_v8_0_sq_irq(struct amdgpu_device *adev,  	return 0;  } +static void gfx_v8_0_emit_mem_sync(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_SURFACE_SYNC, 3)); +	amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | +			  PACKET3_TC_ACTION_ENA | +			  PACKET3_SH_KCACHE_ACTION_ENA | +			  PACKET3_SH_ICACHE_ACTION_ENA | +			  PACKET3_TC_WB_ACTION_ENA);  /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);  /* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0);  /* CP_COHER_BASE */ +	amdgpu_ring_write(ring, 0x0000000A); /* poll interval */ +} + +static void gfx_v8_0_emit_mem_sync_compute(struct amdgpu_ring *ring) +{ +	amdgpu_ring_write(ring, PACKET3(PACKET3_ACQUIRE_MEM, 5)); +	amdgpu_ring_write(ring, PACKET3_TCL1_ACTION_ENA | +			  PACKET3_TC_ACTION_ENA | +			  PACKET3_SH_KCACHE_ACTION_ENA | +			  PACKET3_SH_ICACHE_ACTION_ENA | +			  PACKET3_TC_WB_ACTION_ENA);  /* CP_COHER_CNTL */ +	amdgpu_ring_write(ring, 0xffffffff);	/* CP_COHER_SIZE */ +	amdgpu_ring_write(ring, 0xff);		/* 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 const struct amd_ip_funcs gfx_v8_0_ip_funcs = {  	.name = "gfx_v8_0",  	.early_init = gfx_v8_0_early_init, @@ -6861,7 +6891,8 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {  		3 + /* CNTX_CTRL */  		5 + /* HDP_INVL */  		12 + 12 + /* FENCE x2 */ -		2, /* SWITCH_BUFFER */ +		2 + /* SWITCH_BUFFER */ +		5, /* SURFACE_SYNC */  	.emit_ib_size =	4, /* gfx_v8_0_ring_emit_ib_gfx */  	.emit_ib = gfx_v8_0_ring_emit_ib_gfx,  	.emit_fence = gfx_v8_0_ring_emit_fence_gfx, @@ -6879,6 +6910,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = {  	.patch_cond_exec = gfx_v8_0_ring_emit_patch_cond_exec,  	.emit_wreg = gfx_v8_0_ring_emit_wreg,  	.soft_recovery = gfx_v8_0_ring_soft_recovery, +	.emit_mem_sync = gfx_v8_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { @@ -6895,7 +6927,8 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {  		5 + /* hdp_invalidate */  		7 + /* gfx_v8_0_ring_emit_pipeline_sync */  		VI_FLUSH_GPU_TLB_NUM_WREG * 5 + 7 + /* gfx_v8_0_ring_emit_vm_flush */ -		7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */ +		7 + 7 + 7 + /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */ +		7, /* gfx_v8_0_emit_mem_sync_compute */  	.emit_ib_size =	7, /* gfx_v8_0_ring_emit_ib_compute */  	.emit_ib = gfx_v8_0_ring_emit_ib_compute,  	.emit_fence = gfx_v8_0_ring_emit_fence_compute, @@ -6908,6 +6941,7 @@ static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = {  	.insert_nop = amdgpu_ring_insert_nop,  	.pad_ib = amdgpu_ring_generic_pad_ib,  	.emit_wreg = gfx_v8_0_ring_emit_wreg, +	.emit_mem_sync = gfx_v8_0_emit_mem_sync_compute,  };  static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_kiq = { diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index e6b113ed2f40..711e9dd19705 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -50,18 +50,14 @@  #include "gfx_v9_4.h" +#include "asic_reg/pwr/pwr_10_0_offset.h" +#include "asic_reg/pwr/pwr_10_0_sh_mask.h" +  #define GFX9_NUM_GFX_RINGS     1  #define GFX9_MEC_HPD_SIZE 4096  #define RLCG_UCODE_LOADING_START_ADDRESS 0x00002000L  #define RLC_SAVE_RESTORE_ADDR_STARTING_OFFSET 0x00000000L -#define mmPWR_MISC_CNTL_STATUS					0x0183 -#define mmPWR_MISC_CNTL_STATUS_BASE_IDX				0 -#define PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN__SHIFT	0x0 -#define PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS__SHIFT		0x1 -#define PWR_MISC_CNTL_STATUS__PWR_GFX_RLC_CGPG_EN_MASK		0x00000001L -#define PWR_MISC_CNTL_STATUS__PWR_GFXOFF_STATUS_MASK		0x00000006L -  #define mmGCEA_PROBE_MAP                        0x070c  #define mmGCEA_PROBE_MAP_BASE_IDX               0 @@ -511,8 +507,8 @@ static const struct soc15_reg_golden golden_settings_gc_9_0[] =  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSH_MEM_CONFIG, 0x00001000, 0x00001000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_0, 0x0007ffff, 0x00000800),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_CU_1, 0x0007ffff, 0x00000800), -	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x0000ff87), -	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x0000ff8f), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_0, 0x01ffffff, 0x00ffff87), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSPI_RESOURCE_RESERVE_EN_CU_1, 0x01ffffff, 0x00ffff8f),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSQC_CONFIG, 0x03000000, 0x020a2000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTA_CNTL_AUX, 0xfffffeef, 0x010b0000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmTCP_CHAN_STEER_HI, 0xffffffff, 0x4a2c0e68), @@ -963,7 +959,7 @@ static void gfx_v9_0_init_golden_registers(struct amdgpu_device *adev)  	case CHIP_RAVEN:  		soc15_program_register_sequence(adev, golden_settings_gc_9_1,  						ARRAY_SIZE(golden_settings_gc_9_1)); -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			soc15_program_register_sequence(adev,  							golden_settings_gc_9_1_rv2,  							ARRAY_SIZE(golden_settings_gc_9_1_rv2)); @@ -1082,7 +1078,8 @@ static int gfx_v9_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	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, &ib); +	r = amdgpu_ib_get(adev, NULL, 16, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err1; @@ -1234,6 +1231,10 @@ struct amdgpu_gfxoff_quirk {  static const struct amdgpu_gfxoff_quirk amdgpu_gfxoff_quirk_list[] = {  	/* https://bugzilla.kernel.org/show_bug.cgi?id=204689 */  	{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc8 }, +	/* https://bugzilla.kernel.org/show_bug.cgi?id=207171 */ +	{ 0x1002, 0x15dd, 0x103c, 0x83e7, 0xd3 }, +	/* GFXOFF is unstable on C6 parts with a VBIOS 113-RAVEN-114 */ +	{ 0x1002, 0x15dd, 0x1002, 0x15dd, 0xc6 },  	{ 0, 0, 0, 0, 0 },  }; @@ -1273,7 +1274,8 @@ static void gfx_v9_0_check_if_need_gfxoff(struct amdgpu_device *adev)  	case CHIP_VEGA20:  		break;  	case CHIP_RAVEN: -		if (!(adev->rev_id >= 0x8 || adev->pdev->device == 0x15d8) && +		if (!((adev->apu_flags & AMD_APU_IS_RAVEN2) || +		      (adev->apu_flags & AMD_APU_IS_PICASSO)) &&  		    ((!is_raven_kicker(adev) &&  		      adev->gfx.rlc_fw_version < 531) ||  		     (adev->gfx.rlc_feature_version < 1) || @@ -1616,9 +1618,9 @@ static int gfx_v9_0_init_microcode(struct amdgpu_device *adev)  		chip_name = "vega20";  		break;  	case CHIP_RAVEN: -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			chip_name = "raven2"; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			chip_name = "picasso";  		else  			chip_name = "raven"; @@ -2118,7 +2120,7 @@ static int gfx_v9_0_gpu_early_init(struct amdgpu_device *adev)  		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; -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			gb_addr_config = RAVEN2_GB_ADDR_CONFIG_GOLDEN;  		else  			gb_addr_config = RAVEN_GB_ADDR_CONFIG_GOLDEN; @@ -2195,6 +2197,7 @@ static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	int r;  	unsigned irq_type;  	struct amdgpu_ring *ring = &adev->gfx.compute_ring[ring_id]; +	unsigned int hw_prio;  	ring = &adev->gfx.compute_ring[ring_id]; @@ -2213,10 +2216,11 @@ static int gfx_v9_0_compute_ring_init(struct amdgpu_device *adev, int ring_id,  	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->queue) ? +			AMDGPU_GFX_PIPE_PRIO_HIGH : AMDGPU_GFX_PIPE_PRIO_NORMAL;  	/* type-2 packets are deprecated on MEC, use type-3 instead */  	r = amdgpu_ring_init(adev, ring, 1024, -			     &adev->gfx.eop_irq, irq_type); +			     &adev->gfx.eop_irq, irq_type, hw_prio);  	if (r)  		return r; @@ -2310,7 +2314,9 @@ static int gfx_v9_0_sw_init(void *handle)  		ring->use_doorbell = true;  		ring->doorbell_index = adev->doorbell_index.gfx_ring0 << 1;  		r = amdgpu_ring_init(adev, ring, 1024, -				     &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP); +				     &adev->gfx.eop_irq, +				     AMDGPU_CP_IRQ_GFX_ME0_PIPE0_EOP, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -2528,7 +2534,7 @@ static void gfx_v9_0_init_sq_config(struct amdgpu_device *adev)  		break;  	default:  		break; -	}; +	}  }  static void gfx_v9_0_constants_init(struct amdgpu_device *adev) @@ -2963,8 +2969,7 @@ static void gfx_v9_0_init_pg(struct amdgpu_device *adev)  	 */  	if (adev->gfx.rlc.is_rlc_v2_1) {  		if (adev->asic_type == CHIP_VEGA12 || -		    (adev->asic_type == CHIP_RAVEN && -		     adev->rev_id >= 8)) +		    (adev->apu_flags & AMD_APU_IS_RAVEN2))  			gfx_v9_1_init_rlc_save_restore_list(adev);  		gfx_v9_0_enable_save_restore_machine(adev);  	} @@ -3100,16 +3105,11 @@ static int gfx_v9_0_rlc_resume(struct amdgpu_device *adev)  static void gfx_v9_0_cp_gfx_enable(struct amdgpu_device *adev, bool enable)  { -	int i;  	u32 tmp = RREG32_SOC15(GC, 0, mmCP_ME_CNTL);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, ME_HALT, enable ? 0 : 1);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, PFP_HALT, enable ? 0 : 1);  	tmp = REG_SET_FIELD(tmp, CP_ME_CNTL, CE_HALT, enable ? 0 : 1); -	if (!enable) { -		for (i = 0; i < adev->gfx.num_gfx_rings; i++) -			adev->gfx.gfx_ring[i].sched.ready = false; -	}  	WREG32_SOC15_RLC(GC, 0, mmCP_ME_CNTL, tmp);  	udelay(50);  } @@ -3305,15 +3305,11 @@ static int gfx_v9_0_cp_gfx_resume(struct amdgpu_device *adev)  static void gfx_v9_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  { -	int i; -  	if (enable) {  		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL, 0);  	} else {  		WREG32_SOC15_RLC(GC, 0, mmCP_MEC_CNTL,  			(CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); -		for (i = 0; i < adev->gfx.num_compute_rings; i++) -			adev->gfx.compute_ring[i].sched.ready = false;  		adev->gfx.kiq.ring.sched.ready = false;  	}  	udelay(50); @@ -3383,11 +3379,8 @@ static void gfx_v9_0_mqd_set_priority(struct amdgpu_ring *ring, struct v9_mqd *m  	if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) {  		if (amdgpu_gfx_is_high_priority_compute_queue(adev, ring->queue)) {  			mqd->cp_hqd_pipe_priority = AMDGPU_GFX_PIPE_PRIO_HIGH; -			ring->has_high_prio = true;  			mqd->cp_hqd_queue_priority =  				AMDGPU_GFX_QUEUE_PRIORITY_MAXIMUM; -		} else { -			ring->has_high_prio = false;  		}  	}  } @@ -4054,13 +4047,18 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  {  	signed long r, cnt = 0;  	unsigned long flags; -	uint32_t seq; +	uint32_t seq, reg_val_offs = 0; +	uint64_t value = 0;  	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	struct amdgpu_ring *ring = &kiq->ring;  	BUG_ON(!ring->funcs->emit_rreg);  	spin_lock_irqsave(&kiq->ring_lock, flags); +	if (amdgpu_device_wb_get(adev, ®_val_offs)) { +		pr_err("critical bug! too many kiq readers\n"); +		goto failed_unlock; +	}  	amdgpu_ring_alloc(ring, 32);  	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));  	amdgpu_ring_write(ring, 9 |	/* src: register*/ @@ -4070,10 +4068,13 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); -	amdgpu_fence_emit_polling(ring, &seq); +				reg_val_offs * 4)); +	r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +	if (r) +		goto failed_undo; +  	amdgpu_ring_commit(ring);  	spin_unlock_irqrestore(&kiq->ring_lock, flags); @@ -4099,10 +4100,19 @@ static uint64_t gfx_v9_0_kiq_read_clock(struct amdgpu_device *adev)  	if (cnt > MAX_KIQ_REG_TRY)  		goto failed_kiq_read; -	return (uint64_t)adev->wb.wb[kiq->reg_val_offs] | -		(uint64_t)adev->wb.wb[kiq->reg_val_offs + 1 ] << 32ULL; +	mb(); +	value = (uint64_t)adev->wb.wb[reg_val_offs] | +		(uint64_t)adev->wb.wb[reg_val_offs + 1 ] << 32ULL; +	amdgpu_device_wb_free(adev, reg_val_offs); +	return value; +failed_undo: +	amdgpu_ring_undo(ring); +failed_unlock: +	spin_unlock_irqrestore(&kiq->ring_lock, flags);  failed_kiq_read: +	if (reg_val_offs) +		amdgpu_device_wb_free(adev, reg_val_offs);  	pr_err("failed to read gpu clock\n");  	return ~0;  } @@ -4487,7 +4497,8 @@ static int gfx_v9_0_do_edc_gpr_workarounds(struct amdgpu_device *adev)  	/* allocate an indirect buffer to put the commands in */  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, total_size, &ib); +	r = amdgpu_ib_get(adev, NULL, total_size, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r) {  		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);  		return r; @@ -4958,14 +4969,21 @@ static int gfx_v9_0_update_gfx_clock_gating(struct amdgpu_device *adev,  static void gfx_v9_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid)  { -	u32 data; +	u32 reg, data; -	data = RREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL); +	reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		data = RREG32_NO_KIQ(reg); +	else +		data = RREG32(reg);  	data &= ~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK;  	data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT; -	WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data); +	if (amdgpu_sriov_is_pp_one_vf(adev)) +		WREG32_SOC15_NO_KIQ(GC, 0, mmRLC_SPM_MC_CNTL, data); +	else +		WREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL, data);  }  static bool gfx_v9_0_check_rlcg_range(struct amdgpu_device *adev, @@ -5023,10 +5041,9 @@ static int gfx_v9_0_set_powergating_state(void *handle,  	switch (adev->asic_type) {  	case CHIP_RAVEN:  	case CHIP_RENOIR: -		if (!enable) { +		if (!enable)  			amdgpu_gfx_off_ctrl(adev, false); -			cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work); -		} +  		if (adev->pg_flags & AMD_PG_SUPPORT_RLC_SMU_HS) {  			gfx_v9_0_enable_sck_slow_down_on_power_up(adev, true);  			gfx_v9_0_enable_sck_slow_down_on_power_down(adev, true); @@ -5050,12 +5067,7 @@ static int gfx_v9_0_set_powergating_state(void *handle,  			amdgpu_gfx_off_ctrl(adev, true);  		break;  	case CHIP_VEGA12: -		if (!enable) { -			amdgpu_gfx_off_ctrl(adev, false); -			cancel_delayed_work_sync(&adev->gfx.gfx_off_delay_work); -		} else { -			amdgpu_gfx_off_ctrl(adev, true); -		} +		amdgpu_gfx_off_ctrl(adev, enable);  		break;  	default:  		break; @@ -5426,10 +5438,13 @@ static void gfx_v9_0_ring_emit_de_meta(struct amdgpu_ring *ring)  	amdgpu_ring_write_multiple(ring, (void *)&de_payload, sizeof(de_payload) >> 2);  } -static void gfx_v9_0_ring_emit_tmz(struct amdgpu_ring *ring, bool start) +static void gfx_v9_0_ring_emit_frame_cntl(struct amdgpu_ring *ring, bool start, +				   bool secure)  { +	uint32_t v = secure ? FRAME_TMZ : 0; +  	amdgpu_ring_write(ring, PACKET3(PACKET3_FRAME_CONTROL, 0)); -	amdgpu_ring_write(ring, FRAME_CMD(start ? 0 : 1)); /* frame_end */ +	amdgpu_ring_write(ring, v | FRAME_CMD(start ? 0 : 1));  }  static void gfx_v9_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags) @@ -5439,8 +5454,6 @@ static void gfx_v9_ring_emit_cntxcntl(struct amdgpu_ring *ring, uint32_t flags)  	if (amdgpu_sriov_vf(ring->adev))  		gfx_v9_0_ring_emit_ce_meta(ring); -	gfx_v9_0_ring_emit_tmz(ring, true); -  	dw2 |= 0x80000000; /* set load_enable otherwise this package is just NOPs */  	if (flags & AMDGPU_HAVE_CTX_SWITCH) {  		/* set load_global_config & load_global_uconfig */ @@ -5491,10 +5504,10 @@ static void gfx_v9_0_ring_emit_patch_cond_exec(struct amdgpu_ring *ring, unsigne  		ring->ring[offset] = (ring->ring_size>>2) - offset + cur;  } -static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg) +static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg, +				    uint32_t reg_val_offs)  {  	struct amdgpu_device *adev = ring->adev; -	struct amdgpu_kiq *kiq = &adev->gfx.kiq;  	amdgpu_ring_write(ring, PACKET3(PACKET3_COPY_DATA, 4));  	amdgpu_ring_write(ring, 0 |	/* src: register*/ @@ -5503,9 +5516,9 @@ static void gfx_v9_0_ring_emit_rreg(struct amdgpu_ring *ring, uint32_t reg)  	amdgpu_ring_write(ring, reg);  	amdgpu_ring_write(ring, 0);  	amdgpu_ring_write(ring, lower_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  	amdgpu_ring_write(ring, upper_32_bits(adev->wb.gpu_addr + -				kiq->reg_val_offs * 4)); +				reg_val_offs * 4));  }  static void gfx_v9_0_ring_emit_wreg(struct amdgpu_ring *ring, uint32_t reg, @@ -6406,15 +6419,15 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, VM_L2_MEM_ECC_CNT, SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 vml2_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, vml2_mems[i], sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = REG_GET_FIELD(data, VM_L2_MEM_ECC_CNT, DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, -				 vml2_mems[i], ded_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"DED %d\n", i, vml2_mems[i], ded_count);  			err_data->ue_count += ded_count;  		}  	} @@ -6426,16 +6439,16 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, VM_L2_WALKER_MEM_ECC_CNT,  						SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 vml2_walker_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, vml2_walker_mems[i], sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = REG_GET_FIELD(data, VM_L2_WALKER_MEM_ECC_CNT,  						DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, -				 vml2_walker_mems[i], ded_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"DED %d\n", i, vml2_walker_mems[i], ded_count);  			err_data->ue_count += ded_count;  		}  	} @@ -6446,8 +6459,9 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = (data & 0x00006000L) >> 0xd;  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 atc_l2_cache_2m_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, atc_l2_cache_2m_mems[i], +				sec_count);  			err_data->ce_count += sec_count;  		}  	} @@ -6458,15 +6472,17 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = (data & 0x00006000L) >> 0xd;  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, -				 atc_l2_cache_4k_mems[i], sec_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"SEC %d\n", i, atc_l2_cache_4k_mems[i], +				sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = (data & 0x00018000L) >> 0xf;  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, -				 atc_l2_cache_4k_mems[i], ded_count); +			dev_info(adev->dev, "Instance[%d]: SubBlock %s, " +				"DED %d\n", i, atc_l2_cache_4k_mems[i], +				ded_count);  			err_data->ue_count += ded_count;  		}  	} @@ -6479,7 +6495,8 @@ static int gfx_v9_0_query_utc_edc_status(struct amdgpu_device *adev,  	return 0;  } -static int gfx_v9_0_ras_error_count(const struct soc15_reg_entry *reg, +static int gfx_v9_0_ras_error_count(struct amdgpu_device *adev, +	const struct soc15_reg_entry *reg,  	uint32_t se_id, uint32_t inst_id, uint32_t value,  	uint32_t *sec_count, uint32_t *ded_count)  { @@ -6496,7 +6513,8 @@ static int gfx_v9_0_ras_error_count(const struct soc15_reg_entry *reg,  				gfx_v9_0_ras_fields[i].sec_count_mask) >>  				gfx_v9_0_ras_fields[i].sec_count_shift;  		if (sec_cnt) { -			DRM_INFO("GFX SubBlock %s, Instance[%d][%d], SEC %d\n", +			dev_info(adev->dev, "GFX SubBlock %s, " +				"Instance[%d][%d], SEC %d\n",  				gfx_v9_0_ras_fields[i].name,  				se_id, inst_id,  				sec_cnt); @@ -6507,7 +6525,8 @@ static int gfx_v9_0_ras_error_count(const struct soc15_reg_entry *reg,  				gfx_v9_0_ras_fields[i].ded_count_mask) >>  				gfx_v9_0_ras_fields[i].ded_count_shift;  		if (ded_cnt) { -			DRM_INFO("GFX SubBlock %s, Instance[%d][%d], DED %d\n", +			dev_info(adev->dev, "GFX SubBlock %s, " +				"Instance[%d][%d], DED %d\n",  				gfx_v9_0_ras_fields[i].name,  				se_id, inst_id,  				ded_cnt); @@ -6596,9 +6615,10 @@ static int gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  				reg_value =  					RREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_0_edc_counter_regs[i]));  				if (reg_value) -					gfx_v9_0_ras_error_count(&gfx_v9_0_edc_counter_regs[i], -							j, k, reg_value, -							&sec_count, &ded_count); +					gfx_v9_0_ras_error_count(adev, +						&gfx_v9_0_edc_counter_regs[i], +						j, k, reg_value, +						&sec_count, &ded_count);  			}  		}  	} @@ -6614,6 +6634,25 @@ static int gfx_v9_0_query_ras_error_count(struct amdgpu_device *adev,  	return 0;  } +static void gfx_v9_0_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 const struct amd_ip_funcs gfx_v9_0_ip_funcs = {  	.name = "gfx_v9_0",  	.early_init = gfx_v9_0_early_init, @@ -6660,7 +6699,8 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {  		3 + /* CNTX_CTRL */  		5 + /* HDP_INVL */  		8 + 8 + /* FENCE x2 */ -		2, /* SWITCH_BUFFER */ +		2 + /* SWITCH_BUFFER */ +		7, /* gfx_v9_0_emit_mem_sync */  	.emit_ib_size =	4, /* gfx_v9_0_ring_emit_ib_gfx */  	.emit_ib = gfx_v9_0_ring_emit_ib_gfx,  	.emit_fence = gfx_v9_0_ring_emit_fence, @@ -6676,11 +6716,12 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_gfx = {  	.emit_cntxcntl = gfx_v9_ring_emit_cntxcntl,  	.init_cond_exec = gfx_v9_0_ring_emit_init_cond_exec,  	.patch_cond_exec = gfx_v9_0_ring_emit_patch_cond_exec, -	.emit_tmz = gfx_v9_0_ring_emit_tmz, +	.emit_frame_cntl = gfx_v9_0_ring_emit_frame_cntl,  	.emit_wreg = gfx_v9_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,  	.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,  };  static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = { @@ -6700,7 +6741,8 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {  		SOC15_FLUSH_GPU_TLB_NUM_WREG * 5 +  		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 7 +  		2 + /* gfx_v9_0_ring_emit_vm_flush */ -		8 + 8 + 8, /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */ +		8 + 8 + 8 + /* gfx_v9_0_ring_emit_fence x3 for user fence, vm fence */ +		7, /* gfx_v9_0_emit_mem_sync */  	.emit_ib_size =	7, /* gfx_v9_0_ring_emit_ib_compute */  	.emit_ib = gfx_v9_0_ring_emit_ib_compute,  	.emit_fence = gfx_v9_0_ring_emit_fence, @@ -6715,6 +6757,7 @@ static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_compute = {  	.emit_wreg = gfx_v9_0_ring_emit_wreg,  	.emit_reg_wait = gfx_v9_0_ring_emit_reg_wait,  	.emit_reg_write_reg_wait = gfx_v9_0_ring_emit_reg_write_reg_wait, +	.emit_mem_sync = gfx_v9_0_emit_mem_sync,  };  static const struct amdgpu_ring_funcs gfx_v9_0_ring_funcs_kiq = { @@ -6838,7 +6881,7 @@ static void gfx_v9_0_set_gds_init(struct amdgpu_device *adev)  		adev->gds.gds_compute_max_wave_id = 0x27f;  		break;  	case CHIP_RAVEN: -		if (adev->rev_id >= 0x8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			adev->gds.gds_compute_max_wave_id = 0x77; /* raven2 */  		else  			adev->gds.gds_compute_max_wave_id = 0x15f; /* raven1 */ diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c index dce945ef21a5..46351db36922 100644..100755 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_4.c @@ -732,7 +732,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, VML2_WALKER_MEM_ECC_CNTL,  					  SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, SEC %d\n", i,  				 vml2_walker_mems[i], sec_count);  			err_data->ce_count += sec_count;  		} @@ -740,7 +741,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		ded_count = REG_GET_FIELD(data, VML2_WALKER_MEM_ECC_CNTL,  					  DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, DED %d\n", i,  				 vml2_walker_mems[i], ded_count);  			err_data->ue_count += ded_count;  		} @@ -752,14 +754,16 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, UTCL2_MEM_ECC_CNTL, SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, SEC %d\n", i,  				 utcl2_router_mems[i], sec_count);  			err_data->ce_count += sec_count;  		}  		ded_count = REG_GET_FIELD(data, UTCL2_MEM_ECC_CNTL, DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, DED %d\n", i,  				 utcl2_router_mems[i], ded_count);  			err_data->ue_count += ded_count;  		} @@ -772,7 +776,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, ATC_L2_CACHE_2M_DSM_CNTL,  					  SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, SEC %d\n", i,  				 atc_l2_cache_2m_mems[i], sec_count);  			err_data->ce_count += sec_count;  		} @@ -780,7 +785,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		ded_count = REG_GET_FIELD(data, ATC_L2_CACHE_2M_DSM_CNTL,  					  DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, DED %d\n", i,  				 atc_l2_cache_2m_mems[i], ded_count);  			err_data->ue_count += ded_count;  		} @@ -793,7 +799,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		sec_count = REG_GET_FIELD(data, ATC_L2_CACHE_4K_DSM_CNTL,  					  SEC_COUNT);  		if (sec_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, SEC %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, SEC %d\n", i,  				 atc_l2_cache_4k_mems[i], sec_count);  			err_data->ce_count += sec_count;  		} @@ -801,7 +808,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  		ded_count = REG_GET_FIELD(data, ATC_L2_CACHE_4K_DSM_CNTL,  					  DED_COUNT);  		if (ded_count) { -			DRM_INFO("Instance[%d]: SubBlock %s, DED %d\n", i, +			dev_info(adev->dev, +				 "Instance[%d]: SubBlock %s, DED %d\n", i,  				 atc_l2_cache_4k_mems[i], ded_count);  			err_data->ue_count += ded_count;  		} @@ -816,7 +824,8 @@ static int gfx_v9_4_query_utc_edc_status(struct amdgpu_device *adev,  	return 0;  } -static int gfx_v9_4_ras_error_count(const struct soc15_reg_entry *reg, +static int gfx_v9_4_ras_error_count(struct amdgpu_device *adev, +				    const struct soc15_reg_entry *reg,  				    uint32_t se_id, uint32_t inst_id,  				    uint32_t value, uint32_t *sec_count,  				    uint32_t *ded_count) @@ -833,7 +842,8 @@ static int gfx_v9_4_ras_error_count(const struct soc15_reg_entry *reg,  		sec_cnt = (value & gfx_v9_4_ras_fields[i].sec_count_mask) >>  			  gfx_v9_4_ras_fields[i].sec_count_shift;  		if (sec_cnt) { -			DRM_INFO("GFX SubBlock %s, Instance[%d][%d], SEC %d\n", +			dev_info(adev->dev, +				 "GFX SubBlock %s, Instance[%d][%d], SEC %d\n",  				 gfx_v9_4_ras_fields[i].name, se_id, inst_id,  				 sec_cnt);  			*sec_count += sec_cnt; @@ -842,7 +852,8 @@ static int gfx_v9_4_ras_error_count(const struct soc15_reg_entry *reg,  		ded_cnt = (value & gfx_v9_4_ras_fields[i].ded_count_mask) >>  			  gfx_v9_4_ras_fields[i].ded_count_shift;  		if (ded_cnt) { -			DRM_INFO("GFX SubBlock %s, Instance[%d][%d], DED %d\n", +			dev_info(adev->dev, +				 "GFX SubBlock %s, Instance[%d][%d], DED %d\n",  				 gfx_v9_4_ras_fields[i].name, se_id, inst_id,  				 ded_cnt);  			*ded_count += ded_cnt; @@ -876,7 +887,7 @@ int gfx_v9_4_query_ras_error_count(struct amdgpu_device *adev,  				reg_value = RREG32(SOC15_REG_ENTRY_OFFSET(  					gfx_v9_4_edc_counter_regs[i]));  				if (reg_value) -					gfx_v9_4_ras_error_count( +					gfx_v9_4_ras_error_count(adev,  						&gfx_v9_4_edc_counter_regs[i],  						j, k, reg_value, &sec_count,  						&ded_count); diff --git a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c index 1a2f18b908fe..6682b843bafe 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c @@ -80,7 +80,7 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)  		WREG32_SOC15_RLC(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,  			min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); -		if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) +		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. diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c index 9775eca6fe43..ba2b7ac0c02d 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c @@ -170,6 +170,9 @@ static int gmc_v10_0_process_interrupt(struct amdgpu_device *adev,  			dev_err(adev->dev,  				"GCVM_L2_PROTECTION_FAULT_STATUS:0x%08X\n",  				status); +			dev_err(adev->dev, "\t Faulty UTCL2 client ID: 0x%lx\n", +				REG_GET_FIELD(status, +				GCVM_L2_PROTECTION_FAULT_STATUS, CID));  			dev_err(adev->dev, "\t MORE_FAULTS: 0x%lx\n",  				REG_GET_FIELD(status,  				GCVM_L2_PROTECTION_FAULT_STATUS, MORE_FAULTS)); @@ -369,7 +372,8 @@ static void gmc_v10_0_flush_gpu_tlb(struct amdgpu_device *adev, uint32_t vmid,  	 * translation. Avoid this by doing the invalidation from the SDMA  	 * itself.  	 */ -	r = amdgpu_job_alloc_with_ib(adev, 16 * 4, &job); +	r = amdgpu_job_alloc_with_ib(adev, 16 * 4, AMDGPU_IB_POOL_IMMEDIATE, +				     &job);  	if (r)  		goto error_alloc; @@ -423,7 +427,13 @@ static int gmc_v10_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  		amdgpu_ring_alloc(ring, kiq->pmf->invalidate_tlbs_size + 8);  		kiq->pmf->kiq_invalidate_tlbs(ring,  					pasid, flush_type, all_hub); -		amdgpu_fence_emit_polling(ring, &seq); +		r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +		if (r) { +			amdgpu_ring_undo(ring); +			spin_unlock(&adev->gfx.kiq.ring_lock); +			return -ETIME; +		} +  		amdgpu_ring_commit(ring);  		spin_unlock(&adev->gfx.kiq.ring_lock);  		r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout); @@ -676,17 +686,23 @@ static void gmc_v10_0_vram_gtt_location(struct amdgpu_device *adev,   */  static int gmc_v10_0_mc_init(struct amdgpu_device *adev)  { -	/* Could aper size report 0 ? */ -	adev->gmc.aper_base = pci_resource_start(adev->pdev, 0); -	adev->gmc.aper_size = pci_resource_len(adev->pdev, 0); +	int r;  	/* size in MB on si */  	adev->gmc.mc_vram_size =  		adev->nbio.funcs->get_memsize(adev) * 1024ULL * 1024ULL;  	adev->gmc.real_vram_size = adev->gmc.mc_vram_size; -	adev->gmc.visible_vram_size = adev->gmc.aper_size; + +	if (!(adev->flags & AMD_IS_APU)) { +		r = amdgpu_device_resize_fb_bar(adev); +		if (r) +			return r; +	} +	adev->gmc.aper_base = pci_resource_start(adev->pdev, 0); +	adev->gmc.aper_size = pci_resource_len(adev->pdev, 0);  	/* In case the PCI BAR is larger than the actual amount of vram */ +	adev->gmc.visible_vram_size = adev->gmc.aper_size;  	if (adev->gmc.visible_vram_size > adev->gmc.real_vram_size)  		adev->gmc.visible_vram_size = adev->gmc.real_vram_size; diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c index b205039350b6..a75e472b4a81 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c @@ -61,17 +61,6 @@ MODULE_FIRMWARE("amdgpu/si58_mc.bin");  #define MC_SEQ_MISC0__MT__HBM    0x60000000  #define MC_SEQ_MISC0__MT__DDR3   0xB0000000 - -static const u32 crtc_offsets[6] = -{ -	SI_CRTC0_REGISTER_OFFSET, -	SI_CRTC1_REGISTER_OFFSET, -	SI_CRTC2_REGISTER_OFFSET, -	SI_CRTC3_REGISTER_OFFSET, -	SI_CRTC4_REGISTER_OFFSET, -	SI_CRTC5_REGISTER_OFFSET -}; -  static void gmc_v6_0_mc_stop(struct amdgpu_device *adev)  {  	u32 blackout; @@ -858,7 +847,7 @@ static int gmc_v6_0_sw_init(void *handle)  	r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(44));  	if (r) { -		dev_warn(adev->dev, "amdgpu: No suitable DMA available.\n"); +		dev_warn(adev->dev, "No suitable DMA available.\n");  		return r;  	}  	adev->need_swiotlb = drm_need_swiotlb(44); diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c index 9da9596a3638..bcd4baecfe11 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c @@ -762,6 +762,7 @@ static void gmc_v7_0_gart_disable(struct amdgpu_device *adev)   * @adev: amdgpu_device pointer   * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value   * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value + * @mc_client: VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT register value   *   * Print human readable fault information (CIK).   */ @@ -1019,7 +1020,7 @@ static int gmc_v7_0_sw_init(void *handle)  	r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(40));  	if (r) { -		pr_warn("amdgpu: No suitable DMA available\n"); +		pr_warn("No suitable DMA available\n");  		return r;  	}  	adev->need_swiotlb = drm_need_swiotlb(40); diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c index 27d83204fa2b..26976e50e2a2 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c @@ -1005,6 +1005,7 @@ static void gmc_v8_0_gart_disable(struct amdgpu_device *adev)   * @adev: amdgpu_device pointer   * @status: VM_CONTEXT1_PROTECTION_FAULT_STATUS register value   * @addr: VM_CONTEXT1_PROTECTION_FAULT_ADDR register value + * @mc_client: VM_CONTEXT1_PROTECTION_FAULT_MCCLIENT register value   *   * Print human readable fault information (VI).   */ @@ -1144,7 +1145,7 @@ static int gmc_v8_0_sw_init(void *handle)  	r = dma_set_mask_and_coherent(adev->dev, DMA_BIT_MASK(40));  	if (r) { -		pr_warn("amdgpu: No suitable DMA available\n"); +		pr_warn("No suitable DMA available\n");  		return r;  	}  	adev->need_swiotlb = drm_need_swiotlb(40); diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c index 8606f877478f..11e93a82131d 100644 --- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c @@ -362,6 +362,9 @@ static int gmc_v9_0_process_interrupt(struct amdgpu_device *adev,  			dev_err(adev->dev,  				"VM_L2_PROTECTION_FAULT_STATUS:0x%08X\n",  				status); +			dev_err(adev->dev, "\t Faulty UTCL2 client ID: 0x%lx\n", +				REG_GET_FIELD(status, +				VM_L2_PROTECTION_FAULT_STATUS, CID));  			dev_err(adev->dev, "\t MORE_FAULTS: 0x%lx\n",  				REG_GET_FIELD(status,  				VM_L2_PROTECTION_FAULT_STATUS, MORE_FAULTS)); @@ -438,9 +441,8 @@ static bool gmc_v9_0_use_invalidate_semaphore(struct amdgpu_device *adev,  	return ((vmhub == AMDGPU_MMHUB_0 ||  		 vmhub == AMDGPU_MMHUB_1) &&  		(!amdgpu_sriov_vf(adev)) && -		(!(adev->asic_type == CHIP_RAVEN && -		   adev->rev_id < 0x8 && -		   adev->pdev->device == 0x15d8))); +		(!(!(adev->apu_flags & AMD_APU_IS_RAVEN2) && +		   (adev->apu_flags & AMD_APU_IS_PICASSO))));  }  static bool gmc_v9_0_get_atc_vmid_pasid_mapping_info(struct amdgpu_device *adev, @@ -618,7 +620,13 @@ static int gmc_v9_0_flush_gpu_tlb_pasid(struct amdgpu_device *adev,  						      pasid, 2, all_hub);  		kiq->pmf->kiq_invalidate_tlbs(ring,  					pasid, flush_type, all_hub); -		amdgpu_fence_emit_polling(ring, &seq); +		r = amdgpu_fence_emit_polling(ring, &seq, MAX_KIQ_REG_WAIT); +		if (r) { +			amdgpu_ring_undo(ring); +			spin_unlock(&adev->gfx.kiq.ring_lock); +			return -ETIME; +		} +  		amdgpu_ring_commit(ring);  		spin_unlock(&adev->gfx.kiq.ring_lock);  		r = amdgpu_fence_wait_polling(ring, seq, adev->usec_timeout); diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c index 0debfd9f428c..b10c95cad9a2 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v1_0.c @@ -480,7 +480,8 @@ int jpeg_v1_0_sw_init(void *handle)  	ring = &adev->jpeg.inst->ring_dec;  	sprintf(ring->name, "jpeg_dec"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, +			     0, AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c index 6173951db7b4..e67d09cb1b03 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c @@ -106,7 +106,8 @@ static int jpeg_v2_0_sw_init(void *handle)  	ring->use_doorbell = true;  	ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1;  	sprintf(ring->name, "jpeg_dec"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, +			     0, AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -169,14 +170,11 @@ static int jpeg_v2_0_hw_init(void *handle)  static int jpeg_v2_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->jpeg.inst->ring_dec;  	if (adev->jpeg.cur_state != AMD_PG_STATE_GATE &&  	      RREG32_SOC15(JPEG, 0, mmUVD_JRBC_STATUS))  		jpeg_v2_0_set_powergating_state(adev, AMD_PG_STATE_GATE); -	ring->sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c index c04c2078a7c1..713c32560445 100644 --- a/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c @@ -118,7 +118,8 @@ static int jpeg_v2_5_sw_init(void *handle)  		ring->use_doorbell = true;  		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, 0); +		r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst[i].irq, +				     0, AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r; @@ -267,7 +268,6 @@ static void jpeg_v2_5_disable_clock_gating(struct amdgpu_device* adev, int inst)  	data = RREG32_SOC15(JPEG, inst, mmJPEG_CGC_GATE);  	data &= ~(JPEG_CGC_GATE__JPEG_DEC_MASK  		| JPEG_CGC_GATE__JPEG2_DEC_MASK -		| JPEG_CGC_GATE__JPEG_ENC_MASK  		| JPEG_CGC_GATE__JMCIF_MASK  		| JPEG_CGC_GATE__JRBBM_MASK);  	WREG32_SOC15(JPEG, inst, mmJPEG_CGC_GATE, data); diff --git a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c index 396c2a624de0..405767208a4d 100644..100755 --- a/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c @@ -96,7 +96,7 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)  	WREG32_SOC15(MMHUB, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,  		     min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); -	if (adev->asic_type == CHIP_RAVEN && adev->rev_id >= 0x8) +	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 @@ -690,7 +690,8 @@ static const struct soc15_reg_entry mmhub_v1_0_edc_cnt_regs[] = {     { SOC15_REG_ENTRY(MMHUB, 0, mmMMEA1_EDC_CNT2_VG20), 0, 0, 0},  }; -static int mmhub_v1_0_get_ras_error_count(const struct soc15_reg_entry *reg, +static int mmhub_v1_0_get_ras_error_count(struct amdgpu_device *adev, +	const struct soc15_reg_entry *reg,  	uint32_t value, uint32_t *sec_count, uint32_t *ded_count)  {  	uint32_t i; @@ -704,7 +705,8 @@ static int mmhub_v1_0_get_ras_error_count(const struct soc15_reg_entry *reg,  				mmhub_v1_0_ras_fields[i].sec_count_mask) >>  				mmhub_v1_0_ras_fields[i].sec_count_shift;  		if (sec_cnt) { -			DRM_INFO("MMHUB SubBlock %s, SEC %d\n", +			dev_info(adev->dev, +				"MMHUB SubBlock %s, SEC %d\n",  				mmhub_v1_0_ras_fields[i].name,  				sec_cnt);  			*sec_count += sec_cnt; @@ -714,7 +716,8 @@ static int mmhub_v1_0_get_ras_error_count(const struct soc15_reg_entry *reg,  				mmhub_v1_0_ras_fields[i].ded_count_mask) >>  				mmhub_v1_0_ras_fields[i].ded_count_shift;  		if (ded_cnt) { -			DRM_INFO("MMHUB SubBlock %s, DED %d\n", +			dev_info(adev->dev, +				"MMHUB SubBlock %s, DED %d\n",  				mmhub_v1_0_ras_fields[i].name,  				ded_cnt);  			*ded_count += ded_cnt; @@ -739,7 +742,8 @@ static void mmhub_v1_0_query_ras_error_count(struct amdgpu_device *adev,  		reg_value =  			RREG32(SOC15_REG_ENTRY_OFFSET(mmhub_v1_0_edc_cnt_regs[i]));  		if (reg_value) -			mmhub_v1_0_get_ras_error_count(&mmhub_v1_0_edc_cnt_regs[i], +			mmhub_v1_0_get_ras_error_count(adev, +				&mmhub_v1_0_edc_cnt_regs[i],  				reg_value, &sec_count, &ded_count);  	} diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h index 37dbe0f2142f..83b453f5d717 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_ai.h @@ -26,7 +26,7 @@  #define AI_MAILBOX_POLL_ACK_TIMEDOUT	500  #define AI_MAILBOX_POLL_MSG_TIMEDOUT	12000 -#define AI_MAILBOX_POLL_FLR_TIMEDOUT	500 +#define AI_MAILBOX_POLL_FLR_TIMEDOUT	5000  enum idh_request {  	IDH_REQ_GPU_INIT_ACCESS = 1, @@ -46,7 +46,8 @@ enum idh_event {  	IDH_SUCCESS,  	IDH_FAIL,  	IDH_QUERY_ALIVE, -	IDH_EVENT_MAX + +	IDH_TEXT_MESSAGE = 255,  };  extern const struct amdgpu_virt_ops xgpu_ai_virt_ops; diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c index 237fa5e16b7c..ce2bf1fb79ed 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c @@ -30,7 +30,6 @@  #include "navi10_ih.h"  #include "soc15_common.h"  #include "mxgpu_nv.h" -#include "mxgpu_ai.h"  static void xgpu_nv_mailbox_send_ack(struct amdgpu_device *adev)  { @@ -53,8 +52,7 @@ static void xgpu_nv_mailbox_set_valid(struct amdgpu_device *adev, bool val)   */  static enum idh_event xgpu_nv_mailbox_peek_msg(struct amdgpu_device *adev)  { -	return RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, -				mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW0)); +	return RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0);  } @@ -63,8 +61,7 @@ static int xgpu_nv_mailbox_rcv_msg(struct amdgpu_device *adev,  {  	u32 reg; -	reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, -					     mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW0)); +	reg = RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW0);  	if (reg != event)  		return -ENOENT; @@ -110,7 +107,6 @@ static int xgpu_nv_poll_msg(struct amdgpu_device *adev, enum idh_event event)  		timeout -= 10;  	} while (timeout > 1); -	pr_err("Doesn't get msg:%d from pf, error=%d\n", event, r);  	return -ETIME;  } @@ -118,7 +114,6 @@ static int xgpu_nv_poll_msg(struct amdgpu_device *adev, enum idh_event event)  static void xgpu_nv_mailbox_trans_msg (struct amdgpu_device *adev,  	      enum idh_request req, u32 data1, u32 data2, u32 data3)  { -	u32 reg;  	int r;  	uint8_t trn; @@ -137,19 +132,10 @@ static void xgpu_nv_mailbox_trans_msg (struct amdgpu_device *adev,  		}  	} while (trn); -	reg = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, -					     mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW0)); -	reg = REG_SET_FIELD(reg, BIF_BX_PF_MAILBOX_MSGBUF_TRN_DW0, -			    MSGBUF_DATA, req); -	WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW0), -		      reg); -	WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW1), -				data1); -	WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW2), -				data2); -	WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_MSGBUF_TRN_DW3), -				data3); - +	WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW0, req); +	WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW1, data1); +	WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW2, data2); +	WREG32_NO_KIQ(mmMAILBOX_MSGBUF_TRN_DW3, data3);  	xgpu_nv_mailbox_set_valid(adev, true);  	/* start to poll ack */ @@ -164,23 +150,48 @@ static int xgpu_nv_send_access_requests(struct amdgpu_device *adev,  					enum idh_request req)  {  	int r; +	enum idh_event event = -1;  	xgpu_nv_mailbox_trans_msg(adev, req, 0, 0, 0); -	/* start to check msg if request is idh_req_gpu_init_access */ -	if (req == IDH_REQ_GPU_INIT_ACCESS || -		req == IDH_REQ_GPU_FINI_ACCESS || -		req == IDH_REQ_GPU_RESET_ACCESS) { -		r = xgpu_nv_poll_msg(adev, IDH_READY_TO_ACCESS_GPU); +	switch (req) { +	case IDH_REQ_GPU_INIT_ACCESS: +	case IDH_REQ_GPU_FINI_ACCESS: +	case IDH_REQ_GPU_RESET_ACCESS: +		event = IDH_READY_TO_ACCESS_GPU; +		break; +	case IDH_REQ_GPU_INIT_DATA: +		event = IDH_REQ_GPU_INIT_DATA_READY; +		break; +	default: +		break; +	} + +	if (event != -1) { +		r = xgpu_nv_poll_msg(adev, event);  		if (r) { -			pr_err("Doesn't get READY_TO_ACCESS_GPU from pf, give up\n"); -			return r; +			if (req != IDH_REQ_GPU_INIT_DATA) { +				pr_err("Doesn't get msg:%d from pf, error=%d\n", event, r); +				return r; +			} +			else /* host doesn't support REQ_GPU_INIT_DATA handshake */ +				adev->virt.req_init_data_ver = 0; +		} else { +			if (req == IDH_REQ_GPU_INIT_DATA) +			{ +				adev->virt.req_init_data_ver = +					RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW1); + +				/* assume V1 in case host doesn't set version number */ +				if (adev->virt.req_init_data_ver < 1) +					adev->virt.req_init_data_ver = 1; +			}  		} +  		/* Retrieve checksum from mailbox2 */  		if (req == IDH_REQ_GPU_INIT_ACCESS || req == IDH_REQ_GPU_RESET_ACCESS) {  			adev->virt.fw_reserve.checksum_key = -				RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, -					mmBIF_BX_PF_MAILBOX_MSGBUF_RCV_DW2)); +				RREG32_NO_KIQ(mmMAILBOX_MSGBUF_RCV_DW2);  		}  	} @@ -213,6 +224,11 @@ static int xgpu_nv_release_full_gpu_access(struct amdgpu_device *adev,  	return r;  } +static int xgpu_nv_request_init_data(struct amdgpu_device *adev) +{ +	return xgpu_nv_send_access_requests(adev, IDH_REQ_GPU_INIT_DATA); +} +  static int xgpu_nv_mailbox_ack_irq(struct amdgpu_device *adev,  					struct amdgpu_irq_src *source,  					struct amdgpu_iv_entry *entry) @@ -226,11 +242,14 @@ static int xgpu_nv_set_mailbox_ack_irq(struct amdgpu_device *adev,  					unsigned type,  					enum amdgpu_interrupt_state state)  { -	u32 tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL)); +	u32 tmp = RREG32_NO_KIQ(mmMAILBOX_INT_CNTL); + +	if (state == AMDGPU_IRQ_STATE_ENABLE) +		tmp |= 2; +	else +		tmp &= ~2; -	tmp = REG_SET_FIELD(tmp, BIF_BX_PF_MAILBOX_INT_CNTL, ACK_INT_EN, -				(state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0); -	WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL), tmp); +	WREG32_NO_KIQ(mmMAILBOX_INT_CNTL, tmp);  	return 0;  } @@ -282,11 +301,14 @@ static int xgpu_nv_set_mailbox_rcv_irq(struct amdgpu_device *adev,  				       unsigned type,  				       enum amdgpu_interrupt_state state)  { -	u32 tmp = RREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL)); +	u32 tmp = RREG32_NO_KIQ(mmMAILBOX_INT_CNTL); + +	if (state == AMDGPU_IRQ_STATE_ENABLE) +		tmp |= 1; +	else +		tmp &= ~1; -	tmp = REG_SET_FIELD(tmp, BIF_BX_PF_MAILBOX_INT_CNTL, VALID_INT_EN, -			    (state == AMDGPU_IRQ_STATE_ENABLE) ? 1 : 0); -	WREG32_NO_KIQ(SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_INT_CNTL), tmp); +	WREG32_NO_KIQ(mmMAILBOX_INT_CNTL, tmp);  	return 0;  } @@ -378,6 +400,7 @@ void xgpu_nv_mailbox_put_irq(struct amdgpu_device *adev)  const struct amdgpu_virt_ops xgpu_nv_virt_ops = {  	.req_full_gpu	= xgpu_nv_request_full_gpu_access,  	.rel_full_gpu	= xgpu_nv_release_full_gpu_access, +	.req_init_data  = xgpu_nv_request_init_data,  	.reset_gpu = xgpu_nv_request_reset,  	.wait_reset = NULL,  	.trans_msg = xgpu_nv_mailbox_trans_msg, diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h index 99b15f6865cb..52605e14a1a5 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_nv.h @@ -25,8 +25,32 @@  #define __MXGPU_NV_H__  #define NV_MAILBOX_POLL_ACK_TIMEDOUT	500 -#define NV_MAILBOX_POLL_MSG_TIMEDOUT	12000 -#define NV_MAILBOX_POLL_FLR_TIMEDOUT	500 +#define NV_MAILBOX_POLL_MSG_TIMEDOUT	6000 +#define NV_MAILBOX_POLL_FLR_TIMEDOUT	5000 + +enum idh_request { +	IDH_REQ_GPU_INIT_ACCESS = 1, +	IDH_REL_GPU_INIT_ACCESS, +	IDH_REQ_GPU_FINI_ACCESS, +	IDH_REL_GPU_FINI_ACCESS, +	IDH_REQ_GPU_RESET_ACCESS, +	IDH_REQ_GPU_INIT_DATA, + +	IDH_LOG_VF_ERROR       = 200, +}; + +enum idh_event { +	IDH_CLR_MSG_BUF	= 0, +	IDH_READY_TO_ACCESS_GPU, +	IDH_FLR_NOTIFICATION, +	IDH_FLR_NOTIFICATION_CMPL, +	IDH_SUCCESS, +	IDH_FAIL, +	IDH_QUERY_ALIVE, +	IDH_REQ_GPU_INIT_DATA_READY, + +	IDH_TEXT_MESSAGE = 255, +};  extern const struct amdgpu_virt_ops xgpu_nv_virt_ops; @@ -35,7 +59,21 @@ int xgpu_nv_mailbox_add_irq_id(struct amdgpu_device *adev);  int xgpu_nv_mailbox_get_irq(struct amdgpu_device *adev);  void xgpu_nv_mailbox_put_irq(struct amdgpu_device *adev); -#define NV_MAIBOX_CONTROL_TRN_OFFSET_BYTE (SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_CONTROL) * 4) -#define NV_MAIBOX_CONTROL_RCV_OFFSET_BYTE (SOC15_REG_OFFSET(NBIO, 0, mmBIF_BX_PF_MAILBOX_CONTROL) * 4 + 1) +#define mmMAILBOX_CONTROL 0xE5E + +#define NV_MAIBOX_CONTROL_TRN_OFFSET_BYTE (mmMAILBOX_CONTROL * 4) +#define NV_MAIBOX_CONTROL_RCV_OFFSET_BYTE (NV_MAIBOX_CONTROL_TRN_OFFSET_BYTE + 1) + +#define mmMAILBOX_MSGBUF_TRN_DW0 0xE56 +#define mmMAILBOX_MSGBUF_TRN_DW1 0xE57 +#define mmMAILBOX_MSGBUF_TRN_DW2 0xE58 +#define mmMAILBOX_MSGBUF_TRN_DW3 0xE59 + +#define mmMAILBOX_MSGBUF_RCV_DW0 0xE5A +#define mmMAILBOX_MSGBUF_RCV_DW1 0xE5B +#define mmMAILBOX_MSGBUF_RCV_DW2 0xE5C +#define mmMAILBOX_MSGBUF_RCV_DW3 0xE5D + +#define mmMAILBOX_INT_CNTL 0xE5F  #endif diff --git a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.h b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.h index f13dc6cc158f..713ee66a4d3e 100644 --- a/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.h +++ b/drivers/gpu/drm/amd/amdgpu/mxgpu_vi.h @@ -43,7 +43,8 @@ enum idh_event {  	IDH_READY_TO_ACCESS_GPU,  	IDH_FLR_NOTIFICATION,  	IDH_FLR_NOTIFICATION_CMPL, -	IDH_EVENT_MAX + +	IDH_TEXT_MESSAGE = 255  };  extern const struct amdgpu_virt_ops xgpu_vi_virt_ops; diff --git a/drivers/gpu/drm/amd/amdgpu/navi10_ih.c b/drivers/gpu/drm/amd/amdgpu/navi10_ih.c index e08245a446fc..f97857ed3c7e 100644 --- a/drivers/gpu/drm/amd/amdgpu/navi10_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/navi10_ih.c @@ -49,8 +49,48 @@ static void navi10_ih_enable_interrupts(struct amdgpu_device *adev)  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, RB_ENABLE, 1);  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, ENABLE_INTR, 1); -	WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl); +	if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +		if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL, ih_rb_cntl)) { +			DRM_ERROR("PSP program IH_RB_CNTL failed!\n"); +			return; +		} +	} else { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl); +	} +  	adev->irq.ih.enabled = true; + +	if (adev->irq.ih1.ring_size) { +		ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1); +		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL_RING1, +					   RB_ENABLE, 1); +		if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +			if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL_RING1, +						ih_rb_cntl)) { +				DRM_ERROR("program IH_RB_CNTL_RING1 failed!\n"); +				return; +			} +		} else { +			WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1, ih_rb_cntl); +		} +		adev->irq.ih1.enabled = true; +	} + +	if (adev->irq.ih2.ring_size) { +		ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2); +		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL_RING2, +					   RB_ENABLE, 1); +		if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +			if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL_RING2, +						ih_rb_cntl)) { +				DRM_ERROR("program IH_RB_CNTL_RING2 failed!\n"); +				return; +			} +		} else { +			WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2, ih_rb_cntl); +		} +		adev->irq.ih2.enabled = true; +	}  }  /** @@ -66,12 +106,61 @@ static void navi10_ih_disable_interrupts(struct amdgpu_device *adev)  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, RB_ENABLE, 0);  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, ENABLE_INTR, 0); -	WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl); +	if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +		if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL, ih_rb_cntl)) { +			DRM_ERROR("PSP program IH_RB_CNTL failed!\n"); +			return; +		} +	} else { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl); +	} +  	/* set rptr, wptr to 0 */  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0);  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR, 0);  	adev->irq.ih.enabled = false;  	adev->irq.ih.rptr = 0; + +	if (adev->irq.ih1.ring_size) { +		ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1); +		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL_RING1, +					   RB_ENABLE, 0); +		if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +			if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL_RING1, +						ih_rb_cntl)) { +				DRM_ERROR("program IH_RB_CNTL_RING1 failed!\n"); +				return; +			} +		} else { +			WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1, ih_rb_cntl); +		} +		/* set rptr, wptr to 0 */ +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, 0); +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING1, 0); +		adev->irq.ih1.enabled = false; +		adev->irq.ih1.rptr = 0; +	} + +	if (adev->irq.ih2.ring_size) { +		ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2); +		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL_RING2, +					   RB_ENABLE, 0); +		if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +			if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL_RING2, +						ih_rb_cntl)) { +				DRM_ERROR("program IH_RB_CNTL_RING2 failed!\n"); +				return; +			} +		} else { +			WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2, ih_rb_cntl); +		} +		/* set rptr, wptr to 0 */ +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, 0); +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING2, 0); +		adev->irq.ih2.enabled = false; +		adev->irq.ih2.rptr = 0; +	} +  }  static uint32_t navi10_ih_rb_cntl(struct amdgpu_ih_ring *ih, uint32_t ih_rb_cntl) @@ -97,6 +186,43 @@ static uint32_t navi10_ih_rb_cntl(struct amdgpu_ih_ring *ih, uint32_t ih_rb_cntl  	return ih_rb_cntl;  } +static uint32_t navi10_ih_doorbell_rptr(struct amdgpu_ih_ring *ih) +{ +	u32 ih_doorbell_rtpr = 0; + +	if (ih->use_doorbell) { +		ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, +						 IH_DOORBELL_RPTR, OFFSET, +						 ih->doorbell_index); +		ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, +						 IH_DOORBELL_RPTR, +						 ENABLE, 1); +	} else { +		ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, +						 IH_DOORBELL_RPTR, +						 ENABLE, 0); +	} +	return ih_doorbell_rtpr; +} + +static void navi10_ih_reroute_ih(struct amdgpu_device *adev) +{ +	uint32_t tmp; + +	/* Reroute to IH ring 1 for VMC */ +	WREG32_SOC15(OSSSYS, 0, mmIH_CLIENT_CFG_INDEX, 0x12); +	tmp = RREG32_SOC15(OSSSYS, 0, mmIH_CLIENT_CFG_DATA); +	tmp = REG_SET_FIELD(tmp, IH_CLIENT_CFG_DATA, CLIENT_TYPE, 1); +	tmp = REG_SET_FIELD(tmp, IH_CLIENT_CFG_DATA, RING_ID, 1); +	WREG32_SOC15(OSSSYS, 0, mmIH_CLIENT_CFG_DATA, tmp); + +	/* Reroute IH ring 1 for UMC */ +	WREG32_SOC15(OSSSYS, 0, mmIH_CLIENT_CFG_INDEX, 0x1B); +	tmp = RREG32_SOC15(OSSSYS, 0, mmIH_CLIENT_CFG_DATA); +	tmp = REG_SET_FIELD(tmp, IH_CLIENT_CFG_DATA, RING_ID, 1); +	WREG32_SOC15(OSSSYS, 0, mmIH_CLIENT_CFG_DATA, tmp); +} +  /**   * navi10_ih_irq_init - init and enable the interrupt ring   * @@ -111,7 +237,7 @@ static uint32_t navi10_ih_rb_cntl(struct amdgpu_ih_ring *ih, uint32_t ih_rb_cntl  static int navi10_ih_irq_init(struct amdgpu_device *adev)  {  	struct amdgpu_ih_ring *ih = &adev->irq.ih; -	u32 ih_rb_cntl, ih_doorbell_rtpr, ih_chicken; +	u32 ih_rb_cntl, ih_chicken;  	u32 tmp;  	/* disable irqs */ @@ -127,6 +253,15 @@ static int navi10_ih_irq_init(struct amdgpu_device *adev)  	ih_rb_cntl = navi10_ih_rb_cntl(ih, ih_rb_cntl);  	ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, RPTR_REARM,  				   !!adev->irq.msi_enabled); +	if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +		if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL, ih_rb_cntl)) { +			DRM_ERROR("PSP program IH_RB_CNTL failed!\n"); +			return -ETIMEDOUT; +		} +	} else { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl); +	} +	navi10_ih_reroute_ih(adev);  	if (unlikely(adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT)) {  		if (ih->use_bus_addr) { @@ -137,8 +272,6 @@ static int navi10_ih_irq_init(struct amdgpu_device *adev)  		}  	} -	WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL, ih_rb_cntl); -  	/* set the writeback address whether it's enabled or not */  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_ADDR_LO,  		     lower_32_bits(ih->wptr_addr)); @@ -149,22 +282,68 @@ static int navi10_ih_irq_init(struct amdgpu_device *adev)  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, 0);  	WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR, 0); -	ih_doorbell_rtpr = RREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR); -	if (ih->use_doorbell) { -		ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, -						 IH_DOORBELL_RPTR, OFFSET, -						 ih->doorbell_index); -		ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, -						 IH_DOORBELL_RPTR, ENABLE, 1); -	} else { -		ih_doorbell_rtpr = REG_SET_FIELD(ih_doorbell_rtpr, -						 IH_DOORBELL_RPTR, ENABLE, 0); -	} -	WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR, ih_doorbell_rtpr); +	WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR, +			navi10_ih_doorbell_rptr(ih));  	adev->nbio.funcs->ih_doorbell_range(adev, ih->use_doorbell,  					    ih->doorbell_index); +	ih = &adev->irq.ih1; +	if (ih->ring_size) { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_RING1, ih->gpu_addr >> 8); +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI_RING1, +			     (ih->gpu_addr >> 40) & 0xff); + +		ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1); +		ih_rb_cntl = navi10_ih_rb_cntl(ih, ih_rb_cntl); +		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, +					   WPTR_OVERFLOW_ENABLE, 0); +		ih_rb_cntl = REG_SET_FIELD(ih_rb_cntl, IH_RB_CNTL, +					   RB_FULL_DRAIN_ENABLE, 1); +		if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +			if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL_RING1, +						ih_rb_cntl)) { +				DRM_ERROR("program IH_RB_CNTL_RING1 failed!\n"); +				return -ETIMEDOUT; +			} +		} else { +			WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING1, ih_rb_cntl); +		} +		/* set rptr, wptr to 0 */ +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING1, 0); +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, 0); + +		WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR_RING1, +				navi10_ih_doorbell_rptr(ih)); +	} + +	ih = &adev->irq.ih2; +	if (ih->ring_size) { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_RING2, ih->gpu_addr >> 8); +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_BASE_HI_RING2, +			     (ih->gpu_addr >> 40) & 0xff); + +		ih_rb_cntl = RREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2); +		ih_rb_cntl = navi10_ih_rb_cntl(ih, ih_rb_cntl); + +		if (amdgpu_sriov_vf(adev) && adev->asic_type < CHIP_NAVI10) { +			if (psp_reg_program(&adev->psp, PSP_REG_IH_RB_CNTL_RING2, +						ih_rb_cntl)) { +				DRM_ERROR("program IH_RB_CNTL_RING2 failed!\n"); +				return -ETIMEDOUT; +			} +		} else { +			WREG32_SOC15(OSSSYS, 0, mmIH_RB_CNTL_RING2, ih_rb_cntl); +		} +		/* set rptr, wptr to 0 */ +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_WPTR_RING2, 0); +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, 0); + +		WREG32_SOC15(OSSSYS, 0, mmIH_DOORBELL_RPTR_RING2, +			     navi10_ih_doorbell_rptr(ih)); +	} + +  	tmp = RREG32_SOC15(OSSSYS, 0, mmIH_STORM_CLIENT_LIST_CNTL);  	tmp = REG_SET_FIELD(tmp, IH_STORM_CLIENT_LIST_CNTL,  			    CLIENT18_IS_STORM_CLIENT, 1); @@ -217,7 +396,15 @@ static u32 navi10_ih_get_wptr(struct amdgpu_device *adev,  	if (!REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW))  		goto out; -	reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_WPTR); +	if (ih == &adev->irq.ih) +		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_WPTR); +	else if (ih == &adev->irq.ih1) +		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_WPTR_RING1); +	else if (ih == &adev->irq.ih2) +		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_WPTR_RING2); +	else +		BUG(); +  	wptr = RREG32_NO_KIQ(reg);  	if (!REG_GET_FIELD(wptr, IH_RB_WPTR, RB_OVERFLOW))  		goto out; @@ -233,7 +420,15 @@ static u32 navi10_ih_get_wptr(struct amdgpu_device *adev,  		 wptr, ih->rptr, tmp);  	ih->rptr = tmp; -	reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL); +	if (ih == &adev->irq.ih) +		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL); +	else if (ih == &adev->irq.ih1) +		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL_RING1); +	else if (ih == &adev->irq.ih2) +		reg = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_CNTL_RING2); +	else +		BUG(); +  	tmp = RREG32_NO_KIQ(reg);  	tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1);  	WREG32_NO_KIQ(reg, tmp); @@ -333,8 +528,52 @@ static void navi10_ih_set_rptr(struct amdgpu_device *adev,  		if (amdgpu_sriov_vf(adev))  			navi10_ih_irq_rearm(adev, ih); -	} else +	} else if (ih == &adev->irq.ih) {  		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, ih->rptr); +	} else if (ih == &adev->irq.ih1) { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING1, ih->rptr); +	} else if (ih == &adev->irq.ih2) { +		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR_RING2, ih->rptr); +	} +} + +/** + * navi10_ih_self_irq - dispatch work for ring 1 and 2 + * + * @adev: amdgpu_device pointer + * @source: irq source + * @entry: IV with WPTR update + * + * Update the WPTR from the IV and schedule work to handle the entries. + */ +static int navi10_ih_self_irq(struct amdgpu_device *adev, +			      struct amdgpu_irq_src *source, +			      struct amdgpu_iv_entry *entry) +{ +	uint32_t wptr = cpu_to_le32(entry->src_data[0]); + +	switch (entry->ring_id) { +	case 1: +		*adev->irq.ih1.wptr_cpu = wptr; +		schedule_work(&adev->irq.ih1_work); +		break; +	case 2: +		*adev->irq.ih2.wptr_cpu = wptr; +		schedule_work(&adev->irq.ih2_work); +		break; +	default: break; +	} +	return 0; +} + +static const struct amdgpu_irq_src_funcs navi10_ih_self_irq_funcs = { +	.process = navi10_ih_self_irq, +}; + +static void navi10_ih_set_self_irq_funcs(struct amdgpu_device *adev) +{ +	adev->irq.self_irq.num_types = 0; +	adev->irq.self_irq.funcs = &navi10_ih_self_irq_funcs;  }  static int navi10_ih_early_init(void *handle) @@ -342,6 +581,7 @@ static int navi10_ih_early_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	navi10_ih_set_interrupt_funcs(adev); +	navi10_ih_set_self_irq_funcs(adev);  	return 0;  } @@ -351,6 +591,12 @@ static int navi10_ih_sw_init(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	bool use_bus_addr; +	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_IH, 0, +				&adev->irq.self_irq); + +	if (r) +		return r; +  	/* use gpu virtual address for ih ring  	 * until ih_checken is programmed to allow  	 * use bus address for ih ring by psp bl */ @@ -363,6 +609,20 @@ static int navi10_ih_sw_init(void *handle)  	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); +	if (r) +		return r; + +	adev->irq.ih1.use_doorbell = true; +	adev->irq.ih1.doorbell_index = (adev->doorbell_index.ih + 1) << 1; + +	r = amdgpu_ih_ring_init(adev, &adev->irq.ih2, PAGE_SIZE, true); +	if (r) +		return r; + +	adev->irq.ih2.use_doorbell = true; +	adev->irq.ih2.doorbell_index = (adev->doorbell_index.ih + 2) << 1; +  	r = amdgpu_irq_init(adev);  	return r; @@ -373,6 +633,8 @@ static int navi10_ih_sw_fini(void *handle)  	struct amdgpu_device *adev = (struct amdgpu_device *)handle;  	amdgpu_irq_fini(adev); +	amdgpu_ih_ring_fini(adev, &adev->irq.ih2); +	amdgpu_ih_ring_fini(adev, &adev->irq.ih1);  	amdgpu_ih_ring_fini(adev, &adev->irq.ih);  	return 0; diff --git a/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h b/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h index 074a9a09c0a7..a5b60c9a2418 100644 --- a/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h +++ b/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h @@ -73,6 +73,22 @@  #define SDMA_OP_AQL_COPY  0  #define SDMA_OP_AQL_BARRIER_OR  0 +#define SDMA_GCR_RANGE_IS_PA		(1 << 18) +#define SDMA_GCR_SEQ(x)			(((x) & 0x3) << 16) +#define SDMA_GCR_GL2_WB			(1 << 15) +#define SDMA_GCR_GL2_INV		(1 << 14) +#define SDMA_GCR_GL2_DISCARD		(1 << 13) +#define SDMA_GCR_GL2_RANGE(x)		(((x) & 0x3) << 11) +#define SDMA_GCR_GL2_US			(1 << 10) +#define SDMA_GCR_GL1_INV		(1 << 9) +#define SDMA_GCR_GLV_INV		(1 << 8) +#define SDMA_GCR_GLK_INV		(1 << 7) +#define SDMA_GCR_GLK_WB			(1 << 6) +#define SDMA_GCR_GLM_INV		(1 << 5) +#define SDMA_GCR_GLM_WB			(1 << 4) +#define SDMA_GCR_GL1_RANGE(x)		(((x) & 0x3) << 2) +#define SDMA_GCR_GLI_INV(x)		(((x) & 0x3) << 0) +  /*define for op field*/  #define SDMA_PKT_HEADER_op_offset 0  #define SDMA_PKT_HEADER_op_mask   0x000000FF diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c b/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c index f3a3fe746222..cbcf04578b99 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v2_3.c @@ -290,23 +290,6 @@ const struct nbio_hdp_flush_reg nbio_v2_3_hdp_flush_reg = {  	.ref_and_mask_sdma1 = BIF_BX_PF_GPU_HDP_FLUSH_DONE__SDMA1_MASK,  }; -static void nbio_v2_3_detect_hw_virt(struct amdgpu_device *adev) -{ -	uint32_t reg; - -	reg = RREG32_SOC15(NBIO, 0, mmRCC_DEV0_EPF0_RCC_IOV_FUNC_IDENTIFIER); -	if (reg & 1) -		adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; - -	if (reg & 0x80000000) -		adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; - -	if (!reg) { -		if (is_virtual_machine())	/* passthrough mode exclus sriov mod */ -			adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -	} -} -  static void nbio_v2_3_init_registers(struct amdgpu_device *adev)  {  	uint32_t def, data; @@ -338,6 +321,5 @@ const struct amdgpu_nbio_funcs nbio_v2_3_funcs = {  	.get_clockgating_state = nbio_v2_3_get_clockgating_state,  	.ih_control = nbio_v2_3_ih_control,  	.init_registers = nbio_v2_3_init_registers, -	.detect_hw_virt = nbio_v2_3_detect_hw_virt,  	.remap_hdp_registers = nbio_v2_3_remap_hdp_registers,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c b/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c index 635d9e1fc0a3..7b2fb050407d 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v6_1.c @@ -241,23 +241,6 @@ const struct nbio_hdp_flush_reg nbio_v6_1_hdp_flush_reg = {  	.ref_and_mask_sdma1 = BIF_BX_PF0_GPU_HDP_FLUSH_DONE__SDMA1_MASK  }; -static void nbio_v6_1_detect_hw_virt(struct amdgpu_device *adev) -{ -	uint32_t reg; - -	reg = RREG32_SOC15(NBIO, 0, mmRCC_PF_0_0_RCC_IOV_FUNC_IDENTIFIER); -	if (reg & 1) -		adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; - -	if (reg & 0x80000000) -		adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; - -	if (!reg) { -		if (is_virtual_machine())	/* passthrough mode exclus sriov mod */ -			adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -	} -} -  static void nbio_v6_1_init_registers(struct amdgpu_device *adev)  {  	uint32_t def, data; @@ -294,5 +277,4 @@ const struct amdgpu_nbio_funcs nbio_v6_1_funcs = {  	.get_clockgating_state = nbio_v6_1_get_clockgating_state,  	.ih_control = nbio_v6_1_ih_control,  	.init_registers = nbio_v6_1_init_registers, -	.detect_hw_virt = nbio_v6_1_detect_hw_virt,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c index d6cbf26074bc..d34628e113fc 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_0.c @@ -280,12 +280,6 @@ const struct nbio_hdp_flush_reg nbio_v7_0_hdp_flush_reg = {  	.ref_and_mask_sdma1 = GPU_HDP_FLUSH_DONE__SDMA1_MASK,  }; -static void nbio_v7_0_detect_hw_virt(struct amdgpu_device *adev) -{ -	if (is_virtual_machine())	/* passthrough mode exclus sriov mod */ -		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -} -  static void nbio_v7_0_init_registers(struct amdgpu_device *adev)  { @@ -310,6 +304,5 @@ const struct amdgpu_nbio_funcs nbio_v7_0_funcs = {  	.get_clockgating_state = nbio_v7_0_get_clockgating_state,  	.ih_control = nbio_v7_0_ih_control,  	.init_registers = nbio_v7_0_init_registers, -	.detect_hw_virt = nbio_v7_0_detect_hw_virt,  	.remap_hdp_registers = nbio_v7_0_remap_hdp_registers,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c index 149d386590df..e629156173d3 100644 --- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c +++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c @@ -185,7 +185,7 @@ static void nbio_v7_4_ih_doorbell_range(struct amdgpu_device *adev,  	if (use_doorbell) {  		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, OFFSET, doorbell_index); -		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 2); +		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 4);  	} else  		ih_doorbell_range = REG_SET_FIELD(ih_doorbell_range, BIF_IH_DOORBELL_RANGE, SIZE, 0); @@ -292,23 +292,6 @@ const struct nbio_hdp_flush_reg nbio_v7_4_hdp_flush_reg = {  	.ref_and_mask_sdma7 = GPU_HDP_FLUSH_DONE__RSVD_ENG5_MASK,  }; -static void nbio_v7_4_detect_hw_virt(struct amdgpu_device *adev) -{ -	uint32_t reg; - -	reg = RREG32_SOC15(NBIO, 0, mmRCC_IOV_FUNC_IDENTIFIER); -	if (reg & 1) -		adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; - -	if (reg & 0x80000000) -		adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; - -	if (!reg) { -		if (is_virtual_machine())	/* passthrough mode exclus sriov mod */ -			adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -	} -} -  static void nbio_v7_4_init_registers(struct amdgpu_device *adev)  { @@ -340,14 +323,20 @@ static void nbio_v7_4_handle_ras_controller_intr_no_bifring(struct amdgpu_device  		obj->err_data.ce_count += err_data.ce_count;  		if (err_data.ce_count) -			DRM_INFO("%ld correctable errors detected in %s block\n", -				obj->err_data.ce_count, adev->nbio.ras_if->name); +			dev_info(adev->dev, "%ld correctable hardware " +					"errors detected in %s block, " +					"no user action is needed.\n", +					obj->err_data.ce_count, +					adev->nbio.ras_if->name);  		if (err_data.ue_count) -			DRM_INFO("%ld uncorrectable errors detected in %s block\n", -				obj->err_data.ue_count, adev->nbio.ras_if->name); +			dev_info(adev->dev, "%ld uncorrectable hardware " +					"errors detected in %s block\n", +					obj->err_data.ue_count, +					adev->nbio.ras_if->name); -		DRM_WARN("RAS controller interrupt triggered by NBIF error\n"); +		dev_info(adev->dev, "RAS controller interrupt triggered " +					"by NBIF error\n");  		/* ras_controller_int is dedicated for nbif ras error,  		 * not the global interrupt for sync flood @@ -561,7 +550,6 @@ const struct amdgpu_nbio_funcs nbio_v7_4_funcs = {  	.get_clockgating_state = nbio_v7_4_get_clockgating_state,  	.ih_control = nbio_v7_4_ih_control,  	.init_registers = nbio_v7_4_init_registers, -	.detect_hw_virt = nbio_v7_4_detect_hw_virt,  	.remap_hdp_registers = nbio_v7_4_remap_hdp_registers,  	.handle_ras_controller_intr_no_bifring = nbio_v7_4_handle_ras_controller_intr_no_bifring,  	.handle_ras_err_event_athub_intr_no_bifring = nbio_v7_4_handle_ras_err_event_athub_intr_no_bifring, diff --git a/drivers/gpu/drm/amd/amdgpu/nv.c b/drivers/gpu/drm/amd/amdgpu/nv.c index 033cbbca2072..6655dd2009b6 100644 --- a/drivers/gpu/drm/amd/amdgpu/nv.c +++ b/drivers/gpu/drm/amd/amdgpu/nv.c @@ -351,8 +351,6 @@ static int nv_asic_reset(struct amdgpu_device *adev)  	struct smu_context *smu = &adev->smu;  	if (nv_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		ret = smu_baco_enter(smu);  		if (ret)  			return ret; @@ -360,8 +358,6 @@ static int nv_asic_reset(struct amdgpu_device *adev)  		if (ret)  			return ret;  	} else { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		ret = nv_asic_mode1_reset(adev);  	} @@ -457,18 +453,19 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)  {  	int r; -	/* Set IP register base before any HW register access */ -	r = nv_reg_base_init(adev); -	if (r) -		return r; -  	adev->nbio.funcs = &nbio_v2_3_funcs;  	adev->nbio.hdp_flush_reg = &nbio_v2_3_hdp_flush_reg; -	adev->nbio.funcs->detect_hw_virt(adev); - -	if (amdgpu_sriov_vf(adev)) +	if (amdgpu_sriov_vf(adev)) {  		adev->virt.ops = &xgpu_nv_virt_ops; +		/* try send GPU_INIT_DATA request to host */ +		amdgpu_virt_request_init_data(adev); +	} + +	/* Set IP register base before any HW register access */ +	r = nv_reg_base_init(adev); +	if (r) +		return r;  	switch (adev->asic_type) {  	case CHIP_NAVI10: @@ -501,8 +498,7 @@ int nv_set_ip_blocks(struct amdgpu_device *adev)  		amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block);  		amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block);  		amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block); -		if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP && -		    !amdgpu_sriov_vf(adev)) +		if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP)  			amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block);  		if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))  			amdgpu_device_ip_block_add(adev, &dce_virtual_ip_block); @@ -552,13 +548,6 @@ static bool nv_need_full_reset(struct amdgpu_device *adev)  	return true;  } -static void nv_get_pcie_usage(struct amdgpu_device *adev, -			      uint64_t *count0, -			      uint64_t *count1) -{ -	/*TODO*/ -} -  static bool nv_need_reset_on_init(struct amdgpu_device *adev)  {  #if 0 @@ -633,7 +622,6 @@ static const struct amdgpu_asic_funcs nv_asic_funcs =  	.invalidate_hdp = &nv_invalidate_hdp,  	.init_doorbell_index = &nv_init_doorbell_index,  	.need_full_reset = &nv_need_full_reset, -	.get_pcie_usage = &nv_get_pcie_usage,  	.need_reset_on_init = &nv_need_reset_on_init,  	.get_pcie_replay_count = &nv_get_pcie_replay_count,  	.supports_baco = &nv_asic_supports_baco, diff --git a/drivers/gpu/drm/amd/amdgpu/nvd.h b/drivers/gpu/drm/amd/amdgpu/nvd.h index 1de984647dbb..fd6b58243b03 100644 --- a/drivers/gpu/drm/amd/amdgpu/nvd.h +++ b/drivers/gpu/drm/amd/amdgpu/nvd.h @@ -256,6 +256,54 @@  #define	PACKET3_BLK_CNTX_UPDATE				0x53  #define	PACKET3_INCR_UPDT_STATE				0x55  #define	PACKET3_ACQUIRE_MEM				0x58 +/* 1.  HEADER + * 2.  COHER_CNTL [30:0] + * 2.1 ENGINE_SEL [31:31] + * 2.  COHER_SIZE [31:0] + * 3.  COHER_SIZE_HI [7:0] + * 4.  COHER_BASE_LO [31:0] + * 5.  COHER_BASE_HI [23:0] + * 7.  POLL_INTERVAL [15:0] + * 8.  GCR_CNTL [18:0] + */ +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GLI_INV(x) ((x) << 0) +		/* +		 * 0:NOP +		 * 1:ALL +		 * 2:RANGE +		 * 3:FIRST_LAST +		 */ +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_RANGE(x) ((x) << 2) +		/* +		 * 0:ALL +		 * 1:reserved +		 * 2:RANGE +		 * 3:FIRST_LAST +		 */ +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_WB(x) ((x) << 4) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GLM_INV(x) ((x) << 5) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_WB(x) ((x) << 6) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GLK_INV(x) ((x) << 7) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GLV_INV(x) ((x) << 8) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL1_INV(x) ((x) << 9) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_US(x) ((x) << 10) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_RANGE(x) ((x) << 11) +		/* +		 * 0:ALL +		 * 1:VOL +		 * 2:RANGE +		 * 3:FIRST_LAST +		 */ +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_DISCARD(x)  ((x) << 13) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_INV(x) ((x) << 14) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_GL2_WB(x) ((x) << 15) +#define 	PACKET3_ACQUIRE_MEM_GCR_CNTL_SEQ(x) ((x) << 16) +		/* +		 * 0: PARALLEL +		 * 1: FORWARD +		 * 2: REVERSE +		 */ +#define 	PACKET3_ACQUIRE_MEM_GCR_RANGE_IS_PA  (1 << 18)  #define	PACKET3_REWIND					0x59  #define	PACKET3_INTERRUPT				0x5A  #define	PACKET3_GEN_PDEPTE				0x5B @@ -306,6 +354,7 @@  #define	PACKET3_GET_LOD_STATS				0x8E  #define	PACKET3_DRAW_MULTI_PREAMBLE			0x8F  #define	PACKET3_FRAME_CONTROL				0x90 +#			define FRAME_TMZ	(1 << 0)  #			define FRAME_CMD(x) ((x) << 28)  			/*  			 * x=0: tmz_begin diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c index 7539104175e8..d7f92634eba2 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v10_0.c @@ -50,15 +50,14 @@ static int psp_v10_0_init_microcode(struct psp_context *psp)  	const char *chip_name;  	char fw_name[30];  	int err = 0; -	const struct psp_firmware_header_v1_0 *hdr;  	const struct ta_firmware_header_v1_0 *ta_hdr;  	DRM_DEBUG("\n");  	switch (adev->asic_type) {  	case CHIP_RAVEN: -		if (adev->rev_id >= 0x8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			chip_name = "raven2"; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			chip_name = "picasso";  		else  			chip_name = "raven"; @@ -66,22 +65,10 @@ static int psp_v10_0_init_microcode(struct psp_context *psp)  	default: BUG();  	} -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); -	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); +	err = psp_init_asd_microcode(psp, chip_name);  	if (err)  		goto out; -	err = amdgpu_ucode_validate(adev->psp.asd_fw); -	if (err) -		goto out; - -	hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; -	adev->psp.asd_fw_version = le32_to_cpu(hdr->header.ucode_version); -	adev->psp.asd_feature_version = le32_to_cpu(hdr->ucode_feature_version); -	adev->psp.asd_ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes); -	adev->psp.asd_start_addr = (uint8_t *)hdr + -				le32_to_cpu(hdr->header.ucode_array_offset_bytes); -  	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);  	err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);  	if (err) { @@ -126,8 +113,6 @@ out:  		dev_err(adev->dev,  			"psp v10.0: Failed to load firmware \"%s\"\n",  			fw_name); -		release_firmware(adev->psp.asd_fw); -		adev->psp.asd_fw = NULL;  	}  	return err; @@ -230,129 +215,6 @@ static int psp_v10_0_ring_destroy(struct psp_context *psp,  	return ret;  } -static int -psp_v10_0_sram_map(struct amdgpu_device *adev, -		   unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, -		   unsigned int *sram_data_reg_offset, -		   enum AMDGPU_UCODE_ID ucode_id) -{ -	int ret = 0; - -	switch(ucode_id) { -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SMC: -		*sram_offset = 0; -		*sram_addr_reg_offset = 0; -		*sram_data_reg_offset = 0; -		break; -#endif - -	case AMDGPU_UCODE_ID_CP_CE: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_PFP: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_ME: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC1: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC2: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_RLC_G: -		*sram_offset = 0x2000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_SDMA0: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_DATA); -		break; - -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SDMA1: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_UVD: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_VCE: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; -#endif - -	case AMDGPU_UCODE_ID_MAXIMUM: -	default: -		ret = -EINVAL; -		break; -	} - -	return ret; -} - -static bool psp_v10_0_compare_sram_data(struct psp_context *psp, -					struct amdgpu_firmware_info *ucode, -					enum AMDGPU_UCODE_ID ucode_type) -{ -	int err = 0; -	unsigned int fw_sram_reg_val = 0; -	unsigned int fw_sram_addr_reg_offset = 0; -	unsigned int fw_sram_data_reg_offset = 0; -	unsigned int ucode_size; -	uint32_t *ucode_mem = NULL; -	struct amdgpu_device *adev = psp->adev; - -	err = psp_v10_0_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset, -				&fw_sram_data_reg_offset, ucode_type); -	if (err) -		return false; - -	WREG32(fw_sram_addr_reg_offset, fw_sram_reg_val); - -	ucode_size = ucode->ucode_size; -	ucode_mem = (uint32_t *)ucode->kaddr; -	while (!ucode_size) { -		fw_sram_reg_val = RREG32(fw_sram_data_reg_offset); - -		if (*ucode_mem != fw_sram_reg_val) -			return false; - -		ucode_mem++; -		/* 4 bytes */ -		ucode_size -= 4; -	} - -	return true; -} - -  static int psp_v10_0_mode1_reset(struct psp_context *psp)  {  	DRM_INFO("psp mode 1 reset not supported now! \n"); @@ -379,7 +241,6 @@ static const struct psp_funcs psp_v10_0_funcs = {  	.ring_create = psp_v10_0_ring_create,  	.ring_stop = psp_v10_0_ring_stop,  	.ring_destroy = psp_v10_0_ring_destroy, -	.compare_sram_data = psp_v10_0_compare_sram_data,  	.mode1_reset = psp_v10_0_mode1_reset,  	.ring_get_wptr = psp_v10_0_ring_get_wptr,  	.ring_set_wptr = psp_v10_0_ring_set_wptr, diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c index 0afd610a1263..1de89cc3c355 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c @@ -75,10 +75,6 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)  	const char *chip_name;  	char fw_name[30];  	int err = 0; -	const struct psp_firmware_header_v1_0 *sos_hdr; -	const struct psp_firmware_header_v1_1 *sos_hdr_v1_1; -	const struct psp_firmware_header_v1_2 *sos_hdr_v1_2; -	const struct psp_firmware_header_v1_0 *asd_hdr;  	const struct ta_firmware_header_v1_0 *ta_hdr;  	DRM_DEBUG("\n"); @@ -103,66 +99,13 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)  		BUG();  	} -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name); -	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); +	err = psp_init_sos_microcode(psp, chip_name);  	if (err) -		goto out; +		return err; -	err = amdgpu_ucode_validate(adev->psp.sos_fw); +	err = psp_init_asd_microcode(psp, chip_name);  	if (err) -		goto out; - -	sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; -	amdgpu_ucode_print_psp_hdr(&sos_hdr->header); - -	switch (sos_hdr->header.header_version_major) { -	case 1: -		adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version); -		adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version); -		adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes); -		adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes); -		adev->psp.sys_start_addr = (uint8_t *)sos_hdr + -				le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes); -		adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + -				le32_to_cpu(sos_hdr->sos_offset_bytes); -		if (sos_hdr->header.header_version_minor == 1) { -			sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data; -			adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes); -			adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr + -					le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes); -			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes); -			adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + -					le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes); -		} -		if (sos_hdr->header.header_version_minor == 2) { -			sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data; -			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes); -			adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr + -						    le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes); -		} -		break; -	default: -		dev_err(adev->dev, -			"Unsupported psp sos firmware\n"); -		err = -EINVAL; -		goto out; -	} - -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); -	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); -	if (err) -		goto out1; - -	err = amdgpu_ucode_validate(adev->psp.asd_fw); -	if (err) -		goto out1; - -	asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; -	adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version); -	adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version); -	adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes); -	adev->psp.asd_start_addr = (uint8_t *)asd_hdr + -				le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes); +		return err;  	switch (adev->asic_type) {  	case CHIP_VEGA20: @@ -194,6 +137,8 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)  	case CHIP_NAVI10:  	case CHIP_NAVI14:  	case CHIP_NAVI12: +		if (amdgpu_sriov_vf(adev)) +			break;  		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name);  		err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev);  		if (err) { @@ -229,15 +174,6 @@ static int psp_v11_0_init_microcode(struct psp_context *psp)  out2:  	release_firmware(adev->psp.ta_fw);  	adev->psp.ta_fw = NULL; -out1: -	release_firmware(adev->psp.asd_fw); -	adev->psp.asd_fw = NULL; -out: -	dev_err(adev->dev, -		"psp v11.0: Failed to load firmware \"%s\"\n", fw_name); -	release_firmware(adev->psp.sos_fw); -	adev->psp.sos_fw = NULL; -  	return err;  } @@ -283,11 +219,8 @@ static int psp_v11_0_bootloader_load_kdb(struct psp_context *psp)  	/* Check tOS sign of life register to confirm sys driver and sOS  	 * are already been loaded.  	 */ -	if (psp_v11_0_is_sos_alive(psp)) { -		psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58); -		dev_info(adev->dev, "sos fw version = 0x%x.\n", psp->sos_fw_version); +	if (psp_v11_0_is_sos_alive(psp))  		return 0; -	}  	ret = psp_v11_0_wait_for_bootloader(psp);  	if (ret) @@ -319,11 +252,8 @@ static int psp_v11_0_bootloader_load_sysdrv(struct psp_context *psp)  	/* Check sOS sign of life register to confirm sys driver and sOS  	 * are already been loaded.  	 */ -	if (psp_v11_0_is_sos_alive(psp)) { -		psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58); -		dev_info(adev->dev, "sos fw version = 0x%x.\n", psp->sos_fw_version); +	if (psp_v11_0_is_sos_alive(psp))  		return 0; -	}  	ret = psp_v11_0_wait_for_bootloader(psp);  	if (ret) @@ -446,13 +376,6 @@ static int psp_v11_0_ring_init(struct psp_context *psp,  	return 0;  } -static bool psp_v11_0_support_vmr_ring(struct psp_context *psp) -{ -	if (amdgpu_sriov_vf(psp->adev) && psp->sos_fw_version > 0x80045) -		return true; -	return false; -} -  static int psp_v11_0_ring_stop(struct psp_context *psp,  			      enum psp_ring_type ring_type)  { @@ -460,7 +383,7 @@ static int psp_v11_0_ring_stop(struct psp_context *psp,  	struct amdgpu_device *adev = psp->adev;  	/* Write the ring destroy command*/ -	if (psp_v11_0_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,  				     GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);  	else @@ -471,7 +394,7 @@ static int psp_v11_0_ring_stop(struct psp_context *psp,  	mdelay(20);  	/* Wait for response flag (bit 31) */ -	if (psp_v11_0_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),  				   0x80000000, 0x80000000, false);  	else @@ -489,7 +412,7 @@ static int psp_v11_0_ring_create(struct psp_context *psp,  	struct psp_ring *ring = &psp->km_ring;  	struct amdgpu_device *adev = psp->adev; -	if (psp_v11_0_support_vmr_ring(psp)) { +	if (amdgpu_sriov_vf(adev)) {  		ret = psp_v11_0_ring_stop(psp, ring_type);  		if (ret) {  			DRM_ERROR("psp_v11_0_ring_stop_sriov failed!\n"); @@ -567,138 +490,6 @@ static int psp_v11_0_ring_destroy(struct psp_context *psp,  	return ret;  } -static int -psp_v11_0_sram_map(struct amdgpu_device *adev, -		  unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, -		  unsigned int *sram_data_reg_offset, -		  enum AMDGPU_UCODE_ID ucode_id) -{ -	int ret = 0; - -	switch (ucode_id) { -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SMC: -		*sram_offset = 0; -		*sram_addr_reg_offset = 0; -		*sram_data_reg_offset = 0; -		break; -#endif - -	case AMDGPU_UCODE_ID_CP_CE: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_PFP: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_ME: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC1: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC2: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_RLC_G: -		*sram_offset = 0x2000; -		if (adev->asic_type < CHIP_NAVI10) { -			*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR); -			*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA); -		} else { -			*sram_addr_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmRLC_GPM_UCODE_ADDR_NV10; -			*sram_data_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmRLC_GPM_UCODE_DATA_NV10; -		} -		break; - -	case AMDGPU_UCODE_ID_SDMA0: -		*sram_offset = 0x0; -		if (adev->asic_type < CHIP_NAVI10) { -			*sram_addr_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_ADDR); -			*sram_data_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_DATA); -		} else { -			*sram_addr_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmSDMA0_UCODE_ADDR_NV10; -			*sram_data_reg_offset = adev->reg_offset[GC_HWIP][0][1] + mmSDMA0_UCODE_DATA_NV10; -		} -		break; - -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SDMA1: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_UVD: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_VCE: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; -#endif - -	case AMDGPU_UCODE_ID_MAXIMUM: -	default: -		ret = -EINVAL; -		break; -	} - -	return ret; -} - -static bool psp_v11_0_compare_sram_data(struct psp_context *psp, -				       struct amdgpu_firmware_info *ucode, -				       enum AMDGPU_UCODE_ID ucode_type) -{ -	int err = 0; -	unsigned int fw_sram_reg_val = 0; -	unsigned int fw_sram_addr_reg_offset = 0; -	unsigned int fw_sram_data_reg_offset = 0; -	unsigned int ucode_size; -	uint32_t *ucode_mem = NULL; -	struct amdgpu_device *adev = psp->adev; - -	err = psp_v11_0_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset, -				&fw_sram_data_reg_offset, ucode_type); -	if (err) -		return false; - -	WREG32(fw_sram_addr_reg_offset, fw_sram_reg_val); - -	ucode_size = ucode->ucode_size; -	ucode_mem = (uint32_t *)ucode->kaddr; -	while (ucode_size) { -		fw_sram_reg_val = RREG32(fw_sram_data_reg_offset); - -		if (*ucode_mem != fw_sram_reg_val) -			return false; - -		ucode_mem++; -		/* 4 bytes */ -		ucode_size -= 4; -	} - -	return true; -} -  static int psp_v11_0_mode1_reset(struct psp_context *psp)  {  	int ret; @@ -733,181 +524,6 @@ static int psp_v11_0_mode1_reset(struct psp_context *psp)  	return 0;  } -/* TODO: Fill in follow functions once PSP firmware interface for XGMI is ready. - * For now, return success and hack the hive_id so high level code can - * start testing - */ -static int psp_v11_0_xgmi_get_topology_info(struct psp_context *psp, -	int number_devices, struct psp_xgmi_topology_info *topology) -{ -	struct ta_xgmi_shared_memory *xgmi_cmd; -	struct ta_xgmi_cmd_get_topology_info_input *topology_info_input; -	struct ta_xgmi_cmd_get_topology_info_output *topology_info_output; -	int i; -	int ret; - -	if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES) -		return -EINVAL; - -	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; -	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); - -	/* Fill in the shared memory with topology information as input */ -	topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info; -	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO; -	topology_info_input->num_nodes = number_devices; - -	for (i = 0; i < topology_info_input->num_nodes; i++) { -		topology_info_input->nodes[i].node_id = topology->nodes[i].node_id; -		topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops; -		topology_info_input->nodes[i].is_sharing_enabled = topology->nodes[i].is_sharing_enabled; -		topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine; -	} - -	/* Invoke xgmi ta to get the topology information */ -	ret = psp_xgmi_invoke(psp, TA_COMMAND_XGMI__GET_GET_TOPOLOGY_INFO); -	if (ret) -		return ret; - -	/* Read the output topology information from the shared memory */ -	topology_info_output = &xgmi_cmd->xgmi_out_message.get_topology_info; -	topology->num_nodes = xgmi_cmd->xgmi_out_message.get_topology_info.num_nodes; -	for (i = 0; i < topology->num_nodes; i++) { -		topology->nodes[i].node_id = topology_info_output->nodes[i].node_id; -		topology->nodes[i].num_hops = topology_info_output->nodes[i].num_hops; -		topology->nodes[i].is_sharing_enabled = topology_info_output->nodes[i].is_sharing_enabled; -		topology->nodes[i].sdma_engine = topology_info_output->nodes[i].sdma_engine; -	} - -	return 0; -} - -static int psp_v11_0_xgmi_set_topology_info(struct psp_context *psp, -	int number_devices, struct psp_xgmi_topology_info *topology) -{ -	struct ta_xgmi_shared_memory *xgmi_cmd; -	struct ta_xgmi_cmd_get_topology_info_input *topology_info_input; -	int i; - -	if (!topology || topology->num_nodes > TA_XGMI__MAX_CONNECTED_NODES) -		return -EINVAL; - -	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; -	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); - -	topology_info_input = &xgmi_cmd->xgmi_in_message.get_topology_info; -	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__SET_TOPOLOGY_INFO; -	topology_info_input->num_nodes = number_devices; - -	for (i = 0; i < topology_info_input->num_nodes; i++) { -		topology_info_input->nodes[i].node_id = topology->nodes[i].node_id; -		topology_info_input->nodes[i].num_hops = topology->nodes[i].num_hops; -		topology_info_input->nodes[i].is_sharing_enabled = 1; -		topology_info_input->nodes[i].sdma_engine = topology->nodes[i].sdma_engine; -	} - -	/* Invoke xgmi ta to set topology information */ -	return psp_xgmi_invoke(psp, TA_COMMAND_XGMI__SET_TOPOLOGY_INFO); -} - -static int psp_v11_0_xgmi_get_hive_id(struct psp_context *psp, uint64_t *hive_id) -{ -	struct ta_xgmi_shared_memory *xgmi_cmd; -	int ret; - -	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; -	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); - -	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_HIVE_ID; - -	/* Invoke xgmi ta to get hive id */ -	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); -	if (ret) -		return ret; - -	*hive_id = xgmi_cmd->xgmi_out_message.get_hive_id.hive_id; - -	return 0; -} - -static int psp_v11_0_xgmi_get_node_id(struct psp_context *psp, uint64_t *node_id) -{ -	struct ta_xgmi_shared_memory *xgmi_cmd; -	int ret; - -	xgmi_cmd = (struct ta_xgmi_shared_memory*)psp->xgmi_context.xgmi_shared_buf; -	memset(xgmi_cmd, 0, sizeof(struct ta_xgmi_shared_memory)); - -	xgmi_cmd->cmd_id = TA_COMMAND_XGMI__GET_NODE_ID; - -	/* Invoke xgmi ta to get the node id */ -	ret = psp_xgmi_invoke(psp, xgmi_cmd->cmd_id); -	if (ret) -		return ret; - -	*node_id = xgmi_cmd->xgmi_out_message.get_node_id.node_id; - -	return 0; -} - -static int psp_v11_0_ras_trigger_error(struct psp_context *psp, -		struct ta_ras_trigger_error_input *info) -{ -	struct ta_ras_shared_memory *ras_cmd; -	int ret; - -	if (!psp->ras.ras_initialized) -		return -EINVAL; - -	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; -	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory)); - -	ras_cmd->cmd_id = TA_RAS_COMMAND__TRIGGER_ERROR; -	ras_cmd->ras_in_message.trigger_error = *info; - -	ret = psp_ras_invoke(psp, ras_cmd->cmd_id); -	if (ret) -		return -EINVAL; - -	/* If err_event_athub occurs error inject was successful, however -	   return status from TA is no long reliable */ -	if (amdgpu_ras_intr_triggered()) -		return 0; - -	return ras_cmd->ras_status; -} - -static int psp_v11_0_ras_cure_posion(struct psp_context *psp, uint64_t *mode_ptr) -{ -#if 0 -	// not support yet. -	struct ta_ras_shared_memory *ras_cmd; -	int ret; - -	if (!psp->ras.ras_initialized) -		return -EINVAL; - -	ras_cmd = (struct ta_ras_shared_memory *)psp->ras.ras_shared_buf; -	memset(ras_cmd, 0, sizeof(struct ta_ras_shared_memory)); - -	ras_cmd->cmd_id = TA_RAS_COMMAND__CURE_POISON; -	ras_cmd->ras_in_message.cure_poison.mode_ptr = mode_ptr; - -	ret = psp_ras_invoke(psp, ras_cmd->cmd_id); -	if (ret) -		return -EINVAL; - -	return ras_cmd->ras_status; -#else -	return -EINVAL; -#endif -} - -static int psp_v11_0_rlc_autoload_start(struct psp_context *psp) -{ -	return psp_rlc_autoload_start(psp); -} -  static int psp_v11_0_memory_training_send_msg(struct psp_context *psp, int msg)  {  	int ret; @@ -1099,7 +715,7 @@ static uint32_t psp_v11_0_ring_get_wptr(struct psp_context *psp)  	uint32_t data;  	struct amdgpu_device *adev = psp->adev; -	if (psp_v11_0_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);  	else  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); @@ -1111,7 +727,7 @@ static void psp_v11_0_ring_set_wptr(struct psp_context *psp, uint32_t value)  {  	struct amdgpu_device *adev = psp->adev; -	if (psp_v11_0_support_vmr_ring(psp)) { +	if (amdgpu_sriov_vf(adev)) {  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);  	} else @@ -1203,16 +819,7 @@ static const struct psp_funcs psp_v11_0_funcs = {  	.ring_create = psp_v11_0_ring_create,  	.ring_stop = psp_v11_0_ring_stop,  	.ring_destroy = psp_v11_0_ring_destroy, -	.compare_sram_data = psp_v11_0_compare_sram_data,  	.mode1_reset = psp_v11_0_mode1_reset, -	.xgmi_get_topology_info = psp_v11_0_xgmi_get_topology_info, -	.xgmi_set_topology_info = psp_v11_0_xgmi_set_topology_info, -	.xgmi_get_hive_id = psp_v11_0_xgmi_get_hive_id, -	.xgmi_get_node_id = psp_v11_0_xgmi_get_node_id, -	.support_vmr_ring = psp_v11_0_support_vmr_ring, -	.ras_trigger_error = psp_v11_0_ras_trigger_error, -	.ras_cure_posion = psp_v11_0_ras_cure_posion, -	.rlc_autoload_start = psp_v11_0_rlc_autoload_start,  	.mem_training_init = psp_v11_0_memory_training_init,  	.mem_training_fini = psp_v11_0_memory_training_fini,  	.mem_training = psp_v11_0_memory_training, diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c index 58d8b6d732e8..6c9614f77d33 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v12_0.c @@ -45,11 +45,7 @@ static int psp_v12_0_init_microcode(struct psp_context *psp)  {  	struct amdgpu_device *adev = psp->adev;  	const char *chip_name; -	char fw_name[30];  	int err = 0; -	const struct psp_firmware_header_v1_0 *asd_hdr; - -	DRM_DEBUG("\n");  	switch (adev->asic_type) {  	case CHIP_RENOIR: @@ -59,28 +55,7 @@ static int psp_v12_0_init_microcode(struct psp_context *psp)  		BUG();  	} -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); -	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); -	if (err) -		goto out1; - -	err = amdgpu_ucode_validate(adev->psp.asd_fw); -	if (err) -		goto out1; - -	asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; -	adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version); -	adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version); -	adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes); -	adev->psp.asd_start_addr = (uint8_t *)asd_hdr + -				le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes); - -	return 0; - -out1: -	release_firmware(adev->psp.asd_fw); -	adev->psp.asd_fw = NULL; - +	err = psp_init_asd_microcode(psp, chip_name);  	return err;  } @@ -95,11 +70,8 @@ static int psp_v12_0_bootloader_load_sysdrv(struct psp_context *psp)  	 * are already been loaded.  	 */  	sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81); -	if (sol_reg) { -		psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58); -		printk("sos fw version = 0x%x.\n", psp->sos_fw_version); +	if (sol_reg)  		return 0; -	}  	/* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */  	ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35), @@ -228,13 +200,6 @@ static int psp_v12_0_ring_init(struct psp_context *psp,  	return 0;  } -static bool psp_v12_0_support_vmr_ring(struct psp_context *psp) -{ -	if (amdgpu_sriov_vf(psp->adev) && psp->sos_fw_version > 0x80045) -		return true; -	return false; -} -  static int psp_v12_0_ring_create(struct psp_context *psp,  				enum psp_ring_type ring_type)  { @@ -243,7 +208,7 @@ static int psp_v12_0_ring_create(struct psp_context *psp,  	struct psp_ring *ring = &psp->km_ring;  	struct amdgpu_device *adev = psp->adev; -	if (psp_v12_0_support_vmr_ring(psp)) { +	if (amdgpu_sriov_vf(psp->adev)) {  		/* Write low address of the ring to C2PMSG_102 */  		psp_ring_reg = lower_32_bits(ring->ring_mem_mc_addr);  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, psp_ring_reg); @@ -295,7 +260,7 @@ static int psp_v12_0_ring_stop(struct psp_context *psp,  	struct amdgpu_device *adev = psp->adev;  	/* Write the ring destroy command*/ -	if (psp_v12_0_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101,  				     GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING);  	else @@ -306,7 +271,7 @@ static int psp_v12_0_ring_stop(struct psp_context *psp,  	mdelay(20);  	/* Wait for response flag (bit 31) */ -	if (psp_v12_0_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101),  				   0x80000000, 0x80000000, false);  	else @@ -334,128 +299,6 @@ static int psp_v12_0_ring_destroy(struct psp_context *psp,  	return ret;  } -static int -psp_v12_0_sram_map(struct amdgpu_device *adev, -		  unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, -		  unsigned int *sram_data_reg_offset, -		  enum AMDGPU_UCODE_ID ucode_id) -{ -	int ret = 0; - -	switch (ucode_id) { -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SMC: -		*sram_offset = 0; -		*sram_addr_reg_offset = 0; -		*sram_data_reg_offset = 0; -		break; -#endif - -	case AMDGPU_UCODE_ID_CP_CE: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_PFP: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_ME: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC1: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC2: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_RLC_G: -		*sram_offset = 0x2000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_SDMA0: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_DATA); -		break; - -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SDMA1: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_UVD: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_VCE: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; -#endif - -	case AMDGPU_UCODE_ID_MAXIMUM: -	default: -		ret = -EINVAL; -		break; -	} - -	return ret; -} - -static bool psp_v12_0_compare_sram_data(struct psp_context *psp, -				       struct amdgpu_firmware_info *ucode, -				       enum AMDGPU_UCODE_ID ucode_type) -{ -	int err = 0; -	unsigned int fw_sram_reg_val = 0; -	unsigned int fw_sram_addr_reg_offset = 0; -	unsigned int fw_sram_data_reg_offset = 0; -	unsigned int ucode_size; -	uint32_t *ucode_mem = NULL; -	struct amdgpu_device *adev = psp->adev; - -	err = psp_v12_0_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset, -				&fw_sram_data_reg_offset, ucode_type); -	if (err) -		return false; - -	WREG32(fw_sram_addr_reg_offset, fw_sram_reg_val); - -	ucode_size = ucode->ucode_size; -	ucode_mem = (uint32_t *)ucode->kaddr; -	while (ucode_size) { -		fw_sram_reg_val = RREG32(fw_sram_data_reg_offset); - -		if (*ucode_mem != fw_sram_reg_val) -			return false; - -		ucode_mem++; -		/* 4 bytes */ -		ucode_size -= 4; -	} - -	return true; -} -  static int psp_v12_0_mode1_reset(struct psp_context *psp)  {  	int ret; @@ -495,7 +338,7 @@ static uint32_t psp_v12_0_ring_get_wptr(struct psp_context *psp)  	uint32_t data;  	struct amdgpu_device *adev = psp->adev; -	if (psp_v12_0_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);  	else  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); @@ -507,7 +350,7 @@ static void psp_v12_0_ring_set_wptr(struct psp_context *psp, uint32_t value)  {  	struct amdgpu_device *adev = psp->adev; -	if (psp_v12_0_support_vmr_ring(psp)) { +	if (amdgpu_sriov_vf(adev)) {  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD);  	} else @@ -522,7 +365,6 @@ static const struct psp_funcs psp_v12_0_funcs = {  	.ring_create = psp_v12_0_ring_create,  	.ring_stop = psp_v12_0_ring_stop,  	.ring_destroy = psp_v12_0_ring_destroy, -	.compare_sram_data = psp_v12_0_compare_sram_data,  	.mode1_reset = psp_v12_0_mode1_reset,  	.ring_get_wptr = psp_v12_0_ring_get_wptr,  	.ring_set_wptr = psp_v12_0_ring_set_wptr, diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c index 735c43c7daab..f2e725f72d2f 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v3_1.c @@ -50,9 +50,6 @@ MODULE_FIRMWARE("amdgpu/vega12_asd.bin");  #define smnMP1_FIRMWARE_FLAGS 0x3010028 -static uint32_t sos_old_versions[] = {1517616, 1510592, 1448594, 1446554}; - -static bool psp_v3_1_support_vmr_ring(struct psp_context *psp);  static int psp_v3_1_ring_stop(struct psp_context *psp,  			      enum psp_ring_type ring_type); @@ -60,9 +57,7 @@ static int psp_v3_1_init_microcode(struct psp_context *psp)  {  	struct amdgpu_device *adev = psp->adev;  	const char *chip_name; -	char fw_name[30];  	int err = 0; -	const struct psp_firmware_header_v1_0 *hdr;  	DRM_DEBUG("\n"); @@ -76,55 +71,15 @@ static int psp_v3_1_init_microcode(struct psp_context *psp)  	default: BUG();  	} -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name); -	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev); -	if (err) -		goto out; - -	err = amdgpu_ucode_validate(adev->psp.sos_fw); +	err = psp_init_sos_microcode(psp, chip_name);  	if (err) -		goto out; - -	hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; -	adev->psp.sos_fw_version = le32_to_cpu(hdr->header.ucode_version); -	adev->psp.sos_feature_version = le32_to_cpu(hdr->ucode_feature_version); -	adev->psp.sos_bin_size = le32_to_cpu(hdr->sos_size_bytes); -	adev->psp.sys_bin_size = le32_to_cpu(hdr->header.ucode_size_bytes) - -					le32_to_cpu(hdr->sos_size_bytes); -	adev->psp.sys_start_addr = (uint8_t *)hdr + -				le32_to_cpu(hdr->header.ucode_array_offset_bytes); -	adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + -				le32_to_cpu(hdr->sos_offset_bytes); - -	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); -	err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); -	if (err) -		goto out; +		return err; -	err = amdgpu_ucode_validate(adev->psp.asd_fw); +	err = psp_init_asd_microcode(psp, chip_name);  	if (err) -		goto out; - -	hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; -	adev->psp.asd_fw_version = le32_to_cpu(hdr->header.ucode_version); -	adev->psp.asd_feature_version = le32_to_cpu(hdr->ucode_feature_version); -	adev->psp.asd_ucode_size = le32_to_cpu(hdr->header.ucode_size_bytes); -	adev->psp.asd_start_addr = (uint8_t *)hdr + -				le32_to_cpu(hdr->header.ucode_array_offset_bytes); +		return err;  	return 0; -out: -	if (err) { -		dev_err(adev->dev, -			"psp v3.1: Failed to load firmware \"%s\"\n", -			fw_name); -		release_firmware(adev->psp.sos_fw); -		adev->psp.sos_fw = NULL; -		release_firmware(adev->psp.asd_fw); -		adev->psp.asd_fw = NULL; -	} - -	return err;  }  static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp) @@ -168,41 +123,19 @@ static int psp_v3_1_bootloader_load_sysdrv(struct psp_context *psp)  	return ret;  } -static bool psp_v3_1_match_version(struct amdgpu_device *adev, uint32_t ver) -{ -	int i; - -	if (ver == adev->psp.sos_fw_version) -		return true; - -	/* -	 * Double check if the latest four legacy versions. -	 * If yes, it is still the right version. -	 */ -	for (i = 0; i < ARRAY_SIZE(sos_old_versions); i++) { -		if (sos_old_versions[i] == adev->psp.sos_fw_version) -			return true; -	} - -	return false; -} -  static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)  {  	int ret;  	unsigned int psp_gfxdrv_command_reg = 0;  	struct amdgpu_device *adev = psp->adev; -	uint32_t sol_reg, ver; +	uint32_t sol_reg;  	/* Check sOS sign of life register to confirm sys driver and sOS  	 * are already been loaded.  	 */  	sol_reg = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81); -	if (sol_reg) { -		psp->sos_fw_version = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58); -		printk("sos fw version = 0x%x.\n", psp->sos_fw_version); +	if (sol_reg)  		return 0; -	}  	/* Wait for bootloader to signify that is ready having bit 31 of C2PMSG_35 set to 1 */  	ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_35), @@ -227,11 +160,6 @@ static int psp_v3_1_bootloader_load_sos(struct psp_context *psp)  	ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_81),  			   RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_81),  			   0, true); - -	ver = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_58); -	if (!psp_v3_1_match_version(adev, ver)) -		DRM_WARN("SOS version doesn't match\n"); -  	return ret;  } @@ -302,7 +230,7 @@ static int psp_v3_1_ring_create(struct psp_context *psp,  	psp_v3_1_reroute_ih(psp); -	if (psp_v3_1_support_vmr_ring(psp)) { +	if (amdgpu_sriov_vf(adev)) {  		ret = psp_v3_1_ring_stop(psp, ring_type);  		if (ret) {  			DRM_ERROR("psp_v3_1_ring_stop_sriov failed!\n"); @@ -360,34 +288,26 @@ static int psp_v3_1_ring_stop(struct psp_context *psp,  			      enum psp_ring_type ring_type)  {  	int ret = 0; -	unsigned int psp_ring_reg = 0;  	struct amdgpu_device *adev = psp->adev; -	if (psp_v3_1_support_vmr_ring(psp)) { -		/* Write the Destroy GPCOM ring command to C2PMSG_101 */ -		psp_ring_reg = GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING; -		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, psp_ring_reg); - -		/* there might be handshake issue which needs delay */ -		mdelay(20); - -		/* Wait for response flag (bit 31) in C2PMSG_101 */ -		ret = psp_wait_for(psp, -				SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101), -				0x80000000, 0x80000000, false); -	} else { -		/* Write the ring destroy command to C2PMSG_64 */ -		psp_ring_reg = 3 << 16; -		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, psp_ring_reg); +	/* Write the ring destroy command*/ +	if (amdgpu_sriov_vf(adev)) +		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, +				     GFX_CTRL_CMD_ID_DESTROY_GPCOM_RING); +	else +		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_64, +				     GFX_CTRL_CMD_ID_DESTROY_RINGS); -		/* there might be handshake issue which needs delay */ -		mdelay(20); +	/* there might be handshake issue with hardware which needs delay */ +	mdelay(20); -		/* Wait for response flag (bit 31) in C2PMSG_64 */ -		ret = psp_wait_for(psp, -				SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), -				0x80000000, 0x80000000, false); -	} +	/* Wait for response flag (bit 31) */ +	if (amdgpu_sriov_vf(adev)) +		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_101), +				   0x80000000, 0x80000000, false); +	else +		ret = psp_wait_for(psp, SOC15_REG_OFFSET(MP0, 0, mmMP0_SMN_C2PMSG_64), +				   0x80000000, 0x80000000, false);  	return ret;  } @@ -410,128 +330,6 @@ static int psp_v3_1_ring_destroy(struct psp_context *psp,  	return ret;  } -static int -psp_v3_1_sram_map(struct amdgpu_device *adev, -		  unsigned int *sram_offset, unsigned int *sram_addr_reg_offset, -		  unsigned int *sram_data_reg_offset, -		  enum AMDGPU_UCODE_ID ucode_id) -{ -	int ret = 0; - -	switch(ucode_id) { -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SMC: -		*sram_offset = 0; -		*sram_addr_reg_offset = 0; -		*sram_data_reg_offset = 0; -		break; -#endif - -	case AMDGPU_UCODE_ID_CP_CE: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_CE_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_PFP: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_PFP_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_ME: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_ME_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC1: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_MEC_ME1_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_CP_MEC2: -		*sram_offset = 0x10000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmCP_HYP_MEC2_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_RLC_G: -		*sram_offset = 0x2000; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(GC, 0, mmRLC_GPM_UCODE_DATA); -		break; - -	case AMDGPU_UCODE_ID_SDMA0: -		*sram_offset = 0x0; -		*sram_addr_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_ADDR); -		*sram_data_reg_offset = SOC15_REG_OFFSET(SDMA0, 0, mmSDMA0_UCODE_DATA); -		break; - -/* TODO: needs to confirm */ -#if 0 -	case AMDGPU_UCODE_ID_SDMA1: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_UVD: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; - -	case AMDGPU_UCODE_ID_VCE: -		*sram_offset = ; -		*sram_addr_reg_offset = ; -		break; -#endif - -	case AMDGPU_UCODE_ID_MAXIMUM: -	default: -		ret = -EINVAL; -		break; -	} - -	return ret; -} - -static bool psp_v3_1_compare_sram_data(struct psp_context *psp, -				       struct amdgpu_firmware_info *ucode, -				       enum AMDGPU_UCODE_ID ucode_type) -{ -	int err = 0; -	unsigned int fw_sram_reg_val = 0; -	unsigned int fw_sram_addr_reg_offset = 0; -	unsigned int fw_sram_data_reg_offset = 0; -	unsigned int ucode_size; -	uint32_t *ucode_mem = NULL; -	struct amdgpu_device *adev = psp->adev; - -	err = psp_v3_1_sram_map(adev, &fw_sram_reg_val, &fw_sram_addr_reg_offset, -				&fw_sram_data_reg_offset, ucode_type); -	if (err) -		return false; - -	WREG32(fw_sram_addr_reg_offset, fw_sram_reg_val); - -	ucode_size = ucode->ucode_size; -	ucode_mem = (uint32_t *)ucode->kaddr; -	while (ucode_size) { -		fw_sram_reg_val = RREG32(fw_sram_data_reg_offset); - -		if (*ucode_mem != fw_sram_reg_val) -			return false; - -		ucode_mem++; -		/* 4 bytes */ -		ucode_size -= 4; -	} - -	return true; -} -  static bool psp_v3_1_smu_reload_quirk(struct psp_context *psp)  {  	struct amdgpu_device *adev = psp->adev; @@ -575,20 +373,12 @@ static int psp_v3_1_mode1_reset(struct psp_context *psp)  	return 0;  } -static bool psp_v3_1_support_vmr_ring(struct psp_context *psp) -{ -	if (amdgpu_sriov_vf(psp->adev)) -		return true; - -	return false; -} -  static uint32_t psp_v3_1_ring_get_wptr(struct psp_context *psp)  {  	uint32_t data;  	struct amdgpu_device *adev = psp->adev; -	if (psp_v3_1_support_vmr_ring(psp)) +	if (amdgpu_sriov_vf(adev))  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102);  	else  		data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); @@ -599,7 +389,7 @@ static void psp_v3_1_ring_set_wptr(struct psp_context *psp, uint32_t value)  {  	struct amdgpu_device *adev = psp->adev; -	if (psp_v3_1_support_vmr_ring(psp)) { +	if (amdgpu_sriov_vf(adev)) {  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value);  		/* send interrupt to PSP for SRIOV ring write pointer update */  		WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, @@ -616,10 +406,8 @@ static const struct psp_funcs psp_v3_1_funcs = {  	.ring_create = psp_v3_1_ring_create,  	.ring_stop = psp_v3_1_ring_stop,  	.ring_destroy = psp_v3_1_ring_destroy, -	.compare_sram_data = psp_v3_1_compare_sram_data,  	.smu_reload_quirk = psp_v3_1_smu_reload_quirk,  	.mode1_reset = psp_v3_1_mode1_reset, -	.support_vmr_ring = psp_v3_1_support_vmr_ring,  	.ring_get_wptr = psp_v3_1_ring_get_wptr,  	.ring_set_wptr = psp_v3_1_ring_set_wptr,  }; diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c index 7d509a40076f..5f304d61999e 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c @@ -355,8 +355,6 @@ static void sdma_v2_4_gfx_stop(struct amdgpu_device *adev)  		ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);  	} -	sdma0->sched.ready = false; -	sdma1->sched.ready = false;  }  /** @@ -614,7 +612,8 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err0; @@ -874,7 +873,8 @@ static int sdma_v2_4_sw_init(void *handle)  				     &adev->sdma.trap_irq,  				     (i == 0) ?  				     AMDGPU_SDMA_IRQ_INSTANCE0 : -				     AMDGPU_SDMA_IRQ_INSTANCE1); +				     AMDGPU_SDMA_IRQ_INSTANCE1, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -1200,7 +1200,8 @@ static void sdma_v2_4_set_irq_funcs(struct amdgpu_device *adev)  static void sdma_v2_4_emit_copy_buffer(struct amdgpu_ib *ib,  				       uint64_t src_offset,  				       uint64_t dst_offset, -				       uint32_t byte_count) +				       uint32_t byte_count, +				       bool tmz)  {  	ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) |  		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c index b6109a99fc43..c59f6f6f4c09 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c @@ -529,8 +529,6 @@ static void sdma_v3_0_gfx_stop(struct amdgpu_device *adev)  		ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);  		WREG32(mmSDMA0_GFX_IB_CNTL + sdma_offsets[i], ib_cntl);  	} -	sdma0->sched.ready = false; -	sdma1->sched.ready = false;  }  /** @@ -886,7 +884,8 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err0; @@ -1158,7 +1157,8 @@ static int sdma_v3_0_sw_init(void *handle)  				     &adev->sdma.trap_irq,  				     (i == 0) ?  				     AMDGPU_SDMA_IRQ_INSTANCE0 : -				     AMDGPU_SDMA_IRQ_INSTANCE1); +				     AMDGPU_SDMA_IRQ_INSTANCE1, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -1638,7 +1638,8 @@ static void sdma_v3_0_set_irq_funcs(struct amdgpu_device *adev)  static void sdma_v3_0_emit_copy_buffer(struct amdgpu_ib *ib,  				       uint64_t src_offset,  				       uint64_t dst_offset, -				       uint32_t byte_count) +				       uint32_t byte_count, +				       bool tmz)  {  	ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) |  		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c index 5f3a5ee2a3f4..33501c6c7189 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c @@ -115,17 +115,21 @@ static const struct soc15_reg_golden golden_settings_sdma_4[] = {  static const struct soc15_reg_golden golden_settings_sdma_vg10[] = {  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0018773f, 0x00104002),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002), +	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0018773f, 0x00104002), -	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002) +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104002), +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  };  static const struct soc15_reg_golden golden_settings_sdma_vg12[] = {  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0018773f, 0x00104001),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104001), +	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831d07),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0018773f, 0x00104001), -	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104001) +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0018773f, 0x00104001), +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  };  static const struct soc15_reg_golden golden_settings_sdma_4_1[] = { @@ -174,6 +178,7 @@ static const struct soc15_reg_golden golden_settings_sdma0_4_2[] =  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_PAGE, 0x000003ff, 0x000003c0), +	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  };  static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = { @@ -203,6 +208,7 @@ static const struct soc15_reg_golden golden_settings_sdma1_4_2[] = {  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_RPTR_ADDR_LO, 0xfffffffd, 0x00000001),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_PAGE, 0x000003ff, 0x000003c0), +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  };  static const struct soc15_reg_golden golden_settings_sdma_rv1[] = @@ -222,27 +228,35 @@ static const struct soc15_reg_golden golden_settings_sdma_arct[] =  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA0, 0, mmSDMA0_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA1, 0, mmSDMA1_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA2, 0, mmSDMA2_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA2, 0, mmSDMA2_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA2, 0, mmSDMA2_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA2, 0, mmSDMA2_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA3, 0, mmSDMA3_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA3, 0, mmSDMA3_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA3, 0, mmSDMA3_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA3, 0, mmSDMA3_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA4, 0, mmSDMA4_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA4, 0, mmSDMA4_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA4, 0, mmSDMA4_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA4, 0, mmSDMA4_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA5, 0, mmSDMA5_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA5, 0, mmSDMA5_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA5, 0, mmSDMA5_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA5, 0, mmSDMA5_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA6, 0, mmSDMA6_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA6, 0, mmSDMA6_GB_ADDR_CONFIG, 0x0000773f, 0x00004002),  	SOC15_REG_GOLDEN_VALUE(SDMA6, 0, mmSDMA6_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA6, 0, mmSDMA6_UTCL1_TIMEOUT, 0xffffffff, 0x00010001),  	SOC15_REG_GOLDEN_VALUE(SDMA7, 0, mmSDMA7_CHICKEN_BITS, 0xfe931f07, 0x02831f07),  	SOC15_REG_GOLDEN_VALUE(SDMA7, 0, mmSDMA7_GB_ADDR_CONFIG, 0x0000773f, 0x00004002), -	SOC15_REG_GOLDEN_VALUE(SDMA7, 0, mmSDMA7_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002) +	SOC15_REG_GOLDEN_VALUE(SDMA7, 0, mmSDMA7_GB_ADDR_CONFIG_READ, 0x0000773f, 0x00004002), +	SOC15_REG_GOLDEN_VALUE(SDMA7, 0, mmSDMA7_UTCL1_TIMEOUT, 0xffffffff, 0x00010001)  };  static const struct soc15_reg_golden golden_settings_sdma_4_3[] = { @@ -472,7 +486,7 @@ static void sdma_v4_0_init_golden_registers(struct amdgpu_device *adev)  		soc15_program_register_sequence(adev,  						golden_settings_sdma_4_1,  						ARRAY_SIZE(golden_settings_sdma_4_1)); -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			soc15_program_register_sequence(adev,  							golden_settings_sdma_rv2,  							ARRAY_SIZE(golden_settings_sdma_rv2)); @@ -561,9 +575,9 @@ static int sdma_v4_0_init_microcode(struct amdgpu_device *adev)  		chip_name = "vega20";  		break;  	case CHIP_RAVEN: -		if (adev->rev_id >= 8) +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			chip_name = "raven2"; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			chip_name = "picasso";  		else  			chip_name = "raven"; @@ -923,8 +937,6 @@ static void sdma_v4_0_gfx_stop(struct amdgpu_device *adev)  		ib_cntl = RREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL);  		ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);  		WREG32_SDMA(i, mmSDMA0_GFX_IB_CNTL, ib_cntl); - -		sdma[i]->sched.ready = false;  	}  } @@ -971,8 +983,6 @@ static void sdma_v4_0_page_stop(struct amdgpu_device *adev)  		ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_PAGE_IB_CNTL,  					IB_ENABLE, 0);  		WREG32_SDMA(i, mmSDMA0_PAGE_IB_CNTL, ib_cntl); - -		sdma[i]->sched.ready = false;  	}  } @@ -1539,7 +1549,8 @@ static int sdma_v4_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err0; @@ -1840,7 +1851,7 @@ static int sdma_v4_0_sw_init(void *handle)  		ring->ring_obj = NULL;  		ring->use_doorbell = true; -		DRM_INFO("use_doorbell being set to: [%s]\n", +		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 */ @@ -1848,7 +1859,8 @@ static int sdma_v4_0_sw_init(void *handle)  		sprintf(ring->name, "sdma%d", i);  		r = amdgpu_ring_init(adev, ring, 1024, &adev->sdma.trap_irq, -				     AMDGPU_SDMA_IRQ_INSTANCE0 + i); +				     AMDGPU_SDMA_IRQ_INSTANCE0 + i, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r; @@ -1866,7 +1878,8 @@ static int sdma_v4_0_sw_init(void *handle)  			sprintf(ring->name, "page%d", i);  			r = amdgpu_ring_init(adev, ring, 1024,  					     &adev->sdma.trap_irq, -					     AMDGPU_SDMA_IRQ_INSTANCE0 + i); +					     AMDGPU_SDMA_IRQ_INSTANCE0 + i, +					     AMDGPU_RING_PRIO_DEFAULT);  			if (r)  				return r;  		} @@ -2445,10 +2458,12 @@ static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev)  static void sdma_v4_0_emit_copy_buffer(struct amdgpu_ib *ib,  				       uint64_t src_offset,  				       uint64_t dst_offset, -				       uint32_t byte_count) +				       uint32_t byte_count, +				       bool tmz)  {  	ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) | -		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); +		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR) | +		SDMA_PKT_COPY_LINEAR_HEADER_TMZ(tmz ? 1 : 0);  	ib->ptr[ib->length_dw++] = byte_count - 1;  	ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */  	ib->ptr[ib->length_dw++] = lower_32_bits(src_offset); diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c index ebfd2cdf4e65..b544baf306f2 100644 --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c @@ -88,6 +88,29 @@ static const struct soc15_reg_golden golden_settings_sdma_5[] = {  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_UTCL1_PAGE, 0x00ffffff, 0x000c5c00)  }; +static const struct soc15_reg_golden golden_settings_sdma_5_sriov[] = { +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_GFX_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_PAGE_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC0_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC1_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC2_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC3_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC4_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC5_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC6_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_GFX_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_PAGE_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC0_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC1_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC2_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC3_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC4_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC5_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC6_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC7_RB_WPTR_POLL_CNTL, 0xfffffff7, 0x00403000), +}; +  static const struct soc15_reg_golden golden_settings_sdma_nv10[] = {  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA0_RLC3_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000),  	SOC15_REG_GOLDEN_VALUE(GC, 0, mmSDMA1_RLC3_RB_WPTR_POLL_CNTL, 0x0000fff0, 0x00403000), @@ -141,9 +164,14 @@ static void sdma_v5_0_init_golden_registers(struct amdgpu_device *adev)  						(const u32)ARRAY_SIZE(golden_settings_sdma_nv14));  		break;  	case CHIP_NAVI12: -		soc15_program_register_sequence(adev, -						golden_settings_sdma_5, -						(const u32)ARRAY_SIZE(golden_settings_sdma_5)); +		if (amdgpu_sriov_vf(adev)) +			soc15_program_register_sequence(adev, +							golden_settings_sdma_5_sriov, +							(const u32)ARRAY_SIZE(golden_settings_sdma_5_sriov)); +		else +			soc15_program_register_sequence(adev, +							golden_settings_sdma_5, +							(const u32)ARRAY_SIZE(golden_settings_sdma_5));  		soc15_program_register_sequence(adev,  						golden_settings_sdma_nv12,  						(const u32)ARRAY_SIZE(golden_settings_sdma_nv12)); @@ -382,6 +410,18 @@ static void sdma_v5_0_ring_emit_ib(struct amdgpu_ring *ring,  	unsigned vmid = AMDGPU_JOB_GET_VMID(job);  	uint64_t csa_mc_addr = amdgpu_sdma_get_csa_mc_addr(ring, vmid); +	/* Invalidate L2, because if we don't do it, we might get stale cache +	 * lines from previous IBs. +	 */ +	amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_GCR_REQ)); +	amdgpu_ring_write(ring, 0); +	amdgpu_ring_write(ring, (SDMA_GCR_GL2_INV | +				 SDMA_GCR_GL2_WB | +				 SDMA_GCR_GLM_INV | +				 SDMA_GCR_GLM_WB) << 16); +	amdgpu_ring_write(ring, 0xffffff80); +	amdgpu_ring_write(ring, 0xffff); +  	/* An IB packet must end on a 8 DW boundary--the next dword  	 * must be on a 8-dword boundary. Our IB packet below is 6  	 * dwords long, thus add x number of NOPs, such that, in @@ -502,9 +542,6 @@ static void sdma_v5_0_gfx_stop(struct amdgpu_device *adev)  		ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0);  		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl);  	} - -	sdma0->sched.ready = false; -	sdma1->sched.ready = false;  }  /** @@ -529,7 +566,7 @@ static void sdma_v5_0_rlc_stop(struct amdgpu_device *adev)   */  static void sdma_v5_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)  { -	u32 f32_cntl, phase_quantum = 0; +	u32 f32_cntl = 0, phase_quantum = 0;  	int i;  	if (amdgpu_sdma_phase_quantum) { @@ -557,9 +594,12 @@ static void sdma_v5_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)  	}  	for (i = 0; i < adev->sdma.num_instances; i++) { -		f32_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL)); -		f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL, -				AUTO_CTXSW_ENABLE, enable ? 1 : 0); +		if (!amdgpu_sriov_vf(adev)) { +			f32_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL)); +			f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_CNTL, +						 AUTO_CTXSW_ENABLE, enable ? 1 : 0); +		} +  		if (enable && amdgpu_sdma_phase_quantum) {  			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE0_QUANTUM),  			       phase_quantum); @@ -568,7 +608,8 @@ static void sdma_v5_0_ctx_switch_enable(struct amdgpu_device *adev, bool enable)  			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE2_QUANTUM),  			       phase_quantum);  		} -		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL), f32_cntl); +		if (!amdgpu_sriov_vf(adev)) +			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL), f32_cntl);  	}  } @@ -591,6 +632,9 @@ static void sdma_v5_0_enable(struct amdgpu_device *adev, bool enable)  		sdma_v5_0_rlc_stop(adev);  	} +	if (amdgpu_sriov_vf(adev)) +		return; +  	for (i = 0; i < adev->sdma.num_instances; i++) {  		f32_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_F32_CNTL));  		f32_cntl = REG_SET_FIELD(f32_cntl, SDMA0_F32_CNTL, HALT, enable ? 0 : 1); @@ -623,7 +667,8 @@ static int sdma_v5_0_gfx_resume(struct amdgpu_device *adev)  		ring = &adev->sdma.instance[i].ring;  		wb_offset = (ring->rptr_offs * 4); -		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL), 0); +		if (!amdgpu_sriov_vf(adev)) +			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_SEM_WAIT_FAIL_TIMER_CNTL), 0);  		/* Set ring buffer size in dwords */  		rb_bufsz = order_base_2(ring->ring_size / 4); @@ -699,26 +744,28 @@ static int sdma_v5_0_gfx_resume(struct amdgpu_device *adev)  		/* set minor_ptr_update to 0 after wptr programed */  		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 0); -		/* set utc l1 enable flag always to 1 */ -		temp = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL)); -		temp = REG_SET_FIELD(temp, SDMA0_CNTL, UTC_L1_ENABLE, 1); - -		/* enable MCBP */ -		temp = REG_SET_FIELD(temp, SDMA0_CNTL, MIDCMD_PREEMPT_ENABLE, 1); -		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL), temp); - -		/* Set up RESP_MODE to non-copy addresses */ -		temp = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_CNTL)); -		temp = REG_SET_FIELD(temp, SDMA0_UTCL1_CNTL, RESP_MODE, 3); -		temp = REG_SET_FIELD(temp, SDMA0_UTCL1_CNTL, REDO_DELAY, 9); -		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_CNTL), temp); - -		/* program default cache read and write policy */ -		temp = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_PAGE)); -		/* clean read policy and write policy bits */ -		temp &= 0xFF0FFF; -		temp |= ((CACHE_READ_POLICY_L2__DEFAULT << 12) | (CACHE_WRITE_POLICY_L2__DEFAULT << 14)); -		WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_PAGE), temp); +		if (!amdgpu_sriov_vf(adev)) { +			/* set utc l1 enable flag always to 1 */ +			temp = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL)); +			temp = REG_SET_FIELD(temp, SDMA0_CNTL, UTC_L1_ENABLE, 1); + +			/* enable MCBP */ +			temp = REG_SET_FIELD(temp, SDMA0_CNTL, MIDCMD_PREEMPT_ENABLE, 1); +			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_CNTL), temp); + +			/* Set up RESP_MODE to non-copy addresses */ +			temp = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_CNTL)); +			temp = REG_SET_FIELD(temp, SDMA0_UTCL1_CNTL, RESP_MODE, 3); +			temp = REG_SET_FIELD(temp, SDMA0_UTCL1_CNTL, REDO_DELAY, 9); +			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_CNTL), temp); + +			/* program default cache read and write policy */ +			temp = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_PAGE)); +			/* clean read policy and write policy bits */ +			temp &= 0xFF0FFF; +			temp |= ((CACHE_READ_POLICY_L2__DEFAULT << 12) | (CACHE_WRITE_POLICY_L2__DEFAULT << 14)); +			WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_UTCL1_PAGE), temp); +		}  		if (!amdgpu_sriov_vf(adev)) {  			/* unhalt engine */ @@ -948,7 +995,8 @@ static int sdma_v5_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r) {  		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);  		goto err0; @@ -1224,7 +1272,7 @@ static int sdma_v5_0_sw_init(void *handle)  		ring->ring_obj = NULL;  		ring->use_doorbell = true; -		DRM_INFO("use_doorbell being set to: [%s]\n", +		DRM_DEBUG("SDMA %d use_doorbell being set to: [%s]\n", i,  				ring->use_doorbell?"true":"false");  		ring->doorbell_index = (i == 0) ? @@ -1236,7 +1284,8 @@ static int sdma_v5_0_sw_init(void *handle)  				     &adev->sdma.trap_irq,  				     (i == 0) ?  				     AMDGPU_SDMA_IRQ_INSTANCE0 : -				     AMDGPU_SDMA_IRQ_INSTANCE1); +				     AMDGPU_SDMA_IRQ_INSTANCE1, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -1387,14 +1436,16 @@ static int sdma_v5_0_set_trap_irq_state(struct amdgpu_device *adev,  {  	u32 sdma_cntl; -	u32 reg_offset = (type == AMDGPU_SDMA_IRQ_INSTANCE0) ? -		sdma_v5_0_get_reg_offset(adev, 0, mmSDMA0_CNTL) : -		sdma_v5_0_get_reg_offset(adev, 1, mmSDMA0_CNTL); +	if (!amdgpu_sriov_vf(adev)) { +		u32 reg_offset = (type == AMDGPU_SDMA_IRQ_INSTANCE0) ? +			sdma_v5_0_get_reg_offset(adev, 0, mmSDMA0_CNTL) : +			sdma_v5_0_get_reg_offset(adev, 1, mmSDMA0_CNTL); -	sdma_cntl = RREG32(reg_offset); -	sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE, -		       state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); -	WREG32(reg_offset, sdma_cntl); +		sdma_cntl = RREG32(reg_offset); +		sdma_cntl = REG_SET_FIELD(sdma_cntl, SDMA0_CNTL, TRAP_ENABLE, +					  state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); +		WREG32(reg_offset, sdma_cntl); +	}  	return 0;  } @@ -1595,7 +1646,7 @@ static const struct amdgpu_ring_funcs sdma_v5_0_ring_funcs = {  		SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +  		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 * 2 +  		10 + 10 + 10, /* sdma_v5_0_ring_emit_fence x3 for user fence, vm fence */ -	.emit_ib_size = 7 + 6, /* sdma_v5_0_ring_emit_ib */ +	.emit_ib_size = 5 + 7 + 6, /* sdma_v5_0_ring_emit_ib */  	.emit_ib = sdma_v5_0_ring_emit_ib,  	.emit_fence = sdma_v5_0_ring_emit_fence,  	.emit_pipeline_sync = sdma_v5_0_ring_emit_pipeline_sync, @@ -1655,10 +1706,12 @@ static void sdma_v5_0_set_irq_funcs(struct amdgpu_device *adev)  static void sdma_v5_0_emit_copy_buffer(struct amdgpu_ib *ib,  				       uint64_t src_offset,  				       uint64_t dst_offset, -				       uint32_t byte_count) +				       uint32_t byte_count, +				       bool tmz)  {  	ib->ptr[ib->length_dw++] = SDMA_PKT_HEADER_OP(SDMA_OP_COPY) | -		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR); +		SDMA_PKT_HEADER_SUB_OP(SDMA_SUBOP_COPY_LINEAR) | +		SDMA_PKT_COPY_LINEAR_HEADER_TMZ(tmz ? 1 : 0);  	ib->ptr[ib->length_dw++] = byte_count - 1;  	ib->ptr[ib->length_dw++] = 0; /* src/dst endian swap */  	ib->ptr[ib->length_dw++] = lower_32_bits(src_offset); diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c index 4d415bfdb42f..153db3f763bc 100644 --- a/drivers/gpu/drm/amd/amdgpu/si.c +++ b/drivers/gpu/drm/amd/amdgpu/si.c @@ -1249,12 +1249,6 @@ static int si_set_uvd_clocks(struct amdgpu_device *adev, u32 vclk, u32 dclk)  	return 0;  } -static void si_detect_hw_virtualization(struct amdgpu_device *adev) -{ -	if (is_virtual_machine()) /* passthrough mode */ -		adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -} -  static void si_flush_hdp(struct amdgpu_device *adev, struct amdgpu_ring *ring)  {  	if (!ring || !ring->funcs->emit_wreg) { @@ -2165,8 +2159,6 @@ static const struct amdgpu_ip_block_version si_common_ip_block =  int si_set_ip_blocks(struct amdgpu_device *adev)  { -	si_detect_hw_virtualization(adev); -  	switch (adev->asic_type) {  	case CHIP_VERDE:  	case CHIP_TAHITI: diff --git a/drivers/gpu/drm/amd/amdgpu/si_dma.c b/drivers/gpu/drm/amd/amdgpu/si_dma.c index 42d5601b6bf3..7d2bbcbe547b 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dma.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dma.c @@ -124,7 +124,6 @@ static void si_dma_stop(struct amdgpu_device *adev)  		if (adev->mman.buffer_funcs_ring == ring)  			amdgpu_ttm_set_buffer_funcs_status(adev, false); -		ring->sched.ready = false;  	}  } @@ -267,7 +266,8 @@ static int si_dma_ring_test_ib(struct amdgpu_ring *ring, long timeout)  	tmp = 0xCAFEDEAD;  	adev->wb.wb[index] = cpu_to_le32(tmp);  	memset(&ib, 0, sizeof(ib)); -	r = amdgpu_ib_get(adev, NULL, 256, &ib); +	r = amdgpu_ib_get(adev, NULL, 256, +					AMDGPU_IB_POOL_DIRECT, &ib);  	if (r)  		goto err0; @@ -504,7 +504,8 @@ static int si_dma_sw_init(void *handle)  				     &adev->sdma.trap_irq,  				     (i == 0) ?  				     AMDGPU_SDMA_IRQ_INSTANCE0 : -				     AMDGPU_SDMA_IRQ_INSTANCE1); +				     AMDGPU_SDMA_IRQ_INSTANCE1, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -775,7 +776,8 @@ static void si_dma_set_irq_funcs(struct amdgpu_device *adev)  static void si_dma_emit_copy_buffer(struct amdgpu_ib *ib,  				       uint64_t src_offset,  				       uint64_t dst_offset, -				       uint32_t byte_count) +				       uint32_t byte_count, +				       bool tmz)  {  	ib->ptr[ib->length_dw++] = DMA_PACKET(DMA_PACKET_COPY,  					      1, 0, 0, byte_count); diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c index 0860e85a2d35..c00ba4b23c9a 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c @@ -345,26 +345,6 @@ static const struct si_dte_data dte_data_tahiti =  	false  }; -#if 0 -static const struct si_dte_data dte_data_tahiti_le = -{ -	{ 0x1E8480, 0x7A1200, 0x2160EC0, 0x3938700, 0 }, -	{ 0x7D, 0x7D, 0x4E4, 0xB00, 0 }, -	0x5, -	0xAFC8, -	0x64, -	0x32, -	1, -	0, -	0x10, -	{ 0x78, 0x7C, 0x82, 0x88, 0x8E, 0x94, 0x9A, 0xA0, 0xA6, 0xAC, 0xB0, 0xB4, 0xB8, 0xBC, 0xC0, 0xC4 }, -	{ 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700, 0x3938700 }, -	{ 0x2AF8, 0x2AF8, 0x29BB, 0x27F9, 0x2637, 0x2475, 0x22B3, 0x20F1, 0x1F2F, 0x1D6D, 0x1734, 0x1414, 0x10F4, 0xDD4, 0xAB4, 0x794 }, -	85, -	true -}; -#endif -  static const struct si_dte_data dte_data_tahiti_pro =  {  	{ 0x1E8480, 0x3D0900, 0x989680, 0x2625A00, 0x0 }, diff --git a/drivers/gpu/drm/amd/amdgpu/soc15.c b/drivers/gpu/drm/amd/amdgpu/soc15.c index a40499d51c93..c7c9e07962b9 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15.c +++ b/drivers/gpu/drm/amd/amdgpu/soc15.c @@ -564,19 +564,16 @@ soc15_asic_reset_method(struct amdgpu_device *adev)  static int soc15_asic_reset(struct amdgpu_device *adev)  {  	/* original raven doesn't have full asic reset */ -	if (adev->pdev->device == 0x15dd && adev->rev_id < 0x8) +	if ((adev->apu_flags & AMD_APU_IS_RAVEN) && +	    !(adev->apu_flags & AMD_APU_IS_RAVEN2))  		return 0;  	switch (soc15_asic_reset_method(adev)) {  		case AMD_RESET_METHOD_BACO: -			if (!adev->in_suspend) -				amdgpu_inc_vram_lost(adev);  			return soc15_asic_baco_reset(adev);  		case AMD_RESET_METHOD_MODE2:  			return amdgpu_dpm_mode2_reset(adev);  		default: -			if (!adev->in_suspend) -				amdgpu_inc_vram_lost(adev);  			return soc15_asic_mode1_reset(adev);  	}  } @@ -712,7 +709,6 @@ int soc15_set_ip_blocks(struct amdgpu_device *adev)  		adev->df.funcs = &df_v1_7_funcs;  	adev->rev_id = soc15_get_rev_id(adev); -	adev->nbio.funcs->detect_hw_virt(adev);  	if (amdgpu_sriov_vf(adev))  		adev->virt.ops = &xgpu_ai_virt_ops; @@ -1134,16 +1130,23 @@ static int soc15_common_early_init(void *handle)  		break;  	case CHIP_RAVEN:  		adev->asic_funcs = &soc15_asic_funcs; +		if (adev->pdev->device == 0x15dd) +			adev->apu_flags |= AMD_APU_IS_RAVEN; +		if (adev->pdev->device == 0x15d8) +			adev->apu_flags |= AMD_APU_IS_PICASSO;  		if (adev->rev_id >= 0x8) +			adev->apu_flags |= AMD_APU_IS_RAVEN2; + +		if (adev->apu_flags & AMD_APU_IS_RAVEN2)  			adev->external_rev_id = adev->rev_id + 0x79; -		else if (adev->pdev->device == 0x15d8) +		else if (adev->apu_flags & AMD_APU_IS_PICASSO)  			adev->external_rev_id = adev->rev_id + 0x41;  		else if (adev->rev_id == 1)  			adev->external_rev_id = adev->rev_id + 0x20;  		else  			adev->external_rev_id = adev->rev_id + 0x01; -		if (adev->rev_id >= 0x8) { +		if (adev->apu_flags & AMD_APU_IS_RAVEN2) {  			adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |  				AMD_CG_SUPPORT_GFX_MGLS |  				AMD_CG_SUPPORT_GFX_CP_LS | @@ -1161,7 +1164,7 @@ static int soc15_common_early_init(void *handle)  				AMD_CG_SUPPORT_VCN_MGCG;  			adev->pg_flags = AMD_PG_SUPPORT_SDMA | AMD_PG_SUPPORT_VCN; -		} else if (adev->pdev->device == 0x15d8) { +		} else if (adev->apu_flags & AMD_APU_IS_PICASSO) {  			adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |  				AMD_CG_SUPPORT_GFX_MGLS |  				AMD_CG_SUPPORT_GFX_CP_LS | @@ -1222,11 +1225,12 @@ static int soc15_common_early_init(void *handle)  			AMD_CG_SUPPORT_IH_CG |  			AMD_CG_SUPPORT_VCN_MGCG |  			AMD_CG_SUPPORT_JPEG_MGCG; -		adev->pg_flags = 0; +		adev->pg_flags = AMD_PG_SUPPORT_VCN | AMD_PG_SUPPORT_VCN_DPG;  		adev->external_rev_id = adev->rev_id + 0x32;  		break;  	case CHIP_RENOIR:  		adev->asic_funcs = &soc15_asic_funcs; +		adev->apu_flags |= AMD_APU_IS_RENOIR;  		adev->cg_flags = AMD_CG_SUPPORT_GFX_MGCG |  				 AMD_CG_SUPPORT_GFX_MGLS |  				 AMD_CG_SUPPORT_GFX_3D_CGCG | diff --git a/drivers/gpu/drm/amd/amdgpu/soc15_common.h b/drivers/gpu/drm/amd/amdgpu/soc15_common.h index c893c645a4b2..56d02aa690a7 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15_common.h +++ b/drivers/gpu/drm/amd/amdgpu/soc15_common.h @@ -35,6 +35,9 @@  #define RREG32_SOC15(ip, inst, reg) \  	RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) +#define RREG32_SOC15_NO_KIQ(ip, inst, reg) \ +	RREG32_NO_KIQ(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) +  #define RREG32_SOC15_OFFSET(ip, inst, reg, offset) \  	RREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset) diff --git a/drivers/gpu/drm/amd/amdgpu/soc15d.h b/drivers/gpu/drm/amd/amdgpu/soc15d.h index edfe50821cd9..799925d22fc8 100644 --- a/drivers/gpu/drm/amd/amdgpu/soc15d.h +++ b/drivers/gpu/drm/amd/amdgpu/soc15d.h @@ -253,7 +253,30 @@  #              define PACKET3_DMA_DATA_CMD_SAIC    (1 << 28)  #              define PACKET3_DMA_DATA_CMD_DAIC    (1 << 29)  #              define PACKET3_DMA_DATA_CMD_RAW_WAIT  (1 << 30) -#define	PACKET3_AQUIRE_MEM				0x58 +#define	PACKET3_ACQUIRE_MEM				0x58 +/* 1.  HEADER + * 2.  COHER_CNTL [30:0] + * 2.1 ENGINE_SEL [31:31] + * 3.  COHER_SIZE [31:0] + * 4.  COHER_SIZE_HI [7:0] + * 5.  COHER_BASE_LO [31:0] + * 6.  COHER_BASE_HI [23:0] + * 7.  POLL_INTERVAL [15:0] + */ +/* COHER_CNTL fields for CP_COHER_CNTL */ +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_NC_ACTION_ENA(x) ((x) << 3) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WC_ACTION_ENA(x) ((x) << 4) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_INV_METADATA_ACTION_ENA(x) ((x) << 5) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_VOL_ACTION_ENA(x) ((x) << 15) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_WB_ACTION_ENA(x) ((x) << 18) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TCL1_ACTION_ENA(x) ((x) << 22) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_TC_ACTION_ENA(x) ((x) << 23) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_CB_ACTION_ENA(x) ((x) << 25) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_DB_ACTION_ENA(x) ((x) << 26) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_ACTION_ENA(x) ((x) << 27) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_VOL_ACTION_ENA(x) ((x) << 28) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_ICACHE_ACTION_ENA(x) ((x) << 29) +#define 	PACKET3_ACQUIRE_MEM_CP_COHER_CNTL_SH_KCACHE_WB_ACTION_ENA(x) ((x) << 30)  #define	PACKET3_REWIND					0x59  #define	PACKET3_LOAD_UCONFIG_REG			0x5E  #define	PACKET3_LOAD_SH_REG				0x5F @@ -286,6 +309,7 @@  #define	PACKET3_WAIT_ON_DE_COUNTER_DIFF			0x88  #define	PACKET3_SWITCH_BUFFER				0x8B  #define PACKET3_FRAME_CONTROL				0x90 +#			define FRAME_TMZ	(1 << 0)  #			define FRAME_CMD(x) ((x) << 28)  			/*  			 * x=0: tmz_begin diff --git a/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h b/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h index ca7d05993ca2..745ed0fba1ed 100644 --- a/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h +++ b/drivers/gpu/drm/amd/amdgpu/ta_ras_if.h @@ -24,6 +24,8 @@  #ifndef _TA_RAS_IF_H  #define _TA_RAS_IF_H +#define RAS_TA_HOST_IF_VER	0 +  /* Responses have bit 31 set */  #define RSP_ID_MASK (1U << 31)  #define RSP_ID(cmdId) (((uint32_t)(cmdId)) | RSP_ID_MASK) @@ -36,18 +38,24 @@ enum ras_command {  	TA_RAS_COMMAND__TRIGGER_ERROR,  }; -enum ta_ras_status { -	TA_RAS_STATUS__SUCCESS				= 0x00, -	TA_RAS_STATUS__RESET_NEEDED			= 0x01, -	TA_RAS_STATUS__ERROR_INVALID_PARAMETER		= 0x02, -	TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE		= 0x03, -	TA_RAS_STATUS__ERROR_RAS_DUPLICATE_CMD		= 0x04, -	TA_RAS_STATUS__ERROR_INJECTION_FAILED		= 0x05, -	TA_RAS_STATUS__ERROR_ASD_READ_WRITE		= 0x06, -	TA_RAS_STATUS__ERROR_TOGGLE_DF_CSTATE		= 0x07, -	TA_RAS_STATUS__ERROR_TIMEOUT			= 0x08, -	TA_RAS_STATUS__ERROR_BLOCK_DISABLED		= 0x09, -	TA_RAS_STATUS__ERROR_GENERIC			= 0x10, +enum ta_ras_status +{ +	TA_RAS_STATUS__SUCCESS                          = 0x00, +	TA_RAS_STATUS__RESET_NEEDED                     = 0xA001, +	TA_RAS_STATUS__ERROR_INVALID_PARAMETER          = 0xA002, +	TA_RAS_STATUS__ERROR_RAS_NOT_AVAILABLE          = 0xA003, +	TA_RAS_STATUS__ERROR_RAS_DUPLICATE_CMD          = 0xA004, +	TA_RAS_STATUS__ERROR_INJECTION_FAILED           = 0xA005, +	TA_RAS_STATUS__ERROR_ASD_READ_WRITE             = 0xA006, +	TA_RAS_STATUS__ERROR_TOGGLE_DF_CSTATE           = 0xA007, +	TA_RAS_STATUS__ERROR_TIMEOUT                    = 0xA008, +	TA_RAS_STATUS__ERROR_BLOCK_DISABLED             = 0XA009, +	TA_RAS_STATUS__ERROR_GENERIC                    = 0xA00A, +	TA_RAS_STATUS__ERROR_RAS_MMHUB_INIT             = 0xA00B, +	TA_RAS_STATUS__ERROR_GET_DEV_INFO               = 0xA00C, +	TA_RAS_STATUS__ERROR_UNSUPPORTED_DEV            = 0xA00D, +	TA_RAS_STATUS__ERROR_NOT_INITIALIZED            = 0xA00E, +	TA_RAS_STATUS__ERROR_TEE_INTERNAL               = 0xA00F  };  enum ta_ras_block { @@ -97,22 +105,39 @@ struct ta_ras_trigger_error_input {  	uint64_t		value;			// method if error injection. i.e persistent, coherent etc.  }; +struct ta_ras_output_flags +{ +	uint8_t    ras_init_success_flag; +	uint8_t    err_inject_switch_disable_flag; +	uint8_t    reg_access_failure_flag; +}; +  /* Common input structure for RAS callbacks */  /**********************************************************/  union ta_ras_cmd_input {  	struct ta_ras_enable_features_input	enable_features;  	struct ta_ras_disable_features_input	disable_features;  	struct ta_ras_trigger_error_input	trigger_error; + +	uint32_t	reserve_pad[256]; +}; + +union ta_ras_cmd_output +{ +	struct ta_ras_output_flags  flags; + +	uint32_t	reserve_pad[256];  };  /* Shared Memory structures */  /**********************************************************/  struct ta_ras_shared_memory { -	uint32_t		cmd_id; -	uint32_t		resp_id; -	enum ta_ras_status	ras_status; -	uint32_t		reserved; -	union ta_ras_cmd_input	ras_in_message; +	uint32_t		    cmd_id; +	uint32_t		    resp_id; +	uint32_t	    	    ras_status; +	uint32_t		    if_version; +	union ta_ras_cmd_input	    ras_in_message; +	union ta_ras_cmd_output     ras_out_message;  };  #endif // TL_RAS_IF_H_ diff --git a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c index 14d346321a5f..418cf097c918 100644 --- a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c +++ b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c @@ -56,24 +56,43 @@ const uint32_t  static void umc_v6_1_enable_umc_index_mode(struct amdgpu_device *adev)  { -	WREG32_FIELD15(RSMU, 0, RSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU, +	uint32_t rsmu_umc_addr, rsmu_umc_val; + +	rsmu_umc_addr = SOC15_REG_OFFSET(RSMU, 0, +			mmRSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU); +	rsmu_umc_val = RREG32_PCIE(rsmu_umc_addr * 4); + +	rsmu_umc_val = REG_SET_FIELD(rsmu_umc_val, +			RSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU,  			RSMU_UMC_INDEX_MODE_EN, 1); + +	WREG32_PCIE(rsmu_umc_addr * 4, rsmu_umc_val);  }  static void umc_v6_1_disable_umc_index_mode(struct amdgpu_device *adev)  { -	WREG32_FIELD15(RSMU, 0, RSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU, +	uint32_t rsmu_umc_addr, rsmu_umc_val; + +	rsmu_umc_addr = SOC15_REG_OFFSET(RSMU, 0, +			mmRSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU); +	rsmu_umc_val = RREG32_PCIE(rsmu_umc_addr * 4); + +	rsmu_umc_val = REG_SET_FIELD(rsmu_umc_val, +			RSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU,  			RSMU_UMC_INDEX_MODE_EN, 0); + +	WREG32_PCIE(rsmu_umc_addr * 4, rsmu_umc_val);  }  static uint32_t umc_v6_1_get_umc_index_mode_state(struct amdgpu_device *adev)  { -	uint32_t rsmu_umc_index; +	uint32_t rsmu_umc_addr, rsmu_umc_val; -	rsmu_umc_index = RREG32_SOC15(RSMU, 0, +	rsmu_umc_addr = SOC15_REG_OFFSET(RSMU, 0,  			mmRSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU); +	rsmu_umc_val = RREG32_PCIE(rsmu_umc_addr * 4); -	return REG_GET_FIELD(rsmu_umc_index, +	return REG_GET_FIELD(rsmu_umc_val,  			RSMU_UMC_INDEX_REGISTER_NBIF_VG20_GPU,  			RSMU_UMC_INDEX_MODE_EN);  } @@ -85,6 +104,81 @@ static inline uint32_t get_umc_6_reg_offset(struct amdgpu_device *adev,  	return adev->umc.channel_offs*ch_inst + UMC_6_INST_DIST*umc_inst;  } +static void umc_v6_1_clear_error_count_per_channel(struct amdgpu_device *adev, +					uint32_t umc_reg_offset) +{ +	uint32_t ecc_err_cnt_addr; +	uint32_t ecc_err_cnt_sel, ecc_err_cnt_sel_addr; + +	if (adev->asic_type == CHIP_ARCTURUS) { +		/* UMC 6_1_2 registers */ +		ecc_err_cnt_sel_addr = +			SOC15_REG_OFFSET(UMC, 0, +					mmUMCCH0_0_EccErrCntSel_ARCT); +		ecc_err_cnt_addr = +			SOC15_REG_OFFSET(UMC, 0, +					mmUMCCH0_0_EccErrCnt_ARCT); +	} else { +		/* UMC 6_1_1 registers */ +		ecc_err_cnt_sel_addr = +			SOC15_REG_OFFSET(UMC, 0, +					mmUMCCH0_0_EccErrCntSel); +		ecc_err_cnt_addr = +			SOC15_REG_OFFSET(UMC, 0, +					mmUMCCH0_0_EccErrCnt); +	} + +	/* select the lower chip */ +	ecc_err_cnt_sel = RREG32_PCIE((ecc_err_cnt_sel_addr + +					umc_reg_offset) * 4); +	ecc_err_cnt_sel = REG_SET_FIELD(ecc_err_cnt_sel, +					UMCCH0_0_EccErrCntSel, +					EccErrCntCsSel, 0); +	WREG32_PCIE((ecc_err_cnt_sel_addr + umc_reg_offset) * 4, +			ecc_err_cnt_sel); + +	/* clear lower chip error count */ +	WREG32_PCIE((ecc_err_cnt_addr + umc_reg_offset) * 4, +			UMC_V6_1_CE_CNT_INIT); + +	/* select the higher chip */ +	ecc_err_cnt_sel = RREG32_PCIE((ecc_err_cnt_sel_addr + +					umc_reg_offset) * 4); +	ecc_err_cnt_sel = REG_SET_FIELD(ecc_err_cnt_sel, +					UMCCH0_0_EccErrCntSel, +					EccErrCntCsSel, 1); +	WREG32_PCIE((ecc_err_cnt_sel_addr + umc_reg_offset) * 4, +			ecc_err_cnt_sel); + +	/* clear higher chip error count */ +	WREG32_PCIE((ecc_err_cnt_addr + umc_reg_offset) * 4, +			UMC_V6_1_CE_CNT_INIT); +} + +static void umc_v6_1_clear_error_count(struct amdgpu_device *adev) +{ +	uint32_t umc_inst        = 0; +	uint32_t ch_inst         = 0; +	uint32_t umc_reg_offset  = 0; +	uint32_t rsmu_umc_index_state = +				umc_v6_1_get_umc_index_mode_state(adev); + +	if (rsmu_umc_index_state) +		umc_v6_1_disable_umc_index_mode(adev); + +	LOOP_UMC_INST_AND_CH(umc_inst, ch_inst) { +		umc_reg_offset = get_umc_6_reg_offset(adev, +						umc_inst, +						ch_inst); + +		umc_v6_1_clear_error_count_per_channel(adev, +						umc_reg_offset); +	} + +	if (rsmu_umc_index_state) +		umc_v6_1_enable_umc_index_mode(adev); +} +  static void umc_v6_1_query_correctable_error_count(struct amdgpu_device *adev,  						   uint32_t umc_reg_offset,  						   unsigned long *error_count) @@ -117,23 +211,21 @@ static void umc_v6_1_query_correctable_error_count(struct amdgpu_device *adev,  	ecc_err_cnt_sel = REG_SET_FIELD(ecc_err_cnt_sel, UMCCH0_0_EccErrCntSel,  					EccErrCntCsSel, 0);  	WREG32_PCIE((ecc_err_cnt_sel_addr + umc_reg_offset) * 4, ecc_err_cnt_sel); +  	ecc_err_cnt = RREG32_PCIE((ecc_err_cnt_addr + umc_reg_offset) * 4);  	*error_count +=  		(REG_GET_FIELD(ecc_err_cnt, UMCCH0_0_EccErrCnt, EccErrCnt) -  		 UMC_V6_1_CE_CNT_INIT); -	/* clear the lower chip err count */ -	WREG32_PCIE((ecc_err_cnt_addr + umc_reg_offset) * 4, UMC_V6_1_CE_CNT_INIT);  	/* select the higher chip and check the err counter */  	ecc_err_cnt_sel = REG_SET_FIELD(ecc_err_cnt_sel, UMCCH0_0_EccErrCntSel,  					EccErrCntCsSel, 1);  	WREG32_PCIE((ecc_err_cnt_sel_addr + umc_reg_offset) * 4, ecc_err_cnt_sel); +  	ecc_err_cnt = RREG32_PCIE((ecc_err_cnt_addr + umc_reg_offset) * 4);  	*error_count +=  		(REG_GET_FIELD(ecc_err_cnt, UMCCH0_0_EccErrCnt, EccErrCnt) -  		 UMC_V6_1_CE_CNT_INIT); -	/* clear the higher chip err count */ -	WREG32_PCIE((ecc_err_cnt_addr + umc_reg_offset) * 4, UMC_V6_1_CE_CNT_INIT);  	/* check for SRAM correctable error  	  MCUMC_STATUS is a 64 bit register */ @@ -209,6 +301,8 @@ static void umc_v6_1_query_ras_error_count(struct amdgpu_device *adev,  	if (rsmu_umc_index_state)  		umc_v6_1_enable_umc_index_mode(adev); + +	umc_v6_1_clear_error_count(adev);  }  static void umc_v6_1_query_error_address(struct amdgpu_device *adev, diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c index 82abd8e728ab..3cafba726587 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c @@ -118,7 +118,8 @@ static int uvd_v4_2_sw_init(void *handle)  	ring = &adev->uvd.inst->ring;  	sprintf(ring->name, "uvd"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -210,13 +211,10 @@ done:  static int uvd_v4_2_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->uvd.inst->ring;  	if (RREG32(mmUVD_STATUS) != 0)  		uvd_v4_2_stop(adev); -	ring->sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c index 0fa8aae2d78e..a566ff926e90 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c @@ -116,7 +116,8 @@ static int uvd_v5_0_sw_init(void *handle)  	ring = &adev->uvd.inst->ring;  	sprintf(ring->name, "uvd"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -208,13 +209,10 @@ done:  static int uvd_v5_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->uvd.inst->ring;  	if (RREG32(mmUVD_STATUS) != 0)  		uvd_v5_0_stop(adev); -	ring->sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c index e0aadcaf6c8b..0a880bc101b8 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c @@ -216,7 +216,8 @@ static int uvd_v6_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; @@ -279,7 +280,8 @@ static int uvd_v6_0_enc_get_destroy_msg(struct amdgpu_ring *ring,  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; @@ -416,7 +418,8 @@ static int uvd_v6_0_sw_init(void *handle)  	ring = &adev->uvd.inst->ring;  	sprintf(ring->name, "uvd"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -428,7 +431,9 @@ static int uvd_v6_0_sw_init(void *handle)  		for (i = 0; i < adev->uvd.num_enc_rings; ++i) {  			ring = &adev->uvd.inst->ring_enc[i];  			sprintf(ring->name, "uvd_enc%d", i); -			r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst->irq, 0); +			r = amdgpu_ring_init(adev, ring, 512, +					     &adev->uvd.inst->irq, 0, +					     AMDGPU_RING_PRIO_DEFAULT);  			if (r)  				return r;  		} @@ -535,13 +540,10 @@ done:  static int uvd_v6_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->uvd.inst->ring;  	if (RREG32(mmUVD_STATUS) != 0)  		uvd_v6_0_stop(adev); -	ring->sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c index 0995378d8263..7a55457e6f9e 100644 --- a/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/uvd_v7_0.c @@ -224,7 +224,8 @@ static int uvd_v7_0_enc_get_create_msg(struct amdgpu_ring *ring, uint32_t handle  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; @@ -286,7 +287,8 @@ static int uvd_v7_0_enc_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handl  	uint64_t addr;  	int i, r; -	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, &job); +	r = amdgpu_job_alloc_with_ib(ring->adev, ib_size_dw * 4, +					AMDGPU_IB_POOL_DIRECT, &job);  	if (r)  		return r; @@ -450,7 +452,9 @@ static int uvd_v7_0_sw_init(void *handle)  		if (!amdgpu_sriov_vf(adev)) {  			ring = &adev->uvd.inst[j].ring;  			sprintf(ring->name, "uvd_%d", ring->me); -			r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0); +			r = amdgpu_ring_init(adev, ring, 512, +					     &adev->uvd.inst[j].irq, 0, +					     AMDGPU_RING_PRIO_DEFAULT);  			if (r)  				return r;  		} @@ -469,7 +473,9 @@ static int uvd_v7_0_sw_init(void *handle)  				else  					ring->doorbell_index = adev->doorbell_index.uvd_vce.uvd_ring2_3 * 2 + 1;  			} -			r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.inst[j].irq, 0); +			r = amdgpu_ring_init(adev, ring, 512, +					     &adev->uvd.inst[j].irq, 0, +					     AMDGPU_RING_PRIO_DEFAULT);  			if (r)  				return r;  		} @@ -598,7 +604,6 @@ done:  static int uvd_v7_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	int i;  	if (!amdgpu_sriov_vf(adev))  		uvd_v7_0_stop(adev); @@ -607,12 +612,6 @@ static int uvd_v7_0_hw_fini(void *handle)  		DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");  	} -	for (i = 0; i < adev->uvd.num_uvd_inst; ++i) { -		if (adev->uvd.harvest_config & (1 << i)) -			continue; -		adev->uvd.inst[i].ring.sched.ready = false; -	} -  	return 0;  } @@ -1694,7 +1693,7 @@ static int uvd_v7_0_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; +	bool enable = (state == AMD_CG_STATE_GATE);  	uvd_v7_0_set_bypass_mode(adev, enable); diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c index b6837fcfdba7..0e2945baf0f1 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c @@ -434,7 +434,8 @@ static int vce_v2_0_sw_init(void *handle)  		ring = &adev->vce.ring[i];  		sprintf(ring->name, "vce%d", i);  		r = amdgpu_ring_init(adev, ring, 512, -				     &adev->vce.irq, 0); +				     &adev->vce.irq, 0, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c index 217db187207c..6d9108fa22e0 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c @@ -442,7 +442,8 @@ static int vce_v3_0_sw_init(void *handle)  	for (i = 0; i < adev->vce.num_rings; i++) {  		ring = &adev->vce.ring[i];  		sprintf(ring->name, "vce%d", i); -		r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0); +		r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c index 3fd102efb7af..a0fb119240f4 100644 --- a/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c @@ -476,7 +476,8 @@ static int vce_v4_0_sw_init(void *handle)  			else  				ring->doorbell_index = adev->doorbell_index.uvd_vce.vce_ring2_3 * 2 + 1;  		} -		r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0); +		r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -539,7 +540,6 @@ static int vce_v4_0_hw_init(void *handle)  static int vce_v4_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	int i;  	if (!amdgpu_sriov_vf(adev)) {  		/* vce_v4_0_wait_for_idle(handle); */ @@ -549,9 +549,6 @@ static int vce_v4_0_hw_fini(void *handle)  		DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");  	} -	for (i = 0; i < adev->vce.num_rings; i++) -		adev->vce.ring[i].sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 09b0572b838d..1ad79155ed00 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c @@ -127,7 +127,8 @@ static int vcn_v1_0_sw_init(void *handle)  	ring = &adev->vcn.inst->ring_dec;  	sprintf(ring->name, "vcn_dec"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -145,7 +146,8 @@ static int vcn_v1_0_sw_init(void *handle)  	for (i = 0; i < adev->vcn.num_enc_rings; ++i) {  		ring = &adev->vcn.inst->ring_enc[i];  		sprintf(ring->name, "vcn_enc%d", i); -		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0); +		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -227,14 +229,11 @@ done:  static int vcn_v1_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;  	if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||  		RREG32_SOC15(VCN, 0, mmUVD_STATUS))  		vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE); -	ring->sched.ready = false; -  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c index ec8091a661df..90ed773695ea 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c @@ -92,6 +92,7 @@ static int vcn_v2_0_sw_init(void *handle)  	struct amdgpu_ring *ring;  	int i, r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	volatile struct amdgpu_fw_shared *fw_shared;  	/* VCN DEC TRAP */  	r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCN, @@ -133,7 +134,8 @@ static int vcn_v2_0_sw_init(void *handle)  	ring->doorbell_index = adev->doorbell_index.vcn.vcn_ring0_1 << 1;  	sprintf(ring->name, "vcn_dec"); -	r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0); +	r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0, +			     AMDGPU_RING_PRIO_DEFAULT);  	if (r)  		return r; @@ -163,7 +165,8 @@ static int vcn_v2_0_sw_init(void *handle)  		else  			ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) + 1 + i;  		sprintf(ring->name, "vcn_enc%d", i); -		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0); +		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst->irq, 0, +				     AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r;  	} @@ -174,6 +177,8 @@ static int vcn_v2_0_sw_init(void *handle)  	if (r)  		return r; +	fw_shared = adev->vcn.inst->fw_shared_cpu_addr; +	fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_VCN_MULTI_QUEUE_FLAG);  	return 0;  } @@ -188,6 +193,9 @@ static int vcn_v2_0_sw_fini(void *handle)  {  	int r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst->fw_shared_cpu_addr; + +	fw_shared->present_flag_0 = 0;  	amdgpu_virt_free_mm_table(adev); @@ -223,6 +231,10 @@ static int vcn_v2_0_hw_init(void *handle)  	if (r)  		goto done; +	//Disable vcn decode for sriov +	if (amdgpu_sriov_vf(adev)) +		ring->sched.ready = false; +  	for (i = 0; i < adev->vcn.num_enc_rings; ++i) {  		ring = &adev->vcn.inst->ring_enc[i];  		r = amdgpu_ring_test_helper(ring); @@ -248,21 +260,12 @@ done:  static int vcn_v2_0_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec; -	int i;  	if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||  	    (adev->vcn.cur_state != AMD_PG_STATE_GATE &&  	      RREG32_SOC15(VCN, 0, mmUVD_STATUS)))  		vcn_v2_0_set_powergating_state(adev, AMD_PG_STATE_GATE); -	ring->sched.ready = false; - -	for (i = 0; i < adev->vcn.num_enc_rings; ++i) { -		ring = &adev->vcn.inst->ring_enc[i]; -		ring->sched.ready = false; -	} -  	return 0;  } @@ -359,6 +362,15 @@ static void vcn_v2_0_mc_resume(struct amdgpu_device *adev)  	WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_OFFSET2, 0);  	WREG32_SOC15(UVD, 0, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE); +	/* non-cache window */ +	WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW, +		lower_32_bits(adev->vcn.inst->fw_shared_gpu_addr)); +	WREG32_SOC15(UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH, +		upper_32_bits(adev->vcn.inst->fw_shared_gpu_addr)); +	WREG32_SOC15(UVD, 0, mmUVD_VCPU_NONCACHE_OFFSET0, 0); +	WREG32_SOC15(UVD, 0, mmUVD_VCPU_NONCACHE_SIZE0, +		AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared))); +  	WREG32_SOC15(UVD, 0, mmUVD_GFX10_ADDR_CONFIG, adev->gfx.config.gb_addr_config);  } @@ -442,13 +454,16 @@ static void vcn_v2_0_mc_resume_dpg_mode(struct amdgpu_device *adev, bool indirec  	/* non-cache window */  	WREG32_SOC15_DPG_MODE_2_0(0, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), 0, 0, indirect); +		UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), +		lower_32_bits(adev->vcn.inst->fw_shared_gpu_addr), 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(0, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), 0, 0, indirect); +		UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), +		upper_32_bits(adev->vcn.inst->fw_shared_gpu_addr), 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(0, SOC15_DPG_MODE_OFFSET_2_0(  		UVD, 0, mmUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(0, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_NONCACHE_SIZE0), 0, 0, indirect); +		UVD, 0, mmUVD_VCPU_NONCACHE_SIZE0), +		AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)), 0, indirect);  	/* VCN global tiling registers */  	WREG32_SOC15_DPG_MODE_2_0(0, SOC15_DPG_MODE_OFFSET_2_0( @@ -773,6 +788,7 @@ static void vcn_v2_0_enable_static_power_gating(struct amdgpu_device *adev)  static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect)  { +	volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst->fw_shared_cpu_addr;  	struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;  	uint32_t rb_bufsz, tmp; @@ -872,6 +888,12 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect)  	tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);  	WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); +	/* Stall DPG before WPTR/RPTR reset */ +	WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), +		UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK, +		~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK); +	fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET; +  	/* set the write pointer delay */  	WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR_CNTL, 0); @@ -894,11 +916,16 @@ static int vcn_v2_0_start_dpg_mode(struct amdgpu_device *adev, bool indirect)  	WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,  		lower_32_bits(ring->wptr)); +	fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET; +	/* Unstall DPG */ +	WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), +		0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);  	return 0;  }  static int vcn_v2_0_start(struct amdgpu_device *adev)  { +	volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst->fw_shared_cpu_addr;  	struct amdgpu_ring *ring = &adev->vcn.inst->ring_dec;  	uint32_t rb_bufsz, tmp;  	uint32_t lmi_swap_cntl; @@ -1033,6 +1060,7 @@ static int vcn_v2_0_start(struct amdgpu_device *adev)  	tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);  	WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_CNTL, tmp); +	fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;  	/* programm the RB_BASE for ring buffer */  	WREG32_SOC15(UVD, 0, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,  		lower_32_bits(ring->gpu_addr)); @@ -1045,20 +1073,25 @@ static int vcn_v2_0_start(struct amdgpu_device *adev)  	ring->wptr = RREG32_SOC15(UVD, 0, mmUVD_RBC_RB_RPTR);  	WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,  			lower_32_bits(ring->wptr)); +	fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET; +	fw_shared->multi_queue.encode_generalpurpose_queue_mode |= FW_QUEUE_RING_RESET;  	ring = &adev->vcn.inst->ring_enc[0];  	WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));  	WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));  	WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);  	WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));  	WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4); +	fw_shared->multi_queue.encode_generalpurpose_queue_mode &= ~FW_QUEUE_RING_RESET; +	fw_shared->multi_queue.encode_lowlatency_queue_mode |= FW_QUEUE_RING_RESET;  	ring = &adev->vcn.inst->ring_enc[1];  	WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));  	WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));  	WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);  	WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));  	WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4); +	fw_shared->multi_queue.encode_lowlatency_queue_mode &= ~FW_QUEUE_RING_RESET;  	return 0;  } @@ -1180,6 +1213,7 @@ static int vcn_v2_0_pause_dpg_mode(struct amdgpu_device *adev,  				UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);  			if (!ret_code) { +				volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst->fw_shared_cpu_addr;  				/* pause DPG */  				reg_data |= UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK;  				WREG32_SOC15(UVD, 0, mmUVD_DPG_PAUSE, reg_data); @@ -1189,23 +1223,38 @@ static int vcn_v2_0_pause_dpg_mode(struct amdgpu_device *adev,  					   UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK,  					   UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, ret_code); +				/* Stall DPG before WPTR/RPTR reset */ +				WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), +					   UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK, +					   ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);  				/* Restore */ +				fw_shared->multi_queue.encode_generalpurpose_queue_mode |= FW_QUEUE_RING_RESET;  				ring = &adev->vcn.inst->ring_enc[0]; +				ring->wptr = 0;  				WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO, ring->gpu_addr);  				WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr));  				WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE, ring->ring_size / 4);  				WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR, lower_32_bits(ring->wptr));  				WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); +				fw_shared->multi_queue.encode_generalpurpose_queue_mode &= ~FW_QUEUE_RING_RESET; +				fw_shared->multi_queue.encode_lowlatency_queue_mode |= FW_QUEUE_RING_RESET;  				ring = &adev->vcn.inst->ring_enc[1]; +				ring->wptr = 0;  				WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_LO2, ring->gpu_addr);  				WREG32_SOC15(UVD, 0, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr));  				WREG32_SOC15(UVD, 0, mmUVD_RB_SIZE2, ring->ring_size / 4);  				WREG32_SOC15(UVD, 0, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr));  				WREG32_SOC15(UVD, 0, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); +				fw_shared->multi_queue.encode_lowlatency_queue_mode &= ~FW_QUEUE_RING_RESET; +				fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;  				WREG32_SOC15(UVD, 0, mmUVD_RBC_RB_WPTR,  					   RREG32_SOC15(UVD, 0, mmUVD_SCRATCH2) & 0x7FFFFFFF); +				fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET; +				/* Unstall DPG */ +				WREG32_P(SOC15_REG_OFFSET(UVD, 0, mmUVD_POWER_STATUS), +					   0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK);  				SOC15_WAIT_ON_RREG(UVD, 0, mmUVD_POWER_STATUS,  					   UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, @@ -1796,7 +1845,6 @@ static int vcn_v2_0_start_sriov(struct amdgpu_device *adev)  	uint32_t table_size = 0;  	struct mmsch_v2_0_cmd_direct_write direct_wt = { {0} };  	struct mmsch_v2_0_cmd_direct_read_modify_write direct_rd_mod_wt = { {0} }; -	struct mmsch_v2_0_cmd_direct_polling direct_poll = { {0} };  	struct mmsch_v2_0_cmd_end end = { {0} };  	struct mmsch_v2_0_init_header *header;  	uint32_t *init_table = adev->virt.mm_table.cpu_addr; @@ -1806,8 +1854,6 @@ static int vcn_v2_0_start_sriov(struct amdgpu_device *adev)  	direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;  	direct_rd_mod_wt.cmd_header.command_type =  		MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE; -	direct_poll.cmd_header.command_type = -		MMSCH_COMMAND__DIRECT_REG_POLLING;  	end.cmd_header.command_type = MMSCH_COMMAND__END;  	if (header->vcn_table_offset == 0 && header->vcn_table_size == 0) { diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c index c6363f5ad564..3c6eafb62ee6 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c @@ -86,7 +86,7 @@ static int vcn_v2_5_early_init(void *handle)  			adev->vcn.num_vcn_inst = VCN25_MAX_HW_INSTANCES_ARCTURUS;  			for (i = 0; i < adev->vcn.num_vcn_inst; i++) { -				harvest = RREG32_SOC15(UVD, i, mmCC_UVD_HARVESTING); +				harvest = RREG32_SOC15(VCN, i, mmCC_UVD_HARVESTING);  				if (harvest & CC_UVD_HARVESTING__UVD_DISABLE_MASK)  					adev->vcn.harvest_config |= 1 << i;  			} @@ -165,6 +165,8 @@ static int vcn_v2_5_sw_init(void *handle)  		return r;  	for (j = 0; j < adev->vcn.num_vcn_inst; j++) { +		volatile struct amdgpu_fw_shared *fw_shared; +  		if (adev->vcn.harvest_config & (1 << j))  			continue;  		adev->vcn.internal.context_id = mmUVD_CONTEXT_ID_INTERNAL_OFFSET; @@ -175,15 +177,15 @@ static int vcn_v2_5_sw_init(void *handle)  		adev->vcn.internal.gp_scratch8 = mmUVD_GP_SCRATCH8_INTERNAL_OFFSET;  		adev->vcn.internal.scratch9 = mmUVD_SCRATCH9_INTERNAL_OFFSET; -		adev->vcn.inst[j].external.scratch9 = SOC15_REG_OFFSET(UVD, j, mmUVD_SCRATCH9); +		adev->vcn.inst[j].external.scratch9 = SOC15_REG_OFFSET(VCN, j, mmUVD_SCRATCH9);  		adev->vcn.internal.data0 = mmUVD_GPCOM_VCPU_DATA0_INTERNAL_OFFSET; -		adev->vcn.inst[j].external.data0 = SOC15_REG_OFFSET(UVD, j, mmUVD_GPCOM_VCPU_DATA0); +		adev->vcn.inst[j].external.data0 = SOC15_REG_OFFSET(VCN, j, mmUVD_GPCOM_VCPU_DATA0);  		adev->vcn.internal.data1 = mmUVD_GPCOM_VCPU_DATA1_INTERNAL_OFFSET; -		adev->vcn.inst[j].external.data1 = SOC15_REG_OFFSET(UVD, j, mmUVD_GPCOM_VCPU_DATA1); +		adev->vcn.inst[j].external.data1 = SOC15_REG_OFFSET(VCN, j, mmUVD_GPCOM_VCPU_DATA1);  		adev->vcn.internal.cmd = mmUVD_GPCOM_VCPU_CMD_INTERNAL_OFFSET; -		adev->vcn.inst[j].external.cmd = SOC15_REG_OFFSET(UVD, j, mmUVD_GPCOM_VCPU_CMD); +		adev->vcn.inst[j].external.cmd = SOC15_REG_OFFSET(VCN, j, mmUVD_GPCOM_VCPU_CMD);  		adev->vcn.internal.nop = mmUVD_NO_OP_INTERNAL_OFFSET; -		adev->vcn.inst[j].external.nop = SOC15_REG_OFFSET(UVD, j, mmUVD_NO_OP); +		adev->vcn.inst[j].external.nop = SOC15_REG_OFFSET(VCN, j, mmUVD_NO_OP);  		ring = &adev->vcn.inst[j].ring_dec;  		ring->use_doorbell = true; @@ -191,7 +193,8 @@ static int vcn_v2_5_sw_init(void *handle)  		ring->doorbell_index = (adev->doorbell_index.vcn.vcn_ring0_1 << 1) +  				(amdgpu_sriov_vf(adev) ? 2*j : 8*j);  		sprintf(ring->name, "vcn_dec_%d", j); -		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[j].irq, 0); +		r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[j].irq, +				     0, AMDGPU_RING_PRIO_DEFAULT);  		if (r)  			return r; @@ -203,10 +206,15 @@ static int vcn_v2_5_sw_init(void *handle)  					(amdgpu_sriov_vf(adev) ? (1 + i + 2*j) : (2 + i + 8*j));  			sprintf(ring->name, "vcn_enc_%d.%d", j, i); -			r = amdgpu_ring_init(adev, ring, 512, &adev->vcn.inst[j].irq, 0); +			r = amdgpu_ring_init(adev, ring, 512, +					     &adev->vcn.inst[j].irq, 0, +					     AMDGPU_RING_PRIO_DEFAULT);  			if (r)  				return r;  		} + +		fw_shared = adev->vcn.inst[j].fw_shared_cpu_addr; +		fw_shared->present_flag_0 = cpu_to_le32(AMDGPU_VCN_MULTI_QUEUE_FLAG);  	}  	if (amdgpu_sriov_vf(adev)) { @@ -230,8 +238,16 @@ static int vcn_v2_5_sw_init(void *handle)   */  static int vcn_v2_5_sw_fini(void *handle)  { -	int r; +	int i, r;  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	volatile struct amdgpu_fw_shared *fw_shared; + +	for (i = 0; i < adev->vcn.num_vcn_inst; i++) { +		if (adev->vcn.harvest_config & (1 << i)) +			continue; +		fw_shared = adev->vcn.inst[i].fw_shared_cpu_addr; +		fw_shared->present_flag_0 = 0; +	}  	if (amdgpu_sriov_vf(adev))  		amdgpu_virt_free_mm_table(adev); @@ -308,25 +324,16 @@ done:  static int vcn_v2_5_hw_fini(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; -	struct amdgpu_ring *ring; -	int i, j; +	int i;  	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) {  		if (adev->vcn.harvest_config & (1 << i))  			continue; -		ring = &adev->vcn.inst[i].ring_dec;  		if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||  		    (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); - -		ring->sched.ready = false; - -		for (j = 0; j < adev->vcn.num_enc_rings; ++j) { -			ring = &adev->vcn.inst[i].ring_enc[j]; -			ring->sched.ready = false; -		}  	}  	return 0; @@ -392,38 +399,47 @@ static void vcn_v2_5_mc_resume(struct amdgpu_device *adev)  			continue;  		/* cache window 0: fw */  		if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) { -			WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, +			WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,  				(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_lo)); -			WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, +			WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,  				(adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_hi)); -			WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0, 0); +			WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET0, 0);  			offset = 0;  		} else { -			WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW, +			WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW,  				lower_32_bits(adev->vcn.inst[i].gpu_addr)); -			WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH, +			WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH,  				upper_32_bits(adev->vcn.inst[i].gpu_addr));  			offset = size; -			WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET0, +			WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET0,  				AMDGPU_UVD_FIRMWARE_OFFSET >> 3);  		} -		WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE0, size); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_SIZE0, size);  		/* cache window 1: stack */ -		WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW, +		WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW,  			lower_32_bits(adev->vcn.inst[i].gpu_addr + offset)); -		WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH, +		WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH,  			upper_32_bits(adev->vcn.inst[i].gpu_addr + offset)); -		WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET1, 0); -		WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET1, 0); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_SIZE1, AMDGPU_VCN_STACK_SIZE);  		/* cache window 2: context */ -		WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW, +		WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW,  			lower_32_bits(adev->vcn.inst[i].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE)); -		WREG32_SOC15(UVD, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH, +		WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH,  			upper_32_bits(adev->vcn.inst[i].gpu_addr + offset + AMDGPU_VCN_STACK_SIZE)); -		WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_OFFSET2, 0); -		WREG32_SOC15(UVD, i, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_OFFSET2, 0); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_CACHE_SIZE2, AMDGPU_VCN_CONTEXT_SIZE); + +		/* non-cache window */ +		WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW, +			lower_32_bits(adev->vcn.inst[i].fw_shared_gpu_addr)); +		WREG32_SOC15(VCN, i, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH, +			upper_32_bits(adev->vcn.inst[i].fw_shared_gpu_addr)); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_NONCACHE_OFFSET0, 0); +		WREG32_SOC15(VCN, i, mmUVD_VCPU_NONCACHE_SIZE0, +			AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)));  	}  } @@ -436,88 +452,91 @@ static void vcn_v2_5_mc_resume_dpg_mode(struct amdgpu_device *adev, int inst_idx  	if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {  		if (!indirect) {  			WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -				UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), +				VCN, 0, mmUVD_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_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -				UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), +				VCN, 0, mmUVD_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_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -				UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect); +				VCN, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect);  		} else {  			WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -				UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect); +				VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), 0, 0, indirect);  			WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -				UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect); +				VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), 0, 0, indirect);  			WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -				UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect); +				VCN, 0, mmUVD_VCPU_CACHE_OFFSET0), 0, 0, indirect);  		}  		offset = 0;  	} else {  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW), +			VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),  			lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect);  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH), +			VCN, 0, mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),  			upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr), 0, indirect);  		offset = size;  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_VCPU_CACHE_OFFSET0), +			VCN, 0, mmUVD_VCPU_CACHE_OFFSET0),  			AMDGPU_UVD_FIRMWARE_OFFSET >> 3, 0, indirect);  	}  	if (!indirect)  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_VCPU_CACHE_SIZE0), size, 0, indirect); +			VCN, 0, mmUVD_VCPU_CACHE_SIZE0), size, 0, indirect);  	else  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_VCPU_CACHE_SIZE0), 0, 0, indirect); +			VCN, 0, mmUVD_VCPU_CACHE_SIZE0), 0, 0, indirect);  	/* cache window 1: stack */  	if (!indirect) {  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), +			VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),  			lower_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect);  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), +			VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),  			upper_32_bits(adev->vcn.inst[inst_idx].gpu_addr + offset), 0, indirect);  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect); +			VCN, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);  	} else {  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 0, indirect); +			VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW), 0, 0, indirect);  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 0, 0, indirect); +			VCN, 0, mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH), 0, 0, indirect);  		WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -			UVD, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect); +			VCN, 0, mmUVD_VCPU_CACHE_OFFSET1), 0, 0, indirect);  	}  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE, 0, indirect); +		VCN, 0, mmUVD_VCPU_CACHE_SIZE1), AMDGPU_VCN_STACK_SIZE, 0, indirect);  	/* cache window 2: context */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW), +		VCN, 0, mmUVD_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_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH), +		VCN, 0, mmUVD_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_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect); +		VCN, 0, mmUVD_VCPU_CACHE_OFFSET2), 0, 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE, 0, indirect); +		VCN, 0, mmUVD_VCPU_CACHE_SIZE2), AMDGPU_VCN_CONTEXT_SIZE, 0, indirect);  	/* non-cache window */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), 0, 0, indirect); +		VCN, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_LOW), +		lower_32_bits(adev->vcn.inst[inst_idx].fw_shared_gpu_addr), 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), 0, 0, indirect); +		VCN, 0, mmUVD_LMI_VCPU_NC0_64BIT_BAR_HIGH), +		upper_32_bits(adev->vcn.inst[inst_idx].fw_shared_gpu_addr), 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect); +		VCN, 0, mmUVD_VCPU_NONCACHE_OFFSET0), 0, 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_NONCACHE_SIZE0), 0, 0, indirect); +		VCN, 0, mmUVD_VCPU_NONCACHE_SIZE0), +		AMDGPU_GPU_PAGE_ALIGN(sizeof(struct amdgpu_fw_shared)), 0, indirect);  	/* VCN global tiling registers */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_GFX8_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect); +		VCN, 0, mmUVD_GFX8_ADDR_CONFIG), adev->gfx.config.gb_addr_config, 0, indirect);  }  /** @@ -671,19 +690,19 @@ static void vcn_v2_5_clock_gating_dpg_mode(struct amdgpu_device *adev,  		 UVD_CGC_CTRL__VCPU_MODE_MASK |  		 UVD_CGC_CTRL__MMSCH_MODE_MASK);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_CGC_CTRL), reg_data, sram_sel, indirect); +		VCN, 0, mmUVD_CGC_CTRL), reg_data, sram_sel, indirect);  	/* turn off clock gating */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_CGC_GATE), 0, sram_sel, indirect); +		VCN, 0, mmUVD_CGC_GATE), 0, sram_sel, indirect);  	/* turn on SUVD clock gating */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_SUVD_CGC_GATE), 1, sram_sel, indirect); +		VCN, 0, mmUVD_SUVD_CGC_GATE), 1, sram_sel, indirect);  	/* turn on sw mode in UVD_SUVD_CGC_CTRL */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_SUVD_CGC_CTRL), 0, sram_sel, indirect); +		VCN, 0, mmUVD_SUVD_CGC_CTRL), 0, sram_sel, indirect);  }  /** @@ -750,17 +769,18 @@ static void vcn_v2_5_enable_clock_gating(struct amdgpu_device *adev)  static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, bool indirect)  { +	volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared_cpu_addr;  	struct amdgpu_ring *ring;  	uint32_t rb_bufsz, tmp;  	/* disable register anti-hang mechanism */ -	WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS), 1, +	WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), 1,  		~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);  	/* enable dynamic power gating mode */ -	tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_POWER_STATUS); +	tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_POWER_STATUS);  	tmp |= UVD_POWER_STATUS__UVD_PG_MODE_MASK;  	tmp |= UVD_POWER_STATUS__UVD_PG_EN_MASK; -	WREG32_SOC15(UVD, inst_idx, mmUVD_POWER_STATUS, tmp); +	WREG32_SOC15(VCN, inst_idx, mmUVD_POWER_STATUS, tmp);  	if (indirect)  		adev->vcn.inst[inst_idx].dpg_sram_curr_addr = (uint32_t*)adev->vcn.inst[inst_idx].dpg_sram_cpu_addr; @@ -773,11 +793,11 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo  	tmp |= UVD_VCPU_CNTL__CLK_EN_MASK;  	tmp |= UVD_VCPU_CNTL__BLK_RST_MASK;  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect); +		VCN, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect);  	/* disable master interupt */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_MASTINT_EN), 0, 0, indirect); +		VCN, 0, mmUVD_MASTINT_EN), 0, 0, indirect);  	/* setup mmUVD_LMI_CTRL */  	tmp = (0x8 | UVD_LMI_CTRL__WRITE_CLEAN_TIMER_EN_MASK | @@ -789,28 +809,28 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo  		(8 << UVD_LMI_CTRL__WRITE_CLEAN_TIMER__SHIFT) |  		0x00100000L);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_CTRL), tmp, 0, indirect); +		VCN, 0, mmUVD_LMI_CTRL), tmp, 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_MPC_CNTL), +		VCN, 0, mmUVD_MPC_CNTL),  		0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT, 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_MPC_SET_MUXA0), +		VCN, 0, mmUVD_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_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_MPC_SET_MUXB0), +		VCN, 0, mmUVD_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_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_MPC_SET_MUX), +		VCN, 0, mmUVD_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); @@ -818,26 +838,26 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo  	vcn_v2_5_mc_resume_dpg_mode(adev, inst_idx, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_REG_XX_MASK), 0x10, 0, indirect); +		VCN, 0, mmUVD_REG_XX_MASK), 0x10, 0, indirect);  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_RBC_XX_IB_REG_CHECK), 0x3, 0, indirect); +		VCN, 0, mmUVD_RBC_XX_IB_REG_CHECK), 0x3, 0, indirect);  	/* enable LMI MC and UMC channels */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_LMI_CTRL2), 0, 0, indirect); +		VCN, 0, mmUVD_LMI_CTRL2), 0, 0, indirect);  	/* unblock VCPU register access */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_RB_ARB_CTRL), 0, 0, indirect); +		VCN, 0, mmUVD_RB_ARB_CTRL), 0, 0, indirect);  	tmp = (0xFF << UVD_VCPU_CNTL__PRB_TIMEOUT_VAL__SHIFT);  	tmp |= UVD_VCPU_CNTL__CLK_EN_MASK;  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect); +		VCN, 0, mmUVD_VCPU_CNTL), tmp, 0, indirect);  	/* enable master interrupt */  	WREG32_SOC15_DPG_MODE_2_0(inst_idx, SOC15_DPG_MODE_OFFSET_2_0( -		UVD, 0, mmUVD_MASTINT_EN), +		VCN, 0, mmUVD_MASTINT_EN),  		UVD_MASTINT_EN__VCPU_EN_MASK, 0, indirect);  	if (indirect) @@ -853,30 +873,41 @@ static int vcn_v2_5_start_dpg_mode(struct amdgpu_device *adev, int inst_idx, boo  	tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);  	tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);  	tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); -	WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_CNTL, tmp); +	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_CNTL, tmp); + +	/* Stall DPG before WPTR/RPTR reset */ +	WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), +		UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK, +		~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK); +	fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;  	/* set the write pointer delay */ -	WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR_CNTL, 0); +	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR_CNTL, 0);  	/* set the wb address */ -	WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_RPTR_ADDR, +	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_RPTR_ADDR,  		(upper_32_bits(ring->gpu_addr) >> 2));  	/* programm the RB_BASE for ring buffer */ -	WREG32_SOC15(UVD, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW, +	WREG32_SOC15(VCN, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,  		lower_32_bits(ring->gpu_addr)); -	WREG32_SOC15(UVD, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH, +	WREG32_SOC15(VCN, inst_idx, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,  		upper_32_bits(ring->gpu_addr));  	/* Initialize the ring buffer's read and write pointers */ -	WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_RPTR, 0); +	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_RPTR, 0); -	WREG32_SOC15(UVD, inst_idx, mmUVD_SCRATCH2, 0); +	WREG32_SOC15(VCN, inst_idx, mmUVD_SCRATCH2, 0); -	ring->wptr = RREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_RPTR); -	WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR, +	ring->wptr = RREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_RPTR); +	WREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR,  		lower_32_bits(ring->wptr)); +	fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET; +	/* Unstall DPG */ +	WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), +		0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK); +  	return 0;  } @@ -898,12 +929,12 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)  		}  		/* disable register anti-hang mechanism */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_POWER_STATUS), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_POWER_STATUS), 0,  			~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);  		/* set uvd status busy */ -		tmp = RREG32_SOC15(UVD, i, mmUVD_STATUS) | UVD_STATUS__UVD_BUSY; -		WREG32_SOC15(UVD, i, mmUVD_STATUS, tmp); +		tmp = RREG32_SOC15(VCN, i, mmUVD_STATUS) | UVD_STATUS__UVD_BUSY; +		WREG32_SOC15(VCN, i, mmUVD_STATUS, tmp);  	}  	if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) @@ -916,44 +947,44 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)  		if (adev->vcn.harvest_config & (1 << i))  			continue;  		/* enable VCPU clock */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL),  			UVD_VCPU_CNTL__CLK_EN_MASK, ~UVD_VCPU_CNTL__CLK_EN_MASK);  		/* disable master interrupt */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_MASTINT_EN), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_MASTINT_EN), 0,  			~UVD_MASTINT_EN__VCPU_EN_MASK);  		/* setup mmUVD_LMI_CTRL */ -		tmp = RREG32_SOC15(UVD, i, mmUVD_LMI_CTRL); +		tmp = RREG32_SOC15(VCN, i, mmUVD_LMI_CTRL);  		tmp &= ~0xff; -		WREG32_SOC15(UVD, i, mmUVD_LMI_CTRL, tmp | 0x8| +		WREG32_SOC15(VCN, i, mmUVD_LMI_CTRL, tmp | 0x8|  			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 mmUVD_MPC_CNTL */ -		tmp = RREG32_SOC15(UVD, i, mmUVD_MPC_CNTL); +		tmp = RREG32_SOC15(VCN, i, mmUVD_MPC_CNTL);  		tmp &= ~UVD_MPC_CNTL__REPLACEMENT_MODE_MASK;  		tmp |= 0x2 << UVD_MPC_CNTL__REPLACEMENT_MODE__SHIFT;  		WREG32_SOC15(VCN, i, mmUVD_MPC_CNTL, tmp);  		/* setup UVD_MPC_SET_MUXA0 */ -		WREG32_SOC15(UVD, i, mmUVD_MPC_SET_MUXA0, +		WREG32_SOC15(VCN, i, mmUVD_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(UVD, i, mmUVD_MPC_SET_MUXB0, +		WREG32_SOC15(VCN, i, mmUVD_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 mmUVD_MPC_SET_MUX */ -		WREG32_SOC15(UVD, i, mmUVD_MPC_SET_MUX, +		WREG32_SOC15(VCN, i, mmUVD_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))); @@ -962,30 +993,31 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)  	vcn_v2_5_mc_resume(adev);  	for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { +		volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst[i].fw_shared_cpu_addr;  		if (adev->vcn.harvest_config & (1 << i))  			continue;  		/* VCN global tiling registers */ -		WREG32_SOC15(UVD, i, mmUVD_GFX8_ADDR_CONFIG, +		WREG32_SOC15(VCN, i, mmUVD_GFX8_ADDR_CONFIG,  			adev->gfx.config.gb_addr_config); -		WREG32_SOC15(UVD, i, mmUVD_GFX8_ADDR_CONFIG, +		WREG32_SOC15(VCN, i, mmUVD_GFX8_ADDR_CONFIG,  			adev->gfx.config.gb_addr_config);  		/* enable LMI MC and UMC channels */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_LMI_CTRL2), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_LMI_CTRL2), 0,  			~UVD_LMI_CTRL2__STALL_ARB_UMC_MASK);  		/* unblock VCPU register access */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_RB_ARB_CTRL), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_RB_ARB_CTRL), 0,  			~UVD_RB_ARB_CTRL__VCPU_DIS_MASK); -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL), 0,  			~UVD_VCPU_CNTL__BLK_RST_MASK);  		for (k = 0; k < 10; ++k) {  			uint32_t status;  			for (j = 0; j < 100; ++j) { -				status = RREG32_SOC15(UVD, i, mmUVD_STATUS); +				status = RREG32_SOC15(VCN, i, mmUVD_STATUS);  				if (status & 2)  					break;  				if (amdgpu_emu_mode == 1) @@ -998,11 +1030,11 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)  				break;  			DRM_ERROR("VCN decode not responding, trying to reset the VCPU!!!\n"); -			WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), +			WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL),  				UVD_VCPU_CNTL__BLK_RST_MASK,  				~UVD_VCPU_CNTL__BLK_RST_MASK);  			mdelay(10); -			WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), 0, +			WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL), 0,  				~UVD_VCPU_CNTL__BLK_RST_MASK);  			mdelay(10); @@ -1015,15 +1047,15 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)  		}  		/* enable master interrupt */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_MASTINT_EN), +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_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(UVD, i, mmUVD_STATUS), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_STATUS), 0,  			~(2 << UVD_STATUS__VCPU_REPORT__SHIFT)); -		WREG32_SOC15(UVD, i, mmUVD_LMI_RBC_RB_VMID, 0); +		WREG32_SOC15(VCN, i, mmUVD_LMI_RBC_RB_VMID, 0);  		ring = &adev->vcn.inst[i].ring_dec;  		/* force RBC into idle state */ @@ -1033,33 +1065,40 @@ static int vcn_v2_5_start(struct amdgpu_device *adev)  		tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 1);  		tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);  		tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1); -		WREG32_SOC15(UVD, i, mmUVD_RBC_RB_CNTL, tmp); +		WREG32_SOC15(VCN, i, mmUVD_RBC_RB_CNTL, tmp); +		fw_shared->multi_queue.decode_queue_mode |= FW_QUEUE_RING_RESET;  		/* programm the RB_BASE for ring buffer */ -		WREG32_SOC15(UVD, i, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW, +		WREG32_SOC15(VCN, i, mmUVD_LMI_RBC_RB_64BIT_BAR_LOW,  			lower_32_bits(ring->gpu_addr)); -		WREG32_SOC15(UVD, i, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH, +		WREG32_SOC15(VCN, i, mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH,  			upper_32_bits(ring->gpu_addr));  		/* Initialize the ring buffer's read and write pointers */ -		WREG32_SOC15(UVD, i, mmUVD_RBC_RB_RPTR, 0); +		WREG32_SOC15(VCN, i, mmUVD_RBC_RB_RPTR, 0); -		ring->wptr = RREG32_SOC15(UVD, i, mmUVD_RBC_RB_RPTR); -		WREG32_SOC15(UVD, i, mmUVD_RBC_RB_WPTR, +		ring->wptr = RREG32_SOC15(VCN, i, mmUVD_RBC_RB_RPTR); +		WREG32_SOC15(VCN, i, mmUVD_RBC_RB_WPTR,  				lower_32_bits(ring->wptr)); -		ring = &adev->vcn.inst[i].ring_enc[0]; -		WREG32_SOC15(UVD, i, mmUVD_RB_RPTR, lower_32_bits(ring->wptr)); -		WREG32_SOC15(UVD, i, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); -		WREG32_SOC15(UVD, i, mmUVD_RB_BASE_LO, ring->gpu_addr); -		WREG32_SOC15(UVD, i, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); -		WREG32_SOC15(UVD, i, mmUVD_RB_SIZE, ring->ring_size / 4); +		fw_shared->multi_queue.decode_queue_mode &= ~FW_QUEUE_RING_RESET; +		fw_shared->multi_queue.encode_generalpurpose_queue_mode |= FW_QUEUE_RING_RESET; +		ring = &adev->vcn.inst[i].ring_enc[0]; +		WREG32_SOC15(VCN, i, mmUVD_RB_RPTR, lower_32_bits(ring->wptr)); +		WREG32_SOC15(VCN, i, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); +		WREG32_SOC15(VCN, i, mmUVD_RB_BASE_LO, ring->gpu_addr); +		WREG32_SOC15(VCN, i, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); +		WREG32_SOC15(VCN, i, mmUVD_RB_SIZE, ring->ring_size / 4); +		fw_shared->multi_queue.encode_generalpurpose_queue_mode &= ~FW_QUEUE_RING_RESET; + +		fw_shared->multi_queue.encode_lowlatency_queue_mode |= FW_QUEUE_RING_RESET;  		ring = &adev->vcn.inst[i].ring_enc[1]; -		WREG32_SOC15(UVD, i, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr)); -		WREG32_SOC15(UVD, i, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); -		WREG32_SOC15(UVD, i, mmUVD_RB_BASE_LO2, ring->gpu_addr); -		WREG32_SOC15(UVD, i, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); -		WREG32_SOC15(UVD, i, mmUVD_RB_SIZE2, ring->ring_size / 4); +		WREG32_SOC15(VCN, i, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr)); +		WREG32_SOC15(VCN, i, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); +		WREG32_SOC15(VCN, i, mmUVD_RB_BASE_LO2, ring->gpu_addr); +		WREG32_SOC15(VCN, i, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); +		WREG32_SOC15(VCN, i, mmUVD_RB_SIZE2, ring->ring_size / 4); +		fw_shared->multi_queue.encode_lowlatency_queue_mode &= ~FW_QUEUE_RING_RESET;  	}  	return 0; @@ -1079,33 +1118,33 @@ static int vcn_v2_5_mmsch_start(struct amdgpu_device *adev,  	 * 1, write to vce_mmsch_vf_ctx_addr_lo/hi register with GPU mc addr of  	 *  memory descriptor location  	 */ -	WREG32_SOC15(UVD, 0, mmMMSCH_VF_CTX_ADDR_LO, lower_32_bits(addr)); -	WREG32_SOC15(UVD, 0, mmMMSCH_VF_CTX_ADDR_HI, upper_32_bits(addr)); +	WREG32_SOC15(VCN, 0, mmMMSCH_VF_CTX_ADDR_LO, lower_32_bits(addr)); +	WREG32_SOC15(VCN, 0, mmMMSCH_VF_CTX_ADDR_HI, upper_32_bits(addr));  	/* 2, update vmid of descriptor */ -	data = RREG32_SOC15(UVD, 0, mmMMSCH_VF_VMID); +	data = RREG32_SOC15(VCN, 0, mmMMSCH_VF_VMID);  	data &= ~MMSCH_VF_VMID__VF_CTX_VMID_MASK;  	/* use domain0 for MM scheduler */  	data |= (0 << MMSCH_VF_VMID__VF_CTX_VMID__SHIFT); -	WREG32_SOC15(UVD, 0, mmMMSCH_VF_VMID, data); +	WREG32_SOC15(VCN, 0, mmMMSCH_VF_VMID, data);  	/* 3, notify mmsch about the size of this descriptor */ -	WREG32_SOC15(UVD, 0, mmMMSCH_VF_CTX_SIZE, size); +	WREG32_SOC15(VCN, 0, mmMMSCH_VF_CTX_SIZE, size);  	/* 4, set resp to zero */ -	WREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_RESP, 0); +	WREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_RESP, 0);  	/*  	 * 5, kick off the initialization and wait until  	 * VCE_MMSCH_VF_MAILBOX_RESP becomes non-zero  	 */ -	WREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_HOST, 0x10000001); +	WREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_HOST, 0x10000001); -	data = RREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_RESP); +	data = RREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_RESP);  	loop = 10;  	while ((data & 0x10000002) != 0x10000002) {  		udelay(100); -		data = RREG32_SOC15(UVD, 0, mmMMSCH_VF_MAILBOX_RESP); +		data = RREG32_SOC15(VCN, 0, mmMMSCH_VF_MAILBOX_RESP);  		loop--;  		if (!loop)  			break; @@ -1128,14 +1167,12 @@ static int vcn_v2_5_sriov_start(struct amdgpu_device *adev)  	uint32_t table_size = 0;  	struct mmsch_v1_0_cmd_direct_write direct_wt = { { 0 } };  	struct mmsch_v1_0_cmd_direct_read_modify_write direct_rd_mod_wt = { { 0 } }; -	struct mmsch_v1_0_cmd_direct_polling direct_poll = { { 0 } };  	struct mmsch_v1_0_cmd_end end = { { 0 } };  	uint32_t *init_table = adev->virt.mm_table.cpu_addr;  	struct mmsch_v1_1_init_header *header = (struct mmsch_v1_1_init_header *)init_table;  	direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;  	direct_rd_mod_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE; -	direct_poll.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_POLLING;  	end.cmd_header.command_type = MMSCH_COMMAND__END;  	header->version = MMSCH_VERSION; @@ -1150,93 +1187,93 @@ static int vcn_v2_5_sriov_start(struct amdgpu_device *adev)  		table_size = 0;  		MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_STATUS), +			SOC15_REG_OFFSET(VCN, i, mmUVD_STATUS),  			~UVD_STATUS__UVD_BUSY, UVD_STATUS__UVD_BUSY);  		size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.fw->size + 4);  		/* mc resume*/  		if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {  			MMSCH_V1_0_INSERT_DIRECT_WT( -				SOC15_REG_OFFSET(UVD, i, +				SOC15_REG_OFFSET(VCN, i,  					mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),  				adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_lo);  			MMSCH_V1_0_INSERT_DIRECT_WT( -				SOC15_REG_OFFSET(UVD, i, +				SOC15_REG_OFFSET(VCN, i,  					mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),  				adev->firmware.ucode[AMDGPU_UCODE_ID_VCN + i].tmr_mc_addr_hi);  			offset = 0;  			MMSCH_V1_0_INSERT_DIRECT_WT( -				SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET0), 0); +				SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET0), 0);  		} else {  			MMSCH_V1_0_INSERT_DIRECT_WT( -				SOC15_REG_OFFSET(UVD, i, +				SOC15_REG_OFFSET(VCN, i,  					mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),  				lower_32_bits(adev->vcn.inst[i].gpu_addr));  			MMSCH_V1_0_INSERT_DIRECT_WT( -				SOC15_REG_OFFSET(UVD, i, +				SOC15_REG_OFFSET(VCN, i,  					mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),  				upper_32_bits(adev->vcn.inst[i].gpu_addr));  			offset = size;  			MMSCH_V1_0_INSERT_DIRECT_WT( -				SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET0), +				SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET0),  				AMDGPU_UVD_FIRMWARE_OFFSET >> 3);  		}  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE0), +			SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_SIZE0),  			size);  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, +			SOC15_REG_OFFSET(VCN, i,  				mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),  			lower_32_bits(adev->vcn.inst[i].gpu_addr + offset));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, +			SOC15_REG_OFFSET(VCN, i,  				mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),  			upper_32_bits(adev->vcn.inst[i].gpu_addr + offset));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET1), +			SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET1),  			0);  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE1), +			SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_SIZE1),  			AMDGPU_VCN_STACK_SIZE);  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, +			SOC15_REG_OFFSET(VCN, i,  				mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),  			lower_32_bits(adev->vcn.inst[i].gpu_addr + offset +  				AMDGPU_VCN_STACK_SIZE));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, +			SOC15_REG_OFFSET(VCN, i,  				mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),  			upper_32_bits(adev->vcn.inst[i].gpu_addr + offset +  				AMDGPU_VCN_STACK_SIZE));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_OFFSET2), +			SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_OFFSET2),  			0);  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CACHE_SIZE2), +			SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CACHE_SIZE2),  			AMDGPU_VCN_CONTEXT_SIZE);  		ring = &adev->vcn.inst[i].ring_enc[0];  		ring->wptr = 0;  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_RB_BASE_LO), +			SOC15_REG_OFFSET(VCN, i, mmUVD_RB_BASE_LO),  			lower_32_bits(ring->gpu_addr));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_RB_BASE_HI), +			SOC15_REG_OFFSET(VCN, i, mmUVD_RB_BASE_HI),  			upper_32_bits(ring->gpu_addr));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_RB_SIZE), +			SOC15_REG_OFFSET(VCN, i, mmUVD_RB_SIZE),  			ring->ring_size / 4);  		ring = &adev->vcn.inst[i].ring_dec;  		ring->wptr = 0;  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, +			SOC15_REG_OFFSET(VCN, i,  				mmUVD_LMI_RBC_RB_64BIT_BAR_LOW),  			lower_32_bits(ring->gpu_addr));  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, +			SOC15_REG_OFFSET(VCN, i,  				mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH),  			upper_32_bits(ring->gpu_addr)); @@ -1248,7 +1285,7 @@ static int vcn_v2_5_sriov_start(struct amdgpu_device *adev)  		tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 1);  		tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_RPTR_WR_EN, 1);  		MMSCH_V1_0_INSERT_DIRECT_WT( -			SOC15_REG_OFFSET(UVD, i, mmUVD_RBC_RB_CNTL), tmp); +			SOC15_REG_OFFSET(VCN, i, mmUVD_RBC_RB_CNTL), tmp);  		/* add end packet */  		memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end)); @@ -1269,24 +1306,24 @@ static int vcn_v2_5_stop_dpg_mode(struct amdgpu_device *adev, int inst_idx)  	uint32_t tmp;  	/* Wait for power status to be 1 */ -	SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 1, +	SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,  		UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);  	/* wait for read ptr to be equal to write ptr */ -	tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR); -	SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_RB_RPTR, tmp, 0xFFFFFFFF, ret_code); +	tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR); +	SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_RB_RPTR, tmp, 0xFFFFFFFF, ret_code); -	tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR2); -	SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_RB_RPTR2, tmp, 0xFFFFFFFF, ret_code); +	tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR2); +	SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_RB_RPTR2, tmp, 0xFFFFFFFF, ret_code); -	tmp = RREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF; -	SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code); +	tmp = RREG32_SOC15(VCN, inst_idx, mmUVD_RBC_RB_WPTR) & 0x7FFFFFFF; +	SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_RBC_RB_RPTR, tmp, 0xFFFFFFFF, ret_code); -	SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 1, +	SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 1,  		UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);  	/* disable dynamic power gating mode */ -	WREG32_P(SOC15_REG_OFFSET(UVD, inst_idx, mmUVD_POWER_STATUS), 0, +	WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), 0,  			~UVD_POWER_STATUS__UVD_PG_MODE_MASK);  	return 0; @@ -1330,17 +1367,17 @@ static int vcn_v2_5_stop(struct amdgpu_device *adev)  			return r;  		/* block VCPU register access */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_RB_ARB_CTRL), +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_RB_ARB_CTRL),  			UVD_RB_ARB_CTRL__VCPU_DIS_MASK,  			~UVD_RB_ARB_CTRL__VCPU_DIS_MASK);  		/* reset VCPU */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL),  			UVD_VCPU_CNTL__BLK_RST_MASK,  			~UVD_VCPU_CNTL__BLK_RST_MASK);  		/* disable VCPU clock */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_VCPU_CNTL), 0, +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_VCPU_CNTL), 0,  			~(UVD_VCPU_CNTL__CLK_EN_MASK));  		/* clear status */ @@ -1349,7 +1386,7 @@ static int vcn_v2_5_stop(struct amdgpu_device *adev)  		vcn_v2_5_enable_clock_gating(adev);  		/* enable register anti-hang mechanism */ -		WREG32_P(SOC15_REG_OFFSET(UVD, i, mmUVD_POWER_STATUS), +		WREG32_P(SOC15_REG_OFFSET(VCN, i, mmUVD_POWER_STATUS),  			UVD_POWER_STATUS__UVD_POWER_STATUS_MASK,  			~UVD_POWER_STATUS__UVD_POWER_STATUS_MASK);  	} @@ -1365,55 +1402,69 @@ static int vcn_v2_5_pause_dpg_mode(struct amdgpu_device *adev,  {  	struct amdgpu_ring *ring;  	uint32_t reg_data = 0; -	int ret_code; +	int ret_code = 0;  	/* pause/unpause if state is changed */  	if (adev->vcn.inst[inst_idx].pause_state.fw_based != new_state->fw_based) {  		DRM_DEBUG("dpg pause state changed %d -> %d",  			adev->vcn.inst[inst_idx].pause_state.fw_based,	new_state->fw_based); -		reg_data = RREG32_SOC15(UVD, inst_idx, mmUVD_DPG_PAUSE) & +		reg_data = RREG32_SOC15(VCN, inst_idx, mmUVD_DPG_PAUSE) &  			(~UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK);  		if (new_state->fw_based == VCN_DPG_STATE__PAUSE) { -			ret_code = 0; -			SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, 0x1, +			SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 0x1,  				UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);  			if (!ret_code) { +				volatile struct amdgpu_fw_shared *fw_shared = adev->vcn.inst[inst_idx].fw_shared_cpu_addr; +  				/* pause DPG */  				reg_data |= UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK; -				WREG32_SOC15(UVD, inst_idx, mmUVD_DPG_PAUSE, reg_data); +				WREG32_SOC15(VCN, inst_idx, mmUVD_DPG_PAUSE, reg_data);  				/* wait for ACK */ -				SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_DPG_PAUSE, +				SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_DPG_PAUSE,  					   UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK,  					   UVD_DPG_PAUSE__NJ_PAUSE_DPG_ACK_MASK, ret_code); +				/* Stall DPG before WPTR/RPTR reset */ +				WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), +					   UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK, +					   ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK); +  				/* Restore */ +				fw_shared->multi_queue.encode_generalpurpose_queue_mode |= FW_QUEUE_RING_RESET;  				ring = &adev->vcn.inst[inst_idx].ring_enc[0]; -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_LO, ring->gpu_addr); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_SIZE, ring->ring_size / 4); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_RPTR, lower_32_bits(ring->wptr)); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); - +				ring->wptr = 0; +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO, ring->gpu_addr); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI, upper_32_bits(ring->gpu_addr)); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE, ring->ring_size / 4); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR, lower_32_bits(ring->wptr)); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); +				fw_shared->multi_queue.encode_generalpurpose_queue_mode &= ~FW_QUEUE_RING_RESET; + +				fw_shared->multi_queue.encode_lowlatency_queue_mode |= FW_QUEUE_RING_RESET;  				ring = &adev->vcn.inst[inst_idx].ring_enc[1]; -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_LO2, ring->gpu_addr); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_SIZE2, ring->ring_size / 4); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr)); -				WREG32_SOC15(UVD, inst_idx, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); - -				WREG32_SOC15(UVD, inst_idx, mmUVD_RBC_RB_WPTR, -					   RREG32_SOC15(UVD, inst_idx, mmUVD_SCRATCH2) & 0x7FFFFFFF); - -				SOC15_WAIT_ON_RREG(UVD, inst_idx, mmUVD_POWER_STATUS, +				ring->wptr = 0; +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_LO2, ring->gpu_addr); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_BASE_HI2, upper_32_bits(ring->gpu_addr)); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_SIZE2, ring->ring_size / 4); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_RPTR2, lower_32_bits(ring->wptr)); +				WREG32_SOC15(VCN, inst_idx, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); +				fw_shared->multi_queue.encode_lowlatency_queue_mode &= ~FW_QUEUE_RING_RESET; + +				/* Unstall DPG */ +				WREG32_P(SOC15_REG_OFFSET(VCN, inst_idx, mmUVD_POWER_STATUS), +					   0, ~UVD_POWER_STATUS__STALL_DPG_POWER_UP_MASK); + +				SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS,  					   UVD_PGFSM_CONFIG__UVDM_UVDU_PWR_ON, UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);  			}  		} else { -			/* unpause dpg, no need to wait */  			reg_data &= ~UVD_DPG_PAUSE__NJ_PAUSE_DPG_REQ_MASK; -			WREG32_SOC15(UVD, inst_idx, mmUVD_DPG_PAUSE, reg_data); +			WREG32_SOC15(VCN, inst_idx, mmUVD_DPG_PAUSE, reg_data); +			SOC15_WAIT_ON_RREG(VCN, inst_idx, mmUVD_POWER_STATUS, 0x1, +				UVD_POWER_STATUS__UVD_POWER_STATUS_MASK, ret_code);  		}  		adev->vcn.inst[inst_idx].pause_state.fw_based = new_state->fw_based;  	} @@ -1432,7 +1483,7 @@ static uint64_t vcn_v2_5_dec_ring_get_rptr(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; -	return RREG32_SOC15(UVD, ring->me, mmUVD_RBC_RB_RPTR); +	return RREG32_SOC15(VCN, ring->me, mmUVD_RBC_RB_RPTR);  }  /** @@ -1449,7 +1500,7 @@ static uint64_t vcn_v2_5_dec_ring_get_wptr(struct amdgpu_ring *ring)  	if (ring->use_doorbell)  		return adev->wb.wb[ring->wptr_offs];  	else -		return RREG32_SOC15(UVD, ring->me, mmUVD_RBC_RB_WPTR); +		return RREG32_SOC15(VCN, ring->me, mmUVD_RBC_RB_WPTR);  }  /** @@ -1463,15 +1514,11 @@ static void vcn_v2_5_dec_ring_set_wptr(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev; -	if (adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) -		WREG32_SOC15(UVD, ring->me, mmUVD_SCRATCH2, -			lower_32_bits(ring->wptr) | 0x80000000); -  	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(UVD, ring->me, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr)); +		WREG32_SOC15(VCN, ring->me, mmUVD_RBC_RB_WPTR, lower_32_bits(ring->wptr));  	}  } @@ -1517,9 +1564,9 @@ static uint64_t vcn_v2_5_enc_ring_get_rptr(struct amdgpu_ring *ring)  	struct amdgpu_device *adev = ring->adev;  	if (ring == &adev->vcn.inst[ring->me].ring_enc[0]) -		return RREG32_SOC15(UVD, ring->me, mmUVD_RB_RPTR); +		return RREG32_SOC15(VCN, ring->me, mmUVD_RB_RPTR);  	else -		return RREG32_SOC15(UVD, ring->me, mmUVD_RB_RPTR2); +		return RREG32_SOC15(VCN, ring->me, mmUVD_RB_RPTR2);  }  /** @@ -1537,12 +1584,12 @@ static uint64_t vcn_v2_5_enc_ring_get_wptr(struct amdgpu_ring *ring)  		if (ring->use_doorbell)  			return adev->wb.wb[ring->wptr_offs];  		else -			return RREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR); +			return RREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR);  	} else {  		if (ring->use_doorbell)  			return adev->wb.wb[ring->wptr_offs];  		else -			return RREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR2); +			return RREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR2);  	}  } @@ -1562,14 +1609,14 @@ static void vcn_v2_5_enc_ring_set_wptr(struct amdgpu_ring *ring)  			adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);  			WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));  		} else { -			WREG32_SOC15(UVD, ring->me, mmUVD_RB_WPTR, lower_32_bits(ring->wptr)); +			WREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR, lower_32_bits(ring->wptr));  		}  	} else {  		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(UVD, ring->me, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr)); +			WREG32_SOC15(VCN, ring->me, mmUVD_RB_WPTR2, lower_32_bits(ring->wptr));  		}  	}  } diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c index 78b35901643b..af8986a55354 100644 --- a/drivers/gpu/drm/amd/amdgpu/vi.c +++ b/drivers/gpu/drm/amd/amdgpu/vi.c @@ -448,27 +448,6 @@ static bool vi_read_bios_from_rom(struct amdgpu_device *adev,  	return true;  } -static void vi_detect_hw_virtualization(struct amdgpu_device *adev) -{ -	uint32_t reg = 0; - -	if (adev->asic_type == CHIP_TONGA || -	    adev->asic_type == CHIP_FIJI) { -	       reg = RREG32(mmBIF_IOV_FUNC_IDENTIFIER); -	       /* bit0: 0 means pf and 1 means vf */ -	       if (REG_GET_FIELD(reg, BIF_IOV_FUNC_IDENTIFIER, FUNC_IDENTIFIER)) -		       adev->virt.caps |= AMDGPU_SRIOV_CAPS_IS_VF; -	       /* bit31: 0 means disable IOV and 1 means enable */ -	       if (REG_GET_FIELD(reg, BIF_IOV_FUNC_IDENTIFIER, IOV_ENABLE)) -		       adev->virt.caps |= AMDGPU_SRIOV_CAPS_ENABLE_IOV; -	} - -	if (reg == 0) { -		if (is_virtual_machine()) /* passthrough mode exclus sr-iov mode */ -			adev->virt.caps |= AMDGPU_PASSTHROUGH_MODE; -	} -} -  static const struct amdgpu_allowed_register_entry vi_allowed_read_registers[] = {  	{mmGRBM_STATUS},  	{mmGRBM_STATUS2}, @@ -765,8 +744,6 @@ static int vi_asic_reset(struct amdgpu_device *adev)  	int r;  	if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) { -		if (!adev->in_suspend) -			amdgpu_inc_vram_lost(adev);  		r = amdgpu_dpm_baco_reset(adev);  	} else {  		r = vi_asic_pci_config_reset(adev); @@ -1730,9 +1707,6 @@ static const struct amdgpu_ip_block_version vi_common_ip_block =  int vi_set_ip_blocks(struct amdgpu_device *adev)  { -	/* in early init stage, vbios code won't work */ -	vi_detect_hw_virtualization(adev); -  	if (amdgpu_sriov_vf(adev))  		adev->virt.ops = &xgpu_vi_virt_ops; diff --git a/drivers/gpu/drm/amd/amdgpu/vid.h b/drivers/gpu/drm/amd/amdgpu/vid.h index 19ddd2312e00..7a01e6133798 100644 --- a/drivers/gpu/drm/amd/amdgpu/vid.h +++ b/drivers/gpu/drm/amd/amdgpu/vid.h @@ -332,7 +332,7 @@  #              define PACKET3_DMA_DATA_CMD_SAIC    (1 << 28)  #              define PACKET3_DMA_DATA_CMD_DAIC    (1 << 29)  #              define PACKET3_DMA_DATA_CMD_RAW_WAIT  (1 << 30) -#define	PACKET3_AQUIRE_MEM				0x58 +#define	PACKET3_ACQUIRE_MEM				0x58  #define	PACKET3_REWIND					0x59  #define	PACKET3_LOAD_UCONFIG_REG			0x5E  #define	PACKET3_LOAD_SH_REG				0x5F  |