Lines Matching +full:combined +full:- +full:power +full:- +full:req

1 // SPDX-License-Identifier: MIT
32 * that the flush/pageflip is done. This wastes CPU and power.
42 …* https://lore.kernel.org/dri-devel/CAKb7UvihLX0hgBOP3VBG7O+atwZcUVCPVuBdfmDMpg0NjXe-cQ@mail.gmail…
65 WARN_ON_ONCE(format->char_per_block[0] != 1); in gud_xrgb8888_to_r124()
68 rect->x1 = ALIGN_DOWN(rect->x1, block_width); in gud_xrgb8888_to_r124()
83 unsigned int pixshift = (block_width - pixpos - 1) * bits_per_pixel; in gud_xrgb8888_to_r124()
90 pix = (*pix8++) >> (8 - bits_per_pixel); in gud_xrgb8888_to_r124()
112 rect->x1 = ALIGN_DOWN(rect->x1, block_width); in gud_xrgb8888_to_color()
116 for (y = rect->y1; y < rect->y2; y++) { in gud_xrgb8888_to_color()
117 pix32 = src + (y * fb->pitches[0]); in gud_xrgb8888_to_color()
118 pix32 += rect->x1; in gud_xrgb8888_to_color()
122 unsigned int pixshift = (block_width - pixpos - 1) * bits_per_pixel; in gud_xrgb8888_to_color()
133 switch (format->format) { in gud_xrgb8888_to_color()
151 struct gud_set_buffer_req *req) in gud_prep_flush() argument
153 struct dma_buf_attachment *import_attach = fb->obj[0]->import_attach; in gud_prep_flush()
154 u8 compression = gdrm->compression; in gud_prep_flush()
163 if (len > gdrm->bulk_len) in gud_prep_flush()
164 return -E2BIG; in gud_prep_flush()
177 buf = gdrm->compress_buf; in gud_prep_flush()
179 buf = gdrm->bulk_buf; in gud_prep_flush()
182 * Imported buffers are assumed to be write-combined and thus uncached in gud_prep_flush()
185 if (format != fb->format) { in gud_prep_flush()
186 if (format->format == GUD_DRM_FORMAT_R1) { in gud_prep_flush()
189 ret = -ENOMEM; in gud_prep_flush()
192 } else if (format->format == DRM_FORMAT_RGB565) { in gud_prep_flush()
197 } else if (gud_is_big_endian() && format->cpp[0] > 1) { in gud_prep_flush()
199 } else if (compression && !import_attach && pitch == fb->pitches[0]) { in gud_prep_flush()
201 buf = vaddr + rect->y1 * pitch; in gud_prep_flush()
206 memset(req, 0, sizeof(*req)); in gud_prep_flush()
207 req->x = cpu_to_le32(rect->x1); in gud_prep_flush()
208 req->y = cpu_to_le32(rect->y1); in gud_prep_flush()
209 req->width = cpu_to_le32(drm_rect_width(rect)); in gud_prep_flush()
210 req->height = cpu_to_le32(drm_rect_height(rect)); in gud_prep_flush()
211 req->length = cpu_to_le32(len); in gud_prep_flush()
216 complen = LZ4_compress_default(buf, gdrm->bulk_buf, len, len, gdrm->lz4_comp_mem); in gud_prep_flush()
222 req->compression = GUD_COMPRESSION_LZ4; in gud_prep_flush()
223 req->compressed_length = cpu_to_le32(complen); in gud_prep_flush()
243 usb_sg_cancel(&ctx->sgr); in gud_usb_bulk_timeout()
251 ret = usb_sg_init(&ctx.sgr, gud_to_usb_device(gdrm), gdrm->bulk_pipe, 0, in gud_usb_bulk()
252 gdrm->bulk_sgt.sgl, gdrm->bulk_sgt.nents, len, GFP_KERNEL); in gud_usb_bulk()
262 ret = -ETIMEDOUT; in gud_usb_bulk()
266 ret = -EIO; in gud_usb_bulk()
276 struct gud_set_buffer_req req; in gud_flush_rect() local
280 drm_dbg(&gdrm->drm, "Flushing [FB:%d] " DRM_RECT_FMT "\n", fb->base.id, DRM_RECT_ARG(rect)); in gud_flush_rect()
282 ret = gud_prep_flush(gdrm, fb, format, rect, &req); in gud_flush_rect()
286 len = le32_to_cpu(req.length); in gud_flush_rect()
288 if (req.compression) in gud_flush_rect()
289 trlen = le32_to_cpu(req.compressed_length); in gud_flush_rect()
293 gdrm->stats_length += len; in gud_flush_rect()
295 if (gdrm->stats_length <= len && gdrm->stats_actual_length) { in gud_flush_rect()
296 gdrm->stats_length = len; in gud_flush_rect()
297 gdrm->stats_actual_length = 0; in gud_flush_rect()
299 gdrm->stats_actual_length += trlen; in gud_flush_rect()
301 if (!(gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE) || gdrm->prev_flush_failed) { in gud_flush_rect()
302 ret = gud_usb_set(gdrm, GUD_REQ_SET_BUFFER, 0, &req, sizeof(req)); in gud_flush_rect()
309 gdrm->stats_num_errors++; in gud_flush_rect()
316 gdrm->damage.x1 = INT_MAX; in gud_clear_damage()
317 gdrm->damage.y1 = INT_MAX; in gud_clear_damage()
318 gdrm->damage.x2 = 0; in gud_clear_damage()
319 gdrm->damage.y2 = 0; in gud_clear_damage()
324 gdrm->damage.x1 = min(gdrm->damage.x1, damage->x1); in gud_add_damage()
325 gdrm->damage.y1 = min(gdrm->damage.y1, damage->y1); in gud_add_damage()
326 gdrm->damage.x2 = max(gdrm->damage.x2, damage->x2); in gud_add_damage()
327 gdrm->damage.y2 = max(gdrm->damage.y2, damage->y2); in gud_add_damage()
339 mutex_lock(&gdrm->damage_lock); in gud_retry_failed_flush()
340 if (!gdrm->fb) { in gud_retry_failed_flush()
342 gdrm->fb = fb; in gud_retry_failed_flush()
345 mutex_unlock(&gdrm->damage_lock); in gud_retry_failed_flush()
348 if (!gdrm->prev_flush_failed) in gud_retry_failed_flush()
349 queue_work(system_long_wq, &gdrm->work); in gud_retry_failed_flush()
350 gdrm->prev_flush_failed = true; in gud_retry_failed_flush()
363 if (!drm_dev_enter(&gdrm->drm, &idx)) in gud_flush_work()
366 mutex_lock(&gdrm->damage_lock); in gud_flush_work()
367 fb = gdrm->fb; in gud_flush_work()
368 gdrm->fb = NULL; in gud_flush_work()
369 damage = gdrm->damage; in gud_flush_work()
371 mutex_unlock(&gdrm->damage_lock); in gud_flush_work()
376 format = fb->format; in gud_flush_work()
377 if (format->format == DRM_FORMAT_XRGB8888 && gdrm->xrgb8888_emulation_format) in gud_flush_work()
378 format = gdrm->xrgb8888_emulation_format; in gud_flush_work()
384 if (gdrm->bulk_len < lines * pitch) in gud_flush_work()
385 lines = gdrm->bulk_len / pitch; in gud_flush_work()
395 if (ret != -ENODEV && ret != -ECONNRESET && in gud_flush_work()
396 ret != -ESHUTDOWN && ret != -EPROTO) { in gud_flush_work()
397 bool prev_flush_failed = gdrm->prev_flush_failed; in gud_flush_work()
401 dev_err_ratelimited(fb->dev->dev, in gud_flush_work()
407 gdrm->prev_flush_failed = false; in gud_flush_work()
420 mutex_lock(&gdrm->damage_lock); in gud_fb_queue_damage()
422 if (fb != gdrm->fb) { in gud_fb_queue_damage()
423 old_fb = gdrm->fb; in gud_fb_queue_damage()
425 gdrm->fb = fb; in gud_fb_queue_damage()
430 mutex_unlock(&gdrm->damage_lock); in gud_fb_queue_damage()
432 queue_work(system_long_wq, &gdrm->work); in gud_fb_queue_damage()
442 struct gud_device *gdrm = to_gud_device(pipe->crtc.dev); in gud_pipe_check()
443 struct drm_plane_state *old_plane_state = pipe->plane.state; in gud_pipe_check()
444 const struct drm_display_mode *mode = &new_crtc_state->mode; in gud_pipe_check()
445 struct drm_atomic_state *state = new_plane_state->state; in gud_pipe_check()
446 struct drm_framebuffer *old_fb = old_plane_state->fb; in gud_pipe_check()
448 struct drm_framebuffer *fb = new_plane_state->fb; in gud_pipe_check()
449 const struct drm_format_info *format = fb->format; in gud_pipe_check()
452 struct gud_state_req *req; in gud_pipe_check() local
457 return -EINVAL; in gud_pipe_check()
459 if (old_plane_state->rotation != new_plane_state->rotation) in gud_pipe_check()
460 new_crtc_state->mode_changed = true; in gud_pipe_check()
462 if (old_fb && old_fb->format != format) in gud_pipe_check()
463 new_crtc_state->mode_changed = true; in gud_pipe_check()
465 if (!new_crtc_state->mode_changed && !new_crtc_state->connectors_changed) in gud_pipe_check()
469 if (hweight32(new_crtc_state->connector_mask) != 1) in gud_pipe_check()
470 return -EINVAL; in gud_pipe_check()
472 if (format->format == DRM_FORMAT_XRGB8888 && gdrm->xrgb8888_emulation_format) in gud_pipe_check()
473 format = gdrm->xrgb8888_emulation_format; in gud_pipe_check()
476 if (connector_state->crtc) in gud_pipe_check()
487 drm_connector_list_iter_begin(pipe->crtc.dev, &conn_iter); in gud_pipe_check()
489 if (connector->state->crtc) { in gud_pipe_check()
490 connector_state = connector->state; in gud_pipe_check()
498 return -ENOENT; in gud_pipe_check()
500 len = struct_size(req, properties, in gud_pipe_check()
502 req = kzalloc(len, GFP_KERNEL); in gud_pipe_check()
503 if (!req) in gud_pipe_check()
504 return -ENOMEM; in gud_pipe_check()
506 gud_from_display_mode(&req->mode, mode); in gud_pipe_check()
508 req->format = gud_from_fourcc(format->format); in gud_pipe_check()
509 if (WARN_ON_ONCE(!req->format)) { in gud_pipe_check()
510 ret = -EINVAL; in gud_pipe_check()
514 req->connector = drm_connector_index(connector_state->connector); in gud_pipe_check()
516 ret = gud_connector_fill_properties(connector_state, req->properties); in gud_pipe_check()
521 for (i = 0; i < gdrm->num_properties; i++) { in gud_pipe_check()
522 u16 prop = gdrm->properties[i]; in gud_pipe_check()
528 val = new_plane_state->rotation; in gud_pipe_check()
532 ret = -EINVAL; in gud_pipe_check()
536 req->properties[num_properties + i].prop = cpu_to_le16(prop); in gud_pipe_check()
537 req->properties[num_properties + i].val = cpu_to_le64(val); in gud_pipe_check()
541 if (drm_dev_enter(fb->dev, &idx)) { in gud_pipe_check()
542 len = struct_size(req, properties, num_properties); in gud_pipe_check()
543 ret = gud_usb_set(gdrm, GUD_REQ_SET_STATE_CHECK, 0, req, len); in gud_pipe_check()
546 ret = -ENODEV; in gud_pipe_check()
549 kfree(req); in gud_pipe_check()
557 struct drm_device *drm = pipe->crtc.dev; in gud_pipe_update()
559 struct drm_plane_state *state = pipe->plane.state; in gud_pipe_update()
560 struct drm_framebuffer *fb = state->fb; in gud_pipe_update()
561 struct drm_crtc *crtc = &pipe->crtc; in gud_pipe_update()
565 if (crtc->state->mode_changed || !crtc->state->enable) { in gud_pipe_update()
566 cancel_work_sync(&gdrm->work); in gud_pipe_update()
567 mutex_lock(&gdrm->damage_lock); in gud_pipe_update()
568 if (gdrm->fb) { in gud_pipe_update()
569 drm_framebuffer_put(gdrm->fb); in gud_pipe_update()
570 gdrm->fb = NULL; in gud_pipe_update()
573 mutex_unlock(&gdrm->damage_lock); in gud_pipe_update()
579 if (!old_state->fb) in gud_pipe_update()
582 if (fb && (crtc->state->mode_changed || crtc->state->connectors_changed)) in gud_pipe_update()
585 if (crtc->state->active_changed) in gud_pipe_update()
586 gud_usb_set_u8(gdrm, GUD_REQ_SET_DISPLAY_ENABLE, crtc->state->active); in gud_pipe_update()
589 if (gdrm->flags & GUD_DISPLAY_FLAG_FULL_UPDATE) in gud_pipe_update()
590 drm_rect_init(&damage, 0, 0, fb->width, fb->height); in gud_pipe_update()
593 flush_work(&gdrm->work); in gud_pipe_update()
596 if (!crtc->state->enable) in gud_pipe_update()