xref: /aosp_15_r20/external/igt-gpu-tools/lib/gem_msm.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker #include "gem_msm.h"
2*d83cc019SAndroid Build Coastguard Worker #include "drm-uapi/msm_drm.h"
3*d83cc019SAndroid Build Coastguard Worker 
4*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
5*d83cc019SAndroid Build Coastguard Worker 
gem_msm_mmap(void ** ptr,int drm_fd,uint32_t gem_handle,size_t size)6*d83cc019SAndroid Build Coastguard Worker static int gem_msm_mmap(void **ptr, int drm_fd, uint32_t gem_handle, size_t size)
7*d83cc019SAndroid Build Coastguard Worker {
8*d83cc019SAndroid Build Coastguard Worker 	struct drm_msm_gem_cpu_prep gem_prep = {
9*d83cc019SAndroid Build Coastguard Worker 		.handle = gem_handle,
10*d83cc019SAndroid Build Coastguard Worker 		.op = MSM_PREP_READ,
11*d83cc019SAndroid Build Coastguard Worker 		.timeout = { .tv_sec = 1, .tv_nsec = 0 }
12*d83cc019SAndroid Build Coastguard Worker 	};
13*d83cc019SAndroid Build Coastguard Worker 
14*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(drm_fd, DRM_IOCTL_MSM_GEM_CPU_PREP, &gem_prep))
15*d83cc019SAndroid Build Coastguard Worker 	{
16*d83cc019SAndroid Build Coastguard Worker 		return -1;
17*d83cc019SAndroid Build Coastguard Worker 	}
18*d83cc019SAndroid Build Coastguard Worker 
19*d83cc019SAndroid Build Coastguard Worker 	struct drm_msm_gem_info gem_info = {
20*d83cc019SAndroid Build Coastguard Worker 		.handle = gem_handle,
21*d83cc019SAndroid Build Coastguard Worker 		.flags = 0,
22*d83cc019SAndroid Build Coastguard Worker 		.offset = 0
23*d83cc019SAndroid Build Coastguard Worker 	};
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(drm_fd, DRM_IOCTL_MSM_GEM_INFO, &gem_info))
26*d83cc019SAndroid Build Coastguard Worker 	{
27*d83cc019SAndroid Build Coastguard Worker 		return -1;
28*d83cc019SAndroid Build Coastguard Worker 	}
29*d83cc019SAndroid Build Coastguard Worker 
30*d83cc019SAndroid Build Coastguard Worker 	void *const k_addr = 0;
31*d83cc019SAndroid Build Coastguard Worker 	const int k_prot = PROT_READ | PROT_WRITE;
32*d83cc019SAndroid Build Coastguard Worker 	const int k_flags = MAP_SHARED;
33*d83cc019SAndroid Build Coastguard Worker 
34*d83cc019SAndroid Build Coastguard Worker 	void *ret = mmap(k_addr, size, k_prot, k_flags, drm_fd, gem_info.offset);
35*d83cc019SAndroid Build Coastguard Worker 
36*d83cc019SAndroid Build Coastguard Worker 	if (ret == MAP_FAILED)
37*d83cc019SAndroid Build Coastguard Worker 	{
38*d83cc019SAndroid Build Coastguard Worker 		return -1;
39*d83cc019SAndroid Build Coastguard Worker 	}
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker 	*ptr = ret;
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker 	return 0;
44*d83cc019SAndroid Build Coastguard Worker }
45*d83cc019SAndroid Build Coastguard Worker 
gem_msm_munmap(int drm_fd,uint32_t gem_handle,void * ptr,size_t size)46*d83cc019SAndroid Build Coastguard Worker static int gem_msm_munmap(int drm_fd, uint32_t gem_handle, void *ptr, size_t size)
47*d83cc019SAndroid Build Coastguard Worker {
48*d83cc019SAndroid Build Coastguard Worker 	if (munmap(ptr, size))
49*d83cc019SAndroid Build Coastguard Worker 	{
50*d83cc019SAndroid Build Coastguard Worker 		return -1;
51*d83cc019SAndroid Build Coastguard Worker 	}
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker 	struct drm_msm_gem_cpu_fini gem_fini = {
54*d83cc019SAndroid Build Coastguard Worker 		.handle = gem_handle
55*d83cc019SAndroid Build Coastguard Worker 	};
56*d83cc019SAndroid Build Coastguard Worker 
57*d83cc019SAndroid Build Coastguard Worker 	if (drmIoctl(drm_fd, DRM_IOCTL_MSM_GEM_CPU_FINI, &gem_fini))
58*d83cc019SAndroid Build Coastguard Worker 	{
59*d83cc019SAndroid Build Coastguard Worker 		return -1;
60*d83cc019SAndroid Build Coastguard Worker 	}
61*d83cc019SAndroid Build Coastguard Worker 
62*d83cc019SAndroid Build Coastguard Worker 	return 0;
63*d83cc019SAndroid Build Coastguard Worker }
64*d83cc019SAndroid Build Coastguard Worker 
65*d83cc019SAndroid Build Coastguard Worker struct gem_driver gem_msm_driver = {
66*d83cc019SAndroid Build Coastguard Worker 	.mmap = gem_msm_mmap,
67*d83cc019SAndroid Build Coastguard Worker 	.munmap = gem_msm_munmap
68*d83cc019SAndroid Build Coastguard Worker };
69