patch-2.4.20 linux-2.4.20/arch/ia64/kernel/setup.c
Next file: linux-2.4.20/arch/ia64/kernel/signal.c
Previous file: linux-2.4.20/arch/ia64/kernel/salinfo.c
Back to the patch index
Back to the overall index
- Lines: 182
- Date:
Thu Nov 28 15:53:09 2002
- Orig file:
linux-2.4.19/arch/ia64/kernel/setup.c
- Orig date:
Fri Aug 2 17:39:42 2002
diff -urN linux-2.4.19/arch/ia64/kernel/setup.c linux-2.4.20/arch/ia64/kernel/setup.c
@@ -19,6 +19,7 @@
#include <linux/config.h>
#include <linux/init.h>
+#include <linux/acpi.h>
#include <linux/bootmem.h>
#include <linux/delay.h>
#include <linux/kernel.h>
@@ -28,15 +29,15 @@
#include <linux/string.h>
#include <linux/threads.h>
#include <linux/console.h>
+#include <linux/ioport.h>
+#include <linux/efi.h>
-#include <asm/acpi-ext.h>
#include <asm/ia32.h>
#include <asm/page.h>
#include <asm/machvec.h>
#include <asm/processor.h>
#include <asm/sal.h>
#include <asm/system.h>
-#include <asm/efi.h>
#include <asm/mca.h>
#include <asm/smp.h>
@@ -65,6 +66,8 @@
unsigned long ia64_iobase; /* virtual address for I/O accesses */
+unsigned char aux_device_present = 0xaa; /* XXX remove this when legacy I/O is gone */
+
#define COMMAND_LINE_SIZE 512
char saved_command_line[COMMAND_LINE_SIZE]; /* used in proc filesystem */
@@ -283,6 +286,7 @@
setup_arch (char **cmdline_p)
{
extern unsigned long ia64_iobase;
+ unsigned long phys_iobase;
unw_init();
@@ -292,6 +296,7 @@
efi_init();
+ iomem_resource.end = ~0UL; /* FIXME probably belongs elsewhere */
find_memory();
#if 0
@@ -315,24 +320,23 @@
#endif
/*
- * Set `iobase' to the appropriate address in region 6
- * (uncached access range)
+ * Set `iobase' to the appropriate address in region 6 (uncached access range).
*
- * The EFI memory map is the "prefered" location to get the I/O port
- * space base, rather the relying on AR.KR0. This should become more
- * clear in future SAL specs. We'll fall back to getting it out of
- * AR.KR0 if no appropriate entry is found in the memory map.
+ * The EFI memory map is the "preferred" location to get the I/O port space base,
+ * rather the relying on AR.KR0. This should become more clear in future SAL
+ * specs. We'll fall back to getting it out of AR.KR0 if no appropriate entry is
+ * found in the memory map.
*/
- ia64_iobase = efi_get_iobase();
- if (ia64_iobase)
+ phys_iobase = efi_get_iobase();
+ if (phys_iobase)
/* set AR.KR0 since this is all we use it for anyway */
- ia64_set_kr(IA64_KR_IO_BASE, ia64_iobase);
+ ia64_set_kr(IA64_KR_IO_BASE, phys_iobase);
else {
- ia64_iobase = ia64_get_kr(IA64_KR_IO_BASE);
+ phys_iobase = ia64_get_kr(IA64_KR_IO_BASE);
printk("No I/O port range found in EFI memory map, falling back to AR.KR0\n");
- printk("I/O port base = 0x%lx\n", ia64_iobase);
+ printk("I/O port base = 0x%lx\n", phys_iobase);
}
- ia64_iobase = __IA64_UNCACHED_OFFSET | (ia64_iobase & ~PAGE_OFFSET);
+ ia64_iobase = (unsigned long) ioremap(phys_iobase, 0);
#ifdef CONFIG_SMP
cpu_physical_id(0) = hard_smp_processor_id();
@@ -340,24 +344,31 @@
cpu_init(); /* initialize the bootstrap CPU */
- if (efi.acpi20) {
- /* Parse the ACPI 2.0 tables */
- acpi20_parse(efi.acpi20);
- } else if (efi.acpi) {
- /* Parse the ACPI tables */
- acpi_parse(efi.acpi);
- }
+#ifdef CONFIG_ACPI_BOOT
+ acpi_boot_init(*cmdline_p);
+#endif
+#ifdef CONFIG_SERIAL_HCDP
if (efi.hcdp) {
+ void setup_serial_hcdp(void *);
+
/* Setup the serial ports described by HCDP */
setup_serial_hcdp(efi.hcdp);
}
-
+#endif
#ifdef CONFIG_VT
-# if defined(CONFIG_VGA_CONSOLE)
- conswitchp = &vga_con;
-# elif defined(CONFIG_DUMMY_CONSOLE)
+# if defined(CONFIG_DUMMY_CONSOLE)
conswitchp = &dummy_con;
# endif
+# if defined(CONFIG_VGA_CONSOLE)
+ /*
+ * Non-legacy systems may route legacy VGA MMIO range to system
+ * memory. vga_con probes the MMIO hole, so memory looks like
+ * a VGA device to it. The EFI memory map can tell us if it's
+ * memory so we can avoid this problem.
+ */
+ if (efi_mem_type(0xA0000) != EFI_CONVENTIONAL_MEMORY)
+ conswitchp = &vga_con;
+# endif
#endif
#ifdef CONFIG_IA64_MCA
@@ -392,7 +403,7 @@
switch (c->family) {
case 0x07: memcpy(family, "Itanium", 8); break;
- case 0x1f: memcpy(family, "McKinley", 9); break;
+ case 0x1f: memcpy(family, "Itanium 2", 10); break;
default: sprintf(family, "%u", c->family); break;
}
@@ -433,7 +444,7 @@
c_start (struct seq_file *m, loff_t *pos)
{
#ifdef CONFIG_SMP
- while (*pos < NR_CPUS && !(cpu_online_map & (1 << *pos)))
+ while (*pos < NR_CPUS && !(cpu_online_map & (1UL << *pos)))
++*pos;
#endif
return *pos < NR_CPUS ? cpu_data(*pos) : NULL;
@@ -570,6 +581,24 @@
*/
identify_cpu(my_cpu_data);
+#ifdef CONFIG_MCKINLEY
+ {
+#define FEATURE_SET 16
+ struct ia64_pal_retval iprv;
+
+ if (my_cpu_data->family == 0x1f) {
+
+ PAL_CALL_PHYS(iprv, PAL_PROC_GET_FEATURES, 0, FEATURE_SET, 0);
+
+ if ((iprv.status == 0) && (iprv.v0 & 0x80) && (iprv.v2 & 0x80)) {
+
+ PAL_CALL_PHYS(iprv, PAL_PROC_SET_FEATURES,
+ (iprv.v1 | 0x80), FEATURE_SET, 0);
+ }
+ }
+ }
+#endif
+
/* Clear the stack memory reserved for pt_regs: */
memset(ia64_task_regs(current), 0, sizeof(struct pt_regs));
@@ -581,7 +610,7 @@
* shouldn't be affected by this (moral: keep your ia32 locks aligned and you'll
* be fine).
*/
- ia64_set_dcr( IA64_DCR_DM | IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | IA64_DCR_DR
+ ia64_set_dcr( IA64_DCR_DP | IA64_DCR_DK | IA64_DCR_DX | IA64_DCR_DR
| IA64_DCR_DA | IA64_DCR_DD | IA64_DCR_LC);
#ifndef CONFIG_SMP
ia64_set_fpu_owner(0);
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)