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