qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] megasas: static SAS addresses
@ 2012-08-01  9:12 Hannes Reinecke
  2012-08-01  9:19 ` Hannes Reinecke
  0 siblings, 1 reply; 4+ messages in thread
From: Hannes Reinecke @ 2012-08-01  9:12 UTC (permalink / raw)
  To: qemu-devel
  Cc: Paolo Bonzini, Anthony Liguori, Hannes Reinecke, Alexander Graf,
	Andreas Faerber

This patch introduces a new property 'sas_address' which
allows the user to specify the SAS address for the HBA.
The default address it taken from the qumranet IEEE number
and the pci slot address. That ensures it'll be unique
and reproduceable locally.

The port addresses are now calculated based on the magic
number 0x1221 (which is found in real hardware, too) plus
the device number.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Andreas Faerber <afaerber@suse.de>
Cc: Anthony Liguori <aliguori@codemonkey.ws>
Cc: Alexander Graf <agraf@suse.de>
---
 hw/megasas.c |   63 ++++++++++++++++++++++++++++++++++++++++++---------------
 hw/mfi.h     |    1 +
 2 files changed, 47 insertions(+), 17 deletions(-)

diff --git a/hw/megasas.c b/hw/megasas.c
index 9a0eab1..e709d4d 100644
--- a/hw/megasas.c
+++ b/hw/megasas.c
@@ -38,6 +38,8 @@
 #define MEGASAS_MAX_SECTORS 0xFFFF      /* No real limit */
 #define MEGASAS_MAX_ARRAYS 128
 
+#define IEEE_COMPANY_QUMRANET      0x001A4AULL
+
 #define MEGASAS_FLAG_USE_JBOD      0
 #define MEGASAS_MASK_USE_JBOD      (1 << MEGASAS_FLAG_USE_JBOD)
 #define MEGASAS_FLAG_USE_MSIX      1
@@ -89,6 +91,8 @@ typedef struct MegasasState {
     int shutdown_event;
     int boot_event;
 
+    uint64_t sas_addr;
+
     uint64_t reply_queue_pa;
     void *reply_queue;
     int reply_queue_len;
@@ -372,14 +376,16 @@ static uint64_t megasas_fw_time(void)
     return bcd_time;
 }
 
-static uint64_t megasas_gen_sas_addr(uint64_t id)
+/*
+ * Default disk sata address
+ * 0x1221 is them magic number as
+ * present in real hardware,
+ * so use it here, too.
+ */
+static uint64_t megasas_get_sata_addr(uint16_t id)
 {
-    uint64_t addr;
-
-    addr = 0x5001a4aULL << 36;
-    addr |= id & 0xfffffffff;
-
-    return addr;
+    uint64_t addr = (0x1221ULL << 48);
+    return addr & (id << 24);
 }
 
 /*
@@ -652,10 +658,7 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
     size_t dcmd_size = sizeof(info);
     BusChild *kid;
     int num_ld_disks = 0;
-
-    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
-        num_ld_disks++;
-    }
+    uint16_t sdev_id;
 
     memset(&info, 0x0, cmd->iov_size);
     if (cmd->iov_size < dcmd_size) {
@@ -669,10 +672,29 @@ static int megasas_ctrl_get_info(MegasasState *s, MegasasCmd *cmd)
     info.pci.subvendor = cpu_to_le16(PCI_VENDOR_ID_LSI_LOGIC);
     info.pci.subdevice = cpu_to_le16(0x1013);
 
-    info.host.type = MFI_INFO_HOST_PCIX;
+    /*
+     * For some reason the firmware supports
+     * only up to 8 device ports.
+     * Despite supporting a far larger number
+     * of devices for the physical devices.
+     * So just display the first 8 devices
+     * in the device port list, independent
+     * on how many logical devices are actually
+     * present.
+     */
+    info.host.type = MFI_INFO_HOST_PCIE;
     info.device.type = MFI_INFO_DEV_SAS3G;
-    info.device.port_count = 2;
-    info.device.port_addr[0] = cpu_to_le64(megasas_gen_sas_addr((uint64_t)s));
+    info.device.port_count = 8;
+    QTAILQ_FOREACH(kid, &s->bus.qbus.children, sibling) {
+        SCSIDevice *sdev = DO_UPCAST(SCSIDevice, qdev, kid->child);
+
+        if (num_ld_disks < 8) {
+            sdev_id = ((sdev->id & 0xFF) >> 8) | (sdev->lun & 0xFF);
+            info.device.port_addr[num_ld_disks] =
+                cpu_to_le64(megasas_get_sata_addr(sdev_id));
+        }
+        num_ld_disks++;
+    }
 
     memcpy(info.product_name, "MegaRAID SAS 8708EM2", 20);
     snprintf(info.serial_number, 32, "QEMU%08lx",
@@ -761,7 +783,7 @@ static int megasas_mfc_get_defaults(MegasasState *s, MegasasCmd *cmd)
         return MFI_STAT_INVALID_PARAMETER;
     }
 
-    info.sas_addr = cpu_to_le64(megasas_gen_sas_addr((uint64_t)s));
+    info.sas_addr = cpu_to_le64(s->sas_addr);
     info.stripe_size = 3;
     info.flush_time = 4;
     info.background_rate = 30;
@@ -891,7 +913,7 @@ static int megasas_dcmd_pd_get_list(MegasasState *s, MegasasCmd *cmd)
         info.addr[num_pd_disks].scsi_dev_type = sdev->type;
         info.addr[num_pd_disks].connect_port_bitmap = 0x1;
         info.addr[num_pd_disks].sas_addr[0] =
-            cpu_to_le64(megasas_gen_sas_addr((uint64_t)sdev));
+            cpu_to_le64(megasas_get_sata_addr(sdev_id));
         num_pd_disks++;
         offset += sizeof(struct mfi_pd_address);
     }
@@ -994,7 +1016,7 @@ static int megasas_pd_get_info_submit(SCSIDevice *sdev, int lun,
     info->slot_number = (sdev->id & 0xFF);
     info->path_info.count = 1;
     info->path_info.sas_addr[0] =
-        cpu_to_le64(megasas_gen_sas_addr((uint64_t)sdev));
+        cpu_to_le64(megasas_get_sata_addr(sdev_id));
     info->connected_port_bitmap = 0x1;
     info->device_speed = 1;
     info->link_speed = 1;
@@ -2103,6 +2125,12 @@ static int megasas_scsi_init(PCIDevice *dev)
         msix_vector_use(&s->dev, 0);
     }
 
+    if (!s->sas_addr) {
+        s->sas_addr = ((5ULL << 24) | IEEE_COMPANY_QUMRANET) << 36;
+        s->sas_addr |= (pci_bus_num(dev->bus) << 16);
+        s->sas_addr |= (PCI_SLOT(dev->devfn) << 8);
+        s->sas_addr |= PCI_FUNC(dev->devfn);
+    }
     if (s->fw_sge >= MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE) {
         s->fw_sge = MEGASAS_MAX_SGE - MFI_PASS_FRAME_SIZE;
     } else if (s->fw_sge >= 128 - MFI_PASS_FRAME_SIZE) {
@@ -2137,6 +2165,7 @@ static Property megasas_properties[] = {
                        MEGASAS_DEFAULT_SGE),
     DEFINE_PROP_UINT32("max_cmds", MegasasState, fw_cmds,
                        MEGASAS_DEFAULT_FRAMES),
+    DEFINE_PROP_HEX64("sas_address", MegasasState, sas_addr, 0),
 #ifdef USE_MSIX
     DEFINE_PROP_BIT("use_msix", MegasasState, flags,
                     MEGASAS_FLAG_USE_MSIX, false),
diff --git a/hw/mfi.h b/hw/mfi.h
index 3045d4e..436b690 100644
--- a/hw/mfi.h
+++ b/hw/mfi.h
@@ -656,6 +656,7 @@ struct mfi_info_device {
 #define MFI_INFO_DEV_SAS3G      0x02
 #define MFI_INFO_DEV_SATA1      0x04
 #define MFI_INFO_DEV_SATA3G     0x08
+#define MFI_INFO_DEV_PCIE       0x10
     uint8_t reserved[6];
     uint8_t port_count;
     uint64_t port_addr[8];
-- 
1.7.3.4

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] megasas: static SAS addresses
  2012-08-01  9:12 [Qemu-devel] [PATCH] megasas: static SAS addresses Hannes Reinecke
@ 2012-08-01  9:19 ` Hannes Reinecke
  2012-08-01  9:23   ` Paolo Bonzini
  0 siblings, 1 reply; 4+ messages in thread
From: Hannes Reinecke @ 2012-08-01  9:19 UTC (permalink / raw)
  To: Hannes Reinecke
  Cc: Paolo Bonzini, Alexander Graf, qemu-devel, Anthony Liguori,
	Andreas Faerber

(Bad style to reply to my own post. I know.)

On 08/01/2012 11:12 AM, Hannes Reinecke wrote:
> This patch introduces a new property 'sas_address' which
> allows the user to specify the SAS address for the HBA.
> The default address it taken from the qumranet IEEE number
> and the pci slot address. That ensures it'll be unique
> and reproduceable locally.
> 
> The port addresses are now calculated based on the magic
> number 0x1221 (which is found in real hardware, too) plus
> the device number.
> 
> Signed-off-by: Hannes Reinecke <hare@suse.de>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Andreas Faerber <afaerber@suse.de>
> Cc: Anthony Liguori <aliguori@codemonkey.ws>
> Cc: Alexander Graf <agraf@suse.de>
> ---
>  hw/megasas.c |   63 ++++++++++++++++++++++++++++++++++++++++++---------------
>  hw/mfi.h     |    1 +
>  2 files changed, 47 insertions(+), 17 deletions(-)
> 
> diff --git a/hw/megasas.c b/hw/megasas.c
> index 9a0eab1..e709d4d 100644
> --- a/hw/megasas.c
> +++ b/hw/megasas.c
> @@ -38,6 +38,8 @@
>  #define MEGASAS_MAX_SECTORS 0xFFFF      /* No real limit */
>  #define MEGASAS_MAX_ARRAYS 128
>  
> +#define IEEE_COMPANY_QUMRANET      0x001A4AULL
> +

Something worth of note:
To generate a valid SAS address I need an IEEE number.

I seem to remember Qumranet donated their PCI id for KVM use.
I don't actually know if that donation extends to the IEEE number,
too. If not then obviously I would need to use another one here.

Who would be best in a position to answer this?

Paolo? Someone at RH should know ...

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] megasas: static SAS addresses
  2012-08-01  9:19 ` Hannes Reinecke
@ 2012-08-01  9:23   ` Paolo Bonzini
  2012-08-01 10:04     ` Hannes Reinecke
  0 siblings, 1 reply; 4+ messages in thread
From: Paolo Bonzini @ 2012-08-01  9:23 UTC (permalink / raw)
  To: Hannes Reinecke
  Cc: Alexander Graf, Dor Laor, qemu-devel, Anthony Liguori,
	Andreas Faerber

Il 01/08/2012 11:19, Hannes Reinecke ha scritto:
>> > +#define IEEE_COMPANY_QUMRANET      0x001A4AULL
>> > +
> Something worth of note:
> To generate a valid SAS address I need an IEEE number.
> 
> I seem to remember Qumranet donated their PCI id for KVM use.
> I don't actually know if that donation extends to the IEEE number,
> too. If not then obviously I would need to use another one here.

Alternatively, the 52:54:00 local ID could be used.  It's what we use
for MAC addresses.

> Who would be best in a position to answer this?

Adding Dor for good measure.

Paolo

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Qemu-devel] [PATCH] megasas: static SAS addresses
  2012-08-01  9:23   ` Paolo Bonzini
@ 2012-08-01 10:04     ` Hannes Reinecke
  0 siblings, 0 replies; 4+ messages in thread
From: Hannes Reinecke @ 2012-08-01 10:04 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: Alexander Graf, Dor Laor, qemu-devel, Anthony Liguori,
	Andreas Faerber

On 08/01/2012 11:23 AM, Paolo Bonzini wrote:
> Il 01/08/2012 11:19, Hannes Reinecke ha scritto:
>>>> +#define IEEE_COMPANY_QUMRANET      0x001A4AULL
>>>> +
>> Something worth of note:
>> To generate a valid SAS address I need an IEEE number.
>>
>> I seem to remember Qumranet donated their PCI id for KVM use.
>> I don't actually know if that donation extends to the IEEE number,
>> too. If not then obviously I would need to use another one here.
> 
> Alternatively, the 52:54:00 local ID could be used.  It's what we use
> for MAC addresses.
> 
Ah. Yes, that'd work as well.

And seeing that we're generating local IDs anyway we should be
using it. I'll be updating the patch.

Cheers,

Hannes
-- 
Dr. Hannes Reinecke		      zSeries & Storage
hare@suse.de			      +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: J. Hawn, J. Guild, F. Imendörffer, HRB 16746 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2012-08-01 10:04 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-08-01  9:12 [Qemu-devel] [PATCH] megasas: static SAS addresses Hannes Reinecke
2012-08-01  9:19 ` Hannes Reinecke
2012-08-01  9:23   ` Paolo Bonzini
2012-08-01 10:04     ` Hannes Reinecke

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).