forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
....@@ -31,9 +31,6 @@
3131 * kernel queues using the first doorbell page reserved for the kernel.
3232 */
3333
34
-static DEFINE_IDA(doorbell_ida);
35
-static unsigned int max_doorbell_slices;
36
-
3734 /*
3835 * Each device exposes a doorbell aperture, a PCI MMIO aperture that
3936 * receives 32-bit writes that are passed to queues as wptr values.
....@@ -84,14 +81,14 @@
8481 else
8582 return -ENOSPC;
8683
87
- if (!max_doorbell_slices ||
88
- doorbell_process_limit < max_doorbell_slices)
89
- max_doorbell_slices = doorbell_process_limit;
84
+ if (!kfd->max_doorbell_slices ||
85
+ doorbell_process_limit < kfd->max_doorbell_slices)
86
+ kfd->max_doorbell_slices = doorbell_process_limit;
9087
9188 kfd->doorbell_base = kfd->shared_resources.doorbell_physical_address +
9289 doorbell_start_offset;
9390
94
- kfd->doorbell_id_offset = doorbell_start_offset / sizeof(u32);
91
+ kfd->doorbell_base_dw_offset = doorbell_start_offset / sizeof(u32);
9592
9693 kfd->doorbell_kernel_ptr = ioremap(kfd->doorbell_base,
9794 kfd_doorbell_process_slice(kfd));
....@@ -103,8 +100,8 @@
103100 pr_debug("doorbell base == 0x%08lX\n",
104101 (uintptr_t)kfd->doorbell_base);
105102
106
- pr_debug("doorbell_id_offset == 0x%08lX\n",
107
- kfd->doorbell_id_offset);
103
+ pr_debug("doorbell_base_dw_offset == 0x%08lX\n",
104
+ kfd->doorbell_base_dw_offset);
108105
109106 pr_debug("doorbell_process_limit == 0x%08lX\n",
110107 doorbell_process_limit);
....@@ -130,6 +127,7 @@
130127 struct vm_area_struct *vma)
131128 {
132129 phys_addr_t address;
130
+ struct kfd_process_device *pdd;
133131
134132 /*
135133 * For simplicitly we only allow mapping of the entire doorbell
....@@ -138,9 +136,12 @@
138136 if (vma->vm_end - vma->vm_start != kfd_doorbell_process_slice(dev))
139137 return -EINVAL;
140138
141
- /* Calculate physical address of doorbell */
142
- address = kfd_get_process_doorbells(dev, process);
139
+ pdd = kfd_get_process_device_data(dev, process);
140
+ if (!pdd)
141
+ return -EINVAL;
143142
143
+ /* Calculate physical address of doorbell */
144
+ address = kfd_get_process_doorbells(pdd);
144145 vma->vm_flags |= VM_IO | VM_DONTCOPY | VM_DONTEXPAND | VM_NORESERVE |
145146 VM_DONTDUMP | VM_PFNMAP;
146147
....@@ -185,7 +186,7 @@
185186 * Calculating the kernel doorbell offset using the first
186187 * doorbell page.
187188 */
188
- *doorbell_off = kfd->doorbell_id_offset + inx;
189
+ *doorbell_off = kfd->doorbell_base_dw_offset + inx;
189190
190191 pr_debug("Get kernel queue doorbell\n"
191192 " doorbell offset == 0x%08X\n"
....@@ -225,18 +226,18 @@
225226 }
226227 }
227228
228
-unsigned int kfd_doorbell_id_to_offset(struct kfd_dev *kfd,
229
- struct kfd_process *process,
229
+unsigned int kfd_get_doorbell_dw_offset_in_bar(struct kfd_dev *kfd,
230
+ struct kfd_process_device *pdd,
230231 unsigned int doorbell_id)
231232 {
232233 /*
233
- * doorbell_id_offset accounts for doorbells taken by KGD.
234
+ * doorbell_base_dw_offset accounts for doorbells taken by KGD.
234235 * index * kfd_doorbell_process_slice/sizeof(u32) adjusts to
235236 * the process's doorbells. The offset returned is in dword
236237 * units regardless of the ASIC-dependent doorbell size.
237238 */
238
- return kfd->doorbell_id_offset +
239
- process->doorbell_index
239
+ return kfd->doorbell_base_dw_offset +
240
+ pdd->doorbell_index
240241 * kfd_doorbell_process_slice(kfd) / sizeof(u32) +
241242 doorbell_id * kfd->device_info->doorbell_size / sizeof(u32);
242243 }
....@@ -251,25 +252,24 @@
251252
252253 }
253254
254
-phys_addr_t kfd_get_process_doorbells(struct kfd_dev *dev,
255
- struct kfd_process *process)
255
+phys_addr_t kfd_get_process_doorbells(struct kfd_process_device *pdd)
256256 {
257
- return dev->doorbell_base +
258
- process->doorbell_index * kfd_doorbell_process_slice(dev);
257
+ return pdd->dev->doorbell_base +
258
+ pdd->doorbell_index * kfd_doorbell_process_slice(pdd->dev);
259259 }
260260
261
-int kfd_alloc_process_doorbells(struct kfd_process *process)
261
+int kfd_alloc_process_doorbells(struct kfd_dev *kfd, unsigned int *doorbell_index)
262262 {
263
- int r = ida_simple_get(&doorbell_ida, 1, max_doorbell_slices,
263
+ int r = ida_simple_get(&kfd->doorbell_ida, 1, kfd->max_doorbell_slices,
264264 GFP_KERNEL);
265265 if (r > 0)
266
- process->doorbell_index = r;
266
+ *doorbell_index = r;
267267
268268 return r;
269269 }
270270
271
-void kfd_free_process_doorbells(struct kfd_process *process)
271
+void kfd_free_process_doorbells(struct kfd_dev *kfd, unsigned int doorbell_index)
272272 {
273
- if (process->doorbell_index)
274
- ida_simple_remove(&doorbell_ida, process->doorbell_index);
273
+ if (doorbell_index)
274
+ ida_simple_remove(&kfd->doorbell_ida, doorbell_index);
275275 }