.. | .. |
---|
109 | 109 | __LINE__, &phys, length); |
---|
110 | 110 | } |
---|
111 | 111 | |
---|
112 | | - page_count = length >> PAGE_SHIFT; |
---|
113 | | - pages = vmalloc(page_count * sizeof(struct page)); |
---|
114 | | - if (!pages) { |
---|
115 | | - LOG_ERROR("alloc pages failed\n"); |
---|
116 | | - ret = -ENOMEM; |
---|
117 | | - goto err_detach_dma_buf; |
---|
118 | | - } |
---|
| 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 | + } |
---|
119 | 120 | |
---|
120 | | - for (i = 0; i < page_count; i++) |
---|
121 | | - pages[i] = &page[i]; |
---|
| 121 | + for (i = 0; i < page_count; i++) |
---|
| 122 | + pages[i] = &page[i]; |
---|
122 | 123 | |
---|
123 | | - rknpu_obj->kv_addr = vmap(pages, page_count, VM_MAP, PAGE_KERNEL); |
---|
124 | | - if (!rknpu_obj->kv_addr) { |
---|
125 | | - LOG_ERROR("vmap pages addr failed\n"); |
---|
126 | | - ret = -ENOMEM; |
---|
127 | | - 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; |
---|
128 | 133 | } |
---|
129 | 134 | |
---|
130 | 135 | rknpu_obj->size = PAGE_ALIGN(args.size); |
---|
.. | .. |
---|
148 | 153 | goto err_unmap_kv_addr; |
---|
149 | 154 | } |
---|
150 | 155 | |
---|
151 | | - vfree(pages); |
---|
152 | | - pages = NULL; |
---|
153 | 156 | dma_buf_unmap_attachment(attachment, table, DMA_BIDIRECTIONAL); |
---|
154 | 157 | dma_buf_detach(dmabuf, attachment); |
---|
155 | 158 | |
---|