1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef _LIBADF_ADF_H_ 18 #define _LIBADF_ADF_H_ 19 20 #include <stdint.h> 21 #include <stdbool.h> 22 #include <sys/cdefs.h> 23 #include <sys/types.h> 24 #include <video/adf.h> 25 26 typedef __u32 adf_id_t; 27 28 struct adf_device { 29 adf_id_t id; 30 int fd; 31 }; 32 33 __BEGIN_DECLS 34 35 /** 36 * Enumerates all ADF devices. 37 * 38 * Returns the number of ADF devices, and sets ids to a list of device IDs. 39 * The caller must free() the returned list of device IDs. 40 * 41 * On error, returns -errno. 42 */ 43 ssize_t adf_devices(adf_id_t **ids); 44 45 /** 46 * Opens an ADF device. 47 * 48 * On error, returns -errno. 49 */ 50 int adf_device_open(adf_id_t id, int flags, struct adf_device *dev); 51 /** 52 * Closes an ADF device. 53 */ 54 void adf_device_close(struct adf_device *dev); 55 /** 56 * Reads the ADF device data. 57 * 58 * adf_get_device_data() allocates buffers inside data, which the caller 59 * must free by calling adf_free_device_data(). On error, returns -errno. 60 */ 61 int adf_get_device_data(struct adf_device *dev, struct adf_device_data *data); 62 /** 63 * Frees the device data returned by adf_get_device_data(). 64 */ 65 void adf_free_device_data(struct adf_device_data *data); 66 67 /** 68 * Atomically posts a new display configuration to the specified interfaces. 69 * 70 * Returns a sync fence fd that will fire when the configuration is removed 71 * from the screen. On error, returns -errno. 72 */ 73 int adf_device_post(struct adf_device *dev, 74 adf_id_t *interfaces, size_t n_interfaces, 75 struct adf_buffer_config *bufs, size_t n_bufs, 76 void *custom_data, size_t custom_data_size); 77 /** 78 * Atomically posts a new display configuration to the specified interfaces. 79 * 80 * Compared to adf_device_post(), adf_device_post_v2(): 81 * 82 * (*) allows the client to choose the kind of sync fence returned 83 * (through complete_fence_type) 84 * 85 * (*) stores the returned sync fence fd in a provided buffer, so the client 86 * can distinguish between a permission error (ret = -1) and a successful 87 * call that returns no fence (*complete_fence = -1) 88 * 89 * On error, returns -errno. 90 * 91 * On devices without the corresponding kernel support, returns -ENOTTY. 92 */ 93 int adf_device_post_v2(struct adf_device *dev, 94 adf_id_t *interfaces, __u32 n_interfaces, 95 struct adf_buffer_config *bufs, __u32 n_bufs, 96 void *custom_data, __u64 custom_data_size, 97 enum adf_complete_fence_type complete_fence_type, 98 int *complete_fence); 99 100 /** 101 * Attaches the specified interface and overlay engine. 102 */ 103 int adf_device_attach(struct adf_device *dev, adf_id_t overlay_engine, 104 adf_id_t interface); 105 /** 106 * Detaches the specified interface and overlay engine. 107 */ 108 int adf_device_detach(struct adf_device *dev, adf_id_t overlay_engine, 109 adf_id_t interface); 110 111 /** 112 * Enumerates all interfaces belonging to an ADF device. 113 * 114 * The caller must free() the returned list of interface IDs. 115 */ 116 ssize_t adf_interfaces(struct adf_device *dev, adf_id_t **interfaces); 117 118 /** 119 * Enumerates all interfaces which can be attached to the specified overlay 120 * engine. 121 * 122 * The caller must free() the returned list of interface IDs. 123 */ 124 ssize_t adf_interfaces_for_overlay_engine(struct adf_device *dev, 125 adf_id_t overlay_engine, adf_id_t **interfaces); 126 /** 127 * Filters a list of interfaces by type. 128 * 129 * Returns the number of matching interfaces, and sets out to a list of matching 130 * interface IDs. The caller must free() the returned list of interface IDs. 131 * 132 * On error, returns -errno. 133 */ 134 ssize_t adf_interfaces_filter_by_type(struct adf_device *dev, 135 enum adf_interface_type type, 136 adf_id_t *in, size_t n_in, adf_id_t **out); 137 /** 138 * Filters a list of interfaces by flag. 139 * 140 * The caller must free() the returned list of interface IDs. 141 */ 142 ssize_t adf_interfaces_filter_by_flag(struct adf_device *dev, __u32 flag, 143 adf_id_t *in, size_t n_in, adf_id_t **out); 144 145 /** 146 * Opens an ADF interface. 147 * 148 * Returns a file descriptor. The caller must close() the fd when done. 149 * On error, returns -errno. 150 */ 151 int adf_interface_open(struct adf_device *dev, adf_id_t id, int flags); 152 /** 153 * Reads the interface data. 154 * 155 * adf_get_interface_data() allocates buffers inside data, which the caller 156 * must free by calling adf_free_interface_data(). On error, returns -errno. 157 */ 158 int adf_get_interface_data(int fd, struct adf_interface_data *data); 159 /** 160 * Frees the interface data returned by adf_get_interface_data(). 161 */ 162 void adf_free_interface_data(struct adf_interface_data *data); 163 164 /** 165 * Sets the interface's DPMS mode. 166 */ 167 int adf_interface_blank(int fd, __u8 mode); 168 /** 169 * Sets the interface's display mode. 170 */ 171 int adf_interface_set_mode(int fd, struct drm_mode_modeinfo *mode); 172 /** 173 * Allocates a single-plane RGB buffer of the specified size and format. 174 * 175 * Returns a dma-buf fd. On error, returns -errno. 176 */ 177 int adf_interface_simple_buffer_alloc(int fd, __u32 w, __u32 h, 178 __u32 format, __u32 *offset, __u32 *pitch); 179 /** 180 * Posts a single-plane RGB buffer to the display using the specified 181 * overlay engine. 182 * 183 * Returns a sync fence fd that will fire when the buffer is removed 184 * from the screen. On error, returns -errno. 185 */ 186 int adf_interface_simple_post(int fd, adf_id_t overlay_engine, 187 __u32 w, __u32 h, __u32 format, int buf_fd, __u32 offset, 188 __u32 pitch, int acquire_fence); 189 /** 190 * Posts a single-plane RGB buffer to the display using the specified 191 * overlay engine. 192 * 193 * Compared to adf_interface_simple_post(), adf_interface_simple_post_v2(): 194 * 195 * (*) allows the client to choose the kind of sync fence returned 196 * (through complete_fence_type) 197 * 198 * (*) stores the returned sync fence fd in a provided buffer, so the client 199 * can distinguish between a permission error (ret = -1) and a successful 200 * call that returns no fence (*complete_fence = -1) 201 * 202 * On error, returns -errno. 203 * 204 * On devices without the corresponding kernel support, returns -ENOTTY. 205 */ 206 int adf_interface_simple_post_v2(int fd, adf_id_t overlay_engine, 207 __u32 w, __u32 h, __u32 format, int buf_fd, __u32 offset, 208 __u32 pitch, int acquire_fence, 209 enum adf_complete_fence_type complete_fence_type, 210 int *complete_fence); 211 212 /** 213 * Enumerates all overlay engines belonging to an ADF device. 214 * 215 * The caller must free() the returned list of overlay engine IDs. 216 */ 217 ssize_t adf_overlay_engines(struct adf_device *dev, adf_id_t **overlay_engines); 218 219 /** 220 * Enumerates all overlay engines which can be attached to the specified 221 * interface. 222 * 223 * The caller must free() the returned list of overlay engine IDs. 224 */ 225 ssize_t adf_overlay_engines_for_interface(struct adf_device *dev, 226 adf_id_t interface, adf_id_t **overlay_engines); 227 /** 228 * Filters a list of overlay engines by supported buffer format. 229 * 230 * Returns the overlay engines which support at least one of the specified 231 * formats. The caller must free() the returned list of overlay engine IDs. 232 */ 233 ssize_t adf_overlay_engines_filter_by_format(struct adf_device *dev, 234 const __u32 *formats, size_t n_formats, adf_id_t *in, size_t n_in, 235 adf_id_t **out); 236 237 /** 238 * Opens an ADF overlay engine. 239 * 240 * Returns a file descriptor. The caller must close() the fd when done. 241 * On error, returns -errno. 242 */ 243 int adf_overlay_engine_open(struct adf_device *dev, adf_id_t id, int flags); 244 /** 245 * Reads the overlay engine data. 246 * 247 * adf_get_overlay_engine_data() allocates buffers inside data, which the caller 248 * must free by calling adf_free_overlay_engine_data(). On error, returns 249 * -errno. 250 */ 251 int adf_get_overlay_engine_data(int fd, struct adf_overlay_engine_data *data); 252 /** 253 * Frees the overlay engine data returned by adf_get_overlay_engine_data(). 254 */ 255 void adf_free_overlay_engine_data(struct adf_overlay_engine_data *data); 256 257 /** 258 * Returns whether the overlay engine supports the specified format. 259 */ 260 bool adf_overlay_engine_supports_format(int fd, __u32 format); 261 262 /** 263 * Subscribes or unsubscribes from the specified hardware event. 264 */ 265 int adf_set_event(int fd, enum adf_event_type type, bool enabled); 266 /** 267 * Reads one event from the fd, blocking if needed. 268 * 269 * The caller must free() the returned buffer. On error, returns -errno. 270 */ 271 int adf_read_event(int fd, struct adf_event **event); 272 273 #define ADF_FORMAT_STR_SIZE 5 274 /** 275 * Converts an ADF/DRM fourcc format to its string representation. 276 */ 277 void adf_format_str(__u32 format, char buf[ADF_FORMAT_STR_SIZE]); 278 279 /** 280 * Finds an appropriate interface and overlay engine for a simple post. 281 * 282 * Specifically, finds the primary interface, and an overlay engine 283 * that can be attached to the primary interface and supports one of the 284 * specified formats. The caller may pass a NULL formats list, to indicate that 285 * any RGB format is acceptable. 286 * 287 * On error, returns -errno. 288 */ 289 int adf_find_simple_post_configuration(struct adf_device *dev, 290 const __u32 *formats, size_t n_formats, 291 adf_id_t *interface, adf_id_t *overlay_engine); 292 293 __END_DECLS 294 295 #endif /* _LIBADF_ADF_H_ */ 296