diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/Makefile | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu.h | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 24 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 111 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c | 2 | 
15 files changed, 213 insertions, 51 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile index 78d609123420..90202cf4cd1e 100644 --- a/drivers/gpu/drm/amd/amdgpu/Makefile +++ b/drivers/gpu/drm/amd/amdgpu/Makefile @@ -1,4 +1,24 @@ -# SPDX-License-Identifier: GPL-2.0 +# +# Copyright 2017 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. +#  #  # Makefile for the drm device driver.  This driver provides support for the  # Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher. diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 5afaf6016b4a..0b14b5373783 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -717,7 +717,7 @@ int amdgpu_queue_mgr_fini(struct amdgpu_device *adev,  			  struct amdgpu_queue_mgr *mgr);  int amdgpu_queue_mgr_map(struct amdgpu_device *adev,  			 struct amdgpu_queue_mgr *mgr, -			 int hw_ip, int instance, int ring, +			 u32 hw_ip, u32 instance, u32 ring,  			 struct amdgpu_ring **out_ring);  /* @@ -1572,18 +1572,14 @@ struct amdgpu_device {  	/* sdma */  	struct amdgpu_sdma		sdma; -	union { -		struct { -			/* uvd */ -			struct amdgpu_uvd		uvd; +	/* uvd */ +	struct amdgpu_uvd		uvd; -			/* vce */ -			struct amdgpu_vce		vce; -		}; +	/* vce */ +	struct amdgpu_vce		vce; -		/* vcn */ -		struct amdgpu_vcn		vcn; -	}; +	/* vcn */ +	struct amdgpu_vcn		vcn;  	/* firmwares */  	struct amdgpu_firmware		firmware; 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 47d1c132ac40..1e3e9be7d77e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c @@ -379,29 +379,50 @@ static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd)  {  	struct amdgpu_device *adev = get_amdgpu_device(kgd);  	struct cik_sdma_rlc_registers *m; +	unsigned long end_jiffies;  	uint32_t sdma_base_addr; +	uint32_t data;  	m = get_sdma_mqd(mqd);  	sdma_base_addr = get_sdma_base_addr(m); -	WREG32(sdma_base_addr + mmSDMA0_RLC0_VIRTUAL_ADDR, -			m->sdma_rlc_virtual_addr); +	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL, +		m->sdma_rlc_rb_cntl & (~SDMA0_RLC0_RB_CNTL__RB_ENABLE_MASK)); -	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE, -			m->sdma_rlc_rb_base); +	end_jiffies = msecs_to_jiffies(2000) + jiffies; +	while (true) { +		data = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS); +		if (data & SDMA0_RLC0_CONTEXT_STATUS__IDLE_MASK) +			break; +		if (time_after(jiffies, end_jiffies)) +			return -ETIME; +		usleep_range(500, 1000); +	} +	if (m->sdma_engine_id) { +		data = RREG32(mmSDMA1_GFX_CONTEXT_CNTL); +		data = REG_SET_FIELD(data, SDMA1_GFX_CONTEXT_CNTL, +				RESUME_CTX, 0); +		WREG32(mmSDMA1_GFX_CONTEXT_CNTL, data); +	} else { +		data = RREG32(mmSDMA0_GFX_CONTEXT_CNTL); +		data = REG_SET_FIELD(data, SDMA0_GFX_CONTEXT_CNTL, +				RESUME_CTX, 0); +		WREG32(mmSDMA0_GFX_CONTEXT_CNTL, data); +	} +	WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL, +				m->sdma_rlc_doorbell); +	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR, 0); +	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_WPTR, 0); +	WREG32(sdma_base_addr + mmSDMA0_RLC0_VIRTUAL_ADDR, +				m->sdma_rlc_virtual_addr); +	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE, m->sdma_rlc_rb_base);  	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE_HI,  			m->sdma_rlc_rb_base_hi); -  	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR_ADDR_LO,  			m->sdma_rlc_rb_rptr_addr_lo); -  	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR_ADDR_HI,  			m->sdma_rlc_rb_rptr_addr_hi); - -	WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL, -			m->sdma_rlc_doorbell); -  	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL,  			m->sdma_rlc_rb_cntl); @@ -574,9 +595,9 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,  	}  	WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL, 0); -	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR, 0); -	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_WPTR, 0); -	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE, 0); +	WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL, +		RREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL) | +		SDMA0_RLC0_RB_CNTL__RB_ENABLE_MASK);  	return 0;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index a57cec737c18..57abf7abd7a9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -409,6 +409,10 @@ static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p,  		if (candidate->robj == validated)  			break; +		/* We can't move pinned BOs here */ +		if (bo->pin_count) +			continue; +  		other = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type);  		/* Check if this BO is in one of the domains we need space for */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 2c574374d9b6..3573ecdb06ee 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -1837,9 +1837,6 @@ static int amdgpu_fini(struct amdgpu_device *adev)  		adev->ip_blocks[i].status.hw = false;  	} -	if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) -		amdgpu_ucode_fini_bo(adev); -  	for (i = adev->num_ip_blocks - 1; i >= 0; i--) {  		if (!adev->ip_blocks[i].status.sw)  			continue; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c index ec96bb1f9eaf..c2f414ffb2cc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -536,7 +536,7 @@ static const struct pci_device_id pciidlist[] = {  	{0x1002, 0x686c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	{0x1002, 0x687f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VEGA10},  	/* Raven */ -	{0x1002, 0x15dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU|AMD_EXP_HW_SUPPORT}, +	{0x1002, 0x15dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},  	{0, 0, 0}  }; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c index 6c570d4e4516..f8edf5483f11 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c @@ -1,4 +1,6 @@  /* + * Copyright 2017 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 diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c index 033fba2def6f..5f5aa5fddc16 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c @@ -164,6 +164,9 @@ static int amdgpu_pp_hw_fini(void *handle)  		ret = adev->powerplay.ip_funcs->hw_fini(  					adev->powerplay.pp_handle); +	if (adev->firmware.load_type == AMDGPU_FW_LOAD_SMU) +		amdgpu_ucode_fini_bo(adev); +  	return ret;  } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index 7714f4a6c8b0..447d446b5015 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c @@ -442,6 +442,8 @@ static int psp_hw_fini(void *handle)  	if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)  		return 0; +	amdgpu_ucode_fini_bo(adev); +  	psp_ring_destroy(psp, PSP_RING_TYPE__KM);  	amdgpu_bo_free_kernel(&psp->tmr_bo, &psp->tmr_mc_addr, &psp->tmr_buf); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c index 190e28cb827e..93d86619e802 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_queue_mgr.c @@ -63,7 +63,7 @@ static int amdgpu_update_cached_map(struct amdgpu_queue_mapper *mapper,  static int amdgpu_identity_map(struct amdgpu_device *adev,  			       struct amdgpu_queue_mapper *mapper, -			       int ring, +			       u32 ring,  			       struct amdgpu_ring **out_ring)  {  	switch (mapper->hw_ip) { @@ -121,7 +121,7 @@ static enum amdgpu_ring_type amdgpu_hw_ip_to_ring_type(int hw_ip)  static int amdgpu_lru_map(struct amdgpu_device *adev,  			  struct amdgpu_queue_mapper *mapper, -			  int user_ring, bool lru_pipe_order, +			  u32 user_ring, bool lru_pipe_order,  			  struct amdgpu_ring **out_ring)  {  	int r, i, j; @@ -208,7 +208,7 @@ int amdgpu_queue_mgr_fini(struct amdgpu_device *adev,   */  int amdgpu_queue_mgr_map(struct amdgpu_device *adev,  			 struct amdgpu_queue_mgr *mgr, -			 int hw_ip, int instance, int ring, +			 u32 hw_ip, u32 instance, u32 ring,  			 struct amdgpu_ring **out_ring)  {  	int r, ip_num_rings; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h index f337c316ec2c..06525f2c36c3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h @@ -1,4 +1,26 @@ -/* SPDX-License-Identifier: GPL-2.0 */ +/* + * Copyright 2017 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. + * + */ +  #if !defined(_AMDGPU_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)  #define _AMDGPU_TRACE_H_ diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 793b1470284d..a296f7bbe57c 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c @@ -1023,22 +1023,101 @@ static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] =  	{mmPA_SC_RASTER_CONFIG_1, true},  }; -static uint32_t cik_read_indexed_register(struct amdgpu_device *adev, -					  u32 se_num, u32 sh_num, -					  u32 reg_offset) + +static uint32_t cik_get_register_value(struct amdgpu_device *adev, +				       bool indexed, u32 se_num, +				       u32 sh_num, u32 reg_offset)  { -	uint32_t val; +	if (indexed) { +		uint32_t val; +		unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; +		unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; + +		switch (reg_offset) { +		case mmCC_RB_BACKEND_DISABLE: +			return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; +		case mmGC_USER_RB_BACKEND_DISABLE: +			return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; +		case mmPA_SC_RASTER_CONFIG: +			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; +		case mmPA_SC_RASTER_CONFIG_1: +			return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1; +		} -	mutex_lock(&adev->grbm_idx_mutex); -	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); +		mutex_lock(&adev->grbm_idx_mutex); +		if (se_num != 0xffffffff || sh_num != 0xffffffff) +			amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); -	val = RREG32(reg_offset); +		val = RREG32(reg_offset); -	if (se_num != 0xffffffff || sh_num != 0xffffffff) -		amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); -	mutex_unlock(&adev->grbm_idx_mutex); -	return val; +		if (se_num != 0xffffffff || sh_num != 0xffffffff) +			amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +		mutex_unlock(&adev->grbm_idx_mutex); +		return val; +	} else { +		unsigned idx; + +		switch (reg_offset) { +		case mmGB_ADDR_CONFIG: +			return adev->gfx.config.gb_addr_config; +		case mmMC_ARB_RAMCFG: +			return adev->gfx.config.mc_arb_ramcfg; +		case mmGB_TILE_MODE0: +		case mmGB_TILE_MODE1: +		case mmGB_TILE_MODE2: +		case mmGB_TILE_MODE3: +		case mmGB_TILE_MODE4: +		case mmGB_TILE_MODE5: +		case mmGB_TILE_MODE6: +		case mmGB_TILE_MODE7: +		case mmGB_TILE_MODE8: +		case mmGB_TILE_MODE9: +		case mmGB_TILE_MODE10: +		case mmGB_TILE_MODE11: +		case mmGB_TILE_MODE12: +		case mmGB_TILE_MODE13: +		case mmGB_TILE_MODE14: +		case mmGB_TILE_MODE15: +		case mmGB_TILE_MODE16: +		case mmGB_TILE_MODE17: +		case mmGB_TILE_MODE18: +		case mmGB_TILE_MODE19: +		case mmGB_TILE_MODE20: +		case mmGB_TILE_MODE21: +		case mmGB_TILE_MODE22: +		case mmGB_TILE_MODE23: +		case mmGB_TILE_MODE24: +		case mmGB_TILE_MODE25: +		case mmGB_TILE_MODE26: +		case mmGB_TILE_MODE27: +		case mmGB_TILE_MODE28: +		case mmGB_TILE_MODE29: +		case mmGB_TILE_MODE30: +		case mmGB_TILE_MODE31: +			idx = (reg_offset - mmGB_TILE_MODE0); +			return adev->gfx.config.tile_mode_array[idx]; +		case mmGB_MACROTILE_MODE0: +		case mmGB_MACROTILE_MODE1: +		case mmGB_MACROTILE_MODE2: +		case mmGB_MACROTILE_MODE3: +		case mmGB_MACROTILE_MODE4: +		case mmGB_MACROTILE_MODE5: +		case mmGB_MACROTILE_MODE6: +		case mmGB_MACROTILE_MODE7: +		case mmGB_MACROTILE_MODE8: +		case mmGB_MACROTILE_MODE9: +		case mmGB_MACROTILE_MODE10: +		case mmGB_MACROTILE_MODE11: +		case mmGB_MACROTILE_MODE12: +		case mmGB_MACROTILE_MODE13: +		case mmGB_MACROTILE_MODE14: +		case mmGB_MACROTILE_MODE15: +			idx = (reg_offset - mmGB_MACROTILE_MODE0); +			return adev->gfx.config.macrotile_mode_array[idx]; +		default: +			return RREG32(reg_offset); +		} +	}  }  static int cik_read_register(struct amdgpu_device *adev, u32 se_num, @@ -1048,13 +1127,13 @@ static int cik_read_register(struct amdgpu_device *adev, u32 se_num,  	*value = 0;  	for (i = 0; i < ARRAY_SIZE(cik_allowed_read_registers); i++) { +		bool indexed = cik_allowed_read_registers[i].grbm_indexed; +  		if (reg_offset != cik_allowed_read_registers[i].reg_offset)  			continue; -		*value = cik_allowed_read_registers[i].grbm_indexed ? -			 cik_read_indexed_register(adev, se_num, -						   sh_num, reg_offset) : -			 RREG32(reg_offset); +		*value = cik_get_register_value(adev, indexed, se_num, sh_num, +						reg_offset);  		return 0;  	}  	return -EINVAL; diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c index 5c8a7a48a4ad..419ba0ce7ee5 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c @@ -1819,6 +1819,22 @@ static void gfx_v7_0_setup_rb(struct amdgpu_device *adev)  							adev->gfx.config.backend_enable_mask,  							num_rb_pipes);  	} + +	/* cache the values for userspace */ +	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { +		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { +			gfx_v7_0_select_se_sh(adev, i, j, 0xffffffff); +			adev->gfx.config.rb_config[i][j].rb_backend_disable = +				RREG32(mmCC_RB_BACKEND_DISABLE); +			adev->gfx.config.rb_config[i][j].user_rb_backend_disable = +				RREG32(mmGC_USER_RB_BACKEND_DISABLE); +			adev->gfx.config.rb_config[i][j].raster_config = +				RREG32(mmPA_SC_RASTER_CONFIG); +			adev->gfx.config.rb_config[i][j].raster_config_1 = +				RREG32(mmPA_SC_RASTER_CONFIG_1); +		} +	} +	gfx_v7_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff);  	mutex_unlock(&adev->grbm_idx_mutex);  } diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index da43813d67a4..5aeb5f8816f3 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -2467,7 +2467,7 @@ static int gfx_v9_0_kiq_kcq_enable(struct amdgpu_device *adev)  				  PACKET3_MAP_QUEUES_PIPE(ring->pipe) |  				  PACKET3_MAP_QUEUES_ME((ring->me == 1 ? 0 : 1)) |  				  PACKET3_MAP_QUEUES_QUEUE_TYPE(0) | /*queue_type: normal compute queue */ -				  PACKET3_MAP_QUEUES_ALLOC_FORMAT(1) | /* alloc format: all_on_one_pipe */ +				  PACKET3_MAP_QUEUES_ALLOC_FORMAT(0) | /* alloc format: all_on_one_pipe */  				  PACKET3_MAP_QUEUES_ENGINE_SEL(0) | /* engine_sel: compute */  				  PACKET3_MAP_QUEUES_NUM_QUEUES(1)); /* num_queues: must be 1 */  		amdgpu_ring_write(kiq_ring, PACKET3_MAP_QUEUES_DOORBELL_OFFSET(ring->doorbell_index)); diff --git a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c index 1eb4d79d6e30..0450ac5ba6b6 100644 --- a/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c +++ b/drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c @@ -1175,7 +1175,7 @@ static const struct amdgpu_irq_src_funcs vcn_v1_0_irq_funcs = {  static void vcn_v1_0_set_irq_funcs(struct amdgpu_device *adev)  { -	adev->uvd.irq.num_types = adev->vcn.num_enc_rings + 1; +	adev->vcn.irq.num_types = adev->vcn.num_enc_rings + 1;  	adev->vcn.irq.funcs = &vcn_v1_0_irq_funcs;  }  | 

