SN platform support PIO in a different way to generic IA64 platform. It
does not support most of the legacy I/O ports.

Give an --noio option to kexec-tools to disable I/O in purgatory code.

This patch also removed an unused io.h in kexec-tools.

Signed-off-by: Zou Nan hai <[EMAIL PROTECTED]>

diff -Nraup kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c
kexec-tools-1.101-fix/kexec/arch/ia64/kexec-elf-ia64.c
--- kexec-tools-1.101/kexec/arch/ia64/kexec-elf-ia64.c  2006-09-20
15:30:40.000000000 +0800
+++ kexec-tools-1.101-fix/kexec/arch/ia64/kexec-elf-ia64.c      2006-09-21
15:12:20.000000000 +0800
@@ -116,16 +116,19 @@ int elf_ia64_load(int argc, char **argv,
        unsigned long command_line_base, ramdisk_base;
        unsigned long efi_memmap_base, efi_memmap_size;
        unsigned long boot_param_base;
+       unsigned long noio=0;
        int result;
        int opt;
        char *efi_memmap_buf, *boot_param;
 #define OPT_APPEND     (OPT_ARCH_MAX+0)
 #define OPT_RAMDISK    (OPT_ARCH_MAX+1)
+#define OPT_NOIO       (OPT_ARCH_MAX+2)
        static const struct option options[] = {
                KEXEC_ARCH_OPTIONS
                {"command-line", 1, 0, OPT_APPEND},
                {"append",       1, 0, OPT_APPEND},
                {"initrd",       1, 0, OPT_RAMDISK},
+               {"noio",       1, 0, OPT_NOIO},
                {0, 0, 0, 0},
        };
 
@@ -148,6 +151,9 @@ int elf_ia64_load(int argc, char **argv,
                case OPT_RAMDISK:
                        ramdisk = optarg;
                        break;
+               case OPT_NOIO:  /* disable PIO and MMIO in purgatory code*/
+                       noio = 1;
+                       break;  
                }
        }
        command_line_len = 0;
@@ -196,6 +202,10 @@ int elf_ia64_load(int argc, char **argv,
        boot_param = xmalloc(4096);
         boot_param_base = add_buffer(info, boot_param, 4096, 4096,
4096, 0,
                         max_addr, -1);
+
+        elf_rel_set_symbol(&info->rhdr, "__noio",
+                        &noio, sizeof(long));
+
         elf_rel_set_symbol(&info->rhdr, "__boot_param_base",
                         &boot_param_base, sizeof(long));
 
diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/entry.S
kexec-tools-1.101-fix/purgatory/arch/ia64/entry.S
--- kexec-tools-1.101/purgatory/arch/ia64/entry.S       2006-09-20
15:30:40.000000000 +0800
+++ kexec-tools-1.101-fix/purgatory/arch/ia64/entry.S   2006-09-21
15:11:36.000000000 +0800
@@ -68,3 +68,4 @@ DECLARE_DATA8(__loaded_segments)
 DECLARE_DATA8(__loaded_segments_num)
 
 DECLARE_DATA8(__gp_value)
+DECLARE_DATA8(__noio)
diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h
kexec-tools-1.101-fix/purgatory/arch/ia64/include/arch/io.h
--- kexec-tools-1.101/purgatory/arch/ia64/include/arch/io.h     2006-09-20
15:29:29.000000000 +0800
+++
kexec-tools-1.101-fix/purgatory/arch/ia64/include/arch/io.h     1970-01-01
08:00:00.000000000 +0800
@@ -1,25 +0,0 @@
-#ifndef ARCH_IO_H
-#define ARCH_IO_H
-
-#include <stdint.h>
-/* Helper functions for directly doing I/O */
-
-extern inline uint8_t inb(void *port)
-{
-       volatile unsigned char *addr = (unsigned char *)port;
-       uint8_t result;
-
-       result = *addr;
-       asm volatile ("mf.a"::: "memory");
-       return result;
-}
-
-extern inline void outb (uint8_t value, void *port)
-{
-       volatile unsigned char *addr = (unsigned char *)port;
-
-       *addr = value;
-       asm volatile ("mf.a"::: "memory");
-}
-
-#endif /* ARCH_IO_H */
diff -Nraup kexec-tools-1.101/purgatory/arch/ia64/io.h
kexec-tools-1.101-fix/purgatory/arch/ia64/io.h
--- kexec-tools-1.101/purgatory/arch/ia64/io.h  2006-09-20
15:29:29.000000000 +0800
+++ kexec-tools-1.101-fix/purgatory/arch/ia64/io.h      2006-09-21
15:11:19.000000000 +0800
@@ -3,7 +3,7 @@
 #define UNCACHED(x) (void *)((x)|(1UL<<63))
 #define MF()   asm volatile ("mf.a" ::: "memory")
 #define IO_SPACE_ENCODING(p)     ((((p) >> 2) << 12) | (p & 0xfff))
-
+extern long __noio;
 static inline void *io_addr (unsigned long port)
 {
         unsigned long offset;
@@ -16,28 +16,34 @@ static inline void *io_addr (unsigned lo
 static inline unsigned int inb (unsigned long port)
 {
         volatile unsigned char *addr = io_addr(port);
-        unsigned char ret;
-        ret = *addr;
-        MF();
+        unsigned char ret = 0;
+       if (!__noio) {
+               ret = *addr;
+               MF();
+       }
         return ret;
 }
 
 static inline unsigned int inw (unsigned long port)
 {
         volatile unsigned short *addr = io_addr(port);
-        unsigned short ret;
+        unsigned short ret = 0;
 
-        ret = *addr;
-       MF();
+       if (!__noio) {
+               ret = *addr;
+               MF();
+       }
         return ret;
 }
 
-static inline unsigned int ia64_inl (unsigned long port)
+static inline unsigned int inl (unsigned long port)
 {
-        volatile unsigned int *addr = __ia64_mk_io_addr(port);
-        unsigned int ret;
-        ret = *addr;
-       MF();
+        volatile unsigned int *addr = io_addr(port);
+        unsigned int ret ;
+       if (!__noio) {
+               ret = *addr;
+               MF();
+       }
         return ret;
 }
 
@@ -45,50 +51,58 @@ static inline void outb (unsigned char v
 {
         volatile unsigned char *addr = io_addr(port);
 
-        *addr = val;
-       MF();
+       if (!__noio) {
+               *addr = val;
+               MF();
+       }
 }
 
 static inline void outw (unsigned short val, unsigned long port)
 {
         volatile unsigned short *addr = io_addr(port);
 
-        *addr = val;
-       MF();
+       if (!__noio) {
+               *addr = val;
+               MF();
+       }
 }
 
 static inline void outl (unsigned int val, unsigned long port)
 {
         volatile unsigned int *addr = io_addr(port);
 
-        *addr = val;
-       MF();
+       if (!__noio) {
+               *addr = val;
+               MF();
+       }
 }
 
-
 static inline unsigned char readb(const volatile void  *addr)
 {
-        return *(volatile unsigned char *) addr;
+        return __noio ? 0 :*(volatile unsigned char *) addr;
 }
 static inline unsigned short readw(const volatile void  *addr)
 {
-        return *(volatile unsigned short *) addr;
+        return __noio ? 0 :*(volatile unsigned short *) addr;
 }
 static inline unsigned int readl(const volatile void  *addr)
 {
-        return *(volatile unsigned int *) addr;
+        return __noio ? 0 :*(volatile unsigned int *) addr;
 }
 
 static inline void writeb(unsigned char b, volatile void  *addr)
 {
-        *(volatile unsigned char *) addr = b;
+       if (!__noio)
+               *(volatile unsigned char *) addr = b;
 }
 static inline void writew(unsigned short b, volatile void  *addr)
 {
-        *(volatile unsigned short *) addr = b;
+       if (!__noio)
+               *(volatile unsigned short *) addr = b;
 }
 static inline void writel(unsigned int b, volatile void  *addr)
 {
-        *(volatile unsigned int *) addr = b;
+       if (!__noio)
+               *(volatile unsigned int *) addr = b;
 }
 #endif


_______________________________________________
fastboot mailing list
[email protected]
https://lists.osdl.org/mailman/listinfo/fastboot

Reply via email to