The patch at "049695a0b1e2 MdeModulePkg/PciBusDxe: Add feedback status for PciIoMap" adds support to propagate the error code following the invocation of the IoMmu protocol SetAttribute() operation.
Since the ArmCcaIoMmuDxe implementation of the SetAttribute() function returned EFI_UNSUPPORTED, it resulted in the virtio disk not being mounted. Although there is nothing to be done in SetAttribute(), follow the approach as done by the patch at "97c3f5b8d272 Provide an implementation for SetAttribute" to validate the IoMmu access method being requested against the IoMmu mapping operation and return a suitable return code. Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org> Cc: Leif Lindholm <quic_llind...@quicinc.com> Cc: Gerd Hoffmann <kra...@redhat.com> Signed-off-by: Sami Mujawar <sami.muja...@arm.com> --- ArmVirtPkg/ArmCcaIoMmuDxe/ArmCcaIoMmu.c | 63 +++++++++++++++++++- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/ArmVirtPkg/ArmCcaIoMmuDxe/ArmCcaIoMmu.c b/ArmVirtPkg/ArmCcaIoMmuDxe/ArmCcaIoMmu.c index cf52b82218bb9ece7bfedcb6e3a2ced00eff5e92..91f9dae91843b6739ddb818e9ec81706ccfa73b3 100644 --- a/ArmVirtPkg/ArmCcaIoMmuDxe/ArmCcaIoMmu.c +++ b/ArmVirtPkg/ArmCcaIoMmuDxe/ArmCcaIoMmu.c @@ -629,7 +629,9 @@ IoMmuFreeBuffer ( @param[in] Mapping The mapping value returned from Map(). @param[in] IoMmuAccess The IOMMU access. - @retval EFI_UNSUPPORTED Operation not supported by IOMMU. + @retval EFI_INVALID_PARAMETER A parameter was invalid. + @retval EFI_UNSUPPORTED The requested operation is not supported. + @retval EFI_SUCCESS Success. **/ EFI_STATUS @@ -641,7 +643,64 @@ IoMmuSetAttribute ( IN UINT64 IoMmuAccess ) { - return EFI_UNSUPPORTED; + EFI_STATUS Status; + MAP_INFO *MapInfo; + + DEBUG (( + DEBUG_VERBOSE, + "%a: Mapping=0x%p Access=%lu\n", + __func__, + Mapping, + IoMmuAccess + )); + + if (Mapping == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = EFI_SUCCESS; + + // An IoMmuAccess value of 0 is always accepted, + // validate any non-zero value. + if (IoMmuAccess != 0) { + MapInfo = (MAP_INFO *)Mapping; + + // The mapping operation already implied the access mode. + // Validate that the supplied access mode matches operation + // access mode. + switch (MapInfo->Operation) { + case EdkiiIoMmuOperationBusMasterRead: + case EdkiiIoMmuOperationBusMasterRead64: + if (IoMmuAccess != EDKII_IOMMU_ACCESS_READ) { + Status = EFI_INVALID_PARAMETER; + } + + break; + + case EdkiiIoMmuOperationBusMasterWrite: + case EdkiiIoMmuOperationBusMasterWrite64: + if (IoMmuAccess != EDKII_IOMMU_ACCESS_WRITE) { + Status = EFI_INVALID_PARAMETER; + } + + break; + + case EdkiiIoMmuOperationBusMasterCommonBuffer: + case EdkiiIoMmuOperationBusMasterCommonBuffer64: + if (IoMmuAccess != + (EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE)) + { + Status = EFI_INVALID_PARAMETER; + } + + break; + + default: + Status = EFI_UNSUPPORTED; + } // switch + } + + return Status; } /** Arm CCA IoMMU protocol -- 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)' -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117713): https://edk2.groups.io/g/devel/message/117713 Mute This Topic: https://groups.io/mt/105484264/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-