* [PATCH v2 0/4] add support for virtio-mmio 1.0 @ 2021-08-16 7:11 Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 1/4] OvmfPkg/Virtio10: Add virtio-mmio 1.0 defines Gerd Hoffmann ` (3 more replies) 0 siblings, 4 replies; 8+ messages in thread From: Gerd Hoffmann @ 2021-08-16 7:11 UTC (permalink / raw) To: devel; +Cc: Gerd Hoffmann This little series adds virtio 1.0 support for the virtio-mmio transport. For the mmio transport the difference between 0.9.5 and 1.0 is rather small (when compared to the pci transport), it is just a bunch of new registers for the changed virtio queue initialization. So the patch series is small too ... v2 changes: - Added review tags for patches #1 + #2. - Add a patch to make sure we have a valid QueueNum. - Add a patch to support all 64 virtio 1.0 feature bits. take care, Gerd Gerd Hoffmann (4): OvmfPkg/Virtio10: Add virtio-mmio 1.0 defines OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support. OvmfPkg/VirtioMmioDeviceLib: Add default QueueNum for virtio 1.0 OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 feature bit handling OvmfPkg/Include/IndustryStandard/Virtio10.h | 12 ++++ .../VirtioMmioDeviceLib/VirtioMmioDevice.h | 2 + .../VirtioMmioDeviceLib/VirtioMmioDevice.c | 17 +++-- .../VirtioMmioDeviceFunctions.c | 71 ++++++++++++++++--- 4 files changed, 89 insertions(+), 13 deletions(-) -- 2.31.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 1/4] OvmfPkg/Virtio10: Add virtio-mmio 1.0 defines 2021-08-16 7:11 [PATCH v2 0/4] add support for virtio-mmio 1.0 Gerd Hoffmann @ 2021-08-16 7:11 ` Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support Gerd Hoffmann ` (2 subsequent siblings) 3 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2021-08-16 7:11 UTC (permalink / raw) To: devel; +Cc: Gerd Hoffmann, Philippe Mathieu-Daude Add defines for the config space offsets for virtio 1.0 mmio transport. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com> --- OvmfPkg/Include/IndustryStandard/Virtio10.h | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/OvmfPkg/Include/IndustryStandard/Virtio10.h b/OvmfPkg/Include/IndustryStandard/Virtio10.h index 2c60be2b7c0c..a1712247e054 100644 --- a/OvmfPkg/Include/IndustryStandard/Virtio10.h +++ b/OvmfPkg/Include/IndustryStandard/Virtio10.h @@ -81,4 +81,16 @@ typedef struct { #define VIRTIO_F_VERSION_1 BIT32 #define VIRTIO_F_IOMMU_PLATFORM BIT33 +// +// MMIO VirtIo Header Offsets +// +#define VIRTIO_MMIO_OFFSET_QUEUE_READY 0x44 +#define VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO 0x80 +#define VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI 0x84 +#define VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO 0x90 +#define VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI 0x94 +#define VIRTIO_MMIO_OFFSET_QUEUE_USED_LO 0xa0 +#define VIRTIO_MMIO_OFFSET_QUEUE_USED_HI 0xa4 +#define VIRTIO_MMIO_OFFSET_CONFIG_GENERATION 0xfc + #endif // _VIRTIO_1_0_H_ -- 2.31.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support. 2021-08-16 7:11 [PATCH v2 0/4] add support for virtio-mmio 1.0 Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 1/4] OvmfPkg/Virtio10: Add virtio-mmio 1.0 defines Gerd Hoffmann @ 2021-08-16 7:11 ` Gerd Hoffmann 2021-08-16 13:35 ` [edk2-devel] " Yao, Jiewen [not found] ` <169BCCE38BFCC61F.3513@groups.io> 2021-08-16 7:11 ` [PATCH v2 3/4] OvmfPkg/VirtioMmioDeviceLib: Add default QueueNum for virtio 1.0 Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 4/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 feature bit handling Gerd Hoffmann 3 siblings, 2 replies; 8+ messages in thread From: Gerd Hoffmann @ 2021-08-16 7:11 UTC (permalink / raw) To: devel; +Cc: Gerd Hoffmann, Philippe Mathieu-Daude Add support for virtio 1.0 to the mmio transport. virtio 0.9.5 uses page size, page frame number and a fixed layout for the ring. virtio 1.0 uses the physical addresses for base address, used bits and available bits instead. The ring layout is not changed, so a 0.9.5 compatible layout is used in both 0.9.5 and 1.0 mode to to keep the code differences as small as possible. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com> --- .../VirtioMmioDeviceLib/VirtioMmioDevice.h | 1 + .../VirtioMmioDeviceLib/VirtioMmioDevice.c | 17 +++++++--- .../VirtioMmioDeviceFunctions.c | 31 +++++++++++++++++-- 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h index ab53b90d51c9..8b19996b716f 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h @@ -26,6 +26,7 @@ typedef struct { UINT32 Signature; + UINT32 Version; VIRTIO_DEVICE_PROTOCOL VirtioDevice; PHYSICAL_ADDRESS BaseAddress; } VIRTIO_MMIO_DEVICE; diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c index 6dbbba008c75..a8f78a50861b 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c @@ -58,7 +58,6 @@ VirtioMmioInit ( ) { UINT32 MagicValue; - UINT32 Version; // // Initialize VirtIo Mmio Device @@ -66,7 +65,6 @@ VirtioMmioInit ( CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate, sizeof (VIRTIO_DEVICE_PROTOCOL)); Device->BaseAddress = BaseAddress; - Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); Device->VirtioDevice.SubSystemDeviceId = MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID); @@ -78,8 +76,19 @@ VirtioMmioInit ( return EFI_UNSUPPORTED; } - Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); - if (Version != 1) { + Device->Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); + switch (Device->Version) { + case 1: + DEBUG ((DEBUG_INFO, "%a virtio 0.9.5, id %d\n", __FUNCTION__, + Device->VirtioDevice.SubSystemDeviceId)); + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); + break; + case 2: + DEBUG ((DEBUG_INFO, "%a virtio 1.0, id %d\n", __FUNCTION__, + Device->VirtioDevice.SubSystemDeviceId)); + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0); + break; + default: return EFI_UNSUPPORTED; } diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c index b0d75fb1dd24..bf8523a6fb3b 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c @@ -151,7 +151,9 @@ VirtioMmioSetPageSize ( Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, PageSize); + if (Device->Version == 1) { + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, PageSize); + } return EFI_SUCCESS; } @@ -181,13 +183,36 @@ VirtioMmioSetQueueAddress ( ) { VIRTIO_MMIO_DEVICE *Device; + UINT64 Address; ASSERT (RingBaseShift == 0); Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, - (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); + if (Device->Version == 1) { + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, + (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); + } else { + Address = (UINT64)Ring->Base; + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO, + (UINT32)Address); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI, + (UINT32)RShiftU64(Address, 32)); + + Address = (UINT64)Ring->Avail.Flags; + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO, + (UINT32)Address); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI, + (UINT32)RShiftU64(Address, 32)); + + Address = (UINT64)Ring->Used.Flags; + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO, + (UINT32)Address); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI, + (UINT32)RShiftU64(Address, 32)); + + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1); + } return EFI_SUCCESS; } -- 2.31.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [edk2-devel] [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support. 2021-08-16 7:11 ` [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support Gerd Hoffmann @ 2021-08-16 13:35 ` Yao, Jiewen 2021-08-16 16:04 ` Philippe Mathieu-Daudé [not found] ` <169BCCE38BFCC61F.3513@groups.io> 1 sibling, 1 reply; 8+ messages in thread From: Yao, Jiewen @ 2021-08-16 13:35 UTC (permalink / raw) To: devel@edk2.groups.io, kraxel@redhat.com; +Cc: Philippe Mathieu-Daude Hi Greg Can we define MACRO to replace 1 or 2? That is very confusing. For example, #define VIRT_IO_DEVICE_VERSION_0_95 1 #define VIRT_IO_DEVICE_VERSION_1_00 2 Thank you Yao Jiewen > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Gerd > Hoffmann > Sent: Monday, August 16, 2021 3:11 PM > To: devel@edk2.groups.io > Cc: Gerd Hoffmann <kraxel@redhat.com>; Philippe Mathieu-Daude > <philmd@redhat.com> > Subject: [edk2-devel] [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio > 1.0 support. > > Add support for virtio 1.0 to the mmio transport. virtio 0.9.5 uses > page size, page frame number and a fixed layout for the ring. virtio > 1.0 uses the physical addresses for base address, used bits and > available bits instead. > > The ring layout is not changed, so a 0.9.5 compatible layout is used in > both 0.9.5 and 1.0 mode to to keep the code differences as small as > possible. > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com> > --- > .../VirtioMmioDeviceLib/VirtioMmioDevice.h | 1 + > .../VirtioMmioDeviceLib/VirtioMmioDevice.c | 17 +++++++--- > .../VirtioMmioDeviceFunctions.c | 31 +++++++++++++++++-- > 3 files changed, 42 insertions(+), 7 deletions(-) > > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > index ab53b90d51c9..8b19996b716f 100644 > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > @@ -26,6 +26,7 @@ > > typedef struct { > UINT32 Signature; > + UINT32 Version; > VIRTIO_DEVICE_PROTOCOL VirtioDevice; > PHYSICAL_ADDRESS BaseAddress; > } VIRTIO_MMIO_DEVICE; > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > index 6dbbba008c75..a8f78a50861b 100644 > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > @@ -58,7 +58,6 @@ VirtioMmioInit ( > ) > { > UINT32 MagicValue; > - UINT32 Version; > > // > // Initialize VirtIo Mmio Device > @@ -66,7 +65,6 @@ VirtioMmioInit ( > CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate, > sizeof (VIRTIO_DEVICE_PROTOCOL)); > Device->BaseAddress = BaseAddress; > - Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); > Device->VirtioDevice.SubSystemDeviceId = > MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID); > > @@ -78,8 +76,19 @@ VirtioMmioInit ( > return EFI_UNSUPPORTED; > } > > - Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); > - if (Version != 1) { > + Device->Version = VIRTIO_CFG_READ (Device, > VIRTIO_MMIO_OFFSET_VERSION); > + switch (Device->Version) { > + case 1: > + DEBUG ((DEBUG_INFO, "%a virtio 0.9.5, id %d\n", __FUNCTION__, > + Device->VirtioDevice.SubSystemDeviceId)); > + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); > + break; > + case 2: > + DEBUG ((DEBUG_INFO, "%a virtio 1.0, id %d\n", __FUNCTION__, > + Device->VirtioDevice.SubSystemDeviceId)); > + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0); > + break; > + default: > return EFI_UNSUPPORTED; > } > > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > index b0d75fb1dd24..bf8523a6fb3b 100644 > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > @@ -151,7 +151,9 @@ VirtioMmioSetPageSize ( > > Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); > > - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, > PageSize); > + if (Device->Version == 1) { > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, > PageSize); > + } > > return EFI_SUCCESS; > } > @@ -181,13 +183,36 @@ VirtioMmioSetQueueAddress ( > ) > { > VIRTIO_MMIO_DEVICE *Device; > + UINT64 Address; > > ASSERT (RingBaseShift == 0); > > Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); > > - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, > - (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); > + if (Device->Version == 1) { > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, > + (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); > + } else { > + Address = (UINT64)Ring->Base; > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO, > + (UINT32)Address); > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI, > + (UINT32)RShiftU64(Address, 32)); > + > + Address = (UINT64)Ring->Avail.Flags; > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO, > + (UINT32)Address); > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI, > + (UINT32)RShiftU64(Address, 32)); > + > + Address = (UINT64)Ring->Used.Flags; > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO, > + (UINT32)Address); > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI, > + (UINT32)RShiftU64(Address, 32)); > + > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1); > + } > > return EFI_SUCCESS; > } > -- > 2.31.1 > > > > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [edk2-devel] [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support. 2021-08-16 13:35 ` [edk2-devel] " Yao, Jiewen @ 2021-08-16 16:04 ` Philippe Mathieu-Daudé 0 siblings, 0 replies; 8+ messages in thread From: Philippe Mathieu-Daudé @ 2021-08-16 16:04 UTC (permalink / raw) To: devel, jiewen.yao, kraxel@redhat.com On 8/16/21 3:35 PM, Yao, Jiewen wrote: > Hi Greg > Can we define MACRO to replace 1 or 2? That is very confusing. > > For example, > #define VIRT_IO_DEVICE_VERSION_0_95 1 > #define VIRT_IO_DEVICE_VERSION_1_00 2 Good idea. > > Thank you > Yao Jiewen ^ permalink raw reply [flat|nested] 8+ messages in thread
[parent not found: <169BCCE38BFCC61F.3513@groups.io>]
* Re: [edk2-devel] [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support. [not found] ` <169BCCE38BFCC61F.3513@groups.io> @ 2021-08-16 13:37 ` Yao, Jiewen 0 siblings, 0 replies; 8+ messages in thread From: Yao, Jiewen @ 2021-08-16 13:37 UTC (permalink / raw) To: devel@edk2.groups.io, Yao, Jiewen, kraxel@redhat.com Cc: Philippe Mathieu-Daude HI Gerd I apologize for the mistake on name. I should call you Gerd, not Greg. Thank you Yao Jiewen > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Yao, Jiewen > Sent: Monday, August 16, 2021 9:36 PM > To: devel@edk2.groups.io; kraxel@redhat.com > Cc: Philippe Mathieu-Daude <philmd@redhat.com> > Subject: Re: [edk2-devel] [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add > virtio 1.0 support. > > Hi Greg > Can we define MACRO to replace 1 or 2? That is very confusing. > > For example, > #define VIRT_IO_DEVICE_VERSION_0_95 1 > #define VIRT_IO_DEVICE_VERSION_1_00 2 > > Thank you > Yao Jiewen > > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Gerd > > Hoffmann > > Sent: Monday, August 16, 2021 3:11 PM > > To: devel@edk2.groups.io > > Cc: Gerd Hoffmann <kraxel@redhat.com>; Philippe Mathieu-Daude > > <philmd@redhat.com> > > Subject: [edk2-devel] [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add > virtio > > 1.0 support. > > > > Add support for virtio 1.0 to the mmio transport. virtio 0.9.5 uses > > page size, page frame number and a fixed layout for the ring. virtio > > 1.0 uses the physical addresses for base address, used bits and > > available bits instead. > > > > The ring layout is not changed, so a 0.9.5 compatible layout is used in > > both 0.9.5 and 1.0 mode to to keep the code differences as small as > > possible. > > > > Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> > > Reviewed-by: Philippe Mathieu-Daude <philmd@redhat.com> > > --- > > .../VirtioMmioDeviceLib/VirtioMmioDevice.h | 1 + > > .../VirtioMmioDeviceLib/VirtioMmioDevice.c | 17 +++++++--- > > .../VirtioMmioDeviceFunctions.c | 31 +++++++++++++++++-- > > 3 files changed, 42 insertions(+), 7 deletions(-) > > > > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > > b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > > index ab53b90d51c9..8b19996b716f 100644 > > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h > > @@ -26,6 +26,7 @@ > > > > typedef struct { > > UINT32 Signature; > > + UINT32 Version; > > VIRTIO_DEVICE_PROTOCOL VirtioDevice; > > PHYSICAL_ADDRESS BaseAddress; > > } VIRTIO_MMIO_DEVICE; > > diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > > b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > > index 6dbbba008c75..a8f78a50861b 100644 > > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.c > > @@ -58,7 +58,6 @@ VirtioMmioInit ( > > ) > > { > > UINT32 MagicValue; > > - UINT32 Version; > > > > // > > // Initialize VirtIo Mmio Device > > @@ -66,7 +65,6 @@ VirtioMmioInit ( > > CopyMem (&Device->VirtioDevice, &mMmioDeviceProtocolTemplate, > > sizeof (VIRTIO_DEVICE_PROTOCOL)); > > Device->BaseAddress = BaseAddress; > > - Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); > > Device->VirtioDevice.SubSystemDeviceId = > > MmioRead32 (BaseAddress + VIRTIO_MMIO_OFFSET_DEVICE_ID); > > > > @@ -78,8 +76,19 @@ VirtioMmioInit ( > > return EFI_UNSUPPORTED; > > } > > > > - Version = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_VERSION); > > - if (Version != 1) { > > + Device->Version = VIRTIO_CFG_READ (Device, > > VIRTIO_MMIO_OFFSET_VERSION); > > + switch (Device->Version) { > > + case 1: > > + DEBUG ((DEBUG_INFO, "%a virtio 0.9.5, id %d\n", __FUNCTION__, > > + Device->VirtioDevice.SubSystemDeviceId)); > > + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (0, 9, 5); > > + break; > > + case 2: > > + DEBUG ((DEBUG_INFO, "%a virtio 1.0, id %d\n", __FUNCTION__, > > + Device->VirtioDevice.SubSystemDeviceId)); > > + Device->VirtioDevice.Revision = VIRTIO_SPEC_REVISION (1, 0, 0); > > + break; > > + default: > > return EFI_UNSUPPORTED; > > } > > > > diff --git > a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > > b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > > index b0d75fb1dd24..bf8523a6fb3b 100644 > > --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > > +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c > > @@ -151,7 +151,9 @@ VirtioMmioSetPageSize ( > > > > Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); > > > > - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, > > PageSize); > > + if (Device->Version == 1) { > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_PAGE_SIZE, > > PageSize); > > + } > > > > return EFI_SUCCESS; > > } > > @@ -181,13 +183,36 @@ VirtioMmioSetQueueAddress ( > > ) > > { > > VIRTIO_MMIO_DEVICE *Device; > > + UINT64 Address; > > > > ASSERT (RingBaseShift == 0); > > > > Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); > > > > - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, > > - (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); > > + if (Device->Version == 1) { > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, > > + (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); > > + } else { > > + Address = (UINT64)Ring->Base; > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO, > > + (UINT32)Address); > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_HI, > > + (UINT32)RShiftU64(Address, 32)); > > + > > + Address = (UINT64)Ring->Avail.Flags; > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_LO, > > + (UINT32)Address); > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_AVAIL_HI, > > + (UINT32)RShiftU64(Address, 32)); > > + > > + Address = (UINT64)Ring->Used.Flags; > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_LO, > > + (UINT32)Address); > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_USED_HI, > > + (UINT32)RShiftU64(Address, 32)); > > + > > + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_READY, 1); > > + } > > > > return EFI_SUCCESS; > > } > > -- > > 2.31.1 > > > > > > > > > > > > > > > ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 3/4] OvmfPkg/VirtioMmioDeviceLib: Add default QueueNum for virtio 1.0 2021-08-16 7:11 [PATCH v2 0/4] add support for virtio-mmio 1.0 Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 1/4] OvmfPkg/Virtio10: Add virtio-mmio 1.0 defines Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support Gerd Hoffmann @ 2021-08-16 7:11 ` Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 4/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 feature bit handling Gerd Hoffmann 3 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2021-08-16 7:11 UTC (permalink / raw) To: devel; +Cc: Gerd Hoffmann Use QueueNumMax as QueueNum default for drivers which do not explicitly call VIRTIO_DEVICE_PROTOCOL->SetQueueSize(). Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- .../Library/VirtioMmioDeviceLib/VirtioMmioDevice.h | 1 + .../VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h index 8b19996b716f..232393bb9114 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDevice.h @@ -27,6 +27,7 @@ typedef struct { UINT32 Signature; UINT32 Version; + UINT16 QueueNum; VIRTIO_DEVICE_PROTOCOL VirtioDevice; PHYSICAL_ADDRESS BaseAddress; } VIRTIO_MMIO_DEVICE; diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c index bf8523a6fb3b..c7a22c1e1cc4 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c @@ -83,7 +83,11 @@ VirtioMmioSetQueueSize ( Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_NUM, QueueSize); + if (Device->Version == 1) { + Device->QueueNum = QueueSize; + } else { + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_NUM, QueueSize); + } return EFI_SUCCESS; } @@ -171,6 +175,10 @@ VirtioMmioSetQueueSel ( VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_SEL, Sel); + if (Device->Version == 1) { + Device->QueueNum = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_QUEUE_NUM_MAX) & 0xFFFF; + } + return EFI_SUCCESS; } @@ -193,6 +201,8 @@ VirtioMmioSetQueueAddress ( VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_PFN, (UINT32)((UINTN)Ring->Base >> EFI_PAGE_SHIFT)); } else { + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_NUM, Device->QueueNum); + Address = (UINT64)Ring->Base; VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_QUEUE_DESC_LO, (UINT32)Address); -- 2.31.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 4/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 feature bit handling 2021-08-16 7:11 [PATCH v2 0/4] add support for virtio-mmio 1.0 Gerd Hoffmann ` (2 preceding siblings ...) 2021-08-16 7:11 ` [PATCH v2 3/4] OvmfPkg/VirtioMmioDeviceLib: Add default QueueNum for virtio 1.0 Gerd Hoffmann @ 2021-08-16 7:11 ` Gerd Hoffmann 3 siblings, 0 replies; 8+ messages in thread From: Gerd Hoffmann @ 2021-08-16 7:11 UTC (permalink / raw) To: devel; +Cc: Gerd Hoffmann virtio 1.0 has 64 feature bits instead of 32. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> --- .../VirtioMmioDeviceFunctions.c | 28 +++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c index c7a22c1e1cc4..44fa24972ff4 100644 --- a/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c +++ b/OvmfPkg/Library/VirtioMmioDeviceLib/VirtioMmioDeviceFunctions.c @@ -20,6 +20,7 @@ VirtioMmioGetDeviceFeatures ( ) { VIRTIO_MMIO_DEVICE *Device; + UINT32 LowBits, HighBits; if (DeviceFeatures == NULL) { return EFI_INVALID_PARAMETER; @@ -27,7 +28,15 @@ VirtioMmioGetDeviceFeatures ( Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); - *DeviceFeatures = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES); + if (Device->Version == 1) { + *DeviceFeatures = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES); + } else { + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES_SEL, 0); + LowBits = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES_SEL, 1); + HighBits = VIRTIO_CFG_READ (Device, VIRTIO_MMIO_OFFSET_HOST_FEATURES); + *DeviceFeatures = LShiftU64(HighBits, 32) | LowBits; + } return EFI_SUCCESS; } @@ -238,11 +247,20 @@ VirtioMmioSetGuestFeatures ( Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This); - if (Features > MAX_UINT32) { - return EFI_UNSUPPORTED; + if (Device->Version == 1) { + if (Features > MAX_UINT32) { + return EFI_UNSUPPORTED; + } + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES, + (UINT32)Features); + } else { + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES_SEL, 0); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES, + (UINT32)Features); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES_SEL, 1); + VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES, + (UINT32)RShiftU64(Features, 32)); } - VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES, - (UINT32)Features); return EFI_SUCCESS; } -- 2.31.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2021-08-16 16:04 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-08-16 7:11 [PATCH v2 0/4] add support for virtio-mmio 1.0 Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 1/4] OvmfPkg/Virtio10: Add virtio-mmio 1.0 defines Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 2/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 support Gerd Hoffmann 2021-08-16 13:35 ` [edk2-devel] " Yao, Jiewen 2021-08-16 16:04 ` Philippe Mathieu-Daudé [not found] ` <169BCCE38BFCC61F.3513@groups.io> 2021-08-16 13:37 ` Yao, Jiewen 2021-08-16 7:11 ` [PATCH v2 3/4] OvmfPkg/VirtioMmioDeviceLib: Add default QueueNum for virtio 1.0 Gerd Hoffmann 2021-08-16 7:11 ` [PATCH v2 4/4] OvmfPkg/VirtioMmioDeviceLib: Add virtio 1.0 feature bit handling Gerd Hoffmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox