diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c | 114 | 
1 files changed, 57 insertions, 57 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c index b1f2684d854a..51c1745c8369 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c @@ -1304,7 +1304,7 @@ static int gfx_v8_0_mec_init(struct amdgpu_device *adev)  	u32 *hpd;  	size_t mec_hpd_size; -	bitmap_zero(adev->gfx.mec.queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES); +	bitmap_zero(adev->gfx.mec_bitmap[0].queue_bitmap, AMDGPU_MAX_COMPUTE_QUEUES);  	/* take ownership of the relevant compute queues */  	amdgpu_gfx_compute_queue_acquire(adev); @@ -2001,7 +2001,8 @@ static int gfx_v8_0_sw_init(void *handle)  	for (i = 0; i < adev->gfx.mec.num_mec; ++i) {  		for (j = 0; j < adev->gfx.mec.num_queue_per_pipe; j++) {  			for (k = 0; k < adev->gfx.mec.num_pipe_per_mec; k++) { -				if (!amdgpu_gfx_is_mec_queue_enabled(adev, i, k, j)) +				if (!amdgpu_gfx_is_mec_queue_enabled(adev, 0, i, +								     k, j))  					continue;  				r = gfx_v8_0_compute_ring_init(adev, @@ -2015,19 +2016,19 @@ static int gfx_v8_0_sw_init(void *handle)  		}  	} -	r = amdgpu_gfx_kiq_init(adev, GFX8_MEC_HPD_SIZE); +	r = amdgpu_gfx_kiq_init(adev, GFX8_MEC_HPD_SIZE, 0);  	if (r) {  		DRM_ERROR("Failed to init KIQ BOs!\n");  		return r;  	} -	kiq = &adev->gfx.kiq; -	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq); +	kiq = &adev->gfx.kiq[0]; +	r = amdgpu_gfx_kiq_init_ring(adev, &kiq->ring, &kiq->irq, 0);  	if (r)  		return r;  	/* create MQD for all compute queues as well as KIQ for SRIOV case */ -	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation)); +	r = amdgpu_gfx_mqd_sw_init(adev, sizeof(struct vi_mqd_allocation), 0);  	if (r)  		return r; @@ -2050,9 +2051,9 @@ static int gfx_v8_0_sw_fini(void *handle)  	for (i = 0; i < adev->gfx.num_compute_rings; i++)  		amdgpu_ring_fini(&adev->gfx.compute_ring[i]); -	amdgpu_gfx_mqd_sw_fini(adev); -	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq.ring); -	amdgpu_gfx_kiq_fini(adev); +	amdgpu_gfx_mqd_sw_fini(adev, 0); +	amdgpu_gfx_kiq_free_ring(&adev->gfx.kiq[0].ring); +	amdgpu_gfx_kiq_fini(adev, 0);  	gfx_v8_0_mec_fini(adev);  	amdgpu_gfx_rlc_fini(adev); @@ -3394,7 +3395,8 @@ static void gfx_v8_0_tiling_mode_table_init(struct amdgpu_device *adev)  }  static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev, -				  u32 se_num, u32 sh_num, u32 instance) +				  u32 se_num, u32 sh_num, u32 instance, +				  int xcc_id)  {  	u32 data; @@ -3417,7 +3419,7 @@ static void gfx_v8_0_select_se_sh(struct amdgpu_device *adev,  }  static void gfx_v8_0_select_me_pipe_q(struct amdgpu_device *adev, -				  u32 me, u32 pipe, u32 q, u32 vm) +				  u32 me, u32 pipe, u32 q, u32 vm, u32 xcc_id)  {  	vi_srbm_select(adev, me, pipe, q, vm);  } @@ -3578,13 +3580,13 @@ gfx_v8_0_write_harvested_raster_configs(struct amdgpu_device *adev,  		}  		/* GRBM_GFX_INDEX has a different offset on VI */ -		gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff); +		gfx_v8_0_select_se_sh(adev, se, 0xffffffff, 0xffffffff, 0);  		WREG32(mmPA_SC_RASTER_CONFIG, raster_config_se);  		WREG32(mmPA_SC_RASTER_CONFIG_1, raster_config_1);  	}  	/* GRBM_GFX_INDEX has a different offset on VI */ -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  }  static void gfx_v8_0_setup_rb(struct amdgpu_device *adev) @@ -3600,13 +3602,13 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			data = gfx_v8_0_get_rb_active_bitmap(adev);  			active_rbs |= data << ((i * adev->gfx.config.max_sh_per_se + j) *  					       rb_bitmap_width_per_sh);  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	adev->gfx.config.backend_enable_mask = active_rbs;  	adev->gfx.config.num_rbs = hweight32(active_rbs); @@ -3629,7 +3631,7 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)  	/* cache the values for userspace */  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			adev->gfx.config.rb_config[i][j].rb_backend_disable =  				RREG32(mmCC_RB_BACKEND_DISABLE);  			adev->gfx.config.rb_config[i][j].user_rb_backend_disable = @@ -3640,7 +3642,7 @@ static void gfx_v8_0_setup_rb(struct amdgpu_device *adev)  				RREG32(mmPA_SC_RASTER_CONFIG_1);  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  } @@ -3787,7 +3789,7 @@ static void gfx_v8_0_constants_init(struct amdgpu_device *adev)  	 * making sure that the following register writes will be broadcasted  	 * to all the shaders  	 */ -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32(mmPA_SC_FIFO_SIZE,  		   (adev->gfx.config.sc_prim_fifo_size_frontend << @@ -3818,7 +3820,7 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  	mutex_lock(&adev->grbm_idx_mutex);  	for (i = 0; i < adev->gfx.config.max_shader_engines; i++) {  		for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			for (k = 0; k < adev->usec_timeout; k++) {  				if (RREG32(mmRLC_SERDES_CU_MASTER_BUSY) == 0)  					break; @@ -3826,7 +3828,7 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  			if (k == adev->usec_timeout) {  				gfx_v8_0_select_se_sh(adev, 0xffffffff, -						      0xffffffff, 0xffffffff); +						      0xffffffff, 0xffffffff, 0);  				mutex_unlock(&adev->grbm_idx_mutex);  				DRM_INFO("Timeout wait for RLC serdes %u,%u\n",  					 i, j); @@ -3834,7 +3836,7 @@ static void gfx_v8_0_wait_for_rlc_serdes(struct amdgpu_device *adev)  			}  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	mask = RLC_SERDES_NONCU_MASTER_BUSY__SE_MASTER_BUSY_MASK | @@ -4281,7 +4283,6 @@ static int gfx_v8_0_cp_gfx_resume(struct amdgpu_device *adev)  	/* start the ring */  	amdgpu_ring_clear_ring(ring);  	gfx_v8_0_cp_gfx_start(adev); -	ring->sched.ready = true;  	return 0;  } @@ -4292,7 +4293,7 @@ static void gfx_v8_0_cp_compute_enable(struct amdgpu_device *adev, bool enable)  		WREG32(mmCP_MEC_CNTL, 0);  	} else {  		WREG32(mmCP_MEC_CNTL, (CP_MEC_CNTL__MEC_ME1_HALT_MASK | CP_MEC_CNTL__MEC_ME2_HALT_MASK)); -		adev->gfx.kiq.ring.sched.ready = false; +		adev->gfx.kiq[0].ring.sched.ready = false;  	}  	udelay(50);  } @@ -4314,12 +4315,12 @@ static void gfx_v8_0_kiq_setting(struct amdgpu_ring *ring)  static int gfx_v8_0_kiq_kcq_enable(struct amdgpu_device *adev)  { -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	uint64_t queue_mask = 0;  	int r, i;  	for (i = 0; i < AMDGPU_MAX_COMPUTE_QUEUES; ++i) { -		if (!test_bit(i, adev->gfx.mec.queue_bitmap)) +		if (!test_bit(i, adev->gfx.mec_bitmap[0].queue_bitmap))  			continue;  		/* This situation may be hit in the future if a new HW @@ -4595,14 +4596,13 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)  {  	struct amdgpu_device *adev = ring->adev;  	struct vi_mqd *mqd = ring->mqd_ptr; -	int mqd_idx = AMDGPU_MAX_COMPUTE_RINGS;  	gfx_v8_0_kiq_setting(ring);  	if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */  		/* reset MQD to a clean status */ -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(mqd, adev->gfx.kiq[0].mqd_backup, sizeof(struct vi_mqd_allocation));  		/* reset ring buffer */  		ring->wptr = 0; @@ -4625,8 +4625,8 @@ static int gfx_v8_0_kiq_init_queue(struct amdgpu_ring *ring)  		vi_srbm_select(adev, 0, 0, 0, 0);  		mutex_unlock(&adev->srbm_mutex); -		if (adev->gfx.mec.mqd_backup[mqd_idx]) -			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); +		if (adev->gfx.kiq[0].mqd_backup) +			memcpy(adev->gfx.kiq[0].mqd_backup, mqd, sizeof(struct vi_mqd_allocation));  	}  	return 0; @@ -4650,15 +4650,13 @@ static int gfx_v8_0_kcq_init_queue(struct amdgpu_ring *ring)  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(adev->gfx.mec.mqd_backup[mqd_idx], mqd, sizeof(struct vi_mqd_allocation)); -	} else if (amdgpu_in_reset(adev)) { /* for GPU_RESET case */ -		/* reset MQD to a clean status */ +	} else { +		/* restore MQD to a clean status */  		if (adev->gfx.mec.mqd_backup[mqd_idx])  			memcpy(mqd, adev->gfx.mec.mqd_backup[mqd_idx], sizeof(struct vi_mqd_allocation));  		/* reset ring buffer */  		ring->wptr = 0;  		amdgpu_ring_clear_ring(ring); -	} else { -		amdgpu_ring_clear_ring(ring);  	}  	return 0;  } @@ -4678,21 +4676,22 @@ static int gfx_v8_0_kiq_resume(struct amdgpu_device *adev)  	struct amdgpu_ring *ring;  	int r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_bo_reserve(ring->mqd_obj, false);  	if (unlikely(r != 0))  		return r;  	r = amdgpu_bo_kmap(ring->mqd_obj, &ring->mqd_ptr); -	if (unlikely(r != 0)) +	if (unlikely(r != 0)) { +		amdgpu_bo_unreserve(ring->mqd_obj);  		return r; +	}  	gfx_v8_0_kiq_init_queue(ring);  	amdgpu_bo_kunmap(ring->mqd_obj);  	ring->mqd_ptr = NULL;  	amdgpu_bo_unreserve(ring->mqd_obj); -	ring->sched.ready = true;  	return 0;  } @@ -4741,7 +4740,7 @@ static int gfx_v8_0_cp_test_all_rings(struct amdgpu_device *adev)  	if (r)  		return r; -	ring = &adev->gfx.kiq.ring; +	ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_ring_test_helper(ring);  	if (r)  		return r; @@ -4808,7 +4807,7 @@ static int gfx_v8_0_hw_init(void *handle)  static int gfx_v8_0_kcq_disable(struct amdgpu_device *adev)  {  	int r, i; -	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq.ring; +	struct amdgpu_ring *kiq_ring = &adev->gfx.kiq[0].ring;  	r = amdgpu_ring_alloc(kiq_ring, 6 * adev->gfx.num_compute_rings);  	if (r) @@ -4902,7 +4901,7 @@ static int gfx_v8_0_hw_fini(void *handle)  		pr_debug("For SRIOV client, shouldn't do anything.\n");  		return 0;  	} -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if (!gfx_v8_0_wait_for_idle(adev))  		gfx_v8_0_cp_enable(adev, false);  	else @@ -4911,7 +4910,7 @@ static int gfx_v8_0_hw_fini(void *handle)  		adev->gfx.rlc.funcs->stop(adev);  	else  		pr_err("rlc is busy, skip halt rlc\n"); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -5216,7 +5215,7 @@ static void wave_read_regs(struct amdgpu_device *adev, uint32_t simd,  		*(out++) = RREG32(mmSQ_IND_DATA);  } -static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) +static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields)  {  	/* type 0 wave data */  	dst[(*no_fields)++] = 0; @@ -5241,7 +5240,7 @@ static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, u  	dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_MODE);  } -static void gfx_v8_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t simd, +static void gfx_v8_0_read_wave_sgprs(struct amdgpu_device *adev, uint32_t xcc_id, uint32_t simd,  				     uint32_t wave, uint32_t start,  				     uint32_t size, uint32_t *dst)  { @@ -5263,6 +5262,7 @@ static int gfx_v8_0_early_init(void *handle)  {  	struct amdgpu_device *adev = (struct amdgpu_device *)handle; +	adev->gfx.xcc_mask = 1;  	adev->gfx.num_gfx_rings = GFX8_NUM_GFX_RINGS;  	adev->gfx.num_compute_rings = min(amdgpu_gfx_get_num_kcq(adev),  					  AMDGPU_MAX_COMPUTE_RINGS); @@ -5376,7 +5376,7 @@ static int gfx_v8_0_set_powergating_state(void *handle,  				AMD_PG_SUPPORT_RLC_SMU_HS |  				AMD_PG_SUPPORT_CP |  				AMD_PG_SUPPORT_GFX_DMG)) -		amdgpu_gfx_rlc_enter_safe_mode(adev); +		amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	switch (adev->asic_type) {  	case CHIP_CARRIZO:  	case CHIP_STONEY: @@ -5430,7 +5430,7 @@ static int gfx_v8_0_set_powergating_state(void *handle,  				AMD_PG_SUPPORT_RLC_SMU_HS |  				AMD_PG_SUPPORT_CP |  				AMD_PG_SUPPORT_GFX_DMG)) -		amdgpu_gfx_rlc_exit_safe_mode(adev); +		amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  	return 0;  } @@ -5481,7 +5481,7 @@ static void gfx_v8_0_send_serdes_cmd(struct amdgpu_device *adev,  {  	uint32_t data; -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	WREG32(mmRLC_SERDES_WR_CU_MASTER_MASK, 0xffffffff);  	WREG32(mmRLC_SERDES_WR_NONCU_MASTER_MASK, 0xffffffff); @@ -5535,7 +5535,7 @@ static bool gfx_v8_0_is_rlc_enabled(struct amdgpu_device *adev)  	return true;  } -static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev) +static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -5562,7 +5562,7 @@ static void gfx_v8_0_set_safe_mode(struct amdgpu_device *adev)  	}  } -static void gfx_v8_0_unset_safe_mode(struct amdgpu_device *adev) +static void gfx_v8_0_unset_safe_mode(struct amdgpu_device *adev, int xcc_id)  {  	uint32_t data;  	unsigned i; @@ -5621,7 +5621,7 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev  {  	uint32_t temp, data; -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	/* It is disabled by HW by default */  	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_MGCG)) { @@ -5717,7 +5717,7 @@ static void gfx_v8_0_update_medium_grain_clock_gating(struct amdgpu_device *adev  		gfx_v8_0_wait_for_rlc_serdes(adev);  	} -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev, @@ -5727,7 +5727,7 @@ static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev  	temp = data = RREG32(mmRLC_CGCG_CGLS_CTRL); -	amdgpu_gfx_rlc_enter_safe_mode(adev); +	amdgpu_gfx_rlc_enter_safe_mode(adev, 0);  	if (enable && (adev->cg_flags & AMD_CG_SUPPORT_GFX_CGCG)) {  		temp1 = data1 =	RREG32(mmRLC_CGTT_MGCG_OVERRIDE); @@ -5810,7 +5810,7 @@ static void gfx_v8_0_update_coarse_grain_clock_gating(struct amdgpu_device *adev  	gfx_v8_0_wait_for_rlc_serdes(adev); -	amdgpu_gfx_rlc_exit_safe_mode(adev); +	amdgpu_gfx_rlc_exit_safe_mode(adev, 0);  }  static int gfx_v8_0_update_gfx_clock_gating(struct amdgpu_device *adev,  					    bool enable) @@ -6723,11 +6723,11 @@ static void gfx_v8_0_parse_sq_irq(struct amdgpu_device *adev, unsigned ih_data,  			 */  			if (from_wq) {  				mutex_lock(&adev->grbm_idx_mutex); -				gfx_v8_0_select_se_sh(adev, se_id, sh_id, cu_id); +				gfx_v8_0_select_se_sh(adev, se_id, sh_id, cu_id, 0);  				sq_edc_source = REG_GET_FIELD(RREG32(mmSQ_EDC_INFO), SQ_EDC_INFO, SOURCE); -				gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +				gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  				mutex_unlock(&adev->grbm_idx_mutex);  			} @@ -7001,7 +7001,7 @@ static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev)  {  	int i; -	adev->gfx.kiq.ring.funcs = &gfx_v8_0_ring_funcs_kiq; +	adev->gfx.kiq[0].ring.funcs = &gfx_v8_0_ring_funcs_kiq;  	for (i = 0; i < adev->gfx.num_gfx_rings; i++)  		adev->gfx.gfx_ring[i].funcs = &gfx_v8_0_ring_funcs_gfx; @@ -7116,7 +7116,7 @@ static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)  			mask = 1;  			ao_bitmap = 0;  			counter = 0; -			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); +			gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff, 0);  			if (i < 4 && j < 2)  				gfx_v8_0_set_user_cu_inactive_bitmap(  					adev, disable_masks[i * 2 + j]); @@ -7137,7 +7137,7 @@ static void gfx_v8_0_get_cu_info(struct amdgpu_device *adev)  			cu_info->ao_cu_bitmap[i][j] = ao_bitmap;  		}  	} -	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); +	gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff, 0);  	mutex_unlock(&adev->grbm_idx_mutex);  	cu_info->number = active_cu_number;  | 
