Thanks Tom

On Tue, 9 Jun 2020 at 15:27, Tomas Pilar (tpilar) <tomas.pi...@arm.com>
wrote:

> Hi Kumar,
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> *   The UEFI drivers follow a two stage loading mechanism. When the driver
> is loaded/executed, it loads itself into memory and installs a
> DRIVER_BINDING_PROTOCOL on its own handle. That protocol provides API for
> the platform to ask the driver whether it supports a particular device and
> to bind/unbind from a particular device. Once all drivers are loaded in
> this way in memory, the platform then tries to bind all devices In the
> system to all drivers, one by one, using each DRIVER_BINDING_PROTOCOL
> instance. So as a driver, you provide the API and then sit there until a
> platform gives you a device to drive (The platform will offer you ALL of
> the devices, so your Supported() function has to be very fast and very
> quiet).   Devices that are offered to drivers are in the form of a
> ControllerHandle with a device path and some form of communication protocol
> based on the bus the devices sit on. So for PCI devices that would be a PCI
> device path and a PCI_IO_PROTOCOL. However, as a driver, you might need to
> create a new handle as a child with a different device path based on
> functionality. For example, as a network driver, you will be given a handle
> with PCI_IO_PROTOCOL for communication and a PCI device path installed on
> it. During binding, you will have to create a child handle with some
> networking protocols installed on it (that you produced) and a MAC media
> device path.   Roughly:   Controller usually means a device and ‘connecting
> a controller’ means offering the devices to all resident drivers to see if
> one can bind to it. Represented by a handle with a hardware device path
> installed on it and with some form of messaging protocol that can be used
> to talk to the hardware. Usually PCI_IO_PROTOCOL.   Driver really is
> anything that produces DRIVER_BINDING_PROTOCOL installed on its own handle.
> Usually with a device path pointing to a file/memory from where it was
> loaded. Will have also have LOADED_IMAGE_PROTOCOL describing the memory
> where it resides.   The early chapters of the UEFI spec describe this
> process in more detail.   Also, the enumeration of devices and creating the
> controller handles with low lever IO protocols and hardware device paths is
> done by the platform, I wouldn’t worry too much about that at this point.
> Cheers, Tom   From: Kumar G <kumarg27061...@gmail.com
> <kumarg27061...@gmail.com>> Sent: 08 June 2020 19:10 To: Tomas Pilar
> <tomas.pi...@arm.com <tomas.pi...@arm.com>> Cc: devel@edk2.groups.io
> <devel@edk2.groups.io>; nd <n...@arm.com <n...@arm.com>> Subject: Re:
> [edk2-devel] Device and driver   Thanks Tom, I really appreciate your
> reply, I didn't get 100% but I went through ~3K pages of UEFI
> specification. I understand a bit of protocols and handles now. Handle is
> an identifier on which some sort of function pointers (protocol in UEFI
> world) are installed. Thing which I am trying to understand, where EFI Boot
> service's connect controller API says 'connect one or more drivers to
> controller' Basically at code level, where this differentiation is done,
> what is controller-handle and what is driver. If you say , at entrypoint
> controller needs to install a protocol such as I/O or read/write protocol
> supported by this controller-handle (Say C1). Later some piece of code (may
> be bus or other) create another controller-handle (C2) (which is a device,
> connected over this i/o). And the driver needs to install *only* device
> binding protocol. During binding , this driver looks for controller (C2)
> and when found it happily says matched or supported. If the above rule is
> true, then it’s easy to understand the device (aka controller-handle) and
> the driver. But in a few places, I am not able to understand what is a
> controller and what is a driver really. e.g    at
> ArmPlatformPkg/Drivers/LcdGraphicsOutputDxe/LcdGraphicsOutputDxe.c By name
> this looks to be a driver for Lcd gfx,  but if this is driver then what it
> has to do with device path. Is this driver and controller  managed by the
> same code ? no clear differentiation For sure, this is new world for me,
> There will be differences w,r,t Linux Thanks KumarG   On Mon, 8 Jun 2020 at
> 17:04, Tomas Pilar <tomas.pi...@arm.com <tomas.pi...@arm.com>> wrote: Hi,
> By no means a complete answer but some important points below.   There are
> two important concepts in UEFI that you absolutely need to get comfortable
> with. These two are Handles and Protocols.   You can think of a protocol as
> an implementation of a well defined API that allows you to do something.
> For example, do you want to print a string to screen? There is a
> SIMPLE_TEXT_OUT_PROTOCOL provided by the platform (hopefully) that allows
> you to do that. There might be multiple instances depending on how many
> devices support displaying/printing/outputting text. Do you want to send
> some data to a PCI device? The PCI_IO_PROTOCOL is your friend.
> Syntactically, a protocol is just a well-defined C struct, defined in a
> header file in an include folder somewhere (both the producer and the
> consumer of the protocol must have access to the header file). You can
> navigate to MdePkg/Include/Protocol to look at some examples.   Then there
> are handles (EFI_HANDLE). The main use of handles is that protocols are
> installed on handles, and as such can be conceptually grouped (a handle can
> carry many different protocols but a protocol instance is usually installed
> on only one handle). A ControllerHandle is just a handle – lets you install
> protocols on it. But importantly, the ControllerHandle contains those
> protocols that pertain to a single device. You can’t really do much if you
> are given a handle but you can check what protocols are installed on it and
> use those. When the platform enumerates peripheral devices, these are
> represented internally as ControllerHandles and each of them will have a
> PCI_IO_PROTOCOL already installed by the point a driver gets to it. That
> PCI_IO_PROTOCOL is then the way the driver can talk to the device. Handles
> are tracked in an internal database and you can search through them.
> Speaking of which. Most of the stuff you do in UEFI is done by protocols,
> with the main exception being the intrinsic services such as allocating
> memory, handling callbacks/events/locks, connecting/disconnecting devices,
> loading and executing files/code, and of course installing/using/removing
> protocols. These functionalities are provided by the BootServicesTable
> which you really need to read about in the UEFI Spec.   There really are no
> quick answers here unfortunately, you’ll have to get stuck in and play
> around until you get comfortable with things. I appreciate that the
> paradigm is quite different to for example Linux, but there are (usually)
> quite good reasons for many of the differences.   Cheers, Tom   From:
> devel@edk2.groups.io <devel@edk2.groups.io> <devel@edk2.groups.io
> <devel@edk2.groups.io>> On Behalf Of Kumar G via groups.io
> <http://groups.io> Sent: 08 June 2020 09:15 To: devel@edk2.groups.io
> <devel@edk2.groups.io> Subject: [edk2-devel] Device and driver   Hi Edk2
> expert folks, I am starting on UEFI coming from Linux background, In Linux,
> There is clear identification of device and driver, platform code adds the
> device into system and later OS code binds driver for the same. With UEFI
> driver writer guide, I am bit confused, please help me, how devices are
> being added in UEFI. what code/API adds device. Let me ask with an example,
> say i have PCI controller then driver for this controller (DXE_DRIVER)
> could be named as controller handle. Now there could be a driver
> represented as device handle, which handles device connected over this
> PCIe. Now when PCIe bus driver scans the bus then it found a PCIe device,
> how this bus driver adds the device into system ? Second, say we have spi
> controller and with this controller there is spi flash. with UEFI
> terminology spi controller will be controller handle spi flash will be
> device and driver for this flash will be called driver handle. spi
> controller and spi flash are marked as DXE_DRIVER what I am missing,where
> are added spi flash as device in system ? Sorry for basic question, but
> UEFI is complicated w.r.t originally i thought Thanks KumarG   *
>
>
>
>
> *  *
>
>

-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#60951): https://edk2.groups.io/g/devel/message/60951
Mute This Topic: https://groups.io/mt/74749142/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to