|
@@ -246,7 +246,7 @@ int do_bootelf(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
{
|
|
|
unsigned long addr; /* Address of image */
|
|
|
- unsigned long bootaddr; /* Address to put the bootline */
|
|
|
+ unsigned long bootaddr = 0; /* Address to put the bootline */
|
|
|
char *bootline; /* Text of the bootline */
|
|
|
char *tmp; /* Temporary char pointer */
|
|
|
char build_buf[128]; /* Buffer for building the bootline */
|
|
@@ -295,6 +295,45 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
puts("## Ethernet MAC address not copied to NV RAM\n");
|
|
|
#endif
|
|
|
|
|
|
+#ifdef CONFIG_X86
|
|
|
+ /*
|
|
|
+ * Get VxWorks's physical memory base address from environment,
|
|
|
+ * if we don't specify it in the environment, use a default one.
|
|
|
+ */
|
|
|
+ base = env_get_hex("vx_phys_mem_base", VXWORKS_PHYS_MEM_BASE);
|
|
|
+ data = (struct e820_entry *)(base + E820_DATA_OFFSET);
|
|
|
+ info = (struct e820_info *)(base + E820_INFO_OFFSET);
|
|
|
+
|
|
|
+ memset(info, 0, sizeof(struct e820_info));
|
|
|
+ info->sign = E820_SIGNATURE;
|
|
|
+ info->entries = install_e820_map(E820MAX, data);
|
|
|
+ info->addr = (info->entries - 1) * sizeof(struct e820_entry) +
|
|
|
+ E820_DATA_OFFSET;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Explicitly clear the bootloader image size otherwise if memory
|
|
|
+ * at this offset happens to contain some garbage data, the final
|
|
|
+ * 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
|
|
|
+
|
|
|
/*
|
|
|
* Use bootaddr to find the location in memory that VxWorks
|
|
|
* will look for the bootline string. The default value is
|
|
@@ -303,11 +342,16 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
*/
|
|
|
tmp = env_get("bootaddr");
|
|
|
if (!tmp) {
|
|
|
+#ifdef CONFIG_X86
|
|
|
+ bootaddr = base + X86_BOOT_LINE_OFFSET;
|
|
|
+#else
|
|
|
printf("## VxWorks bootline address not specified\n");
|
|
|
return 1;
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
- bootaddr = simple_strtoul(tmp, NULL, 16);
|
|
|
+ if (!bootaddr)
|
|
|
+ bootaddr = simple_strtoul(tmp, NULL, 16);
|
|
|
|
|
|
/*
|
|
|
* Check to see if the bootline is defined in the 'bootargs' parameter.
|
|
@@ -371,45 +415,6 @@ int do_bootvx(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
|
|
flush_cache(bootaddr, max(strlen(bootline), (size_t)255));
|
|
|
printf("## Using bootline (@ 0x%lx): %s\n", bootaddr, (char *)bootaddr);
|
|
|
|
|
|
-#ifdef CONFIG_X86
|
|
|
- /*
|
|
|
- * Get VxWorks's physical memory base address from environment,
|
|
|
- * if we don't specify it in the environment, use a default one.
|
|
|
- */
|
|
|
- base = env_get_hex("vx_phys_mem_base", VXWORKS_PHYS_MEM_BASE);
|
|
|
- data = (struct e820_entry *)(base + E820_DATA_OFFSET);
|
|
|
- info = (struct e820_info *)(base + E820_INFO_OFFSET);
|
|
|
-
|
|
|
- memset(info, 0, sizeof(struct e820_info));
|
|
|
- info->sign = E820_SIGNATURE;
|
|
|
- info->entries = install_e820_map(E820MAX, data);
|
|
|
- info->addr = (info->entries - 1) * sizeof(struct e820_entry) +
|
|
|
- E820_DATA_OFFSET;
|
|
|
-
|
|
|
- /*
|
|
|
- * Explicitly clear the bootloader image size otherwise if memory
|
|
|
- * at this offset happens to contain some garbage data, the final
|
|
|
- * 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
|
|
|
-
|
|
|
/*
|
|
|
* If the data at the load address is an elf image, then
|
|
|
* treat it like an elf image. Otherwise, assume that it is a
|