Skip to content

Commit 9166542

Browse files
committed
Merge tag 'x86_apic_for_v5.19_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 APIC updates from Borislav Petkov: - Always do default APIC routing setup so that cpumasks are properly allocated and are present when later accessed ("nosmp" and x2APIC) - Clarify the bit overlap between an old APIC and a modern, integrated one * tag 'x86_apic_for_v5.19_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86/apic: Do apic driver probe for "nosmp" use case x86/apic: Clarify i82489DX bit overlap in APIC_LVT0
2 parents e3228a8 + 7a116a2 commit 9166542

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

arch/x86/include/asm/apicdef.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -95,12 +95,6 @@
9595
#define APIC_LVTTHMR 0x330
9696
#define APIC_LVTPC 0x340
9797
#define APIC_LVT0 0x350
98-
#define APIC_LVT_TIMER_BASE_MASK (0x3 << 18)
99-
#define GET_APIC_TIMER_BASE(x) (((x) >> 18) & 0x3)
100-
#define SET_APIC_TIMER_BASE(x) (((x) << 18))
101-
#define APIC_TIMER_BASE_CLKIN 0x0
102-
#define APIC_TIMER_BASE_TMBASE 0x1
103-
#define APIC_TIMER_BASE_DIV 0x2
10498
#define APIC_LVT_TIMER_ONESHOT (0 << 17)
10599
#define APIC_LVT_TIMER_PERIODIC (1 << 17)
106100
#define APIC_LVT_TIMER_TSCDEADLINE (2 << 17)

arch/x86/kernel/apic/apic.c

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ int lapic_get_maxlvt(void)
320320
#define APIC_DIVISOR 16
321321
#define TSC_DIVISOR 8
322322

323+
/* i82489DX specific */
324+
#define I82489DX_BASE_DIVIDER (((0x2) << 18))
325+
323326
/*
324327
* This function sets up the local APIC timer, with a timeout of
325328
* 'clocks' APIC bus clock. During calibration we actually call
@@ -340,8 +343,14 @@ static void __setup_APIC_LVTT(unsigned int clocks, int oneshot, int irqen)
340343
else if (boot_cpu_has(X86_FEATURE_TSC_DEADLINE_TIMER))
341344
lvtt_value |= APIC_LVT_TIMER_TSCDEADLINE;
342345

346+
/*
347+
* The i82489DX APIC uses bit 18 and 19 for the base divider. This
348+
* overlaps with bit 18 on integrated APICs, but is not documented
349+
* in the SDM. No problem though. i82489DX equipped systems do not
350+
* have TSC deadline timer.
351+
*/
343352
if (!lapic_is_integrated())
344-
lvtt_value |= SET_APIC_TIMER_BASE(APIC_TIMER_BASE_DIV);
353+
lvtt_value |= I82489DX_BASE_DIVIDER;
345354

346355
if (!irqen)
347356
lvtt_value |= APIC_LVT_MASKED;
@@ -1419,22 +1428,21 @@ void __init apic_intr_mode_init(void)
14191428
return;
14201429
case APIC_VIRTUAL_WIRE:
14211430
pr_info("APIC: Switch to virtual wire mode setup\n");
1422-
default_setup_apic_routing();
14231431
break;
14241432
case APIC_VIRTUAL_WIRE_NO_CONFIG:
14251433
pr_info("APIC: Switch to virtual wire mode setup with no configuration\n");
14261434
upmode = true;
1427-
default_setup_apic_routing();
14281435
break;
14291436
case APIC_SYMMETRIC_IO:
14301437
pr_info("APIC: Switch to symmetric I/O mode setup\n");
1431-
default_setup_apic_routing();
14321438
break;
14331439
case APIC_SYMMETRIC_IO_NO_ROUTING:
14341440
pr_info("APIC: Switch to symmetric I/O mode setup in no SMP routine\n");
14351441
break;
14361442
}
14371443

1444+
default_setup_apic_routing();
1445+
14381446
if (x86_platform.apic_post_init)
14391447
x86_platform.apic_post_init();
14401448

0 commit comments

Comments
 (0)