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
4#define pr_fmt(fmt) "dma: " fmt
5
6#include "mos/mm/dma.hpp"
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 SpinLocker lock(&current_mm->mm_lock);
44 vmap_t *vmap = vmap_obtain(current_mm, (ptr_t) vaddr);
45 if (!vmap)
46 return false;
47
48 vmap_destroy(vmap);
49 return true;
50}
51
52pfn_t dmabuf_share(void *buf, size_t size)
53{
54 const size_t n_pages = ALIGN_UP_TO_PAGE(size) / MOS_PAGE_SIZE;
55 const pfn_t pfn = dmabuf_do_allocate(n_pages, false);
56 pr_dinfo2(dma, "sharing %zu bytes at " PFN_FMT, size, pfn);
57
58 memcpy((void *) pfn_va(pfn), buf, size);
59 return pfn;
60}
61
62bool dmabuf_unshare(ptr_t phys, size_t size, void *buffer)
63{
64 const pfn_t pfn = phys / MOS_PAGE_SIZE;
65 pr_dinfo2(dma, "unsharing %zu bytes at " PFN_FMT, size, pfn);
66 memcpy(buffer, (void *) pfn_va(pfn), size);
68 return true;
69}
#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:52
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:62
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:86
vmap_t * vmap_obtain(MMContext *mmctx, ptr_t vaddr, size_t *out_offset=nullptr)
Get the vmap object for a virtual address.
Definition mm.cpp:189
#define pfn_va(pfn)
Definition mm.hpp:83
void vmap_destroy(vmap_t *vmap)
Destroy a vmap object, and unmmap the region.
Definition mm.cpp:168
@ VMAP_TYPE_SHARED
Definition mm.hpp:34
@ VMAP_DMA
Definition mm.hpp:28
PtrResult< vmap_t > mm_map_user_pages(MMContext *mmctx, ptr_t vaddr, pfn_t pfn, size_t npages, VMFlags flags, vmap_type_t type, vmap_content_t content, bool exact=false)
Definition paging.cpp:92
#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
@ VM_USER_RW
Definition mm_types.hpp:26
@ VM_CACHE_DISABLED
Definition mm_types.hpp:19
#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
static void * memset(void *s, int c, size_t n)
Definition pb_syshdr.h:101
#define current_mm
Definition platform.hpp:35
#define pr_dinfo2(feat, fmt,...)
Definition printk.hpp:27
size_t size
Definition slab.cpp:32
Definition mm.hpp:60
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