1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com> 4*4882a593Smuzhiyun * Copyright (C) 2011 Kees Cook <keescook@chromium.org> 5*4882a593Smuzhiyun * Copyright (C) 2011 Google, Inc. 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef __LINUX_PSTORE_RAM_H__ 9*4882a593Smuzhiyun #define __LINUX_PSTORE_RAM_H__ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/compiler.h> 12*4882a593Smuzhiyun #include <linux/device.h> 13*4882a593Smuzhiyun #include <linux/init.h> 14*4882a593Smuzhiyun #include <linux/kernel.h> 15*4882a593Smuzhiyun #include <linux/list.h> 16*4882a593Smuzhiyun #include <linux/pstore.h> 17*4882a593Smuzhiyun #include <linux/types.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun /* 20*4882a593Smuzhiyun * Choose whether access to the RAM zone requires locking or not. If a zone 21*4882a593Smuzhiyun * can be written to from different CPUs like with ftrace for example, then 22*4882a593Smuzhiyun * PRZ_FLAG_NO_LOCK is used. For all other cases, locking is required. 23*4882a593Smuzhiyun */ 24*4882a593Smuzhiyun #define PRZ_FLAG_NO_LOCK BIT(0) 25*4882a593Smuzhiyun /* 26*4882a593Smuzhiyun * If a PRZ should only have a single-boot lifetime, this marks it as 27*4882a593Smuzhiyun * getting wiped after its contents get copied out after boot. 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun #define PRZ_FLAG_ZAP_OLD BIT(1) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct persistent_ram_buffer; 32*4882a593Smuzhiyun struct rs_control; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct persistent_ram_ecc_info { 35*4882a593Smuzhiyun int block_size; 36*4882a593Smuzhiyun int ecc_size; 37*4882a593Smuzhiyun int symsize; 38*4882a593Smuzhiyun int poly; 39*4882a593Smuzhiyun uint16_t *par; 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun /** 43*4882a593Smuzhiyun * struct persistent_ram_zone - Details of a persistent RAM zone (PRZ) 44*4882a593Smuzhiyun * used as a pstore backend 45*4882a593Smuzhiyun * 46*4882a593Smuzhiyun * @paddr: physical address of the mapped RAM area 47*4882a593Smuzhiyun * @size: size of mapping 48*4882a593Smuzhiyun * @label: unique name of this PRZ 49*4882a593Smuzhiyun * @type: frontend type for this PRZ 50*4882a593Smuzhiyun * @flags: holds PRZ_FLAGS_* bits 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun * @buffer_lock: 53*4882a593Smuzhiyun * locks access to @buffer "size" bytes and "start" offset 54*4882a593Smuzhiyun * @buffer: 55*4882a593Smuzhiyun * pointer to actual RAM area managed by this PRZ 56*4882a593Smuzhiyun * @buffer_size: 57*4882a593Smuzhiyun * bytes in @buffer->data (not including any trailing ECC bytes) 58*4882a593Smuzhiyun * 59*4882a593Smuzhiyun * @par_buffer: 60*4882a593Smuzhiyun * pointer into @buffer->data containing ECC bytes for @buffer->data 61*4882a593Smuzhiyun * @par_header: 62*4882a593Smuzhiyun * pointer into @buffer->data containing ECC bytes for @buffer header 63*4882a593Smuzhiyun * (i.e. all fields up to @data) 64*4882a593Smuzhiyun * @rs_decoder: 65*4882a593Smuzhiyun * RSLIB instance for doing ECC calculations 66*4882a593Smuzhiyun * @corrected_bytes: 67*4882a593Smuzhiyun * ECC corrected bytes accounting since boot 68*4882a593Smuzhiyun * @bad_blocks: 69*4882a593Smuzhiyun * ECC uncorrectable bytes accounting since boot 70*4882a593Smuzhiyun * @ecc_info: 71*4882a593Smuzhiyun * ECC configuration details 72*4882a593Smuzhiyun * 73*4882a593Smuzhiyun * @old_log: 74*4882a593Smuzhiyun * saved copy of @buffer->data prior to most recent wipe 75*4882a593Smuzhiyun * @old_log_size: 76*4882a593Smuzhiyun * bytes contained in @old_log 77*4882a593Smuzhiyun * 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun struct persistent_ram_zone { 80*4882a593Smuzhiyun phys_addr_t paddr; 81*4882a593Smuzhiyun size_t size; 82*4882a593Smuzhiyun void *vaddr; 83*4882a593Smuzhiyun char *label; 84*4882a593Smuzhiyun enum pstore_type_id type; 85*4882a593Smuzhiyun u32 flags; 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun raw_spinlock_t buffer_lock; 88*4882a593Smuzhiyun struct persistent_ram_buffer *buffer; 89*4882a593Smuzhiyun size_t buffer_size; 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun char *par_buffer; 92*4882a593Smuzhiyun char *par_header; 93*4882a593Smuzhiyun struct rs_control *rs_decoder; 94*4882a593Smuzhiyun int corrected_bytes; 95*4882a593Smuzhiyun int bad_blocks; 96*4882a593Smuzhiyun struct persistent_ram_ecc_info ecc_info; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun char *old_log; 99*4882a593Smuzhiyun size_t old_log_size; 100*4882a593Smuzhiyun }; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size, 103*4882a593Smuzhiyun u32 sig, struct persistent_ram_ecc_info *ecc_info, 104*4882a593Smuzhiyun unsigned int memtype, u32 flags, char *label); 105*4882a593Smuzhiyun void persistent_ram_free(struct persistent_ram_zone *prz); 106*4882a593Smuzhiyun void persistent_ram_zap(struct persistent_ram_zone *prz); 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun int persistent_ram_write(struct persistent_ram_zone *prz, const void *s, 109*4882a593Smuzhiyun unsigned int count); 110*4882a593Smuzhiyun int persistent_ram_write_user(struct persistent_ram_zone *prz, 111*4882a593Smuzhiyun const void __user *s, unsigned int count); 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun void persistent_ram_save_old(struct persistent_ram_zone *prz); 114*4882a593Smuzhiyun size_t persistent_ram_old_size(struct persistent_ram_zone *prz); 115*4882a593Smuzhiyun void *persistent_ram_old(struct persistent_ram_zone *prz); 116*4882a593Smuzhiyun void persistent_ram_free_old(struct persistent_ram_zone *prz); 117*4882a593Smuzhiyun ssize_t persistent_ram_ecc_string(struct persistent_ram_zone *prz, 118*4882a593Smuzhiyun char *str, size_t len); 119*4882a593Smuzhiyun #ifdef CONFIG_PSTORE_BOOT_LOG 120*4882a593Smuzhiyun ssize_t ramoops_pstore_read_for_boot_log(struct pstore_record *record); 121*4882a593Smuzhiyun #endif 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun /* 124*4882a593Smuzhiyun * Ramoops platform data 125*4882a593Smuzhiyun * @mem_size memory size for ramoops 126*4882a593Smuzhiyun * @mem_address physical memory address to contain ramoops 127*4882a593Smuzhiyun */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun #define RAMOOPS_FLAG_FTRACE_PER_CPU BIT(0) 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun struct ramoops_platform_data { 132*4882a593Smuzhiyun unsigned long mem_size; 133*4882a593Smuzhiyun phys_addr_t mem_address; 134*4882a593Smuzhiyun unsigned int mem_type; 135*4882a593Smuzhiyun unsigned long record_size; 136*4882a593Smuzhiyun unsigned long console_size; 137*4882a593Smuzhiyun unsigned long ftrace_size; 138*4882a593Smuzhiyun unsigned long pmsg_size; 139*4882a593Smuzhiyun #ifdef CONFIG_PSTORE_BOOT_LOG 140*4882a593Smuzhiyun unsigned long boot_log_size; 141*4882a593Smuzhiyun unsigned long max_boot_log_cnt; 142*4882a593Smuzhiyun #endif 143*4882a593Smuzhiyun int max_reason; 144*4882a593Smuzhiyun u32 flags; 145*4882a593Smuzhiyun struct persistent_ram_ecc_info ecc_info; 146*4882a593Smuzhiyun }; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #endif 149