| 1 | |
| 2 | |
| 3 | * Coherent per-device memory handling.
|
| 4 | * Borrowed from i386
|
| 5 |
|
| 6 | #include <linux/io.h>
|
| 7 | #include <linux/slab.h>
|
| 8 | #include <linux/kernel.h>
|
| 9 | #include <linux/module.h>
|
| 10 | #include <linux/dma-direct.h>
|
| 11 | #include <linux/dma-map-ops.h>
|
| 12 |
|
| 13 | struct dma_coherent_mem {
|
| 14 | void *virt_base;
|
| 15 | dma_addr_t device_base;
|
| 16 | unsigned long pfn_base;
|
| 17 | int size;
|
| 18 | unsigned long *bitmap;
|
| 19 | spinlock_t spinlock;
|
| 20 | bool use_dev_dma_pfn_offset;
|
| 21 | };
|
| 22 |
|
| 23 | static inline struct dma_coherent_mem *dev_get_coherent_memory(struct device *dev)
|
| 24 | {
|
| 25 | if (dev && dev->dma_mem)
|
| 26 | return dev->dma_mem;
|
| 27 | return NULL;
|
| 28 | }
|
| 29 |
|
| 30 | static inline dma_addr_t dma_get_device_base(struct device *dev,
|
| 31 | struct dma_coherent_mem *mem)
|
| 32 | {
|
| 33 | if (mem->use_dev_dma_pfn_offset)
|
| 34 | return phys_to_dma(dev, PFN_PHYS(mem->pfn_base));
|
| 35 | return mem->device_base;
|
| 36 | }
|
| 37 |
|
| 38 | static struct dma_coherent_mem *dma_init_coherent_memory(phys_addr_t phys_addr,
|
| 39 | dma_addr_t device_addr, size_t size, bool use_dma_pfn_offset)
|
| 40 | {
|
| 41 | struct dma_coherent_mem *dma_mem;
|
| 42 | int pages = size >> PAGE_SHIFT;
|
| 43 | void *mem_base;
|
| 44 |
|
| 45 | if (!size)
|
| 46 | return ERR_PTR(-EINVAL);
|
| 47 |
|
| 48 | mem_base = memremap(phys_addr, size, MEMREMAP_WC);
|
| 49 | if (!mem_base)
|
| 50 | return ERR_PTR(-EINVAL);
|
| 51 |
|
| 52 | dma_mem = kzalloc_obj(struct dma_coherent_mem);
|
| 53 | if (!dma_mem)
|
| 54 | goto out_unmap_membase;
|
| 55 | dma_mem->bitmap = bitmap_zalloc(pages, GFP_KERNEL);
|
| 56 | if (!dma_mem->bitmap)
|
| 57 | goto out_free_dma_mem;
|
| 58 |
|
| 59 | dma_mem->virt_base = mem_base;
|
| 60 | dma_mem->device_base = device_addr;
|
| 61 | dma_mem->pfn_base = PFN_DOWN(phys_addr);
|
| 62 | dma_mem->size = pages;
|
| 63 | dma_mem->use_dev_dma_pfn_offset = use_dma_pfn_offset;
|
| 64 | spin_lock_init(&dma_mem->spinlock);
|
| 65 |
|
| 66 | return dma_mem;
|
| 67 |
|
| 68 | out_free_dma_mem:
|
| 69 | kfree(dma_mem);
|
| 70 | out_unmap_membase:
|
| 71 | memunmap(mem_base);
|
| 72 | pr_err("Reserved memory: failed to init DMA memory pool at %pa, size %zu KiB\n",
|
| 73 | &phys_addr, size / SZ_1K);
|
| 74 | return ERR_PTR(-ENOMEM);
|
| 75 | }
|
| 76 |
|
| 77 | static void _dma_release_coherent_memory(struct dma_coherent_mem *mem)
|
| 78 | {
|
| 79 | if (!mem)
|
| 80 | return;
|
| 81 |
|
| 82 | memunmap(mem->virt_base);
|
| 83 | bitmap_free(mem->bitmap);
|
| 84 | kfree(mem);
|
| 85 | }
|
| 86 |
|
| 87 | static int dma_assign_coherent_memory(struct device *dev,
|
| 88 | struct dma_coherent_mem *mem)
|
| 89 | {
|
| 90 | if (!dev)
|
| 91 | return -ENODEV;
|
| 92 |
|
| 93 | if (dev->dma_mem)
|
| 94 | return -EBUSY;
|
| 95 |
|
| 96 | dev->dma_mem = mem;
|
| 97 | return 0;
|
| 98 | }
|
| 99 |
|
| 100 | |
| 101 | * Declare a region of memory to be handed out by dma_alloc_coherent() when it
|
| 102 | * is asked for coherent memory for this device. This shall only be used
|
| 103 | * from platform code, usually based on the device tree description.
|
| 104 | *
|
| 105 | * phys_addr is the CPU physical address to which the memory is currently
|
| 106 | * assigned (this will be ioremapped so the CPU can access the region).
|
| 107 | *
|
| 108 | * device_addr is the DMA address the device needs to be programmed with to
|
| 109 | * actually address this memory (this will be handed out as the dma_addr_t in
|
| 110 | * dma_alloc_coherent()).
|
| 111 | *
|
| 112 | * size is the size of the area (must be a multiple of PAGE_SIZE).
|
| 113 | *
|
| 114 | * As a simplification for the platforms, only *one* such region of memory may
|
| 115 | * be declared per device.
|
| 116 |
|
| 117 | int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr,
|
| 118 | dma_addr_t device_addr, size_t size)
|
| 119 | {
|
| 120 | struct dma_coherent_mem *mem;
|
| 121 | int ret;
|
| 122 |
|
| 123 | mem = dma_init_coherent_memory(phys_addr, device_addr, size, false);
|
| 124 | if (IS_ERR(mem))
|
| 125 | return PTR_ERR(mem);
|
| 126 |
|
| 127 | ret = dma_assign_coherent_memory(dev, mem);
|
| 128 | if (ret)
|
| 129 | _dma_release_coherent_memory(mem);
|
| 130 | return ret;
|
| 131 | }
|
| 132 |
|
| 133 | void dma_release_coherent_memory(struct device *dev)
|
| 134 | {
|
| 135 | if (dev) {
|
| 136 | _dma_release_coherent_memory(dev->dma_mem);
|
| 137 | dev->dma_mem = NULL;
|
| 138 | }
|
| 139 | }
|
| 140 |
|
| 141 | static void *__dma_alloc_from_coherent(struct device *dev,
|
| 142 | struct dma_coherent_mem *mem,
|
| 143 | ssize_t size, dma_addr_t *dma_handle)
|
| 144 | {
|
| 145 | int order = get_order(size);
|
| 146 | unsigned long flags;
|
| 147 | int pageno;
|
| 148 | void *ret;
|
| 149 |
|
| 150 | spin_lock_irqsave(&mem->spinlock, flags);
|
| 151 |
|
| 152 | if (unlikely(size > ((dma_addr_t)mem->size << PAGE_SHIFT)))
|
| 153 | goto err;
|
| 154 |
|
| 155 | pageno = bitmap_find_free_region(mem->bitmap, mem->size, order);
|
| 156 | if (unlikely(pageno < 0))
|
| 157 | goto err;
|
| 158 |
|
| 159 | |
| 160 | * Memory was found in the coherent area.
|
| 161 |
|
| 162 | *dma_handle = dma_get_device_base(dev, mem) +
|
| 163 | ((dma_addr_t)pageno << PAGE_SHIFT);
|
| 164 | ret = mem->virt_base + ((dma_addr_t)pageno << PAGE_SHIFT);
|
| 165 | spin_unlock_irqrestore(&mem->spinlock, flags);
|
| 166 | memset(ret, 0, size);
|
| 167 | return ret;
|
| 168 | err:
|
| 169 | spin_unlock_irqrestore(&mem->spinlock, flags);
|
| 170 | return NULL;
|
| 171 | }
|
| 172 |
|
| 173 | |
| 174 | * dma_alloc_from_dev_coherent() - allocate memory from device coherent pool
|
| 175 | * @dev: device from which we allocate memory
|
| 176 | * @size: size of requested memory area
|
| 177 | * @dma_handle: This will be filled with the correct dma handle
|
| 178 | * @ret: This pointer will be filled with the virtual address
|
| 179 | * to allocated area.
|
| 180 | *
|
| 181 | * This function should be only called from per-arch dma_alloc_coherent()
|
| 182 | * to support allocation from per-device coherent memory pools.
|
| 183 | *
|
| 184 | * Returns 0 if dma_alloc_coherent should continue with allocating from
|
| 185 | * generic memory areas, or !0 if dma_alloc_coherent should return @ret.
|
| 186 |
|
| 187 | int dma_alloc_from_dev_coherent(struct device *dev, ssize_t size,
|
| 188 | dma_addr_t *dma_handle, void **ret)
|
| 189 | {
|
| 190 | struct dma_coherent_mem *mem = dev_get_coherent_memory(dev);
|
| 191 |
|
| 192 | if (!mem)
|
| 193 | return 0;
|
| 194 |
|
| 195 | *ret = __dma_alloc_from_coherent(dev, mem, size, dma_handle);
|
| 196 | return 1;
|
| 197 | }
|
| 198 |
|
| 199 | static int __dma_release_from_coherent(struct dma_coherent_mem *mem,
|
| 200 | int order, void *vaddr)
|
| 201 | {
|
| 202 | if (mem && vaddr >= mem->virt_base && vaddr <
|
| 203 | (mem->virt_base + ((dma_addr_t)mem->size << PAGE_SHIFT))) {
|
| 204 | int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;
|
| 205 | unsigned long flags;
|
| 206 |
|
| 207 | spin_lock_irqsave(&mem->spinlock, flags);
|
| 208 | bitmap_release_region(mem->bitmap, page, order);
|
| 209 | spin_unlock_irqrestore(&mem->spinlock, flags);
|
| 210 | return 1;
|
| 211 | }
|
| 212 | return 0;
|
| 213 | }
|
| 214 |
|
| 215 | |
| 216 | * dma_release_from_dev_coherent() - free memory to device coherent memory pool
|
| 217 | * @dev: device from which the memory was allocated
|
| 218 | * @order: the order of pages allocated
|
| 219 | * @vaddr: virtual address of allocated pages
|
| 220 | *
|
| 221 | * This checks whether the memory was allocated from the per-device
|
| 222 | * coherent memory pool and if so, releases that memory.
|
| 223 | *
|
| 224 | * Returns 1 if we correctly released the memory, or 0 if the caller should
|
| 225 | * proceed with releasing memory from generic pools.
|
| 226 |
|
| 227 | int dma_release_from_dev_coherent(struct device *dev, int order, void *vaddr)
|
| 228 | {
|
| 229 | struct dma_coherent_mem *mem = dev_get_coherent_memory(dev);
|
| 230 |
|
| 231 | return __dma_release_from_coherent(mem, order, vaddr);
|
| 232 | }
|
| 233 |
|
| 234 | static int __dma_mmap_from_coherent(struct dma_coherent_mem *mem,
|
| 235 | struct vm_area_struct *vma, void *vaddr, size_t size, int *ret)
|
| 236 | {
|
| 237 | if (mem && vaddr >= mem->virt_base && vaddr + size <=
|
| 238 | (mem->virt_base + ((dma_addr_t)mem->size << PAGE_SHIFT))) {
|
| 239 | const pgoff_t pgoff_start = vma_start_pgoff(vma);
|
| 240 | const pgoff_t pgoff_end = vma_end_pgoff(vma);
|
| 241 | int start = (vaddr - mem->virt_base) >> PAGE_SHIFT;
|
| 242 | unsigned long user_count = vma_pages(vma);
|
| 243 | int count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
| 244 |
|
| 245 | *ret = -ENXIO;
|
| 246 | if (pgoff_start < count && pgoff_end <= count) {
|
| 247 | unsigned long pfn = mem->pfn_base + start + pgoff_start;
|
| 248 | *ret = remap_pfn_range(vma, vma->vm_start, pfn,
|
| 249 | user_count << PAGE_SHIFT,
|
| 250 | vma->vm_page_prot);
|
| 251 | }
|
| 252 | return 1;
|
| 253 | }
|
| 254 | return 0;
|
| 255 | }
|
| 256 |
|
| 257 | |
| 258 | * dma_mmap_from_dev_coherent() - mmap memory from the device coherent pool
|
| 259 | * @dev: device from which the memory was allocated
|
| 260 | * @vma: vm_area for the userspace memory
|
| 261 | * @vaddr: cpu address returned by dma_alloc_from_dev_coherent
|
| 262 | * @size: size of the memory buffer allocated
|
| 263 | * @ret: result from remap_pfn_range()
|
| 264 | *
|
| 265 | * This checks whether the memory was allocated from the per-device
|
| 266 | * coherent memory pool and if so, maps that memory to the provided vma.
|
| 267 | *
|
| 268 | * Returns 1 if @vaddr belongs to the device coherent pool and the caller
|
| 269 | * should return @ret, or 0 if they should proceed with mapping memory from
|
| 270 | * generic areas.
|
| 271 |
|
| 272 | int dma_mmap_from_dev_coherent(struct device *dev, struct vm_area_struct *vma,
|
| 273 | void *vaddr, size_t size, int *ret)
|
| 274 | {
|
| 275 | struct dma_coherent_mem *mem = dev_get_coherent_memory(dev);
|
| 276 |
|
| 277 | return __dma_mmap_from_coherent(mem, vma, vaddr, size, ret);
|
| 278 | }
|
| 279 |
|
| 280 | #ifdef CONFIG_DMA_GLOBAL_POOL
|
| 281 | static struct dma_coherent_mem *dma_coherent_default_memory __ro_after_init;
|
| 282 |
|
| 283 | void *dma_alloc_from_global_coherent(struct device *dev, ssize_t size,
|
| 284 | dma_addr_t *dma_handle)
|
| 285 | {
|
| 286 | if (!dma_coherent_default_memory)
|
| 287 | return NULL;
|
| 288 |
|
| 289 | return __dma_alloc_from_coherent(dev, dma_coherent_default_memory, size,
|
| 290 | dma_handle);
|
| 291 | }
|
| 292 |
|
| 293 | int dma_release_from_global_coherent(int order, void *vaddr)
|
| 294 | {
|
| 295 | if (!dma_coherent_default_memory)
|
| 296 | return 0;
|
| 297 |
|
| 298 | return __dma_release_from_coherent(dma_coherent_default_memory, order,
|
| 299 | vaddr);
|
| 300 | }
|
| 301 |
|
| 302 | int dma_mmap_from_global_coherent(struct vm_area_struct *vma, void *vaddr,
|
| 303 | size_t size, int *ret)
|
| 304 | {
|
| 305 | if (!dma_coherent_default_memory)
|
| 306 | return 0;
|
| 307 |
|
| 308 | return __dma_mmap_from_coherent(dma_coherent_default_memory, vma,
|
| 309 | vaddr, size, ret);
|
| 310 | }
|
| 311 |
|
| 312 | int dma_init_global_coherent(phys_addr_t phys_addr, size_t size)
|
| 313 | {
|
| 314 | struct dma_coherent_mem *mem;
|
| 315 |
|
| 316 | mem = dma_init_coherent_memory(phys_addr, phys_addr, size, true);
|
| 317 | if (IS_ERR(mem))
|
| 318 | return PTR_ERR(mem);
|
| 319 | dma_coherent_default_memory = mem;
|
| 320 | pr_info("DMA: default coherent area is set\n");
|
| 321 | return 0;
|
| 322 | }
|
| 323 | #endif
|
| 324 |
|
| 325 | |
| 326 | * Support for reserved memory regions defined in device tree
|
| 327 |
|
| 328 | #ifdef CONFIG_OF_RESERVED_MEM
|
| 329 | #include <linux/of.h>
|
| 330 | #include <linux/of_fdt.h>
|
| 331 | #include <linux/of_reserved_mem.h>
|
| 332 |
|
| 333 | #ifdef CONFIG_DMA_GLOBAL_POOL
|
| 334 | static phys_addr_t dma_reserved_default_memory_base __initdata;
|
| 335 | static phys_addr_t dma_reserved_default_memory_size __initdata;
|
| 336 | #endif
|
| 337 |
|
| 338 | static int rmem_dma_device_init(struct reserved_mem *rmem, struct device *dev)
|
| 339 | {
|
| 340 | struct dma_coherent_mem *mem = rmem->priv;
|
| 341 |
|
| 342 | if (!mem) {
|
| 343 | mem = dma_init_coherent_memory(rmem->base, rmem->base,
|
| 344 | rmem->size, true);
|
| 345 | if (IS_ERR(mem))
|
| 346 | return PTR_ERR(mem);
|
| 347 | rmem->priv = mem;
|
| 348 | }
|
| 349 |
|
| 350 |
|
| 351 | if (mem->device_base + rmem->size - 1 >
|
| 352 | min_not_zero(dev->coherent_dma_mask, dev->bus_dma_limit))
|
| 353 | dev_warn(dev, "reserved memory is beyond device's set DMA address range\n");
|
| 354 |
|
| 355 | return dma_assign_coherent_memory(dev, mem);
|
| 356 | }
|
| 357 |
|
| 358 | static void rmem_dma_device_release(struct reserved_mem *rmem,
|
| 359 | struct device *dev)
|
| 360 | {
|
| 361 | if (dev)
|
| 362 | dev->dma_mem = NULL;
|
| 363 | }
|
| 364 |
|
| 365 |
|
| 366 | static int __init rmem_dma_setup(unsigned long node, struct reserved_mem *rmem)
|
| 367 | {
|
| 368 | if (of_get_flat_dt_prop(node, "reusable", NULL))
|
| 369 | return -ENODEV;
|
| 370 |
|
| 371 | #ifdef CONFIG_ARM
|
| 372 | if (!of_get_flat_dt_prop(node, "no-map", NULL)) {
|
| 373 | pr_err("Reserved memory: regions without no-map are not yet supported\n");
|
| 374 | return -EINVAL;
|
| 375 | }
|
| 376 | #endif
|
| 377 |
|
| 378 | #ifdef CONFIG_DMA_GLOBAL_POOL
|
| 379 | if (of_get_flat_dt_prop(node, "linux,dma-default", NULL)) {
|
| 380 | WARN(dma_reserved_default_memory_size,
|
| 381 | "Reserved memory: region for default DMA coherent area is redefined\n");
|
| 382 | dma_reserved_default_memory_base = rmem->base;
|
| 383 | dma_reserved_default_memory_size = rmem->size;
|
| 384 | }
|
| 385 | #endif
|
| 386 |
|
| 387 | pr_info("Reserved memory: created DMA memory pool at %pa, size %llu KiB\n",
|
| 388 | &rmem->base, (unsigned long long)(rmem->size / SZ_1K));
|
| 389 | return 0;
|
| 390 | }
|
| 391 |
|
| 392 | #ifdef CONFIG_DMA_GLOBAL_POOL
|
| 393 | static int __init dma_init_reserved_memory(void)
|
| 394 | {
|
| 395 | if (!dma_reserved_default_memory_size)
|
| 396 | return -ENOMEM;
|
| 397 | return dma_init_global_coherent(dma_reserved_default_memory_base,
|
| 398 | dma_reserved_default_memory_size);
|
| 399 | }
|
| 400 | core_initcall(dma_init_reserved_memory);
|
| 401 | #endif
|
| 402 |
|
| 403 | static const struct reserved_mem_ops rmem_dma_ops = {
|
| 404 | .node_init = rmem_dma_setup,
|
| 405 | .device_init = rmem_dma_device_init,
|
| 406 | .device_release = rmem_dma_device_release,
|
| 407 | };
|
| 408 |
|
| 409 | RESERVEDMEM_OF_DECLARE(dma, "shared-dma-pool", &rmem_dma_ops);
|
| 410 | #endif
|