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