diff options
Diffstat (limited to 'src/cpu/amd/dualcore/dualcore_id.c')
-rw-r--r-- | src/cpu/amd/dualcore/dualcore_id.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/cpu/amd/dualcore/dualcore_id.c b/src/cpu/amd/dualcore/dualcore_id.c new file mode 100644 index 0000000000..feab682851 --- /dev/null +++ b/src/cpu/amd/dualcore/dualcore_id.c @@ -0,0 +1,45 @@ +/* 2004.12 yhlu add dual core support */ + +#include <arch/cpu.h> +#include "cpu/amd/model_fxx/model_fxx_msr.h" + +static inline unsigned int read_nb_cfg_54(void) +{ + msr_t msr; + msr = rdmsr(NB_CFG_MSR); + return ( ( msr.hi >> (54-32)) & 1); +} + +struct node_core_id { + unsigned nodeid; + unsigned coreid; +}; + +static inline struct node_core_id get_node_core_id(unsigned nb_cfg_54) { + struct node_core_id id; + // get the apicid via cpuid(1) ebx[27:24] + if( nb_cfg_54) { + // when NB_CFG[54] is set, nodid = ebx[27:25], coreid = ebx[24] + id.coreid = (cpuid_ebx(1) >> 24) & 0xf; + id.nodeid = (id.coreid>>1); + id.coreid &= 1; + } + else + { + // when NB_CFG[54] is clear, nodeid = ebx[26:24], coreid = ebx[27] + id.nodeid = (cpuid_ebx(1) >> 24) & 0xf; + id.coreid = (id.nodeid>>3); + id.nodeid &= 7; + } + return id; +} + +static inline unsigned get_core_num(void) +{ + return (cpuid_ecx(0x80000008) & 0xff); +} + +static inline struct node_core_id get_node_core_id_x(void) { + return get_node_core_id( read_nb_cfg_54() ); +} + |