Commit 0c81c746 authored by Suresh Siddha's avatar Suresh Siddha Committed by Ingo Molnar
Browse files

x64, x2apic/intr-remap: introduce read_apic_id() to genapic routines



Move the read_apic_id()  to genapic routines.

Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
Cc: akpm@linux-foundation.org
Cc: arjan@linux.intel.com
Cc: andi@firstfloor.org
Cc: ebiederm@xmission.com
Cc: jbarnes@virtuousgeek.org
Cc: steiner@sgi.com
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 4dc2f96c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1096,6 +1096,11 @@ void __cpuinit generic_processor_info(int apicid, int version)
	cpu_set(cpu, cpu_present_map);
}

int hard_smp_processor_id(void)
{
	return read_apic_id();
}

/*
 * Power management
 */
+0 −11
Original line number Diff line number Diff line
@@ -79,17 +79,6 @@ int __init acpi_madt_oem_check(char *oem_id, char *oem_table_id)
	return 0;
}

unsigned int read_apic_id(void)
{
	unsigned int id;

	WARN_ON(preemptible() && num_online_cpus() > 1);
	id = apic_read(APIC_ID);
	if (uv_system_type >= UV_X2APIC)
		id  |= __get_cpu_var(x2apic_extra_bits);
	return id;
}

enum uv_system_type get_uv_system_type(void)
{
	return uv_system_type;
+13 −1
Original line number Diff line number Diff line
@@ -15,9 +15,11 @@
#include <linux/kernel.h>
#include <linux/ctype.h>
#include <linux/init.h>
#include <linux/hardirq.h>
#include <asm/smp.h>
#include <asm/ipi.h>
#include <asm/genapic.h>
#include <mach_apicdef.h>

static cpumask_t flat_target_cpus(void)
{
@@ -95,9 +97,17 @@ static void flat_send_IPI_all(int vector)
		__send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
}

static unsigned int read_xapic_id(void)
{
	unsigned int id;

	id = GET_XAPIC_ID(apic_read(APIC_ID));
	return id;
}

static int flat_apic_id_registered(void)
{
	return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map);
	return physid_isset(read_xapic_id(), phys_cpu_present_map);
}

static unsigned int flat_cpu_mask_to_apicid(cpumask_t cpumask)
@@ -123,6 +133,7 @@ struct genapic apic_flat = {
	.send_IPI_mask = flat_send_IPI_mask,
	.cpu_mask_to_apicid = flat_cpu_mask_to_apicid,
	.phys_pkg_id = phys_pkg_id,
	.read_apic_id = read_xapic_id,
};

/*
@@ -187,4 +198,5 @@ struct genapic apic_physflat = {
	.send_IPI_mask = physflat_send_IPI_mask,
	.cpu_mask_to_apicid = physflat_cpu_mask_to_apicid,
	.phys_pkg_id = phys_pkg_id,
	.read_apic_id = read_xapic_id,
};
+13 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#include <linux/sched.h>
#include <linux/bootmem.h>
#include <linux/module.h>
#include <linux/hardirq.h>
#include <asm/smp.h>
#include <asm/ipi.h>
#include <asm/genapic.h>
@@ -134,9 +135,19 @@ static unsigned int uv_cpu_mask_to_apicid(cpumask_t cpumask)
		return BAD_APICID;
}

static unsigned int uv_read_apic_id(void)
{
	unsigned int id;

	WARN_ON(preemptible() && num_online_cpus() > 1);
	id = apic_read(APIC_ID) | __get_cpu_var(x2apic_extra_bits);

	return id;
}

static unsigned int phys_pkg_id(int index_msb)
{
	return GET_APIC_ID(read_apic_id()) >> index_msb;
	return uv_read_apic_id() >> index_msb;
}

#ifdef ZZZ		/* Needs x2apic patch */
@@ -159,6 +170,7 @@ 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,
};

static __cpuinit void set_x2apic_extra_bits(int pnode)
+1 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ 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);
};

extern struct genapic *genapic;
Loading