Lines Matching +full:y +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0 or MIT
13 #include <linux/iosys-map.h>
67 * It's intended for end-user, so have minimal technical/debug information.
84 #define PANIC_LINE(s) {.len = sizeof(s) - 1, .txt = s}
97 PANIC_LINE(" .--. _"),
117 if (!logo || logo->type != LINUX_LOGO_MONO) in drm_panic_setup_logo()
121 logo_data = kmemdup(logo->data, in drm_panic_setup_logo()
122 size_mul(DIV_ROUND_UP(logo->width, BITS_PER_BYTE), logo->height), in drm_panic_setup_logo()
125 return -ENOMEM; in drm_panic_setup_logo()
130 return -ENOMEM; in drm_panic_setup_logo()
133 logo_dup->data = logo_data; in drm_panic_setup_logo()
151 unsigned int y, x; in drm_panic_blit_pixel() local
153 for (y = 0; y < drm_rect_height(clip); y++) in drm_panic_blit_pixel()
155 if (drm_draw_is_pixel_fg(sbuf8, spitch, x / scale, y / scale)) in drm_panic_blit_pixel()
156 sb->set_pixel(sb, clip->x1 + x, clip->y1 + y, fg_color); in drm_panic_blit_pixel()
159 static void drm_panic_write_pixel16(void *vaddr, unsigned int offset, u16 color) in drm_panic_write_pixel16() argument
161 u16 *p = vaddr + offset; in drm_panic_write_pixel16()
166 static void drm_panic_write_pixel24(void *vaddr, unsigned int offset, u32 color) in drm_panic_write_pixel24() argument
168 u8 *p = vaddr + offset; in drm_panic_write_pixel24()
181 unsigned int offset, u32 color) in drm_panic_write_pixel24_xpage() argument
184 u8 *p = vaddr + offset; in drm_panic_write_pixel24_xpage()
191 if (offset == PAGE_SIZE - 1) in drm_panic_write_pixel24_xpage()
197 if (offset == PAGE_SIZE - 2) in drm_panic_write_pixel24_xpage()
204 static void drm_panic_write_pixel32(void *vaddr, unsigned int offset, u32 color) in drm_panic_write_pixel32() argument
206 u32 *p = vaddr + offset; in drm_panic_write_pixel32()
211 static void drm_panic_write_pixel(void *vaddr, unsigned int offset, u32 color, unsigned int cpp) in drm_panic_write_pixel() argument
215 drm_panic_write_pixel16(vaddr, offset, color); in drm_panic_write_pixel()
218 drm_panic_write_pixel24(vaddr, offset, color); in drm_panic_write_pixel()
221 drm_panic_write_pixel32(vaddr, offset, color); in drm_panic_write_pixel()
238 unsigned int y, x; in drm_panic_blit_page() local
244 for (y = 0; y < height; y++) { in drm_panic_blit_page()
246 if (drm_draw_is_pixel_fg(sbuf8, spitch, x / scale, y / scale)) { in drm_panic_blit_page()
248 unsigned int offset; in drm_panic_blit_page() local
250 offset = (y + clip->y1) * dpitch + (x + clip->x1) * cpp; in drm_panic_blit_page()
251 new_page = offset >> PAGE_SHIFT; in drm_panic_blit_page()
252 offset = offset % PAGE_SIZE; in drm_panic_blit_page()
265 if (cpp == 3 && offset + 3 > PAGE_SIZE) in drm_panic_blit_page()
267 offset, fg32); in drm_panic_blit_page()
269 drm_panic_write_pixel(vaddr, offset, fg32, cpp); in drm_panic_blit_page()
278 * drm_panic_blit - convert a monochrome image to a linear framebuffer
297 if (sb->set_pixel) in drm_panic_blit()
300 if (sb->pages) in drm_panic_blit()
301 return drm_panic_blit_page(sb->pages, sb->pitch[0], sb->format->cpp[0], in drm_panic_blit()
304 map = sb->map[0]; in drm_panic_blit()
305 iosys_map_incr(&map, clip->y1 * sb->pitch[0] + clip->x1 * sb->format->cpp[0]); in drm_panic_blit()
307 switch (sb->format->cpp[0]) { in drm_panic_blit()
309 drm_draw_blit16(&map, sb->pitch[0], sbuf8, spitch, in drm_panic_blit()
313 drm_draw_blit24(&map, sb->pitch[0], sbuf8, spitch, in drm_panic_blit()
317 drm_draw_blit32(&map, sb->pitch[0], sbuf8, spitch, in drm_panic_blit()
321 WARN_ONCE(1, "Can't blit with pixel width %d\n", sb->format->cpp[0]); in drm_panic_blit()
329 unsigned int y, x; in drm_panic_fill_pixel() local
331 for (y = 0; y < drm_rect_height(clip); y++) in drm_panic_fill_pixel()
333 sb->set_pixel(sb, clip->x1 + x, clip->y1 + y, color); in drm_panic_fill_pixel()
340 unsigned int y, x; in drm_panic_fill_page() local
344 for (y = clip->y1; y < clip->y2; y++) { in drm_panic_fill_page()
345 for (x = clip->x1; x < clip->x2; x++) { in drm_panic_fill_page()
347 unsigned int offset; in drm_panic_fill_page() local
349 offset = y * dpitch + x * cpp; in drm_panic_fill_page()
350 new_page = offset >> PAGE_SHIFT; in drm_panic_fill_page()
351 offset = offset % PAGE_SIZE; in drm_panic_fill_page()
362 if (cpp == 3 && offset + 3 > PAGE_SIZE) in drm_panic_fill_page()
364 offset, color); in drm_panic_fill_page()
366 drm_panic_write_pixel(vaddr, offset, color, cpp); in drm_panic_fill_page()
374 * drm_panic_fill - Fill a rectangle with a color
386 if (sb->set_pixel) in drm_panic_fill()
389 if (sb->pages) in drm_panic_fill()
390 return drm_panic_fill_page(sb->pages, sb->pitch[0], sb->format->cpp[0], in drm_panic_fill()
393 map = sb->map[0]; in drm_panic_fill()
394 iosys_map_incr(&map, clip->y1 * sb->pitch[0] + clip->x1 * sb->format->cpp[0]); in drm_panic_fill()
396 switch (sb->format->cpp[0]) { in drm_panic_fill()
398 drm_draw_fill16(&map, sb->pitch[0], drm_rect_height(clip), in drm_panic_fill()
402 drm_draw_fill24(&map, sb->pitch[0], drm_rect_height(clip), in drm_panic_fill()
406 drm_draw_fill32(&map, sb->pitch[0], drm_rect_height(clip), in drm_panic_fill()
410 WARN_ONCE(1, "Can't fill with pixel width %d\n", sb->format->cpp[0]); in drm_panic_fill()
437 size_t font_pitch = DIV_ROUND_UP(font->width, 8); in draw_txt_rectangle()
440 msg_lines = min(msg_lines, drm_rect_height(clip) / font->height); in draw_txt_rectangle()
442 size_t line_len = min(msg[i].len, drm_rect_width(clip) / font->width); in draw_txt_rectangle()
444 rec.y1 = clip->y1 + i * font->height; in draw_txt_rectangle()
445 rec.y2 = rec.y1 + font->height; in draw_txt_rectangle()
446 rec.x1 = clip->x1; in draw_txt_rectangle()
449 rec.x1 += (drm_rect_width(clip) - (line_len * font->width)) / 2; in draw_txt_rectangle()
453 rec.x2 = rec.x1 + font->width; in draw_txt_rectangle()
455 rec.x1 += font->width; in draw_txt_rectangle()
463 drm_rect_init(rect, 0, 0, logo_mono->width, logo_mono->height); in drm_panic_logo_rect()
465 int logo_width = get_max_line_len(logo_ascii, logo_ascii_lines) * font->width; in drm_panic_logo_rect()
467 drm_rect_init(rect, 0, 0, logo_width, logo_ascii_lines * font->height); in drm_panic_logo_rect()
474 if (rect->x2 > sb->width || rect->y2 > sb->height) in drm_panic_logo_draw()
478 drm_panic_blit(sb, rect, logo_mono->data, in drm_panic_logo_draw()
488 sb->format->format); in draw_panic_static_user()
490 sb->format->format); in draw_panic_static_user()
491 const struct font_desc *font = get_default_font(sb->width, sb->height, NULL, NULL); in draw_panic_static_user()
498 r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height); in draw_panic_static_user()
501 msg_width = min(get_max_line_len(panic_msg, panic_msg_lines) * font->width, sb->width); in draw_panic_static_user()
502 msg_height = min(panic_msg_lines * font->height, sb->height); in draw_panic_static_user()
506 drm_rect_translate(&r_msg, (sb->width - r_msg.x2) / 2, (sb->height - r_msg.y2) / 2); in draw_panic_static_user()
519 * Return the y-offset of the next line.
524 int chars_per_row = sb->width / font->width; in draw_line_with_wrap()
525 struct drm_rect r_txt = DRM_RECT_INIT(0, yoffset, sb->width, font->height); in draw_line_with_wrap()
528 if (line->len > chars_per_row) { in draw_line_with_wrap()
529 line_wrap.len = line->len % chars_per_row; in draw_line_with_wrap()
530 line_wrap.txt = line->txt + line->len - line_wrap.len; in draw_line_with_wrap()
532 r_txt.y1 -= font->height; in draw_line_with_wrap()
535 while (line_wrap.txt > line->txt) { in draw_line_with_wrap()
536 line_wrap.txt -= chars_per_row; in draw_line_with_wrap()
539 r_txt.y1 -= font->height; in draw_line_with_wrap()
545 r_txt.y1 -= font->height; in draw_line_with_wrap()
557 sb->format->format); in draw_panic_static_kmsg()
559 sb->format->format); in draw_panic_static_kmsg()
560 const struct font_desc *font = get_default_font(sb->width, sb->height, NULL, NULL); in draw_panic_static_kmsg()
561 struct drm_rect r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height); in draw_panic_static_kmsg()
568 if (!font || font->width > sb->width) in draw_panic_static_kmsg()
571 yoffset = sb->height - font->height - (sb->height % font->height) / 2; in draw_panic_static_kmsg()
582 start = kmsg_buf + kmsg_len - 2; in draw_panic_static_kmsg()
583 end = kmsg_buf + kmsg_len - 1; in draw_panic_static_kmsg()
586 start--; in draw_panic_static_kmsg()
589 line.len = end - line.txt; in draw_panic_static_kmsg()
593 start--; in draw_panic_static_kmsg()
601 * pre-allocated. Only 2 buffers and the zlib workspace are needed.
604 * 2) kmsg is zlib-compressed into buffer2
605 * 3) compressed kmsg is encoded as QR-code Numeric stream in buffer1
606 * 4) QR-code image is generated in buffer2
611 * a V40 QR-code (177x177).
617 * 3) QR-code image is generated in buffer1
666 utsname()->machine, utsname()->release); in drm_panic_get_qr_code_url()
676 return -ENODATA; in drm_panic_get_qr_code_url()
682 return -EINVAL; in drm_panic_get_qr_code_url()
692 return -EINVAL; in drm_panic_get_qr_code_url()
695 return -EINVAL; in drm_panic_get_qr_code_url()
701 return -EINVAL; in drm_panic_get_qr_code_url()
724 return -ENODATA; in drm_panic_get_qr_code_raw()
745 sb->format->format); in _draw_panic_static_qr_code()
747 sb->format->format); in _draw_panic_static_qr_code()
748 const struct font_desc *font = get_default_font(sb->width, sb->height, NULL, NULL); in _draw_panic_static_qr_code()
756 return -ENOMEM; in _draw_panic_static_qr_code()
758 r_screen = DRM_RECT_INIT(0, 0, sb->width, sb->height); in _draw_panic_static_qr_code()
762 msg_width = min(get_max_line_len(panic_msg, panic_msg_lines) * font->width, sb->width); in _draw_panic_static_qr_code()
763 msg_height = min(panic_msg_lines * font->height, sb->height); in _draw_panic_static_qr_code()
766 max_qr_size = min(3 * sb->width / 4, 3 * sb->height / 4); in _draw_panic_static_qr_code()
770 return -ENOSPC; in _draw_panic_static_qr_code()
776 return -ENOSPC; in _draw_panic_static_qr_code()
781 v_margin = sb->height - drm_rect_height(&r_qr_canvas) - drm_rect_height(&r_msg); in _draw_panic_static_qr_code()
783 return -ENOSPC; in _draw_panic_static_qr_code()
786 drm_rect_translate(&r_qr_canvas, (sb->width - r_qr_canvas.x2) / 2, 2 * v_margin); in _draw_panic_static_qr_code()
791 drm_rect_translate(&r_msg, (sb->width - r_msg.x2) / 2, in _draw_panic_static_qr_code()
834 if (format->num_planes != 1) in drm_panic_is_format_supported()
836 return drm_draw_color_from_xrgb8888(0xffffff, format->format) != 0; in drm_panic_is_format_supported()
855 struct drm_panic_line *desc_line = &panic_msg[panic_msg_lines - 1]; in drm_panic_set_description()
857 desc_line->txt = description; in drm_panic_set_description()
860 if (len && description[len - 1] == '\n') in drm_panic_set_description()
861 len -= 1; in drm_panic_set_description()
862 desc_line->len = len; in drm_panic_set_description()
868 struct drm_panic_line *desc_line = &panic_msg[panic_msg_lines - 1]; in drm_panic_clear_description()
870 desc_line->len = 0; in drm_panic_clear_description()
871 desc_line->txt = NULL; in drm_panic_clear_description()
880 if (!drm_panic_trylock(plane->dev, flags)) in draw_panic_plane()
883 ret = plane->helper_private->get_scanout_buffer(plane, &sb); in draw_panic_plane()
895 if (plane->helper_private->panic_flush) in draw_panic_plane()
896 plane->helper_private->panic_flush(plane); in draw_panic_plane()
901 drm_panic_unlock(plane->dev, flags); in draw_panic_plane()
913 if (detail->reason == KMSG_DUMP_PANIC) in drm_panic()
914 draw_panic_plane(plane, detail->description); in drm_panic()
932 struct drm_plane *plane = file->private_data; in debugfs_trigger_write()
950 debugfs_create_file(fname, 0200, plane->dev->debugfs_root, in debugfs_register_plane()
967 if (!dev->mode_config.num_total_plane) in drm_panic_is_enabled()
971 if (plane->helper_private && plane->helper_private->get_scanout_buffer) in drm_panic_is_enabled()
978 * drm_panic_register() - Initialize DRM panic for a device
986 if (!dev->mode_config.num_total_plane) in drm_panic_register()
990 if (!plane->helper_private || !plane->helper_private->get_scanout_buffer) in drm_panic_register()
992 plane->kmsg_panic.dump = drm_panic; in drm_panic_register()
993 plane->kmsg_panic.max_reason = KMSG_DUMP_PANIC; in drm_panic_register()
994 if (kmsg_dump_register(&plane->kmsg_panic)) in drm_panic_register()
1013 if (!dev->mode_config.num_total_plane) in drm_panic_unregister()
1017 if (!plane->helper_private || !plane->helper_private->get_scanout_buffer) in drm_panic_unregister()
1019 kmsg_dump_unregister(&plane->kmsg_panic); in drm_panic_unregister()
1024 * drm_panic_init() - initialize DRM panic.
1032 * drm_panic_exit() - Free the resources taken by drm_panic_exit()