| .. | .. |
|---|
| 23 | 23 | #include "kfd_priv.h" |
|---|
| 24 | 24 | #include "kfd_events.h" |
|---|
| 25 | 25 | #include "cik_int.h" |
|---|
| 26 | +#include "amdgpu_amdkfd.h" |
|---|
| 27 | +#include "kfd_smi_events.h" |
|---|
| 26 | 28 | |
|---|
| 27 | 29 | static bool cik_event_interrupt_isr(struct kfd_dev *dev, |
|---|
| 28 | 30 | const uint32_t *ih_ring_entry, |
|---|
| .. | .. |
|---|
| 32 | 34 | const struct cik_ih_ring_entry *ihre = |
|---|
| 33 | 35 | (const struct cik_ih_ring_entry *)ih_ring_entry; |
|---|
| 34 | 36 | const struct kfd2kgd_calls *f2g = dev->kfd2kgd; |
|---|
| 35 | | - unsigned int vmid, pasid; |
|---|
| 37 | + unsigned int vmid; |
|---|
| 38 | + uint16_t pasid; |
|---|
| 39 | + bool ret; |
|---|
| 36 | 40 | |
|---|
| 37 | 41 | /* This workaround is due to HW/FW limitation on Hawaii that |
|---|
| 38 | 42 | * VMID and PASID are not written into ih_ring_entry |
|---|
| .. | .. |
|---|
| 47 | 51 | *tmp_ihre = *ihre; |
|---|
| 48 | 52 | |
|---|
| 49 | 53 | vmid = f2g->read_vmid_from_vmfault_reg(dev->kgd); |
|---|
| 50 | | - pasid = f2g->get_atc_vmid_pasid_mapping_pasid(dev->kgd, vmid); |
|---|
| 54 | + ret = f2g->get_atc_vmid_pasid_mapping_info(dev->kgd, vmid, &pasid); |
|---|
| 51 | 55 | |
|---|
| 52 | 56 | tmp_ihre->ring_id &= 0x000000ff; |
|---|
| 53 | 57 | tmp_ihre->ring_id |= vmid << 8; |
|---|
| 54 | 58 | tmp_ihre->ring_id |= pasid << 16; |
|---|
| 55 | 59 | |
|---|
| 56 | | - return (pasid != 0) && |
|---|
| 60 | + return ret && (pasid != 0) && |
|---|
| 57 | 61 | vmid >= dev->vm_info.first_vmid_kfd && |
|---|
| 58 | 62 | vmid <= dev->vm_info.last_vmid_kfd; |
|---|
| 59 | 63 | } |
|---|
| .. | .. |
|---|
| 87 | 91 | (const struct cik_ih_ring_entry *)ih_ring_entry; |
|---|
| 88 | 92 | uint32_t context_id = ihre->data & 0xfffffff; |
|---|
| 89 | 93 | unsigned int vmid = (ihre->ring_id & 0x0000ff00) >> 8; |
|---|
| 90 | | - unsigned int pasid = (ihre->ring_id & 0xffff0000) >> 16; |
|---|
| 94 | + u32 pasid = (ihre->ring_id & 0xffff0000) >> 16; |
|---|
| 91 | 95 | |
|---|
| 92 | 96 | if (pasid == 0) |
|---|
| 93 | 97 | return; |
|---|
| .. | .. |
|---|
| 104 | 108 | ihre->source_id == CIK_INTSRC_GFX_MEM_PROT_FAULT) { |
|---|
| 105 | 109 | struct kfd_vm_fault_info info; |
|---|
| 106 | 110 | |
|---|
| 111 | + kfd_smi_event_update_vmfault(dev, pasid); |
|---|
| 107 | 112 | kfd_process_vm_fault(dev->dqm, pasid); |
|---|
| 108 | 113 | |
|---|
| 109 | 114 | memset(&info, 0, sizeof(info)); |
|---|
| 110 | | - dev->kfd2kgd->get_vm_fault_info(dev->kgd, &info); |
|---|
| 115 | + amdgpu_amdkfd_gpuvm_get_vm_fault_info(dev->kgd, &info); |
|---|
| 111 | 116 | if (!info.page_addr && !info.status) |
|---|
| 112 | 117 | return; |
|---|
| 113 | 118 | |
|---|