112112#define mmCP_HYP_ME_UCODE_DATA 0x5817
113113#define mmCP_HYP_ME_UCODE_DATA_BASE_IDX 1
114114
115+ //CC_GC_SA_UNIT_DISABLE
116+ #define mmCC_GC_SA_UNIT_DISABLE 0x0fe9
117+ #define mmCC_GC_SA_UNIT_DISABLE_BASE_IDX 0
118+ #define CC_GC_SA_UNIT_DISABLE__SA_DISABLE__SHIFT 0x8
119+ #define CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK 0x0000FF00L
120+ //GC_USER_SA_UNIT_DISABLE
121+ #define mmGC_USER_SA_UNIT_DISABLE 0x0fea
122+ #define mmGC_USER_SA_UNIT_DISABLE_BASE_IDX 0
123+ #define GC_USER_SA_UNIT_DISABLE__SA_DISABLE__SHIFT 0x8
124+ #define GC_USER_SA_UNIT_DISABLE__SA_DISABLE_MASK 0x0000FF00L
125+ //PA_SC_ENHANCE_3
126+ #define mmPA_SC_ENHANCE_3 0x1085
127+ #define mmPA_SC_ENHANCE_3_BASE_IDX 0
128+ #define PA_SC_ENHANCE_3__FORCE_PBB_WORKLOAD_MODE_TO_ZERO__SHIFT 0x3
129+ #define PA_SC_ENHANCE_3__FORCE_PBB_WORKLOAD_MODE_TO_ZERO_MASK 0x00000008L
130+
115131MODULE_FIRMWARE ("amdgpu/navi10_ce.bin" );
116132MODULE_FIRMWARE ("amdgpu/navi10_pfp.bin" );
117133MODULE_FIRMWARE ("amdgpu/navi10_me.bin" );
@@ -3091,6 +3107,7 @@ static const struct soc15_reg_golden golden_settings_gc_10_3[] =
30913107 SOC15_REG_GOLDEN_VALUE (GC , 0 , mmGL2C_ADDR_MATCH_MASK , 0xffffffff , 0xffffffcf ),
30923108 SOC15_REG_GOLDEN_VALUE (GC , 0 , mmGL2C_CM_CTRL1 , 0xff8fff0f , 0x580f1008 ),
30933109 SOC15_REG_GOLDEN_VALUE (GC , 0 , mmGL2C_CTRL3 , 0xf7ffffff , 0x10f80988 ),
3110+ SOC15_REG_GOLDEN_VALUE (GC , 0 , mmLDS_CONFIG , 0x00000020 , 0x00000020 ),
30943111 SOC15_REG_GOLDEN_VALUE (GC , 0 , mmPA_CL_ENHANCE , 0xf17fffff , 0x01200007 ),
30953112 SOC15_REG_GOLDEN_VALUE (GC , 0 , mmPA_SC_BINNER_TIMEOUT_COUNTER , 0xffffffff , 0x00000800 ),
30963113 SOC15_REG_GOLDEN_VALUE (GC , 0 , mmPA_SC_ENHANCE_2 , 0xffffffbf , 0x00000820 ),
@@ -3188,6 +3205,8 @@ static int gfx_v10_0_wait_for_rlc_autoload_complete(struct amdgpu_device *adev);
31883205static void gfx_v10_0_ring_emit_ce_meta (struct amdgpu_ring * ring , bool resume );
31893206static void gfx_v10_0_ring_emit_de_meta (struct amdgpu_ring * ring , bool resume );
31903207static void gfx_v10_0_ring_emit_frame_cntl (struct amdgpu_ring * ring , bool start , bool secure );
3208+ static u32 gfx_v10_3_get_disabled_sa (struct amdgpu_device * adev );
3209+ static void gfx_v10_3_program_pbb_mode (struct amdgpu_device * adev );
31913210
31923211static void gfx10_kiq_set_resources (struct amdgpu_ring * kiq_ring , uint64_t queue_mask )
31933212{
@@ -3586,6 +3605,17 @@ static void gfx_v10_0_init_rlc_ext_microcode(struct amdgpu_device *adev)
35863605 le32_to_cpu (rlc_hdr -> reg_list_format_direct_reg_list_length );
35873606}
35883607
3608+ static void gfx_v10_0_init_rlc_iram_dram_microcode (struct amdgpu_device * adev )
3609+ {
3610+ const struct rlc_firmware_header_v2_2 * rlc_hdr ;
3611+
3612+ rlc_hdr = (const struct rlc_firmware_header_v2_2 * )adev -> gfx .rlc_fw -> data ;
3613+ adev -> gfx .rlc .rlc_iram_ucode_size_bytes = le32_to_cpu (rlc_hdr -> rlc_iram_ucode_size_bytes );
3614+ adev -> gfx .rlc .rlc_iram_ucode = (u8 * )rlc_hdr + le32_to_cpu (rlc_hdr -> rlc_iram_ucode_offset_bytes );
3615+ adev -> gfx .rlc .rlc_dram_ucode_size_bytes = le32_to_cpu (rlc_hdr -> rlc_dram_ucode_size_bytes );
3616+ adev -> gfx .rlc .rlc_dram_ucode = (u8 * )rlc_hdr + le32_to_cpu (rlc_hdr -> rlc_dram_ucode_offset_bytes );
3617+ }
3618+
35893619static bool gfx_v10_0_navi10_gfxoff_should_enable (struct amdgpu_device * adev )
35903620{
35913621 bool ret = false;
@@ -3701,8 +3731,6 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
37013731 rlc_hdr = (const struct rlc_firmware_header_v2_0 * )adev -> gfx .rlc_fw -> data ;
37023732 version_major = le16_to_cpu (rlc_hdr -> header .header_version_major );
37033733 version_minor = le16_to_cpu (rlc_hdr -> header .header_version_minor );
3704- if (version_major == 2 && version_minor == 1 )
3705- adev -> gfx .rlc .is_rlc_v2_1 = true;
37063734
37073735 adev -> gfx .rlc_fw_version = le32_to_cpu (rlc_hdr -> header .ucode_version );
37083736 adev -> gfx .rlc_feature_version = le32_to_cpu (rlc_hdr -> ucode_feature_version );
@@ -3744,8 +3772,12 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
37443772 for (i = 0 ; i < (rlc_hdr -> reg_list_size_bytes >> 2 ); i ++ )
37453773 adev -> gfx .rlc .register_restore [i ] = le32_to_cpu (tmp [i ]);
37463774
3747- if (adev -> gfx .rlc .is_rlc_v2_1 )
3748- gfx_v10_0_init_rlc_ext_microcode (adev );
3775+ if (version_major == 2 ) {
3776+ if (version_minor >= 1 )
3777+ gfx_v10_0_init_rlc_ext_microcode (adev );
3778+ if (version_minor == 2 )
3779+ gfx_v10_0_init_rlc_iram_dram_microcode (adev );
3780+ }
37493781 }
37503782
37513783 snprintf (fw_name , sizeof (fw_name ), "amdgpu/%s_mec%s.bin" , chip_name , wks );
@@ -3806,8 +3838,7 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
38063838 adev -> firmware .fw_size +=
38073839 ALIGN (le32_to_cpu (header -> ucode_size_bytes ), PAGE_SIZE );
38083840 }
3809- if (adev -> gfx .rlc .is_rlc_v2_1 &&
3810- adev -> gfx .rlc .save_restore_list_cntl_size_bytes &&
3841+ if (adev -> gfx .rlc .save_restore_list_cntl_size_bytes &&
38113842 adev -> gfx .rlc .save_restore_list_gpm_size_bytes &&
38123843 adev -> gfx .rlc .save_restore_list_srm_size_bytes ) {
38133844 info = & adev -> firmware .ucode [AMDGPU_UCODE_ID_RLC_RESTORE_LIST_CNTL ];
@@ -3827,6 +3858,21 @@ static int gfx_v10_0_init_microcode(struct amdgpu_device *adev)
38273858 info -> fw = adev -> gfx .rlc_fw ;
38283859 adev -> firmware .fw_size +=
38293860 ALIGN (adev -> gfx .rlc .save_restore_list_srm_size_bytes , PAGE_SIZE );
3861+
3862+ if (adev -> gfx .rlc .rlc_iram_ucode_size_bytes &&
3863+ adev -> gfx .rlc .rlc_dram_ucode_size_bytes ) {
3864+ info = & adev -> firmware .ucode [AMDGPU_UCODE_ID_RLC_IRAM ];
3865+ info -> ucode_id = AMDGPU_UCODE_ID_RLC_IRAM ;
3866+ info -> fw = adev -> gfx .rlc_fw ;
3867+ adev -> firmware .fw_size +=
3868+ ALIGN (adev -> gfx .rlc .rlc_iram_ucode_size_bytes , PAGE_SIZE );
3869+
3870+ info = & adev -> firmware .ucode [AMDGPU_UCODE_ID_RLC_DRAM ];
3871+ info -> ucode_id = AMDGPU_UCODE_ID_RLC_DRAM ;
3872+ info -> fw = adev -> gfx .rlc_fw ;
3873+ adev -> firmware .fw_size +=
3874+ ALIGN (adev -> gfx .rlc .rlc_dram_ucode_size_bytes , PAGE_SIZE );
3875+ }
38303876 }
38313877
38323878 info = & adev -> firmware .ucode [AMDGPU_UCODE_ID_CP_MEC1 ];
@@ -4536,12 +4582,17 @@ static void gfx_v10_0_setup_rb(struct amdgpu_device *adev)
45364582 int i , j ;
45374583 u32 data ;
45384584 u32 active_rbs = 0 ;
4585+ u32 bitmap ;
45394586 u32 rb_bitmap_width_per_sh = adev -> gfx .config .max_backends_per_se /
45404587 adev -> gfx .config .max_sh_per_se ;
45414588
45424589 mutex_lock (& adev -> grbm_idx_mutex );
45434590 for (i = 0 ; i < adev -> gfx .config .max_shader_engines ; i ++ ) {
45444591 for (j = 0 ; j < adev -> gfx .config .max_sh_per_se ; j ++ ) {
4592+ bitmap = i * adev -> gfx .config .max_sh_per_se + j ;
4593+ if ((adev -> asic_type == CHIP_SIENNA_CICHLID ) &&
4594+ ((gfx_v10_3_get_disabled_sa (adev ) >> bitmap ) & 1 ))
4595+ continue ;
45454596 gfx_v10_0_select_se_sh (adev , i , j , 0xffffffff );
45464597 data = gfx_v10_0_get_rb_active_bitmap (adev );
45474598 active_rbs |= data << ((i * adev -> gfx .config .max_sh_per_se + j ) *
@@ -6950,6 +7001,9 @@ static int gfx_v10_0_hw_init(void *handle)
69507001 if (r )
69517002 return r ;
69527003
7004+ if (adev -> asic_type == CHIP_SIENNA_CICHLID )
7005+ gfx_v10_3_program_pbb_mode (adev );
7006+
69537007 return r ;
69547008}
69557009
@@ -8763,6 +8817,10 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,
87638817 mutex_lock (& adev -> grbm_idx_mutex );
87648818 for (i = 0 ; i < adev -> gfx .config .max_shader_engines ; i ++ ) {
87658819 for (j = 0 ; j < adev -> gfx .config .max_sh_per_se ; j ++ ) {
8820+ bitmap = i * adev -> gfx .config .max_sh_per_se + j ;
8821+ if ((adev -> asic_type == CHIP_SIENNA_CICHLID ) &&
8822+ ((gfx_v10_3_get_disabled_sa (adev ) >> bitmap ) & 1 ))
8823+ continue ;
87668824 mask = 1 ;
87678825 ao_bitmap = 0 ;
87688826 counter = 0 ;
@@ -8797,6 +8855,47 @@ static int gfx_v10_0_get_cu_info(struct amdgpu_device *adev,
87978855 return 0 ;
87988856}
87998857
8858+ static u32 gfx_v10_3_get_disabled_sa (struct amdgpu_device * adev )
8859+ {
8860+ uint32_t efuse_setting , vbios_setting , disabled_sa , max_sa_mask ;
8861+
8862+ efuse_setting = RREG32_SOC15 (GC , 0 , mmCC_GC_SA_UNIT_DISABLE );
8863+ efuse_setting &= CC_GC_SA_UNIT_DISABLE__SA_DISABLE_MASK ;
8864+ efuse_setting >>= CC_GC_SA_UNIT_DISABLE__SA_DISABLE__SHIFT ;
8865+
8866+ vbios_setting = RREG32_SOC15 (GC , 0 , mmGC_USER_SA_UNIT_DISABLE );
8867+ vbios_setting &= GC_USER_SA_UNIT_DISABLE__SA_DISABLE_MASK ;
8868+ vbios_setting >>= GC_USER_SA_UNIT_DISABLE__SA_DISABLE__SHIFT ;
8869+
8870+ max_sa_mask = amdgpu_gfx_create_bitmask (adev -> gfx .config .max_sh_per_se *
8871+ adev -> gfx .config .max_shader_engines );
8872+ disabled_sa = efuse_setting | vbios_setting ;
8873+ disabled_sa &= max_sa_mask ;
8874+
8875+ return disabled_sa ;
8876+ }
8877+
8878+ static void gfx_v10_3_program_pbb_mode (struct amdgpu_device * adev )
8879+ {
8880+ uint32_t max_sa_per_se , max_sa_per_se_mask , max_shader_engines ;
8881+ uint32_t disabled_sa_mask , se_index , disabled_sa_per_se ;
8882+
8883+ disabled_sa_mask = gfx_v10_3_get_disabled_sa (adev );
8884+
8885+ max_sa_per_se = adev -> gfx .config .max_sh_per_se ;
8886+ max_sa_per_se_mask = (1 << max_sa_per_se ) - 1 ;
8887+ max_shader_engines = adev -> gfx .config .max_shader_engines ;
8888+
8889+ for (se_index = 0 ; max_shader_engines > se_index ; se_index ++ ) {
8890+ disabled_sa_per_se = disabled_sa_mask >> (se_index * max_sa_per_se );
8891+ disabled_sa_per_se &= max_sa_per_se_mask ;
8892+ if (disabled_sa_per_se == max_sa_per_se_mask ) {
8893+ WREG32_FIELD15 (GC , 0 , PA_SC_ENHANCE_3 , FORCE_PBB_WORKLOAD_MODE_TO_ZERO , 1 );
8894+ break ;
8895+ }
8896+ }
8897+ }
8898+
88008899const struct amdgpu_ip_block_version gfx_v10_0_ip_block =
88018900{
88028901 .type = AMD_IP_BLOCK_TYPE_GFX ,
0 commit comments