From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1ZLASk-0004it-Le for mharc-grub-devel@gnu.org; Fri, 31 Jul 2015 09:35:02 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57541) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZLASf-0004eL-3p for grub-devel@gnu.org; Fri, 31 Jul 2015 09:35:00 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZLASZ-0001TX-C8 for grub-devel@gnu.org; Fri, 31 Jul 2015 09:34:56 -0400 Received: from e24smtp05.br.ibm.com ([32.104.18.26]:49527) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZLASZ-0001OC-1K for grub-devel@gnu.org; Fri, 31 Jul 2015 09:34:51 -0400 Received: from /spool/local by e24smtp05.br.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 31 Jul 2015 10:34:47 -0300 Received: from d24dlp01.br.ibm.com (9.18.248.204) by e24smtp05.br.ibm.com (10.172.0.141) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 31 Jul 2015 10:34:45 -0300 X-Helo: d24dlp01.br.ibm.com X-MailFrom: pfsmorigo@linux.vnet.ibm.com X-RcptTo: grub-devel@gnu.org Received: from d24relay01.br.ibm.com (d24relay01.br.ibm.com [9.8.31.16]) by d24dlp01.br.ibm.com (Postfix) with ESMTP id 7A6173520074 for ; Fri, 31 Jul 2015 09:33:39 -0400 (EDT) Received: from d24av02.br.ibm.com (d24av02.br.ibm.com [9.8.31.93]) by d24relay01.br.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id t6VDZ6Wu4526208 for ; Fri, 31 Jul 2015 10:35:07 -0300 Received: from d24av02.br.ibm.com (localhost [127.0.0.1]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id t6VDYhfS025686 for ; Fri, 31 Jul 2015 10:34:43 -0300 Received: from london.ltc.br.ibm.com ([9.8.3.191]) by d24av02.br.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id t6VDYbtW025470; Fri, 31 Jul 2015 10:34:39 -0300 From: Paulo Flabiano Smorigo To: The development of GNU GRUB Subject: [PATCH] ofdisk: Recognizes SAS disks automatically Date: Fri, 31 Jul 2015 10:34:25 -0300 Message-Id: <1438349665-14139-1-git-send-email-pfsmorigo@linux.vnet.ibm.com> X-Mailer: git-send-email 2.1.0 X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 15073113-0033-0000-0000-0000032022E3 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 32.104.18.26 Cc: Paulo Flabiano Smorigo X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 31 Jul 2015 13:35:01 -0000 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