diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/cik.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/cik.c | 475 | 
1 files changed, 85 insertions, 390 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c index 4efc901f658c..302df85893ab 100644 --- a/drivers/gpu/drm/amd/amdgpu/cik.c +++ b/drivers/gpu/drm/amd/amdgpu/cik.c @@ -67,6 +67,7 @@  #include "amdgpu_amdkfd.h"  #include "amdgpu_powerplay.h" +#include "dce_virtual.h"  /*   * Indirect registers accessor @@ -962,12 +963,6 @@ static bool cik_read_bios_from_rom(struct amdgpu_device *adev,  	return true;  } -static u32 cik_get_virtual_caps(struct amdgpu_device *adev) -{ -	/* CIK does not support SR-IOV */ -	return 0; -} -  static const struct amdgpu_allowed_register_entry cik_allowed_read_registers[] = {  	{mmGRBM_STATUS, false},  	{mmGB_ADDR_CONFIG, false}, @@ -1194,18 +1189,6 @@ static int cik_gpu_pci_config_reset(struct amdgpu_device *adev)  	return r;  } -static void cik_set_bios_scratch_engine_hung(struct amdgpu_device *adev, bool hung) -{ -	u32 tmp = RREG32(mmBIOS_SCRATCH_3); - -	if (hung) -		tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG; -	else -		tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG; - -	WREG32(mmBIOS_SCRATCH_3, tmp); -} -  /**   * cik_asic_reset - soft reset GPU   * @@ -1218,11 +1201,12 @@ static void cik_set_bios_scratch_engine_hung(struct amdgpu_device *adev, bool hu  static int cik_asic_reset(struct amdgpu_device *adev)  {  	int r; -	cik_set_bios_scratch_engine_hung(adev, true); + +	amdgpu_atombios_scratch_regs_engine_hung(adev, true);  	r = cik_gpu_pci_config_reset(adev); -	cik_set_bios_scratch_engine_hung(adev, false); +	amdgpu_atombios_scratch_regs_engine_hung(adev, false);  	return r;  } @@ -1640,388 +1624,23 @@ static uint32_t cik_get_rev_id(struct amdgpu_device *adev)  		>> CC_DRM_ID_STRAPS__ATI_REV_ID__SHIFT;  } -static const struct amdgpu_ip_block_version bonaire_ip_blocks[] = -{ -	/* ORDER MATTERS! */ -	{ -		.type = AMD_IP_BLOCK_TYPE_COMMON, -		.major = 1, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_common_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &gmc_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_IH, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_ih_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &amdgpu_pp_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_DCE, -		.major = 8, -		.minor = 2, -		.rev = 0, -		.funcs = &dce_v8_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GFX, -		.major = 7, -		.minor = 2, -		.rev = 0, -		.funcs = &gfx_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SDMA, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_sdma_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_UVD, -		.major = 4, -		.minor = 2, -		.rev = 0, -		.funcs = &uvd_v4_2_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_VCE, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &vce_v2_0_ip_funcs, -	}, -}; - -static const struct amdgpu_ip_block_version hawaii_ip_blocks[] = +static void cik_detect_hw_virtualization(struct amdgpu_device *adev)  { -	/* ORDER MATTERS! */ -	{ -		.type = AMD_IP_BLOCK_TYPE_COMMON, -		.major = 1, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_common_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &gmc_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_IH, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_ih_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &amdgpu_pp_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_DCE, -		.major = 8, -		.minor = 5, -		.rev = 0, -		.funcs = &dce_v8_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GFX, -		.major = 7, -		.minor = 3, -		.rev = 0, -		.funcs = &gfx_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SDMA, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_sdma_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_UVD, -		.major = 4, -		.minor = 2, -		.rev = 0, -		.funcs = &uvd_v4_2_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_VCE, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &vce_v2_0_ip_funcs, -	}, -}; - -static const struct amdgpu_ip_block_version kabini_ip_blocks[] = -{ -	/* ORDER MATTERS! */ -	{ -		.type = AMD_IP_BLOCK_TYPE_COMMON, -		.major = 1, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_common_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &gmc_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_IH, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_ih_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &amdgpu_pp_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_DCE, -		.major = 8, -		.minor = 3, -		.rev = 0, -		.funcs = &dce_v8_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GFX, -		.major = 7, -		.minor = 2, -		.rev = 0, -		.funcs = &gfx_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SDMA, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_sdma_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_UVD, -		.major = 4, -		.minor = 2, -		.rev = 0, -		.funcs = &uvd_v4_2_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_VCE, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &vce_v2_0_ip_funcs, -	}, -}; - -static const struct amdgpu_ip_block_version mullins_ip_blocks[] = -{ -	/* ORDER MATTERS! */ -	{ -		.type = AMD_IP_BLOCK_TYPE_COMMON, -		.major = 1, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_common_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &gmc_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_IH, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_ih_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &amdgpu_pp_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_DCE, -		.major = 8, -		.minor = 3, -		.rev = 0, -		.funcs = &dce_v8_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GFX, -		.major = 7, -		.minor = 2, -		.rev = 0, -		.funcs = &gfx_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SDMA, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_sdma_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_UVD, -		.major = 4, -		.minor = 2, -		.rev = 0, -		.funcs = &uvd_v4_2_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_VCE, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &vce_v2_0_ip_funcs, -	}, -}; - -static const struct amdgpu_ip_block_version kaveri_ip_blocks[] = -{ -	/* ORDER MATTERS! */ -	{ -		.type = AMD_IP_BLOCK_TYPE_COMMON, -		.major = 1, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_common_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &gmc_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_IH, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_ih_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SMC, -		.major = 7, -		.minor = 0, -		.rev = 0, -		.funcs = &amdgpu_pp_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_DCE, -		.major = 8, -		.minor = 1, -		.rev = 0, -		.funcs = &dce_v8_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_GFX, -		.major = 7, -		.minor = 1, -		.rev = 0, -		.funcs = &gfx_v7_0_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_SDMA, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &cik_sdma_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_UVD, -		.major = 4, -		.minor = 2, -		.rev = 0, -		.funcs = &uvd_v4_2_ip_funcs, -	}, -	{ -		.type = AMD_IP_BLOCK_TYPE_VCE, -		.major = 2, -		.minor = 0, -		.rev = 0, -		.funcs = &vce_v2_0_ip_funcs, -	}, -}; - -int cik_set_ip_blocks(struct amdgpu_device *adev) -{ -	switch (adev->asic_type) { -	case CHIP_BONAIRE: -		adev->ip_blocks = bonaire_ip_blocks; -		adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks); -		break; -	case CHIP_HAWAII: -		adev->ip_blocks = hawaii_ip_blocks; -		adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks); -		break; -	case CHIP_KAVERI: -		adev->ip_blocks = kaveri_ip_blocks; -		adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks); -		break; -	case CHIP_KABINI: -		adev->ip_blocks = kabini_ip_blocks; -		adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks); -		break; -	case CHIP_MULLINS: -		adev->ip_blocks = mullins_ip_blocks; -		adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks); -		break; -	default: -		/* FIXME: not supported yet */ -		return -EINVAL; -	} - -	return 0; +	if (is_virtual_machine()) /* passthrough mode */ +		adev->virtualization.virtual_caps |= AMDGPU_PASSTHROUGH_MODE;  }  static const struct amdgpu_asic_funcs cik_asic_funcs =  {  	.read_disabled_bios = &cik_read_disabled_bios,  	.read_bios_from_rom = &cik_read_bios_from_rom, +	.detect_hw_virtualization = cik_detect_hw_virtualization,  	.read_register = &cik_read_register,  	.reset = &cik_asic_reset,  	.set_vga_state = &cik_vga_set_state,  	.get_xclk = &cik_get_xclk,  	.set_uvd_clocks = &cik_set_uvd_clocks,  	.set_vce_clocks = &cik_set_vce_clocks, -	.get_virtual_caps = &cik_get_virtual_caps,  };  static int cik_common_early_init(void *handle) @@ -2243,7 +1862,7 @@ static int cik_common_set_powergating_state(void *handle,  	return 0;  } -const struct amd_ip_funcs cik_common_ip_funcs = { +static const struct amd_ip_funcs cik_common_ip_funcs = {  	.name = "cik_common",  	.early_init = cik_common_early_init,  	.late_init = NULL, @@ -2259,3 +1878,79 @@ const struct amd_ip_funcs cik_common_ip_funcs = {  	.set_clockgating_state = cik_common_set_clockgating_state,  	.set_powergating_state = cik_common_set_powergating_state,  }; + +static const struct amdgpu_ip_block_version cik_common_ip_block = +{ +	.type = AMD_IP_BLOCK_TYPE_COMMON, +	.major = 1, +	.minor = 0, +	.rev = 0, +	.funcs = &cik_common_ip_funcs, +}; + +int cik_set_ip_blocks(struct amdgpu_device *adev) +{ +	switch (adev->asic_type) { +	case CHIP_BONAIRE: +		amdgpu_ip_block_add(adev, &cik_common_ip_block); +		amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); +		amdgpu_ip_block_add(adev, &cik_ih_ip_block); +		amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); +		if (adev->enable_virtual_display) +			amdgpu_ip_block_add(adev, &dce_virtual_ip_block); +		else +			amdgpu_ip_block_add(adev, &dce_v8_2_ip_block); +		amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); +		amdgpu_ip_block_add(adev, &cik_sdma_ip_block); +		amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); +		amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); +		break; +	case CHIP_HAWAII: +		amdgpu_ip_block_add(adev, &cik_common_ip_block); +		amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); +		amdgpu_ip_block_add(adev, &cik_ih_ip_block); +		amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); +		if (adev->enable_virtual_display) +			amdgpu_ip_block_add(adev, &dce_virtual_ip_block); +		else +			amdgpu_ip_block_add(adev, &dce_v8_5_ip_block); +		amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block); +		amdgpu_ip_block_add(adev, &cik_sdma_ip_block); +		amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); +		amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); +		break; +	case CHIP_KAVERI: +		amdgpu_ip_block_add(adev, &cik_common_ip_block); +		amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); +		amdgpu_ip_block_add(adev, &cik_ih_ip_block); +		amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); +		if (adev->enable_virtual_display) +			amdgpu_ip_block_add(adev, &dce_virtual_ip_block); +		else +			amdgpu_ip_block_add(adev, &dce_v8_1_ip_block); +		amdgpu_ip_block_add(adev, &gfx_v7_1_ip_block); +		amdgpu_ip_block_add(adev, &cik_sdma_ip_block); +		amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); +		amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); +		break; +	case CHIP_KABINI: +	case CHIP_MULLINS: +		amdgpu_ip_block_add(adev, &cik_common_ip_block); +		amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); +		amdgpu_ip_block_add(adev, &cik_ih_ip_block); +		amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); +		if (adev->enable_virtual_display) +			amdgpu_ip_block_add(adev, &dce_virtual_ip_block); +		else +			amdgpu_ip_block_add(adev, &dce_v8_3_ip_block); +		amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); +		amdgpu_ip_block_add(adev, &cik_sdma_ip_block); +		amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); +		amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); +		break; +	default: +		/* FIXME: not supported yet */ +		return -EINVAL; +	} +	return 0; +}  | 
