blob: 909f8e8091a028e3b493c2fb75e92721c44f03fe [file] [log] [blame]
Simon Glass6b1ba982014-12-29 19:32:28 -07001/*
Bin Mengb018a8c2015-07-06 16:31:26 +08002 * VESA frame buffer driver
Simon Glass6b1ba982014-12-29 19:32:28 -07003 *
4 * Copyright (C) 2014 Google, Inc
5 *
6 * SPDX-License-Identifier: GPL-2.0+
7 */
8
9#include <common.h>
10#include <pci_rom.h>
11#include <video_fb.h>
12#include <vbe.h>
13
14/*
15 * The Graphic Device
16 */
17GraphicDevice ctfb;
18
Simon Glass6b1ba982014-12-29 19:32:28 -070019void *video_hw_init(void)
20{
21 GraphicDevice *gdev = &ctfb;
22 int bits_per_pixel;
23 pci_dev_t dev;
24 int ret;
25
26 printf("Video: ");
27 if (vbe_get_video_info(gdev)) {
Bin Mengb018a8c2015-07-06 16:31:26 +080028 dev = pci_find_class(PCI_CLASS_DISPLAY_VGA << 8, 0);
Simon Glass6b1ba982014-12-29 19:32:28 -070029 if (dev == -1) {
30 printf("no card detected\n");
31 return NULL;
32 }
Simon Glassef565a52015-01-27 22:13:35 -070033 bootstage_start(BOOTSTAGE_ID_ACCUM_LCD, "vesa display");
Simon Glassbc17d8f2015-01-27 22:13:34 -070034 ret = pci_run_vga_bios(dev, NULL, PCI_ROM_USE_NATIVE |
35 PCI_ROM_ALLOW_FALLBACK);
Simon Glassef565a52015-01-27 22:13:35 -070036 bootstage_accum(BOOTSTAGE_ID_ACCUM_LCD);
Simon Glass6b1ba982014-12-29 19:32:28 -070037 if (ret) {
38 printf("failed to run video BIOS: %d\n", ret);
39 return NULL;
40 }
41 }
42
43 if (vbe_get_video_info(gdev)) {
44 printf("No video mode configured\n");
45 return NULL;
46 }
47
48 bits_per_pixel = gdev->gdfBytesPP * 8;
49 sprintf(gdev->modeIdent, "%dx%dx%d", gdev->winSizeX, gdev->winSizeY,
50 bits_per_pixel);
51 printf("%s\n", gdev->modeIdent);
Simon Glassbc17d8f2015-01-27 22:13:34 -070052 debug("Frame buffer at %x\n", gdev->pciBase);
Simon Glass6b1ba982014-12-29 19:32:28 -070053
54 return (void *)gdev;
55}