powerpc/powernv: Defer OPAL exception handler registration
authorJeremy Kerr <jk@ozlabs.org>
Wed, 1 May 2013 22:31:50 +0000 (22:31 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Sun, 5 May 2013 23:25:36 +0000 (09:25 +1000)
Currently, the OPAL exception vectors are registered before the feature
fixups are processed. This means that the now-firmware-owned vectors
will likely be overwritten by the kernel.

This change moves the exception registration code to an early initcall,
rather than at machine_init time.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/platforms/powernv/opal.c

index aaa0dba49471cf643b83d99cf3a38a6f51e3358f..ade4463226c612fd338b5cbaed1cb941d14881a9 100644 (file)
@@ -34,7 +34,6 @@ int __init early_init_dt_scan_opal(unsigned long node,
 {
        const void *basep, *entryp;
        unsigned long basesz, entrysz;
-       u64 glue;
 
        if (depth != 1 || strcmp(uname, "ibm,opal") != 0)
                return 0;
@@ -61,6 +60,16 @@ int __init early_init_dt_scan_opal(unsigned long node,
                printk("OPAL V1 detected !\n");
        }
 
+       return 1;
+}
+
+static int __init opal_register_exception_handlers(void)
+{
+       u64 glue;
+
+       if (!(powerpc_firmware_features & FW_FEATURE_OPAL))
+               return -ENODEV;
+
        /* Hookup some exception handlers. We use the fwnmi area at 0x7000
         * to provide the glue space to OPAL
         */
@@ -74,9 +83,11 @@ int __init early_init_dt_scan_opal(unsigned long node,
        glue += 128;
        opal_register_exception_handler(OPAL_SOFTPATCH_HANDLER, 0, glue);
 
-       return 1;
+       return 0;
 }
 
+early_initcall(opal_register_exception_handlers);
+
 int opal_get_chars(uint32_t vtermno, char *buf, int count)
 {
        s64 len, rc;