]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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__ */ |