@@ -9416,6 +9416,95 @@ static void gfx_v10_ring_insert_nop(struct amdgpu_ring *ring, uint32_t num_nop)
94169416 amdgpu_ring_write (ring , ring -> funcs -> nop );
94179417}
94189418
9419+ static int gfx_v10_0_reset_kgq (struct amdgpu_ring * ring , unsigned int vmid )
9420+ {
9421+ struct amdgpu_device * adev = ring -> adev ;
9422+ struct amdgpu_kiq * kiq = & adev -> gfx .kiq [0 ];
9423+ struct amdgpu_ring * kiq_ring = & kiq -> ring ;
9424+ unsigned long flags ;
9425+ u32 tmp ;
9426+ u64 addr ;
9427+ int r ;
9428+
9429+ if (!kiq -> pmf || !kiq -> pmf -> kiq_unmap_queues )
9430+ return - EINVAL ;
9431+
9432+ spin_lock_irqsave (& kiq -> ring_lock , flags );
9433+
9434+ if (amdgpu_ring_alloc (kiq_ring , 5 + 7 + 7 + kiq -> pmf -> map_queues_size )) {
9435+ spin_unlock_irqrestore (& kiq -> ring_lock , flags );
9436+ return - ENOMEM ;
9437+ }
9438+
9439+ addr = amdgpu_bo_gpu_offset (ring -> mqd_obj ) +
9440+ offsetof(struct v10_gfx_mqd , cp_gfx_hqd_active );
9441+ tmp = REG_SET_FIELD (0 , CP_VMID_RESET , RESET_REQUEST , 1 << vmid );
9442+ if (ring -> pipe == 0 )
9443+ tmp = REG_SET_FIELD (tmp , CP_VMID_RESET , PIPE0_QUEUES , 1 << ring -> queue );
9444+ else
9445+ tmp = REG_SET_FIELD (tmp , CP_VMID_RESET , PIPE1_QUEUES , 1 << ring -> queue );
9446+
9447+ gfx_v10_0_ring_emit_wreg (kiq_ring ,
9448+ SOC15_REG_OFFSET (GC , 0 , mmCP_VMID_RESET ), tmp );
9449+ gfx_v10_0_wait_reg_mem (kiq_ring , 0 , 1 , 0 ,
9450+ lower_32_bits (addr ), upper_32_bits (addr ),
9451+ 0 , 1 , 0x20 );
9452+ gfx_v10_0_ring_emit_reg_wait (kiq_ring ,
9453+ SOC15_REG_OFFSET (GC , 0 , mmCP_VMID_RESET ), 0 , 0xffffffff );
9454+ kiq -> pmf -> kiq_map_queues (kiq_ring , ring );
9455+ amdgpu_ring_commit (kiq_ring );
9456+
9457+ spin_unlock_irqrestore (& kiq -> ring_lock , flags );
9458+
9459+ r = amdgpu_ring_test_ring (kiq_ring );
9460+ if (r )
9461+ return r ;
9462+
9463+ /* reset the ring */
9464+ ring -> wptr = 0 ;
9465+ * ring -> wptr_cpu_addr = 0 ;
9466+ amdgpu_ring_clear_ring (ring );
9467+
9468+ return amdgpu_ring_test_ring (ring );
9469+ }
9470+
9471+ static int gfx_v10_0_reset_kcq (struct amdgpu_ring * ring ,
9472+ unsigned int vmid )
9473+ {
9474+ struct amdgpu_device * adev = ring -> adev ;
9475+ struct amdgpu_kiq * kiq = & adev -> gfx .kiq [0 ];
9476+ struct amdgpu_ring * kiq_ring = & kiq -> ring ;
9477+ unsigned long flags ;
9478+ int r ;
9479+
9480+ if (!kiq -> pmf || !kiq -> pmf -> kiq_unmap_queues )
9481+ return - EINVAL ;
9482+
9483+ spin_lock_irqsave (& kiq -> ring_lock , flags );
9484+
9485+ if (amdgpu_ring_alloc (kiq_ring , kiq -> pmf -> unmap_queues_size )) {
9486+ spin_unlock_irqrestore (& kiq -> ring_lock , flags );
9487+ return - ENOMEM ;
9488+ }
9489+
9490+ kiq -> pmf -> kiq_unmap_queues (kiq_ring , ring , RESET_QUEUES ,
9491+ 0 , 0 );
9492+ amdgpu_ring_commit (kiq_ring );
9493+
9494+ spin_unlock_irqrestore (& kiq -> ring_lock , flags );
9495+
9496+ r = amdgpu_ring_test_ring (kiq_ring );
9497+ if (r )
9498+ return r ;
9499+
9500+ /* reset the ring */
9501+ ring -> wptr = 0 ;
9502+ * ring -> wptr_cpu_addr = 0 ;
9503+ amdgpu_ring_clear_ring (ring );
9504+
9505+ return amdgpu_ring_test_ring (ring );
9506+ }
9507+
94199508static void gfx_v10_ip_print (void * handle , struct drm_printer * p )
94209509{
94219510 struct amdgpu_device * adev = (struct amdgpu_device * )handle ;
@@ -9619,6 +9708,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_gfx = {
96199708 .emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait ,
96209709 .soft_recovery = gfx_v10_0_ring_soft_recovery ,
96219710 .emit_mem_sync = gfx_v10_0_emit_mem_sync ,
9711+ .reset = gfx_v10_0_reset_kgq ,
96229712};
96239713
96249714static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {
@@ -9655,6 +9745,7 @@ static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_compute = {
96559745 .emit_reg_write_reg_wait = gfx_v10_0_ring_emit_reg_write_reg_wait ,
96569746 .soft_recovery = gfx_v10_0_ring_soft_recovery ,
96579747 .emit_mem_sync = gfx_v10_0_emit_mem_sync ,
9748+ .reset = gfx_v10_0_reset_kcq ,
96589749};
96599750
96609751static const struct amdgpu_ring_funcs gfx_v10_0_ring_funcs_kiq = {
0 commit comments