On 02/16/16 09:06, Shaveta Leekha wrote:
> Hi Laszlo,
> 
> Please find my replies and few more doubts in-lined.

I cannot visually distinguish your comments from mine. Can you please
resend your email with a mailer that supports sane quoting, or else mark
each one of the paragraphs you are adding with [Shaveta]?

Thanks
Laszlo

> 
> -----Original Message-----
> From: Laszlo Ersek [mailto:ler...@redhat.com] 
> Sent: Monday, February 15, 2016 4:42 PM
> To: Shaveta Leekha <shaveta.lee...@nxp.com>; Bhupesh Sharma 
> <bhupesh.sha...@nxp.com>; Leif Lindholm <leif.lindh...@linaro.org>
> Cc: edk2-devel@lists.01.org <edk2-de...@ml01.01.org>
> Subject: Re: [edk2] SATA 3.0 AHCI host controller codebase
> 
> On 02/15/16 06:52, Shaveta Leekha wrote:
>>
>>
>> -----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?
> 
> "MdeModulePkg/Bus/Pci/PciHostBridgeDxe" is indeed meant as a "real" PCI host 
> bridge / root bridge driver, but it delegates some aspects to the platform, 
> via the PciHostBridgeLib class. (As I wrote above.)
> 
> I think it might be worthwhile to investigate if this driver could cover your 
> needs. The question is if you can push down *all* the emulation you need into 
> libraries and drivers that PciHostBridgeDxe uses to do its work. For example, 
> you can implement
> - a PciSegmentLib instance to provide PCI config space access,
> - a PciHostBridgeLib instance to list the root bridges with their
>   apertures, and
> - a CPU IO driver to produce the EFI_CPU_IO2_PROTOCOL, where the
>   Io.Read() and Io.Write() members would be likely emulated with
>   accesses to a special MMIO range (or just refused as EFI_UNSUPPORTED).
> 
> Sure, I will investigate this driver further as per our need. But I have one 
> doubt here,
> In case I use " Omap35xxPkg/PciEmulation/PciEmulation.c" kind of emulation 
> code, which is not for real PCI root bridge and
> doesnot produce "RootBridgeResourceAllocation protocol", it only produces 
> RootBridgePciIo protocol, will it still work?
> 
> 
>>   
>> => 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?
> 
> I recommend looking at git commit b82802b83f06 ("OvmfPkg: enable SATA
> controller") to see how the protocols stack up.
> 
> The only AHCI register that OvmfPkg/SataControllerDxe accesses itself is the 
> CAP ("HBA Capabilities"), to get the number of ports, and to see if port 
> multiplication is supported. These infos are used for implementing 
> EFI_IDE_CONTROLLER_INIT_PROTOCOL.
> 
> The real AHCI stuff is implemented by
> "MdeModulePkg/Bus/Ata/AtaAtapiPassThru/AtaAtapiPassThru.inf".
> 
> The driver you mention, "MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf",
> comes on top of that.
> 
> So, I guess the answer to your question is, "yes, AtaBusDxe is generic, and 
> no, SataControllerDxe *also* doesn't need (much) AHCI knowledge -- that's in 
> the middle, in the AtaAtapiPassThru driver".
> 
> True. From " OvmfPkg: enable SATA controller" commit, it clear the stack as 
> you have mentioned.
> 
> But I have seen one more SATA driver:
> commit f63424474e8b022c0b7675d282c9b4c255a95ff4
> Author: Olivier Martin <olivier.mar...@arm.com>
> Date:   Mon May 11 17:50:27 2015 +0000
> 
>     EmbeddedPkg: Added SATA Silicon Image driver
> 
>     Note: This is the same SATA controller present on Juno R1.
> 
> 
> In this " EmbeddedPkg/Drivers/SataSiI3132Dxe/SataSiI3132.c", it directly 
> install " AtaPassThruProtocol".
> In this case, does it skip " AtaAtapiPassThru driver" layer in between? Is 
> this working?
> Also code in  " AtaAtapiPassThru driver" layer also use PciIo protocol. 
> Which of the path is tested?
> 
>>
>> => SATA Dxe driver will consume PciIo protocol
> 
> Yes.
> 
>> and will produce "AtaPassThruProtocol" for ATA bus code to use.
> 
> Not exactly -- at least looking at the current in-tree example -- see the 
> OVMF commit I referenced above. The SATA driver would produce 
> EFI_IDE_CONTROLLER_INIT_PROTOCOL, AtaAtapiPassThru would produce 
> EFI_ATA_PASS_THRU_PROTOCOL on top, separately, for AtaBusDxe to consume.
> 
>> => All the chipset specific SATA controller initialization part will be 
>> there in SATADxe driver.
> 
> I think so, yes. In OVMF's case, this is minimal.
> 
> OK
> 
>> Is this flow and understanding correct for a platform SATA controller driver?
> 
> I think the only significant omission was the AtaAtapiPassThru driver in the 
> middle.
> 
> Thanks,
> Shaveta
> 
> Thanks
> Laszlo
> 
>>
>> Thanks and Regards,
>> Shaveta
>>
> 

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to