public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Tomas Pilar (tpilar)" <Tomas.Pilar@arm.com>
To: "devel@edk2.groups.io" <devel@edk2.groups.io>,
	"kumarg27061979@gmail.com" <kumarg27061979@gmail.com>
Cc: nd <nd@arm.com>
Subject: Re: [edk2-devel] Device and driver
Date: Mon, 8 Jun 2020 11:33:59 +0000	[thread overview]
Message-ID: <AM5PR0801MB1844B2632BF08C4F6234FB37E7850@AM5PR0801MB1844.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <CA+mqX-xroUWiQ2GqO-n+oGX+T0KqPgqVx0sMaY3yFmHCcLnFRw@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 3915 bytes --]

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> On Behalf Of Kumar G via groups.io
Sent: 08 June 2020 09:15
To: 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



[-- Attachment #2: Type: text/html, Size: 7880 bytes --]

  reply	other threads:[~2020-06-08 11:34 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-08  8:15 Device and driver kumarg27061979
2020-06-08 11:33 ` Tomas Pilar (tpilar) [this message]
2020-06-08 18:10   ` [edk2-devel] " Kumar G
2020-06-09  9:56     ` Tomas Pilar (tpilar)
2020-06-09 11:16       ` Kumar G
2020-06-09 21:48       ` Andrew Fish

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM5PR0801MB1844B2632BF08C4F6234FB37E7850@AM5PR0801MB1844.eurprd08.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox