aboutsummaryrefslogtreecommitdiff
path: root/include/apos/dmem.h
blob: 25976dc293a81bbba2ead5fb105d46a40b09bab3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#ifndef APOS_DEV_H
#define APOS_DEV_H

/**
 * @file dmem.h
 * Device memory handling, i.e. anything outside of RAM.
 * \todo Make global parameters functions instead.
 */

#include <apos/types.h>
#include <apos/vmem.h>

/** Provides access to the global parameter. \global */
extern pm_t __pre_base;

/** Provides access to the global parameter. \global */
extern pm_t __pre_top;

/** Provides access to the global parameter. \global */
extern pm_t __post_base;

/** Provides access to the global parameter. \global */
extern pm_t __post_top;

/**
 * Initialize device memory.
 * @note Currently I assume there is only one RAM region. This may not be the
 * case with NUMA.
 *
 * @param ram_base Start of RAM.
 * @param ram_top Top of RAM.
 * @return stat_t \ref OK on success, nothing else at the moment.
 */
stat_t init_devmem(pm_t ram_base, pm_t ram_top);

/**
 * Allocate direct device mapping.
 * @note Returned address might not be the same as the requested address. The
 * caller is responsible for passing the returned address to \ref free_devmem(), not
 * the requested address.
 *
 * @param p Process to allocate device mapping to.
 * @param dev_start Start of physical address where device is mapped to.
 * @param bytes Minimum size of direct memory allocation.
 * @param flags Access flags of allocation.
 * @return Address to start of allocation if succesful, \c 0 otherwise.
 */
vm_t alloc_devmem(struct tcb *p, pm_t dev_start, size_t bytes, vmflags_t flags);

/**
 * Free direct device mapping.
 *
 * @param p Process to free mapping from.
 * @param dev_start Start of allocation.
 * @return \ref OK when succesful, \c ERR_NF when mapping not found.
 */
stat_t free_devmem(struct tcb *p, vm_t dev_start);

#endif /* APOS_DEV_H */