Lines Matching refs:drm_dev
76 static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name);
77 static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name);
78 static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name);
81 static int drm_get_plane_props(drm_dev_t * drm_dev);
82 static int drm_get_crtc_props(drm_dev_t * drm_dev);
83 static int drm_get_conn_props(drm_dev_t * drm_dev);
84 static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value);
85 static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value);
86 static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value);
87 static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf);
88 static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_…
90 static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id);
92 static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned …
93 static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf);
94 static int drm_setup_buffers(drm_dev_t * drm_dev);
95 static void drm_flush_wait(lv_display_t * drm_dev);
119 drm_dev_t * drm_dev = lv_malloc_zeroed(sizeof(drm_dev_t)); in lv_linux_drm_create() local
120 LV_ASSERT_MALLOC(drm_dev); in lv_linux_drm_create()
121 if(drm_dev == NULL) return NULL; in lv_linux_drm_create()
125 lv_free(drm_dev); in lv_linux_drm_create()
128 drm_dev->fd = -1; in lv_linux_drm_create()
129 lv_display_set_driver_data(disp, drm_dev); in lv_linux_drm_create()
138 drm_dev_t * drm_dev = lv_display_get_driver_data(disp); in lv_linux_drm_set_file() local
141 ret = drm_setup(drm_dev, file, connector_id, DRM_FOURCC); in lv_linux_drm_set_file()
143 close(drm_dev->fd); in lv_linux_drm_set_file()
144 drm_dev->fd = -1; in lv_linux_drm_set_file()
148 ret = drm_setup_buffers(drm_dev); in lv_linux_drm_set_file()
151 close(drm_dev->fd); in lv_linux_drm_set_file()
152 drm_dev->fd = -1; in lv_linux_drm_set_file()
158 int32_t hor_res = drm_dev->width; in lv_linux_drm_set_file()
159 int32_t ver_res = drm_dev->height; in lv_linux_drm_set_file()
160 int32_t width = drm_dev->mmWidth; in lv_linux_drm_set_file()
162 size_t buf_size = LV_MIN(drm_dev->drm_bufs[1].size, drm_dev->drm_bufs[0].size); in lv_linux_drm_set_file()
167 lv_display_set_buffers(disp, drm_dev->drm_bufs[1].map, drm_dev->drm_bufs[0].map, buf_size, in lv_linux_drm_set_file()
182 static uint32_t get_plane_property_id(drm_dev_t * drm_dev, const char * name) in get_plane_property_id() argument
188 for(i = 0; i < drm_dev->count_plane_props; ++i) in get_plane_property_id()
189 if(!lv_strcmp(drm_dev->plane_props[i]->name, name)) in get_plane_property_id()
190 return drm_dev->plane_props[i]->prop_id; in get_plane_property_id()
197 static uint32_t get_crtc_property_id(drm_dev_t * drm_dev, const char * name) in get_crtc_property_id() argument
203 for(i = 0; i < drm_dev->count_crtc_props; ++i) in get_crtc_property_id()
204 if(!lv_strcmp(drm_dev->crtc_props[i]->name, name)) in get_crtc_property_id()
205 return drm_dev->crtc_props[i]->prop_id; in get_crtc_property_id()
212 static uint32_t get_conn_property_id(drm_dev_t * drm_dev, const char * name) in get_conn_property_id() argument
218 for(i = 0; i < drm_dev->count_conn_props; ++i) in get_conn_property_id()
219 if(!lv_strcmp(drm_dev->conn_props[i]->name, name)) in get_conn_property_id()
220 return drm_dev->conn_props[i]->prop_id; in get_conn_property_id()
235 drm_dev_t * drm_dev = user_data; in page_flip_handler() local
236 if(drm_dev->req) { in page_flip_handler()
237 drmModeAtomicFree(drm_dev->req); in page_flip_handler()
238 drm_dev->req = NULL; in page_flip_handler()
242 static int drm_get_plane_props(drm_dev_t * drm_dev) in drm_get_plane_props() argument
246 drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->plane_id, in drm_get_plane_props()
253 drm_dev->count_plane_props = props->count_props; in drm_get_plane_props()
255 drm_dev->plane_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); in drm_get_plane_props()
256 …LV_LOG_TRACE("Added plane prop %u:%s", drm_dev->plane_props[i]->prop_id, drm_dev->plane_props[i]->… in drm_get_plane_props()
263 static int drm_get_crtc_props(drm_dev_t * drm_dev) in drm_get_crtc_props() argument
267 drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->crtc_id, in drm_get_crtc_props()
274 drm_dev->count_crtc_props = props->count_props; in drm_get_crtc_props()
276 drm_dev->crtc_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); in drm_get_crtc_props()
277 …LV_LOG_TRACE("Added crtc prop %u:%s", drm_dev->crtc_props[i]->prop_id, drm_dev->crtc_props[i]->nam… in drm_get_crtc_props()
284 static int drm_get_conn_props(drm_dev_t * drm_dev) in drm_get_conn_props() argument
288 drmModeObjectPropertiesPtr props = drmModeObjectGetProperties(drm_dev->fd, drm_dev->conn_id, in drm_get_conn_props()
295 drm_dev->count_conn_props = props->count_props; in drm_get_conn_props()
297 drm_dev->conn_props[i] = drmModeGetProperty(drm_dev->fd, props->props[i]); in drm_get_conn_props()
298 …LV_LOG_TRACE("Added connector prop %u:%s", drm_dev->conn_props[i]->prop_id, drm_dev->conn_props[i]… in drm_get_conn_props()
305 static int drm_add_plane_property(drm_dev_t * drm_dev, const char * name, uint64_t value) in drm_add_plane_property() argument
308 uint32_t prop_id = get_plane_property_id(drm_dev, name); in drm_add_plane_property()
315 …ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->plane_id, get_plane_property_id(drm_dev, nam… in drm_add_plane_property()
324 static int drm_add_crtc_property(drm_dev_t * drm_dev, const char * name, uint64_t value) in drm_add_crtc_property() argument
327 uint32_t prop_id = get_crtc_property_id(drm_dev, name); in drm_add_crtc_property()
334 …ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->crtc_id, get_crtc_property_id(drm_dev, name)… in drm_add_crtc_property()
343 static int drm_add_conn_property(drm_dev_t * drm_dev, const char * name, uint64_t value) in drm_add_conn_property() argument
346 uint32_t prop_id = get_conn_property_id(drm_dev, name); in drm_add_conn_property()
353 …ret = drmModeAtomicAddProperty(drm_dev->req, drm_dev->conn_id, get_conn_property_id(drm_dev, name)… in drm_add_conn_property()
362 static int drm_dmabuf_set_plane(drm_dev_t * drm_dev, drm_buffer_t * buf) in drm_dmabuf_set_plane() argument
368 drm_dev->req = drmModeAtomicAlloc(); in drm_dmabuf_set_plane()
372 drm_add_conn_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); in drm_dmabuf_set_plane()
374 drm_add_crtc_property(drm_dev, "MODE_ID", drm_dev->blob_id); in drm_dmabuf_set_plane()
375 drm_add_crtc_property(drm_dev, "ACTIVE", 1); in drm_dmabuf_set_plane()
382 drm_add_plane_property(drm_dev, "FB_ID", buf->fb_handle); in drm_dmabuf_set_plane()
383 drm_add_plane_property(drm_dev, "CRTC_ID", drm_dev->crtc_id); in drm_dmabuf_set_plane()
384 drm_add_plane_property(drm_dev, "SRC_X", 0); in drm_dmabuf_set_plane()
385 drm_add_plane_property(drm_dev, "SRC_Y", 0); in drm_dmabuf_set_plane()
386 drm_add_plane_property(drm_dev, "SRC_W", drm_dev->width << 16); in drm_dmabuf_set_plane()
387 drm_add_plane_property(drm_dev, "SRC_H", drm_dev->height << 16); in drm_dmabuf_set_plane()
388 drm_add_plane_property(drm_dev, "CRTC_X", 0); in drm_dmabuf_set_plane()
389 drm_add_plane_property(drm_dev, "CRTC_Y", 0); in drm_dmabuf_set_plane()
390 drm_add_plane_property(drm_dev, "CRTC_W", drm_dev->width); in drm_dmabuf_set_plane()
391 drm_add_plane_property(drm_dev, "CRTC_H", drm_dev->height); in drm_dmabuf_set_plane()
393 ret = drmModeAtomicCommit(drm_dev->fd, drm_dev->req, flags, drm_dev); in drm_dmabuf_set_plane()
396 drmModeAtomicFree(drm_dev->req); in drm_dmabuf_set_plane()
403 static int find_plane(drm_dev_t * drm_dev, unsigned int fourcc, uint32_t * plane_id, uint32_t crtc_… in find_plane() argument
414 planes = drmModeGetPlaneResources(drm_dev->fd); in find_plane()
423 plane = drmModeGetPlane(drm_dev->fd, planes->planes[i]); in find_plane()
460 static int drm_find_connector(drm_dev_t * drm_dev, int64_t connector_id) in drm_find_connector() argument
467 if((res = drmModeGetResources(drm_dev->fd)) == NULL) { in drm_find_connector()
479 conn = drmModeGetConnector(drm_dev->fd, res->connectors[i]); in drm_find_connector()
513 drm_dev->conn_id = conn->connector_id; in drm_find_connector()
514 LV_LOG_TRACE("conn_id: %d", drm_dev->conn_id); in drm_find_connector()
515 drm_dev->mmWidth = conn->mmWidth; in drm_find_connector()
516 drm_dev->mmHeight = conn->mmHeight; in drm_find_connector()
518 lv_memcpy(&drm_dev->mode, &conn->modes[0], sizeof(drmModeModeInfo)); in drm_find_connector()
520 if(drmModeCreatePropertyBlob(drm_dev->fd, &drm_dev->mode, sizeof(drm_dev->mode), in drm_find_connector()
521 &drm_dev->blob_id)) { in drm_find_connector()
526 drm_dev->width = conn->modes[0].hdisplay; in drm_find_connector()
527 drm_dev->height = conn->modes[0].vdisplay; in drm_find_connector()
530 enc = drmModeGetEncoder(drm_dev->fd, res->encoders[i]); in drm_find_connector()
544 drm_dev->enc_id = enc->encoder_id; in drm_find_connector()
545 LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); in drm_find_connector()
546 drm_dev->crtc_id = enc->crtc_id; in drm_find_connector()
547 LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); in drm_find_connector()
555 enc = drmModeGetEncoder(drm_dev->fd, conn->encoders[i]); in drm_find_connector()
572 drm_dev->enc_id = enc->encoder_id; in drm_find_connector()
573 LV_LOG_TRACE("enc_id: %d", drm_dev->enc_id); in drm_find_connector()
574 drm_dev->crtc_id = crtc_id; in drm_find_connector()
575 LV_LOG_TRACE("crtc_id: %d", drm_dev->crtc_id); in drm_find_connector()
591 drm_dev->crtc_idx = UINT32_MAX; in drm_find_connector()
594 if(drm_dev->crtc_id == res->crtcs[i]) { in drm_find_connector()
595 drm_dev->crtc_idx = i; in drm_find_connector()
600 if(drm_dev->crtc_idx == UINT32_MAX) { in drm_find_connector()
605 LV_LOG_TRACE("crtc_idx: %d", drm_dev->crtc_idx); in drm_find_connector()
648 static int drm_setup(drm_dev_t * drm_dev, const char * device_path, int64_t connector_id, unsigned … in drm_setup() argument
652 drm_dev->fd = drm_open(device_path); in drm_setup()
653 if(drm_dev->fd < 0) in drm_setup()
656 ret = drmSetClientCap(drm_dev->fd, DRM_CLIENT_CAP_ATOMIC, 1); in drm_setup()
662 ret = drm_find_connector(drm_dev, connector_id); in drm_setup()
668 ret = find_plane(drm_dev, fourcc, &drm_dev->plane_id, drm_dev->crtc_id, drm_dev->crtc_idx); in drm_setup()
674 drm_dev->plane = drmModeGetPlane(drm_dev->fd, drm_dev->plane_id); in drm_setup()
675 if(!drm_dev->plane) { in drm_setup()
680 drm_dev->crtc = drmModeGetCrtc(drm_dev->fd, drm_dev->crtc_id); in drm_setup()
681 if(!drm_dev->crtc) { in drm_setup()
686 drm_dev->conn = drmModeGetConnector(drm_dev->fd, drm_dev->conn_id); in drm_setup()
687 if(!drm_dev->conn) { in drm_setup()
692 ret = drm_get_plane_props(drm_dev); in drm_setup()
698 ret = drm_get_crtc_props(drm_dev); in drm_setup()
704 ret = drm_get_conn_props(drm_dev); in drm_setup()
710 drm_dev->drm_event_ctx.version = DRM_EVENT_CONTEXT_VERSION; in drm_setup()
711 drm_dev->drm_event_ctx.page_flip_handler = page_flip_handler; in drm_setup()
712 drm_dev->fourcc = fourcc; in drm_setup()
715 drm_dev->plane_id, drm_dev->conn_id, drm_dev->crtc_id); in drm_setup()
718 drm_dev->width, drm_dev->height, drm_dev->mmWidth, drm_dev->mmHeight, in drm_setup()
724 close(drm_dev->fd); in drm_setup()
728 static int drm_allocate_dumb(drm_dev_t * drm_dev, drm_buffer_t * buf) in drm_allocate_dumb() argument
737 creq.width = drm_dev->width; in drm_allocate_dumb()
738 creq.height = drm_dev->height; in drm_allocate_dumb()
740 ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq); in drm_allocate_dumb()
753 ret = drmIoctl(drm_dev->fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq); in drm_allocate_dumb()
763 buf->map = mmap(0, creq.size, PROT_READ | PROT_WRITE, MAP_SHARED, drm_dev->fd, mreq.offset); in drm_allocate_dumb()
776 ret = drmModeAddFB2(drm_dev->fd, drm_dev->width, drm_dev->height, drm_dev->fourcc, in drm_allocate_dumb()
786 static int drm_setup_buffers(drm_dev_t * drm_dev) in drm_setup_buffers() argument
791 ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[0]); in drm_setup_buffers()
795 ret = drm_allocate_dumb(drm_dev, &drm_dev->drm_bufs[1]); in drm_setup_buffers()
804 drm_dev_t * drm_dev = lv_display_get_driver_data(disp); in drm_flush_wait() local
807 pfd.fd = drm_dev->fd; in drm_flush_wait()
810 while(drm_dev->req) { in drm_flush_wait()
817 drmHandleEvent(drm_dev->fd, &drm_dev->drm_event_ctx); in drm_flush_wait()
831 drm_dev_t * drm_dev = lv_display_get_driver_data(disp); in drm_flush() local
834 if(drm_dev->drm_bufs[idx].map == px_map) { in drm_flush()
836 if(drm_dmabuf_set_plane(drm_dev, &drm_dev->drm_bufs[idx])) { in drm_flush()