From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.88, mailfrom: michael.d.kinney@intel.com) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by groups.io with SMTP; Tue, 28 May 2019 10:06:42 -0700 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 May 2019 10:06:42 -0700 X-ExtLoop1: 1 Received: from orsmsx103.amr.corp.intel.com ([10.22.225.130]) by fmsmga005.fm.intel.com with ESMTP; 28 May 2019 10:06:41 -0700 Received: from orsmsx157.amr.corp.intel.com (10.22.240.23) by ORSMSX103.amr.corp.intel.com (10.22.225.130) with Microsoft SMTP Server (TLS) id 14.3.408.0; Tue, 28 May 2019 10:06:41 -0700 Received: from orsmsx113.amr.corp.intel.com ([169.254.9.231]) by ORSMSX157.amr.corp.intel.com ([169.254.9.37]) with mapi id 14.03.0415.000; Tue, 28 May 2019 10:06:40 -0700 From: "Michael D Kinney" To: "Kirkendall, Garrett" , "devel@edk2.groups.io" , "Wu, Hao A" , "Kinney, Michael D" CC: "Ni, Ray" , Andrew Fish , Laszlo Ersek , Leif Lindholm Subject: Re: 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) Thread-Topic: 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) Thread-Index: AdUVcyKWCxYtiJo2QI+CMTGTDjwSAgABCYow Date: Tue, 28 May 2019 17:06:41 +0000 Message-ID: References: In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: dlp-product: dlpe-windows dlp-version: 11.0.600.7 dlp-reaction: no-action x-originating-ip: [10.22.254.139] MIME-Version: 1.0 Return-Path: michael.d.kinney@intel.com Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Garrett, Two thoughts on this issue: 1) Just because 8259 is not used by UEFI FW does not mean the 8259 HW shou= ld not be initialized into an OS compatible state. This init code could b= e part of the chipset/si init code without requiring the 8259 driver/prot= ocol. 2) The HPET driver in PcAtChipsetPkg can be configured to use IOAPIC or MS= I delivery for interrupts. Is there a way for Linux to also use MSI=20 delivery instead of IOAPIC delivery? Thanks, Mike > -----Original Message----- > From: Kirkendall, Garrett > [mailto:Garrett.Kirkendall@amd.com] > Sent: Tuesday, May 28, 2019 9:36 AM > To: devel@edk2.groups.io; Wu, Hao A > > Cc: Ni, Ray ; Andrew Fish > ; Laszlo Ersek ; > Leif Lindholm ; Kinney, > Michael D > 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) >=20 > 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): >=20 > 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. >=20 > I sent the following to the responsible Linux Kernel > developers and quickly got back a "working as designed" > response: >=20 > ************************* > 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. >=20 > Observed under Ubuntu Server Linux 18.04 LTS with > kernel 4.15.0, and with kernel compiled from source tag > v5.0 >=20 > 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 >=20 >=20 > 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. >=20 > This sequence prevents allocating interrupts 0-15 > unless PIC is configured before kernel starts. > legacy_pic.init =3D 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 =3D 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 >=20 > 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 >=20 > 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 =3D 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 =3D 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 >=20 > 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 =3D > setup_boot_APIC_clock: > https://github.com/torvalds/linux/blob/v5.0/arch/x86/ke > rnel/x86_init.c#L74 >=20 > 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 >=20 > ************************* >=20 > GARRETT KIRKENDALL > SMTS Firmware Engineer | CTE > 7171 Southwest Parkway, Austin, TX 78735 USA > AMD=A0=A0 facebook=A0 |=A0 amd.com >=20 > -----Original Message----- > From: 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 ; Ray Ni > ; Andrew Fish ; > Laszlo Ersek ; Leif Lindholm > ; Michael D Kinney > > Subject: [edk2-devel] [RFC][PATCH v1 0/1] > PcAtChipsetPkg: Remove framework modules >=20 > [CAUTION: External Email] >=20 > ''' > Please note that this patch will be hold until all the > below requirements are met: >=20 > 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. > ''' >=20 > 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) >=20 >=20 > Below modules will be removed from PcAtChipsetPkg: > * PcAtChipsetPkg/8259InterruptControllerDxe/8259.inf > * PcAtChipsetPkg/8254TimerDxe/8254Timer.inf > * PcAtChipsetPkg/IsaAcpiDxe/IsaAcpi.inf >=20 > They are considered legacy framework components and > will no longer be used after the removal of > IntelFramework[Module]Pkg. >=20 > Also, the unused (after the modules being removed) PCDs > will be deleted in package level DEC/UNI files. >=20 > Cc: Ray Ni > Cc: Andrew Fish > Cc: Laszlo Ersek > Cc: Leif Lindholm > Cc: Michael D Kinney >=20 >=20 > Hao A Wu (1): > PcAtChipsetPkg: Remove framework modules >=20 > 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 - >=20 > PcAtChipsetPkg/8259InterruptControllerDxe/Legacy8259.un > i | 16 - >=20 > 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 >=20 > -- > 2.12.0.windows.1 >=20 >=20 >=20