Linux Kernel soft hangs if 8259 PIC is not configured by BIOS: was (RE: [edk2-devel] [RFC][PATCH v1 0/1] PcAtChipsetPkg: Remove framework modules)

Michael D Kinney michael.d.kinney at intel.com
Tue May 28 17:06:41 UTC 2019


Hi Garrett,

Two thoughts on this issue:

1) Just because 8259 is not used by UEFI FW does not mean the 8259 HW should
   not be initialized into an OS compatible state.  This init code could be
   part of the chipset/si init code without requiring the 8259 driver/protocol.
2) The HPET driver in PcAtChipsetPkg can be configured to use IOAPIC or MSI
   delivery for interrupts.  Is there a way for Linux to also use MSI 
   delivery instead of IOAPIC delivery?

Thanks,

Mike

> -----Original Message-----
> From: Kirkendall, Garrett
> [mailto:Garrett.Kirkendall at amd.com]
> Sent: Tuesday, May 28, 2019 9:36 AM
> To: devel at edk2.groups.io; Wu, Hao A
> <hao.a.wu at intel.com>
> Cc: Ni, Ray <ray.ni at intel.com>; Andrew Fish
> <afish at apple.com>; Laszlo Ersek <lersek at redhat.com>;
> Leif Lindholm <leif.lindholm at linaro.org>; Kinney,
> Michael D <michael.d.kinney at intel.com>
> Subject: Linux Kernel soft hangs if 8259 PIC is not
> configured by BIOS: was (RE: [edk2-devel] [RFC][PATCH
> v1 0/1] PcAtChipsetPkg: Remove framework modules)
> 
> Since this change will be removing the 8259 PIC driver,
> I'll mention a quirk I ran into in the Linux Kernel up
> through at least 5.0 (and I am sure later, I just
> didn't verify):
> 
> Does anyone have pull in the Linux Kernel world to get
> them to take this seriously?  Hopefully someday soon
> end users will let legacy devices, like the PIC, die a
> long overdue and graceful death.
> 
> I sent the following to the responsible Linux Kernel
> developers and quickly got back a "working as designed"
> response:
> 
> *************************
> I am trying to boot a UEFI BIOS with minimal legacy
> hardware support.  The Linux kernel soft hangs when the
> PIC is not configured by the BIOS because it is using
> IOAPIC.  Hopefully, this provides enough information.
> 
> Observed under Ubuntu Server Linux 18.04 LTS with
> kernel 4.15.0, and with kernel compiled from source tag
> v5.0
> 
> Where it hangs:
> Soft hang occurs in calibrate_APIC_clock():
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/apic/apic.c#L805
> specific location of soft hang waiting for interrupts:
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/apic/apic.c#L854
> 
> 
> How it gets to the hang:
> If 8259A PIC is not configured before kernel is
> launched, HPET IRQ 0 registration fails because
> probe_8259A returns PIC as not available and therefore
> interrupt descriptors 0-15 are not allocated.  This
> happens when BIOS does not configure 8259A PIC because
> it uses IOAPIC.
> 
> This sequence prevents allocating interrupts 0-15
> unless PIC is configured before kernel starts.
> legacy_pic.init = init_8259A is not called before
> early_irq_init():
>   early_irq_init():
> https://github.com/torvalds/linux/blob/v5.0/init/main.c
> #L642
>     initcnt = arch_probe_nr_irqs():
> https://github.com/torvalds/linux/blob/v5.0/kernel/irq/
> irqdesc.c#L512
>       return legacy_pic->probe():
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/apic/vector.c#L656
>         default_legacy_pic.probe:
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/i8259.c#L418
>           probe_8259A():
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/i8259.c#L301
>     interrupt 0-15 descriptors not allocated and
> prevents IOAPIC interrupts 0-15:
> https://github.com/torvalds/linux/blob/v5.0/kernel/irq/
> irqdesc.c#L525
> 
> In this call is where init_8259A is called and PIC is
> initialized.  However, interrupt descriptors for 0-15
> were not allocated in early_irq_init() sequence, so
> descriptors are not available later.
>   init_IRQ() :
> https://github.com/torvalds/linux/blob/v5.0/init/main.c
> #L643
> 
> This sequence tries to register the HPET to irq0, but
> irq0 descriptor is not allocated by early_irq_init()
> sequence:
>   late_time_init():
> https://github.com/torvalds/linux/blob/v5.0/init/main.c
> #L703
>     late_time_init = x86_late_time_init:
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/time.c#L107
>       x86_init.timers.timer_init():
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/time.c#L92
>         x86_init.timers.timer_init = hpet_time_init:
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/x86_init.c#L75
>           setup_default_timer_irq():
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/time.c#L83
>             if (setup_irq(0, &irq0)):
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/time.c#L78
> 
> This gets called at some point after the above
> sequences, I couldn't track it all the way back to
> main.c easily:
>   x86_init.timers.setup_percpu_clockev =
> setup_boot_APIC_clock:
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/x86_init.c#L74
> 
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/apic/apic.c#L961
>       *** soft hang in calibrate_APIC_clock():
> https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke
> rnel/apic/apic.c#L854
> 
> *************************
> 
> GARRETT KIRKENDALL
> SMTS Firmware Engineer | CTE
> 7171 Southwest Parkway, Austin, TX 78735 USA
> AMD   facebook  |  amd.com
> 
> -----Original Message-----
> From: devel at edk2.groups.io <devel at edk2.groups.io> On
> Behalf Of Wu, Hao A via Groups.Io
> Sent: Monday, May 27, 2019 1:37 AM
> To: devel at edk2.groups.io
> Cc: Hao A Wu <hao.a.wu at intel.com>; Ray Ni
> <ray.ni at intel.com>; Andrew Fish <afish at apple.com>;
> Laszlo Ersek <lersek at redhat.com>; Leif Lindholm
> <leif.lindholm at linaro.org>; Michael D Kinney
> <michael.d.kinney at intel.com>
> Subject: [edk2-devel] [RFC][PATCH v1 0/1]
> PcAtChipsetPkg: Remove framework modules
> 
> [CAUTION: External Email]
> 
> '''
> Please note that this patch will be hold until all the
> below requirements are met:
> 
> A. edk2-stable201905 is created;
> B. OvmfPkg has drop its usage of the legacy ISA stack
> (which includes
>    the IsaAcpiDxe driver);
> C. UefiPayloadPkg has been updated to drop its consume
> to the
>    8259InterruptControllerDxe driver.
> '''
> 
> This patch itself will not be sent to the mailing list
> and is only available at:
> https://github.com/hwu25/edk2/tree/delete_framework
> (https://github.com/hwu25/edk2/commit/84e58f89f6d03f9cc
> 3399cced9d5d5529e06a416)
> 
> 
> Below modules will be removed from PcAtChipsetPkg:
> * PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
> * PcAtChipsetPkg/8254TimerDxe/8254Timer.inf
> * PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf
> 
> They are considered legacy framework components and
> will no longer be used after the removal of
> IntelFramework[Module]Pkg.
> 
> Also, the unused (after the modules being removed) PCDs
> will be deleted in package level DEC/UNI files.
> 
> Cc: Ray Ni <ray.ni at intel.com>
> Cc: Andrew Fish <afish at apple.com>
> Cc: Laszlo Ersek <lersek at redhat.com>
> Cc: Leif Lindholm <leif.lindholm at linaro.org>
> Cc: Michael D Kinney <michael.d.kinney at intel.com>
> 
> 
> Hao A Wu (1):
>   PcAtChipsetPkg: Remove framework modules
> 
>  PcAtChipsetPkg/PcAtChipsetPkg.dec
> |  58 --
>  PcAtChipsetPkg/PcAtChipsetPkg.dsc
> |   5 +-
>  PcAtChipsetPkg/8254TimerDxe/8254Timer.inf
> |  42 --
>  PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
> |  46 --
>  PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf
> |  50 --
>  PcAtChipsetPkg/8254TimerDxe/Timer.h
> | 185 ------
>  PcAtChipsetPkg/8259InterruptControllerDxe/8259.h
> | 220 -------
>  PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h
> | 269 ---------
>  PcAtChipsetPkg/8254TimerDxe/Timer.c
> | 401 -------------
>  PcAtChipsetPkg/8259InterruptControllerDxe/8259.c
> | 622 --------------------
>  PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c
> | 301 ----------
>  PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c
> | 353 -----------
>  PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c
> | 386 ------------
>  PcAtChipsetPkg/8254TimerDxe/Timer.uni
> |  16 -
>  PcAtChipsetPkg/8254TimerDxe/TimerExtra.uni
> |  14 -
> 
> PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259.un
> i      |  16 -
> 
> PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259Ext
> ra.uni |  14 -
>  PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.uni
> |  16 -
>  PcAtChipsetPkg/IsaAcpiDxe/IsaAcpiExtra.uni
> |  14 -
>  PcAtChipsetPkg/PcAtChipsetPkg.uni
> |  52 +-
>  20 files changed, 2 insertions(+), 3078 deletions(-)
> delete mode 100644
> PcAtChipsetPkg/8254TimerDxe/8254Timer.inf
>  delete mode 100644
> PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf
>  delete mode 100644
> PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf
>  delete mode 100644 PcAtChipsetPkg/8254TimerDxe/Timer.h
>  delete mode 100644
> PcAtChipsetPkg/8259InterruptControllerDxe/8259.h
>  delete mode 100644
> PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.h
>  delete mode 100644 PcAtChipsetPkg/8254TimerDxe/Timer.c
>  delete mode 100644
> PcAtChipsetPkg/8259InterruptControllerDxe/8259.c
>  delete mode 100644
> PcAtChipsetPkg/IsaAcpiDxe/ComponentName.c
>  delete mode 100644 PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.c
>  delete mode 100644
> PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c
>  delete mode 100644
> PcAtChipsetPkg/8254TimerDxe/Timer.uni
>  delete mode 100644
> PcAtChipsetPkg/8254TimerDxe/TimerExtra.uni
>  delete mode 100644
> PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259.un
> i
>  delete mode 100644
> PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259Ext
> ra.uni
>  delete mode 100644
> PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.uni
>  delete mode 100644
> PcAtChipsetPkg/IsaAcpiDxe/IsaAcpiExtra.uni
> 
> --
> 2.12.0.windows.1
> 
> 
> 


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

View/Reply Online (#41530): https://edk2.groups.io/g/devel/message/41530
Mute This Topic: https://groups.io/mt/31823819/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list