| .. | .. |
|---|
| 23 | 23 | |
|---|
| 24 | 24 | #include <core/memory.h> |
|---|
| 25 | 25 | #include <core/notify.h> |
|---|
| 26 | | -#include <subdev/bar.h> |
|---|
| 27 | | -#include <subdev/mmu.h> |
|---|
| 28 | 26 | |
|---|
| 29 | 27 | static void |
|---|
| 30 | 28 | nvkm_fault_ntfy_fini(struct nvkm_event *event, int type, int index) |
|---|
| 31 | 29 | { |
|---|
| 32 | 30 | struct nvkm_fault *fault = container_of(event, typeof(*fault), event); |
|---|
| 33 | | - fault->func->buffer.fini(fault->buffer[index]); |
|---|
| 31 | + fault->func->buffer.intr(fault->buffer[index], false); |
|---|
| 34 | 32 | } |
|---|
| 35 | 33 | |
|---|
| 36 | 34 | static void |
|---|
| 37 | 35 | nvkm_fault_ntfy_init(struct nvkm_event *event, int type, int index) |
|---|
| 38 | 36 | { |
|---|
| 39 | 37 | struct nvkm_fault *fault = container_of(event, typeof(*fault), event); |
|---|
| 40 | | - fault->func->buffer.init(fault->buffer[index]); |
|---|
| 38 | + fault->func->buffer.intr(fault->buffer[index], true); |
|---|
| 41 | 39 | } |
|---|
| 42 | 40 | |
|---|
| 43 | 41 | static int |
|---|
| .. | .. |
|---|
| 91 | 89 | { |
|---|
| 92 | 90 | struct nvkm_subdev *subdev = &fault->subdev; |
|---|
| 93 | 91 | struct nvkm_device *device = subdev->device; |
|---|
| 94 | | - struct nvkm_vmm *bar2 = nvkm_bar_bar2_vmm(device); |
|---|
| 95 | 92 | struct nvkm_fault_buffer *buffer; |
|---|
| 96 | 93 | int ret; |
|---|
| 97 | 94 | |
|---|
| .. | .. |
|---|
| 99 | 96 | return -ENOMEM; |
|---|
| 100 | 97 | buffer->fault = fault; |
|---|
| 101 | 98 | buffer->id = id; |
|---|
| 102 | | - buffer->entries = fault->func->buffer.entries(buffer); |
|---|
| 99 | + fault->func->buffer.info(buffer); |
|---|
| 103 | 100 | fault->buffer[id] = buffer; |
|---|
| 104 | 101 | |
|---|
| 105 | 102 | nvkm_debug(subdev, "buffer %d: %d entries\n", id, buffer->entries); |
|---|
| .. | .. |
|---|
| 110 | 107 | if (ret) |
|---|
| 111 | 108 | return ret; |
|---|
| 112 | 109 | |
|---|
| 113 | | - ret = nvkm_vmm_get(bar2, 12, nvkm_memory_size(buffer->mem), |
|---|
| 114 | | - &buffer->vma); |
|---|
| 115 | | - if (ret) |
|---|
| 116 | | - return ret; |
|---|
| 110 | + /* Pin fault buffer in BAR2. */ |
|---|
| 111 | + buffer->addr = fault->func->buffer.pin(buffer); |
|---|
| 112 | + if (buffer->addr == ~0ULL) |
|---|
| 113 | + return -EFAULT; |
|---|
| 117 | 114 | |
|---|
| 118 | | - return nvkm_memory_map(buffer->mem, 0, bar2, buffer->vma, NULL, 0); |
|---|
| 115 | + return 0; |
|---|
| 119 | 116 | } |
|---|
| 120 | 117 | |
|---|
| 121 | 118 | static int |
|---|
| .. | .. |
|---|
| 146 | 143 | static void * |
|---|
| 147 | 144 | nvkm_fault_dtor(struct nvkm_subdev *subdev) |
|---|
| 148 | 145 | { |
|---|
| 149 | | - struct nvkm_vmm *bar2 = nvkm_bar_bar2_vmm(subdev->device); |
|---|
| 150 | 146 | struct nvkm_fault *fault = nvkm_fault(subdev); |
|---|
| 151 | 147 | int i; |
|---|
| 152 | 148 | |
|---|
| .. | .. |
|---|
| 155 | 151 | |
|---|
| 156 | 152 | for (i = 0; i < fault->buffer_nr; i++) { |
|---|
| 157 | 153 | if (fault->buffer[i]) { |
|---|
| 158 | | - nvkm_vmm_put(bar2, &fault->buffer[i]->vma); |
|---|
| 159 | 154 | nvkm_memory_unref(&fault->buffer[i]->mem); |
|---|
| 160 | 155 | kfree(fault->buffer[i]); |
|---|
| 161 | 156 | } |
|---|
| .. | .. |
|---|
| 182 | 177 | return -ENOMEM; |
|---|
| 183 | 178 | nvkm_subdev_ctor(&nvkm_fault, device, index, &fault->subdev); |
|---|
| 184 | 179 | fault->func = func; |
|---|
| 180 | + fault->user.ctor = nvkm_ufault_new; |
|---|
| 181 | + fault->user.base = func->user.base; |
|---|
| 185 | 182 | return 0; |
|---|
| 186 | 183 | } |
|---|