soc/intel/apollolake: Take advantage of common opregion code
[coreboot.git] / src / soc / intel / apollolake / exit_car.S
blob339242b3192b73894a7d4906d4a5bbcd5e2e6d5c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright 2016 Google Inc.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; version 2 of
9  * the License.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  */
17 #include <cpu/x86/mtrr.h>
18 #include <cpu/x86/cr.h>
19 #include <soc/cpu.h>
21 .text
22 .global chipset_teardown_car
23 chipset_teardown_car:
24         /*
25          * Retrieve return address from stack as it will get trashed below if
26          * execution is utilizing the cache-as-ram stack.
27          */
28         pop     %ebx
30         /* invalidate cache contents. */
31         invd
32         /* Disable MTRRs. */
33         mov     $(MTRR_DEF_TYPE_MSR), %ecx
34         rdmsr
35         and     $(~(MTRR_DEF_TYPE_EN | MTRR_DEF_TYPE_FIX_EN)), %eax
36         wrmsr
38         /* Knock down bit 1 then bit 0 of NEM control not combining steps. */
39         mov     $(MSR_EVICT_CTL), %ecx
40         rdmsr
41         and     $(~(1 << 1)), %eax
42         wrmsr
43         and     $(~(1 << 0)), %eax
44         wrmsr
46         /* Return to caller. */
47         jmp     *%ebx