1*d83cc019SAndroid Build Coastguard Worker #include "gem.h"
2*d83cc019SAndroid Build Coastguard Worker
3*d83cc019SAndroid Build Coastguard Worker #include "gem_msm.h"
4*d83cc019SAndroid Build Coastguard Worker
5*d83cc019SAndroid Build Coastguard Worker struct gem_driver_lookup
6*d83cc019SAndroid Build Coastguard Worker {
7*d83cc019SAndroid Build Coastguard Worker const char name[16];
8*d83cc019SAndroid Build Coastguard Worker struct gem_driver *driver;
9*d83cc019SAndroid Build Coastguard Worker };
10*d83cc019SAndroid Build Coastguard Worker
11*d83cc019SAndroid Build Coastguard Worker static struct gem_driver_lookup drivers[] = {
12*d83cc019SAndroid Build Coastguard Worker {
13*d83cc019SAndroid Build Coastguard Worker .name = "msm_drm",
14*d83cc019SAndroid Build Coastguard Worker .driver = &gem_msm_driver
15*d83cc019SAndroid Build Coastguard Worker }
16*d83cc019SAndroid Build Coastguard Worker };
17*d83cc019SAndroid Build Coastguard Worker
num_drivers()18*d83cc019SAndroid Build Coastguard Worker static inline size_t num_drivers()
19*d83cc019SAndroid Build Coastguard Worker {
20*d83cc019SAndroid Build Coastguard Worker return ARRAY_SIZE(drivers);
21*d83cc019SAndroid Build Coastguard Worker }
22*d83cc019SAndroid Build Coastguard Worker
gem_get_driver(int drm_fd)23*d83cc019SAndroid Build Coastguard Worker struct gem_driver *gem_get_driver(int drm_fd)
24*d83cc019SAndroid Build Coastguard Worker {
25*d83cc019SAndroid Build Coastguard Worker char name[16] = {0};
26*d83cc019SAndroid Build Coastguard Worker drm_version_t version = {};
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker version.name_len = sizeof(name);
29*d83cc019SAndroid Build Coastguard Worker version.name = name;
30*d83cc019SAndroid Build Coastguard Worker
31*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(drm_fd, DRM_IOCTL_VERSION, &version))
32*d83cc019SAndroid Build Coastguard Worker {
33*d83cc019SAndroid Build Coastguard Worker return NULL;
34*d83cc019SAndroid Build Coastguard Worker }
35*d83cc019SAndroid Build Coastguard Worker
36*d83cc019SAndroid Build Coastguard Worker for (struct gem_driver_lookup *di = drivers;
37*d83cc019SAndroid Build Coastguard Worker di - drivers < num_drivers();
38*d83cc019SAndroid Build Coastguard Worker ++di)
39*d83cc019SAndroid Build Coastguard Worker {
40*d83cc019SAndroid Build Coastguard Worker if (!strncmp(name, di->name, sizeof(name)))
41*d83cc019SAndroid Build Coastguard Worker {
42*d83cc019SAndroid Build Coastguard Worker return di->driver;
43*d83cc019SAndroid Build Coastguard Worker }
44*d83cc019SAndroid Build Coastguard Worker }
45*d83cc019SAndroid Build Coastguard Worker
46*d83cc019SAndroid Build Coastguard Worker return NULL;
47*d83cc019SAndroid Build Coastguard Worker }
48*d83cc019SAndroid Build Coastguard Worker
gem_size(int drm_fd,size_t * size,uint32_t gem_handle)49*d83cc019SAndroid Build Coastguard Worker int gem_size(int drm_fd, size_t *size, uint32_t gem_handle)
50*d83cc019SAndroid Build Coastguard Worker {
51*d83cc019SAndroid Build Coastguard Worker struct drm_gem_flink drm_gem_flink_arg = {
52*d83cc019SAndroid Build Coastguard Worker .handle = gem_handle,
53*d83cc019SAndroid Build Coastguard Worker .name = 0
54*d83cc019SAndroid Build Coastguard Worker };
55*d83cc019SAndroid Build Coastguard Worker
56*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(drm_fd,
57*d83cc019SAndroid Build Coastguard Worker DRM_IOCTL_GEM_FLINK,
58*d83cc019SAndroid Build Coastguard Worker &drm_gem_flink_arg))
59*d83cc019SAndroid Build Coastguard Worker {
60*d83cc019SAndroid Build Coastguard Worker return -1;
61*d83cc019SAndroid Build Coastguard Worker }
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker struct drm_gem_open drm_gem_open_arg = {
64*d83cc019SAndroid Build Coastguard Worker .name = drm_gem_flink_arg.name,
65*d83cc019SAndroid Build Coastguard Worker .handle = 0,
66*d83cc019SAndroid Build Coastguard Worker .size = 0
67*d83cc019SAndroid Build Coastguard Worker };
68*d83cc019SAndroid Build Coastguard Worker
69*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(drm_fd,
70*d83cc019SAndroid Build Coastguard Worker DRM_IOCTL_GEM_OPEN,
71*d83cc019SAndroid Build Coastguard Worker &drm_gem_open_arg))
72*d83cc019SAndroid Build Coastguard Worker {
73*d83cc019SAndroid Build Coastguard Worker return -1;
74*d83cc019SAndroid Build Coastguard Worker }
75*d83cc019SAndroid Build Coastguard Worker
76*d83cc019SAndroid Build Coastguard Worker *size = drm_gem_open_arg.size;
77*d83cc019SAndroid Build Coastguard Worker
78*d83cc019SAndroid Build Coastguard Worker if (drm_gem_open_arg.handle != gem_handle)
79*d83cc019SAndroid Build Coastguard Worker {
80*d83cc019SAndroid Build Coastguard Worker gem_release_handle(drm_fd, drm_gem_open_arg.handle);
81*d83cc019SAndroid Build Coastguard Worker }
82*d83cc019SAndroid Build Coastguard Worker
83*d83cc019SAndroid Build Coastguard Worker return 0;
84*d83cc019SAndroid Build Coastguard Worker }
85*d83cc019SAndroid Build Coastguard Worker
gem_release_handle(int drm_fd,uint32_t gem_handle)86*d83cc019SAndroid Build Coastguard Worker void gem_release_handle(int drm_fd, uint32_t gem_handle)
87*d83cc019SAndroid Build Coastguard Worker {
88*d83cc019SAndroid Build Coastguard Worker struct drm_gem_close drm_gem_close_arg = {
89*d83cc019SAndroid Build Coastguard Worker .handle = gem_handle,
90*d83cc019SAndroid Build Coastguard Worker .pad = 0
91*d83cc019SAndroid Build Coastguard Worker };
92*d83cc019SAndroid Build Coastguard Worker
93*d83cc019SAndroid Build Coastguard Worker drmIoctl(drm_fd, DRM_IOCTL_GEM_CLOSE, &drm_gem_close_arg);
94*d83cc019SAndroid Build Coastguard Worker }
95*d83cc019SAndroid Build Coastguard Worker
drm_fb_for_gem_handle(int drm_fd,uint32_t * fb_id,uint32_t gem_handle,const struct fb_configuration * fb_config)96*d83cc019SAndroid Build Coastguard Worker int drm_fb_for_gem_handle(int drm_fd, uint32_t *fb_id, uint32_t gem_handle,
97*d83cc019SAndroid Build Coastguard Worker const struct fb_configuration *fb_config)
98*d83cc019SAndroid Build Coastguard Worker {
99*d83cc019SAndroid Build Coastguard Worker struct drm_mode_fb_cmd2 drm_mode_addfb2_arg = {
100*d83cc019SAndroid Build Coastguard Worker .fb_id = 0,
101*d83cc019SAndroid Build Coastguard Worker .width = fb_config->width,
102*d83cc019SAndroid Build Coastguard Worker .height = fb_config->height,
103*d83cc019SAndroid Build Coastguard Worker .pixel_format = fb_config->pixel_format,
104*d83cc019SAndroid Build Coastguard Worker .flags = DRM_MODE_FB_MODIFIERS,
105*d83cc019SAndroid Build Coastguard Worker .handles = { gem_handle, 0, 0, 0 },
106*d83cc019SAndroid Build Coastguard Worker .pitches = { fb_config->width * fb_config->pixel_size, 0, 0, 0 },
107*d83cc019SAndroid Build Coastguard Worker .offsets = { 0, 0, 0, 0 },
108*d83cc019SAndroid Build Coastguard Worker .modifier = { 0 }
109*d83cc019SAndroid Build Coastguard Worker };
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(drm_fd, DRM_IOCTL_MODE_ADDFB2, &drm_mode_addfb2_arg))
112*d83cc019SAndroid Build Coastguard Worker {
113*d83cc019SAndroid Build Coastguard Worker return -1;
114*d83cc019SAndroid Build Coastguard Worker }
115*d83cc019SAndroid Build Coastguard Worker
116*d83cc019SAndroid Build Coastguard Worker *fb_id = drm_mode_addfb2_arg.fb_id;
117*d83cc019SAndroid Build Coastguard Worker
118*d83cc019SAndroid Build Coastguard Worker return 0;
119*d83cc019SAndroid Build Coastguard Worker }
120