diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/psp_v12_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/psp_v12_0.c | 172 | 
1 files changed, 7 insertions, 165 deletions
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,  |