Lines Matching +full:row +full:- +full:stride
1 // SPDX-License-Identifier: GPL-2.0
5 * (c) 2006 Edgar Hucek <gimli@dark-green.com>
6 * Original efi driver written by Gerd Knorr <[email protected]-berlin.de>
13 #include <linux/efi-bgrt.h>
57 .height = -1,
58 .width = -1,
84 if (regno >= info->cmap.len) in efifb_setcolreg()
88 red >>= 16 - info->var.red.length; in efifb_setcolreg()
89 green >>= 16 - info->var.green.length; in efifb_setcolreg()
90 blue >>= 16 - info->var.blue.length; in efifb_setcolreg()
91 ((u32 *)(info->pseudo_palette))[regno] = in efifb_setcolreg()
92 (red << info->var.red.offset) | in efifb_setcolreg()
93 (green << info->var.green.offset) | in efifb_setcolreg()
94 (blue << info->var.blue.offset); in efifb_setcolreg()
111 while (width--) { in efifb_copy_bmp()
115 *dst++ = (r << si->red_pos) | in efifb_copy_bmp()
116 (g << si->green_pos) | in efifb_copy_bmp()
117 (b << si->blue_pos); in efifb_copy_bmp()
135 u32 expected_xoffset = (si->lfb_width - bmp_width) / 2; in efifb_bgrt_sanity_check()
152 u8 *dst = info->screen_base; in efifb_show_boot_graphics()
173 if (si->lfb_depth != 32) { in efifb_show_boot_graphics()
189 if (file_header->id != 0x4d42 || file_header->reserved != 0) in efifb_show_boot_graphics()
193 if (dib_header->dib_header_size != 40 || dib_header->width < 0 || in efifb_show_boot_graphics()
194 dib_header->planes != 1 || dib_header->bpp != 24 || in efifb_show_boot_graphics()
195 dib_header->compression != 0) in efifb_show_boot_graphics()
198 bmp_width = dib_header->width; in efifb_show_boot_graphics()
199 bmp_height = abs(dib_header->height); in efifb_show_boot_graphics()
202 if ((file_header->bitmap_offset + bmp_pitch * bmp_height) > in efifb_show_boot_graphics()
206 if ((bgrt_tab.image_offset_x + bmp_width) > si->lfb_width || in efifb_show_boot_graphics()
207 (bgrt_tab.image_offset_y + bmp_height) > si->lfb_height) in efifb_show_boot_graphics()
215 for (y = 0; y < si->lfb_height; y++, dst += si->lfb_linelength) { in efifb_show_boot_graphics()
219 memset(dst, 0, 4 * si->lfb_width); in efifb_show_boot_graphics()
223 src_y = y - bgrt_tab.image_offset_y; in efifb_show_boot_graphics()
224 /* Positive header height means upside down row order */ in efifb_show_boot_graphics()
225 if (dib_header->height > 0) in efifb_show_boot_graphics()
226 src_y = (bmp_height - 1) - src_y; in efifb_show_boot_graphics()
230 efifb_copy_bmp(bgrt_image + file_header->bitmap_offset + in efifb_show_boot_graphics()
234 memset((u32 *)dst + dst_x, 0, (si->lfb_width - dst_x) * 4); in efifb_show_boot_graphics()
255 struct efifb_par *par = info->par; in efifb_destroy()
257 if (info->screen_base) { in efifb_destroy()
259 iounmap(info->screen_base); in efifb_destroy()
261 memunmap(info->screen_base); in efifb_destroy()
265 release_mem_region(par->base, par->size); in efifb_destroy()
266 fb_dealloc_cmap(&info->cmap); in efifb_destroy()
289 si->lfb_base = simple_strtoul(this_opt+5, NULL, 0); in efifb_setup()
290 else if (!strncmp(this_opt, "stride:", 7)) in efifb_setup()
291 si->lfb_linelength = simple_strtoul(this_opt+7, NULL, 0) * 4; in efifb_setup()
293 si->lfb_height = simple_strtoul(this_opt+7, NULL, 0); in efifb_setup()
295 si->lfb_width = simple_strtoul(this_opt+6, NULL, 0); in efifb_setup()
306 if (si->lfb_base) in fb_base_is_valid()
309 if (!(si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)) in fb_base_is_valid()
312 if (si->ext_lfb_base) in fb_base_is_valid()
325 return -ENODEV; \
326 return sprintf(buf, fmt "\n", (si->lfb_##name)); \
363 si = dev_get_platdata(&dev->dev); in efifb_probe()
365 return -ENODEV; in efifb_probe()
366 si = devm_kmemdup(&dev->dev, si, sizeof(*si), GFP_KERNEL); in efifb_probe()
368 return -ENOMEM; in efifb_probe()
370 dev_set_drvdata(&dev->dev, si); in efifb_probe()
372 if (si->orig_video_isVGA != VIDEO_TYPE_EFI) in efifb_probe()
373 return -ENODEV; in efifb_probe()
376 return -ENODEV; in efifb_probe()
383 if (!si->lfb_linelength) in efifb_probe()
384 return -ENODEV; in efifb_probe()
386 if (!si->lfb_depth) in efifb_probe()
387 si->lfb_depth = 32; in efifb_probe()
388 if (!si->pages) in efifb_probe()
389 si->pages = 1; in efifb_probe()
392 return -ENODEV; in efifb_probe()
397 if (!si->blue_size) { in efifb_probe()
398 si->blue_size = 8; in efifb_probe()
399 si->blue_pos = 0; in efifb_probe()
400 si->green_size = 8; in efifb_probe()
401 si->green_pos = 8; in efifb_probe()
402 si->red_size = 8; in efifb_probe()
403 si->red_pos = 16; in efifb_probe()
404 si->rsvd_size = 8; in efifb_probe()
405 si->rsvd_pos = 24; in efifb_probe()
410 efifb_defined.bits_per_pixel = si->lfb_depth; in efifb_probe()
411 efifb_defined.xres = si->lfb_width; in efifb_probe()
412 efifb_defined.yres = si->lfb_height; in efifb_probe()
413 efifb_fix.line_length = si->lfb_linelength; in efifb_probe()
415 /* size_vmode -- that is the amount of memory needed for the in efifb_probe()
420 /* size_total -- all video memory we have. Used for in efifb_probe()
423 size_total = si->lfb_size; in efifb_probe()
427 /* size_remap -- the amount of video memory we are going to in efifb_probe()
435 size_remap += PAGE_SIZE - (size_remap % PAGE_SIZE); in efifb_probe()
447 info = framebuffer_alloc(sizeof(*par), &dev->dev); in efifb_probe()
449 err = -ENOMEM; in efifb_probe()
452 par = info->par; in efifb_probe()
453 info->pseudo_palette = par->pseudo_palette; in efifb_probe()
455 par->base = efifb_fix.smem_start; in efifb_probe()
456 par->size = size_remap; in efifb_probe()
464 err = -EIO; in efifb_probe()
479 info->screen_base = ioremap_wc(efifb_fix.smem_start, in efifb_probe()
482 info->screen_base = ioremap(efifb_fix.smem_start, in efifb_probe()
485 info->screen_base = memremap(efifb_fix.smem_start, in efifb_probe()
488 info->screen_base = memremap(efifb_fix.smem_start, in efifb_probe()
490 if (!info->screen_base) { in efifb_probe()
493 err = -EIO; in efifb_probe()
504 si->pages); in efifb_probe()
518 efifb_defined.red.offset = si->red_pos; in efifb_probe()
519 efifb_defined.red.length = si->red_size; in efifb_probe()
520 efifb_defined.green.offset = si->green_pos; in efifb_probe()
521 efifb_defined.green.length = si->green_size; in efifb_probe()
522 efifb_defined.blue.offset = si->blue_pos; in efifb_probe()
523 efifb_defined.blue.length = si->blue_size; in efifb_probe()
524 efifb_defined.transp.offset = si->rsvd_pos; in efifb_probe()
525 efifb_defined.transp.length = si->rsvd_size; in efifb_probe()
530 si->rsvd_size, in efifb_probe()
531 si->red_size, in efifb_probe()
532 si->green_size, in efifb_probe()
533 si->blue_size, in efifb_probe()
534 si->rsvd_pos, in efifb_probe()
535 si->red_pos, in efifb_probe()
536 si->green_pos, in efifb_probe()
537 si->blue_pos); in efifb_probe()
542 info->fbops = &efifb_ops; in efifb_probe()
543 info->var = efifb_defined; in efifb_probe()
544 info->fix = efifb_fix; in efifb_probe()
550 info->fbcon_rotate_hint = FB_ROTATE_UR; in efifb_probe()
553 info->fbcon_rotate_hint = FB_ROTATE_UD; in efifb_probe()
556 info->fbcon_rotate_hint = FB_ROTATE_CCW; in efifb_probe()
559 info->fbcon_rotate_hint = FB_ROTATE_CW; in efifb_probe()
563 err = fb_alloc_cmap(&info->cmap, 256, 0); in efifb_probe()
569 err = devm_aperture_acquire_for_platform_device(dev, par->base, par->size); in efifb_probe()
574 err = devm_register_framebuffer(&dev->dev, info); in efifb_probe()
579 fb_info(info, "%s frame buffer device\n", info->fix.id); in efifb_probe()
583 fb_dealloc_cmap(&info->cmap); in efifb_probe()
586 iounmap(info->screen_base); in efifb_probe()
588 memunmap(info->screen_base); in efifb_probe()
599 .name = "efi-framebuffer",