Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add sdma 4_x interrupts printing

Add VM_HOLE/DOORBELL_INVALID_BE/POLL_TIMEOUT/SRBMWRITE
interrupt info printing.

Signed-off-by: Feifei Xu <Feifei.Xu@amd.com>
Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Feifei Xu and committed by
Alex Deucher
8f211fe8 e5285565

+120
+5
drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
··· 64 64 struct amdgpu_irq_src trap_irq; 65 65 struct amdgpu_irq_src illegal_inst_irq; 66 66 struct amdgpu_irq_src ecc_irq; 67 + struct amdgpu_irq_src vm_hole_irq; 68 + struct amdgpu_irq_src doorbell_invalid_irq; 69 + struct amdgpu_irq_src pool_timeout_irq; 70 + struct amdgpu_irq_src srbm_write_irq; 71 + 67 72 int num_instances; 68 73 uint32_t srbm_soft_reset; 69 74 bool has_page_queue;
+115
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
··· 1895 1895 return r; 1896 1896 } 1897 1897 1898 + /* SDMA VM_HOLE/DOORBELL_INV/POLL_TIMEOUT/SRBM_WRITE_PROTECTION event*/ 1899 + for (i = 0; i < adev->sdma.num_instances; i++) { 1900 + r = amdgpu_irq_add_id(adev, sdma_v4_0_seq_to_irq_id(i), 1901 + SDMA0_4_0__SRCID__SDMA_VM_HOLE, 1902 + &adev->sdma.vm_hole_irq); 1903 + if (r) 1904 + return r; 1905 + 1906 + r = amdgpu_irq_add_id(adev, sdma_v4_0_seq_to_irq_id(i), 1907 + SDMA0_4_0__SRCID__SDMA_DOORBELL_INVALID, 1908 + &adev->sdma.doorbell_invalid_irq); 1909 + if (r) 1910 + return r; 1911 + 1912 + r = amdgpu_irq_add_id(adev, sdma_v4_0_seq_to_irq_id(i), 1913 + SDMA0_4_0__SRCID__SDMA_POLL_TIMEOUT, 1914 + &adev->sdma.pool_timeout_irq); 1915 + if (r) 1916 + return r; 1917 + 1918 + r = amdgpu_irq_add_id(adev, sdma_v4_0_seq_to_irq_id(i), 1919 + SDMA0_4_0__SRCID__SDMA_SRBMWRITE, 1920 + &adev->sdma.srbm_write_irq); 1921 + if (r) 1922 + return r; 1923 + } 1924 + 1898 1925 for (i = 0; i < adev->sdma.num_instances; i++) { 1899 1926 ring = &adev->sdma.instance[i].ring; 1900 1927 ring->ring_obj = NULL; ··· 2173 2146 state == AMDGPU_IRQ_STATE_ENABLE ? 1 : 0); 2174 2147 WREG32_SDMA(type, mmSDMA0_EDC_CONFIG, sdma_edc_config); 2175 2148 2149 + return 0; 2150 + } 2151 + 2152 + static int sdma_v4_0_print_iv_entry(struct amdgpu_device *adev, 2153 + struct amdgpu_iv_entry *entry) 2154 + { 2155 + int instance; 2156 + struct amdgpu_task_info task_info; 2157 + u64 addr; 2158 + 2159 + instance = sdma_v4_0_irq_id_to_seq(entry->client_id); 2160 + if (instance < 0 || instance >= adev->sdma.num_instances) { 2161 + dev_err(adev->dev, "sdma instance invalid %d\n", instance); 2162 + return -EINVAL; 2163 + } 2164 + 2165 + addr = (u64)entry->src_data[0] << 12; 2166 + addr |= ((u64)entry->src_data[1] & 0xf) << 44; 2167 + 2168 + memset(&task_info, 0, sizeof(struct amdgpu_task_info)); 2169 + amdgpu_vm_get_task_info(adev, entry->pasid, &task_info); 2170 + 2171 + dev_info(adev->dev, 2172 + "[sdma%d] address:0x%016llx src_id:%u ring:%u vmid:%u " 2173 + "pasid:%u, for process %s pid %d thread %s pid %d\n", 2174 + instance, addr, entry->src_id, entry->ring_id, entry->vmid, 2175 + entry->pasid, task_info.process_name, task_info.tgid, 2176 + task_info.task_name, task_info.pid); 2177 + return 0; 2178 + } 2179 + 2180 + static int sdma_v4_0_process_vm_hole_irq(struct amdgpu_device *adev, 2181 + struct amdgpu_irq_src *source, 2182 + struct amdgpu_iv_entry *entry) 2183 + { 2184 + dev_err(adev->dev, "MC or SEM address in VM hole\n"); 2185 + sdma_v4_0_print_iv_entry(adev, entry); 2186 + return 0; 2187 + } 2188 + 2189 + static int sdma_v4_0_process_doorbell_invalid_irq(struct amdgpu_device *adev, 2190 + struct amdgpu_irq_src *source, 2191 + struct amdgpu_iv_entry *entry) 2192 + { 2193 + dev_err(adev->dev, "SDMA received a doorbell from BIF with byte_enable !=0xff\n"); 2194 + sdma_v4_0_print_iv_entry(adev, entry); 2195 + return 0; 2196 + } 2197 + 2198 + static int sdma_v4_0_process_pool_timeout_irq(struct amdgpu_device *adev, 2199 + struct amdgpu_irq_src *source, 2200 + struct amdgpu_iv_entry *entry) 2201 + { 2202 + dev_err(adev->dev, 2203 + "Polling register/memory timeout executing POLL_REG/MEM with finite timer\n"); 2204 + sdma_v4_0_print_iv_entry(adev, entry); 2205 + return 0; 2206 + } 2207 + 2208 + static int sdma_v4_0_process_srbm_write_irq(struct amdgpu_device *adev, 2209 + struct amdgpu_irq_src *source, 2210 + struct amdgpu_iv_entry *entry) 2211 + { 2212 + dev_err(adev->dev, 2213 + "SDMA gets an Register Write SRBM_WRITE command in non-privilege command buffer\n"); 2214 + sdma_v4_0_print_iv_entry(adev, entry); 2176 2215 return 0; 2177 2216 } 2178 2217 ··· 2547 2454 .process = amdgpu_sdma_process_ecc_irq, 2548 2455 }; 2549 2456 2457 + static const struct amdgpu_irq_src_funcs sdma_v4_0_vm_hole_irq_funcs = { 2458 + .process = sdma_v4_0_process_vm_hole_irq, 2459 + }; 2550 2460 2461 + static const struct amdgpu_irq_src_funcs sdma_v4_0_doorbell_invalid_irq_funcs = { 2462 + .process = sdma_v4_0_process_doorbell_invalid_irq, 2463 + }; 2464 + 2465 + static const struct amdgpu_irq_src_funcs sdma_v4_0_pool_timeout_irq_funcs = { 2466 + .process = sdma_v4_0_process_pool_timeout_irq, 2467 + }; 2468 + 2469 + static const struct amdgpu_irq_src_funcs sdma_v4_0_srbm_write_irq_funcs = { 2470 + .process = sdma_v4_0_process_srbm_write_irq, 2471 + }; 2551 2472 2552 2473 static void sdma_v4_0_set_irq_funcs(struct amdgpu_device *adev) 2553 2474 { ··· 2573 2466 case 8: 2574 2467 adev->sdma.trap_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 2575 2468 adev->sdma.ecc_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 2469 + adev->sdma.vm_hole_irq.num_types = AMDGPU_SDMA_IRQ_INSTANCE5; 2470 + adev->sdma.doorbell_invalid_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 2471 + adev->sdma.pool_timeout_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 2472 + adev->sdma.srbm_write_irq.num_types = AMDGPU_SDMA_IRQ_LAST; 2576 2473 break; 2577 2474 case 2: 2578 2475 default: ··· 2587 2476 adev->sdma.trap_irq.funcs = &sdma_v4_0_trap_irq_funcs; 2588 2477 adev->sdma.illegal_inst_irq.funcs = &sdma_v4_0_illegal_inst_irq_funcs; 2589 2478 adev->sdma.ecc_irq.funcs = &sdma_v4_0_ecc_irq_funcs; 2479 + adev->sdma.vm_hole_irq.funcs = &sdma_v4_0_vm_hole_irq_funcs; 2480 + adev->sdma.doorbell_invalid_irq.funcs = &sdma_v4_0_doorbell_invalid_irq_funcs; 2481 + adev->sdma.pool_timeout_irq.funcs = &sdma_v4_0_pool_timeout_irq_funcs; 2482 + adev->sdma.srbm_write_irq.funcs = &sdma_v4_0_srbm_write_irq_funcs; 2590 2483 } 2591 2484 2592 2485 /**