hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/rknpu/rknpu_mem.c
....@@ -15,6 +15,8 @@
1515 #include "rknpu_ioctl.h"
1616 #include "rknpu_mem.h"
1717
18
+#ifdef CONFIG_ROCKCHIP_RKNPU_DMA_HEAP
19
+
1820 int rknpu_mem_create_ioctl(struct rknpu_device *rknpu_dev, unsigned long data,
1921 struct file *file)
2022 {
....@@ -107,22 +109,27 @@
107109 __LINE__, &phys, length);
108110 }
109111
110
- page_count = length >> PAGE_SHIFT;
111
- pages = kmalloc_array(page_count, sizeof(struct page), GFP_KERNEL);
112
- if (!pages) {
113
- LOG_ERROR("alloc pages failed\n");
114
- ret = -ENOMEM;
115
- goto err_detach_dma_buf;
116
- }
112
+ if (args.flags & RKNPU_MEM_KERNEL_MAPPING) {
113
+ page_count = length >> PAGE_SHIFT;
114
+ pages = vmalloc(page_count * sizeof(struct page));
115
+ if (!pages) {
116
+ LOG_ERROR("alloc pages failed\n");
117
+ ret = -ENOMEM;
118
+ goto err_detach_dma_buf;
119
+ }
117120
118
- for (i = 0; i < page_count; i++)
119
- pages[i] = &page[i];
121
+ for (i = 0; i < page_count; i++)
122
+ pages[i] = &page[i];
120123
121
- rknpu_obj->kv_addr = vmap(pages, page_count, VM_MAP, PAGE_KERNEL);
122
- if (!rknpu_obj->kv_addr) {
123
- LOG_ERROR("vmap pages addr failed\n");
124
- ret = -ENOMEM;
125
- goto err_free_pages;
124
+ rknpu_obj->kv_addr =
125
+ vmap(pages, page_count, VM_MAP, PAGE_KERNEL);
126
+ if (!rknpu_obj->kv_addr) {
127
+ LOG_ERROR("vmap pages addr failed\n");
128
+ ret = -ENOMEM;
129
+ goto err_free_pages;
130
+ }
131
+ vfree(pages);
132
+ pages = NULL;
126133 }
127134
128135 rknpu_obj->size = PAGE_ALIGN(args.size);
....@@ -146,7 +153,6 @@
146153 goto err_unmap_kv_addr;
147154 }
148155
149
- kfree(pages);
150156 dma_buf_unmap_attachment(attachment, table, DMA_BIDIRECTIONAL);
151157 dma_buf_detach(dmabuf, attachment);
152158
....@@ -169,7 +175,8 @@
169175 rknpu_obj->kv_addr = NULL;
170176
171177 err_free_pages:
172
- kfree(pages);
178
+ vfree(pages);
179
+ pages = NULL;
173180
174181 err_detach_dma_buf:
175182 dma_buf_unmap_attachment(attachment, table, DMA_BIDIRECTIONAL);
....@@ -292,7 +299,9 @@
292299 {
293300 struct rknpu_mem_object *rknpu_obj = NULL;
294301 struct rknpu_mem_sync args;
302
+#ifdef CONFIG_DMABUF_PARTIAL
295303 struct dma_buf *dmabuf;
304
+#endif
296305 int ret = -EFAULT;
297306
298307 if (unlikely(copy_from_user(&args, (struct rknpu_mem_sync *)data,
....@@ -310,7 +319,6 @@
310319 }
311320
312321 rknpu_obj = (struct rknpu_mem_object *)(uintptr_t)args.obj_addr;
313
- dmabuf = rknpu_obj->dmabuf;
314322
315323 #ifndef CONFIG_DMABUF_PARTIAL
316324 if (args.flags & RKNPU_MEM_SYNC_TO_DEVICE) {
....@@ -322,6 +330,7 @@
322330 DMA_FROM_DEVICE, true);
323331 }
324332 #else
333
+ dmabuf = rknpu_obj->dmabuf;
325334 if (args.flags & RKNPU_MEM_SYNC_TO_DEVICE) {
326335 dmabuf->ops->end_cpu_access_partial(dmabuf, DMA_TO_DEVICE,
327336 args.offset, args.size);
....@@ -334,3 +343,5 @@
334343
335344 return 0;
336345 }
346
+
347
+#endif