summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/shared/include/nvram.h
blob: 3f6f77988ad5ab9ce76a3493b11dec56bb22c70d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
/*
 * PreP compliant NVRAM access
 *
 * This file can be found in motorla or IBP PPC site.
 *
 * $Id$
 */

#ifndef _PPC_NVRAM_H
#define _PPC_NVRAM_H

#define NVRAM_AS0  0x74
#define NVRAM_AS1  0x75
#define NVRAM_DATA 0x77


/* RTC Offsets */

#define MOTO_RTC_SECONDS	0x1FF9
#define MOTO_RTC_MINUTES	0x1FFA
#define MOTO_RTC_HOURS		0x1FFB
#define MOTO_RTC_DAY_OF_WEEK	0x1FFC
#define MOTO_RTC_DAY_OF_MONTH	0x1FFD
#define MOTO_RTC_MONTH		0x1FFE
#define MOTO_RTC_YEAR		0x1FFF
#define MOTO_RTC_CONTROLA       0x1FF8
#define MOTO_RTC_CONTROLB       0x1FF9

#ifndef BCD_TO_BIN
#define BCD_TO_BIN(val) ((val)=((val)&15) + ((val)>>4)*10)
#endif

#ifndef BIN_TO_BCD
#define BIN_TO_BCD(val) ((val)=(((val)/10)<<4) + (val)%10)
#endif

/* Structure map for NVRAM on PowerPC Reference Platform */
/* All fields are either character/byte strings which are valid either
  endian or they are big-endian numbers.

  There are a number of Date and Time fields which are in RTC format,
  big-endian. These are stored in UT (GMT).

  For enum's: if given in hex then they are bit significant, i.e. only
  one bit is on for each enum.
*/

#define NVSIZE 		4096	/* size of NVRAM */
#define OSAREASIZE 	512	/* size of OSArea space */
#define CONFSIZE 	1024	/* guess at size of Configuration space */

#ifndef ASM

typedef struct _SECURITY {
  unsigned long BootErrCnt;	    /* Count of boot password errors */
  unsigned long ConfigErrCnt;	    /* Count of config password errors */
  unsigned long BootErrorDT[2];	    /* Date&Time from RTC of last error in pw */
  unsigned long ConfigErrorDT[2];   /* Date&Time from RTC of last error in pw */
  unsigned long BootCorrectDT[2];   /* Date&Time from RTC of last correct pw */
  unsigned long ConfigCorrectDT[2]; /* Date&Time from RTC of last correct pw */
  unsigned long BootSetDT[2];	    /* Date&Time from RTC of last set of pw */
  unsigned long ConfigSetDT[2];	    /* Date&Time from RTC of last set of pw */
  unsigned char Serial[16];	    /* Box serial number */
} SECURITY;

typedef enum _OS_ID {
  Unknown 	= 0,
  Firmware 	= 1,
  AIX 		= 2,
  NT 		= 3,
  MKOS2 	= 4,
  MKAIX 	= 5,
  Taligent 	= 6,
  Solaris 	= 7,
  MK 		= 12
} OS_ID;

typedef struct _ERROR_LOG {
  unsigned char ErrorLogEntry[40]; /* To be architected */
} ERROR_LOG;

typedef enum _BOOT_STATUS {
  BootStarted 		= 0x01,
  BootFinished 		= 0x02,
  RestartStarted 	= 0x04,
  RestartFinished 	= 0x08,
  PowerFailStarted 	= 0x10,
  PowerFailFinished 	= 0x20,
  ProcessorReady 	= 0x40,
  ProcessorRunning 	= 0x80,
  ProcessorStart 	= 0x0100
} BOOT_STATUS;

typedef struct _RESTART_BLOCK {
  unsigned short 		Version;
  unsigned short 		Revision;
  unsigned long 		ResumeReserve1[2];
  volatile unsigned long	BootStatus;
  unsigned long 		CheckSum; 		/* Checksum of RESTART_BLOCK */
  void* 			RestartAddress;
  void* 			SaveAreaAddr;
  unsigned long 		SaveAreaLength;
} RESTART_BLOCK;

typedef enum _OSAREA_USAGE {
  Empty = 0,
  Used  = 1
} OSAREA_USAGE;

typedef enum _PM_MODE {
  Suspend = 0x80, /* Part of state is in memory */
  Normal  = 0x00  /* No power management in effect */
} PMMode;

typedef struct _HEADER {
  unsigned short 	Size;       /* NVRAM size in K(1024) */
  unsigned char 	Version;     /* Structure map different */
  unsigned char 	Revision;    /* Structure map the same -may
					be new values in old fields
					in other words old code still works */
  unsigned short 	Crc1;       /* check sum from beginning of nvram to OSArea */
  unsigned short 	Crc2;       /* check sum of config */
  unsigned char 	LastOS;     /* OS_ID */
  unsigned char 	Endian;     /* B if big endian, L if little endian */
  unsigned char 	OSAreaUsage;/* OSAREA_USAGE */
  unsigned char 	PMMode;     /* Shutdown mode */
  RESTART_BLOCK 	RestartBlock;
  SECURITY 		Security;
  ERROR_LOG 		ErrorLog[2];

  /* Global Environment information */
  void* 		GEAddress;
  unsigned long 	GELength;

  /* Date&Time from RTC of last change to Global Environment */
  unsigned long 	GELastWriteDT[2];

  /* Configuration information */
  void* 		ConfigAddress;
  unsigned long 	ConfigLength;

  /* Date&Time from RTC of last change to Configuration */
  unsigned long 	ConfigLastWriteDT[2];
  unsigned long 	ConfigCount; /* Count of entries in Configuration */

  /* OS dependent temp area */
  void* 		OSAreaAddress;
  unsigned long 	OSAreaLength;

  /* Date&Time from RTC of last change to OSAreaArea */
  unsigned long 	OSAreaLastWriteDT[2];
} HEADER;

/* Here is the whole map of the NVRAM */
typedef struct _NVRAM_MAP {
  HEADER 	Header;
  unsigned char GEArea[NVSIZE-CONFSIZE-OSAREASIZE-sizeof(HEADER)];
  unsigned char OSArea[OSAREASIZE];
  unsigned char ConfigArea[CONFSIZE];
} NVRAM_MAP;

/* Routines to manipulate the NVRAM */
void init_prep_nvram(void);
char *prep_nvram_get_var(const char *name);
char *prep_nvram_first_var(void);
char *prep_nvram_next_var(char *name);

#endif /* ASM */

#endif /* _PPC_NVRAM_H */