xref: /openbmc/u-boot/arch/x86/cpu/lapic.c (revision 0c9075e9)
1*0c9075e9SSimon Glass /*
2*0c9075e9SSimon Glass  * From coreboot file of same name
3*0c9075e9SSimon Glass  *
4*0c9075e9SSimon Glass  * Copyright (C) 2008-2009 coresystems GmbH
5*0c9075e9SSimon Glass  * Copyright (C) 2014 Google, Inc
6*0c9075e9SSimon Glass  *
7*0c9075e9SSimon Glass  * SPDX-License-Identifier:	GPL-2.0
8*0c9075e9SSimon Glass  */
9*0c9075e9SSimon Glass 
10*0c9075e9SSimon Glass #include <common.h>
11*0c9075e9SSimon Glass #include <asm/msr.h>
12*0c9075e9SSimon Glass #include <asm/io.h>
13*0c9075e9SSimon Glass #include <asm/lapic.h>
14*0c9075e9SSimon Glass #include <asm/post.h>
15*0c9075e9SSimon Glass 
16*0c9075e9SSimon Glass void lapic_setup(void)
17*0c9075e9SSimon Glass {
18*0c9075e9SSimon Glass #if NEED_LAPIC == 1
19*0c9075e9SSimon Glass 	/* Only Pentium Pro and later have those MSR stuff */
20*0c9075e9SSimon Glass 	debug("Setting up local apic: ");
21*0c9075e9SSimon Glass 
22*0c9075e9SSimon Glass 	/* Enable the local apic */
23*0c9075e9SSimon Glass 	enable_lapic();
24*0c9075e9SSimon Glass 
25*0c9075e9SSimon Glass 	/*
26*0c9075e9SSimon Glass 	 * Set Task Priority to 'accept all'.
27*0c9075e9SSimon Glass 	 */
28*0c9075e9SSimon Glass 	lapic_write_around(LAPIC_TASKPRI,
29*0c9075e9SSimon Glass 			   lapic_read_around(LAPIC_TASKPRI) & ~LAPIC_TPRI_MASK);
30*0c9075e9SSimon Glass 
31*0c9075e9SSimon Glass 	/* Put the local apic in virtual wire mode */
32*0c9075e9SSimon Glass 	lapic_write_around(LAPIC_SPIV, (lapic_read_around(LAPIC_SPIV) &
33*0c9075e9SSimon Glass 				~(LAPIC_VECTOR_MASK)) | LAPIC_SPIV_ENABLE);
34*0c9075e9SSimon Glass 	lapic_write_around(LAPIC_LVT0, (lapic_read_around(LAPIC_LVT0) &
35*0c9075e9SSimon Glass 			~(LAPIC_LVT_MASKED | LAPIC_LVT_LEVEL_TRIGGER |
36*0c9075e9SSimon Glass 			  LAPIC_LVT_REMOTE_IRR | LAPIC_INPUT_POLARITY |
37*0c9075e9SSimon Glass 			  LAPIC_SEND_PENDING | LAPIC_LVT_RESERVED_1 |
38*0c9075e9SSimon Glass 			  LAPIC_DELIVERY_MODE_MASK)) |
39*0c9075e9SSimon Glass 			(LAPIC_LVT_REMOTE_IRR | LAPIC_SEND_PENDING |
40*0c9075e9SSimon Glass 			 LAPIC_DELIVERY_MODE_EXTINT));
41*0c9075e9SSimon Glass 	lapic_write_around(LAPIC_LVT1, (lapic_read_around(LAPIC_LVT1) &
42*0c9075e9SSimon Glass 			~(LAPIC_LVT_MASKED | LAPIC_LVT_LEVEL_TRIGGER |
43*0c9075e9SSimon Glass 			  LAPIC_LVT_REMOTE_IRR | LAPIC_INPUT_POLARITY |
44*0c9075e9SSimon Glass 			  LAPIC_SEND_PENDING | LAPIC_LVT_RESERVED_1 |
45*0c9075e9SSimon Glass 			  LAPIC_DELIVERY_MODE_MASK)) |
46*0c9075e9SSimon Glass 		(LAPIC_LVT_REMOTE_IRR | LAPIC_SEND_PENDING |
47*0c9075e9SSimon Glass 			LAPIC_DELIVERY_MODE_NMI));
48*0c9075e9SSimon Glass 
49*0c9075e9SSimon Glass 	debug("apic_id: 0x%02lx, ", lapicid());
50*0c9075e9SSimon Glass #else /* !NEED_LLAPIC */
51*0c9075e9SSimon Glass 	/* Only Pentium Pro and later have those MSR stuff */
52*0c9075e9SSimon Glass 	debug("Disabling local apic: ");
53*0c9075e9SSimon Glass 	disable_lapic();
54*0c9075e9SSimon Glass #endif /* !NEED_LAPIC */
55*0c9075e9SSimon Glass 	debug("done.\n");
56*0c9075e9SSimon Glass 	post_code(POST_LAPIC);
57*0c9075e9SSimon Glass }
58