Read all children from sas path and add it to the device list. --- grub-core/disk/ieee1275/ofdisk.c | 51 ++++++++++++++++++++++++++++++++++++++++ include/grub/ieee1275/ofdisk.h | 3 +++ 2 files changed, 54 insertions(+)
diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c index 331769b..b17f6d1 100644 --- a/grub-core/disk/ieee1275/ofdisk.c +++ b/grub-core/disk/ieee1275/ofdisk.c @@ -260,6 +260,57 @@ dev_iterate (const struct grub_ieee1275_devalias *alias) grub_free (buf); return; } + else if (grub_strcmp (alias->type, "sas_ioa") == 0) + { + struct sas_children + { + struct grub_ieee1275_common_hdr common; + grub_ieee1275_cell_t method; + grub_ieee1275_cell_t ihandle; + grub_ieee1275_cell_t max; + grub_ieee1275_cell_t table; + grub_ieee1275_cell_t catch_result; + grub_ieee1275_cell_t nentries; + } + args; + char *buf, *bufptr; + unsigned i; + grub_ieee1275_ihandle_t ihandle; + + buf = grub_malloc (grub_strlen (alias->path) + + sizeof("/disk@") + IEEE1275_SAS_CHILDREN_SIZE + 1); + if (!buf) + return; + + bufptr = grub_stpcpy (buf, alias->path); + + if (grub_ieee1275_open (alias->path, &ihandle)) + return; + + INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 2); + args.method = (grub_ieee1275_cell_t) "get-sas-children"; + args.ihandle = ihandle; + args.max = IEEE1275_SAS_CHILDREN_BUFFER_SIZE; + args.table = 0; + args.catch_result = 0; + args.nentries = 0; + + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) + { + grub_ieee1275_close (ihandle); + return; + } + grub_uint64_t *ptr; + for (i = 0; i < args.nentries; i++) + { + ptr = (grub_uint64_t *) (args.table + IEEE1275_SAS_CHILDREN_SIZE * i); + grub_snprintf (bufptr, 100, "/disk@%" PRIxGRUB_UINT64_T, (grub_uint64_t) *ptr); + dev_iterate_real (buf, buf); + } + + grub_ieee1275_close (ihandle); + grub_free (buf); + } if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS) && grub_strcmp (alias->type, "block") == 0) diff --git a/include/grub/ieee1275/ofdisk.h b/include/grub/ieee1275/ofdisk.h index 2f69e3f..59f84f7 100644 --- a/include/grub/ieee1275/ofdisk.h +++ b/include/grub/ieee1275/ofdisk.h @@ -19,6 +19,9 @@ #ifndef GRUB_OFDISK_HEADER #define GRUB_OFDISK_HEADER 1 +#define IEEE1275_SAS_CHILDREN_SIZE 8 +#define IEEE1275_SAS_CHILDREN_BUFFER_SIZE 100*IEEE1275_SAS_CHILDREN_SIZE + extern void grub_ofdisk_init (void); extern void grub_ofdisk_fini (void); -- 2.1.0 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel