diff options
Diffstat (limited to 'arch/powerpc')
-rw-r--r-- | arch/powerpc/include/asm/opal.h | 11 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/opal-wrappers.S | 2 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/opal.c | 23 |
3 files changed, 36 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index b2f8ce1fd0d7..86055e598269 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h | |||
@@ -149,6 +149,8 @@ struct opal_sg_list { | |||
149 | #define OPAL_DUMP_INFO2 94 | 149 | #define OPAL_DUMP_INFO2 94 |
150 | #define OPAL_PCI_EEH_FREEZE_SET 97 | 150 | #define OPAL_PCI_EEH_FREEZE_SET 97 |
151 | #define OPAL_HANDLE_HMI 98 | 151 | #define OPAL_HANDLE_HMI 98 |
152 | #define OPAL_REGISTER_DUMP_REGION 101 | ||
153 | #define OPAL_UNREGISTER_DUMP_REGION 102 | ||
152 | 154 | ||
153 | #ifndef __ASSEMBLY__ | 155 | #ifndef __ASSEMBLY__ |
154 | 156 | ||
@@ -920,6 +922,8 @@ int64_t opal_set_param(uint64_t token, uint32_t param_id, uint64_t buffer, | |||
920 | uint64_t length); | 922 | uint64_t length); |
921 | int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data); | 923 | int64_t opal_sensor_read(uint32_t sensor_hndl, int token, __be32 *sensor_data); |
922 | int64_t opal_handle_hmi(void); | 924 | int64_t opal_handle_hmi(void); |
925 | int64_t opal_register_dump_region(uint32_t id, uint64_t start, uint64_t end); | ||
926 | int64_t opal_unregister_dump_region(uint32_t id); | ||
923 | 927 | ||
924 | /* Internal functions */ | 928 | /* Internal functions */ |
925 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, | 929 | extern int early_init_dt_scan_opal(unsigned long node, const char *uname, |
@@ -974,6 +978,13 @@ struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, | |||
974 | unsigned long vmalloc_size); | 978 | unsigned long vmalloc_size); |
975 | void opal_free_sg_list(struct opal_sg_list *sg); | 979 | void opal_free_sg_list(struct opal_sg_list *sg); |
976 | 980 | ||
981 | /* | ||
982 | * Dump region ID range usable by the OS | ||
983 | */ | ||
984 | #define OPAL_DUMP_REGION_HOST_START 0x80 | ||
985 | #define OPAL_DUMP_REGION_LOG_BUF 0x80 | ||
986 | #define OPAL_DUMP_REGION_HOST_END 0xFF | ||
987 | |||
977 | #endif /* __ASSEMBLY__ */ | 988 | #endif /* __ASSEMBLY__ */ |
978 | 989 | ||
979 | #endif /* __OPAL_H */ | 990 | #endif /* __OPAL_H */ |
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S index a328be44880f..2e6ce1b8dc8f 100644 --- a/arch/powerpc/platforms/powernv/opal-wrappers.S +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | |||
@@ -245,3 +245,5 @@ OPAL_CALL(opal_sensor_read, OPAL_SENSOR_READ); | |||
245 | OPAL_CALL(opal_get_param, OPAL_GET_PARAM); | 245 | OPAL_CALL(opal_get_param, OPAL_GET_PARAM); |
246 | OPAL_CALL(opal_set_param, OPAL_SET_PARAM); | 246 | OPAL_CALL(opal_set_param, OPAL_SET_PARAM); |
247 | OPAL_CALL(opal_handle_hmi, OPAL_HANDLE_HMI); | 247 | OPAL_CALL(opal_handle_hmi, OPAL_HANDLE_HMI); |
248 | OPAL_CALL(opal_register_dump_region, OPAL_REGISTER_DUMP_REGION); | ||
249 | OPAL_CALL(opal_unregister_dump_region, OPAL_UNREGISTER_DUMP_REGION); | ||
diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index f0a01a46a57d..b44eec3e8dbd 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c | |||
@@ -605,6 +605,24 @@ static int opal_sysfs_init(void) | |||
605 | return 0; | 605 | return 0; |
606 | } | 606 | } |
607 | 607 | ||
608 | static void __init opal_dump_region_init(void) | ||
609 | { | ||
610 | void *addr; | ||
611 | uint64_t size; | ||
612 | int rc; | ||
613 | |||
614 | /* Register kernel log buffer */ | ||
615 | addr = log_buf_addr_get(); | ||
616 | size = log_buf_len_get(); | ||
617 | rc = opal_register_dump_region(OPAL_DUMP_REGION_LOG_BUF, | ||
618 | __pa(addr), size); | ||
619 | /* Don't warn if this is just an older OPAL that doesn't | ||
620 | * know about that call | ||
621 | */ | ||
622 | if (rc && rc != OPAL_UNSUPPORTED) | ||
623 | pr_warn("DUMP: Failed to register kernel log buffer. " | ||
624 | "rc = %d\n", rc); | ||
625 | } | ||
608 | static int __init opal_init(void) | 626 | static int __init opal_init(void) |
609 | { | 627 | { |
610 | struct device_node *np, *consoles; | 628 | struct device_node *np, *consoles; |
@@ -654,6 +672,8 @@ static int __init opal_init(void) | |||
654 | /* Create "opal" kobject under /sys/firmware */ | 672 | /* Create "opal" kobject under /sys/firmware */ |
655 | rc = opal_sysfs_init(); | 673 | rc = opal_sysfs_init(); |
656 | if (rc == 0) { | 674 | if (rc == 0) { |
675 | /* Setup dump region interface */ | ||
676 | opal_dump_region_init(); | ||
657 | /* Setup error log interface */ | 677 | /* Setup error log interface */ |
658 | rc = opal_elog_init(); | 678 | rc = opal_elog_init(); |
659 | /* Setup code update interface */ | 679 | /* Setup code update interface */ |
@@ -694,6 +714,9 @@ void opal_shutdown(void) | |||
694 | else | 714 | else |
695 | mdelay(10); | 715 | mdelay(10); |
696 | } | 716 | } |
717 | |||
718 | /* Unregister memory dump region */ | ||
719 | opal_unregister_dump_region(OPAL_DUMP_REGION_LOG_BUF); | ||
697 | } | 720 | } |
698 | 721 | ||
699 | /* Export this so that test modules can use it */ | 722 | /* Export this so that test modules can use it */ |