1 /* SPDX-License-Identifier: GPL-2.0 */ << 2 #ifndef _LINUX_NVRAM_H 1 #ifndef _LINUX_NVRAM_H 3 #define _LINUX_NVRAM_H 2 #define _LINUX_NVRAM_H 4 3 5 #include <linux/errno.h> !! 4 #include <linux/ioctl.h> 6 #include <uapi/linux/nvram.h> << 7 5 8 #ifdef CONFIG_PPC !! 6 /* /dev/nvram ioctls */ 9 #include <asm/machdep.h> !! 7 #define NVRAM_INIT _IO('p', 0x40) /* initialize NVRAM and set checksum */ >> 8 #define NVRAM_SETCKS _IO('p', 0x41) /* recalculate checksum */ >> 9 >> 10 /* for all current systems, this is where NVRAM starts */ >> 11 #define NVRAM_FIRST_BYTE 14 >> 12 /* all these functions expect an NVRAM offset, not an absolute */ >> 13 #define NVRAM_OFFSET(x) ((x)-NVRAM_FIRST_BYTE) >> 14 >> 15 #ifdef __KERNEL__ >> 16 /* __foo is foo without grabbing the rtc_lock - get it yourself */ >> 17 extern unsigned char __nvram_read_byte(int i); >> 18 extern unsigned char nvram_read_byte(int i); >> 19 extern void __nvram_write_byte(unsigned char c, int i); >> 20 extern void nvram_write_byte(unsigned char c, int i); >> 21 extern int __nvram_check_checksum(void); >> 22 extern int nvram_check_checksum(void); >> 23 extern void __nvram_set_checksum(void); >> 24 extern void nvram_set_checksum(void); 10 #endif 25 #endif 11 << 12 /** << 13 * struct nvram_ops - NVRAM functionality made << 14 * @read: validate checksum (if any) then load << 15 * @write: store a range of bytes to NVRAM the << 16 * @read_byte: load a single byte from NVRAM << 17 * @write_byte: store a single byte to NVRAM << 18 * @get_size: return the fixed number of bytes << 19 * << 20 * Architectures which provide an nvram ops st << 21 * of these methods. If the NVRAM hardware can << 22 * at a time then it may be sufficient to prov << 23 * If the NVRAM has a checksum (and it is to b << 24 * .write methods can be used to implement tha << 25 * << 26 * Portable drivers may use the wrapper functi << 27 * The nvram_read() and nvram_write() function << 28 * methods when available and fall back on the << 29 * methods otherwise. << 30 */ << 31 << 32 struct nvram_ops { << 33 ssize_t (*get_size)(void); << 34 unsigned char (*read_byte)(int); << 35 void (*write_byte)(unsigned << 36 ssize_t (*read)(char *, size_t << 37 ssize_t (*write)(char *, size_ << 38 #if defined(CONFIG_X86) || defined(CONFIG_M68K << 39 long (*initialize)(void); << 40 long (*set_checksum)(void); << 41 #endif << 42 }; << 43 << 44 extern const struct nvram_ops arch_nvram_ops; << 45 << 46 static inline ssize_t nvram_get_size(void) << 47 { << 48 #ifdef CONFIG_PPC << 49 if (ppc_md.nvram_size) << 50 return ppc_md.nvram_size(); << 51 #else << 52 if (arch_nvram_ops.get_size) << 53 return arch_nvram_ops.get_size << 54 #endif << 55 return -ENODEV; << 56 } << 57 << 58 static inline unsigned char nvram_read_byte(in << 59 { << 60 #ifdef CONFIG_PPC << 61 if (ppc_md.nvram_read_val) << 62 return ppc_md.nvram_read_val(a << 63 #else << 64 if (arch_nvram_ops.read_byte) << 65 return arch_nvram_ops.read_byt << 66 #endif << 67 return 0xFF; << 68 } << 69 << 70 static inline void nvram_write_byte(unsigned c << 71 { << 72 #ifdef CONFIG_PPC << 73 if (ppc_md.nvram_write_val) << 74 ppc_md.nvram_write_val(addr, v << 75 #else << 76 if (arch_nvram_ops.write_byte) << 77 arch_nvram_ops.write_byte(val, << 78 #endif << 79 } << 80 << 81 static inline ssize_t nvram_read_bytes(char *b << 82 { << 83 ssize_t nvram_size = nvram_get_size(); << 84 loff_t i; << 85 char *p = buf; << 86 << 87 if (nvram_size < 0) << 88 return nvram_size; << 89 for (i = *ppos; count > 0 && i < nvram << 90 *p = nvram_read_byte(i); << 91 *ppos = i; << 92 return p - buf; << 93 } << 94 << 95 static inline ssize_t nvram_write_bytes(char * << 96 { << 97 ssize_t nvram_size = nvram_get_size(); << 98 loff_t i; << 99 char *p = buf; << 100 << 101 if (nvram_size < 0) << 102 return nvram_size; << 103 for (i = *ppos; count > 0 && i < nvram << 104 nvram_write_byte(*p, i); << 105 *ppos = i; << 106 return p - buf; << 107 } << 108 << 109 static inline ssize_t nvram_read(char *buf, si << 110 { << 111 #ifdef CONFIG_PPC << 112 if (ppc_md.nvram_read) << 113 return ppc_md.nvram_read(buf, << 114 #else << 115 if (arch_nvram_ops.read) << 116 return arch_nvram_ops.read(buf << 117 #endif << 118 return nvram_read_bytes(buf, count, pp << 119 } << 120 << 121 static inline ssize_t nvram_write(char *buf, s << 122 { << 123 #ifdef CONFIG_PPC << 124 if (ppc_md.nvram_write) << 125 return ppc_md.nvram_write(buf, << 126 #else << 127 if (arch_nvram_ops.write) << 128 return arch_nvram_ops.write(bu << 129 #endif << 130 return nvram_write_bytes(buf, count, p << 131 } << 132 26 133 #endif /* _LINUX_NVRAM_H */ 27 #endif /* _LINUX_NVRAM_H */ 134 28
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.