[ipxe-devel] [PATCH 1/1] efi: provide possibility to disable cpu_nap

Heinrich Schuchardt xypron.glpk at gmx.de
Thu Jul 13 05:50:46 UTC 2017

On 07/13/2017 01:35 AM, Michael Brown wrote:
> On 12/07/17 19:50, Heinrich Schuchardt wrote:
>> On 07/12/2017 08:35 PM, Michael Brown wrote:
>>> On 12/07/17 19:15, Heinrich Schuchardt wrote:
>>>> Nope. Interrupts are not supported by U-Boot. To get them running every
>>>> architecture implementation would have to be changed.
>>>> U-Boot simply uses a call inside the waiting loop to check if new data
>>>> is available.
>>>> E.g. in UEFI WaitForEvent it will check if new data becomes
>>>> available on
>>>> the serial console or on the network interface inside a loop. In
>>>> CheckEvent it will do the same. If data becomes available it will fire
>>>> the UEFI event.
>>> OK.  What facility does U-Boot provide to allow the CPU to sleep (i.e.
>>> to allow an idling program to avoid running with 100% CPU usage)?
>> None. U-Boot loads grub or the OS kernel within a few seconds. So why
>> bother about reducing CPU load of the only core that is running?
>> E.g. on the Davinci boards the waiting routine udelay is implemented
>> using
>> while (get_ticks() < endtime)
>>    ;
> iPXE similarly doesn't bother about reducing CPU load while downloading
> the OS since it will generally be finished in under a second, but we do
> sleep the CPU when we have nothing to do for long periods of time (e.g.
> when waiting for user input, or in the middle of an explicit "sleep"
> command).
> You could add code in efiarm_nap.c and/or efix86_nap.c to detect whether
> or not it is safe to sleep the CPU.  The attached (completely untested)
> patch demonstrates this idea: modify the cpu_nap() implementation in
> efix86_nap.c to execute "hlt" only if the platform firmware has enabled
> interrupts.
> Michael

By analyzing CPU registers it is not possible to find out if the
external hardware is set up to trigger interrupts.

E.g. interrupts may be enabled in the CPU to handle unaligned memory
access but the UART might not create an interrupt when a new byte
arrives at the serial console.

On UEFI we want to avoid direct hardware access. So I do not see any
chance to determine at runtime if certain interrupts may occur of not.

What is wrong about deciding at compile time if we enable cpu_nap()?

Best regards


More information about the ipxe-devel mailing list