-----Original Message----- From: Laszlo Ersek [mailto:ler...@redhat.com] Sent: Monday, February 08, 2016 1:20 PM To: Bhupesh Sharma <bhupesh.sha...@nxp.com>; Leif Lindholm <leif.lindh...@linaro.org>; Shaveta Leekha <shaveta.lee...@nxp.com> Cc: edk2-devel@lists.01.org <edk2-de...@ml01.01.org> Subject: Re: [edk2] SATA 3.0 AHCI host controller codebase
On 02/06/16 09:38, Bhupesh Sharma wrote: >> From: Laszlo Ersek >> Sent: Friday, February 05, 2016 2:27 AM >> >> On 02/03/16 22:39, Leif Lindholm wrote: >>> Hi Shaveta, >>> >>> On Tue, Feb 02, 2016 at 07:05:03AM +0000, Shaveta Leekha wrote: >>>> Is there some SATA 3.0 AHCI driver implementation in UEFI / EDK code? >>>> The one I need to write for our platform is not PCI based. >>>> >>>> I have seen few implementations in EDK2: >>>> DuetPkg/SataControllerDxe/SataController.c >>>> OvmfPkg/SataControllerDxe/SataController.c >>>> But in all of them SATA connectivity is via PCI Express switch. >>>> >>>> Kindly point me to some non-PCI based "SATA 3.0 AHCI driver code" >>>> for UEFI, if there is any such code. >>> >>> I have seen several such platforms implementing a "dummy" PCI >>> Express driver, simply translating PCI accesses to memory mapped >>> ones, and still making use of the MdeModulePkg/Bus/Ata/ libraries. >>> >>> You can see examples of PCI emulation in >>> Omap35xxPkg/PciEmulation/PciEmulation.c >>> and >>> ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe/PciEmulation.c >>> >>> As a side note, we really should have a common mmio-PCI emulation >>> library in core EDK2. >> >> Actually the driver stack rests upon the platform-specific PCI host >> bridge/root bridge driver (a DXE_DRIVER, i.e., one that doesn't bind >> other handles according to the UEFI Driver Model, but produces the >> Root Bridge IO protocols, and the Host Bridge Resource Allocation >> protocol(s), out of "thin air", in its entry point function). >> >> The PCI Bus driver (producing PciIo protocol instances) is platform- >> independent, and needs the previously mentioned driver. From PciIo >> upwards, it's all generic. (Well, I'll mention that there is no >> platform- independent SataControllerDxe in edk2. I don't recall the >> reason -- apologies --, but a reason *was* given for it.) >> >> Ray recently implemented a generic PCI host bridge / root bridge >> driver, in "MdeModulePkg/Bus/Pci/PciHostBridgeDxe". That driver delegates: >> >> - some of the platform specifics to the (also new) PciHostBridgeLib >> class, >> - PCI config space access to the PciSegmentLib class (there are, or can >> be made, library instances that provide 0xCF8/0xCFC, or MMCONFIG/ECAM >> based config space access), >> - IO port access to the CPU driver that provides the >> EFI_CPU_IO2_PROTOCOL. >> >> I believe that for a "single root bridge" system, this structure is >> generic enough. >> >> (Of course, nothing prevents a system from implementing PciIo >> independently, which "ArmPlatformPkg/ArmJunoPkg/Drivers/ArmJunoDxe" >> seems to do.) > > Thanks Laszlo and Leif. > > So, AFAIU there are two approaches available on implementing the SATA > (AHCI based) host controller on ARM based SoCs: > > 1. Either, we can use the PCIe emulation layers to emulation a SATA > controller sitting as a PciIO device on top of the PCIe emulation > layer. So, eventually we will be using the ATA Bus layer inside > MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf > to get the AHCI-ATA bus services. > > 2. Or, we can implement the AHCI based SATA controller as a block > device (exposing the BLOCK IO protocol) and implemented on the lines > of a SD/MMC card like driver. The BLOCK IO protocol can then be used by a > FatPkg like layer to provide a support for FAT32 filesystem over the SATA > driver. > > Both the above approaches have their own merits and demerits. While > approach 1 might introduce extra memory allocation/housekeeping overheads for > PCIe emulation layer, approach 2 might not be compatible to all UEFI shell > applications that want to use a underlying SATA HDD support. > > So, this brings forward the question, as to which UEFI shell applications > (e.g. GRUB2) can work with approach 2 and which cannot. > Are there any other obvious disadvantages to approach 2? > > Please share your thoughts. I don't know many UEFI applications, but the few I know, should be happy with the BlockIo + above protocols. At least I can't name any obvious disadvantages. Thanks Laszlo > > Regards, > Bhupesh > Hi Laszlo, Leif, Thanks for your feedbacks. As per above discussion, we are following 1st approach for implementing SATA driver for our platform. That is: => We will create a PCIe emulation layer to emulate that SATA controller sitting as a PciIO device. For it we can take the reference from "Omap35xxPkg/PciEmulation/PciEmulation.c", as the generic PCI driver "MdeModulePkg/Bus/Pci/PciHostBridgeDxe" Seems to be for some real PCI Root bridge, not for emulated one, is this understanding correct? => Also we may use "MdeModulePkg/Bus/Ata/AtaBusDxe/" code for ATA bus implementation. Does this code follow AHCI 1.3 spec/any such standard OR AHCI 1.3 specification need to be taken care at SATADxe driver level, By keeping ATA bus code generic? => SATA Dxe driver will consume PciIo protocol and will produce "AtaPassThruProtocol" for ATA bus code to use. => All the chipset specific SATA controller initialization part will be there in SATADxe driver. Is this flow and understanding correct for a platform SATA controller driver? Thanks and Regards, Shaveta _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel