| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * PreP compliant NVRAM access | 
|  | 3 | */ | 
|  | 4 |  | 
|  | 5 | /* Corey Minyard (minyard@acm.org) - Stolen from PReP book.   Per the | 
|  | 6 | license I must say: | 
|  | 7 | (C) Copyright (Corey Minyard), (1998).  All rights reserved | 
|  | 8 | */ | 
|  | 9 |  | 
|  | 10 | /* Structure map for NVRAM on PowerPC Reference Platform */ | 
|  | 11 | /* All fields are either character/byte strings which are valid either | 
|  | 12 | endian or they are big-endian numbers. | 
|  | 13 |  | 
|  | 14 | There are a number of Date and Time fields which are in RTC format, | 
|  | 15 | big-endian. These are stored in UT (GMT). | 
|  | 16 |  | 
|  | 17 | For enum's: if given in hex then they are bit significant, i.e. only | 
|  | 18 | one bit is on for each enum. | 
|  | 19 | */ | 
|  | 20 | #ifdef __KERNEL__ | 
|  | 21 | #ifndef _PPC_PREP_NVRAM_H | 
|  | 22 | #define _PPC_PREP_NVRAM_H | 
|  | 23 |  | 
|  | 24 | #define MAX_PREP_NVRAM 0x8000 | 
|  | 25 | #define PREP_NVRAM_AS0	0x74 | 
|  | 26 | #define PREP_NVRAM_AS1	0x75 | 
|  | 27 | #define PREP_NVRAM_DATA	0x77 | 
|  | 28 |  | 
|  | 29 | #define NVSIZE 4096	/* size of NVRAM */ | 
|  | 30 | #define OSAREASIZE 512	/* size of OSArea space */ | 
|  | 31 | #define CONFSIZE 1024	/* guess at size of Configuration space */ | 
|  | 32 |  | 
|  | 33 | typedef struct _SECURITY { | 
|  | 34 | unsigned long BootErrCnt;	    /* Count of boot password errors */ | 
|  | 35 | unsigned long ConfigErrCnt;	    /* Count of config password errors */ | 
|  | 36 | unsigned long BootErrorDT[2];	    /* Date&Time from RTC of last error in pw */ | 
|  | 37 | unsigned long ConfigErrorDT[2];   /* Date&Time from RTC of last error in pw */ | 
|  | 38 | unsigned long BootCorrectDT[2];   /* Date&Time from RTC of last correct pw */ | 
|  | 39 | unsigned long ConfigCorrectDT[2]; /* Date&Time from RTC of last correct pw */ | 
|  | 40 | unsigned long BootSetDT[2];	    /* Date&Time from RTC of last set of pw */ | 
|  | 41 | unsigned long ConfigSetDT[2];	    /* Date&Time from RTC of last set of pw */ | 
|  | 42 | unsigned char Serial[16];	    /* Box serial number */ | 
|  | 43 | } SECURITY; | 
|  | 44 |  | 
|  | 45 | typedef enum _OS_ID { | 
|  | 46 | Unknown = 0, | 
|  | 47 | Firmware = 1, | 
|  | 48 | AIX = 2, | 
|  | 49 | NT = 3, | 
|  | 50 | MKOS2 = 4, | 
|  | 51 | MKAIX = 5, | 
|  | 52 | Taligent = 6, | 
|  | 53 | Solaris = 7, | 
|  | 54 | MK = 12 | 
|  | 55 | } OS_ID; | 
|  | 56 |  | 
|  | 57 | typedef struct _ERROR_LOG { | 
|  | 58 | unsigned char ErrorLogEntry[40]; /* To be architected */ | 
|  | 59 | } ERROR_LOG; | 
|  | 60 |  | 
|  | 61 | typedef enum _BOOT_STATUS { | 
|  | 62 | BootStarted = 0x01, | 
|  | 63 | BootFinished = 0x02, | 
|  | 64 | RestartStarted = 0x04, | 
|  | 65 | RestartFinished = 0x08, | 
|  | 66 | PowerFailStarted = 0x10, | 
|  | 67 | PowerFailFinished = 0x20, | 
|  | 68 | ProcessorReady = 0x40, | 
|  | 69 | ProcessorRunning = 0x80, | 
|  | 70 | ProcessorStart = 0x0100 | 
|  | 71 | } BOOT_STATUS; | 
|  | 72 |  | 
|  | 73 | typedef struct _RESTART_BLOCK { | 
|  | 74 | unsigned short Version; | 
|  | 75 | unsigned short Revision; | 
|  | 76 | unsigned long ResumeReserve1[2]; | 
|  | 77 | volatile unsigned long BootStatus; | 
|  | 78 | unsigned long CheckSum; /* Checksum of RESTART_BLOCK */ | 
|  | 79 | void * RestartAddress; | 
|  | 80 | void * SaveAreaAddr; | 
|  | 81 | unsigned long SaveAreaLength; | 
|  | 82 | } RESTART_BLOCK; | 
|  | 83 |  | 
|  | 84 | typedef enum _OSAREA_USAGE { | 
|  | 85 | Empty = 0, | 
|  | 86 | Used = 1 | 
|  | 87 | } OSAREA_USAGE; | 
|  | 88 |  | 
|  | 89 | typedef enum _PM_MODE { | 
|  | 90 | Suspend = 0x80, /* Part of state is in memory */ | 
|  | 91 | Normal = 0x00   /* No power management in effect */ | 
|  | 92 | } PMMODE; | 
|  | 93 |  | 
|  | 94 | typedef struct _HEADER { | 
|  | 95 | unsigned short Size;       /* NVRAM size in K(1024) */ | 
|  | 96 | unsigned char Version;     /* Structure map different */ | 
|  | 97 | unsigned char Revision;    /* Structure map the same -may | 
|  | 98 | be new values in old fields | 
|  | 99 | in other words old code still works */ | 
|  | 100 | unsigned short Crc1;       /* check sum from beginning of nvram to OSArea */ | 
|  | 101 | unsigned short Crc2;       /* check sum of config */ | 
|  | 102 | unsigned char LastOS;      /* OS_ID */ | 
|  | 103 | unsigned char Endian;      /* B if big endian, L if little endian */ | 
|  | 104 | unsigned char OSAreaUsage; /* OSAREA_USAGE */ | 
|  | 105 | unsigned char PMMode;      /* Shutdown mode */ | 
|  | 106 | RESTART_BLOCK RestartBlock; | 
|  | 107 | SECURITY Security; | 
|  | 108 | ERROR_LOG ErrorLog[2]; | 
|  | 109 |  | 
|  | 110 | /* Global Environment information */ | 
|  | 111 | void * GEAddress; | 
|  | 112 | unsigned long GELength; | 
|  | 113 |  | 
|  | 114 | /* Date&Time from RTC of last change to Global Environment */ | 
|  | 115 | unsigned long GELastWriteDT[2]; | 
|  | 116 |  | 
|  | 117 | /* Configuration information */ | 
|  | 118 | void * ConfigAddress; | 
|  | 119 | unsigned long ConfigLength; | 
|  | 120 |  | 
|  | 121 | /* Date&Time from RTC of last change to Configuration */ | 
|  | 122 | unsigned long ConfigLastWriteDT[2]; | 
|  | 123 | unsigned long ConfigCount; /* Count of entries in Configuration */ | 
|  | 124 |  | 
|  | 125 | /* OS dependent temp area */ | 
|  | 126 | void * OSAreaAddress; | 
|  | 127 | unsigned long OSAreaLength; | 
|  | 128 |  | 
|  | 129 | /* Date&Time from RTC of last change to OSAreaArea */ | 
|  | 130 | unsigned long OSAreaLastWriteDT[2]; | 
|  | 131 | } HEADER; | 
|  | 132 |  | 
|  | 133 | /* Here is the whole map of the NVRAM */ | 
|  | 134 | typedef struct _NVRAM_MAP { | 
|  | 135 | HEADER Header; | 
|  | 136 | unsigned char GEArea[NVSIZE-CONFSIZE-OSAREASIZE-sizeof(HEADER)]; | 
|  | 137 | unsigned char OSArea[OSAREASIZE]; | 
|  | 138 | unsigned char ConfigArea[CONFSIZE]; | 
|  | 139 | } NVRAM_MAP; | 
|  | 140 |  | 
|  | 141 | /* Routines to manipulate the NVRAM */ | 
|  | 142 | void init_prep_nvram(void); | 
|  | 143 | char *prep_nvram_get_var(const char *name); | 
|  | 144 | char *prep_nvram_first_var(void); | 
|  | 145 | char *prep_nvram_next_var(char *name); | 
|  | 146 |  | 
|  | 147 | /* Routines to read and write directly to the NVRAM */ | 
|  | 148 | unsigned char prep_nvram_read_val(int addr); | 
|  | 149 | void prep_nvram_write_val(int           addr, | 
|  | 150 | unsigned char val); | 
|  | 151 |  | 
|  | 152 | #endif /* _PPC_PREP_NVRAM_H */ | 
|  | 153 | #endif /* __KERNEL__ */ |