grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2] ofdisk: add sas disks to the device list


From: Paulo Flabiano Smorigo
Subject: Re: [PATCH v2] ofdisk: add sas disks to the device list
Date: Mon, 9 Nov 2015 09:49:09 -0200

On Mon, Nov 9, 2015 at 2:18 AM, Andrei Borzenkov <address@hidden> wrote:
> 09.11.2015 04:29, Paulo Flabiano Smorigo пишет:
>>
>> All SAS disks attached will be added to the device list. This is the
>> second
>> version of a patch that I send a while ago [1].
>>
>> [1] https://lists.gnu.org/archive/html/grub-devel/2015-08/msg00000.html
>>
>> ---
>>   grub-core/disk/ieee1275/ofdisk.c | 76
>> ++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 76 insertions(+)
>>
>> diff --git a/grub-core/disk/ieee1275/ofdisk.c
>> b/grub-core/disk/ieee1275/ofdisk.c
>> index 297f058..afec9ba 100644
>> --- a/grub-core/disk/ieee1275/ofdisk.c
>> +++ b/grub-core/disk/ieee1275/ofdisk.c
>> @@ -260,6 +260,82 @@ dev_iterate (const struct grub_ieee1275_devalias
>> *alias)
>>         grub_free (buf);
>>         return;
>>       }
>> +  else if (grub_strcmp (alias->type, "sas_ioa") == 0)
>> +    {
>> +      /* The method returns the number of disks and a table where
>> +       * each ID is 64-bit long. Example of sas paths:
>> +       *  /address@hidden/pci1014,address@hidden/sas/address@hidden
>> +       *  /address@hidden/pci1014,address@hidden/sas/address@hidden
>> +       *  /address@hidden/pci1014,address@hidden/sas/address@hidden */
>
>
> Did you omit last 3 bytes on purpose?
>
> Out of curiosity - is it really true that SAS address is written backwards
> (at least, I assume this is SAS address)?

The 3 missing bytes are leading zeros that it's not used in the path.

This is the table that I got:

000000 00 00 00 c0 5d b7 08 00 00 00 00 a0 5d b7 08 00
000010 00 00 00 80 5d b7 08 00 00 00 00 60 5d b7 08 00
000020 00 00 00 40 5d b7 08 00 00 00 00 20 5d b7 08 00
000030 50 05 07 60 64 79 f9 01 00 00 00 00 00 00 00 00
000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
...

It's not backwards, each address has a space between them. It's exactly 128GB:

>>> (0xc05db70800-0xa05db70800)/(1024.**3)
128.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, *table;
>> +      unsigned i;
>> +      grub_uint32_t table_size;
>> +      grub_ieee1275_ihandle_t ihandle;
>> +
>> +      buf = grub_malloc (grub_strlen (alias->path)
>> +                         + sizeof ("/address@hidden"));
>> +      if (!buf)
>> +        return;
>> +
>> +      /* 64 entries should be enough */
>> +      table_size = sizeof (grub_uint64_t) * 64;
>> +      table = grub_malloc (table_size);
>> +
>> +      if (!table)
>> +        {
>> +          grub_free (buf);
>> +          return;
>> +        }
>> +
>> +      bufptr = grub_stpcpy (buf, alias->path);
>> +
>> +      if (grub_ieee1275_open (alias->path, &ihandle))
>> +        {
>> +          grub_free (buf);
>> +          grub_free (table);
>> +          return;
>> +        }
>> +
>> +      INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 2);
>> +      args.method = (grub_ieee1275_cell_t) "get-sas-children";
>> +      args.ihandle = ihandle;
>> +      args.max = table_size;
>> +      args.table = (grub_ieee1275_cell_t) table;
>> +      args.catch_result = 0;
>> +      args.nentries = 0;
>> +
>> +      if (IEEE1275_CALL_ENTRY_FN (&args) == -1)
>> +        {
>> +          grub_ieee1275_close (ihandle);
>> +          grub_free (table);
>> +          grub_free (buf);
>> +          return;
>> +        }
>> +
>> +      grub_uint64_t *ptr;
>> +      for (i = 0; i < args.nentries; i++)
>> +        {
>> +          ptr = (grub_uint64_t *) (table + sizeof (grub_uint64_t) * i);
>> +          grub_snprintf (bufptr, 32, "/address@hidden" PRIxGRUB_UINT64_T, 
>> *ptr);
>> +          dev_iterate_real (buf, buf);
>> +        }
>> +
>> +      grub_ieee1275_close (ihandle);
>> +      grub_free (table);
>> +      grub_free (buf);
>> +    }
>>
>>     if (!grub_ieee1275_test_flag
>> (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS)
>>         && grub_strcmp (alias->type, "block") == 0)
>>
>
>
> _______________________________________________
> Grub-devel mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/grub-devel



reply via email to

[Prev in Thread] Current Thread [Next in Thread]