VBLANK_TYPE_COMMIT,
} vblank_type_t;
-typedef struct
-{
- struct list_head link;
- uint32_t hw_event_type;
- void (*hw_event_func)(int fd, tdm_sprd_data *sprd_data_p, void* hw_event_data);
-} hw_event_callback_t;
-
struct _tdm_sprd_vblank_data_s
{
vblank_type_t type;
{
tdm_sprd_data *sprd_data = bdata;
RETURN_VAL_IF_FAIL(sprd_data, TDM_ERROR_INVALID_PARAMETER);
- #define MAX_BUF_SIZE 1024
- char buffer[MAX_BUF_SIZE];
- unsigned int len, i;
- hw_event_t *kernel_event_p;
- hw_event_callback_t *event_list_cur = NULL, *event_list_next = NULL;
- /* The DRM read semantics guarantees that we always get only
- * complete events. */
- len = read(sprd_data->drm_fd, buffer, sizeof buffer);
- if (len == 0)
- {
- TDM_WRN("warning: the size of the drm_event is 0.");
- return TDM_ERROR_NONE;
- }
- if (len < sizeof *kernel_event_p)
- {
- TDM_WRN("warning: the size of the drm_event is less than drm_event structure.");
+ if (drmHandleEvent(sprd_data->drm_fd, &sprd_data->evctx) < 0) {
return TDM_ERROR_OPERATION_FAILED;
}
- if (len > MAX_BUF_SIZE)
- {
- TDM_WRN("warning: the size of the drm_event can be over the maximum size.");
- return TDM_ERROR_OPERATION_FAILED;
- }
- i = 0;
- while (i < len)
- {
- kernel_event_p = (hw_event_t *) &buffer[i];
- LIST_FOR_EACH_ENTRY_SAFE(event_list_cur, event_list_next, &sprd_data->events_list, link)
- {
- if (event_list_cur->hw_event_type == kernel_event_p->type)
- {
- if (event_list_cur->hw_event_func)
- event_list_cur->hw_event_func(sprd_data->drm_fd, sprd_data, &buffer[i]);
- break;
- }
- }
- i += kernel_event_p->length;
- }
-
return TDM_ERROR_NONE;
}
return TDM_ERROR_NONE;
}
+static int
+_sprd_drm_user_handler(struct drm_event *event)
+{
+ RETURN_VAL_IF_FAIL(event, -1);
+
+ TDM_DBG("got event %d\n", event->type);
+
+ if (event->type != DRM_SPRD_IPP_EVENT)
+ return -1;
+
+ tdm_sprd_pp_handler((struct drm_sprd_ipp_event *)event);
+
+ return 0;
+}
+
static void
-_sprd_drm_vblank_event (int fd, tdm_sprd_data *sprd_data_p, void* hw_event_data)
+_sprd_drm_vblank_event (int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data)
{
- RETURN_VAL_IF_FAIL(hw_event_data,);
- RETURN_VAL_IF_FAIL(sprd_data_p,);
- struct drm_event_vblank *hw_vblank = (struct drm_event_vblank *) hw_event_data;
- tdm_sprd_vblank_data *vblank_data = (tdm_sprd_vblank_data* )((unsigned long) hw_vblank->user_data);
+ tdm_sprd_vblank_data *vblank_data = (tdm_sprd_vblank_data* )user_data;
tdm_sprd_output_data *output_data;
if (!vblank_data)
{
case VBLANK_TYPE_WAIT:
if (output_data->vblank_func)
- output_data->vblank_func(output_data, hw_vblank->sequence,
- hw_vblank->tv_sec, hw_vblank->tv_usec,
+ output_data->vblank_func(output_data, sequence,
+ tv_sec, tv_usec,
vblank_data->user_data);
break;
case VBLANK_TYPE_COMMIT:
if (output_data->commit_func)
- output_data->commit_func(output_data, hw_vblank->sequence,
- hw_vblank->tv_sec, hw_vblank->tv_usec,
+ output_data->commit_func(output_data, sequence,
+ tv_sec, tv_usec,
vblank_data->user_data);
+
break;
default:
return;
}
}
+
static void
-_sprd_drm_flip_complete_event (int fd, tdm_sprd_data *sprd_data_p, void* hw_event_data)
+_sprd_drm_flip_complete_event (int fd, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data)
{
TDM_DBG("FLIP EVENT");
}
tdm_error
-tdm_sprd_display_create_event_list(tdm_sprd_data *sprd_data)
+tdm_sprd_display_init_event_handling(tdm_sprd_data *sprd_data)
{
RETURN_VAL_IF_FAIL(sprd_data, TDM_ERROR_INVALID_PARAMETER);
- tdm_error ret_err = TDM_ERROR_NONE;
- hw_event_callback_t *vblank_event_p = NULL;
- hw_event_callback_t *ipp_event_p = NULL;
- hw_event_callback_t *flip_complete_event_p = NULL;
-#ifdef HAVE_FB_VBLANK
-/** @TODO FB vblank */
-#else
- if ((vblank_event_p = malloc(sizeof(hw_event_callback_t))) == NULL)
- {
- TDM_ERR("alloc fail");
- ret_err = TDM_ERROR_OUT_OF_MEMORY;
- goto bad_l;
- }
- vblank_event_p->hw_event_type = DRM_EVENT_VBLANK;
- vblank_event_p->hw_event_func = _sprd_drm_vblank_event;
- LIST_ADD(&vblank_event_p->link, &sprd_data->events_list);
- if ((flip_complete_event_p = malloc(sizeof(hw_event_callback_t))) == NULL)
- {
- TDM_ERR("alloc fail");
- ret_err = TDM_ERROR_OUT_OF_MEMORY;
- goto bad_l;
- }
- flip_complete_event_p->hw_event_type = DRM_EVENT_FLIP_COMPLETE;
- flip_complete_event_p->hw_event_func = _sprd_drm_flip_complete_event;
- LIST_ADD(&flip_complete_event_p->link, &sprd_data->events_list);
-#endif
- if ((ipp_event_p = malloc(sizeof(hw_event_callback_t))) == NULL)
- {
- TDM_ERR("alloc_fail");
- ret_err = TDM_ERROR_OUT_OF_MEMORY;
- goto bad_l;
- }
- ipp_event_p->hw_event_type = DRM_SPRD_IPP_EVENT;
- ipp_event_p->hw_event_func = tdm_sprd_pp_handler;
- LIST_ADD(&ipp_event_p->link, &sprd_data->events_list);
- if (ret_err != TDM_ERROR_NONE)
- goto bad_l;
+
+ sprd_data->evctx.version = 2;
+ sprd_data->evctx.page_flip_handler = _sprd_drm_flip_complete_event;
+ sprd_data->evctx.vblank_handler = _sprd_drm_vblank_event;
+
+ drmAddUserHandler(sprd_data->drm_fd, _sprd_drm_user_handler);
+
return TDM_ERROR_NONE;
-bad_l:
- tdm_sprd_display_destroy_event_list(sprd_data);
- return ret_err;
}
void
-tdm_sprd_display_destroy_event_list(tdm_sprd_data *sprd_data)
+tdm_sprd_display_deinit_event_handling(tdm_sprd_data *sprd_data)
{
- RETURN_VAL_IF_FAIL(sprd_data,);
+ RETURN_VOID_IF_FAIL(sprd_data);
+
+ drmRemoveUserHandler(sprd_data->drm_fd, _sprd_drm_user_handler);
}