Home | History | Annotate | Download | only in adf
      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