Hung-Te Lin has submitted this change. ( https://review.coreboot.org/c/coreboot/+/39004 )
Change subject: drivers: Replace set_vbe_mode_info_valid ......................................................................
drivers: Replace set_vbe_mode_info_valid
Currently it's not possible to add multiple graphics driver into one coreboot image. This patch series will fix this issue by providing a single API that multiple graphics driver can use.
This is required for platforms that have two graphic cards, but different graphic drivers, like Intel+Aspeed on server platforms or Intel+Nvidia on consumer notebooks.
The goal is to remove duplicated fill_fb_framebuffer(), the advertisment of multiple indepent framebuffers in coreboot tables, and better runtime/build time graphic configuration options.
Replace set_vbe_mode_info_valid with fb_add_framebuffer_info or fb_new_framebuffer_info_from_edid.
Change-Id: I95d1d62385a201c68c6c2527c023ad2292a235c5 Signed-off-by: Patrick Rudolph patrick.rudolph@9elements.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/39004 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Hung-Te Lin hungte@chromium.org --- M src/drivers/aspeed/common/ast_mode_corebootfb.c M src/drivers/emulation/qemu/bochs.c M src/drivers/emulation/qemu/cirrus.c M src/include/edid.h M src/include/framebuffer_info.h M src/lib/edid_fill_fb.c M src/mainboard/emulation/qemu-armv7/mainboard.c M src/mainboard/google/asurada/mainboard.c M src/mainboard/google/daisy/mainboard.c M src/mainboard/google/kukui/mainboard.c M src/mainboard/google/oak/mainboard.c M src/mainboard/google/peach_pit/mainboard.c M src/mainboard/google/trogdor/mainboard.c M src/northbridge/intel/i945/gma.c M src/soc/nvidia/tegra124/display.c M src/soc/nvidia/tegra210/dc.c M src/soc/rockchip/rk3288/display.c M src/soc/rockchip/rk3399/display.c 18 files changed, 45 insertions(+), 81 deletions(-)
Approvals: build bot (Jenkins): Verified Hung-Te Lin: Looks good to me, approved
diff --git a/src/drivers/aspeed/common/ast_mode_corebootfb.c b/src/drivers/aspeed/common/ast_mode_corebootfb.c index bb30d20..b25d742 100644 --- a/src/drivers/aspeed/common/ast_mode_corebootfb.c +++ b/src/drivers/aspeed/common/ast_mode_corebootfb.c @@ -6,6 +6,7 @@ #include <console/console.h> #include <edid.h> #include <device/pci_def.h> +#include <framebuffer_info.h>
#include "ast_drv.h"
@@ -200,7 +201,7 @@ return ret; }
- /* Updated edid for set_vbe_mode_info_valid */ + /* Updated edid for fb_fill_framebuffer_info */ edid.x_resolution = edid.mode.ha; edid.y_resolution = edid.mode.va; edid.framebuffer_bits_per_pixel = format.cpp[0] * 8; @@ -227,7 +228,7 @@ ast_hide_cursor(&crtc);
/* Advertise new mode */ - set_vbe_mode_info_valid(&edid, fb.mmio_addr); + fb_new_framebuffer_info_from_edid(&edid, fb.mmio_addr);
/* Clear display */ memset((void *)(uintptr_t)fb.mmio_addr, 0, edid.bytes_per_line * edid.y_resolution); diff --git a/src/drivers/emulation/qemu/bochs.c b/src/drivers/emulation/qemu/bochs.c index 5a6603e..73fa19e 100644 --- a/src/drivers/emulation/qemu/bochs.c +++ b/src/drivers/emulation/qemu/bochs.c @@ -1,7 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */
#include <stdint.h> -#include <edid.h> #include <arch/io.h> #include <console/console.h> #include <device/device.h> @@ -10,6 +9,7 @@ #include <device/pci_ids.h> #include <pc80/vga.h> #include <pc80/vga_io.h> +#include <framebuffer_info.h>
/* VGA init. We use the Bochs VESA VBE extensions */ #define VBE_DISPI_IOPORT_INDEX 0x01CE @@ -82,7 +82,6 @@
static void bochs_init_linear_fb(struct device *dev) { - struct edid edid; struct resource *res_fb, *res_io; int id, mem, bar;
@@ -139,13 +138,8 @@
bochs_vga_write(res_io, 0, 0x20); /* disable blanking */
- /* setup coreboot framebuffer */ - edid.mode.ha = width; - edid.mode.va = height; - edid.panel_bits_per_color = 8; - edid.panel_bits_per_pixel = 24; - edid_set_framebuffer_bits_per_pixel(&edid, 32, 0); - set_vbe_mode_info_valid(&edid, res_fb->base); + /* Advertise new mode */ + fb_add_framebuffer_info(res_fb->base, width, height, 4 * width, 32); }
static void bochs_init_text_mode(struct device *dev) diff --git a/src/drivers/emulation/qemu/cirrus.c b/src/drivers/emulation/qemu/cirrus.c index d63f490..d9e0e1b 100644 --- a/src/drivers/emulation/qemu/cirrus.c +++ b/src/drivers/emulation/qemu/cirrus.c @@ -1,13 +1,13 @@ /* SPDX-License-Identifier: GPL-2.0-or-later */
#include <stdint.h> -#include <edid.h> #include <console/console.h> #include <device/device.h> #include <device/pci.h> #include <device/pci_ops.h> #include <pc80/vga.h> #include <pc80/vga_io.h> +#include <framebuffer_info.h>
static int width = CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_XRES; static int height = CONFIG_DRIVERS_EMULATION_QEMU_BOCHS_YRES; @@ -299,13 +299,7 @@ vga_sr_write (CIRRUS_SR_EXTENDED_MODE, sr_ext); write_hidden_dac (hidden_dac);
- struct edid edid; - edid.mode.ha = width; - edid.mode.va = height; - edid.panel_bits_per_color = 8; - edid.panel_bits_per_pixel = 24; - edid_set_framebuffer_bits_per_pixel(&edid, 32, 0); - set_vbe_mode_info_valid(&edid, addr); + fb_add_framebuffer_info(addr, width, height, 4 * width, 32); }
static void cirrus_init_text_mode(struct device *dev) diff --git a/src/include/edid.h b/src/include/edid.h index 3644e6a..691cf76 100644 --- a/src/include/edid.h +++ b/src/include/edid.h @@ -96,8 +96,6 @@ int decode_edid(unsigned char *edid, int size, struct edid *out); void edid_set_framebuffer_bits_per_pixel(struct edid *edid, int fb_bpp, int row_byte_alignment); -struct fb_info *set_vbe_mode_info_valid(const struct edid *edid, uintptr_t fb_addr); -void set_vbe_framebuffer_orientation(enum lb_fb_orientation orientation); int set_display_mode(struct edid *edid, enum edid_modes mode);
#endif /* EDID_H */ diff --git a/src/include/framebuffer_info.h b/src/include/framebuffer_info.h index 5251f29..07ddd31 100644 --- a/src/include/framebuffer_info.h +++ b/src/include/framebuffer_info.h @@ -19,4 +19,8 @@ void fb_set_orientation(struct fb_info *info, enum lb_fb_orientation orientation);
+struct edid; +struct fb_info *fb_new_framebuffer_info_from_edid(const struct edid *edid, + uintptr_t fb_addr); + #endif /* __FRAMEBUFFER_INFO_H_ */ diff --git a/src/lib/edid_fill_fb.c b/src/lib/edid_fill_fb.c index 1e8cc5a..712cd0f 100644 --- a/src/lib/edid_fill_fb.c +++ b/src/lib/edid_fill_fb.c @@ -153,7 +153,8 @@ /* * Take an edid, and create a framebuffer. */ -struct fb_info *set_vbe_mode_info_valid(const struct edid *edid, uintptr_t fb_addr) +struct fb_info *fb_new_framebuffer_info_from_edid(const struct edid *edid, + uintptr_t fb_addr) { return fb_add_framebuffer_info(fb_addr, edid->x_resolution, edid->y_resolution, edid->bytes_per_line, edid->framebuffer_bits_per_pixel); diff --git a/src/mainboard/emulation/qemu-armv7/mainboard.c b/src/mainboard/emulation/qemu-armv7/mainboard.c index 977725d..c3d974c 100644 --- a/src/mainboard/emulation/qemu-armv7/mainboard.c +++ b/src/mainboard/emulation/qemu-armv7/mainboard.c @@ -4,15 +4,14 @@ #include <device/device.h> #include <cbmem.h> #include <halt.h> -#include <edid.h> #include <device/mmio.h> #include <ramdetect.h> #include <symbols.h> +#include <framebuffer_info.h>
static void init_gfx(void) { uint32_t *pl111; - struct edid edid; /* width is at most 4096 */ /* height is at most 1024 */ int width = 800, height = 600; @@ -28,12 +27,7 @@ write32(pl111 + 10, 0xff); write32(pl111 + 6, (5 << 1) | 0x801);
- edid.framebuffer_bits_per_pixel = 32; - edid.bytes_per_line = width * 4; - edid.x_resolution = width; - edid.y_resolution = height; - - set_vbe_mode_info_valid(&edid, framebuffer); + fb_add_framebuffer_info(framebuffer, width, height, 4 * width, 32); }
static void mainboard_enable(struct device *dev) diff --git a/src/mainboard/google/asurada/mainboard.c b/src/mainboard/google/asurada/mainboard.c index 8e7f2e8..f836724 100644 --- a/src/mainboard/google/asurada/mainboard.c +++ b/src/mainboard/google/asurada/mainboard.c @@ -8,6 +8,7 @@ #include <device/mmio.h> #include <drivers/analogix/anx7625/anx7625.h> #include <edid.h> +#include <framebuffer_info.h> #include <gpio.h> #include <soc/ddp.h> #include <soc/dpm.h> @@ -124,7 +125,7 @@ return false; } mtk_ddp_mode_set(&edid); - set_vbe_mode_info_valid(&edid, 0); + fb_new_framebuffer_info_from_edid(&edid, (uintptr_t)0); return true; }
diff --git a/src/mainboard/google/daisy/mainboard.c b/src/mainboard/google/daisy/mainboard.c index 2f07937..1df786d 100644 --- a/src/mainboard/google/daisy/mainboard.c +++ b/src/mainboard/google/daisy/mainboard.c @@ -7,7 +7,6 @@ #include <device/device.h> #include <device/i2c_simple.h> #include <drivers/ti/tps65090/tps65090.h> -#include <edid.h> #include <soc/clk.h> #include <soc/dp.h> #include <soc/dp-core.h> @@ -18,6 +17,7 @@ #include <soc/tmu.h> #include <soc/usb.h> #include <symbols.h> +#include <framebuffer_info.h>
#include "exynos5250.h"
@@ -28,15 +28,6 @@ #define DRAM_SIZE CONFIG_DRAM_SIZE_MB #define DRAM_END (DRAM_START + DRAM_SIZE) /* plus one... */
-static struct edid edid = { - .mode.ha = 1366, - .mode.va = 768, - .framebuffer_bits_per_pixel = 16, - .x_resolution = 1366, - .y_resolution = 768, - .bytes_per_line = 2 * 1366 -}; - /* TODO: transplanted DP stuff, clean up once we have something that works */ static enum exynos5_gpio_pin dp_pd_l = GPIO_Y25; /* active low */ static enum exynos5_gpio_pin dp_rst_l = GPIO_X15; /* active low */ @@ -263,7 +254,7 @@
sdmmc_vdd();
- set_vbe_mode_info_valid(&edid, (uintptr_t)fb_addr); + fb_add_framebuffer_info((uintptr_t)fb_addr, 1366, 768, 2 * 1366, 16);
lcd_vdd();
diff --git a/src/mainboard/google/kukui/mainboard.c b/src/mainboard/google/kukui/mainboard.c index 216b6f4..a197a7f 100644 --- a/src/mainboard/google/kukui/mainboard.c +++ b/src/mainboard/google/kukui/mainboard.c @@ -169,7 +169,7 @@ return false; } mtk_ddp_mode_set(edid); - struct fb_info *info = set_vbe_mode_info_valid(edid, 0); + struct fb_info *info = fb_new_framebuffer_info_from_edid(edid, 0); if (info) fb_set_orientation(info, panel->s->orientation);
diff --git a/src/mainboard/google/oak/mainboard.c b/src/mainboard/google/oak/mainboard.c index e89bc6b..cd17ede 100644 --- a/src/mainboard/google/oak/mainboard.c +++ b/src/mainboard/google/oak/mainboard.c @@ -18,6 +18,7 @@ #include <soc/pll.h> #include <soc/usb.h> #include <vendorcode/google/chromeos/chromeos.h> +#include <framebuffer_info.h>
enum { CODEC_I2C_BUS = 0, @@ -224,7 +225,7 @@ }
mtk_ddp_mode_set(&edid); - set_vbe_mode_info_valid(&edid, (uintptr_t)0); + fb_new_framebuffer_info_from_edid(&edid, (uintptr_t)0); }
static void mainboard_init(struct device *dev) diff --git a/src/mainboard/google/peach_pit/mainboard.c b/src/mainboard/google/peach_pit/mainboard.c index 85c0407..ab3c0f5 100644 --- a/src/mainboard/google/peach_pit/mainboard.c +++ b/src/mainboard/google/peach_pit/mainboard.c @@ -9,7 +9,6 @@ #include <device/i2c_simple.h> #include <drivers/parade/ps8625/ps8625.h> #include <ec/google/chromeec/ec.h> -#include <edid.h> #include <soc/tmu.h> #include <soc/clk.h> #include <soc/cpu.h> @@ -23,20 +22,12 @@ #include <string.h> #include <symbols.h> #include <vbe.h> +#include <framebuffer_info.h>
/* convenient shorthand (in MB) */ #define DRAM_START ((uintptr_t)_dram/MiB) #define DRAM_SIZE CONFIG_DRAM_SIZE_MB
-static struct edid edid = { - .mode.ha = 1366, - .mode.va = 768, - .framebuffer_bits_per_pixel = 16, - .x_resolution = 1366, - .y_resolution = 768, - .bytes_per_line = 2 * 1366 -}; - /* from the fdt */ static struct vidinfo vidinfo = { .vl_freq = 60, @@ -402,7 +393,7 @@
sdmmc_vdd();
- set_vbe_mode_info_valid(&edid, (uintptr_t)fb_addr); + fb_add_framebuffer_info((uintptr_t)fb_addr, 1366, 768, 2 * 1366, 16);
/* * The reset value for FIMD SYSMMU register MMU_CTRL:0x14640000 diff --git a/src/mainboard/google/trogdor/mainboard.c b/src/mainboard/google/trogdor/mainboard.c index 54d8b0d..0f469e0 100644 --- a/src/mainboard/google/trogdor/mainboard.c +++ b/src/mainboard/google/trogdor/mainboard.c @@ -6,6 +6,7 @@ #include <device/device.h> #include <device/i2c_simple.h> #include <drivers/ti/sn65dsi86bridge/sn65dsi86bridge.h> +#include <framebuffer_info.h> #include <soc/display/mipi_dsi.h> #include <soc/display/mdssreg.h> #include <soc/qupv3_config.h> @@ -105,7 +106,7 @@ /* Configure backlight */ gpio_output(GPIO_BACKLIGHT_ENABLE, 1); display_init(&ed); - set_vbe_mode_info_valid(&ed, (uintptr_t)0); + fb_new_framebuffer_info_from_edid(&ed, (uintptr_t)0); } else printk(BIOS_INFO, "Skipping display init.\n"); } diff --git a/src/northbridge/intel/i945/gma.c b/src/northbridge/intel/i945/gma.c index 118d02c..b396eff 100644 --- a/src/northbridge/intel/i945/gma.c +++ b/src/northbridge/intel/i945/gma.c @@ -19,6 +19,7 @@ #include <pc80/vga_io.h> #include <commonlib/helpers.h> #include <types.h> +#include <framebuffer_info.h>
#include "i945.h" #include "chip.h" @@ -358,7 +359,7 @@ (void *)pgfx, hactive * vactive * 4); memset((void *)pgfx, 0x00, hactive * vactive * 4);
- set_vbe_mode_info_valid(&edid, pgfx); + fb_new_framebuffer_info_from_edid(&edid, pgfx); } else { vga_misc_write(0x67);
diff --git a/src/soc/nvidia/tegra124/display.c b/src/soc/nvidia/tegra124/display.c index 485e032..5935d0d 100644 --- a/src/soc/nvidia/tegra124/display.c +++ b/src/soc/nvidia/tegra124/display.c @@ -14,6 +14,7 @@ #include <soc/nvidia/tegra/pwm.h> #include <stdint.h> #include <string.h> +#include <framebuffer_info.h>
#include "chip.h"
@@ -312,10 +313,9 @@
/* tell depthcharge ... */ - struct edid edid; - edid.mode.va = config->yres; - edid.mode.ha = config->xres; - edid_set_framebuffer_bits_per_pixel(&edid, - config->framebuffer_bits_per_pixel, 32); - set_vbe_mode_info_valid(&edid, (uintptr_t)(framebuffer_base_mb*MiB)); + const uint32_t bytes_per_line = ALIGN_UP(config->xres * + DIV_ROUND_UP(config->framebuffer_bits_per_pixel, 8), 32); + + fb_add_framebuffer_info(framebuffer_base_mb*MiB, config->xres, config->yres, + bytes_per_line, config->framebuffer_bits_per_pixel); } diff --git a/src/soc/nvidia/tegra210/dc.c b/src/soc/nvidia/tegra210/dc.c index 8625f76..0c54f7a 100644 --- a/src/soc/nvidia/tegra210/dc.c +++ b/src/soc/nvidia/tegra210/dc.c @@ -3,10 +3,10 @@ #include <console/console.h> #include <device/mmio.h> #include <stdint.h> -#include <edid.h> #include <device/device.h> #include <soc/nvidia/tegra/dc.h> #include <soc/display.h> +#include <framebuffer_info.h>
#include "chip.h"
@@ -212,19 +212,9 @@ void pass_mode_info_to_payload( struct soc_nvidia_tegra210_config *config) { - struct edid edid; - - edid.mode.va = config->display_yres; - edid.mode.ha = config->display_xres; - edid_set_framebuffer_bits_per_pixel(&edid, - config->framebuffer_bits_per_pixel, 64); - - printk(BIOS_INFO, "%s: bytes_per_line: %d, bits_per_pixel: %d\n " - " x_res x y_res: %d x %d, size: %d\n", - __func__, edid.bytes_per_line, - edid.framebuffer_bits_per_pixel, - edid.x_resolution, edid.y_resolution, - (edid.bytes_per_line * edid.y_resolution)); - - set_vbe_mode_info_valid(&edid, 0); + const uint32_t bytes_per_line = ALIGN_UP(config->display_xres * + DIV_ROUND_UP(config->framebuffer_bits_per_pixel, 8), 64); + /* The framebuffer address is zero to let the payload allocate it */ + fb_add_framebuffer_info(0, config->display_xres, config->display_yres, + bytes_per_line, config->framebuffer_bits_per_pixel); } diff --git a/src/soc/rockchip/rk3288/display.c b/src/soc/rockchip/rk3288/display.c index fd86b95..19a75de 100644 --- a/src/soc/rockchip/rk3288/display.c +++ b/src/soc/rockchip/rk3288/display.c @@ -17,6 +17,7 @@ #include <soc/grf.h> #include <soc/soc.h> #include <soc/vop.h> +#include <framebuffer_info.h>
#include "chip.h"
@@ -124,5 +125,5 @@ break; }
- set_vbe_mode_info_valid(&edid, (uintptr_t)lcdbase); + fb_new_framebuffer_info_from_edid(&edid, (uintptr_t)lcdbase); } diff --git a/src/soc/rockchip/rk3399/display.c b/src/soc/rockchip/rk3399/display.c index 70e8c7c..1d263ef 100644 --- a/src/soc/rockchip/rk3399/display.c +++ b/src/soc/rockchip/rk3399/display.c @@ -18,6 +18,7 @@ #include <soc/mipi.h> #include <soc/soc.h> #include <soc/vop.h> +#include <framebuffer_info.h>
#include "chip.h"
@@ -160,7 +161,7 @@ break; } mainboard_power_on_backlight(); - set_vbe_mode_info_valid(&edid, (uintptr_t)0); + fb_new_framebuffer_info_from_edid(&edid, (uintptr_t)0);
return; }