diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/si.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si.c | 116 | 
1 files changed, 73 insertions, 43 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/si.c b/drivers/gpu/drm/amd/amdgpu/si.c index c0b1aabf282f..8284d5dbfc30 100644 --- a/drivers/gpu/drm/amd/amdgpu/si.c +++ b/drivers/gpu/drm/amd/amdgpu/si.c @@ -24,7 +24,7 @@  #include <linux/firmware.h>  #include <linux/slab.h>  #include <linux/module.h> -#include "drmP.h" +#include <drm/drmP.h>  #include "amdgpu.h"  #include "amdgpu_atombios.h"  #include "amdgpu_ih.h" @@ -971,44 +971,44 @@ static void si_smc_wreg(struct amdgpu_device *adev, u32 reg, u32 v)  }  static struct amdgpu_allowed_register_entry si_allowed_read_registers[] = { -	{GRBM_STATUS, false}, -	{GB_ADDR_CONFIG, false}, -	{MC_ARB_RAMCFG, false}, -	{GB_TILE_MODE0, false}, -	{GB_TILE_MODE1, false}, -	{GB_TILE_MODE2, false}, -	{GB_TILE_MODE3, false}, -	{GB_TILE_MODE4, false}, -	{GB_TILE_MODE5, false}, -	{GB_TILE_MODE6, false}, -	{GB_TILE_MODE7, false}, -	{GB_TILE_MODE8, false}, -	{GB_TILE_MODE9, false}, -	{GB_TILE_MODE10, false}, -	{GB_TILE_MODE11, false}, -	{GB_TILE_MODE12, false}, -	{GB_TILE_MODE13, false}, -	{GB_TILE_MODE14, false}, -	{GB_TILE_MODE15, false}, -	{GB_TILE_MODE16, false}, -	{GB_TILE_MODE17, false}, -	{GB_TILE_MODE18, false}, -	{GB_TILE_MODE19, false}, -	{GB_TILE_MODE20, false}, -	{GB_TILE_MODE21, false}, -	{GB_TILE_MODE22, false}, -	{GB_TILE_MODE23, false}, -	{GB_TILE_MODE24, false}, -	{GB_TILE_MODE25, false}, -	{GB_TILE_MODE26, false}, -	{GB_TILE_MODE27, false}, -	{GB_TILE_MODE28, false}, -	{GB_TILE_MODE29, false}, -	{GB_TILE_MODE30, false}, -	{GB_TILE_MODE31, false}, -	{CC_RB_BACKEND_DISABLE, false, true}, -	{GC_USER_RB_BACKEND_DISABLE, false, true}, -	{PA_SC_RASTER_CONFIG, false, true}, +	{GRBM_STATUS}, +	{GB_ADDR_CONFIG}, +	{MC_ARB_RAMCFG}, +	{GB_TILE_MODE0}, +	{GB_TILE_MODE1}, +	{GB_TILE_MODE2}, +	{GB_TILE_MODE3}, +	{GB_TILE_MODE4}, +	{GB_TILE_MODE5}, +	{GB_TILE_MODE6}, +	{GB_TILE_MODE7}, +	{GB_TILE_MODE8}, +	{GB_TILE_MODE9}, +	{GB_TILE_MODE10}, +	{GB_TILE_MODE11}, +	{GB_TILE_MODE12}, +	{GB_TILE_MODE13}, +	{GB_TILE_MODE14}, +	{GB_TILE_MODE15}, +	{GB_TILE_MODE16}, +	{GB_TILE_MODE17}, +	{GB_TILE_MODE18}, +	{GB_TILE_MODE19}, +	{GB_TILE_MODE20}, +	{GB_TILE_MODE21}, +	{GB_TILE_MODE22}, +	{GB_TILE_MODE23}, +	{GB_TILE_MODE24}, +	{GB_TILE_MODE25}, +	{GB_TILE_MODE26}, +	{GB_TILE_MODE27}, +	{GB_TILE_MODE28}, +	{GB_TILE_MODE29}, +	{GB_TILE_MODE30}, +	{GB_TILE_MODE31}, +	{CC_RB_BACKEND_DISABLE, true}, +	{GC_USER_RB_BACKEND_DISABLE, true}, +	{PA_SC_RASTER_CONFIG, true},  };  static uint32_t si_get_register_value(struct amdgpu_device *adev, @@ -1093,13 +1093,13 @@ static int si_read_register(struct amdgpu_device *adev, u32 se_num,  	*value = 0;  	for (i = 0; i < ARRAY_SIZE(si_allowed_read_registers); i++) { +		bool indexed = si_allowed_read_registers[i].grbm_indexed; +  		if (reg_offset != si_allowed_read_registers[i].reg_offset)  			continue; -		if (!si_allowed_read_registers[i].untouched) -			*value = si_get_register_value(adev, -						si_allowed_read_registers[i].grbm_indexed, -						se_num, sh_num, reg_offset); +		*value = si_get_register_value(adev, indexed, se_num, sh_num, +					       reg_offset);  		return 0;  	}  	return -EINVAL; @@ -1150,6 +1150,33 @@ static bool si_read_disabled_bios(struct amdgpu_device *adev)  	return r;  } +#define mmROM_INDEX 0x2A +#define mmROM_DATA  0x2B + +static bool si_read_bios_from_rom(struct amdgpu_device *adev, +				  u8 *bios, u32 length_bytes) +{ +	u32 *dw_ptr; +	u32 i, length_dw; + +	if (bios == NULL) +		return false; +	if (length_bytes == 0) +		return false; +	/* APU vbios image is part of sbios image */ +	if (adev->flags & AMD_IS_APU) +		return false; + +	dw_ptr = (u32 *)bios; +	length_dw = ALIGN(length_bytes, 4) / 4; +	/* set rom index to 0 */ +	WREG32(mmROM_INDEX, 0); +	for (i = 0; i < length_dw; i++) +		dw_ptr[i] = RREG32(mmROM_DATA); + +	return true; +} +  //xxx: not implemented  static int si_asic_reset(struct amdgpu_device *adev)  { @@ -1206,6 +1233,7 @@ static void si_detect_hw_virtualization(struct amdgpu_device *adev)  static const struct amdgpu_asic_funcs si_asic_funcs =  {  	.read_disabled_bios = &si_read_disabled_bios, +	.read_bios_from_rom = &si_read_bios_from_rom,  	.read_register = &si_read_register,  	.reset = &si_asic_reset,  	.set_vga_state = &si_vga_set_state, @@ -1385,6 +1413,7 @@ static void si_init_golden_registers(struct amdgpu_device *adev)  		amdgpu_program_register_sequence(adev,  						 pitcairn_mgcg_cgcg_init,  						 (const u32)ARRAY_SIZE(pitcairn_mgcg_cgcg_init)); +		break;  	case CHIP_VERDE:  		amdgpu_program_register_sequence(adev,  						 verde_golden_registers, @@ -1409,6 +1438,7 @@ static void si_init_golden_registers(struct amdgpu_device *adev)  		amdgpu_program_register_sequence(adev,  						 oland_mgcg_cgcg_init,  						 (const u32)ARRAY_SIZE(oland_mgcg_cgcg_init)); +		break;  	case CHIP_HAINAN:  		amdgpu_program_register_sequence(adev,  						 hainan_golden_registers, |