All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thomas Huth <thuth@redhat.com>
To: Laurent Vivier <lvivier@redhat.com>, qemu-ppc@nongnu.org
Cc: qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>,
	Alexander Graf <agraf@suse.de>,
	David Gibson <david@gibson.dropbear.id.au>
Subject: Re: [Qemu-devel] [PATCH v3] spapr: generate DT node names
Date: Thu, 24 Sep 2015 11:01:44 +0200	[thread overview]
Message-ID: <5603BBF8.9070303@redhat.com> (raw)
In-Reply-To: <1443010443-4432-1-git-send-email-lvivier@redhat.com>

On 23/09/15 14:14, Laurent Vivier wrote:
> When DT node names for PCI devices are generated by SLOF,
> they are generated according to the type of the device
> (for instance, ethernet for virtio-net-pci device).
> 
> Node name for hotplugged devices is generated by QEMU.
> This patch adds the mechanic to QEMU to create the node
> name according to the device type too.
> 
> The data structure has been roughly copied from OpenBIOS/OpenHackware,
> node names from SLOF.
[...]
> diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
> index a2feb4c..c521d31 100644
> --- a/hw/ppc/spapr_pci.c
> +++ b/hw/ppc/spapr_pci.c
> @@ -38,6 +38,7 @@
>  
>  #include "hw/pci/pci_bridge.h"
>  #include "hw/pci/pci_bus.h"
> +#include "hw/pci/pci_ids.h"
>  #include "hw/ppc/spapr_drc.h"
>  #include "sysemu/device_tree.h"
>  
> @@ -944,6 +945,280 @@ static void populate_resource_props(PCIDevice *d, ResourceProps *rp)
>      rp->assigned_len = assigned_idx * sizeof(ResourceFields);
>  }
>  
> +typedef struct PCIClass PCIClass;
> +typedef struct PCISubClass PCISubClass;
> +typedef struct PCIIFace PCIIFace;
> +
> +struct PCIIFace {
> +    uint8_t iface;
> +    const char *name;
> +};
> +
> +struct PCISubClass {
> +    uint8_t subclass;
> +    const char *name;
> +    const PCIIFace *iface;
> +};
> +#define SUBCLASS(a) ((uint8_t)a)
> +#define IFACE(a)    ((uint8_t)a)
> +
> +struct PCIClass {
> +    const char *name;
> +    const PCISubClass *subc;
> +};
> +
> +static const PCISubClass undef_subclass[] = {
> +    { IFACE(PCI_CLASS_NOT_DEFINED_VGA), "display", NULL },
> +    { 0xFF, NULL, NULL, NULL },
> +};
> +
> +static const PCISubClass mass_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_STORAGE_SCSI), "scsi", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_IDE), "ide", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_FLOPPY), "fdc", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_IPI), "ipi", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_RAID), "raid", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_ATA), "ata", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_SATA), "sata", NULL },
> +    { SUBCLASS(PCI_CLASS_STORAGE_SAS), "sas", NULL },
> +    { 0xFF, NULL, NULL },
> +};
> +
> +static const PCISubClass net_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_NETWORK_ETHERNET), "ethernet", NULL },
> +    { SUBCLASS(PCI_CLASS_NETWORK_TOKEN_RING), "token-ring", NULL },
> +    { SUBCLASS(PCI_CLASS_NETWORK_FDDI), "fddi", NULL },
> +    { SUBCLASS(PCI_CLASS_NETWORK_ATM), "atm", NULL },
> +    { SUBCLASS(PCI_CLASS_NETWORK_ISDN), "isdn", NULL },
> +    { SUBCLASS(PCI_CLASS_NETWORK_WORDFIP), "worldfip", NULL },
> +    { SUBCLASS(PCI_CLASS_NETWORK_PICMG214), "picmg", NULL },
> +    { 0xFF, NULL, NULL },
> +};
> +
> +static const PCISubClass displ_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_DISPLAY_VGA), "vga", NULL },
> +    { SUBCLASS(PCI_CLASS_DISPLAY_XGA), "xga", NULL },
> +    { SUBCLASS(PCI_CLASS_DISPLAY_3D), "3d-controller", NULL },
> +    { 0xFF, NULL, NULL },
> +};
> +
> +static const PCISubClass media_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_MULTIMEDIA_VIDEO), "video", NULL },
> +    { SUBCLASS(PCI_CLASS_MULTIMEDIA_AUDIO), "sound", NULL },
> +    { SUBCLASS(PCI_CLASS_MULTIMEDIA_PHONE), "telephony", NULL },
> +    { 0xFF, NULL, NULL },
> +};
> +
> +static const PCISubClass mem_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_MEMORY_RAM), "memory", NULL },
> +    { SUBCLASS(PCI_CLASS_MEMORY_FLASH), "flash", NULL },
> +    { 0xFF, NULL, NULL },
> +};
> +
> +

One new-line should be sufficient.

[...]
> +static const PCISubClass cpu_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_386), "386", NULL },
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_486), "486", NULL },
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_PENTIUM), "pentium", NULL },
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_ALPHA), "alpha", NULL },
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_POWERPC), "powerpc", NULL },
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_MIPS), "mips", NULL },
> +    { SUBCLASS(PCI_CLASS_PROCESSOR_CO), "co-processor", NULL },
> +    { 0xFF, NULL, NULL },
> +};

I really really doubt that we'll ever see such a device on the spapr PCI
bus ... could you at least omit entries like "386", "486" and "alpha" ?

[...]
> +
> +static const PCISubClass spc_subclass[] = {
> +    { SUBCLASS(PCI_CLASS_SP_DPIO), "dpio", NULL },
> +    { SUBCLASS(PCI_CLASS_SP_PERF), "counter", NULL },
> +    { SUBCLASS(PCI_CLASS_SP_SYNCH), "measurement", NULL },
> +    { SUBCLASS(PCI_CLASS_SP_MANAGEMENT), "management-card", NULL },
> +    { 0xFF, NULL, NULL },
> +};
> +
> +static const PCIClass pci_classes[] = {
> +    { "unknown-legacy-device", undef_subclass },

Maybe just "legacy-device" instead of "unknown-legacy-device" ?

> +    { "mass-storage",  mass_subclass },
> +    { "network", net_subclass },
> +    { "display", displ_subclass, },
> +    { "multimedia-device", media_subclass },
> +    { "memory-controller", mem_subclass },
> +    { "unknown-bridge", bridg_subclass },
> +    { "communication-controller", comm_subclass},
> +    { "system-peripheral", sys_subclass },
> +    { "input-controller", inp_subclass },
> +    { "docking-station", dock_subclass },
> +    { "cpu", cpu_subclass },
> +    { "serial-bus", ser_subclass },
> +    { "wireless-controller", wrl_subclass },
> +    { "intelligent-io", NULL },
> +    { "satellite-device", sat_subclass },
> +    { "encryption", crypt_subclass },
> +    { "data-processing-controller", spc_subclass },
> +};
> +
> +static const char *pci_find_device_name(uint8_t class, uint8_t subclass,
> +                                        uint8_t iface)
> +{
> +    const PCIClass *pclass;
> +    const PCISubClass *psubclass;
> +    const PCIIFace *piface;
> +    const char *name;
> +
> +    if (class > (sizeof(pci_classes) / sizeof(PCIClass))) {

I think you could also use the ARRAY_SIZE macro here.

And shouldn't that rather be ">=" instead of ">" ?

> +        return "pci";
> +    }
> +
> +    pclass = pci_classes + class;
> +    name = pclass->name;
> +
> +    if (pclass->subc == NULL) {
> +        return name;
> +    }
> +
> +    psubclass = pclass->subc;
> +    while (psubclass->subclass != 0xff) {
> +        if (psubclass->subclass == subclass) {
> +            name = psubclass->name;
> +            break;
> +        }
> +        psubclass++;
> +    }
> +
> +    piface = psubclass->iface;
> +    if (piface == NULL) {
> +        return name;
> +    }
> +    while (piface->iface != 0xff) {
> +        if (piface->iface == iface) {
> +            name = piface->name;
> +            break;
> +        }
> +        piface++;
> +    }
> +
> +    return name;
> +}
[...]
> diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h
> index d98e6c9..42c86df 100644
> --- a/include/hw/pci/pci_ids.h
> +++ b/include/hw/pci/pci_ids.h
> @@ -12,41 +12,84 @@
>  
>  /* Device classes and subclasses */
>  
> -#define PCI_BASE_CLASS_STORAGE           0x01
> -#define PCI_BASE_CLASS_NETWORK           0x02
> +#define PCI_CLASS_NOT_DEFINED            0x0000
> +#define PCI_CLASS_NOT_DEFINED_VGA        0x0001
>  
> +#define PCI_BASE_CLASS_STORAGE           0x01
>  #define PCI_CLASS_STORAGE_SCSI           0x0100
>  #define PCI_CLASS_STORAGE_IDE            0x0101
> +#define PCI_CLASS_STORAGE_FLOPPY         0x0102
> +#define PCI_CLASS_STORAGE_IPI            0x0103
>  #define PCI_CLASS_STORAGE_RAID           0x0104
> +#define PCI_CLASS_STORAGE_ATA            0x0105
>  #define PCI_CLASS_STORAGE_SATA           0x0106
> +#define PCI_CLASS_STORAGE_SAS            0x0107
>  #define PCI_CLASS_STORAGE_EXPRESS        0x0108
>  #define PCI_CLASS_STORAGE_OTHER          0x0180
>  
> +#define PCI_BASE_CLASS_NETWORK           0x02
>  #define PCI_CLASS_NETWORK_ETHERNET       0x0200
> +#define PCI_CLASS_NETWORK_TOKEN_RING     0x0201
> +#define PCI_CLASS_NETWORK_FDDI           0x0202
> +#define PCI_CLASS_NETWORK_ATM            0x0203
> +#define PCI_CLASS_NETWORK_ISDN           0x0204
> +#define PCI_CLASS_NETWORK_WORDFIP        0x0205

I think it's WORLDFIP, not WORDFIP.

Also you should maybe put the updates to pci_ids.h into a separate
patch, so that the PCI maintainer can ACK it separately?

... apart from that, the patch looks very fine to me now, so if you've
at least address the ">=" vs. ">" issue, feel free to add my
"Reviewed-by: Thomas Huth <thuth@redhat.com>"

 Thomas

  reply	other threads:[~2015-09-24  9:01 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-23 12:14 [Qemu-devel] [PATCH v3] spapr: generate DT node names Laurent Vivier
2015-09-24  9:01 ` Thomas Huth [this message]
2015-09-24  9:34 ` Michael S. Tsirkin
2015-09-24  9:38   ` Laurent Vivier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5603BBF8.9070303@redhat.com \
    --to=thuth@redhat.com \
    --cc=agraf@suse.de \
    --cc=david@gibson.dropbear.id.au \
    --cc=lvivier@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.