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/kernel/apic/apic.c#L805
specific location of soft hang waiting for interrupts: 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/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/kernel/apic/vector.c#L656
        default_legacy_pic.probe: 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/i8259.c#L418
          probe_8259A(): 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/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/kernel/time.c#L107
      x86_init.timers.timer_init(): 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/time.c#L92
        x86_init.timers.timer_init = hpet_time_init: 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/x86_init.c#L75
          setup_default_timer_irq(): 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/time.c#L83
            if (setup_irq(0, &irq0)): 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/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/kernel/x86_init.c#L74
    https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/apic/apic.c#L961
      *** soft hang in calibrate_APIC_clock(): 
https://github.com/torvalds/linux/blob/v5.0/arch/x86/kernel/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@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Wu, Hao A via 
Groups.Io
Sent: Monday, May 27, 2019 1:37 AM
To: devel@edk2.groups.io
Cc: Hao A Wu <hao.a...@intel.com>; Ray Ni <ray...@intel.com>; Andrew Fish 
<af...@apple.com>; Laszlo Ersek <ler...@redhat.com>; Leif Lindholm 
<leif.lindh...@linaro.org>; Michael D Kinney <michael.d.kin...@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/84e58f89f6d03f9cc3399cced9d5d5529e06a416)


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...@intel.com>
Cc: Andrew Fish <af...@apple.com>
Cc: Laszlo Ersek <ler...@redhat.com>
Cc: Leif Lindholm <leif.lindh...@linaro.org>
Cc: Michael D Kinney <michael.d.kin...@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.uni      |  16 -
 PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259Extra.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.uni
 delete mode 100644 
PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259Extra.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 (#41518): https://edk2.groups.io/g/devel/message/41518
Mute This Topic: https://groups.io/mt/31823819/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to