ChangeSet 1.1555, 2005/05/25 18:29:20+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx
Ported genapic to Xen: support for bigsmp and numa platforms such as
es7000.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
b/xen/arch/x86/Makefile | 2
b/xen/arch/x86/Rules.mk | 4
b/xen/arch/x86/apic.c | 3
b/xen/arch/x86/dmi_scan.c | 493 ++++++++++++++++
b/xen/arch/x86/genapic/bigsmp.c | 51 +
b/xen/arch/x86/genapic/default.c | 26
b/xen/arch/x86/genapic/es7000.c | 28
b/xen/arch/x86/genapic/es7000.h | 110 +++
b/xen/arch/x86/genapic/es7000plat.c | 302 +++++++++
b/xen/arch/x86/genapic/probe.c | 101 +++
b/xen/arch/x86/genapic/summit.c | 26
b/xen/arch/x86/mpparse.c | 2
b/xen/arch/x86/mtrr/generic.c | 1
b/xen/arch/x86/setup.c | 15
b/xen/arch/x86/smp.c | 74 +-
b/xen/arch/x86/smpboot.c | 1
b/xen/common/kernel.c | 56 +
b/xen/include/asm-x86/apic.h | 1
b/xen/include/asm-x86/fixmap.h | 11
b/xen/include/asm-x86/genapic.h | 115 +++
b/xen/include/asm-x86/mach-bigsmp/mach_apic.h | 167 +++++
b/xen/include/asm-x86/mach-bigsmp/mach_apicdef.h | 13
b/xen/include/asm-x86/mach-bigsmp/mach_ipi.h | 25
b/xen/include/asm-x86/mach-default/irq_vectors_limits.h | 16
b/xen/include/asm-x86/mach-es7000/mach_apic.h | 207 ++++++
b/xen/include/asm-x86/mach-es7000/mach_apicdef.h | 13
b/xen/include/asm-x86/mach-es7000/mach_ipi.h | 24
b/xen/include/asm-x86/mach-es7000/mach_mpparse.h | 41 +
b/xen/include/asm-x86/mach-es7000/mach_wakecpu.h | 58 +
b/xen/include/asm-x86/mach-generic/mach_apic.h | 32 +
b/xen/include/asm-x86/mach-generic/mach_apicdef.h | 11
b/xen/include/asm-x86/mach-generic/mach_ipi.h | 10
b/xen/include/asm-x86/mach-generic/mach_mpparse.h | 12
b/xen/include/asm-x86/mach-generic/mach_mpspec.h | 10
b/xen/include/asm-x86/mach-summit/mach_apic.h | 189 ++++++
b/xen/include/asm-x86/mach-summit/mach_apicdef.h | 13
b/xen/include/asm-x86/mach-summit/mach_ipi.h | 25
b/xen/include/asm-x86/mach-summit/mach_mpparse.h | 121 +++
b/xen/include/asm-x86/page.h | 12
b/xen/include/asm-x86/shadow.h | 1
b/xen/include/asm-x86/system.h | 2
b/xen/include/xen/dmi.h | 47 +
xen/include/asm-x86/mach-default/apm.h | 75 --
xen/include/asm-x86/mach-default/do_timer.h | 85 --
xen/include/asm-x86/mach-default/entry_arch.h | 34 -
xen/include/asm-x86/mach-default/mach_mpspec.h | 8
xen/include/asm-x86/mach-default/mach_reboot.h | 30
xen/include/asm-x86/mach-default/mach_time.h | 122 ---
xen/include/asm-x86/mach-default/mach_timer.h | 48 -
xen/include/asm-x86/mach-default/mach_traps.h | 29
xen/include/asm-x86/mach-default/pci-functions.h | 19
xen/include/asm-x86/mach-default/setup_arch_post.h | 40 -
xen/include/asm-x86/mach-default/setup_arch_pre.h | 5
53 files changed, 2391 insertions(+), 575 deletions(-)
diff -Nru a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
--- a/xen/arch/x86/Makefile 2005-05-25 14:02:40 -04:00
+++ b/xen/arch/x86/Makefile 2005-05-25 14:02:40 -04:00
@@ -5,6 +5,7 @@
OBJS += $(patsubst %.c,%.o,$(wildcard $(TARGET_SUBARCH)/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard acpi/*.c))
OBJS += $(patsubst %.c,%.o,$(wildcard mtrr/*.c))
+OBJS += $(patsubst %.c,%.o,$(wildcard genapic/*.c))
OBJS := $(subst $(TARGET_SUBARCH)/asm-offsets.o,,$(OBJS))
@@ -36,6 +37,7 @@
rm -f x86_64/*.o x86_64/*~ x86_64/core
rm -f mtrr/*.o mtrr/*~ mtrr/core
rm -f acpi/*.o acpi/*~ acpi/core
+ rm -f genapic/*.o genapic/*~ genapic/core
delete-unfresh-files:
# nothing
diff -Nru a/xen/arch/x86/Rules.mk b/xen/arch/x86/Rules.mk
--- a/xen/arch/x86/Rules.mk 2005-05-25 14:02:40 -04:00
+++ b/xen/arch/x86/Rules.mk 2005-05-25 14:02:40 -04:00
@@ -3,7 +3,9 @@
CFLAGS += -nostdinc -fno-builtin -fno-common -fno-strict-aliasing
CFLAGS += -iwithprefix include -Wall -Werror -Wno-pointer-arith -pipe
-CFLAGS += -I$(BASEDIR)/include -I$(BASEDIR)/include/asm-x86/mach-default
+CFLAGS += -I$(BASEDIR)/include
+CFLAGS += -I$(BASEDIR)/include/asm-x86/mach-generic
+CFLAGS += -I$(BASEDIR)/include/asm-x86/mach-default
ifeq ($(optimize),y)
CFLAGS += -O3 -fomit-frame-pointer
diff -Nru a/xen/arch/x86/apic.c b/xen/arch/x86/apic.c
--- a/xen/arch/x86/apic.c 2005-05-25 14:02:40 -04:00
+++ b/xen/arch/x86/apic.c 2005-05-25 14:02:40 -04:00
@@ -454,9 +454,6 @@
apic_verbosity = APIC_DEBUG;
else if (strcmp("verbose", str) == 0)
apic_verbosity = APIC_VERBOSE;
- else
- printk(KERN_WARNING "APIC Verbosity level %s not recognised"
- " use apic=verbose or apic=debug", str);
}
custom_param("apic", apic_set_verbosity);
diff -Nru a/xen/arch/x86/dmi_scan.c b/xen/arch/x86/dmi_scan.c
--- /dev/null Wed Dec 31 16:00:00 196900
+++ b/xen/arch/x86/dmi_scan.c 2005-05-25 14:02:40 -04:00
@@ -0,0 +1,493 @@
+#include <xen/config.h>
+#include <xen/types.h>
+#include <xen/kernel.h>
+#include <xen/string.h>
+#include <xen/init.h>
+#include <xen/slab.h>
+#include <xen/acpi.h>
+#include <asm/io.h>
+#include <asm/system.h>
+#include <xen/dmi.h>
+
+#define bt_ioremap(b,l) __acpi_map_table(b,l)
+#define bt_iounmap(b,l) ((void)0)
+#define ioremap(b,l) (__va(b))
+#define memcpy_fromio memcpy
+#define alloc_bootmem(l) xmalloc_bytes(l)
+
+int es7000_plat = 0;
+
+struct dmi_header
+{
+ u8 type;
+ u8 length;
+ u16 handle;
+};
+
+#undef DMI_DEBUG
+
+#ifdef DMI_DEBUG
+#define dmi_printk(x) printk x
+#else
+#define dmi_printk(x)
+#endif
+
+static char * __init dmi_string(struct dmi_header *dm, u8 s)
+{
+ u8 *bp=(u8 *)dm;
+ bp+=dm->length;
+ if(!s)
+ return "";
+ s--;
+ while(s>0 && *bp)
+ {
+ bp+=strlen(bp);
+ bp++;
+ s--;
+ }
+ return bp;
+}
+
+/*
+ * We have to be cautious here. We have seen BIOSes with DMI pointers
+ * pointing to completely the wrong place for example
+ */
+
+static int __init dmi_table(u32 base, int len, int num, void (*decode)(struct
dmi_header *))
+{
+ u8 *buf;
+ struct dmi_header *dm;
+ u8 *data;
+ int i=0;
+
+ buf = bt_ioremap(base, len);
+ if(buf==NULL)
+ return -1;
+
+ data = buf;
+
+ /*
+ * Stop when we see all the items the table claimed to have
+ * OR we run off the end of the table (also happens)
+ */
+
+ while(i<num && data-buf+sizeof(struct dmi_header)<=len)
+ {
+ dm=(struct dmi_header *)data;
+ /*
+ * We want to know the total length (formated area and strings)
+ * before decoding to make sure we won't run off the table in
+ * dmi_decode or dmi_string
+ */
+ data+=dm->length;
+ while(data-buf<len-1 && (data[0] || data[1]))
+ data++;
+ if(data-buf<len-1)
+ decode(dm);
+ data+=2;
+ i++;
+ }
+ bt_iounmap(buf, len);
+ return 0;
+}
+
+
+inline static int __init dmi_checksum(u8 *buf)
+{
+ u8 sum=0;
+ int a;
+
+ for(a=0; a<15; a++)
+ sum+=buf[a];
+ return (sum==0);
+}
+
+static int __init dmi_iterate(void (*decode)(struct dmi_header *))
+{
+ u8 buf[15];
+ char __iomem *p, *q;
+
+ /*
+ * no iounmap() for that ioremap(); it would be a no-op, but it's
+ * so early in setup that sucker gets confused into doing what
+ * it shouldn't if we actually call it.
+ */
+ p = ioremap(0xF0000, 0x10000);
+ if (p == NULL)
+ return -1;
+ for (q = p; q < p + 0x10000; q += 16) {
+ memcpy_fromio(buf, q, 15);
+ if(memcmp(buf, "_DMI_", 5)==0 && dmi_checksum(buf))
+ {
+ u16 num=buf[13]<<8|buf[12];
+ u16 len=buf[7]<<8|buf[6];
+ u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8];
+
+ /*
+ * DMI version 0.0 means that the real version is taken
from
+ * the SMBIOS version, which we don't know at this
point.
+ */
+ if(buf[14]!=0)
+ printk(KERN_INFO "DMI %d.%d present.\n",
+ buf[14]>>4, buf[14]&0x0F);
+ else
+ printk(KERN_INFO "DMI present.\n");
+ dmi_printk((KERN_INFO "%d structures occupying %d
bytes.\n",
+ num, len));
+ dmi_printk((KERN_INFO "DMI table at 0x%08X.\n",
+ base));
+ if(dmi_table(base,len, num, decode)==0)
+ return 0;
+ }
+ }
+ return -1;
+}
+
+static char *dmi_ident[DMI_STRING_MAX];
+
+/*
+ * Save a DMI string
+ */
+
+static void __init dmi_save_ident(struct dmi_header *dm, int slot, int string)
+{
+ char *d = (char*)dm;
+ char *p = dmi_string(dm, d[string]);
+ if(p==NULL || *p == 0)
+ return;
+ if (dmi_ident[slot])
+ return;
+ dmi_ident[slot] = alloc_bootmem(strlen(p)+1);
+ if(dmi_ident[slot])
+ strcpy(dmi_ident[slot], p);
+ else
+ printk(KERN_ERR "dmi_save_ident: out of memory.\n");
+}
+
+/*
+ * Ugly compatibility crap.
+ */
+#define dmi_blacklist dmi_system_id
+#define NO_MATCH { DMI_NONE, NULL}
+#define MATCH DMI_MATCH
+
+/*
+ * Toshiba keyboard likes to repeat keys when they are not repeated.
+ */
+
+static __init int broken_toshiba_keyboard(struct dmi_blacklist *d)
+{
+ printk(KERN_WARNING "Toshiba with broken keyboard detected. If your
keyboard sometimes generates 3 keypresses instead of one, see
http://davyd.ucc.asn.au/projects/toshiba/README\n");
+ return 0;
+}
+
+
+#ifdef CONFIG_ACPI_SLEEP
+static __init int reset_videomode_after_s3(struct dmi_blacklist *d)
+{
+ /* See acpi_wakeup.S */
+ extern long acpi_video_flags;
+ acpi_video_flags |= 2;
+ return 0;
+}
+#endif
+
+
+#ifdef CONFIG_ACPI_BOOT
+extern int acpi_force;
+
+static __init __attribute__((unused)) int dmi_disable_acpi(struct
dmi_blacklist *d)
+{
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|