blob: 0f4849aa82b1a5780dfcada7b2559d36a3e70dbd [file] [log] [blame]
#include "menu.h"
#include "bios_menu.h"
#include "creation.h"
/*
* These hooks are for usage with popup menus. Assumes that user_data is the name of
* the variable to save to / load from.
*
* entries is the array of entries that may fit. This function returns -1 if none
* of the entries fits, indicating that the default should be considered.
*/
int cvar_popup_load(void *user_data, popup_entry_t *entries)
{
char
*var = GETENV((char *)user_data);
int
i=0;
while (var && entries->value_text)
{
if (entries->value_text != (char *)(~0) && (strcmp(var, entries->value_text) == 0))
{
return i;
}
i++;
entries++;
}
return -1;
}
void cvar_popup_save(void *user_data, popup_entry_t *entry)
{
SETENV((char *)user_data, entry->value_text);
}
int cvar_numeric_load(void *user_data, int param2, int def_val)
{
char *var = GETENV((char *)user_data);
if (var) return atoi(var);
else return def_val;
}
static void cvar_numeric_save(void *user_data, int param2, int value)
{
char buffer[30];
sprintf(buffer, "%d", value);
SETENV((char *)user_data, buffer);
}
#define TABLE_END {NULL, NULL, NULL}
#define LABEL(x) menu_item_create(ITEMTYPE_LABEL, menu, #x)
#define SPACER menu_item_create(ITEMTYPE_LABEL, menu, " ")
#define MAIN_MENU_NAME "U-BOOT Preferences Menu"
#ifdef CONFIG_SAM460EX
#define PCIE_SATA_NAME "PCI-E 1x / SATA-2"
#endif
#define BOOTSEQ_NAME "Boot Sequence"
#define NETBOOT_NAME "Network Boot Options"
#define SYSTEM_INFO_NAME "System Information"
#define AMIGABOOT_NAME "OS MultiBoot Options"
#define VIDEO_NAME "Video Options"
/**************************************************************************************
MAIN MENU
*************************************************************************************/
menu_t *make_main_menu(form_t *form)
{
menu_t
*menu = new_menu(MENUTYPE_FORM, MAIN_MENU_NAME, form, NULL);
if (menu)
{
item_t *item;
item = menu_item_create(ITEMTYPE_SUBMENU, menu,
"Video Options", VIDEO_NAME); //TEST_ITEM();
menu_item_set_help(item, "Select the current video card");
#ifdef CONFIG_SAM460EX
item = menu_item_create(ITEMTYPE_SUBMENU, menu,
"PCI-E 1x / SATA-2", PCIE_SATA_NAME); //TEST_ITEM();
menu_item_set_help(item, "Select PCI-E 1x / SATA-2");
#endif
item = menu_item_create(ITEMTYPE_SUBMENU, menu,
"Boot Sequence", BOOTSEQ_NAME); //TEST_ITEM();
menu_item_set_help(item, "Adjust parameters for booting an OS");
item = menu_item_create(ITEMTYPE_SUBMENU, menu,
"System Information", SYSTEM_INFO_NAME); //TEST_ITEM();
menu_item_set_help(item, "Information about the hardware installed on this machine");
}
menu_form_add_menu(form, menu);
return menu;
}
/**************************************************************************************
PCI-E/SATA Menu
*************************************************************************************/
#ifdef CONFIG_SAM460EX
popup_entry_t pcie_sata_select_entries[] =
{
{"SATA-2", "sata2", NULL},
{"PCI-E 1x", "pci-e", NULL},
TABLE_END,
};
menu_t *make_pcie_sata_menu(form_t *form)
{
menu_t *menu = new_menu(MENUTYPE_FORM, PCIE_SATA_NAME, form, MAIN_MENU_NAME);
item_t
*item;
if (menu)
{
item = menu_item_create(ITEMTYPE_POPUP, menu,
"Select PCI-E 1x / SATA-2", 0, "serdes",
cvar_popup_save, cvar_popup_load,
pcie_sata_select_entries);
menu_item_set_help(item, "Choose to acticate PCI-E 1x slot or the onchip "\
"SATA-2 port (requires reboot and changing J16 on motherboard)");
}
menu_form_add_menu(form, menu);
return menu;
}
#endif
/**************************************************************************************
Video Menu
*************************************************************************************/
popup_entry_t video_select_entries[] =
{
#if defined(CONFIG_SAM440EP_FLEX)
{"PCI", "pci", NULL},
{"SM502", "sm502", NULL},
#elif defined(CONFIG_SAM460EX)
{"Onboard", "sm502", NULL},
{"PCI/PCI-E", "pci", NULL},
#else
{"Internal", "internal", NULL},
{"PCI", "pci", NULL},
#endif
TABLE_END,
};
popup_entry_t silent_select_entries[] =
{
{"Verbose", "0", NULL},
{"Silent", "1", NULL},
TABLE_END,
};
menu_t *make_video_menu(form_t *form)
{
menu_t *menu = new_menu(MENUTYPE_FORM, VIDEO_NAME, form, MAIN_MENU_NAME);
item_t
*item;
if (menu)
{
item = menu_item_create(ITEMTYPE_POPUP, menu,
"Boot from graphics card", 0, "video_activate",
cvar_popup_save, cvar_popup_load,
video_select_entries); //TEST_ITEM();
#if defined(CONFIG_SAM440EP_FLEX)
menu_item_set_help(item, "Choose whether the PCI ATI or the SM502 "\
"graphics card is activated (requires reboot)");
#elif defined(CONFIG_SAM460EX)
menu_item_set_help(item, "Choose whether the PCI/PCI-E or the onboard "\
"graphics card is activated (requires reboot)");
#else
menu_item_set_help(item, "Choose whether the internal ATI M9 or a PCI "\
"graphics card is activated (requires reboot)");
#endif
item = menu_item_create(ITEMTYPE_POPUP, menu,
"Console", 2, "hush",
cvar_popup_save, cvar_popup_load,
silent_select_entries);
menu_item_set_help(item, "Suppress most console messages on the screen while booting");
}
menu_form_add_menu(form, menu);
return menu;
}
/**************************************************************************************
Boot Sequence
*************************************************************************************/
popup_entry_t boot_seq[] =
{
{"0680 PATA HD", "psii", NULL},
{"0680 PATA DVD", "psiicdrom", NULL},
{"3x12 SATA HD", "ssii", NULL},
{"3x12 SATA DVD", "ssiicdrom", NULL},
{"3114 SATA HD", "s4sii", NULL},
{"3114 SATA DVD", "s4siicdrom", NULL},
#ifdef CONFIG_SAM460EX
{"460 SATA2 HD", "sata2-460", NULL},
#endif
{"USB DVD", "ucdrom", NULL},
{"USB HD", "usb", NULL},
{"Network", "net", NULL},
{"none", "", NULL},
TABLE_END,
};
menu_t *make_netboot_menu(form_t *form)
{
menu_t
*menu = new_menu(MENUTYPE_FORM, NETBOOT_NAME, form, BOOTSEQ_NAME);
item_t
*item;
if (menu)
{
item = menu_item_create(ITEMTYPE_STRING_CVAR, menu,
"Local TCP/IP Address", "ipaddr", ""); //TEST_ITEM();
menu_item_set_help(item, "Local TCP/IP address for network boot");
item = menu_item_create(ITEMTYPE_STRING_CVAR, menu,
"Server TCP/IP Address", "serverip", ""); //TEST_ITEM();
menu_item_set_help(item, "Server IP address. Server must be running a supported networking boot service");
}
menu_form_add_menu(form, menu);
return menu;
}
menu_t *make_amigaboot_menu(form_t *form)
{
menu_t
*menu = new_menu(MENUTYPE_FORM, AMIGABOOT_NAME, form, BOOTSEQ_NAME);
item_t
*item;
if (menu)
{
item = menu_item_create(ITEMTYPE_POPUP, menu,
"Boot Device 1", 0, "boot1",
cvar_popup_save, cvar_popup_load, boot_seq); //TEST_ITEM();
menu_item_set_help(item, "Select first boot device");
item = menu_item_create(ITEMTYPE_POPUP, menu,
"Boot Device 2", 2, "boot2",
cvar_popup_save, cvar_popup_load, boot_seq); //TEST_ITEM();
menu_item_set_help(item, "Select second boot device");
item = menu_item_create(ITEMTYPE_POPUP, menu,
"Boot Device 3", 4, "boot3",
cvar_popup_save, cvar_popup_load, boot_seq); //TEST_ITEM();
menu_item_set_help(item, "Select third boot device");
SPACER;
item = menu_item_create(ITEMTYPE_STRING_CVAR, menu,
"OS Selection timeout", "boota_timeout", "3"); //TEST_ITEM();
menu_item_set_help(item, "The amount of time the OS selection menu waits before booting");
}
menu_form_add_menu(form, menu);
return menu;
}
menu_t *make_boot_menu(form_t *form)
{
menu_t
*menu = new_menu(MENUTYPE_FORM, BOOTSEQ_NAME, form, MAIN_MENU_NAME);
item_t
*item;
if (menu)
{
item = menu_item_create(ITEMTYPE_STRING_CVAR, menu,
"Menu Boot delay", "menuboot_delay", "3");
menu_item_set_help(item, "The amount of time the menu waits before continuing to boot");
SPACER;
item = menu_item_create(ITEMTYPE_STRING_CVAR, menu,
"Boot arguments for AOS", "os4_commandline", "debuglevel=0"); //TEST_ITEM();
menu_item_set_help(item, "Argument string passed to AOS");
item = menu_item_create(ITEMTYPE_STRING_CVAR, menu,
"Boot arguments for Linux", "bootargs", "root=/dev/sda3"); //TEST_ITEM();
menu_item_set_help(item, "Argument string passed to Linux");
SPACER;
item = menu_item_create(ITEMTYPE_SUBMENU, menu,
"Network Boot Options", NETBOOT_NAME); //TEST_ITEM();
item = menu_item_create(ITEMTYPE_SUBMENU, menu,
"OS Multiboot Options", AMIGABOOT_NAME);
}
menu_form_add_menu(form, menu);
return menu;
}
/**************************************************************************************
System Information
*************************************************************************************/
static void dummy(void)
{
}
char *mystrdup(char *src)
{
int
i = strlen(src)+1;
char
*s = malloc(i);
if (s)
{
strcpy(s, src);
}
return s;
}
menu_t *make_sysinfo_menu(form_t *form)
{
char buffer[64];
menu_t
* menu = new_menu(MENUTYPE_FORM, SYSTEM_INFO_NAME, form, MAIN_MENU_NAME);
item_t
* item;
int cpu_pvr;
sys_info_t
sysinfo;
get_sys_info(&sysinfo);
if (menu)
{
{
DECLARE_GLOBAL_DATA_PTR;
cpu_pvr = get_pvr();
switch((cpu_pvr&0xffff0000)>>16)
{
#ifdef CONFIG_SAM460EX
case 0x1302:
sprintf (buffer, "CPU Type : AMCC PowerPC 460ex Rev ");
switch (cpu_pvr&0xffff)
{
case 0x18a3:
strcat (buffer, "A");
break;
case 0x18a4:
strcat (buffer, "B");
break;
default:
strcat (buffer, "unknown");
break;
}
break;
#else
case 0x4222:
sprintf (buffer, "CPU Type : AMCC PowerPC 440ep Rev ");
switch (cpu_pvr&0xffff)
{
case 0x18d3:
strcat (buffer, "B");
break;
case 0x18d4:
strcat (buffer, "C");
break;
default:
strcat (buffer, "unknown");
break;
}
break;
#endif
default:
sprintf(buffer, "Unknown: PVR 0x%08X", cpu_pvr);
}
sprintf(buffer, "%s / %ld MHz", buffer, gd->cpu_clk / 1000000);
item = menu_item_create(ITEMTYPE_LABEL, menu, mystrdup(buffer));
sprintf(buffer, "PLB freq : %4ld MHz", sysinfo.freqPLB / 1000000);
item = menu_item_create(ITEMTYPE_LABEL, menu, mystrdup(buffer));
#ifdef CONFIG_SAM460EX
sprintf(buffer, "DDR2 freq : %4ld MHz", 2 * sysinfo.freqDDR / 1000000);
item = menu_item_create(ITEMTYPE_LABEL, menu, mystrdup(buffer));
#else
sprintf(buffer, "DDR freq : %4ld MHz", 2 * sysinfo.freqPLB / 1000000);
item = menu_item_create(ITEMTYPE_LABEL, menu, mystrdup(buffer));
#endif
/**** DIMM BANK INFO ****/
SPACER;
item = menu_item_create(ITEMTYPE_LABEL, menu, "Memory");
sprintf(buffer, "Total : %ld MB", (gd->bd->bi_memsize) / 1024 / 1024);
item = menu_item_create(ITEMTYPE_LABEL, menu, mystrdup(buffer));
}
}
menu_form_add_menu(form, menu);
return menu;
}
void restore_func(void)
{
}
void recover_func(void)
{
}
/* ********************************************************************************* */
void make_menus(form_t *form)
{
make_video_menu(form);
#ifdef CONFIG_SAM460EX
make_pcie_sata_menu(form);
#endif
make_main_menu(form);
make_netboot_menu(form);
make_amigaboot_menu(form);
make_boot_menu(form);
make_sysinfo_menu(form);
}