@@ -93,41 +93,41 @@ EFI_STATUS
);
/**
Read the device features field from the Virtio Header.
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL
- @param[out] DeviceFeatures The 32-bit device features field.
+ @param[out] DeviceFeatures The device features field.
@retval EFI_SUCCESS The data was read successfully.
@retval EFI_UNSUPPORTED The underlying IO device doesn't support the
provided address offset and read size.
@retval EFI_INVALID_PARAMETER DeviceFeatures is NULL
**/
typedef
EFI_STATUS
(EFIAPI *VIRTIO_GET_DEVICE_FEATURES) (
IN VIRTIO_DEVICE_PROTOCOL *This,
- OUT UINT32 *DeviceFeatures
+ OUT UINT64 *DeviceFeatures
);
/**
Write the guest features field in the Virtio Header.
@param[in] This This instance of VIRTIO_DEVICE_PROTOCOL
- @param[in] Features The 32-bit guest guest features field
+ @param[in] Features The guest features field
**/
typedef
EFI_STATUS
(EFIAPI *VIRTIO_SET_GUEST_FEATURES) (
IN VIRTIO_DEVICE_PROTOCOL *This,
- IN UINT32 Features
+ IN UINT64 Features
);
/**
Read the queue address field from the Virtio Header.
QueueAddress is the address of the virtqueue divided by 4096.
@@ -61,15 +61,15 @@ VirtioMmioDeviceWrite (
IN UINT64 Value
);
EFI_STATUS
EFIAPI
VirtioMmioGetDeviceFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
- OUT UINT32 *DeviceFeatures
+ OUT UINT64 *DeviceFeatures
);
EFI_STATUS
EFIAPI
VirtioMmioGetQueueAddress (
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT32 *QueueAddress
@@ -137,11 +137,11 @@ VirtioMmioSetPageSize (
UINT32 PageSize
);
EFI_STATUS
EFIAPI
VirtioMmioSetGuestFeatures (
VIRTIO_DEVICE_PROTOCOL *This,
- UINT32 Features
+ UINT64 Features
);
#endif // _VIRTIO_MMIO_DEVICE_INTERNAL_H_
@@ -79,15 +79,15 @@ VirtioPciDeviceWrite (
IN UINT64 Value
);
EFI_STATUS
EFIAPI
VirtioPciGetDeviceFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
- OUT UINT32 *DeviceFeatures
+ OUT UINT64 *DeviceFeatures
);
EFI_STATUS
EFIAPI
VirtioPciGetQueueAddress (
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT32 *QueueAddress
@@ -121,15 +121,15 @@ VirtioPciGetDeviceStatus (
OUT UINT8 *DeviceStatus
);
EFI_STATUS
EFIAPI
VirtioPciSetGuestFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
- IN UINT32 Features
+ IN UINT64 Features
);
EFI_STATUS
EFIAPI
VirtioPciSetQueueAddress (
VIRTIO_DEVICE_PROTOCOL *This,
UINT32 Address
@@ -18,15 +18,15 @@
#include "VirtioMmioDevice.h"
EFI_STATUS
EFIAPI
VirtioMmioGetDeviceFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
- OUT UINT32 *DeviceFeatures
+ OUT UINT64 *DeviceFeatures
)
{
VIRTIO_MMIO_DEVICE *Device;
if (DeviceFeatures == NULL) {
return EFI_INVALID_PARAMETER;
}
@@ -213,22 +213,26 @@ VirtioMmioSetQueueAddress (
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VirtioMmioSetGuestFeatures (
VIRTIO_DEVICE_PROTOCOL *This,
- UINT32 Features
+ UINT64 Features
)
{
VIRTIO_MMIO_DEVICE *Device;
Device = VIRTIO_MMIO_DEVICE_FROM_VIRTIO_DEVICE (This);
- VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES, Features);
+ if (Features > MAX_UINT32) {
+ return EFI_UNSUPPORTED;
+ }
+ VIRTIO_CFG_WRITE (Device, VIRTIO_MMIO_OFFSET_GUEST_FEATURES,
+ (UINT32)Features);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
VirtioMmioDeviceWrite (
@@ -589,15 +589,15 @@ EFIAPI
VirtioBlkInit (
IN OUT VBLK_DEV *Dev
)
{
UINT8 NextDevStat;
EFI_STATUS Status;
- UINT32 Features;
+ UINT64 Features;
UINT64 NumSectors;
UINT32 BlockSize;
UINT8 PhysicalBlockExp;
UINT8 AlignmentOffset;
UINT32 OptIoSize;
UINT16 QueueSize;
@@ -60,15 +60,15 @@ VirtioNetGetFeatures (
OUT EFI_MAC_ADDRESS *MacAddress,
OUT BOOLEAN *MediaPresentSupported,
OUT BOOLEAN *MediaPresent
)
{
EFI_STATUS Status;
UINT8 NextDevStat;
- UINT32 Features;
+ UINT64 Features;
UINTN MacIdx;
UINT16 LinkStatus;
//
// Interrogate the device for features (virtio-0.9.5, 2.2.1 Device
// Initialization Sequence), but don't complete setting it up.
//
@@ -356,15 +356,15 @@ VirtioNetInitialize (
IN UINTN ExtraTxBufferSize OPTIONAL
)
{
VNET_DEV *Dev;
EFI_TPL OldTpl;
EFI_STATUS Status;
UINT8 NextDevStat;
- UINT32 Features;
+ UINT64 Features;
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
if (ExtraRxBufferSize > 0 || ExtraTxBufferSize > 0) {
return EFI_UNSUPPORTED;
}
@@ -97,27 +97,33 @@ VirtioPciDeviceWrite (
Dev->DeviceSpecificConfigurationOffset + FieldOffset, FieldSize, Value);
}
EFI_STATUS
EFIAPI
VirtioPciGetDeviceFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
- OUT UINT32 *DeviceFeatures
+ OUT UINT64 *DeviceFeatures
)
{
VIRTIO_PCI_DEVICE *Dev;
+ EFI_STATUS Status;
+ UINT32 Features32;
if (DeviceFeatures == NULL) {
return EFI_INVALID_PARAMETER;
}
Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);
- return VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_DEVICE_FEATURES, sizeof (UINT32),
- sizeof (UINT32), DeviceFeatures);
+ Status = VirtioPciIoRead (Dev, VIRTIO_PCI_OFFSET_DEVICE_FEATURES,
+ sizeof (UINT32), sizeof (UINT32), &Features32);
+ if (!EFI_ERROR (Status)) {
+ *DeviceFeatures = Features32;
+ }
+ return Status;
}
EFI_STATUS
EFIAPI
VirtioPciGetQueueAddress (
IN VIRTIO_DEVICE_PROTOCOL *This,
OUT UINT32 *QueueAddress
@@ -173,21 +179,24 @@ VirtioPciGetDeviceStatus (
sizeof (UINT8), sizeof (UINT8), DeviceStatus);
}
EFI_STATUS
EFIAPI
VirtioPciSetGuestFeatures (
IN VIRTIO_DEVICE_PROTOCOL *This,
- IN UINT32 Features
+ IN UINT64 Features
)
{
VIRTIO_PCI_DEVICE *Dev;
Dev = VIRTIO_PCI_DEVICE_FROM_VIRTIO_DEVICE (This);
+ if (Features > MAX_UINT32) {
+ return EFI_UNSUPPORTED;
+ }
return VirtioPciIoWrite (Dev, VIRTIO_PCI_OFFSET_GUEST_FEATURES,
sizeof (UINT32), Features);
}
EFI_STATUS
EFIAPI
VirtioPciSetQueueAddress (
@@ -199,15 +199,15 @@ EFIAPI
VirtioRngInit (
IN OUT VIRTIO_RNG_DEV *Dev
)
{
UINT8 NextDevStat;
EFI_STATUS Status;
UINT16 QueueSize;
- UINT32 Features;
+ UINT64 Features;
//
// Execute virtio-0.9.5, 2.2.1 Device Initialization Sequence.
//
NextDevStat = 0; // step 1 -- reset device
Status = Dev->VirtIo->SetDeviceStatus (Dev->VirtIo, NextDevStat);
if (EFI_ERROR (Status)) {
@@ -703,15 +703,15 @@ EFIAPI
VirtioScsiInit (
IN OUT VSCSI_DEV *Dev
)
{
UINT8 NextDevStat;
EFI_STATUS Status;
- UINT32 Features;
+ UINT64 Features;
UINT16 MaxChannel; // for validation only
UINT32 NumQueues; // for validation only
UINT16 QueueSize;
//
// Execute virtio-0.9.5, 2.2.1 Device Initialization Sequence.
//