1 // SPDX-License-Identifier: GPL-2.0-only
3 * RAM Oops/Panic logger
5 * Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com>
6 * Copyright (C) 2011 Kees Cook <keescook@chromium.org>
9 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
11 #include <linux/kernel.h>
12 #include <linux/err.h>
13 #include <linux/module.h>
14 #include <linux/version.h>
15 #include <linux/pstore.h>
17 #include <linux/ioport.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/compiler.h>
22 #include <linux/of_address.h>
26 #include "ram_internal.h"
28 #define RAMOOPS_KERNMSG_HDR "===="
29 #define MIN_MEM_SIZE 4096UL
31 static ulong record_size
= MIN_MEM_SIZE
;
32 module_param(record_size
, ulong
, 0400);
33 MODULE_PARM_DESC(record_size
,
34 "size of each dump done on oops/panic");
36 static ulong ramoops_console_size
= MIN_MEM_SIZE
;
37 module_param_named(console_size
, ramoops_console_size
, ulong
, 0400);
38 MODULE_PARM_DESC(console_size
, "size of kernel console log");
40 static ulong ramoops_ftrace_size
= MIN_MEM_SIZE
;
41 module_param_named(ftrace_size
, ramoops_ftrace_size
, ulong
, 0400);
42 MODULE_PARM_DESC(ftrace_size
, "size of ftrace log");
44 static ulong ramoops_pmsg_size
= MIN_MEM_SIZE
;
45 module_param_named(pmsg_size
, ramoops_pmsg_size
, ulong
, 0400);
46 MODULE_PARM_DESC(pmsg_size
, "size of user space message log");
48 static unsigned long long mem_address
;
49 module_param_hw(mem_address
, ullong
, other
, 0400);
50 MODULE_PARM_DESC(mem_address
,
51 "start of reserved RAM used to store oops/panic logs");
53 static char *mem_name
;
54 module_param_named(mem_name
, mem_name
, charp
, 0400);
55 MODULE_PARM_DESC(mem_name
, "name of kernel param that holds addr");
57 static ulong mem_size
;
58 module_param(mem_size
, ulong
, 0400);
59 MODULE_PARM_DESC(mem_size
,
60 "size of reserved RAM used to store oops/panic logs");
62 static unsigned int mem_type
;
63 module_param(mem_type
, uint
, 0400);
64 MODULE_PARM_DESC(mem_type
,
65 "memory type: 0=write-combined (default), 1=unbuffered, 2=cached");
67 static int ramoops_max_reason
= -1;
68 module_param_named(max_reason
, ramoops_max_reason
, int, 0400);
69 MODULE_PARM_DESC(max_reason
,
70 "maximum reason for kmsg dump (default 2: Oops and Panic) ");
72 static int ramoops_ecc
;
73 module_param_named(ecc
, ramoops_ecc
, int, 0400);
74 MODULE_PARM_DESC(ramoops_ecc
,
75 "if non-zero, the option enables ECC support and specifies "
76 "ECC buffer size in bytes (1 is a special value, means 16 "
79 static int ramoops_dump_oops
= -1;
80 module_param_named(dump_oops
, ramoops_dump_oops
, int, 0400);
81 MODULE_PARM_DESC(dump_oops
,
82 "(deprecated: use max_reason instead) set to 1 to dump oopses & panics, 0 to only dump panics");
84 struct ramoops_context
{
85 struct persistent_ram_zone
**dprzs
; /* Oops dump zones */
86 struct persistent_ram_zone
*cprz
; /* Console zone */
87 struct persistent_ram_zone
**fprzs
; /* Ftrace zones */
88 struct persistent_ram_zone
*mprz
; /* PMSG zone */
89 phys_addr_t phys_addr
;
97 struct persistent_ram_ecc_info ecc_info
;
98 unsigned int max_dump_cnt
;
99 unsigned int dump_write_cnt
;
100 /* _read_cnt need clear on ramoops_pstore_open */
101 unsigned int dump_read_cnt
;
102 unsigned int console_read_cnt
;
103 unsigned int max_ftrace_cnt
;
104 unsigned int ftrace_read_cnt
;
105 unsigned int pmsg_read_cnt
;
106 struct pstore_info pstore
;
109 static struct platform_device
*dummy
;
111 static int ramoops_pstore_open(struct pstore_info
*psi
)
113 struct ramoops_context
*cxt
= psi
->data
;
115 cxt
->dump_read_cnt
= 0;
116 cxt
->console_read_cnt
= 0;
117 cxt
->ftrace_read_cnt
= 0;
118 cxt
->pmsg_read_cnt
= 0;
122 static struct persistent_ram_zone
*
123 ramoops_get_next_prz(struct persistent_ram_zone
*przs
[], int id
,
124 struct pstore_record
*record
)
126 struct persistent_ram_zone
*prz
;
128 /* Give up if we never existed or have hit the end. */
136 /* Update old/shadowed buffer. */
137 if (prz
->type
== PSTORE_TYPE_DMESG
)
138 persistent_ram_save_old(prz
);
140 if (!persistent_ram_old_size(prz
))
143 record
->type
= prz
->type
;
149 static int ramoops_read_kmsg_hdr(char *buffer
, struct timespec64
*time
,
153 int header_length
= 0;
155 if (sscanf(buffer
, RAMOOPS_KERNMSG_HDR
"%lld.%lu-%c\n%n",
156 (time64_t
*)&time
->tv_sec
, &time
->tv_nsec
, &data_type
,
157 &header_length
) == 3) {
158 time
->tv_nsec
*= 1000;
159 if (data_type
== 'C')
163 } else if (sscanf(buffer
, RAMOOPS_KERNMSG_HDR
"%lld.%lu\n%n",
164 (time64_t
*)&time
->tv_sec
, &time
->tv_nsec
,
165 &header_length
) == 2) {
166 time
->tv_nsec
*= 1000;
173 return header_length
;
176 static bool prz_ok(struct persistent_ram_zone
*prz
)
178 return !!prz
&& !!(persistent_ram_old_size(prz
) +
179 persistent_ram_ecc_string(prz
, NULL
, 0));
182 static ssize_t
ramoops_pstore_read(struct pstore_record
*record
)
185 struct ramoops_context
*cxt
= record
->psi
->data
;
186 struct persistent_ram_zone
*prz
= NULL
;
187 int header_length
= 0;
188 bool free_prz
= false;
191 * Ramoops headers provide time stamps for PSTORE_TYPE_DMESG, but
192 * PSTORE_TYPE_CONSOLE and PSTORE_TYPE_FTRACE don't currently have
193 * valid time stamps, so it is initialized to zero.
195 record
->time
.tv_sec
= 0;
196 record
->time
.tv_nsec
= 0;
197 record
->compressed
= false;
199 /* Find the next valid persistent_ram_zone for DMESG */
200 while (cxt
->dump_read_cnt
< cxt
->max_dump_cnt
&& !prz
) {
201 prz
= ramoops_get_next_prz(cxt
->dprzs
, cxt
->dump_read_cnt
++,
205 header_length
= ramoops_read_kmsg_hdr(persistent_ram_old(prz
),
207 &record
->compressed
);
208 /* Clear and skip this DMESG record if it has no valid header */
209 if (!header_length
) {
210 persistent_ram_free_old(prz
);
211 persistent_ram_zap(prz
);
216 if (!prz_ok(prz
) && !cxt
->console_read_cnt
++)
217 prz
= ramoops_get_next_prz(&cxt
->cprz
, 0 /* single */, record
);
219 if (!prz_ok(prz
) && !cxt
->pmsg_read_cnt
++)
220 prz
= ramoops_get_next_prz(&cxt
->mprz
, 0 /* single */, record
);
222 /* ftrace is last since it may want to dynamically allocate memory. */
224 if (!(cxt
->flags
& RAMOOPS_FLAG_FTRACE_PER_CPU
) &&
225 !cxt
->ftrace_read_cnt
++) {
226 prz
= ramoops_get_next_prz(cxt
->fprzs
, 0 /* single */,
230 * Build a new dummy record which combines all the
231 * per-cpu records including metadata and ecc info.
233 struct persistent_ram_zone
*tmp_prz
, *prz_next
;
235 tmp_prz
= kzalloc(sizeof(struct persistent_ram_zone
),
242 while (cxt
->ftrace_read_cnt
< cxt
->max_ftrace_cnt
) {
243 prz_next
= ramoops_get_next_prz(cxt
->fprzs
,
244 cxt
->ftrace_read_cnt
++, record
);
246 if (!prz_ok(prz_next
))
249 tmp_prz
->ecc_info
= prz_next
->ecc_info
;
250 tmp_prz
->corrected_bytes
+=
251 prz_next
->corrected_bytes
;
252 tmp_prz
->bad_blocks
+= prz_next
->bad_blocks
;
254 size
= pstore_ftrace_combine_log(
256 &tmp_prz
->old_log_size
,
258 prz_next
->old_log_size
);
271 size
= persistent_ram_old_size(prz
) - header_length
;
273 /* ECC correction notice */
274 record
->ecc_notice_size
= persistent_ram_ecc_string(prz
, NULL
, 0);
276 record
->buf
= kvzalloc(size
+ record
->ecc_notice_size
+ 1, GFP_KERNEL
);
277 if (record
->buf
== NULL
) {
282 memcpy(record
->buf
, (char *)persistent_ram_old(prz
) + header_length
,
285 persistent_ram_ecc_string(prz
, record
->buf
+ size
,
286 record
->ecc_notice_size
+ 1);
290 kvfree(prz
->old_log
);
297 static size_t ramoops_write_kmsg_hdr(struct persistent_ram_zone
*prz
,
298 struct pstore_record
*record
)
300 char hdr
[36]; /* "===="(4), %lld(20), "."(1), %06lu(6), "-%c\n"(3) */
303 len
= scnprintf(hdr
, sizeof(hdr
),
304 RAMOOPS_KERNMSG_HDR
"%lld.%06lu-%c\n",
305 (time64_t
)record
->time
.tv_sec
,
306 record
->time
.tv_nsec
/ 1000,
307 record
->compressed
? 'C' : 'D');
308 persistent_ram_write(prz
, hdr
, len
);
313 static int notrace
ramoops_pstore_write(struct pstore_record
*record
)
315 struct ramoops_context
*cxt
= record
->psi
->data
;
316 struct persistent_ram_zone
*prz
;
319 if (record
->type
== PSTORE_TYPE_CONSOLE
) {
322 persistent_ram_write(cxt
->cprz
, record
->buf
, record
->size
);
324 } else if (record
->type
== PSTORE_TYPE_FTRACE
) {
330 * Choose zone by if we're using per-cpu buffers.
332 if (cxt
->flags
& RAMOOPS_FLAG_FTRACE_PER_CPU
)
333 zonenum
= smp_processor_id();
337 persistent_ram_write(cxt
->fprzs
[zonenum
], record
->buf
,
340 } else if (record
->type
== PSTORE_TYPE_PMSG
) {
341 pr_warn_ratelimited("PMSG shouldn't call %s\n", __func__
);
345 if (record
->type
!= PSTORE_TYPE_DMESG
)
349 * We could filter on record->reason here if we wanted to (which
350 * would duplicate what happened before the "max_reason" setting
351 * was added), but that would defeat the purpose of a system
352 * changing printk.always_kmsg_dump, so instead log everything that
353 * the kmsg dumper sends us, since it should be doing the filtering
354 * based on the combination of printk.always_kmsg_dump and our
355 * requested "max_reason".
359 * Explicitly only take the first part of any new crash.
360 * If our buffer is larger than kmsg_bytes, this can never happen,
361 * and if our buffer is smaller than kmsg_bytes, we don't want the
362 * report split across multiple records.
364 if (record
->part
!= 1)
370 prz
= cxt
->dprzs
[cxt
->dump_write_cnt
];
373 * Since this is a new crash dump, we need to reset the buffer in
374 * case it still has an old dump present. Without this, the new dump
375 * will get appended, which would seriously confuse anything trying
376 * to check dump file contents. Specifically, ramoops_read_kmsg_hdr()
377 * expects to find a dump header in the beginning of buffer data, so
378 * we must to reset the buffer values, in order to ensure that the
379 * header will be written to the beginning of the buffer.
381 persistent_ram_zap(prz
);
383 /* Build header and append record contents. */
384 hlen
= ramoops_write_kmsg_hdr(prz
, record
);
389 if (size
+ hlen
> prz
->buffer_size
)
390 size
= prz
->buffer_size
- hlen
;
391 persistent_ram_write(prz
, record
->buf
, size
);
393 cxt
->dump_write_cnt
= (cxt
->dump_write_cnt
+ 1) % cxt
->max_dump_cnt
;
398 static int notrace
ramoops_pstore_write_user(struct pstore_record
*record
,
399 const char __user
*buf
)
401 if (record
->type
== PSTORE_TYPE_PMSG
) {
402 struct ramoops_context
*cxt
= record
->psi
->data
;
406 return persistent_ram_write_user(cxt
->mprz
, buf
, record
->size
);
412 static int ramoops_pstore_erase(struct pstore_record
*record
)
414 struct ramoops_context
*cxt
= record
->psi
->data
;
415 struct persistent_ram_zone
*prz
;
417 switch (record
->type
) {
418 case PSTORE_TYPE_DMESG
:
419 if (record
->id
>= cxt
->max_dump_cnt
)
421 prz
= cxt
->dprzs
[record
->id
];
423 case PSTORE_TYPE_CONSOLE
:
426 case PSTORE_TYPE_FTRACE
:
427 if (record
->id
>= cxt
->max_ftrace_cnt
)
429 prz
= cxt
->fprzs
[record
->id
];
431 case PSTORE_TYPE_PMSG
:
438 persistent_ram_free_old(prz
);
439 persistent_ram_zap(prz
);
444 static struct ramoops_context oops_cxt
= {
446 .owner
= THIS_MODULE
,
448 .open
= ramoops_pstore_open
,
449 .read
= ramoops_pstore_read
,
450 .write
= ramoops_pstore_write
,
451 .write_user
= ramoops_pstore_write_user
,
452 .erase
= ramoops_pstore_erase
,
456 static void ramoops_free_przs(struct ramoops_context
*cxt
)
461 persistent_ram_free(&cxt
->mprz
);
463 /* Free console PRZ */
464 persistent_ram_free(&cxt
->cprz
);
468 for (i
= 0; i
< cxt
->max_dump_cnt
; i
++)
469 persistent_ram_free(&cxt
->dprzs
[i
]);
473 cxt
->max_dump_cnt
= 0;
476 /* Free ftrace PRZs */
478 for (i
= 0; i
< cxt
->max_ftrace_cnt
; i
++)
479 persistent_ram_free(&cxt
->fprzs
[i
]);
482 cxt
->max_ftrace_cnt
= 0;
486 static int ramoops_init_przs(const char *name
,
487 struct device
*dev
, struct ramoops_context
*cxt
,
488 struct persistent_ram_zone
***przs
,
489 phys_addr_t
*paddr
, size_t mem_sz
,
491 unsigned int *cnt
, u32 sig
, u32 flags
)
496 struct persistent_ram_zone
**prz_ar
;
498 /* Allocate nothing for 0 mem_sz or 0 record_size. */
499 if (mem_sz
== 0 || record_size
== 0) {
505 * If we have a negative record size, calculate it based on
506 * mem_sz / *cnt. If we have a positive record size, calculate
507 * cnt from mem_sz / record_size.
509 if (record_size
< 0) {
512 record_size
= mem_sz
/ *cnt
;
513 if (record_size
== 0) {
514 dev_err(dev
, "%s record size == 0 (%zu / %u)\n",
519 *cnt
= mem_sz
/ record_size
;
521 dev_err(dev
, "%s record count == 0 (%zu / %zu)\n",
522 name
, mem_sz
, record_size
);
527 if (*paddr
+ mem_sz
- cxt
->phys_addr
> cxt
->size
) {
528 dev_err(dev
, "no room for %s mem region (0x%zx@0x%llx) in (0x%lx@0x%llx)\n",
530 mem_sz
, (unsigned long long)*paddr
,
531 cxt
->size
, (unsigned long long)cxt
->phys_addr
);
535 zone_sz
= mem_sz
/ *cnt
;
536 zone_sz
= ALIGN_DOWN(zone_sz
, 2);
538 dev_err(dev
, "%s zone size == 0\n", name
);
542 prz_ar
= kcalloc(*cnt
, sizeof(**przs
), GFP_KERNEL
);
546 for (i
= 0; i
< *cnt
; i
++) {
550 label
= kasprintf(GFP_KERNEL
, "ramoops:%s", name
);
552 label
= kasprintf(GFP_KERNEL
, "ramoops:%s(%d/%d)",
554 prz_ar
[i
] = persistent_ram_new(*paddr
, zone_sz
, sig
,
556 cxt
->memtype
, flags
, label
);
558 if (IS_ERR(prz_ar
[i
])) {
559 err
= PTR_ERR(prz_ar
[i
]);
560 dev_err(dev
, "failed to request %s mem region (0x%zx@0x%llx): %d\n",
562 (unsigned long long)*paddr
, err
);
566 persistent_ram_free(&prz_ar
[i
]);
573 prz_ar
[i
]->type
= pstore_name_to_type(name
);
584 static int ramoops_init_prz(const char *name
,
585 struct device
*dev
, struct ramoops_context
*cxt
,
586 struct persistent_ram_zone
**prz
,
587 phys_addr_t
*paddr
, size_t sz
, u32 sig
)
594 if (*paddr
+ sz
- cxt
->phys_addr
> cxt
->size
) {
595 dev_err(dev
, "no room for %s mem region (0x%zx@0x%llx) in (0x%lx@0x%llx)\n",
596 name
, sz
, (unsigned long long)*paddr
,
597 cxt
->size
, (unsigned long long)cxt
->phys_addr
);
601 label
= kasprintf(GFP_KERNEL
, "ramoops:%s", name
);
602 *prz
= persistent_ram_new(*paddr
, sz
, sig
, &cxt
->ecc_info
,
603 cxt
->memtype
, PRZ_FLAG_ZAP_OLD
, label
);
606 int err
= PTR_ERR(*prz
);
608 dev_err(dev
, "failed to request %s mem region (0x%zx@0x%llx): %d\n",
609 name
, sz
, (unsigned long long)*paddr
, err
);
614 (*prz
)->type
= pstore_name_to_type(name
);
619 /* Read a u32 from a dt property and make sure it's safe for an int. */
620 static int ramoops_parse_dt_u32(struct platform_device
*pdev
,
621 const char *propname
,
622 u32 default_value
, u32
*value
)
627 ret
= of_property_read_u32(pdev
->dev
.of_node
, propname
, &val32
);
628 if (ret
== -EINVAL
) {
629 /* field is missing, use default value. */
630 val32
= default_value
;
631 } else if (ret
< 0) {
632 dev_err(&pdev
->dev
, "failed to parse property %s: %d\n",
637 /* Sanity check our results. */
638 if (val32
> INT_MAX
) {
639 dev_err(&pdev
->dev
, "%s %u > INT_MAX\n", propname
, val32
);
647 static int ramoops_parse_dt(struct platform_device
*pdev
,
648 struct ramoops_platform_data
*pdata
)
650 struct device_node
*of_node
= pdev
->dev
.of_node
;
651 struct device_node
*parent_node
;
652 struct resource
*res
;
656 dev_dbg(&pdev
->dev
, "using Device Tree\n");
658 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
661 "failed to locate DT /reserved-memory resource\n");
665 pdata
->mem_size
= resource_size(res
);
666 pdata
->mem_address
= res
->start
;
668 * Setting "unbuffered" is deprecated and will be ignored if
669 * "mem_type" is also specified.
671 pdata
->mem_type
= of_property_read_bool(of_node
, "unbuffered");
673 * Setting "no-dump-oops" is deprecated and will be ignored if
674 * "max_reason" is also specified.
676 if (of_property_read_bool(of_node
, "no-dump-oops"))
677 pdata
->max_reason
= KMSG_DUMP_PANIC
;
679 pdata
->max_reason
= KMSG_DUMP_OOPS
;
681 #define parse_u32(name, field, default_value) { \
682 ret = ramoops_parse_dt_u32(pdev, name, default_value, \
689 parse_u32("mem-type", pdata
->mem_type
, pdata
->mem_type
);
690 parse_u32("record-size", pdata
->record_size
, 0);
691 parse_u32("console-size", pdata
->console_size
, 0);
692 parse_u32("ftrace-size", pdata
->ftrace_size
, 0);
693 parse_u32("pmsg-size", pdata
->pmsg_size
, 0);
694 parse_u32("ecc-size", pdata
->ecc_info
.ecc_size
, 0);
695 parse_u32("flags", pdata
->flags
, 0);
696 parse_u32("max-reason", pdata
->max_reason
, pdata
->max_reason
);
701 * Some old Chromebooks relied on the kernel setting the
702 * console_size and pmsg_size to the record size since that's
703 * what the downstream kernel did. These same Chromebooks had
704 * "ramoops" straight under the root node which isn't
705 * according to the current upstream bindings (though it was
706 * arguably acceptable under a prior version of the bindings).
707 * Let's make those old Chromebooks work by detecting that
708 * we're not a child of "reserved-memory" and mimicking the
711 parent_node
= of_get_parent(of_node
);
712 if (!of_node_name_eq(parent_node
, "reserved-memory") &&
713 !pdata
->console_size
&& !pdata
->ftrace_size
&&
714 !pdata
->pmsg_size
&& !pdata
->ecc_info
.ecc_size
) {
715 pdata
->console_size
= pdata
->record_size
;
716 pdata
->pmsg_size
= pdata
->record_size
;
718 of_node_put(parent_node
);
723 static int ramoops_probe(struct platform_device
*pdev
)
725 struct device
*dev
= &pdev
->dev
;
726 struct ramoops_platform_data
*pdata
= dev
->platform_data
;
727 struct ramoops_platform_data pdata_local
;
728 struct ramoops_context
*cxt
= &oops_cxt
;
734 * Only a single ramoops area allowed at a time, so fail extra
737 if (cxt
->max_dump_cnt
) {
738 pr_err("already initialized\n");
742 if (dev_of_node(dev
) && !pdata
) {
743 pdata
= &pdata_local
;
744 memset(pdata
, 0, sizeof(*pdata
));
746 err
= ramoops_parse_dt(pdev
, pdata
);
751 /* Make sure we didn't get bogus platform data pointer. */
753 pr_err("NULL platform data\n");
758 if (!pdata
->mem_size
|| (!pdata
->record_size
&& !pdata
->console_size
&&
759 !pdata
->ftrace_size
&& !pdata
->pmsg_size
)) {
760 pr_err("The memory size and the record/console size must be "
766 if (pdata
->record_size
&& !is_power_of_2(pdata
->record_size
))
767 pdata
->record_size
= rounddown_pow_of_two(pdata
->record_size
);
768 if (pdata
->console_size
&& !is_power_of_2(pdata
->console_size
))
769 pdata
->console_size
= rounddown_pow_of_two(pdata
->console_size
);
770 if (pdata
->ftrace_size
&& !is_power_of_2(pdata
->ftrace_size
))
771 pdata
->ftrace_size
= rounddown_pow_of_two(pdata
->ftrace_size
);
772 if (pdata
->pmsg_size
&& !is_power_of_2(pdata
->pmsg_size
))
773 pdata
->pmsg_size
= rounddown_pow_of_two(pdata
->pmsg_size
);
775 cxt
->size
= pdata
->mem_size
;
776 cxt
->phys_addr
= pdata
->mem_address
;
777 cxt
->memtype
= pdata
->mem_type
;
778 cxt
->record_size
= pdata
->record_size
;
779 cxt
->console_size
= pdata
->console_size
;
780 cxt
->ftrace_size
= pdata
->ftrace_size
;
781 cxt
->pmsg_size
= pdata
->pmsg_size
;
782 cxt
->flags
= pdata
->flags
;
783 cxt
->ecc_info
= pdata
->ecc_info
;
785 paddr
= cxt
->phys_addr
;
787 dump_mem_sz
= cxt
->size
- cxt
->console_size
- cxt
->ftrace_size
789 err
= ramoops_init_przs("dmesg", dev
, cxt
, &cxt
->dprzs
, &paddr
,
790 dump_mem_sz
, cxt
->record_size
,
791 &cxt
->max_dump_cnt
, 0, 0);
795 err
= ramoops_init_prz("console", dev
, cxt
, &cxt
->cprz
, &paddr
,
796 cxt
->console_size
, 0);
800 err
= ramoops_init_prz("pmsg", dev
, cxt
, &cxt
->mprz
, &paddr
,
805 cxt
->max_ftrace_cnt
= (cxt
->flags
& RAMOOPS_FLAG_FTRACE_PER_CPU
)
808 err
= ramoops_init_przs("ftrace", dev
, cxt
, &cxt
->fprzs
, &paddr
,
809 cxt
->ftrace_size
, -1,
810 &cxt
->max_ftrace_cnt
, LINUX_VERSION_CODE
,
811 (cxt
->flags
& RAMOOPS_FLAG_FTRACE_PER_CPU
)
812 ? PRZ_FLAG_NO_LOCK
: 0);
816 cxt
->pstore
.data
= cxt
;
818 * Prepare frontend flags based on which areas are initialized.
819 * For ramoops_init_przs() cases, the "max count" variable tells
820 * if there are regions present. For ramoops_init_prz() cases,
821 * the single region size is how to check.
823 cxt
->pstore
.flags
= 0;
824 if (cxt
->max_dump_cnt
) {
825 cxt
->pstore
.flags
|= PSTORE_FLAGS_DMESG
;
826 cxt
->pstore
.max_reason
= pdata
->max_reason
;
828 if (cxt
->console_size
)
829 cxt
->pstore
.flags
|= PSTORE_FLAGS_CONSOLE
;
830 if (cxt
->max_ftrace_cnt
)
831 cxt
->pstore
.flags
|= PSTORE_FLAGS_FTRACE
;
833 cxt
->pstore
.flags
|= PSTORE_FLAGS_PMSG
;
836 * Since bufsize is only used for dmesg crash dumps, it
837 * must match the size of the dprz record (after PRZ header
838 * and ECC bytes have been accounted for).
840 if (cxt
->pstore
.flags
& PSTORE_FLAGS_DMESG
) {
841 cxt
->pstore
.bufsize
= cxt
->dprzs
[0]->buffer_size
;
842 cxt
->pstore
.buf
= kvzalloc(cxt
->pstore
.bufsize
, GFP_KERNEL
);
843 if (!cxt
->pstore
.buf
) {
844 pr_err("cannot allocate pstore crash dump buffer\n");
850 err
= pstore_register(&cxt
->pstore
);
852 pr_err("registering with pstore failed\n");
857 * Update the module parameter variables as well so they are visible
858 * through /sys/module/ramoops/parameters/
860 mem_size
= pdata
->mem_size
;
861 mem_address
= pdata
->mem_address
;
862 record_size
= pdata
->record_size
;
863 ramoops_max_reason
= pdata
->max_reason
;
864 ramoops_console_size
= pdata
->console_size
;
865 ramoops_pmsg_size
= pdata
->pmsg_size
;
866 ramoops_ftrace_size
= pdata
->ftrace_size
;
868 pr_info("using 0x%lx@0x%llx, ecc: %d\n",
869 cxt
->size
, (unsigned long long)cxt
->phys_addr
,
870 cxt
->ecc_info
.ecc_size
);
875 kvfree(cxt
->pstore
.buf
);
877 cxt
->pstore
.bufsize
= 0;
879 ramoops_free_przs(cxt
);
884 static void ramoops_remove(struct platform_device
*pdev
)
886 struct ramoops_context
*cxt
= &oops_cxt
;
888 pstore_unregister(&cxt
->pstore
);
890 kvfree(cxt
->pstore
.buf
);
891 cxt
->pstore
.bufsize
= 0;
893 ramoops_free_przs(cxt
);
896 static const struct of_device_id dt_match
[] = {
897 { .compatible
= "ramoops" },
900 MODULE_DEVICE_TABLE(of
, dt_match
);
902 static struct platform_driver ramoops_driver
= {
903 .probe
= ramoops_probe
,
904 .remove
= ramoops_remove
,
907 .of_match_table
= dt_match
,
911 static inline void ramoops_unregister_dummy(void)
913 platform_device_unregister(dummy
);
917 static void __init
ramoops_register_dummy(void)
919 struct ramoops_platform_data pdata
;
925 if (reserve_mem_find_by_name(mem_name
, &start
, &size
)) {
932 * Prepare a dummy platform data structure to carry the module
933 * parameters. If mem_size isn't set, then there are no module
934 * parameters, and we can skip this.
939 pr_info("using module parameters\n");
941 memset(&pdata
, 0, sizeof(pdata
));
942 pdata
.mem_size
= mem_size
;
943 pdata
.mem_address
= mem_address
;
944 pdata
.mem_type
= mem_type
;
945 pdata
.record_size
= record_size
;
946 pdata
.console_size
= ramoops_console_size
;
947 pdata
.ftrace_size
= ramoops_ftrace_size
;
948 pdata
.pmsg_size
= ramoops_pmsg_size
;
949 /* If "max_reason" is set, its value has priority over "dump_oops". */
950 if (ramoops_max_reason
>= 0)
951 pdata
.max_reason
= ramoops_max_reason
;
952 /* Otherwise, if "dump_oops" is set, parse it into "max_reason". */
953 else if (ramoops_dump_oops
!= -1)
954 pdata
.max_reason
= ramoops_dump_oops
? KMSG_DUMP_OOPS
956 /* And if neither are explicitly set, use the default. */
958 pdata
.max_reason
= KMSG_DUMP_OOPS
;
959 pdata
.flags
= RAMOOPS_FLAG_FTRACE_PER_CPU
;
962 * For backwards compatibility ramoops.ecc=1 means 16 bytes ECC
963 * (using 1 byte for ECC isn't much of use anyway).
965 pdata
.ecc_info
.ecc_size
= ramoops_ecc
== 1 ? 16 : ramoops_ecc
;
967 dummy
= platform_device_register_data(NULL
, "ramoops", -1,
968 &pdata
, sizeof(pdata
));
970 pr_info("could not create platform device: %ld\n",
976 static int __init
ramoops_init(void)
980 ramoops_register_dummy();
981 ret
= platform_driver_register(&ramoops_driver
);
983 ramoops_unregister_dummy();
987 postcore_initcall(ramoops_init
);
989 static void __exit
ramoops_exit(void)
991 platform_driver_unregister(&ramoops_driver
);
992 ramoops_unregister_dummy();
994 module_exit(ramoops_exit
);
996 MODULE_LICENSE("GPL");
997 MODULE_AUTHOR("Marco Stornelli <marco.stornelli@gmail.com>");
998 MODULE_DESCRIPTION("RAM Oops/Panic logger/driver");