Remove inline from FAM10 CPU initialization functions.
[coreboot.git] / src / cpu / amd / quadcore / quadcore_id.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2007 Advanced Micro Devices, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18  */
19
20
21 #include <arch/cpu.h>
22 #include <cpu/amd/quadcore.h>
23 #ifdef __ROMCC__
24 #include <cpu/amd/model_10xxx_msr.h>
25 #endif
26
27 //called by bus_cpu_scan too
28 u32 read_nb_cfg_54(void)
29 {
30         msr_t msr;
31         msr = rdmsr(NB_CFG_MSR);
32         return ( ( msr.hi >> (54-32)) & 1);
33 }
34
35 static u32 get_initial_apicid(void)
36 {
37         return ((cpuid_ebx(1) >> 24) & 0xff);
38 }
39
40 //called by amd_siblings too
41 #define CORE_ID_BIT 2
42 #define NODE_ID_BIT 6
43 struct node_core_id get_node_core_id(u32 nb_cfg_54)
44 {
45         struct node_core_id id;
46         u32 core_id_bits;
47
48         u32 ApicIdCoreIdSize = (cpuid_ecx(0x80000008)>>12 & 0xf);
49         if(ApicIdCoreIdSize) {
50                 core_id_bits = ApicIdCoreIdSize;
51         } else {
52                 core_id_bits = CORE_ID_BIT; //quad core
53         }
54
55         // get the apicid via cpuid(1) ebx[31:24]
56         if( nb_cfg_54) {
57                 // when NB_CFG[54] is set, nodeid = ebx[31:26], coreid = ebx[25:24]
58                 id.coreid = (cpuid_ebx(1) >> 24) & 0xff;
59                 id.nodeid = (id.coreid>>core_id_bits);
60                 id.coreid &= ((1<<core_id_bits)-1);
61         } else {
62                 // when NB_CFG[54] is clear, nodeid = ebx[29:24], coreid = ebx[31:30]
63                 id.nodeid = (cpuid_ebx(1) >> 24) & 0xff;
64                 id.coreid = (id.nodeid>>NODE_ID_BIT);
65                 id.nodeid &= ((1<<NODE_ID_BIT)-1);
66         }
67         return id;
68 }
69
70 static u32 get_core_num(void)
71 {
72         return (cpuid_ecx(0x80000008) & 0xff);
73 }
74
75 static struct node_core_id get_node_core_id_x(void) {
76
77         return get_node_core_id( read_nb_cfg_54() );
78 }
79