--- /dev/null
+From: Yinghai Lu <yhlu.kernel@gmail.com>
+Subject: x86: make 64bit have get_apic_id
+References: fate #303948 and fate #303984
+Patch-Mainline: queued for .28
+Commit-ID: f910a9dc7c865896815e2a95fe33363e9522f277
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+
+generalize the x2apic code some more.
+
+let read_apic_id become a macro (later on a function/inline)
+GET_APIC_ID(apic_read(APIC_ID))
+
+ +#define read_apic_id() (GET_APIC_ID(apic_read(APIC_ID)))
+
+instead of this weird construct:
+
+ -#define read_apic_id (genapic->read_apic_id)
+
+Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
+Cc: Suresh Siddha <suresh.b.siddha@intel.com>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+
+---
+ arch/x86/kernel/genapic_flat_64.c | 26 +++++++++++++++++++++++---
+ arch/x86/kernel/genx2apic_cluster.c | 20 +++++++++++++++++++-
+ arch/x86/kernel/genx2apic_phys.c | 20 +++++++++++++++++++-
+ arch/x86/kernel/genx2apic_uv_x.c | 23 ++++++++++++++++++++---
+ include/asm-x86/genapic_64.h | 4 +++-
+ include/asm-x86/mach-default/mach_apic.h | 2 +-
+ include/asm-x86/mach-default/mach_apicdef.h | 6 +++---
+ 7 files changed, 88 insertions(+), 13 deletions(-)
+
+Index: linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
+===================================================================
+--- linux-2.6.26.orig/arch/x86/kernel/genapic_flat_64.c
++++ linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
+@@ -97,11 +97,27 @@ static void flat_send_IPI_all(int vector
+ __send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
+ }
+
++static unsigned int get_apic_id(unsigned long x)
++{
++ unsigned int id;
++
++ id = (((x)>>24) & 0xFFu);
++ return id;
++}
++
++static unsigned long set_apic_id(unsigned int id)
++{
++ unsigned long x;
++
++ x = ((id & 0xFFu)<<24);
++ return x;
++}
++
+ static unsigned int read_xapic_id(void)
+ {
+ unsigned int id;
+
+- id = GET_APIC_ID(apic_read(APIC_ID));
++ id = get_apic_id(apic_read(APIC_ID));
+ return id;
+ }
+
+@@ -134,7 +150,9 @@ struct genapic apic_flat = {
+ .send_IPI_self = apic_send_IPI_self,
+ .cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
+ .phys_pkg_id = phys_pkg_id,
+- .read_apic_id = read_xapic_id,
++ .get_apic_id = get_apic_id,
++ .set_apic_id = set_apic_id,
++ .apic_id_mask = (0xFFu<<24),
+ };
+
+ /*
+@@ -200,5 +218,7 @@ struct genapic apic_physflat = {
+ .send_IPI_self = apic_send_IPI_self,
+ .cpu_mask_to_apicid = physflat_cpu_mask_to_apicid,
+ .phys_pkg_id = phys_pkg_id,
+- .read_apic_id = read_xapic_id,
++ .get_apic_id = get_apic_id,
++ .set_apic_id = set_apic_id,
++ .apic_id_mask = (0xFFu<<24),
+ };
+Index: linux-2.6.26/arch/x86/kernel/genx2apic_cluster.c
+===================================================================
+--- linux-2.6.26.orig/arch/x86/kernel/genx2apic_cluster.c
++++ linux-2.6.26/arch/x86/kernel/genx2apic_cluster.c
+@@ -94,6 +94,22 @@ static unsigned int x2apic_cpu_mask_to_a
+ return BAD_APICID;
+ }
+
++static unsigned int get_apic_id(unsigned long x)
++{
++ unsigned int id;
++
++ id = x;
++ return id;
++}
++
++static unsigned long set_apic_id(unsigned int id)
++{
++ unsigned long x;
++
++ x = id;
++ return x;
++}
++
+ static unsigned int x2apic_read_id(void)
+ {
+ return apic_read(APIC_ID);
+@@ -131,5 +147,7 @@ struct genapic apic_x2apic_cluster = {
+ .send_IPI_self = x2apic_send_IPI_self,
+ .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
+ .phys_pkg_id = phys_pkg_id,
+- .read_apic_id = x2apic_read_id,
++ .get_apic_id = get_apic_id,
++ .set_apic_id = set_apic_id,
++ .apic_id_mask = (0xFFFFFFFFu),
+ };
+Index: linux-2.6.26/arch/x86/kernel/genx2apic_phys.c
+===================================================================
+--- linux-2.6.26.orig/arch/x86/kernel/genx2apic_phys.c
++++ linux-2.6.26/arch/x86/kernel/genx2apic_phys.c
+@@ -84,6 +84,22 @@ static unsigned int x2apic_cpu_mask_to_a
+ return BAD_APICID;
+ }
+
++static unsigned int get_apic_id(unsigned long x)
++{
++ unsigned int id;
++
++ id = x;
++ return id;
++}
++
++static unsigned long set_apic_id(unsigned int id)
++{
++ unsigned long x;
++
++ x = id;
++ return x;
++}
++
+ static unsigned int x2apic_read_id(void)
+ {
+ return apic_read(APIC_ID);
+@@ -118,5 +134,7 @@ struct genapic apic_x2apic_phys = {
+ .send_IPI_self = x2apic_send_IPI_self,
+ .cpu_mask_to_apicid = x2apic_cpu_mask_to_apicid,
+ .phys_pkg_id = phys_pkg_id,
+- .read_apic_id = x2apic_read_id,
++ .get_apic_id = get_apic_id,
++ .set_apic_id = set_apic_id,
++ .apic_id_mask = (0xFFFFFFFFu),
+ };
+Index: linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
+===================================================================
+--- linux-2.6.26.orig/arch/x86/kernel/genx2apic_uv_x.c
++++ linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
+@@ -143,16 +143,31 @@ static unsigned int uv_cpu_mask_to_apici
+ return BAD_APICID;
+ }
+
+-static unsigned int uv_read_apic_id(void)
++static unsigned int get_apic_id(unsigned long x)
+ {
+ unsigned int id;
+
+ WARN_ON(preemptible() && num_online_cpus() > 1);
+- id = apic_read(APIC_ID) | __get_cpu_var(x2apic_extra_bits);
++ id = x | __get_cpu_var(x2apic_extra_bits);
+
+ return id;
+ }
+
++static long set_apic_id(unsigned int id)
++{
++ unsigned long x;
++
++ /* maskout x2apic_extra_bits ? */
++ x = id;
++ return x;
++}
++
++static unsigned int uv_read_apic_id(void)
++{
++
++ return get_apic_id(apic_read(APIC_ID));
++}
++
+ static unsigned int phys_pkg_id(int index_msb)
+ {
+ return uv_read_apic_id() >> index_msb;
+@@ -179,7 +194,9 @@ struct genapic apic_x2apic_uv_x = {
+ /* ZZZ.send_IPI_self = uv_send_IPI_self, */
+ .cpu_mask_to_apicid = uv_cpu_mask_to_apicid,
+ .phys_pkg_id = phys_pkg_id, /* Fixme ZZZ */
+- .read_apic_id = uv_read_apic_id,
++ .get_apic_id = get_apic_id,
++ .set_apic_id = set_apic_id,
++ .apic_id_mask = (0xFFFFFFFFu),
+ };
+
+ static __cpuinit void set_x2apic_extra_bits(int pnode)
+Index: linux-2.6.26/include/asm-x86/genapic_64.h
+===================================================================
+--- linux-2.6.26.orig/include/asm-x86/genapic_64.h
++++ linux-2.6.26/include/asm-x86/genapic_64.h
+@@ -28,7 +28,9 @@ struct genapic {
+ /* */
+ unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
+ unsigned int (*phys_pkg_id)(int index_msb);
+- unsigned int (*read_apic_id)(void);
++ unsigned int (*get_apic_id)(unsigned long x);
++ unsigned long (*set_apic_id)(unsigned int id);
++ unsigned long apic_id_mask;
+ };
+
+ extern struct genapic *genapic;
+Index: linux-2.6.26/include/asm-x86/mach-default/mach_apic.h
+===================================================================
+--- linux-2.6.26.orig/include/asm-x86/mach-default/mach_apic.h
++++ linux-2.6.26/include/asm-x86/mach-default/mach_apic.h
+@@ -30,7 +30,7 @@ static inline cpumask_t target_cpus(void
+ #define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
+ #define phys_pkg_id (genapic->phys_pkg_id)
+ #define vector_allocation_domain (genapic->vector_allocation_domain)
+-#define read_apic_id (genapic->read_apic_id)
++#define read_apic_id() (GET_APIC_ID(apic_read(APIC_ID)))
+ #define send_IPI_self (genapic->send_IPI_self)
+ extern void setup_apic_routing(void);
+ #else
+Index: linux-2.6.26/include/asm-x86/mach-default/mach_apicdef.h
+===================================================================
+--- linux-2.6.26.orig/include/asm-x86/mach-default/mach_apicdef.h
++++ linux-2.6.26/include/asm-x86/mach-default/mach_apicdef.h
+@@ -4,9 +4,9 @@
+ #include <asm/apic.h>
+
+ #ifdef CONFIG_X86_64
+-#define APIC_ID_MASK (0xFFu<<24)
+-#define GET_APIC_ID(x) (((x)>>24) & 0xFFu)
+-#define SET_APIC_ID(x) (((x)<<24))
++#define APIC_ID_MASK (genapic->apic_id_mask)
++#define GET_APIC_ID(x) (genapic->get_apic_id(x))
++#define SET_APIC_ID(x) (genapic->set_apic_id(x))
+ #else
+ #define APIC_ID_MASK (0xF<<24)
+ static inline unsigned get_apic_id(unsigned long x)