nvram.c (c7fb577e2a6cb04732541f2dc402bd46747f7558) | nvram.c (866237eafc60637a2c9875167486f61d86892c6b) |
---|---|
1/* 2 * CMOS/NV-RAM driver for Linux 3 * 4 * Copyright (C) 1997 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> 5 * idea by and with help from Richard Jelinek <rj@suse.de> 6 * Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com) 7 * 8 * This driver allows you to access the contents of the non-volatile memory in --- 18 unchanged lines hidden (view full) --- 27 * the kernel and is not a module. Since the functions are used by some Atari 28 * drivers, this is the case on the Atari. 29 * 30 * 31 * 1.1 Cesar Barros: SMP locking fixes 32 * added changelog 33 * 1.2 Erik Gilling: Cobalt Networks support 34 * Tim Hockin: general cleanup, Cobalt support | 1/* 2 * CMOS/NV-RAM driver for Linux 3 * 4 * Copyright (C) 1997 Roman Hodek <Roman.Hodek@informatik.uni-erlangen.de> 5 * idea by and with help from Richard Jelinek <rj@suse.de> 6 * Portions copyright (c) 2001,2002 Sun Microsystems (thockin@sun.com) 7 * 8 * This driver allows you to access the contents of the non-volatile memory in --- 18 unchanged lines hidden (view full) --- 27 * the kernel and is not a module. Since the functions are used by some Atari 28 * drivers, this is the case on the Atari. 29 * 30 * 31 * 1.1 Cesar Barros: SMP locking fixes 32 * added changelog 33 * 1.2 Erik Gilling: Cobalt Networks support 34 * Tim Hockin: general cleanup, Cobalt support |
35 * 1.3 Jon Ringle: Comdial MP1000 support 36 * | |
37 */ 38 | 35 */ 36 |
39#define NVRAM_VERSION "1.3" | 37#define NVRAM_VERSION "1.2" |
40 41#include <linux/module.h> 42#include <linux/config.h> 43#include <linux/sched.h> 44#include <linux/smp_lock.h> 45#include <linux/nvram.h> 46 47#define PC 1 48#define ATARI 2 49#define COBALT 3 | 38 39#include <linux/module.h> 40#include <linux/config.h> 41#include <linux/sched.h> 42#include <linux/smp_lock.h> 43#include <linux/nvram.h> 44 45#define PC 1 46#define ATARI 2 47#define COBALT 3 |
50#define MP1000 4 | |
51 52/* select machine configuration */ 53#if defined(CONFIG_ATARI) 54# define MACH ATARI 55#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) /* and others?? */ 56#define MACH PC 57# if defined(CONFIG_COBALT) 58# include <linux/cobalt-nvram.h> 59# define MACH COBALT | 48 49/* select machine configuration */ 50#if defined(CONFIG_ATARI) 51# define MACH ATARI 52#elif defined(__i386__) || defined(__x86_64__) || defined(__arm__) /* and others?? */ 53#define MACH PC 54# if defined(CONFIG_COBALT) 55# include <linux/cobalt-nvram.h> 56# define MACH COBALT |
60# elif defined(CONFIG_MACH_MP1000) 61# undef MACH 62# define MACH MP1000 | |
63# else 64# define MACH PC 65# endif 66#else 67# error Cannot build nvram driver for this machine configuration. 68#endif 69 70#if MACH == PC --- 42 unchanged lines hidden (view full) --- 113#define ATARI_CKS_LOC 48 114 115#define mach_check_checksum atari_check_checksum 116#define mach_set_checksum atari_set_checksum 117#define mach_proc_infos atari_proc_infos 118 119#endif 120 | 57# else 58# define MACH PC 59# endif 60#else 61# error Cannot build nvram driver for this machine configuration. 62#endif 63 64#if MACH == PC --- 42 unchanged lines hidden (view full) --- 107#define ATARI_CKS_LOC 48 108 109#define mach_check_checksum atari_check_checksum 110#define mach_set_checksum atari_set_checksum 111#define mach_proc_infos atari_proc_infos 112 113#endif 114 |
121#if MACH == MP1000 122 123/* RTC in a MP1000 */ 124#define CHECK_DRIVER_INIT() 1 125 126#define MP1000_CKS_RANGE_START 0 127#define MP1000_CKS_RANGE_END 111 128#define MP1000_CKS_LOC 112 129 130#define NVRAM_BYTES (128-NVRAM_FIRST_BYTE) 131 132#define mach_check_checksum mp1000_check_checksum 133#define mach_set_checksum mp1000_set_checksum 134#define mach_proc_infos mp1000_proc_infos 135 136#endif 137 | |
138/* Note that *all* calls to CMOS_READ and CMOS_WRITE must be done with 139 * rtc_lock held. Due to the index-port/data-port design of the RTC, we 140 * don't want two different things trying to get to it at once. (e.g. the 141 * periodic 11 min sync from time.c vs. this driver.) 142 */ 143 144#include <linux/types.h> 145#include <linux/errno.h> --- 787 unchanged lines hidden (view full) --- 933 (vmode & 16 ? ", line doubling" : ", half screen") : ""); 934 935 return 1; 936} 937#endif 938 939#endif /* MACH == ATARI */ 940 | 115/* Note that *all* calls to CMOS_READ and CMOS_WRITE must be done with 116 * rtc_lock held. Due to the index-port/data-port design of the RTC, we 117 * don't want two different things trying to get to it at once. (e.g. the 118 * periodic 11 min sync from time.c vs. this driver.) 119 */ 120 121#include <linux/types.h> 122#include <linux/errno.h> --- 787 unchanged lines hidden (view full) --- 910 (vmode & 16 ? ", line doubling" : ", half screen") : ""); 911 912 return 1; 913} 914#endif 915 916#endif /* MACH == ATARI */ 917 |
941#if MACH == MP1000 942 943static int 944mp1000_check_checksum(void) 945{ 946 int i; 947 unsigned short sum = 0; 948 unsigned short expect; 949 950 for (i = MP1000_CKS_RANGE_START; i <= MP1000_CKS_RANGE_END; ++i) 951 sum += __nvram_read_byte(i); 952 953 expect = __nvram_read_byte(MP1000_CKS_LOC+1)<<8 | 954 __nvram_read_byte(MP1000_CKS_LOC); 955 return ((sum & 0xffff) == expect); 956} 957 958static void 959mp1000_set_checksum(void) 960{ 961 int i; 962 unsigned short sum = 0; 963 964 for (i = MP1000_CKS_RANGE_START; i <= MP1000_CKS_RANGE_END; ++i) 965 sum += __nvram_read_byte(i); 966 __nvram_write_byte(sum >> 8, MP1000_CKS_LOC + 1); 967 __nvram_write_byte(sum & 0xff, MP1000_CKS_LOC); 968} 969 970#ifdef CONFIG_PROC_FS 971 972#define SERVER_N_LEN 32 973#define PATH_N_LEN 32 974#define FILE_N_LEN 32 975#define NVRAM_MAGIC_SIG 0xdead 976 977typedef struct NvRamImage 978{ 979 unsigned short int magic; 980 unsigned short int mode; 981 char fname[FILE_N_LEN]; 982 char path[PATH_N_LEN]; 983 char server[SERVER_N_LEN]; 984 char pad[12]; 985} NvRam; 986 987static int 988mp1000_proc_infos(unsigned char *nvram, char *buffer, int *len, 989 off_t *begin, off_t offset, int size) 990{ 991 int checksum; 992 NvRam* nv = (NvRam*)nvram; 993 994 spin_lock_irq(&rtc_lock); 995 checksum = __nvram_check_checksum(); 996 spin_unlock_irq(&rtc_lock); 997 998 PRINT_PROC("Checksum status: %svalid\n", checksum ? "" : "not "); 999 1000 switch( nv->mode ) 1001 { 1002 case 0 : 1003 PRINT_PROC( "\tMode 0, tftp prompt\n" ); 1004 break; 1005 case 1 : 1006 PRINT_PROC( "\tMode 1, booting from disk\n" ); 1007 break; 1008 case 2 : 1009 PRINT_PROC( "\tMode 2, Alternate boot from disk /boot/%s\n", nv->fname ); 1010 break; 1011 case 3 : 1012 PRINT_PROC( "\tMode 3, Booting from net:\n" ); 1013 PRINT_PROC( "\t\t%s:%s%s\n",nv->server, nv->path, nv->fname ); 1014 break; 1015 default: 1016 PRINT_PROC( "\tInconsistant nvram?\n" ); 1017 break; 1018 } 1019 1020 return 1; 1021} 1022#endif 1023 1024#endif /* MACH == MP1000 */ 1025 | |
1026MODULE_LICENSE("GPL"); 1027 1028EXPORT_SYMBOL(__nvram_read_byte); 1029EXPORT_SYMBOL(nvram_read_byte); 1030EXPORT_SYMBOL(__nvram_write_byte); 1031EXPORT_SYMBOL(nvram_write_byte); 1032EXPORT_SYMBOL(__nvram_check_checksum); 1033EXPORT_SYMBOL(nvram_check_checksum); 1034MODULE_ALIAS_MISCDEV(NVRAM_MINOR); | 918MODULE_LICENSE("GPL"); 919 920EXPORT_SYMBOL(__nvram_read_byte); 921EXPORT_SYMBOL(nvram_read_byte); 922EXPORT_SYMBOL(__nvram_write_byte); 923EXPORT_SYMBOL(nvram_write_byte); 924EXPORT_SYMBOL(__nvram_check_checksum); 925EXPORT_SYMBOL(nvram_check_checksum); 926MODULE_ALIAS_MISCDEV(NVRAM_MINOR); |