All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bin Meng <bmeng.cn@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 14/18] bootvx: x86: Make VxWorks EFI console driver happy
Date: Wed, 11 Apr 2018 22:02:19 -0700	[thread overview]
Message-ID: <1523509343-18123-15-git-send-email-bmeng.cn@gmail.com> (raw)
In-Reply-To: <1523509343-18123-1-git-send-email-bmeng.cn@gmail.com>

When booting from EFI BIOS, VxWorks bootloader stores the EFI GOP
framebuffer info at a pre-defined offset @ 0x6100. When VxWorks
kernel boots up, its EFI console driver tries to find such a block
and if the signature matches, the framebuffer information will be
used to initialize the driver.

However it is not necessary to prepare an EFI environment for
VxWorks's EFI console driver to function (eg: EFI loader in
U-Boot). If U-Boot has already initialized the graphics card and
set it to a VESA mode that is compatible with EFI GOP, we can
simply prepare such a block for VxWorks.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
---

Changes in v2: None

 cmd/elf.c         | 19 +++++++++++++++++++
 include/vxworks.h | 26 ++++++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/cmd/elf.c b/cmd/elf.c
index 8a0e7d9..cd98392 100644
--- a/cmd/elf.c
+++ b/cmd/elf.c
@@ -19,6 +19,7 @@
 #include <net.h>
 #include <vxworks.h>
 #ifdef CONFIG_X86
+#include <vbe.h>
 #include <asm/e820.h>
 #include <linux/linkage.h>
 #endif
@@ -253,6 +254,8 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	ulong base;
 	struct e820_info *info;
 	struct e820_entry *data;
+	struct efi_gop_info *gop;
+	struct vesa_mode_info *vesa = &mode_info.vesa;
 #endif
 
 	/*
@@ -396,6 +399,22 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 	 * available memory size for the kernel is insane.
 	 */
 	*(u32 *)(base + BOOT_IMAGE_SIZE_OFFSET) = 0;
+
+	/*
+	 * Prepare compatible framebuffer information block.
+	 * The VESA mode has to be 32-bit RGBA.
+	 */
+	if (vesa->x_resolution && vesa->y_resolution) {
+		gop = (struct efi_gop_info *)(base + EFI_GOP_INFO_OFFSET);
+		gop->magic = EFI_GOP_INFO_MAGIC;
+		gop->info.version = 0;
+		gop->info.width = vesa->x_resolution;
+		gop->info.height = vesa->y_resolution;
+		gop->info.pixel_format = EFI_GOT_RGBA8;
+		gop->info.pixels_per_scanline = vesa->bytes_per_scanline / 4;
+		gop->fb_base = vesa->phys_base_ptr;
+		gop->fb_size = vesa->bytes_per_scanline * vesa->y_resolution;
+	}
 #endif
 
 	/*
diff --git a/include/vxworks.h b/include/vxworks.h
index 4a83a34..b1b5096 100644
--- a/include/vxworks.h
+++ b/include/vxworks.h
@@ -8,6 +8,8 @@
 #ifndef _VXWORKS_H_
 #define _VXWORKS_H_
 
+#include <efi_api.h>
+
 /*
  * Physical address of memory base for VxWorks x86
  * This is LOCAL_MEM_LOCAL_ADRS in the VxWorks kernel configuration.
@@ -52,6 +54,30 @@ struct e820_info {
  */
 #define BOOT_IMAGE_SIZE_OFFSET	0x5004
 
+/*
+ * When booting from EFI BIOS, VxWorks bootloader stores the EFI GOP
+ * framebuffer info at a pre-defined offset @ 0x6100. When VxWorks kernel
+ * boots up, its EFI console driver tries to find such a block and if
+ * the signature matches, the framebuffer information will be used to
+ * initialize the driver.
+ *
+ * However it is not necessary to prepare an EFI environment for VxWorks's
+ * EFI console driver to function (eg: EFI loader in U-Boot). If U-Boot has
+ * already initialized the graphics card and set it to a VESA mode that is
+ * compatible with EFI GOP, we can simply prepare such a block for VxWorks.
+ */
+#define EFI_GOP_INFO_OFFSET	0x6100
+
+/* EFI GOP info signatiure */
+#define EFI_GOP_INFO_MAGIC	0xfeedface
+
+struct efi_gop_info {
+	u32 magic;			/* signature */
+	struct efi_gop_mode_info info;	/* EFI GOP mode info structure */
+	phys_addr_t fb_base;		/* framebuffer base address */
+	u32 fb_size;			/* framebuffer size */
+};
+
 int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 void boot_prep_vxworks(bootm_headers_t *images);
 void boot_jump_vxworks(bootm_headers_t *images);
-- 
2.7.4

  parent reply	other threads:[~2018-04-12  5:02 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-12  5:02 [U-Boot] [PATCH v2 00/18] bootvx: Various enhancements to booting VxWorks x86 kernels Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 01/18] doc: vxworks: Minor update for clarity Bin Meng
2018-04-16  9:15   ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 02/18] bootvx: x86: Prepare e820 related stuff from the given kernel memory base address Bin Meng
2018-04-12  7:25   ` Christian Gmeiner
2018-04-16  9:15     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 03/18] bootvx: x86: Explicitly clear the bootloader image size Bin Meng
2018-04-12 16:41   ` Simon Glass
2018-04-16  9:15     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 04/18] vxworks: x86: Rename e820info to e820_info Bin Meng
2018-04-12  7:26   ` Christian Gmeiner
2018-04-16  9:15     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 05/18] x86: Use 'unsigned int' in install_e820_map() functions Bin Meng
2018-04-12  7:27   ` Christian Gmeiner
2018-04-16  9:15     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 06/18] x86: Rename e820entry to e820_entry Bin Meng
2018-04-12  7:28   ` Christian Gmeiner
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 07/18] elf: Clean up the ELF header file Bin Meng
2018-04-12  7:29   ` Christian Gmeiner
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 08/18] elf: Add ELF64 related structure defines Bin Meng
2018-04-12 16:41   ` Simon Glass
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 09/18] elf: Add a very simple ELF64 loader Bin Meng
2018-04-12 16:42   ` Simon Glass
2018-04-13  3:30     ` Bin Meng
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 10/18] bios: vesa: Guard setting vesa mode with CONFIG_FRAMEBUFFER_SET_VESA_MODE Bin Meng
2018-04-12 16:42   ` Simon Glass
2018-04-13  3:30     ` Bin Meng
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 11/18] video: vesa: Change default FRAMEBUFFER_VESA_MODE Bin Meng
2018-04-12 16:42   ` Simon Glass
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 12/18] x86: Change default FRAMEBUFFER_VESA_MODE of some boards Bin Meng
2018-04-12 16:42   ` Simon Glass
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 13/18] pci: video: Only print out when everything is OK Bin Meng
2018-04-12 16:42   ` Simon Glass
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` Bin Meng [this message]
2018-04-12 16:42   ` [U-Boot] [PATCH v2 14/18] bootvx: x86: Make VxWorks EFI console driver happy Simon Glass
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 15/18] bootvx: Refactor the bootline copy codes a little bit Bin Meng
2018-04-12 16:42   ` Simon Glass
2018-04-16  9:16     ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 16/18] bootvx: Exit if bootline address is not specified Bin Meng
2018-04-16  9:17   ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 17/18] bootvx: x86: Assign bootaddr based on kernel memory base Bin Meng
2018-04-16  9:17   ` Bin Meng
2018-04-12  5:02 ` [U-Boot] [PATCH v2 18/18] doc: vxworks: Update x86 specific instructions Bin Meng
2018-04-16  9:17   ` Bin Meng

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1523509343-18123-15-git-send-email-bmeng.cn@gmail.com \
    --to=bmeng.cn@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.