[SLOF] [PATCH v2 11/19] virtio: add virtio 1.0 related struct and defines
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Fri Jan 22 16:14:49 AEDT 2016
Alexey Kardashevskiy <aik at ozlabs.ru> writes:
> On 01/20/2016 11:10 PM, Nikunj A Dadhania wrote:
>> Traditionally, struct virtio_device is shared between SLOF and C code.
>> This still remains shared with the addition of virtio_cap structure as
>> well. Now both virtio_device and virtio_cap structures are shared.
>>
>> Signed-off-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
>> ---
>> board-qemu/slof/virtio.fs | 17 +++++++++++++++++
>> include/byteorder.h | 4 ++++
>> lib/libvirtio/virtio.c | 19 +++++++++++++++++++
>> lib/libvirtio/virtio.h | 29 ++++++++++++++++++++++++++++-
>> 4 files changed, 68 insertions(+), 1 deletion(-)
>>
>> diff --git a/board-qemu/slof/virtio.fs b/board-qemu/slof/virtio.fs
>> index 818c132..64381b1 100644
>> --- a/board-qemu/slof/virtio.fs
>> +++ b/board-qemu/slof/virtio.fs
>> @@ -10,10 +10,27 @@
>> \ * IBM Corporation - initial implementation
>> \ ****************************************************************************/
>>
>> +\ This struct must match "struct virtio_cap" in virtio.h !
>> +STRUCT
>> + /n FIELD vd>cap>address
>> + /c FIELD vd>cap>bar
>> + /c FIELD vd>cap>is_io
>> + /c FIELD vd>cap>cap_id
>> + 5 FIELD vd>cap>pad
>> +CONSTANT /vd-cap-len
>> +
>> \ This struct must match "struct virtio_device" in virtio.h!
>> STRUCT
>> /n FIELD vd>base
>> /l FIELD vd>type
>> + /l FIELD vd>is-modern
>> + /vd-cap-len FIELD vd>legacy
>> + /vd-cap-len FIELD vd>common
>> + /vd-cap-len FIELD vd>notify
>> + /vd-cap-len FIELD vd>isr
>> + /vd-cap-len FIELD vd>device
>> + /vd-cap-len FIELD vd>pci
>> + /l FIELD vd>notify_off_mul
>> CONSTANT /vd-len
>>
>>
>> diff --git a/include/byteorder.h b/include/byteorder.h
>> index 8ae680f..d4a2c8c 100644
>> --- a/include/byteorder.h
>> +++ b/include/byteorder.h
>> @@ -19,6 +19,10 @@
>>
>> #include <stdint.h>
>>
>> +typedef uint16_t le16;
>> +typedef uint32_t le32;
>> +typedef uint64_t le64;
>> +
>> static inline uint16_t bswap_16 (uint16_t x)
>> {
>> return __builtin_bswap16(x);
>> diff --git a/lib/libvirtio/virtio.c b/lib/libvirtio/virtio.c
>> index 3a75e44..3f6859b 100644
>> --- a/lib/libvirtio/virtio.c
>> +++ b/lib/libvirtio/virtio.c
>> @@ -31,6 +31,25 @@
>> #define VIRTIOHDR_ISR_STATUS 19
>> #define VIRTIOHDR_DEVICE_CONFIG 20
>>
>> +struct virtio_dev_common {
>> + le32 dev_features_sel;
>> + le32 dev_features;
>> + le32 drv_features_sel;
>> + le32 drv_features;
>> + le16 msix_config;
>> + le16 num_queues;
>> + uint8_t dev_status;
>> + uint8_t cfg_generation;
>> +
>> + le16 q_select;
>> + le16 q_size;
>> + le16 q_msix_vec;
>> + le16 q_enable;
>> + le16 q_notify_off;
>> + le64 q_desc;
>> + le64 q_avail;
>> + le64 q_used;
>> +} __attribute__ ((packed));
>>
>> /**
>> * Calculate ring size according to queue size number
>> diff --git a/lib/libvirtio/virtio.h b/lib/libvirtio/virtio.h
>> index c26282f..4bb9619 100644
>> --- a/lib/libvirtio/virtio.h
>> +++ b/lib/libvirtio/virtio.h
>> @@ -20,8 +20,17 @@
>> #define VIRTIO_STAT_ACKNOWLEDGE 1
>> #define VIRTIO_STAT_DRIVER 2
>> #define VIRTIO_STAT_DRIVER_OK 4
>> +#define VIRTIO_STAT_FEATURES_OK 8
>> +#define VIRTIO_STAT_NEEDS_RESET 64
>> #define VIRTIO_STAT_FAILED 128
>>
>> +#define BIT(x) (1UL << (x))
>> +
>> +/* VIRTIO 1.0 Device independent feature bits */
>> +#define VIRTIO_F_RING_INDIRECT_DESC BIT(28)
>> +#define VIRTIO_F_RING_EVENT_IDX BIT(29)
>> +#define VIRTIO_F_VERSION_1 BIT(32)
>> +
>> #define VIRTIO_TIMEOUT 5000 /* 5 sec timeout */
>>
>> /* Definitions for vring_desc.flags */
>> @@ -62,10 +71,28 @@ struct vring_used {
>> };
>>
>> #define VIRTIO_TYPE_PCI 0 /* For virtio-pci interface */
>> +
>> +/* Structure shared with SLOF and is 16bytes */
>> +struct virtio_cap {
>> + void *addr;
>> + uint8_t bar;
>> + uint8_t is_io;
>> + uint8_t cap_id;
>> + uint8_t pad[5];
>> +} __attribute__ ((packed));
>> +
>> struct virtio_device {
>> void *base; /* base address */
>> int type; /* VIRTIO_TYPE_PCI or VIRTIO_TYPE_VIO */
>> -};
>> + int is_modern; /* Indicates whether to use virtio 1.0 */
>
> Make it uint8_t (plug padding or uint32_t) as the rest of the struct uses
> strict binary types
Will make this as uint32_t.
> (except type which this will go in the next respin if I am not
> mistaken, right?).
Will take it as a different patchset.
Regards
Nikunj
More information about the SLOF
mailing list