memory are implementation defined, and won't work on many ARMs such as omaps.
 
 The memory area is divided into ``record_size`` chunks (also rounded down to
-power of two) and each oops/panic writes a ``record_size`` chunk of
+power of two) and each kmesg dump writes a ``record_size`` chunk of
 information.
 
-Dumping both oopses and panics can be done by setting 1 in the ``dump_oops``
-variable while setting 0 in that variable dumps only the panics.
+Limiting which kinds of kmsg dumps are stored can be controlled via
+the ``max_reason`` value, as defined in include/linux/kmsg_dump.h's
+``enum kmsg_dump_reason``. For example, to store both Oopses and Panics,
+``max_reason`` should be set to 2 (KMSG_DUMP_OOPS), to store only Panics
+``max_reason`` should be set to 1 (KMSG_DUMP_PANIC). Setting this to 0
+(KMSG_DUMP_UNDEF), means the reason filtering will be controlled by the
+``printk.always_kmsg_dump`` boot param: if unset, it'll be KMSG_DUMP_OOPS,
+otherwise KMSG_DUMP_MAX.
 
 The module uses a counter to record multiple dumps but the counter gets reset
 on restart (i.e. new dumps after the restart will overwrite old ones).
         .mem_address            = <...>,
         .mem_type               = <...>,
         .record_size            = <...>,
-        .dump_oops              = <...>,
+        .max_reason             = <...>,
         .ecc                    = <...>,
   };
 
 
 MODULE_PARM_DESC(mem_type,
                "set to 1 to try to use unbuffered memory (default 0)");
 
-static int dump_oops = 1;
-module_param(dump_oops, int, 0400);
-MODULE_PARM_DESC(dump_oops,
-               "set to 1 to dump oopses, 0 to only dump panics (default 1)");
+static int ramoops_max_reason = -1;
+module_param_named(max_reason, ramoops_max_reason, int, 0400);
+MODULE_PARM_DESC(max_reason,
+                "maximum reason for kmsg dump (default 2: Oops and Panic) ");
 
 static int ramoops_ecc;
 module_param_named(ecc, ramoops_ecc, int, 0400);
                "ECC buffer size in bytes (1 is a special value, means 16 "
                "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 persistent_ram_zone **dprzs;     /* Oops dump zones */
        struct persistent_ram_zone *cprz;       /* Console zone */
        size_t console_size;
        size_t ftrace_size;
        size_t pmsg_size;
-       int dump_oops;
        u32 flags;
        struct persistent_ram_ecc_info ecc_info;
        unsigned int max_dump_cnt;
                return -EINVAL;
 
        /*
-        * Out of the various dmesg dump types, ramoops is currently designed
-        * to only store crash logs, rather than storing general kernel logs.
+        * We could filter on record->reason here if we wanted to (which
+        * 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.
        pdata->mem_size = resource_size(res);
        pdata->mem_address = res->start;
        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) {                                \
                ret = ramoops_parse_dt_u32(pdev, name, default_value,   \
        parse_u32("pmsg-size", pdata->pmsg_size, 0);
        parse_u32("ecc-size", pdata->ecc_info.ecc_size, 0);
        parse_u32("flags", pdata->flags, 0);
+       parse_u32("max-reason", pdata->max_reason, pdata->max_reason);
 
 #undef parse_u32
 
        cxt->console_size = pdata->console_size;
        cxt->ftrace_size = pdata->ftrace_size;
        cxt->pmsg_size = pdata->pmsg_size;
-       cxt->dump_oops = pdata->dump_oops;
        cxt->flags = pdata->flags;
        cxt->ecc_info = pdata->ecc_info;
 
         * the single region size is how to check.
         */
        cxt->pstore.flags = 0;
-       if (cxt->max_dump_cnt)
+       if (cxt->max_dump_cnt) {
                cxt->pstore.flags |= PSTORE_FLAGS_DMESG;
+               cxt->pstore.max_reason = pdata->max_reason;
+       }
        if (cxt->console_size)
                cxt->pstore.flags |= PSTORE_FLAGS_CONSOLE;
        if (cxt->max_ftrace_cnt)
        mem_size = pdata->mem_size;
        mem_address = pdata->mem_address;
        record_size = pdata->record_size;
-       dump_oops = pdata->dump_oops;
+       ramoops_max_reason = pdata->max_reason;
        ramoops_console_size = pdata->console_size;
        ramoops_pmsg_size = pdata->pmsg_size;
        ramoops_ftrace_size = pdata->ftrace_size;
        pdata.console_size = ramoops_console_size;
        pdata.ftrace_size = ramoops_ftrace_size;
        pdata.pmsg_size = ramoops_pmsg_size;
-       pdata.dump_oops = dump_oops;
+       /* If "max_reason" is set, its value has priority over "dump_oops". */
+       if (ramoops_max_reason >= 0)
+               pdata.max_reason = ramoops_max_reason;
+       /* Otherwise, if "dump_oops" is set, parse it into "max_reason". */
+       else if (ramoops_dump_oops != -1)
+               pdata.max_reason = ramoops_dump_oops ? KMSG_DUMP_OOPS
+                                                    : KMSG_DUMP_PANIC;
+       /* And if neither are explicitly set, use the default. */
+       else
+               pdata.max_reason = KMSG_DUMP_OOPS;
        pdata.flags = RAMOOPS_FLAG_FTRACE_PER_CPU;
 
        /*