MOS Source Code
Loading...
Searching...
No Matches
dma.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#define pr_fmt(fmt) "dma: " fmt
4
5#include "mos/mm/dma.hpp"
6
7#include "mos/mm/mm.hpp"
11#include "mos/syslog/printk.hpp"
12
13#include <mos_string.hpp>
14
15static pfn_t dmabuf_do_allocate(size_t n_pages, bool do_ref)
16{
18 if (do_ref)
19 pmm_ref(frames, n_pages);
20 memset((void *) phyframe_va(frames), 0, n_pages * MOS_PAGE_SIZE);
21 return phyframe_pfn(frames);
22}
23
24pfn_t dmabuf_allocate(size_t n_pages, ptr_t *vaddr)
25{
26 const pfn_t pfn = dmabuf_do_allocate(n_pages, true);
28 if (!vmap)
29 {
30 pmm_unref(pfn, n_pages);
31 return 0;
32 }
33 *vaddr = vmap->vaddr;
34 pr_dinfo2(dma, "allocated %zu DMA pages at " PFN_FMT " and mapped them at " PTR_FMT, n_pages, pfn, *vaddr);
35 return pfn;
36}
37
38bool dmabuf_free(ptr_t vaddr, ptr_t paddr)
39{
40 MOS_UNUSED(paddr);
41 pr_dinfo2(dma, "freeing DMA pages at " PTR_FMT, vaddr);
42
43 bool ret = false;
44
46 vmap_t *vmap = vmap_obtain(current_mm, (ptr_t) vaddr, NULL);
47 if (!vmap)
48 goto done;
49
50 ret = true;
51 vmap_destroy(vmap);
52
53done:
55 return ret;
56}
57
58pfn_t dmabuf_share(void *buf, size_t size)
59{
60 const size_t n_pages = ALIGN_UP_TO_PAGE(size) / MOS_PAGE_SIZE;
61 const pfn_t pfn = dmabuf_do_allocate(n_pages, false);
62 pr_dinfo2(dma, "sharing %zu bytes at " PFN_FMT, size, pfn);
63
64 memcpy((void *) pfn_va(pfn), buf, size);
65 return pfn;
66}
67
68bool dmabuf_unshare(ptr_t phys, size_t size, void *buffer)
69{
70 const pfn_t pfn = phys / MOS_PAGE_SIZE;
71 pr_dinfo2(dma, "unsharing %zu bytes at " PFN_FMT, size, pfn);
72 memcpy(buffer, (void *) pfn_va(pfn), size);
74 return true;
75}
#define MOS_PAGE_SIZE
Definition autoconf.h:6
#define MOS_ADDR_USER_MMAP
Definition autoconf.h:2
pfn_t dmabuf_share(void *buf, size_t size)
Definition dma.cpp:58
bool dmabuf_free(ptr_t vaddr, ptr_t paddr)
Definition dma.cpp:38
static pfn_t dmabuf_do_allocate(size_t n_pages, bool do_ref)
Definition dma.cpp:15
bool dmabuf_unshare(ptr_t phys, size_t size, void *buffer)
Definition dma.cpp:68
pfn_t dmabuf_allocate(size_t n_pages, ptr_t *vaddr)
Allocate DMA pages.
Definition dma.cpp:24
#define phyframe_va(frame)
Definition mm.hpp:80
vmap_t * vmap_obtain(MMContext *mmctx, ptr_t vaddr, size_t *out_offset)
Get the vmap object for a virtual address.
Definition mm.cpp:185
#define pfn_va(pfn)
Definition mm.hpp:77
void vmap_destroy(vmap_t *vmap)
Destroy a vmap object, and unmmap the region.
Definition mm.cpp:164
@ VMAP_TYPE_SHARED
Definition mm.hpp:33
@ VMAP_DMA
Definition mm.hpp:27
PtrResult< vmap_t > mm_map_user_pages(MMContext *mmctx, ptr_t vaddr, pfn_t pfn, size_t npages, vm_flags flags, valloc_flags vaflags, vmap_type_t type, vmap_content_t content)
Definition paging.cpp:92
@ VALLOC_DEFAULT
Default allocation flags.
Definition paging.hpp:21
#define pfn_phyframe(pfn)
Definition pmm.hpp:74
#define pmm_ref(thing, npages)
Definition pmm.hpp:155
#define phyframe_pfn(frame)
Definition pmm.hpp:73
void pmm_free_frames(phyframe_t *start_frame, size_t n_pages)
Definition pmm.cpp:108
#define pmm_unref(thing, npages)
Definition pmm.hpp:156
phyframe_t * pmm_allocate_frames(size_t n_frames, pmm_allocation_flags_t flags)
Allocate n_frames of contiguous physical memory.
Definition pmm.cpp:92
@ PMM_ALLOC_NORMAL
allocate normal pages
Definition pmm.hpp:68
#define ALIGN_UP_TO_PAGE(addr)
Definition mos_global.h:76
#define MOS_UNUSED(x)
Definition mos_global.h:65
static void * memcpy(void *s1, const void *s2, size_t n)
Definition pb_syshdr.h:90
#define NULL
Definition pb_syshdr.h:46
static void * memset(void *s, int c, size_t n)
Definition pb_syshdr.h:101
#define current_mm
Definition platform.hpp:34
vm_flags
Definition platform.hpp:42
@ VM_USER_RW
Definition platform.hpp:57
@ VM_CACHE_DISABLED
Definition platform.hpp:50
#define pr_dinfo2(feat, fmt,...)
Definition printk.hpp:27
size_t size
Definition slab.cpp:34
#define spinlock_acquire(lock)
Definition spinlock.hpp:64
#define spinlock_release(lock)
Definition spinlock.hpp:65
Definition mm.hpp:59
static char buffer[2048]
unsigned long long pfn_t
Definition types.h:37
#define PFN_FMT
Definition types.h:38
#define PTR_FMT
Definition types.h:29
unsigned long ptr_t
Definition types.h:21