[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 13/15] sparc64: add disks that don't have a devalias to the devic
From: |
Eric Snowberg |
Subject: |
[PATCH 13/15] sparc64: add disks that don't have a devalias to the device list |
Date: |
Wed, 29 Jun 2016 14:43:26 -0700 |
Add ability for grub2 to be capable of booting from a disk that does not
have a device alias. This patch will find all disks in the system and add
them to the device list.
Signed-off-by: Eric Snowberg <address@hidden>
---
grub-core/disk/ieee1275/ofdisk.c | 144 ++++++++++++++++++++++++++++++++++++++
1 files changed, 144 insertions(+), 0 deletions(-)
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c
index 42d038c..17d082b 100644
--- a/grub-core/disk/ieee1275/ofdisk.c
+++ b/grub-core/disk/ieee1275/ofdisk.c
@@ -376,6 +376,150 @@ dev_iterate (const struct grub_ieee1275_devalias *alias)
grub_free (table);
grub_free (buf);
}
+ else if (grub_strcmp (alias->type, "scsi-2") == 0)
+ {
+ grub_ieee1275_ihandle_t ihandle;
+ grub_ssize_t result;
+ char *buf, *bufptr;
+ grub_uint8_t tgt;
+
+ buf = grub_malloc (grub_strlen (alias->path) +
+ sizeof ("/address@hidden"));
+ if (!buf)
+ return;
+
+ bufptr = grub_stpcpy (buf, alias->path);
+ ihandle = ofdisk_hba_open (alias->path);
+
+ if (ihandle == 0)
+ {
+ grub_free (buf);
+ return;
+ }
+
+ for (tgt = 0; tgt <= 0xf; tgt++)
+ {
+ if (grub_ieee1275_set_address(ihandle, tgt, 0) == 0)
+ if (grub_ieee1275_no_data_command (ihandle, &ofdisk_tur,
+ &result) == 0)
+ if (result == 0)
+ {
+ grub_snprintf (bufptr, sizeof ("/address@hidden"),
+ "/address@hidden" PRIxGRUB_UINT32_T, tgt);
+ dev_iterate_real (buf, buf);
+ }
+ }
+
+ grub_free (buf);
+ return;
+ }
+ else if (grub_strcmp (alias->type, "scsi-sas") == 0)
+ {
+ grub_ieee1275_ihandle_t ihandle;
+ grub_uint32_t address_cells = 2;
+ grub_ieee1275_phandle_t root;
+ grub_ssize_t result;
+ char *buf, *bufptr;
+
+ buf = grub_malloc (grub_strlen (alias->path) +
+ sizeof ("/address@hidden"));
+
+ if (!buf)
+ return;
+
+ bufptr = grub_stpcpy (buf, alias->path);
+ bufptr = grub_stpcpy (bufptr, "/disk@");
+ ihandle = ofdisk_hba_open (alias->path);
+
+ if (ihandle == 0)
+ {
+ grub_free (buf);
+ return;
+ }
+
+ grub_ieee1275_finddevice (alias->path, &root);
+ grub_ieee1275_get_integer_property (root, "#address-cells",
&address_cells,
+ sizeof address_cells, 0);
+ if (address_cells == 2)
+ {
+ grub_uint8_t tgt;
+
+ for (tgt = 0; tgt < 0xf; tgt++)
+ {
+ if (grub_ieee1275_set_address(ihandle, tgt, 0) == 0)
+ if (grub_ieee1275_no_data_command (ihandle, &ofdisk_tur,
+ &result) == 0)
+ if (result == 0)
+ {
+ grub_snprintf (bufptr, sizeof ("p1100"),
+ "%" PRIxGRUB_UINT32_T, tgt);
+ dev_iterate_real (buf, buf);
+ }
+ }
+ }
+ else if (address_cells == 4)
+ {
+ grub_uint16_t exp;
+ grub_uint8_t phy;
+
+ for (exp = 0; exp <= 0x100; exp+=0x100)
+ for (phy = 0; phy < 0xff; phy++)
+ {
+ grub_snprintf (bufptr, sizeof ("p1100"),
+ "p%" PRIxGRUB_UINT32_T, exp | phy);
+ if (grub_ieee1275_set_sas_address (ihandle, bufptr, 0) == 0)
+ if (grub_ieee1275_no_data_command (ihandle, &ofdisk_tur,
+ &result) == 0)
+ if (result == 0)
+ dev_iterate_real (buf, buf);
+ }
+ }
+ grub_free (buf);
+ return;
+ }
+ else if (grub_strcmp (alias->type, "nvme") == 0)
+ {
+ char *buf;
+
+ buf = grub_malloc (IEEE1275_MAX_PATH_LEN);
+
+ if (!buf)
+ return;
+
+ grub_snprintf (buf, IEEE1275_MAX_PATH_LEN, "%s/address@hidden",
alias->path);
+ dev_iterate_real (buf, buf);
+ grub_free (buf);
+ return;
+ }
+ else if (grub_strcmp (alias->type, "scsi-usb") == 0)
+ {
+ grub_ieee1275_ihandle_t ihandle;
+ grub_ssize_t result;
+
+ ihandle = ofdisk_hba_open (alias->path);
+
+ if (ihandle == 0)
+ return;
+
+ if (grub_ieee1275_set_address (ihandle, 0, 0) == 0)
+ if (grub_ieee1275_no_data_command (ihandle, &ofdisk_tur, &result) == 0)
+ if (result == 0)
+ {
+ char *buf, *bufptr;
+
+ buf = grub_malloc (grub_strlen (alias->path) +
+ sizeof ("/address@hidden"));
+
+ if (!buf)
+ return;
+
+ bufptr = grub_stpcpy (buf, alias->path);
+ grub_snprintf (bufptr, sizeof ("/address@hidden"),
"/address@hidden");
+ dev_iterate_real (buf, buf);
+ grub_free (buf);
+ }
+ return;
+ }
if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS)
&& grub_strcmp (alias->type, "block") == 0)
--
1.7.1
- [PATCH 04/15] sparc64: Use the correct disk name in core.img, (continued)
- [PATCH 04/15] sparc64: Use the correct disk name in core.img, Eric Snowberg, 2016/06/29
- [PATCH 05/15] ieee1275: fix segfault in grub-ofpathname, Eric Snowberg, 2016/06/29
- [PATCH 06/15] ieee1275: add nvme support within ofpath, Eric Snowberg, 2016/06/29
- [PATCH 07/15] ofdisk: memory corruption fix, Eric Snowberg, 2016/06/29
- [PATCH 09/15] ieee1275: ofdisk - don't continue to query block-size after we have it, Eric Snowberg, 2016/06/29
- [PATCH 08/15] ofdisk: move open logic, Eric Snowberg, 2016/06/29
- [PATCH 11/15] sparc64: boot performance improvements, Eric Snowberg, 2016/06/29
- [PATCH 10/15] ofdisk: refactor open logic, Eric Snowberg, 2016/06/29
- [PATCH 12/15] ofdisk: only add aliases that exist, Eric Snowberg, 2016/06/29
- [PATCH 14/15] parser: Remove escape from the state transitions, Eric Snowberg, 2016/06/29
- [PATCH 13/15] sparc64: add disks that don't have a devalias to the device list,
Eric Snowberg <=
- [PATCH 15/15] sparc64: ignore hypervisor reboot memory block device, Eric Snowberg, 2016/06/29