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