@ -71,10 +71,10 @@ module_param(mem_type, uint, 0400);
MODULE_PARM_DESC ( mem_type ,
MODULE_PARM_DESC ( mem_type ,
" set to 1 to try to use unbuffered memory (default 0) " ) ;
" set to 1 to try to use unbuffered memory (default 0) " ) ;
static int dump_oops = 1 ;
static int ramoops_max_reason = - 1 ;
module_param ( dump_oops , int , 0400 ) ;
module_param_named ( max_reason , ramoops_max_reason , int , 0400 ) ;
MODULE_PARM_DESC ( dump_oops ,
MODULE_PARM_DESC ( max_reason ,
" set to 1 to dump oopses, 0 to only dump panics (default 1) " ) ;
" maximum reason for kmsg dump (default 2: Oops and Panic) " ) ;
static int ramoops_ecc ;
static int ramoops_ecc ;
module_param_named ( ecc , ramoops_ecc , int , 0400 ) ;
module_param_named ( ecc , ramoops_ecc , int , 0400 ) ;
@ -83,6 +83,11 @@ MODULE_PARM_DESC(ramoops_ecc,
" ECC buffer size in bytes (1 is a special value, means 16 "
" ECC buffer size in bytes (1 is a special value, means 16 "
" bytes ECC) " ) ;
" bytes ECC) " ) ;
static int ramoops_dump_oops = - 1 ;
module_param_named ( dump_oops , ramoops_dump_oops , int , 0400 ) ;
MODULE_PARM_DESC ( dump_oops ,
" (deprecated: use max_reason instead) set to 1 to dump oopses & panics, 0 to only dump panics " ) ;
struct ramoops_context {
struct ramoops_context {
struct persistent_ram_zone * * dprzs ; /* Oops dump zones */
struct persistent_ram_zone * * dprzs ; /* Oops dump zones */
struct persistent_ram_zone * cprz ; /* Console zone */
struct persistent_ram_zone * cprz ; /* Console zone */
@ -95,7 +100,6 @@ struct ramoops_context {
size_t console_size ;
size_t console_size ;
size_t ftrace_size ;
size_t ftrace_size ;
size_t pmsg_size ;
size_t pmsg_size ;
int dump_oops ;
u32 flags ;
u32 flags ;
struct persistent_ram_ecc_info ecc_info ;
struct persistent_ram_ecc_info ecc_info ;
unsigned int max_dump_cnt ;
unsigned int max_dump_cnt ;
@ -406,16 +410,14 @@ static int notrace ramoops_pstore_write(struct pstore_record *record)
return - EINVAL ;
return - EINVAL ;
/*
/*
* Out of the various dmesg dump types , ramoops is currently designed
* We could filter on record - > reason here if we wanted to ( which
* to only store crash logs , rather than storing general kernel logs .
* would duplicate what happened before the " max_reason " setting
* was added ) , but that would defeat the purpose of a system
* changing printk . always_kmsg_dump , so instead log everything that
* the kmsg dumper sends us , since it should be doing the filtering
* based on the combination of printk . always_kmsg_dump and our
* requested " max_reason " .
*/
*/
if ( record - > reason ! = KMSG_DUMP_OOPS & &
record - > reason ! = KMSG_DUMP_PANIC )
return - EINVAL ;
/* Skip Oopes when configured to do so. */
if ( record - > reason = = KMSG_DUMP_OOPS & & ! cxt - > dump_oops )
return - EINVAL ;
/*
/*
* Explicitly only take the first part of any new crash .
* Explicitly only take the first part of any new crash .
@ -704,7 +706,14 @@ static int ramoops_parse_dt(struct platform_device *pdev,
pdata - > mem_size = resource_size ( res ) ;
pdata - > mem_size = resource_size ( res ) ;
pdata - > mem_address = res - > start ;
pdata - > mem_address = res - > start ;
pdata - > mem_type = of_property_read_bool ( of_node , " unbuffered " ) ;
pdata - > mem_type = of_property_read_bool ( of_node , " unbuffered " ) ;
pdata - > dump_oops = ! of_property_read_bool ( of_node , " no-dump-oops " ) ;
/*
* Setting " no-dump-oops " is deprecated and will be ignored if
* " max_reason " is also specified .
*/
if ( of_property_read_bool ( of_node , " no-dump-oops " ) )
pdata - > max_reason = KMSG_DUMP_PANIC ;
else
pdata - > max_reason = KMSG_DUMP_OOPS ;
# define parse_u32(name, field, default_value) { \
# define parse_u32(name, field, default_value) { \
ret = ramoops_parse_dt_u32 ( pdev , name , default_value , \
ret = ramoops_parse_dt_u32 ( pdev , name , default_value , \
@ -720,6 +729,7 @@ static int ramoops_parse_dt(struct platform_device *pdev,
parse_u32 ( " pmsg-size " , pdata - > pmsg_size , 0 ) ;
parse_u32 ( " pmsg-size " , pdata - > pmsg_size , 0 ) ;
parse_u32 ( " ecc-size " , pdata - > ecc_info . ecc_size , 0 ) ;
parse_u32 ( " ecc-size " , pdata - > ecc_info . ecc_size , 0 ) ;
parse_u32 ( " flags " , pdata - > flags , 0 ) ;
parse_u32 ( " flags " , pdata - > flags , 0 ) ;
parse_u32 ( " max-reason " , pdata - > max_reason , pdata - > max_reason ) ;
# undef parse_u32
# undef parse_u32
@ -789,7 +799,6 @@ static int ramoops_probe(struct platform_device *pdev)
cxt - > console_size = pdata - > console_size ;
cxt - > console_size = pdata - > console_size ;
cxt - > ftrace_size = pdata - > ftrace_size ;
cxt - > ftrace_size = pdata - > ftrace_size ;
cxt - > pmsg_size = pdata - > pmsg_size ;
cxt - > pmsg_size = pdata - > pmsg_size ;
cxt - > dump_oops = pdata - > dump_oops ;
cxt - > flags = pdata - > flags ;
cxt - > flags = pdata - > flags ;
cxt - > ecc_info = pdata - > ecc_info ;
cxt - > ecc_info = pdata - > ecc_info ;
@ -832,8 +841,10 @@ static int ramoops_probe(struct platform_device *pdev)
* the single region size is how to check .
* the single region size is how to check .
*/
*/
cxt - > pstore . flags = 0 ;
cxt - > pstore . flags = 0 ;
if ( cxt - > max_dump_cnt )
if ( cxt - > max_dump_cnt ) {
cxt - > pstore . flags | = PSTORE_FLAGS_DMESG ;
cxt - > pstore . flags | = PSTORE_FLAGS_DMESG ;
cxt - > pstore . max_reason = pdata - > max_reason ;
}
if ( cxt - > console_size )
if ( cxt - > console_size )
cxt - > pstore . flags | = PSTORE_FLAGS_CONSOLE ;
cxt - > pstore . flags | = PSTORE_FLAGS_CONSOLE ;
if ( cxt - > max_ftrace_cnt )
if ( cxt - > max_ftrace_cnt )
@ -869,7 +880,7 @@ static int ramoops_probe(struct platform_device *pdev)
mem_size = pdata - > mem_size ;
mem_size = pdata - > mem_size ;
mem_address = pdata - > mem_address ;
mem_address = pdata - > mem_address ;
record_size = pdata - > record_size ;
record_size = pdata - > record_size ;
dump_oops = pdata - > dump_oops ;
ramoops_max_reason = pdata - > max_reason ;
ramoops_console_size = pdata - > console_size ;
ramoops_console_size = pdata - > console_size ;
ramoops_pmsg_size = pdata - > pmsg_size ;
ramoops_pmsg_size = pdata - > pmsg_size ;
ramoops_ftrace_size = pdata - > ftrace_size ;
ramoops_ftrace_size = pdata - > ftrace_size ;
@ -944,7 +955,16 @@ static void ramoops_register_dummy(void)
dummy_data - > console_size = ramoops_console_size ;
dummy_data - > console_size = ramoops_console_size ;
dummy_data - > ftrace_size = ramoops_ftrace_size ;
dummy_data - > ftrace_size = ramoops_ftrace_size ;
dummy_data - > pmsg_size = ramoops_pmsg_size ;
dummy_data - > pmsg_size = ramoops_pmsg_size ;
dummy_data - > dump_oops = dump_oops ;
/* If "max_reason" is set, its value has priority over "dump_oops". */
if ( ramoops_max_reason > = 0 )
dummy_data - > max_reason = ramoops_max_reason ;
/* Otherwise, if "dump_oops" is set, parse it into "max_reason". */
else if ( ramoops_dump_oops ! = - 1 )
dummy_data - > max_reason = ramoops_dump_oops ? KMSG_DUMP_OOPS
: KMSG_DUMP_PANIC ;
/* And if neither are explicitly set, use the default. */
else
dummy_data - > max_reason = KMSG_DUMP_OOPS ;
dummy_data - > flags = RAMOOPS_FLAG_FTRACE_PER_CPU ;
dummy_data - > flags = RAMOOPS_FLAG_FTRACE_PER_CPU ;
/*
/*