Commit 43f1c206 authored by Martin J. Bligh's avatar Martin J. Bligh Committed by Patrick Mochel

[PATCH] abstract out mpparse code

Most of code originally by James Cleverdon.

Abstracts out code from the mpparse stuff into:

 - mpc_apic_id()
 - apicid_to_cpu_present()

instead of using clustered_apic_mode switching.
parent df0e5a8f
...@@ -104,28 +104,12 @@ static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdat ...@@ -104,28 +104,12 @@ static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdat
void __init MP_processor_info (struct mpc_config_processor *m) void __init MP_processor_info (struct mpc_config_processor *m)
{ {
int ver, quad, logical_apicid; int ver, apicid;
if (!(m->mpc_cpuflag & CPU_ENABLED)) if (!(m->mpc_cpuflag & CPU_ENABLED))
return; return;
logical_apicid = m->mpc_apicid; apicid = mpc_apic_id(m, translation_table[mpc_record]->trans_quad);
if (clustered_apic_mode) {
quad = translation_table[mpc_record]->trans_quad;
logical_apicid = (quad << 4) +
(m->mpc_apicid ? m->mpc_apicid << 1 : 1);
printk("Processor #%d %ld:%ld APIC version %d (quad %d, apic %d)\n",
m->mpc_apicid,
(m->mpc_cpufeature & CPU_FAMILY_MASK)>>8,
(m->mpc_cpufeature & CPU_MODEL_MASK)>>4,
m->mpc_apicver, quad, logical_apicid);
} else {
printk("Processor #%d %ld:%ld APIC version %d\n",
m->mpc_apicid,
(m->mpc_cpufeature & CPU_FAMILY_MASK)>>8,
(m->mpc_cpufeature & CPU_MODEL_MASK)>>4,
m->mpc_apicver);
}
if (m->mpc_featureflag&(1<<0)) if (m->mpc_featureflag&(1<<0))
Dprintk(" Floating point unit present.\n"); Dprintk(" Floating point unit present.\n");
...@@ -178,7 +162,7 @@ void __init MP_processor_info (struct mpc_config_processor *m) ...@@ -178,7 +162,7 @@ void __init MP_processor_info (struct mpc_config_processor *m)
if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) { if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
Dprintk(" Bootup CPU\n"); Dprintk(" Bootup CPU\n");
boot_cpu_physical_apicid = m->mpc_apicid; boot_cpu_physical_apicid = m->mpc_apicid;
boot_cpu_logical_apicid = logical_apicid; boot_cpu_logical_apicid = apicid;
} }
num_processors++; num_processors++;
...@@ -191,11 +175,8 @@ void __init MP_processor_info (struct mpc_config_processor *m) ...@@ -191,11 +175,8 @@ void __init MP_processor_info (struct mpc_config_processor *m)
} }
ver = m->mpc_apicver; ver = m->mpc_apicver;
if (clustered_apic_mode) { phys_cpu_present_map |= apicid_to_cpu_present(apicid);
phys_cpu_present_map |= (logical_apicid&0xf) << (4*quad);
} else {
phys_cpu_present_map |= apicid_to_cpu_present(m->mpc_apicid);
}
/* /*
* Validate version * Validate version
*/ */
......
...@@ -57,9 +57,19 @@ static inline int cpu_present_to_apicid(int mps_cpu) ...@@ -57,9 +57,19 @@ static inline int cpu_present_to_apicid(int mps_cpu)
return mps_cpu; return mps_cpu;
} }
static inline unsigned long apicid_to_cpu_present(int apicid) static inline unsigned long apicid_to_cpu_present(int phys_apicid)
{ {
return (1ul << apicid); return (1ul << phys_apicid);
}
static inline int mpc_apic_id(struct mpc_config_processor *m, int quad)
{
printk("Processor #%d %ld:%ld APIC version %d\n",
m->mpc_apicid,
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
m->mpc_apicver);
return (m->mpc_apicid);
} }
#endif /* __ASM_MACH_APIC_H */ #endif /* __ASM_MACH_APIC_H */
...@@ -40,9 +40,31 @@ static inline int cpu_present_to_apicid(int mps_cpu) ...@@ -40,9 +40,31 @@ static inline int cpu_present_to_apicid(int mps_cpu)
return ( ((mps_cpu/4)*16) + (1<<(mps_cpu%4)) ); return ( ((mps_cpu/4)*16) + (1<<(mps_cpu%4)) );
} }
static inline unsigned long apicid_to_cpu_present(int apicid) static inline int generate_logical_apicid(int quad, int phys_apicid)
{ {
return (1ul << apicid); return ( (quad << 4) + (phys_apicid ? phys_apicid << 1 : 1) );
}
static inline int apicid_to_quad(int logical_apicid)
{
return (logical_apicid >> 4);
}
static inline unsigned long apicid_to_cpu_present(int logical_apicid)
{
return ( (logical_apicid&0xf) << (4*apicid_to_quad(logical_apicid)) );
}
static inline int mpc_apic_id(struct mpc_config_processor *m, int quad)
{
int logical_apicid = generate_logical_apicid(quad, m->mpc_apicid);
printk("Processor #%d %ld:%ld APIC version %d (quad %d, apic %d)\n",
m->mpc_apicid,
(m->mpc_cpufeature & CPU_FAMILY_MASK) >> 8,
(m->mpc_cpufeature & CPU_MODEL_MASK) >> 4,
m->mpc_apicver, quad, logical_apicid);
return logical_apicid;
} }
#endif /* __ASM_MACH_APIC_H */ #endif /* __ASM_MACH_APIC_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment