Blame view
include/linux/nvram.h
3.47 KB
b24413180 License cleanup: ... |
1 |
/* SPDX-License-Identifier: GPL-2.0 */ |
1da177e4c Linux-2.6.12-rc2 |
2 3 |
#ifndef _LINUX_NVRAM_H #define _LINUX_NVRAM_H |
1278cf66c nvram: Replace nv... |
4 |
#include <linux/errno.h> |
607ca46e9 UAPI: (Scripted) ... |
5 |
#include <uapi/linux/nvram.h> |
1da177e4c Linux-2.6.12-rc2 |
6 |
|
f9c3a570f powerpc: Enable H... |
7 8 9 |
#ifdef CONFIG_PPC #include <asm/machdep.h> #endif |
d5bbb5021 char/nvram: Adopt... |
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
/** * struct nvram_ops - NVRAM functionality made available to drivers * @read: validate checksum (if any) then load a range of bytes from NVRAM * @write: store a range of bytes to NVRAM then update checksum (if any) * @read_byte: load a single byte from NVRAM * @write_byte: store a single byte to NVRAM * @get_size: return the fixed number of bytes in the NVRAM * * Architectures which provide an nvram ops struct need not implement all * of these methods. If the NVRAM hardware can be accessed only one byte * at a time then it may be sufficient to provide .read_byte and .write_byte. * If the NVRAM has a checksum (and it is to be checked) the .read and * .write methods can be used to implement that efficiently. * * Portable drivers may use the wrapper functions defined here. * The nvram_read() and nvram_write() functions call the .read and .write * methods when available and fall back on the .read_byte and .write_byte * methods otherwise. */ |
a084dbf65 m68k/atari: Imple... |
29 30 |
struct nvram_ops { ssize_t (*get_size)(void); |
d5bbb5021 char/nvram: Adopt... |
31 32 |
unsigned char (*read_byte)(int); void (*write_byte)(unsigned char, int); |
a084dbf65 m68k/atari: Imple... |
33 34 |
ssize_t (*read)(char *, size_t, loff_t *); ssize_t (*write)(char *, size_t, loff_t *); |
95ac14b8a powerpc: Implemen... |
35 |
#if defined(CONFIG_X86) || defined(CONFIG_M68K) |
2d58636e0 char/nvram: Allow... |
36 37 |
long (*initialize)(void); long (*set_checksum)(void); |
95ac14b8a powerpc: Implemen... |
38 |
#endif |
a084dbf65 m68k/atari: Imple... |
39 40 41 |
}; extern const struct nvram_ops arch_nvram_ops; |
1278cf66c nvram: Replace nv... |
42 43 |
static inline ssize_t nvram_get_size(void) { |
a156c7ba6 powerpc: Replace ... |
44 |
#ifdef CONFIG_PPC |
f9c3a570f powerpc: Enable H... |
45 46 |
if (ppc_md.nvram_size) return ppc_md.nvram_size(); |
a156c7ba6 powerpc: Replace ... |
47 |
#else |
a084dbf65 m68k/atari: Imple... |
48 49 |
if (arch_nvram_ops.get_size) return arch_nvram_ops.get_size(); |
a156c7ba6 powerpc: Replace ... |
50 |
#endif |
1278cf66c nvram: Replace nv... |
51 52 53 54 55 |
return -ENODEV; } static inline unsigned char nvram_read_byte(int addr) { |
d5bbb5021 char/nvram: Adopt... |
56 |
#ifdef CONFIG_PPC |
f9c3a570f powerpc: Enable H... |
57 58 |
if (ppc_md.nvram_read_val) return ppc_md.nvram_read_val(addr); |
d5bbb5021 char/nvram: Adopt... |
59 60 61 62 |
#else if (arch_nvram_ops.read_byte) return arch_nvram_ops.read_byte(addr); #endif |
1278cf66c nvram: Replace nv... |
63 64 65 66 67 |
return 0xFF; } static inline void nvram_write_byte(unsigned char val, int addr) { |
d5bbb5021 char/nvram: Adopt... |
68 |
#ifdef CONFIG_PPC |
f9c3a570f powerpc: Enable H... |
69 70 |
if (ppc_md.nvram_write_val) ppc_md.nvram_write_val(addr, val); |
d5bbb5021 char/nvram: Adopt... |
71 72 73 74 |
#else if (arch_nvram_ops.write_byte) arch_nvram_ops.write_byte(val, addr); #endif |
1278cf66c nvram: Replace nv... |
75 |
} |
109b3a89a char/nvram: Imple... |
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
static inline ssize_t nvram_read_bytes(char *buf, size_t count, loff_t *ppos) { ssize_t nvram_size = nvram_get_size(); loff_t i; char *p = buf; if (nvram_size < 0) return nvram_size; for (i = *ppos; count > 0 && i < nvram_size; ++i, ++p, --count) *p = nvram_read_byte(i); *ppos = i; return p - buf; } static inline ssize_t nvram_write_bytes(char *buf, size_t count, loff_t *ppos) { ssize_t nvram_size = nvram_get_size(); loff_t i; char *p = buf; if (nvram_size < 0) return nvram_size; for (i = *ppos; count > 0 && i < nvram_size; ++i, ++p, --count) nvram_write_byte(*p, i); *ppos = i; return p - buf; } |
1278cf66c nvram: Replace nv... |
103 104 |
static inline ssize_t nvram_read(char *buf, size_t count, loff_t *ppos) { |
f9c3a570f powerpc: Enable H... |
105 106 107 108 |
#ifdef CONFIG_PPC if (ppc_md.nvram_read) return ppc_md.nvram_read(buf, count, ppos); #else |
a084dbf65 m68k/atari: Imple... |
109 110 |
if (arch_nvram_ops.read) return arch_nvram_ops.read(buf, count, ppos); |
f9c3a570f powerpc: Enable H... |
111 |
#endif |
109b3a89a char/nvram: Imple... |
112 |
return nvram_read_bytes(buf, count, ppos); |
1278cf66c nvram: Replace nv... |
113 114 115 116 |
} static inline ssize_t nvram_write(char *buf, size_t count, loff_t *ppos) { |
f9c3a570f powerpc: Enable H... |
117 118 119 120 |
#ifdef CONFIG_PPC if (ppc_md.nvram_write) return ppc_md.nvram_write(buf, count, ppos); #else |
a084dbf65 m68k/atari: Imple... |
121 122 |
if (arch_nvram_ops.write) return arch_nvram_ops.write(buf, count, ppos); |
f9c3a570f powerpc: Enable H... |
123 |
#endif |
109b3a89a char/nvram: Imple... |
124 |
return nvram_write_bytes(buf, count, ppos); |
1278cf66c nvram: Replace nv... |
125 |
} |
1da177e4c Linux-2.6.12-rc2 |
126 |
#endif /* _LINUX_NVRAM_H */ |