All of lore.kernel.org
 help / color / mirror / Atom feed
From: longpeng2--- via <qemu-devel@nongnu.org>
To: Jason Wang <jasowang@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>, mst <mst@redhat.com>,
	"Stefano Garzarella" <sgarzare@redhat.com>,
	Cornelia Huck <cohuck@redhat.com>, pbonzini <pbonzini@redhat.com>,
	"Gonglei (Arei)" <arei.gonglei@huawei.com>,
	Yechuan <yechuan@huawei.com>,
	Huangzhichao <huangzhichao@huawei.com>,
	qemu-devel <qemu-devel@nongnu.org>
Subject: RE: [RFC 01/10] virtio: get class_id and pci device id by the virtio id
Date: Mon, 10 Jan 2022 03:03:06 +0000	[thread overview]
Message-ID: <bd8270c9fea04cf4ae93948480d379b6@huawei.com> (raw)
In-Reply-To: <CACGkMEuoDJc7VP8VoxLG3fLk4-WF7SK7SrKT9U=J1T_8Lz1nHA@mail.gmail.com>



> -----Original Message-----
> From: Jason Wang [mailto:jasowang@redhat.com]
> Sent: Wednesday, January 5, 2022 2:15 PM
> To: Longpeng (Mike, Cloud Infrastructure Service Product Dept.)
> <longpeng2@huawei.com>
> Cc: Stefan Hajnoczi <stefanha@redhat.com>; mst <mst@redhat.com>; Stefano
> Garzarella <sgarzare@redhat.com>; Cornelia Huck <cohuck@redhat.com>; pbonzini
> <pbonzini@redhat.com>; Gonglei (Arei) <arei.gonglei@huawei.com>; Yechuan
> <yechuan@huawei.com>; Huangzhichao <huangzhichao@huawei.com>; qemu-devel
> <qemu-devel@nongnu.org>
> Subject: Re: [RFC 01/10] virtio: get class_id and pci device id by the virtio
> id
> 
> On Wed, Jan 5, 2022 at 1:48 PM Longpeng (Mike, Cloud Infrastructure
> Service Product Dept.) <longpeng2@huawei.com> wrote:
> >
> >
> >
> > > -----Original Message-----
> > > From: Jason Wang [mailto:jasowang@redhat.com]
> > > Sent: Wednesday, January 5, 2022 12:38 PM
> > > To: Longpeng (Mike, Cloud Infrastructure Service Product Dept.)
> > > <longpeng2@huawei.com>
> > > Cc: Stefan Hajnoczi <stefanha@redhat.com>; mst <mst@redhat.com>; Stefano
> > > Garzarella <sgarzare@redhat.com>; Cornelia Huck <cohuck@redhat.com>;
> pbonzini
> > > <pbonzini@redhat.com>; Gonglei (Arei) <arei.gonglei@huawei.com>; Yechuan
> > > <yechuan@huawei.com>; Huangzhichao <huangzhichao@huawei.com>; qemu-devel
> > > <qemu-devel@nongnu.org>
> > > Subject: Re: [RFC 01/10] virtio: get class_id and pci device id by the virtio
> > > id
> > >
> > > On Wed, Jan 5, 2022 at 8:59 AM Longpeng(Mike) <longpeng2@huawei.com> wrote:
> > > >
> > > > From: Longpeng <longpeng2@huawei.com>
> > > >
> > > > Add helpers to get the "Transitional PCI Device ID" and "class_id" of the
> > > > deivce which is specificed by the "Virtio Device ID".
> > > >
> > > > These helpers will be used to build the generic vDPA device later.
> > > >
> > > > Signed-off-by: Longpeng <longpeng2@huawei.com>
> > > > ---
> > > >  hw/virtio/virtio-pci.c | 93 ++++++++++++++++++++++++++++++++++++++++++
> > > >  hw/virtio/virtio-pci.h |  4 ++
> > > >  2 files changed, 97 insertions(+)
> > > >
> > > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c
> > > > index 750aa47ec1..843085c4ea 100644
> > > > --- a/hw/virtio/virtio-pci.c
> > > > +++ b/hw/virtio/virtio-pci.c
> > > > @@ -19,6 +19,7 @@
> > > >
> > > >  #include "exec/memop.h"
> > > >  #include "standard-headers/linux/virtio_pci.h"
> > > > +#include "standard-headers/linux/virtio_ids.h"
> > > >  #include "hw/boards.h"
> > > >  #include "hw/virtio/virtio.h"
> > > >  #include "migration/qemu-file-types.h"
> > > > @@ -213,6 +214,95 @@ static int virtio_pci_load_queue(DeviceState *d, int
> n,
> > > QEMUFile *f)
> > > >      return 0;
> > > >  }
> > > >
> > > > +typedef struct VirtIOPCIIDInfo {
> > > > +    uint16_t vdev_id; /* virtio id */
> > > > +    uint16_t pdev_id; /* pci device id */
> > > > +    uint16_t class_id;
> > > > +} VirtIOPCIIDInfo;
> > > > +
> > > > +static const VirtIOPCIIDInfo virtio_pci_id_info[] = {
> > > > +    {
> > >
> > > Any way to get rid of this array? E.g using the algorithm that is used
> > > by the kernel virtio driver.
> > >
> >
> > For device id, we can use the algorithm if we no need to support
> > Transitional id. But how to get the class id ?
> 
> Right, I miss this. So the current code should be fine.
> 

Maybe the following way would be better? It can save about 40 lines.

#define VIRTIO_PCI_ID_INFO(name, class)   \
    {VIRTIO_ID_##name, PCI_DEVICE_ID_VIRTIO_##name, class}

static const VirtIOPCIIDInfo virtio_pci_id_info[] = {
    VIRTIO_PCI_ID_INFO(NET,     PCI_CLASS_NETWORK_ETHERNET),
    VIRTIO_PCI_ID_INFO(BLOCK,   PCI_CLASS_STORAGE_SCSI),
    VIRTIO_PCI_ID_INFO(SCSI,    PCI_CLASS_STORAGE_SCSI),
    VIRTIO_PCI_ID_INFO(CONSOLE, PCI_CLASS_COMMUNICATION_OTHER),
    VIRTIO_PCI_ID_INFO(VSOCK,   PCI_CLASS_COMMUNICATION_OTHER),
    VIRTIO_PCI_ID_INFO(IOMMU,   PCI_CLASS_OTHERS),
    VIRTIO_PCI_ID_INFO(MEM,     PCI_CLASS_OTHERS),
    VIRTIO_PCI_ID_INFO(PMEM,    PCI_CLASS_OTHERS),
    VIRTIO_PCI_ID_INFO(RNG,     PCI_CLASS_OTHERS),
    VIRTIO_PCI_ID_INFO(BALLOON, PCI_CLASS_OTHERS),
    VIRTIO_PCI_ID_INFO(9P,      PCI_BASE_CLASS_NETWORK),
};


> Thanks
> 
> >
> > > Thanks
> > >
> > > > +        .vdev_id = VIRTIO_ID_NET,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_NET,
> > > > +        .class_id = PCI_CLASS_NETWORK_ETHERNET,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_BLOCK,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_BLOCK,
> > > > +        .class_id = PCI_CLASS_STORAGE_SCSI,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_CONSOLE,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_CONSOLE,
> > > > +        .class_id = PCI_CLASS_COMMUNICATION_OTHER,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_SCSI,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_SCSI,
> > > > +        .class_id = PCI_CLASS_STORAGE_SCSI,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_9P,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_9P,
> > > > +        .class_id = PCI_BASE_CLASS_NETWORK,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_VSOCK,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_VSOCK,
> > > > +        .class_id = PCI_CLASS_COMMUNICATION_OTHER,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_IOMMU,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_IOMMU,
> > > > +        .class_id = PCI_CLASS_OTHERS,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_MEM,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_MEM,
> > > > +        .class_id = PCI_CLASS_OTHERS,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_PMEM,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_PMEM,
> > > > +        .class_id = PCI_CLASS_OTHERS,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_RNG,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_RNG,
> > > > +        .class_id = PCI_CLASS_OTHERS,
> > > > +    },
> > > > +    {
> > > > +        .vdev_id = VIRTIO_ID_BALLOON,
> > > > +        .pdev_id = PCI_DEVICE_ID_VIRTIO_BALLOON,
> > > > +        .class_id = PCI_CLASS_OTHERS,
> > > > +    },
> > > > +};
> > > > +
> > > > +static VirtIOPCIIDInfo virtio_pci_get_id_info(uint16_t vdev_id)
> > > > +{
> > > > +    VirtIOPCIIDInfo info = {};
> > > > +    int i;
> > > > +
> > > > +    for (i = 0; i < ARRAY_SIZE(virtio_pci_id_info); i++) {
> > > > +        if (virtio_pci_id_info[i].vdev_id == vdev_id) {
> > > > +            info = virtio_pci_id_info[i];
> > > > +            break;
> > > > +        }
> > > > +    }
> > > > +
> > > > +    return info;
> > > > +}
> > > > +
> > > > +uint16_t virtio_pci_get_pci_devid(uint16_t device_id)
> > > > +{
> > > > +    return virtio_pci_get_id_info(device_id).pdev_id;
> > > > +}
> > > > +
> > > > +uint16_t virtio_pci_get_class_id(uint16_t device_id)
> > > > +{
> > > > +    return virtio_pci_get_id_info(device_id).class_id;
> > > > +}
> > > > +
> > > >  static bool virtio_pci_ioeventfd_enabled(DeviceState *d)
> > > >  {
> > > >      VirtIOPCIProxy *proxy = to_virtio_pci_proxy(d);
> > > > @@ -1674,6 +1764,9 @@ static void virtio_pci_device_plugged(DeviceState
> *d,
> > > Error **errp)
> > > >           * is set to PCI_SUBVENDOR_ID_REDHAT_QUMRANET by default.
> > > >           */
> > > >          pci_set_word(config + PCI_SUBSYSTEM_ID,
> > > virtio_bus_get_vdev_id(bus));
> > > > +        if (proxy->pdev_id) {
> > > > +            pci_config_set_device_id(config, proxy->pdev_id);
> > > > +        }
> > > >      } else {
> > > >          /* pure virtio-1.0 */
> > > >          pci_set_word(config + PCI_VENDOR_ID,
> > > > diff --git a/hw/virtio/virtio-pci.h b/hw/virtio/virtio-pci.h
> > > > index 2446dcd9ae..06aa59436e 100644
> > > > --- a/hw/virtio/virtio-pci.h
> > > > +++ b/hw/virtio/virtio-pci.h
> > > > @@ -146,6 +146,7 @@ struct VirtIOPCIProxy {
> > > >      bool disable_modern;
> > > >      bool ignore_backend_features;
> > > >      OnOffAuto disable_legacy;
> > > > +    uint16_t pdev_id;
> > > >      uint32_t class_code;
> > > >      uint32_t nvectors;
> > > >      uint32_t dfselect;
> > > > @@ -158,6 +159,9 @@ struct VirtIOPCIProxy {
> > > >      VirtioBusState bus;
> > > >  };
> > > >
> > > > +uint16_t virtio_pci_get_pci_devid(uint16_t device_id);
> > > > +uint16_t virtio_pci_get_class_id(uint16_t device_id);
> > > > +
> > > >  static inline bool virtio_pci_modern(VirtIOPCIProxy *proxy)
> > > >  {
> > > >      return !proxy->disable_modern;
> > > > --
> > > > 2.23.0
> > > >
> >


  reply	other threads:[~2022-01-10  3:04 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-01-05  0:58 [RFC 00/10] add generic vDPA device support Longpeng(Mike) via
2022-01-05  0:58 ` [RFC 01/10] virtio: get class_id and pci device id by the virtio id Longpeng(Mike) via
2022-01-05  4:37   ` Jason Wang
2022-01-05  5:47     ` longpeng2--- via
2022-01-05  6:15       ` Jason Wang
2022-01-10  3:03         ` longpeng2--- via [this message]
2022-01-05 10:46   ` Cornelia Huck
2022-01-06  1:50     ` longpeng2--- via
2022-01-10  5:43   ` Michael S. Tsirkin
2022-01-10  6:27     ` longpeng2--- via
2022-01-10  7:14       ` Michael S. Tsirkin
2022-01-05  0:58 ` [RFC 02/10] vhost: add 3 commands for vhost-vdpa Longpeng(Mike) via
2022-01-05  4:35   ` Jason Wang
2022-01-05  6:40     ` longpeng2--- via
2022-01-05  6:43       ` Jason Wang
2022-01-05  7:02     ` Michael S. Tsirkin
2022-01-05  7:54       ` Jason Wang
2022-01-05  8:37         ` longpeng2--- via
2022-01-05  9:09           ` Jason Wang
2022-01-05 12:26             ` Michael S. Tsirkin
2022-01-06  2:34               ` Jason Wang
2022-01-06  8:00                 ` longpeng2--- via
2022-01-07  2:41                   ` Jason Wang
2022-01-06 14:09                 ` Michael S. Tsirkin
2022-01-07  2:53                   ` Jason Wang
2022-01-05  9:12         ` Michael S. Tsirkin
2022-01-05  9:21           ` Jason Wang
2022-01-05  0:58 ` [RFC 03/10] vdpa: add the infrastructure of vdpa-dev Longpeng(Mike) via
2022-01-05  9:48   ` Stefan Hajnoczi
2022-01-06  1:22     ` longpeng2--- via
2022-01-06 11:25       ` Stefan Hajnoczi
2022-01-07  2:22         ` Jason Wang
2022-01-05  0:58 ` [RFC 04/10] vdpa-dev: implement the instance_init/class_init interface Longpeng(Mike) via
2022-01-05 10:00   ` Stefan Hajnoczi
2022-01-06  2:39     ` longpeng2--- via
2022-01-05 11:28   ` Stefano Garzarella
2022-01-06  2:40     ` longpeng2--- via
2022-01-05  0:58 ` [RFC 05/10] vdpa-dev: implement the realize interface Longpeng(Mike) via
2022-01-05 10:17   ` Stefan Hajnoczi
2022-01-06  3:02     ` longpeng2--- via
2022-01-06 11:34       ` Stefan Hajnoczi
2022-01-17 12:34         ` longpeng2--- via
2022-01-19 17:15           ` Stefan Hajnoczi
2022-01-05  0:58 ` [RFC 06/10] vdpa-dev: implement the unrealize interface Longpeng(Mike) via
2022-01-05 11:16   ` Stefano Garzarella
2022-01-06  3:23     ` longpeng2--- via
2022-01-10  9:38       ` Stefano Garzarella
2022-01-05  0:58 ` [RFC 07/10] vdpa-dev: implement the get_config/set_config interface Longpeng(Mike) via
2022-01-05  0:58 ` [RFC 08/10] vdpa-dev: implement the get_features interface Longpeng(Mike) via
2022-01-05  0:58 ` [RFC 09/10] vdpa-dev: implement the set_status interface Longpeng(Mike) via
2022-01-05  0:59 ` [RFC 10/10] vdpa-dev: mark the device as unmigratable Longpeng(Mike) via
2022-01-05 10:21 ` [RFC 00/10] add generic vDPA device support Stefan Hajnoczi

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=bd8270c9fea04cf4ae93948480d379b6@huawei.com \
    --to=qemu-devel@nongnu.org \
    --cc=arei.gonglei@huawei.com \
    --cc=cohuck@redhat.com \
    --cc=huangzhichao@huawei.com \
    --cc=jasowang@redhat.com \
    --cc=longpeng2@huawei.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=sgarzare@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=yechuan@huawei.com \
    /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.