Lines Matching refs:gdrm

152 static int gud_usb_transfer(struct gud_device *gdrm, bool in, u8 request, u16 index,
155 struct usb_interface *intf = to_usb_interface(gdrm->drm.dev);
158 drm_dbg(&gdrm->drm, "%s: request=0x%x index=%u len=%zu\n",
161 if (!drm_dev_enter(&gdrm->drm, &idx))
164 mutex_lock(&gdrm->ctrl_lock);
167 if (ret == -EPIPE || ((gdrm->flags & GUD_DISPLAY_FLAG_STATUS_ON_SET) && !in && ret >= 0)) {
174 dev_err_once(gdrm->drm.dev,
181 drm_dbg(&gdrm->drm, "ret=%d\n", ret);
182 gdrm->stats_num_errors++;
185 mutex_unlock(&gdrm->ctrl_lock);
195 int gud_usb_get(struct gud_device *gdrm, u8 request, u16 index, void *buf, size_t max_len)
197 return gud_usb_transfer(gdrm, true, request, index, buf, max_len);
204 int gud_usb_set(struct gud_device *gdrm, u8 request, u16 index, void *buf, size_t len)
215 ret = gud_usb_transfer(gdrm, false, request, index, trbuf, len);
227 int gud_usb_get_u8(struct gud_device *gdrm, u8 request, u16 index, u8 *val)
236 ret = gud_usb_get(gdrm, request, index, buf, sizeof(*val));
246 int gud_usb_set_u8(struct gud_device *gdrm, u8 request, u8 val)
248 return gud_usb_set(gdrm, request, 0, &val, sizeof(val));
251 static int gud_get_properties(struct gud_device *gdrm)
261 ret = gud_usb_get(gdrm, GUD_REQ_GET_PROPERTIES, 0,
273 gdrm->properties = drmm_kcalloc(&gdrm->drm, num_properties, sizeof(*gdrm->properties),
275 if (!gdrm->properties) {
291 ret = drm_plane_create_rotation_property(&gdrm->pipe.plane,
296 drm_dbg(&gdrm->drm, "Ignoring unknown property: %u\n", prop);
303 gdrm->properties[gdrm->num_properties++] = prop;
318 struct gud_device *gdrm = to_gud_device(drm);
320 if (!gdrm->dmadev)
323 return drm_gem_prime_import_dev(drm, dma_buf, gdrm->dmadev);
329 struct gud_device *gdrm = to_gud_device(entry->dev);
332 string_get_size(gdrm->bulk_len, 1, STRING_UNITS_2, buf, sizeof(buf));
334 seq_printf(m, "Number of errors: %u\n", gdrm->stats_num_errors);
337 if (gdrm->compression & GUD_COMPRESSION_LZ4)
339 if (!gdrm->compression)
343 if (gdrm->compression) {
345 u64 ratio = div64_u64_rem(gdrm->stats_length, gdrm->stats_actual_length,
347 u64 ratio_frac = div64_u64(remainder * 10, gdrm->stats_actual_length);
387 static int gud_alloc_bulk_buffer(struct gud_device *gdrm)
394 gdrm->bulk_buf = vmalloc_32(gdrm->bulk_len);
395 if (!gdrm->bulk_buf)
398 num_pages = DIV_ROUND_UP(gdrm->bulk_len, PAGE_SIZE);
403 for (i = 0, ptr = gdrm->bulk_buf; i < num_pages; i++, ptr += PAGE_SIZE)
406 ret = sg_alloc_table_from_pages(&gdrm->bulk_sgt, pages, num_pages,
407 0, gdrm->bulk_len, GFP_KERNEL);
415 struct gud_device *gdrm = data;
417 vfree(gdrm->compress_buf);
418 gdrm->compress_buf = NULL;
419 sg_free_table(&gdrm->bulk_sgt);
420 vfree(gdrm->bulk_buf);
421 gdrm->bulk_buf = NULL;
422 mutex_destroy(&gdrm->ctrl_lock);
434 struct gud_device *gdrm;
455 gdrm = devm_drm_dev_alloc(dev, &gud_drm_driver, struct gud_device, drm);
456 if (IS_ERR(gdrm))
457 return PTR_ERR(gdrm);
459 drm = &gdrm->drm;
465 gdrm->flags = le32_to_cpu(desc.flags);
466 gdrm->compression = desc.compression & GUD_COMPRESSION_LZ4;
468 if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE && gdrm->compression)
471 mutex_init(&gdrm->ctrl_lock);
472 mutex_init(&gdrm->damage_lock);
473 INIT_WORK(&gdrm->work, gud_flush_work);
474 gud_clear_damage(gdrm);
476 ret = devm_add_action(dev, gud_free_buffers_and_mutex, gdrm);
491 ret = gud_usb_get(gdrm, GUD_REQ_GET_FORMATS, 0, formats_dev, GUD_FORMATS_MAX_NUM);
557 gdrm->xrgb8888_emulation_format = xrgb8888_emulation_format;
567 gdrm->bulk_pipe = usb_sndbulkpipe(interface_to_usbdev(intf), usb_endpoint_num(bulk_out));
568 gdrm->bulk_len = max_buffer_size;
570 ret = gud_alloc_bulk_buffer(gdrm);
574 if (gdrm->compression & GUD_COMPRESSION_LZ4) {
575 gdrm->lz4_comp_mem = devm_kmalloc(dev, LZ4_MEM_COMPRESS, GFP_KERNEL);
576 if (!gdrm->lz4_comp_mem)
579 gdrm->compress_buf = vmalloc(gdrm->bulk_len);
580 if (!gdrm->compress_buf)
584 ret = drm_simple_display_pipe_init(drm, &gdrm->pipe, &gud_pipe_funcs,
593 ret = gud_get_properties(gdrm);
599 drm_plane_enable_fb_damage_clips(&gdrm->pipe.plane);
601 ret = gud_get_connectors(gdrm);
609 usb_set_intfdata(intf, gdrm);
611 gdrm->dmadev = usb_intf_get_dma_device(intf);
612 if (!gdrm->dmadev)
619 put_device(gdrm->dmadev);
632 struct gud_device *gdrm = usb_get_intfdata(interface);
633 struct drm_device *drm = &gdrm->drm;
640 put_device(gdrm->dmadev);
641 gdrm->dmadev = NULL;
646 struct gud_device *gdrm = usb_get_intfdata(intf);
648 return drm_mode_config_helper_suspend(&gdrm->drm);
653 struct gud_device *gdrm = usb_get_intfdata(intf);
655 drm_mode_config_helper_resume(&gdrm->drm);