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

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdkfd: Don't expect signal mailbox update

GFX12.1 CP to improve performance has removed updating event_id into
signal mailbox. In future, this optimization can be extended to older
ASICs. Update driver code to handle this case.

Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Harish Kasiviswanathan and committed by
Alex Deucher
e0403013 90ddf279

+26 -21
+3 -3
drivers/gpu/drm/amd/amdkfd/cik_event_interrupt.c
··· 97 97 return; 98 98 99 99 if (ihre->source_id == CIK_INTSRC_CP_END_OF_PIPE) 100 - kfd_signal_event_interrupt(pasid, context_id, 28); 100 + kfd_signal_event_interrupt(pasid, context_id, 28, true); 101 101 else if (ihre->source_id == CIK_INTSRC_SDMA_TRAP) 102 - kfd_signal_event_interrupt(pasid, context_id, 28); 102 + kfd_signal_event_interrupt(pasid, context_id, 28, true); 103 103 else if (ihre->source_id == CIK_INTSRC_SQ_INTERRUPT_MSG) 104 - kfd_signal_event_interrupt(pasid, context_id & 0xff, 8); 104 + kfd_signal_event_interrupt(pasid, context_id & 0xff, 8, true); 105 105 else if (ihre->source_id == CIK_INTSRC_CP_BAD_OPCODE) 106 106 kfd_signal_hw_exception_event(pasid); 107 107 else if (ihre->source_id == CIK_INTSRC_GFX_PAGE_INV_FAULT ||
+8 -4
drivers/gpu/drm/amd/amdkfd/kfd_events.c
··· 142 142 * @p: Pointer to struct kfd_process 143 143 * @id: ID to look up 144 144 * @bits: Number of valid bits in @id 145 + * @signal_mailbox_updated: flag indicates if FW updates signal mailbox entry 145 146 * 146 147 * Finds the first signaled event with a matching partial ID. If no 147 148 * matching signaled event is found, returns NULL. In that case the ··· 156 155 * driver. 157 156 */ 158 157 static struct kfd_event *lookup_signaled_event_by_partial_id( 159 - struct kfd_process *p, uint32_t id, uint32_t bits) 158 + struct kfd_process *p, uint32_t id, uint32_t bits, 159 + bool signal_mailbox_updated) 160 160 { 161 161 struct kfd_event *ev; 162 162 ··· 168 166 * and we only need a single lookup. 169 167 */ 170 168 if (bits > 31 || (1U << bits) >= KFD_SIGNAL_EVENT_LIMIT) { 171 - if (page_slots(p->signal_page)[id] == UNSIGNALED_EVENT_SLOT) 169 + if (signal_mailbox_updated && 170 + page_slots(p->signal_page)[id] == UNSIGNALED_EVENT_SLOT) 172 171 return NULL; 173 172 174 173 return idr_find(&p->event_idr, id); ··· 727 724 } 728 725 729 726 void kfd_signal_event_interrupt(u32 pasid, uint32_t partial_id, 730 - uint32_t valid_id_bits) 727 + uint32_t valid_id_bits, bool signal_mailbox_updated) 731 728 { 732 729 struct kfd_event *ev = NULL; 733 730 ··· 745 742 746 743 if (valid_id_bits) 747 744 ev = lookup_signaled_event_by_partial_id(p, partial_id, 748 - valid_id_bits); 745 + valid_id_bits, 746 + signal_mailbox_updated); 749 747 if (ev) { 750 748 set_event_from_interrupt(p, ev); 751 749 } else if (p->signal_page) {
+2 -1
drivers/gpu/drm/amd/amdkfd/kfd_events.h
··· 85 85 #define KFD_EVENT_TYPE_MEMORY 8 86 86 87 87 extern void kfd_signal_event_interrupt(u32 pasid, uint32_t partial_id, 88 - uint32_t valid_id_bits); 88 + uint32_t valid_id_bits, 89 + bool signal_mailbox_updated); 89 90 90 91 #endif
+3 -3
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v10.c
··· 211 211 client_id == SOC15_IH_CLIENTID_SE2SH || 212 212 client_id == SOC15_IH_CLIENTID_SE3SH) { 213 213 if (source_id == SOC15_INTSRC_CP_END_OF_PIPE) 214 - kfd_signal_event_interrupt(pasid, context_id0, 32); 214 + kfd_signal_event_interrupt(pasid, context_id0, 32, true); 215 215 else if (source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG) { 216 216 encoding = REG_GET_FIELD(context_id1, 217 217 SQ_INTERRUPT_WORD_WAVE_CTXID1, ENCODING); ··· 324 324 default: 325 325 break; 326 326 } 327 - kfd_signal_event_interrupt(pasid, context_id0 & 0x7fffff, 23); 327 + kfd_signal_event_interrupt(pasid, context_id0 & 0x7fffff, 23, true); 328 328 } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE && 329 329 KFD_DBG_EC_TYPE_IS_PACKET(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0))) { 330 330 kfd_set_dbg_ev_from_interrupt(dev, pasid, ··· 344 344 client_id == SOC15_IH_CLIENTID_SDMA6 || 345 345 client_id == SOC15_IH_CLIENTID_SDMA7) { 346 346 if (source_id == SOC15_INTSRC_SDMA_TRAP) { 347 - kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28); 347 + kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28, true); 348 348 } 349 349 } else if (client_id == SOC15_IH_CLIENTID_VMC || 350 350 client_id == SOC15_IH_CLIENTID_VMC1 ||
+3 -3
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v11.c
··· 353 353 354 354 /* CP */ 355 355 if (source_id == SOC15_INTSRC_CP_END_OF_PIPE) 356 - kfd_signal_event_interrupt(pasid, context_id0, 32); 356 + kfd_signal_event_interrupt(pasid, context_id0, 32, true); 357 357 else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE && 358 358 KFD_DBG_EC_TYPE_IS_PACKET(KFD_CTXID0_CP_BAD_OP_ECODE(context_id0))) { 359 359 u32 doorbell_id = KFD_CTXID0_DOORBELL_ID(context_id0); ··· 366 366 367 367 /* SDMA */ 368 368 else if (source_id == SOC21_INTSRC_SDMA_TRAP) 369 - kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28); 369 + kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28, true); 370 370 else if (source_id == SOC21_INTSRC_SDMA_ECC) { 371 371 event_interrupt_poison_consumption_v11(dev, pasid, source_id); 372 372 return; ··· 404 404 default: 405 405 break; 406 406 } 407 - kfd_signal_event_interrupt(pasid, context_id0 & 0xffffff, 24); 407 + kfd_signal_event_interrupt(pasid, context_id0 & 0xffffff, 24, true); 408 408 } 409 409 410 410 } else if (KFD_IRQ_IS_FENCE(client_id, source_id)) {
+3 -3
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v12_1.c
··· 326 326 327 327 /* CP */ 328 328 if (source_id == SOC15_INTSRC_CP_END_OF_PIPE) 329 - kfd_signal_event_interrupt(pasid, context_id0, 32); 329 + kfd_signal_event_interrupt(pasid, context_id0, 32, false); 330 330 else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE && 331 331 KFD_DBG_EC_TYPE_IS_PACKET(KFD_CTXID0_CP_BAD_OP_ECODE(context_id0))) { 332 332 u32 doorbell_id = KFD_CTXID0_DOORBELL_ID(context_id0); ··· 339 339 340 340 /* SDMA */ 341 341 else if (source_id == SOC21_INTSRC_SDMA_TRAP) 342 - kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28); 342 + kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28, true); 343 343 else if (source_id == SOC21_INTSRC_SDMA_ECC) { 344 344 event_interrupt_poison_consumption_v12_1(node, pasid, source_id); 345 345 return; ··· 377 377 default: 378 378 break; 379 379 } 380 - kfd_signal_event_interrupt(pasid, context_id0 & 0xffffff, 24); 380 + kfd_signal_event_interrupt(pasid, context_id0 & 0xffffff, 24, true); 381 381 } 382 382 383 383 } else if (KFD_IRQ_IS_FENCE(client_id, source_id)) {
+3 -3
drivers/gpu/drm/amd/amdkfd/kfd_int_process_v9.c
··· 379 379 client_id == SOC15_IH_CLIENTID_SE2SH || 380 380 client_id == SOC15_IH_CLIENTID_SE3SH) { 381 381 if (source_id == SOC15_INTSRC_CP_END_OF_PIPE) 382 - kfd_signal_event_interrupt(pasid, context_id0, 32); 382 + kfd_signal_event_interrupt(pasid, context_id0, 32, true); 383 383 else if (source_id == SOC15_INTSRC_SQ_INTERRUPT_MSG) { 384 384 sq_int_data = KFD_CONTEXT_ID_GET_SQ_INT_DATA(context_id0, context_id1); 385 385 encoding = REG_GET_FIELD(context_id0, SQ_INTERRUPT_WORD_WAVE_CTXID, ENCODING); ··· 513 513 default: 514 514 break; 515 515 } 516 - kfd_signal_event_interrupt(pasid, sq_int_data, 24); 516 + kfd_signal_event_interrupt(pasid, sq_int_data, 24, true); 517 517 } else if (source_id == SOC15_INTSRC_CP_BAD_OPCODE && 518 518 KFD_DBG_EC_TYPE_IS_PACKET(KFD_DEBUG_CP_BAD_OP_ECODE(context_id0))) { 519 519 kfd_set_dbg_ev_from_interrupt(dev, pasid, ··· 530 530 client_id == SOC15_IH_CLIENTID_SDMA6 || 531 531 client_id == SOC15_IH_CLIENTID_SDMA7) { 532 532 if (source_id == SOC15_INTSRC_SDMA_TRAP) { 533 - kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28); 533 + kfd_signal_event_interrupt(pasid, context_id0 & 0xfffffff, 28, true); 534 534 } else if (source_id == SOC15_INTSRC_SDMA_ECC) { 535 535 event_interrupt_poison_consumption_v9(dev, pasid, client_id); 536 536 return;
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_priv.h
··· 1525 1525 bool all, uint32_t *user_timeout_ms, 1526 1526 uint32_t *wait_result); 1527 1527 void kfd_signal_event_interrupt(u32 pasid, uint32_t partial_id, 1528 - uint32_t valid_id_bits); 1528 + uint32_t valid_id_bits, bool signal_mailbox_updated); 1529 1529 void kfd_signal_hw_exception_event(u32 pasid); 1530 1530 int kfd_set_event(struct kfd_process *p, uint32_t event_id); 1531 1531 int kfd_reset_event(struct kfd_process *p, uint32_t event_id);