xref: /openbmc/u-boot/drivers/video/sandbox_sdl.c (revision 7d95f2a329c964b54cf505503a61e8fd4f12e2a3)
1*7d95f2a3SSimon Glass /*
2*7d95f2a3SSimon Glass  * Copyright (c) 2013 Google, Inc
3*7d95f2a3SSimon Glass  *
4*7d95f2a3SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
5*7d95f2a3SSimon Glass  */
6*7d95f2a3SSimon Glass 
7*7d95f2a3SSimon Glass #include <common.h>
8*7d95f2a3SSimon Glass #include <fdtdec.h>
9*7d95f2a3SSimon Glass #include <lcd.h>
10*7d95f2a3SSimon Glass #include <malloc.h>
11*7d95f2a3SSimon Glass #include <asm/sdl.h>
12*7d95f2a3SSimon Glass #include <asm/u-boot-sandbox.h>
13*7d95f2a3SSimon Glass 
14*7d95f2a3SSimon Glass DECLARE_GLOBAL_DATA_PTR;
15*7d95f2a3SSimon Glass 
16*7d95f2a3SSimon Glass enum {
17*7d95f2a3SSimon Glass 	/* Maximum LCD size we support */
18*7d95f2a3SSimon Glass 	LCD_MAX_WIDTH		= 1366,
19*7d95f2a3SSimon Glass 	LCD_MAX_HEIGHT		= 768,
20*7d95f2a3SSimon Glass 	LCD_MAX_LOG2_BPP	= 4,		/* 2^4 = 16 bpp */
21*7d95f2a3SSimon Glass };
22*7d95f2a3SSimon Glass 
23*7d95f2a3SSimon Glass vidinfo_t panel_info;
24*7d95f2a3SSimon Glass 
25*7d95f2a3SSimon Glass void lcd_setcolreg(ushort regno, ushort red, ushort green, ushort blue)
26*7d95f2a3SSimon Glass {
27*7d95f2a3SSimon Glass }
28*7d95f2a3SSimon Glass 
29*7d95f2a3SSimon Glass void lcd_ctrl_init(void *lcdbase)
30*7d95f2a3SSimon Glass {
31*7d95f2a3SSimon Glass 	/*
32*7d95f2a3SSimon Glass 	 * Allocate memory to keep BMP color conversion map. This is required
33*7d95f2a3SSimon Glass 	 * for 8 bit BMPs only (hence 256 colors). If malloc fails - keep
34*7d95f2a3SSimon Glass 	 * going, it is not even clear if displyaing the bitmap will be
35*7d95f2a3SSimon Glass 	 * required on the way up.
36*7d95f2a3SSimon Glass 	 */
37*7d95f2a3SSimon Glass 	panel_info.cmap = malloc(256 * NBITS(panel_info.vl_bpix) / 8);
38*7d95f2a3SSimon Glass }
39*7d95f2a3SSimon Glass 
40*7d95f2a3SSimon Glass void lcd_enable(void)
41*7d95f2a3SSimon Glass {
42*7d95f2a3SSimon Glass 	if (sandbox_sdl_init_display(panel_info.vl_col, panel_info.vl_row,
43*7d95f2a3SSimon Glass 				     panel_info.vl_bpix))
44*7d95f2a3SSimon Glass 		puts("LCD init failed\n");
45*7d95f2a3SSimon Glass }
46*7d95f2a3SSimon Glass 
47*7d95f2a3SSimon Glass int sandbox_lcd_sdl_early_init(void)
48*7d95f2a3SSimon Glass {
49*7d95f2a3SSimon Glass 	const void *blob = gd->fdt_blob;
50*7d95f2a3SSimon Glass 	int xres = LCD_MAX_WIDTH, yres = LCD_MAX_HEIGHT;
51*7d95f2a3SSimon Glass 	int node;
52*7d95f2a3SSimon Glass 	int ret = 0;
53*7d95f2a3SSimon Glass 
54*7d95f2a3SSimon Glass 	/*
55*7d95f2a3SSimon Glass 	 * The code in common/lcd.c does not cope with not being able to
56*7d95f2a3SSimon Glass 	 * set up a frame buffer. It will just happily keep writing to
57*7d95f2a3SSimon Glass 	 * invalid memory. So here we make sure that at least some buffer
58*7d95f2a3SSimon Glass 	 * is available even if it actually won't be displayed.
59*7d95f2a3SSimon Glass 	 */
60*7d95f2a3SSimon Glass 	node = fdtdec_next_compatible(blob, 0, COMPAT_SANDBOX_LCD_SDL);
61*7d95f2a3SSimon Glass 	if (node >= 0) {
62*7d95f2a3SSimon Glass 		xres = fdtdec_get_int(blob, node, "xres", LCD_MAX_WIDTH);
63*7d95f2a3SSimon Glass 		yres = fdtdec_get_int(blob, node, "yres", LCD_MAX_HEIGHT);
64*7d95f2a3SSimon Glass 		if (xres < 0 || xres > LCD_MAX_WIDTH) {
65*7d95f2a3SSimon Glass 			xres = LCD_MAX_WIDTH;
66*7d95f2a3SSimon Glass 			ret = -EINVAL;
67*7d95f2a3SSimon Glass 		}
68*7d95f2a3SSimon Glass 		if (yres < 0 || yres > LCD_MAX_HEIGHT) {
69*7d95f2a3SSimon Glass 			yres = LCD_MAX_HEIGHT;
70*7d95f2a3SSimon Glass 			ret = -EINVAL;
71*7d95f2a3SSimon Glass 		}
72*7d95f2a3SSimon Glass 	}
73*7d95f2a3SSimon Glass 
74*7d95f2a3SSimon Glass 	panel_info.vl_col = xres;
75*7d95f2a3SSimon Glass 	panel_info.vl_row = yres;
76*7d95f2a3SSimon Glass 	panel_info.vl_bpix = LCD_COLOR16;
77*7d95f2a3SSimon Glass 
78*7d95f2a3SSimon Glass 	return ret;
79*7d95f2a3SSimon Glass }
80