Skip to content
Snippets Groups Projects
Commit 4b6f8463 authored by Colin Watson's avatar Colin Watson
Browse files

Port yaboot logic for various powerpc machine types

Some powerpc machines require not updating the NVRAM.  This can be handled
by existing grub-install command-line options, but it's friendlier to detect
this automatically.

On chrp_ibm machines, use the nvram utility rather than nvsetenv.  (This
is possibly suitable for other machines too, but that needs to be
verified.)

Forwarded: no
Last-Update: 2014-10-15

Patch-Name: install-powerpc-machtypes.patch
parent fd81fffa
No related branches found
No related tags found
No related merge requests found
......@@ -30,3 +30,8 @@ grub_install_get_default_x86_platform (void)
return "i386-pc";
}
const char *
grub_install_get_default_powerpc_machtype (void)
{
return "generic";
}
......@@ -24,6 +24,7 @@
#include <grub/emu/misc.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
......@@ -184,3 +185,74 @@ grub_install_get_default_x86_platform (void)
grub_util_info ("... not found");
return "i386-pc";
}
const char *
grub_install_get_default_powerpc_machtype (void)
{
FILE *fp;
char *buf = NULL;
size_t len = 0;
const char *machtype = "generic";
fp = grub_util_fopen ("/proc/cpuinfo", "r");
if (! fp)
return machtype;
while (getline (&buf, &len, fp) > 0)
{
if (strncmp (buf, "pmac-generation",
sizeof ("pmac-generation") - 1) == 0)
{
if (strstr (buf, "NewWorld"))
{
machtype = "pmac_newworld";
break;
}
if (strstr (buf, "OldWorld"))
{
machtype = "pmac_oldworld";
break;
}
}
if (strncmp (buf, "motherboard", sizeof ("motherboard") - 1) == 0 &&
strstr (buf, "AAPL"))
{
machtype = "pmac_oldworld";
break;
}
if (strncmp (buf, "machine", sizeof ("machine") - 1) == 0 &&
strstr (buf, "CHRP IBM"))
{
if (strstr (buf, "qemu"))
{
machtype = "chrp_ibm_qemu";
break;
}
else
{
machtype = "chrp_ibm";
break;
}
}
if (strncmp (buf, "platform", sizeof ("platform") - 1) == 0)
{
if (strstr (buf, "Maple"))
{
machtype = "maple";
break;
}
if (strstr (buf, "Cell"))
{
machtype = "cell";
break;
}
}
}
free (buf);
fclose (fp);
return machtype;
}
......@@ -218,13 +218,29 @@ grub_install_register_ieee1275 (int is_prep, const char *install_device,
else
boot_device = get_ofpathname (install_device);
if (grub_util_exec ((const char * []){ "nvsetenv", "boot-device",
boot_device, NULL }))
if (strcmp (grub_install_get_default_powerpc_machtype (), "chrp_ibm") == 0)
{
char *cmd = xasprintf ("setenv boot-device %s", boot_device);
grub_util_error (_("`nvsetenv' failed. \nYou will have to set `boot-device' variable manually. At the IEEE1275 prompt, type:\n %s\n"),
cmd);
free (cmd);
char *arg = xasprintf ("boot-device=%s", boot_device);
if (grub_util_exec ((const char * []){ "nvram",
"--update-config", arg, NULL }))
{
char *cmd = xasprintf ("setenv boot-device %s", boot_device);
grub_util_error (_("`nvram' failed. \nYou will have to set `boot-device' variable manually. At the IEEE1275 prompt, type:\n %s\n"),
cmd);
free (cmd);
}
free (arg);
}
else
{
if (grub_util_exec ((const char * []){ "nvsetenv", "boot-device",
boot_device, NULL }))
{
char *cmd = xasprintf ("setenv boot-device %s", boot_device);
grub_util_error (_("`nvsetenv' failed. \nYou will have to set `boot-device' variable manually. At the IEEE1275 prompt, type:\n %s\n"),
cmd);
free (cmd);
}
}
free (boot_device);
......
......@@ -128,6 +128,12 @@ grub_install_get_default_x86_platform (void)
return "i386-efi";
}
const char *
grub_install_get_default_powerpc_machtype (void)
{
return "generic";
}
static void *
get_efi_variable (const wchar_t *varname, ssize_t *len)
{
......
......@@ -223,6 +223,9 @@ grub_install_get_default_arm_platform (void);
const char *
grub_install_get_default_x86_platform (void);
const char *
grub_install_get_default_powerpc_machtype (void);
int
grub_install_register_efi (grub_device_t efidir_grub_dev,
const char *efifile_path,
......
......@@ -1187,7 +1187,18 @@ main (int argc, char *argv[])
if (platform == GRUB_INSTALL_PLATFORM_POWERPC_IEEE1275)
{
const char *machtype = grub_install_get_default_powerpc_machtype ();
int is_guess = 0;
if (strcmp (machtype, "pmac_oldworld") == 0)
update_nvram = 0;
else if (strcmp (machtype, "cell") == 0)
update_nvram = 0;
else if (strcmp (machtype, "generic") == 0)
update_nvram = 0;
else if (strcmp (machtype, "chrp_ibm_qemu") == 0)
update_nvram = 0;
if (!macppcdir)
{
char *d;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment