mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 11:19:37 +00:00
![Thomas Gleixner](/assets/img/avatar_default.png)
Based on 1 normalized pattern(s): this software is licensed under the terms of the gnu general public license version 2 as published by the free software foundation and may be copied distributed and modified under those terms this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details extracted by the scancode license scanner the SPDX license identifier GPL-2.0-only has been chosen to replace the boilerplate/reference in 285 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexios Zavras <alexios.zavras@intel.com> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190529141900.642774971@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
141 lines
3.8 KiB
C
141 lines
3.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2010 Marco Stornelli <marco.stornelli@gmail.com>
|
|
* Copyright (C) 2011 Kees Cook <keescook@chromium.org>
|
|
* Copyright (C) 2011 Google, Inc.
|
|
*/
|
|
|
|
#ifndef __LINUX_PSTORE_RAM_H__
|
|
#define __LINUX_PSTORE_RAM_H__
|
|
|
|
#include <linux/compiler.h>
|
|
#include <linux/device.h>
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/list.h>
|
|
#include <linux/pstore.h>
|
|
#include <linux/types.h>
|
|
|
|
/*
|
|
* Choose whether access to the RAM zone requires locking or not. If a zone
|
|
* can be written to from different CPUs like with ftrace for example, then
|
|
* PRZ_FLAG_NO_LOCK is used. For all other cases, locking is required.
|
|
*/
|
|
#define PRZ_FLAG_NO_LOCK BIT(0)
|
|
/*
|
|
* If a PRZ should only have a single-boot lifetime, this marks it as
|
|
* getting wiped after its contents get copied out after boot.
|
|
*/
|
|
#define PRZ_FLAG_ZAP_OLD BIT(1)
|
|
|
|
struct persistent_ram_buffer;
|
|
struct rs_control;
|
|
|
|
struct persistent_ram_ecc_info {
|
|
int block_size;
|
|
int ecc_size;
|
|
int symsize;
|
|
int poly;
|
|
uint16_t *par;
|
|
};
|
|
|
|
/**
|
|
* struct persistent_ram_zone - Details of a persistent RAM zone (PRZ)
|
|
* used as a pstore backend
|
|
*
|
|
* @paddr: physical address of the mapped RAM area
|
|
* @size: size of mapping
|
|
* @label: unique name of this PRZ
|
|
* @type: frontend type for this PRZ
|
|
* @flags: holds PRZ_FLAGS_* bits
|
|
*
|
|
* @buffer_lock:
|
|
* locks access to @buffer "size" bytes and "start" offset
|
|
* @buffer:
|
|
* pointer to actual RAM area managed by this PRZ
|
|
* @buffer_size:
|
|
* bytes in @buffer->data (not including any trailing ECC bytes)
|
|
*
|
|
* @par_buffer:
|
|
* pointer into @buffer->data containing ECC bytes for @buffer->data
|
|
* @par_header:
|
|
* pointer into @buffer->data containing ECC bytes for @buffer header
|
|
* (i.e. all fields up to @data)
|
|
* @rs_decoder:
|
|
* RSLIB instance for doing ECC calculations
|
|
* @corrected_bytes:
|
|
* ECC corrected bytes accounting since boot
|
|
* @bad_blocks:
|
|
* ECC uncorrectable bytes accounting since boot
|
|
* @ecc_info:
|
|
* ECC configuration details
|
|
*
|
|
* @old_log:
|
|
* saved copy of @buffer->data prior to most recent wipe
|
|
* @old_log_size:
|
|
* bytes contained in @old_log
|
|
*
|
|
*/
|
|
struct persistent_ram_zone {
|
|
phys_addr_t paddr;
|
|
size_t size;
|
|
void *vaddr;
|
|
char *label;
|
|
enum pstore_type_id type;
|
|
u32 flags;
|
|
|
|
raw_spinlock_t buffer_lock;
|
|
struct persistent_ram_buffer *buffer;
|
|
size_t buffer_size;
|
|
|
|
char *par_buffer;
|
|
char *par_header;
|
|
struct rs_control *rs_decoder;
|
|
int corrected_bytes;
|
|
int bad_blocks;
|
|
struct persistent_ram_ecc_info ecc_info;
|
|
|
|
char *old_log;
|
|
size_t old_log_size;
|
|
};
|
|
|
|
struct persistent_ram_zone *persistent_ram_new(phys_addr_t start, size_t size,
|
|
u32 sig, struct persistent_ram_ecc_info *ecc_info,
|
|
unsigned int memtype, u32 flags, char *label);
|
|
void persistent_ram_free(struct persistent_ram_zone *prz);
|
|
void persistent_ram_zap(struct persistent_ram_zone *prz);
|
|
|
|
int persistent_ram_write(struct persistent_ram_zone *prz, const void *s,
|
|
unsigned int count);
|
|
int persistent_ram_write_user(struct persistent_ram_zone *prz,
|
|
const void __user *s, unsigned int count);
|
|
|
|
void persistent_ram_save_old(struct persistent_ram_zone *prz);
|
|
size_t persistent_ram_old_size(struct persistent_ram_zone *prz);
|
|
void *persistent_ram_old(struct persistent_ram_zone *prz);
|
|
void persistent_ram_free_old(struct persistent_ram_zone *prz);
|
|
ssize_t persistent_ram_ecc_string(struct persistent_ram_zone *prz,
|
|
char *str, size_t len);
|
|
|
|
/*
|
|
* Ramoops platform data
|
|
* @mem_size memory size for ramoops
|
|
* @mem_address physical memory address to contain ramoops
|
|
*/
|
|
|
|
#define RAMOOPS_FLAG_FTRACE_PER_CPU BIT(0)
|
|
|
|
struct ramoops_platform_data {
|
|
unsigned long mem_size;
|
|
phys_addr_t mem_address;
|
|
unsigned int mem_type;
|
|
unsigned long record_size;
|
|
unsigned long console_size;
|
|
unsigned long ftrace_size;
|
|
unsigned long pmsg_size;
|
|
int dump_oops;
|
|
u32 flags;
|
|
struct persistent_ram_ecc_info ecc_info;
|
|
};
|
|
|
|
#endif
|