3333
3434MODULE_FIRMWARE ("amdgpu/gc_12_0_1_imu.bin" );
3535
36+ #define TRANSFER_RAM_MASK 0x001c0000
37+
3638static int imu_v12_0_init_microcode (struct amdgpu_device * adev )
3739{
3840 char fw_name [40 ];
@@ -245,9 +247,9 @@ static const struct imu_rlc_ram_golden imu_rlc_ram_golden_12_0_1[] = {
245247 IMU_RLC_RAM_GOLDEN_VALUE (GC , 0 , regGCMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR_MSB , 0 , 0x1c0000 )
246248};
247249
248- static void program_imu_rlc_ram (struct amdgpu_device * adev ,
249- const struct imu_rlc_ram_golden * regs ,
250- const u32 array_size )
250+ static void program_imu_rlc_ram_old (struct amdgpu_device * adev ,
251+ const struct imu_rlc_ram_golden * regs ,
252+ const u32 array_size )
251253{
252254 const struct imu_rlc_ram_golden * entry ;
253255 u32 reg , data ;
@@ -271,28 +273,78 @@ static void program_imu_rlc_ram(struct amdgpu_device *adev,
271273 WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_LOW , reg );
272274 WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_DATA , data );
273275 }
274- //Indicate the latest entry
275- WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_HIGH , 0 );
276- WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_LOW , 0 );
277- WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_DATA , 0 );
276+ }
277+
278+ static u32 imu_v12_0_grbm_gfx_index_remap (struct amdgpu_device * adev ,
279+ u32 data , bool high )
280+ {
281+ u32 val , inst_index ;
282+
283+ inst_index = REG_GET_FIELD (data , GRBM_GFX_INDEX , INSTANCE_INDEX );
284+
285+ if (high )
286+ val = inst_index >> 5 ;
287+ else
288+ val = REG_GET_FIELD (data , GRBM_GFX_INDEX , SE_BROADCAST_WRITES ) << 18 |
289+ REG_GET_FIELD (data , GRBM_GFX_INDEX , SA_BROADCAST_WRITES ) << 19 |
290+ REG_GET_FIELD (data , GRBM_GFX_INDEX , INSTANCE_BROADCAST_WRITES ) << 20 |
291+ REG_GET_FIELD (data , GRBM_GFX_INDEX , SE_INDEX ) << 21 |
292+ REG_GET_FIELD (data , GRBM_GFX_INDEX , SA_INDEX ) << 25 |
293+ (inst_index & 0x1f );
294+
295+ return val ;
296+ }
297+
298+ static void program_imu_rlc_ram (struct amdgpu_device * adev ,
299+ const u32 * regs ,
300+ const u32 array_size )
301+ {
302+ u32 reg , data , val_h = 0 , val_l = TRANSFER_RAM_MASK ;
303+ int i ;
304+
305+ if (array_size % 3 )
306+ return ;
307+
308+ for (i = 0 ; i < array_size ; i += 3 ) {
309+ reg = regs [i + 0 ];
310+ data = regs [i + 2 ];
311+ if (reg == SOC15_REG_OFFSET (GC , 0 , regGRBM_GFX_INDEX )) {
312+ val_l = imu_v12_0_grbm_gfx_index_remap (adev , data , false);
313+ val_h = imu_v12_0_grbm_gfx_index_remap (adev , data , true);
314+ } else {
315+ WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_HIGH , val_h );
316+ WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_LOW , reg | val_l );
317+ WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_DATA , data );
318+ }
319+ }
278320}
279321
280322static void imu_v12_0_program_rlc_ram (struct amdgpu_device * adev )
281323{
282- u32 reg_data ;
324+ u32 reg_data , size = 0 ;
325+ const u32 * data ;
326+ int r = - EINVAL ;
283327
284328 WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_INDEX , 0x2 );
285329
286330 switch (amdgpu_ip_version (adev , GC_HWIP , 0 )) {
287331 case IP_VERSION (12 , 0 , 1 ):
288- program_imu_rlc_ram (adev , imu_rlc_ram_golden_12_0_1 ,
332+ if (!r )
333+ program_imu_rlc_ram (adev , data , (const u32 )size );
334+ else
335+ program_imu_rlc_ram_old (adev , imu_rlc_ram_golden_12_0_1 ,
289336 (const u32 )ARRAY_SIZE (imu_rlc_ram_golden_12_0_1 ));
290337 break ;
291338 default :
292339 BUG ();
293340 break ;
294341 }
295342
343+ //Indicate the latest entry
344+ WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_HIGH , 0 );
345+ WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_ADDR_LOW , 0 );
346+ WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_DATA , 0 );
347+
296348 reg_data = RREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_INDEX );
297349 reg_data |= GFX_IMU_RLC_RAM_INDEX__RAM_VALID_MASK ;
298350 WREG32_SOC15 (GC , 0 , regGFX_IMU_RLC_RAM_INDEX , reg_data );
0 commit comments