xref: /aosp_15_r20/external/igt-gpu-tools/lib/gem.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
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