summaryrefslogtreecommitdiff
path: root/include/asm-ppc/prep_nvram.h
blob: 6dbc36a84df23215b80e1907638f0cae1f021fbd (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
/*
 * PreP compliant NVRAM access
 */

/* Corey Minyard (minyard@acm.org) - Stolen from PReP book.   Per the
   license I must say:
     (C) Copyright (Corey Minyard), (1998).  All rights reserved
 */

/* 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.
*/
#ifdef __KERNEL__
#ifndef _PPC_PREP_NVRAM_H
#define _PPC_PREP_NVRAM_H

#define MAX_PREP_NVRAM 0x8000
#define PREP_NVRAM_AS0	0x74
#define PREP_NVRAM_AS1	0x75
#define PREP_NVRAM_DATA	0x77

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

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);

/* Routines to read and write directly to the NVRAM */
unsigned char prep_nvram_read_val(int addr);
void prep_nvram_write_val(int           addr,
			  unsigned char val);

#endif /* _PPC_PREP_NVRAM_H */
#endif /* __KERNEL__ */