[PATCH] powerpc: move rtas_fw.c out of platforms/pseries
authorArnd Bergmann <arndb@de.ibm.com>
Tue, 1 Nov 2005 01:08:39 +0000 (20:08 -0500)
committerPaul Mackerras <paulus@samba.org>
Tue, 1 Nov 2005 10:02:59 +0000 (21:02 +1100)
Cell uses the same code as pSeries for flashing the firmware
through rtas, so the implementation should not be part of
platforms/pseries.

Put it into arch/powerpc/kernel instead.

Signed-off-by: Arnd Bergmann <arndb@de.ibm.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/Kconfig
arch/powerpc/kernel/Makefile
arch/powerpc/kernel/rtas_fw.c [new file with mode: 0644]
arch/powerpc/platforms/pseries/Makefile
arch/powerpc/platforms/pseries/rtas-fw.c [deleted file]
arch/powerpc/platforms/pseries/rtas-fw.h [deleted file]
include/asm-powerpc/rtas.h

index 0bd315de156b4ea0fe37eea39342cf8f017e2aa3..aa13a9d95ea2774123cc89e31d32df902a58840b 100644 (file)
@@ -278,6 +278,7 @@ config PPC_PSERIES
        select PPC_I8259
        select PPC_RTAS
        select RTAS_ERROR_LOGGING
+       select RTAS_FW
        default y
 
 config PPC_CHRP
@@ -323,6 +324,7 @@ config PPC_CELL
        bool "  Cell Broadband Processor Architecture"
        depends on PPC_MULTIPLATFORM && PPC64
        select PPC_RTAS
+       select RTAS_FW
 
 config PPC_OF
        bool
@@ -353,6 +355,11 @@ config RTAS_ERROR_LOGGING
        depends on PPC_RTAS
        default n
 
+config RTAS_FW
+       bool
+       depends on PPC_RTAS
+       default n
+
 config MPIC_BROKEN_U3
        bool
        depends on PPC_MAPLE
index 572d4f5eaacb48da8209fe169306f5b967cf3bd0..abad3059a21ad6d304f624dea0c2ae5ecaec7ee8 100644 (file)
@@ -18,6 +18,7 @@ obj-$(CONFIG_ALTIVEC)         += vecemu.o vector.o
 obj-$(CONFIG_POWER4)           += idle_power4.o
 obj-$(CONFIG_PPC_OF)           += of_device.o
 obj-$(CONFIG_PPC_RTAS)         += rtas.o
+obj-$(CONFIG_RTAS_FW)          += rtas_fw.o
 obj-$(CONFIG_IBMVIO)           += vio.o
 
 ifeq ($(CONFIG_PPC_MERGE),y)
diff --git a/arch/powerpc/kernel/rtas_fw.c b/arch/powerpc/kernel/rtas_fw.c
new file mode 100644 (file)
index 0000000..448922e
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ *
+ * Procedures for firmware flash updates.
+ *
+ * Peter Bergner, IBM  March 2001.
+ * Copyright (C) 2001 IBM.
+ *
+ *      This program is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU General Public License
+ *      as published by the Free Software Foundation; either version
+ *      2 of the License, or (at your option) any later version.
+ */
+
+#include <stdarg.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/spinlock.h>
+#include <linux/module.h>
+#include <linux/init.h>
+
+#include <asm/prom.h>
+#include <asm/rtas.h>
+#include <asm/semaphore.h>
+#include <asm/machdep.h>
+#include <asm/page.h>
+#include <asm/param.h>
+#include <asm/system.h>
+#include <asm/abs_addr.h>
+#include <asm/udbg.h>
+#include <asm/delay.h>
+#include <asm/uaccess.h>
+#include <asm/systemcfg.h>
+
+struct flash_block_list_header rtas_firmware_flash_list = {0, NULL};
+
+#define FLASH_BLOCK_LIST_VERSION (1UL)
+
+static void rtas_flash_firmware(void)
+{
+       unsigned long image_size;
+       struct flash_block_list *f, *next, *flist;
+       unsigned long rtas_block_list;
+       int i, status, update_token;
+
+       update_token = rtas_token("ibm,update-flash-64-and-reboot");
+       if (update_token == RTAS_UNKNOWN_SERVICE) {
+               printk(KERN_ALERT "FLASH: ibm,update-flash-64-and-reboot is not available -- not a service partition?\n");
+               printk(KERN_ALERT "FLASH: firmware will not be flashed\n");
+               return;
+       }
+
+       /* NOTE: the "first" block list is a global var with no data
+        * blocks in the kernel data segment.  We do this because
+        * we want to ensure this block_list addr is under 4GB.
+        */
+       rtas_firmware_flash_list.num_blocks = 0;
+       flist = (struct flash_block_list *)&rtas_firmware_flash_list;
+       rtas_block_list = virt_to_abs(flist);
+       if (rtas_block_list >= 4UL*1024*1024*1024) {
+               printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n");
+               return;
+       }
+
+       printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n");
+       /* Update the block_list in place. */
+       image_size = 0;
+       for (f = flist; f; f = next) {
+               /* Translate data addrs to absolute */
+               for (i = 0; i < f->num_blocks; i++) {
+                       f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data);
+                       image_size += f->blocks[i].length;
+               }
+               next = f->next;
+               /* Don't translate NULL pointer for last entry */
+               if (f->next)
+                       f->next = (struct flash_block_list *)virt_to_abs(f->next);
+               else
+                       f->next = NULL;
+               /* make num_blocks into the version/length field */
+               f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16);
+       }
+
+       printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size);
+       printk(KERN_ALERT "FLASH: performing flash and reboot\n");
+       rtas_progress("Flashing        \n", 0x0);
+       rtas_progress("Please Wait...  ", 0x0);
+       printk(KERN_ALERT "FLASH: this will take several minutes.  Do not power off!\n");
+       status = rtas_call(update_token, 1, 1, NULL, rtas_block_list);
+       switch (status) {       /* should only get "bad" status */
+           case 0:
+               printk(KERN_ALERT "FLASH: success\n");
+               break;
+           case -1:
+               printk(KERN_ALERT "FLASH: hardware error.  Firmware may not be not flashed\n");
+               break;
+           case -3:
+               printk(KERN_ALERT "FLASH: image is corrupt or not correct for this platform.  Firmware not flashed\n");
+               break;
+           case -4:
+               printk(KERN_ALERT "FLASH: flash failed when partially complete.  System may not reboot\n");
+               break;
+           default:
+               printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status);
+               break;
+       }
+}
+
+void rtas_flash_bypass_warning(void)
+{
+       printk(KERN_ALERT "FLASH: firmware flash requires a reboot\n");
+       printk(KERN_ALERT "FLASH: the firmware image will NOT be flashed\n");
+}
+
+
+void rtas_fw_restart(char *cmd)
+{
+       if (rtas_firmware_flash_list.next)
+               rtas_flash_firmware();
+       rtas_restart(cmd);
+}
+
+void rtas_fw_power_off(void)
+{
+       if (rtas_firmware_flash_list.next)
+               rtas_flash_bypass_warning();
+       rtas_power_off();
+}
+
+void rtas_fw_halt(void)
+{
+       if (rtas_firmware_flash_list.next)
+               rtas_flash_bypass_warning();
+       rtas_halt();
+}
+
+EXPORT_SYMBOL(rtas_firmware_flash_list);
index 5ef494e3a70f797cf507072b4e1527f1033a169e..91909a84473652edbf9031144dde274c3bf3da64 100644 (file)
@@ -1,5 +1,5 @@
 obj-y                  := pci.o lpar.o hvCall.o nvram.o reconfig.o \
-                          setup.o iommu.o rtas-fw.o ras.o
+                          setup.o iommu.o ras.o
 obj-$(CONFIG_SMP)      += smp.o
 obj-$(CONFIG_IBMVIO)   += vio.o
 obj-$(CONFIG_XICS)     += xics.o
diff --git a/arch/powerpc/platforms/pseries/rtas-fw.c b/arch/powerpc/platforms/pseries/rtas-fw.c
deleted file mode 100644 (file)
index 15d81d7..0000000
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- *
- * Procedures for firmware flash updates on pSeries systems.
- *
- * Peter Bergner, IBM  March 2001.
- * Copyright (C) 2001 IBM.
- *
- *      This program is free software; you can redistribute it and/or
- *      modify it under the terms of the GNU General Public License
- *      as published by the Free Software Foundation; either version
- *      2 of the License, or (at your option) any later version.
- */
-
-#include <stdarg.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/spinlock.h>
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <asm/prom.h>
-#include <asm/rtas.h>
-#include <asm/semaphore.h>
-#include <asm/machdep.h>
-#include <asm/page.h>
-#include <asm/param.h>
-#include <asm/system.h>
-#include <asm/abs_addr.h>
-#include <asm/udbg.h>
-#include <asm/delay.h>
-#include <asm/uaccess.h>
-#include <asm/systemcfg.h>
-
-#include "rtas-fw.h"
-
-struct flash_block_list_header rtas_firmware_flash_list = {0, NULL};
-
-#define FLASH_BLOCK_LIST_VERSION (1UL)
-
-static void rtas_flash_firmware(void)
-{
-       unsigned long image_size;
-       struct flash_block_list *f, *next, *flist;
-       unsigned long rtas_block_list;
-       int i, status, update_token;
-
-       update_token = rtas_token("ibm,update-flash-64-and-reboot");
-       if (update_token == RTAS_UNKNOWN_SERVICE) {
-               printk(KERN_ALERT "FLASH: ibm,update-flash-64-and-reboot is not available -- not a service partition?\n");
-               printk(KERN_ALERT "FLASH: firmware will not be flashed\n");
-               return;
-       }
-
-       /* NOTE: the "first" block list is a global var with no data
-        * blocks in the kernel data segment.  We do this because
-        * we want to ensure this block_list addr is under 4GB.
-        */
-       rtas_firmware_flash_list.num_blocks = 0;
-       flist = (struct flash_block_list *)&rtas_firmware_flash_list;
-       rtas_block_list = virt_to_abs(flist);
-       if (rtas_block_list >= 4UL*1024*1024*1024) {
-               printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n");
-               return;
-       }
-
-       printk(KERN_ALERT "FLASH: preparing saved firmware image for flash\n");
-       /* Update the block_list in place. */
-       image_size = 0;
-       for (f = flist; f; f = next) {
-               /* Translate data addrs to absolute */
-               for (i = 0; i < f->num_blocks; i++) {
-                       f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data);
-                       image_size += f->blocks[i].length;
-               }
-               next = f->next;
-               /* Don't translate NULL pointer for last entry */
-               if (f->next)
-                       f->next = (struct flash_block_list *)virt_to_abs(f->next);
-               else
-                       f->next = NULL;
-               /* make num_blocks into the version/length field */
-               f->num_blocks = (FLASH_BLOCK_LIST_VERSION << 56) | ((f->num_blocks+1)*16);
-       }
-
-       printk(KERN_ALERT "FLASH: flash image is %ld bytes\n", image_size);
-       printk(KERN_ALERT "FLASH: performing flash and reboot\n");
-       rtas_progress("Flashing        \n", 0x0);
-       rtas_progress("Please Wait...  ", 0x0);
-       printk(KERN_ALERT "FLASH: this will take several minutes.  Do not power off!\n");
-       status = rtas_call(update_token, 1, 1, NULL, rtas_block_list);
-       switch (status) {       /* should only get "bad" status */
-           case 0:
-               printk(KERN_ALERT "FLASH: success\n");
-               break;
-           case -1:
-               printk(KERN_ALERT "FLASH: hardware error.  Firmware may not be not flashed\n");
-               break;
-           case -3:
-               printk(KERN_ALERT "FLASH: image is corrupt or not correct for this platform.  Firmware not flashed\n");
-               break;
-           case -4:
-               printk(KERN_ALERT "FLASH: flash failed when partially complete.  System may not reboot\n");
-               break;
-           default:
-               printk(KERN_ALERT "FLASH: unknown flash return code %d\n", status);
-               break;
-       }
-}
-
-void rtas_flash_bypass_warning(void)
-{
-       printk(KERN_ALERT "FLASH: firmware flash requires a reboot\n");
-       printk(KERN_ALERT "FLASH: the firmware image will NOT be flashed\n");
-}
-
-
-void rtas_fw_restart(char *cmd)
-{
-       if (rtas_firmware_flash_list.next)
-               rtas_flash_firmware();
-       rtas_restart(cmd);
-}
-
-void rtas_fw_power_off(void)
-{
-       if (rtas_firmware_flash_list.next)
-               rtas_flash_bypass_warning();
-       rtas_power_off();
-}
-
-void rtas_fw_halt(void)
-{
-       if (rtas_firmware_flash_list.next)
-               rtas_flash_bypass_warning();
-       rtas_halt();
-}
-
-EXPORT_SYMBOL(rtas_firmware_flash_list);
diff --git a/arch/powerpc/platforms/pseries/rtas-fw.h b/arch/powerpc/platforms/pseries/rtas-fw.h
deleted file mode 100644 (file)
index e70fa69..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-void rtas_fw_restart(char *cmd);
-void rtas_fw_power_off(void);
-void rtas_fw_halt(void);
index 2c050332471db29d7bedd4ed1fc4f36b5f485605..d9fd7866927ff8b60eaa121d98454d4878a3c1c6 100644 (file)
@@ -171,6 +171,9 @@ struct flash_block_list_header { /* just the header of flash_block_list */
        struct flash_block_list *next;
 };
 extern struct flash_block_list_header rtas_firmware_flash_list;
+void rtas_fw_restart(char *cmd);
+void rtas_fw_power_off(void);
+void rtas_fw_halt(void);
 
 extern struct rtas_t rtas;