15 #include <sys/types.h>
17 #include <sys/ioctl.h>
21 #include <xf86drmMode.h>
22 #include <tbm_surface.h>
23 #include <tbm_surface_internal.h>
24 #include <tdm_backend.h>
32 /* drm backend functions (display) */
33 tdm_error vc4_display_get_capability(tdm_backend_data *bdata, tdm_caps_display *caps);
34 tdm_output** vc4_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error);
35 tdm_error vc4_display_get_fd(tdm_backend_data *bdata, int *fd);
36 tdm_error vc4_display_handle_events(tdm_backend_data *bdata);
37 tdm_error vc4_output_get_capability(tdm_output *output, tdm_caps_output *caps);
38 tdm_layer** vc4_output_get_layers(tdm_output *output, int *count, tdm_error *error);
39 tdm_error vc4_output_set_property(tdm_output *output, unsigned int id, tdm_value value);
40 tdm_error vc4_output_get_property(tdm_output *output, unsigned int id, tdm_value *value);
41 tdm_error vc4_output_wait_vblank(tdm_output *output, int interval, int sync, void *user_data);
42 tdm_error vc4_output_set_vblank_handler(tdm_output *output, tdm_output_vblank_handler func);
43 tdm_error vc4_output_commit(tdm_output *output, int sync, void *user_data);
44 tdm_error vc4_output_set_commit_handler(tdm_output *output, tdm_output_commit_handler func);
45 tdm_error vc4_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value);
46 tdm_error vc4_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value);
47 tdm_error vc4_output_set_mode(tdm_output *output, const tdm_output_mode *mode);
48 tdm_error vc4_output_get_mode(tdm_output *output, const tdm_output_mode **mode);
49 tdm_error vc4_output_set_status_handler(tdm_output *output, tdm_output_status_handler func, void *user_data);
50 tdm_error vc4_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
51 tdm_error vc4_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value);
52 tdm_error vc4_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value);
53 tdm_error vc4_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
54 tdm_error vc4_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
55 tdm_error vc4_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
56 tdm_error vc4_layer_unset_buffer(tdm_layer *layer);
58 /* drm module internal macros, structures, functions */
59 #define NEVER_GET_HERE() TDM_ERR("** NEVER GET HERE **")
61 #define C(b, m) (((b) >> (m)) & 0xFF)
62 #define B(c, s) ((((unsigned int)(c)) & 0xff) << (s))
63 #define FOURCC(a, b, c, d) (B(d, 24) | B(c, 16) | B(b, 8) | B(a, 0))
64 #define FOURCC_STR(id) C(id, 0), C(id, 8), C(id, 16), C(id, 24)
66 #define IS_RGB(format) (format == TBM_FORMAT_XRGB8888 || format == TBM_FORMAT_ARGB8888 || \
67 format == TBM_FORMAT_XBGR8888 || format == TBM_FORMAT_ABGR8888)
69 #define CLEAR(x) memset(&(x), 0, sizeof(x))
70 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
71 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
72 #define SWAP(a, b) ({int t; t = a; a = b; b = t; })
73 #define ROUNDUP(x) (ceil(floor((float)(height) / 4)))
75 #define ALIGN_TO_16B(x) ((((x) + (1 << 4) - 1) >> 4) << 4)
76 #define ALIGN_TO_32B(x) ((((x) + (1 << 5) - 1) >> 5) << 5)
77 #define ALIGN_TO_128B(x) ((((x) + (1 << 7) - 1) >> 7) << 7)
78 #define ALIGN_TO_2KB(x) ((((x) + (1 << 11) - 1) >> 11) << 11)
79 #define ALIGN_TO_8KB(x) ((((x) + (1 << 13) - 1) >> 13) << 13)
80 #define ALIGN_TO_64KB(x) ((((x) + (1 << 16) - 1) >> 16) << 16)
82 #define RETURN_VAL_IF_FAIL(cond, val) {\
84 TDM_ERR("'%s' failed", #cond);\
89 #define GOTO_IF_FAIL(cond, val) {\
91 TDM_ERR("'%s' failed", #cond);\
96 typedef struct _tdm_vc4_data {
101 #if LIBDRM_MAJOR_VERSION >= 2 && LIBDRM_MINOR_VERSION >= 4 && LIBDRM_MICRO_VERSION >= 47
102 int has_universal_plane;
106 struct udev_monitor *uevent_monitor;
107 tdm_event_loop_source *uevent_source;
110 drmModeResPtr mode_res;
111 drmModePlaneResPtr plane_res;
113 struct list_head output_list;
114 struct list_head buffer_list;
117 uint32_t tdm_vc4_format_to_drm_format(tbm_format format);
118 tbm_format tdm_vc4_format_to_tbm_format(uint32_t format);
120 void tdm_vc4_display_update_output_status(tdm_vc4_data *vc4_data);
121 tdm_error tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data);
122 void tdm_vc4_display_destroy_output_list(tdm_vc4_data *vc4_data);
123 tdm_error tdm_vc4_display_create_layer_list(tdm_vc4_data *vc4_data);
125 #endif /* _TDM_VC4_H_ */