.. | .. |
---|
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 | } |
---|