Merge pull request #5 from polachok/new
[pscnv.git] / pscnv / pscnv_mm.h
blob4d244c7a807f73f780dab4d3e7bf347352a9cbe7
1 #ifndef PSCNV_MM_H
2 #define PSCNV_MM_H
4 #include "drm.h"
5 #include "pscnv_tree.h"
7 PSCNV_RB_HEAD(pscnv_mm_head, pscnv_mm_node);
9 struct pscnv_mm {
10 struct drm_device *dev;
11 struct pscnv_mm_head head;
12 uint32_t spsize;
13 uint32_t lpsize;
14 uint32_t tssize;
17 struct pscnv_mm_node {
18 PSCNV_RB_ENTRY(pscnv_mm_node) entry;
19 struct pscnv_mm *mm;
20 uint64_t maxgap[4];
21 uint64_t gap[4];
22 int sentinel;
23 enum {
24 PSCNV_MM_TYPE_USED0,
25 PSCNV_MM_TYPE_USED1,
26 PSCNV_MM_TYPE_FREE,
27 } type;
28 uint64_t start;
29 uint64_t size;
30 struct pscnv_mm_node *next;
31 struct pscnv_mm_node *prev;
32 void *tag;
33 void *tag2;
36 #define PSCNV_MM_T1 1
37 #define PSCNV_MM_LP 2
38 #define PSCNV_MM_FRAGOK 4
39 #define PSCNV_MM_FROMBACK 8
41 int pscnv_mm_init(struct drm_device *dev, uint64_t start, uint64_t end, uint32_t spsize, uint32_t lpsize, uint32_t tssize, struct pscnv_mm **res);
42 int pscnv_mm_alloc(struct pscnv_mm *mm, uint64_t size, uint32_t flags, uint64_t start, uint64_t end, struct pscnv_mm_node **res);
43 void pscnv_mm_free(struct pscnv_mm_node *node);
44 void pscnv_mm_takedown(struct pscnv_mm *mm, void (*free_callback)(struct pscnv_mm_node *));
45 struct pscnv_mm_node *pscnv_mm_find_node(struct pscnv_mm *mm, uint64_t addr);
47 #endif