blob: 2a09a7611acbbf30b91ea7c2059d057346cb7314 [file] [log] [blame]
leng.fang07ca08d2023-05-08 07:33:53 +00001/*
2 * Copyright (c) 2021 Amlogic, Inc. All rights reserved.
3 *
4 * This source code is subject to the terms and conditions defined in the
5 * file 'LICENSE' which is part of this source code package.
6 *
7 * Description:
8 */
9#define LOG_NDEBUG 1
10
11#include <fcntl.h>
12#include <sys/ioctl.h>
13#include <MesonLog.h>
14#include "UvmDev.h"
15
16#define UVM_DEV_PATH "/dev/uvm"
17#define UVM_IOC_MAGIC 'U'
18
19#define UVM_IOC_SET_PID _IOWR(UVM_IOC_MAGIC, 2, struct uvm_pid_data)
20#define UVM_IOC_SET_FD _IOWR(UVM_IOC_MAGIC, 3, struct uvm_fd_data)
21#define UVM_IOC_SET_INFO _IOWR(UVM_IOC_MAGIC, 7, struct uvm_hook_data)
22#define UVM_IOC_DETACH _IOWR(UVM_IOC_MAGIC, 8, struct uvm_hook_data)
23#define UVM_IOC_GET_TYPE _IOWR(UVM_IOC_MAGIC, 11, struct uvm_fd_data)
24
25ANDROID_SINGLETON_STATIC_INSTANCE(UvmDev)
26
27UvmDev::UvmDev() {
28 mDrvFd = open(UVM_DEV_PATH, O_RDWR);
29 MESON_ASSERT(mDrvFd > 0, "UVM dev open failed");
30}
31
32UvmDev::~UvmDev() {
33 if (mDrvFd > 0)
34 close(mDrvFd);
35}
36
37int UvmDev::setPid(int pid) {
38 struct uvm_pid_data {
39 int pid;
40 } pid_data;
41
42 pid_data.pid = pid;
43
44 MESON_LOGD("setUVM with pid %d", pid);
45 if (ioctl(mDrvFd, UVM_IOC_SET_PID, &pid_data) != 0) {
46 MESON_LOGE("setUVM pid %d ioctl error %s", pid, strerror(errno));
47 return -1;
48 }
49 return 0;
50}
51
52int UvmDev::commitDisplay(const int fd, const int commit) {
53 struct uvm_fd_data fd_data;
54
55 fd_data.fd = fd;
56 fd_data.data = commit;
57
58 if (ioctl(mDrvFd, UVM_IOC_SET_FD, &fd_data) != 0)
59 return -1;
60
61 return 0;
62}
63
64// dettach uvm hooked buffer
65int UvmDev::dettachBuffer(int fd) {
66 struct uvm_hook_data hook_data = {
67 1 << VF_PROCESS_DI,
68 fd,
69 "dettach",
70 };
71
72 if (ioctl(mDrvFd, UVM_IOC_DETACH, &hook_data) != 0)
73 return -1;
74
75 return 0;
76}
77
78int UvmDev::attachBuffer(const int fd) {
79 struct uvm_hook_data hook_data = {
80 PROCESS_HWC,
81 fd,
82 "detach_flag=1",
83 };
84
85 if (ioctl(mDrvFd, UVM_IOC_SET_INFO, &hook_data) != 0) {
86 MESON_LOGV("set uvm %d detach flag failed: %s", fd, strerror(errno));
87 return -1;
88 }
89
90 return 0;
91}
92
93int UvmDev::getVideoType(const int fd) {
94 struct uvm_fd_data fd_data;
95 fd_data.fd = fd;
96 fd_data.data = 0;
97
98 if (ioctl(mDrvFd, UVM_IOC_GET_TYPE, &fd_data) != 0) {
99 MESON_LOGV("get %d video type failed: %s", fd, strerror(errno));
100 return 0;
101 }
102
103 return fd_data.data;
104}