embox

Форк
0
/
etnaviv_gem.c 
121 строка · 2.5 Кб
1
/**
2
 * @file
3
 *
4
 * @date Jan 18, 2018
5
 * @author Anton Bondarev
6
 */
7

8
#include <util/log.h>
9

10
#include <stdint.h>
11
#include <stddef.h>
12
#include <pthread.h>
13
#include <stdio.h>
14
#include <util/err.h>
15
#include <mem/sysmalloc.h>
16

17
#include <embox_drm/drm_priv.h>
18
#include <embox_drm/drm_gem.h>
19

20
#include "etnaviv_gem.h"
21
#include "etnaviv_drv.h"
22

23
int etnaviv_gem_obj_add(struct drm_device *dev, struct drm_gem_object *obj) {
24
	return 0;
25
}
26

27
static int etnaviv_gem_new_impl(struct drm_device *dev, uint32_t size,
28
		uint32_t flags, struct reservation_object *robj,
29
		void *ops, struct drm_gem_object **obj) {
30
	struct etnaviv_gem_object *etnaviv_obj;
31
	unsigned sz = sizeof(*etnaviv_obj);
32
	etnaviv_obj = sysmalloc(sz);
33

34
	if (!etnaviv_obj) {
35
		log_debug("enomem\n");
36
		return -ENOMEM;
37
	}
38

39
	etnaviv_obj->flags = flags;
40

41
	mutex_init(&etnaviv_obj->lock);
42

43
	*obj = &etnaviv_obj->base;
44

45
	return 0;
46
}
47

48
static struct drm_gem_object *__etnaviv_gem_new(struct drm_device *dev,
49
		uint32_t size, uint32_t flags) {
50
	struct drm_gem_object *obj = NULL;
51
	int ret;
52

53
	ret = etnaviv_gem_new_impl(dev, size, flags, NULL, NULL, &obj);
54
	if (ret) {
55
		log_debug("err 1\n");
56
		goto fail;
57
	}
58

59
	ret = drm_gem_object_init(dev, obj, size);
60
	log_debug("ret %p\n", obj);
61
	return obj;
62

63
fail:
64
	return err2ptr(ret);
65
}
66

67
/* convenience method to construct a GEM buffer object, and userspace handle */
68
int etnaviv_gem_new_handle(struct drm_device *dev, struct drm_file *file,
69
		uint32_t size, uint32_t flags, uint32_t *handle) {
70
	struct drm_gem_object *obj;
71
	int ret;
72

73
	obj = __etnaviv_gem_new(dev, size, flags);
74
	if (ptr2err(obj)) {
75
		return (int) obj;
76
	}
77

78
	ret = etnaviv_gem_obj_add(dev, obj);
79
	if (ret < 0) {
80
		return ret;
81
	}
82

83
	return drm_gem_handle_create(file, obj, handle);
84
}
85

86
struct drm_gem_object *etnaviv_gem_new(struct drm_device *dev, uint32_t size,
87
		uint32_t flags) {
88
	struct drm_gem_object *obj;
89
	int ret;
90

91
	obj = __etnaviv_gem_new(dev, size, flags);
92
	if (ptr2err(obj))
93
		return obj;
94

95
	if ((ret = etnaviv_gem_obj_add(dev, obj)) < 0) {
96
		return err2ptr(ret);
97
	}
98

99
	return obj;
100
}
101

102

103
int etnaviv_gem_mmap_offset(struct drm_gem_object *obj, uint64_t *offset) {
104
	*offset = (int) obj;
105
	return 0;
106
}
107

108
struct etnaviv_vram_mapping *etnaviv_gem_mapping_get(
109
	struct drm_gem_object *obj, struct etnaviv_gpu *gpu) {
110
	struct etnaviv_gem_object *etnaviv_obj = to_etnaviv_bo(obj);
111
	struct etnaviv_vram_mapping *mapping;
112

113
	if (!(mapping = kzalloc(sizeof(*mapping), GFP_KERNEL))) {
114
		return 0;
115
	}
116

117
	mapping->object = etnaviv_obj;
118
	mapping->iova = (uint32_t) obj->dma_buf - 0x10000000;
119

120
	return mapping;
121
}
122

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.