From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-it0-x236.google.com (mail-it0-x236.google.com [IPv6:2607:f8b0:4001:c0b::236]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D265621DFA7BA for ; Tue, 28 Mar 2017 15:38:33 -0700 (PDT) Received: by mail-it0-x236.google.com with SMTP id y18so38184030itc.1 for ; Tue, 28 Mar 2017 15:38:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=69xn78FyNlH/FLAzBnaTWmygtkl/T0QLn+LTyK3BnH8=; b=Y1f1TpOIUx6FPYYvxSPsXxYPhVK9cHCfEMqNdlLBWFYrHQKOhXg+aFg6hHwuyuxGLl ONv60o6gd8+fRf7bSSIqH5pSRtDsYGGNPzEUwfbV/3M3sBhJ1UCOJa1qcG2iLFeo6axj 2W/EDGQsc2u+a4ASllMD8MZAnTlEo2mrrIG0s= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=69xn78FyNlH/FLAzBnaTWmygtkl/T0QLn+LTyK3BnH8=; b=hxWpkpdn6SVrec55yoNO4Doz1rPTWNgWu4Xod1sfcEptv0YDs6XgsmZ1I3QJb2ATiX M0ZaRRH8nn2amEn7bcnPnhYrV4BUUfxNguYF5BBPRKyBRLGq78Jw1dOG+sbqavlxIr1p kFsgJ3MVDM6AKrwsBTLlWSen/JQy2mL85NSooDajzLMGWDKEIfXheB5gEHTrf5fw09ZN zeemFh5qwbG1amRmsQ3qtMFQk+c80kvGMVXVoZZ5LzJAq9vy99dvZ0yPqhicRxHDiiqi 6XPxLNbbPuEYFSNiNWQ6gb7YBlENZaK2wWI2KRRmgPN6X5ms91ItWBlAdymmNKOV3U3f yGWQ== X-Gm-Message-State: AFeK/H22aL0IXBrG6L26snWKFEMUx0mCeDNe5cok8U6Sz34/q2WyLttPc6E8ApbftjXWWf+JEVbLYUsvTLnNHMC2 X-Received: by 10.36.46.69 with SMTP id i66mr13518453ita.59.1490740713039; Tue, 28 Mar 2017 15:38:33 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.10.27 with HTTP; Tue, 28 Mar 2017 15:38:32 -0700 (PDT) In-Reply-To: <1490434122-16200-2-git-send-email-jiewen.yao@intel.com> References: <1490434122-16200-1-git-send-email-jiewen.yao@intel.com> <1490434122-16200-2-git-send-email-jiewen.yao@intel.com> From: Ard Biesheuvel Date: Tue, 28 Mar 2017 23:38:32 +0100 Message-ID: To: Jiewen Yao Cc: "edk2-devel@lists.01.org" , Ruiyu Ni , Brijesh Singh , Leo Duran Subject: Re: [PATCH 1/3] MdeModulePkg/Include: Add IOMMU protocol definition. X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Mar 2017 22:38:34 -0000 Content-Type: text/plain; charset=UTF-8 On 25 March 2017 at 09:28, Jiewen Yao wrote: > This protocol is to abstract IOMMU access. > > Cc: Ruiyu Ni > Cc: Leo Duran > Cc: Brijesh Singh > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Jiewen Yao Hello all, It would be very useful for a IOMMU protocol such as this one to support non-identity mappings between the host and the PCI bus. On 64-bit ARM systems, no RAM may exist below 4 GB, and if a IOMMU is available, it could be used to remap RAM for DMA in a way that makes it 32-bit addressable for PCI masters that are not 64-bit capable. The PCI protocols in UEFI already allow such non-identity mappings. If a IOMMU protocol is introduced, it makes sense to allow it to be involved in establishing the device address when performing a map operation. -- Ard. > --- > MdeModulePkg/Include/Protocol/IoMmu.h | 132 ++++++++++++++++++++ > MdeModulePkg/MdeModulePkg.dec | 3 + > 2 files changed, 135 insertions(+) > > diff --git a/MdeModulePkg/Include/Protocol/IoMmu.h b/MdeModulePkg/Include/Protocol/IoMmu.h > new file mode 100644 > index 0000000..55b9c78 > --- /dev/null > +++ b/MdeModulePkg/Include/Protocol/IoMmu.h > @@ -0,0 +1,132 @@ > +/** @file > + EFI IOMMU Protocol. > + > +Copyright (c) 2017, Intel Corporation. All rights reserved.
> +This program and the accompanying materials are licensed and made available under > +the terms and conditions of the BSD License that accompanies this distribution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > + > +**/ > + > + > +#ifndef __IOMMU_H__ > +#define __IOMMU_H__ > + > +// > +// IOMMU Protocol GUID value > +// > +#define EDKII_IOMMU_PROTOCOL_GUID \ > + { \ > + 0x4e939de9, 0xd948, 0x4b0f, { 0x88, 0xed, 0xe6, 0xe1, 0xce, 0x51, 0x7c, 0x1e } \ > + } > + > +// > +// Forward reference for pure ANSI compatability > +// > +typedef struct _EDKII_IOMMU_PROTOCOL EDKII_IOMMU_PROTOCOL; > + > +// > +// Revision The revision to which the IOMMU interface adheres. > +// All future revisions must be backwards compatible. > +// If a future version is not back wards compatible it is not the same GUID. > +// > +#define EDKII_IOMMU_PROTOCOL_REVISION 0x00010000 > + > +// > +// IOMMU attribute. > +// These types can be "ORed" together as needed. > +// Any undefined bits are reserved and must be zero. > +// > +#define EDKII_IOMMU_ATTRIBUTE_READ 0x1 > +#define EDKII_IOMMU_ATTRIBUTE_WRITE 0x2 > + > +/** > + Set IOMMU attribute for a system memory. > + > + If the IOMMU protocol exists, the system memory cannot be used > + for DMA by default. > + > + When a device requests a DMA access for a system memory, > + the device driver need use SetAttribute() to update the IOMMU > + attribute to request DMA access (read and/or write). > + > + The DeviceHandle is used to identify which device it is. > + The IOMMU implementation need translate the device path to an IOMMU device ID, > + and set IOMMU hardware register accordingly. > + 1) DeviceHandle can be a standard PCI device. > + The memory for BusMasterRead need set EDKII_IOMMU_ATTRIBUTE_READ. > + The memory for BusMasterWrite need set EDKII_IOMMU_ATTRIBUTE_WRITE. > + The memory for BusMasterCommonBuffer need set EDKII_IOMMU_ATTRIBUTE_READ|EDKII_IOMMU_ATTRIBUTE_WRITE. > + After the memory is used, the memory need set 0 to keep it being protected. > + 2) DeviceHandle can be an ACPI device (ISA, I2C, SPI, etc). > + The memory for DMA access need set EDKII_IOMMU_ATTRIBUTE_READ and/or EDKII_IOMMU_ATTRIBUTE_WRITE. > + > + @param This The protocol instance pointer. > + @param DeviceHandle The device who initiates the DMA access request. > + @param BaseAddress The base of system memory address to be used as the DMA memory. > + @param Length The length of system memory address to be used as the DMA memory. > + @param IoMmuAttribute The IOMMU attribute. > + > + @retval EFI_SUCCESS The IoMmuAttribute is set for the memory range specified by BaseAddress and Length. > + @retval EFI_INVALID_PARAMETER DeviceHandle is an invalid handle. > + @retval EFI_INVALID_PARAMETER BaseAddress is not IoMmu Page size aligned. > + @retval EFI_INVALID_PARAMETER Length is not IoMmu Page size aligned. > + @retval EFI_INVALID_PARAMETER Length is 0. > + @retval EFI_INVALID_PARAMETER IoMmuAttribute specified an illegal combination of attributes. > + @retval EFI_UNSUPPORTED DeviceHandle is unknown by the IOMMU. > + @retval EFI_UNSUPPORTED The bit mask of IoMmuAttribute is not supported by the IOMMU. > + @retval EFI_UNSUPPORTED The IOMMU does not support the memory range specified by BaseAddress and Length. > + @retval EFI_OUT_OF_RESOURCES There are not enough resources available to modify the IOMMU attribute. > + @retval EFI_DEVICE_ERROR The IOMMU device reported an error while attempting the operation. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_IOMMU_SET_ATTRIBUTE)( > + IN EDKII_IOMMU_PROTOCOL *This, > + IN EFI_HANDLE DeviceHandle, > + IN UINT64 BaseAddress, > + IN UINT64 Length, > + IN UINT64 IoMmuAttribute > + ); > + > +/** > + Get IOMMU page size. > + > + This is the minimal supported page size for a IOMMU. > + For example, if an IOMMU supports 4KiB, 2MiB and 1GiB, > + 4KiB should be returned. > + > + @param This Protocol instance pointer. > + @param PageSize The minimal supported page size for a IOMMU. > + > + @retval EFI_SUCCESS The page size is returned. > + @retval EFI_INVALID_PARAMETER PageSize is NULL. > + > +**/ > +typedef > +EFI_STATUS > +(EFIAPI *EDKII_IOMMU_GET_PAGE_SIZE)( > + IN EDKII_IOMMU_PROTOCOL *This, > + OUT UINTN *PageSize > + ); > + > +/// > +/// IOMMU Protocol structure. > +/// > +struct _EDKII_IOMMU_PROTOCOL { > + UINT64 Revision; > + EDKII_IOMMU_GET_PAGE_SIZE GetPageSize; > + EDKII_IOMMU_SET_ATTRIBUTE SetAttribute; > +}; > + > +/// > +/// IOMMU Protocol GUID variable. > +/// > +extern EFI_GUID gEdkiiIoMmuProtocolGuid; > + > +#endif > diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec > index 356b3e1..db596b6 100644 > --- a/MdeModulePkg/MdeModulePkg.dec > +++ b/MdeModulePkg/MdeModulePkg.dec > @@ -540,6 +540,9 @@ > ## Include/Protocol/NonDiscoverableDevice.h > gEdkiiNonDiscoverableDeviceProtocolGuid = { 0x0d51905b, 0xb77e, 0x452a, {0xa2, 0xc0, 0xec, 0xa0, 0xcc, 0x8d, 0x51, 0x4a } } > > + ## Include/Protocol/IoMmu.h > + gEdkiiIoMmuProtocolGuid = { 0x4e939de9, 0xd948, 0x4b0f, { 0x88, 0xed, 0xe6, 0xe1, 0xce, 0x51, 0x7c, 0x1e } } > + > # > # [Error.gEfiMdeModulePkgTokenSpaceGuid] > # 0x80000001 | Invalid value provided. > -- > 2.7.4.windows.1 > > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel