1 /* 7/18/95                                                                    */
2 /*----------------------------------------------------------------------------*/
3 /*      Residual Data header definitions and prototypes                       */
4 /*----------------------------------------------------------------------------*/
5 
6 /* Structure map for RESIDUAL on PowerPC Reference Platform                   */
7 /* residual.h - Residual data structure passed in r3.                         */
8 /*              Load point passed in r4 to boot image.                        */
9 /* For enum's: if given in hex then they are bit significant,                 */
10 /*             i.e. only one bit is on for each enum                          */
11 /* Reserved fields must be filled with zeros.                                */
12 
13 #ifdef __KERNEL__
14 #ifndef _RESIDUAL_
15 #define _RESIDUAL_
16 
17 #ifndef __ASSEMBLY__
18 
19 #define MAX_CPUS 32                     /* These should be set to the maximum */
20 #define MAX_MEMS 64                     /* number possible for this system.   */
21 #define MAX_DEVICES 256                 /* Changing these will change the     */
22 #define AVE_PNP_SIZE 32                 /* structure, hence the version of    */
23 #define MAX_MEM_SEGS 64                 /* this header file.                  */
24 
25 /*----------------------------------------------------------------------------*/
26 /*               Public structures...                                         */
27 /*----------------------------------------------------------------------------*/
28 
29 #include <asm/pnp.h>
30 
31 typedef enum _L1CACHE_TYPE {
32   NoneCAC = 0,
33   SplitCAC = 1,
34   CombinedCAC = 2
35   } L1CACHE_TYPE;
36 
37 typedef enum _TLB_TYPE {
38   NoneTLB = 0,
39   SplitTLB = 1,
40   CombinedTLB = 2
41   } TLB_TYPE;
42 
43 typedef enum _FIRMWARE_SUPPORT {
44   Conventional = 0x01,
45   OpenFirmware = 0x02,
46   Diagnostics = 0x04,
47   LowDebug = 0x08,
48   Multiboot = 0x10,
49   LowClient = 0x20,
50   Hex41 = 0x40,
51   FAT = 0x80,
52   ISO9660 = 0x0100,
53   SCSI_InitiatorID_Override = 0x0200,
54   Tape_Boot = 0x0400,
55   FW_Boot_Path = 0x0800
56   } FIRMWARE_SUPPORT;
57 
58 typedef enum _FIRMWARE_SUPPLIERS {
59   IBMFirmware = 0x00,
60   MotoFirmware = 0x01,                  /* 7/18/95                            */
61   FirmWorks = 0x02,                     /* 10/5/95                            */
62   Bull = 0x03,                          /* 04/03/96                           */
63   } FIRMWARE_SUPPLIERS;
64 
65 typedef enum _ENDIAN_SWITCH_METHODS {
66   UsePort92 = 0x01,
67   UsePCIConfigA8 = 0x02,
68   UseFF001030 = 0x03,
69   } ENDIAN_SWITCH_METHODS;
70 
71 typedef enum _SPREAD_IO_METHODS {
72   UsePort850 = 0x00,
73 /*UsePCIConfigA8 = 0x02,*/
74   } SPREAD_IO_METHODS;
75 
76 typedef struct _VPD {
77 
78   /* Box dependent stuff */
79   unsigned char PrintableModel[32];     /* Null terminated string.
80                                            Must be of the form:
81                                            vvv,<20h>,<model designation>,<0x0>
82                                            where vvv is the vendor ID
83                                            e.g. IBM PPS MODEL 6015<0x0>       */
84   unsigned char Serial[16];             /* 12/94:
85                                            Serial Number; must be of the form:
86                                            vvv<serial number> where vvv is the
87                                            vendor ID.
88                                            e.g. IBM60151234567<20h><20h>      */
89   unsigned char Reserved[48];
90   unsigned long FirmwareSupplier;       /* See FirmwareSuppliers enum         */
91   unsigned long FirmwareSupports;       /* See FirmwareSupport enum           */
92   unsigned long NvramSize;              /* Size of nvram in bytes             */
93   unsigned long NumSIMMSlots;
94   unsigned short EndianSwitchMethod;    /* See EndianSwitchMethods enum       */
95   unsigned short SpreadIOMethod;        /* See SpreadIOMethods enum           */
96   unsigned long SmpIar;
97   unsigned long RAMErrLogOffset;        /* Heap offset to error log           */
98   unsigned long Reserved5;
99   unsigned long Reserved6;
100   unsigned long ProcessorHz;            /* Processor clock frequency in Hertz */
101   unsigned long ProcessorBusHz;         /* Processor bus clock frequency      */
102   unsigned long Reserved7;
103   unsigned long TimeBaseDivisor;        /* (Bus clocks per timebase tic)*1000 */
104   unsigned long WordWidth;              /* Word width in bits                 */
105   unsigned long PageSize;               /* Page size in bytes                 */
106   unsigned long CoherenceBlockSize;     /* Unit of transfer in/out of cache
107                                            for which coherency is maintained;
108                                            normally <= CacheLineSize.         */
109   unsigned long GranuleSize;            /* Unit of lock allocation to avoid   */
110                                         /*   false sharing of locks.          */
111 
112   /* L1 Cache variables */
113   unsigned long CacheSize;              /* L1 Cache size in KB. This is the   */
114                                         /*   total size of the L1, whether    */
115                                         /*   combined or split                */
116   unsigned long CacheAttrib;            /* L1CACHE_TYPE                       */
117   unsigned long CacheAssoc;             /* L1 Cache associativity. Use this
118                                            for combined cache. If split, put
119                                            zeros here.                        */
120   unsigned long CacheLineSize;          /* L1 Cache line size in bytes. Use
121                                            for combined cache. If split, put
122                                            zeros here.                        */
123   /* For split L1 Cache: (= combined if combined cache) */
124   unsigned long I_CacheSize;
125   unsigned long I_CacheAssoc;
126   unsigned long I_CacheLineSize;
127   unsigned long D_CacheSize;
128   unsigned long D_CacheAssoc;
129   unsigned long D_CacheLineSize;
130 
131   /* Translation Lookaside Buffer variables */
132   unsigned long TLBSize;                /* Total number of TLBs on the system */
133   unsigned long TLBAttrib;              /* Combined I+D or split TLB          */
134   unsigned long TLBAssoc;               /* TLB Associativity. Use this for
135                                            combined TLB. If split, put zeros
136                                            here.                              */
137   /* For split TLB: (= combined if combined TLB) */
138   unsigned long I_TLBSize;
139   unsigned long I_TLBAssoc;
140   unsigned long D_TLBSize;
141   unsigned long D_TLBAssoc;
142 
143   unsigned long ExtendedVPD;            /* Offset to extended VPD area;
144                                            null if unused                     */
145   } VPD;
146 
147 typedef enum _DEVICE_FLAGS {
148   Enabled = 0x4000,                     /* 1 - PCI device is enabled          */
149   Integrated = 0x2000,
150   Failed = 0x1000,                      /* 1 - device failed POST code tests  */
151   Static = 0x0800,                      /* 0 - dynamically configurable
152                                            1 - static                         */
153   Dock = 0x0400,                        /* 0 - not a docking station device
154                                            1 - is a docking station device    */
155   Boot = 0x0200,                        /* 0 - device cannot be used for BOOT
156                                            1 - can be a BOOT device           */
157   Configurable = 0x0100,                /* 1 - device is configurable         */
158   Disableable = 0x80,                   /* 1 - device can be disabled         */
159   PowerManaged = 0x40,                  /* 0 - not managed; 1 - managed       */
160   ReadOnly = 0x20,                      /* 1 - device is read only            */
161   Removable = 0x10,                     /* 1 - device is removable            */
162   ConsoleIn = 0x08,
163   ConsoleOut = 0x04,
164   Input = 0x02,
165   Output = 0x01
166   } DEVICE_FLAGS;
167 
168 typedef enum _BUS_ID {
169   ISADEVICE = 0x01,
170   EISADEVICE = 0x02,
171   PCIDEVICE = 0x04,
172   PCMCIADEVICE = 0x08,
173   PNPISADEVICE = 0x10,
174   MCADEVICE = 0x20,
175   MXDEVICE = 0x40,                      /* Devices on mezzanine bus           */
176   PROCESSORDEVICE = 0x80,               /* Devices on processor bus           */
177   VMEDEVICE = 0x100,
178   } BUS_ID;
179 
180 typedef struct _DEVICE_ID {
181   unsigned long BusId;                  /* See BUS_ID enum above              */
182   unsigned long DevId;                  /* Big Endian format                  */
183   unsigned long SerialNum;              /* For multiple usage of a single
184                                            DevId                              */
185   unsigned long Flags;                  /* See DEVICE_FLAGS enum above        */
186   unsigned char BaseType;               /* See pnp.h for bit definitions      */
187   unsigned char SubType;                /* See pnp.h for bit definitions      */
188   unsigned char Interface;              /* See pnp.h for bit definitions      */
189   unsigned char Spare;
190   } DEVICE_ID;
191 
192 typedef union _BUS_ACCESS {
193   struct _PnPAccess{
194     unsigned char CSN;
195     unsigned char LogicalDevNumber;
196     unsigned short ReadDataPort;
197     } PnPAccess;
198   struct _ISAAccess{
199     unsigned char SlotNumber;           /* ISA Slot Number generally not
200                                            available; 0 if unknown            */
201     unsigned char LogicalDevNumber;
202     unsigned short ISAReserved;
203     } ISAAccess;
204   struct _MCAAccess{
205     unsigned char SlotNumber;
206     unsigned char LogicalDevNumber;
207     unsigned short MCAReserved;
208     } MCAAccess;
209   struct _PCMCIAAccess{
210     unsigned char SlotNumber;
211     unsigned char LogicalDevNumber;
212     unsigned short PCMCIAReserved;
213     } PCMCIAAccess;
214   struct _EISAAccess{
215     unsigned char SlotNumber;
216     unsigned char FunctionNumber;
217     unsigned short EISAReserved;
218     } EISAAccess;
219   struct _PCIAccess{
220     unsigned char BusNumber;
221     unsigned char DevFuncNumber;
222     unsigned short PCIReserved;
223     } PCIAccess;
224   struct _ProcBusAccess{
225     unsigned char BusNumber;
226     unsigned char BUID;
227     unsigned short ProcBusReserved;
228     } ProcBusAccess;
229   } BUS_ACCESS;
230 
231 /* Per logical device information */
232 typedef struct _PPC_DEVICE {
233   DEVICE_ID DeviceId;
234   BUS_ACCESS BusAccess;
235 
236   /* The following three are offsets into the DevicePnPHeap */
237   /* All are in PnP compressed format                       */
238   unsigned long AllocatedOffset;        /* Allocated resource description     */
239   unsigned long PossibleOffset;         /* Possible resource description      */
240   unsigned long CompatibleOffset;       /* Compatible device identifiers      */
241   } PPC_DEVICE;
242 
243 typedef enum _CPU_STATE {
244   CPU_GOOD = 0,                         /* CPU is present, and active         */
245   CPU_GOOD_FW = 1,                      /* CPU is present, and in firmware    */
246   CPU_OFF = 2,                          /* CPU is present, but inactive       */
247   CPU_FAILED = 3,                       /* CPU is present, but failed POST    */
248   CPU_NOT_PRESENT = 255                 /* CPU not present                    */
249   } CPU_STATE;
250 
251 typedef struct _PPC_CPU {
252   unsigned long CpuType;                /* Result of mfspr from Processor
253                                            Version Register (PVR).
254                                            PVR(0-15) = Version (e.g. 601)
255                                            PVR(16-31 = EC Level               */
256   unsigned char CpuNumber;              /* CPU Number for this processor      */
257   unsigned char CpuState;               /* CPU State, see CPU_STATE enum      */
258   unsigned short Reserved;
259   } PPC_CPU;
260 
261 typedef struct _PPC_MEM {
262   unsigned long SIMMSize;               /* 0 - absent or bad
263                                            8M, 32M (in MB)                    */
264   } PPC_MEM;
265 
266 typedef enum _MEM_USAGE {
267   Other = 0x8000,
268   ResumeBlock = 0x4000,                 /* for use by power management        */
269   SystemROM = 0x2000,                   /* Flash memory (populated)           */
270   UnPopSystemROM = 0x1000,              /* Unpopulated part of SystemROM area */
271   IOMemory = 0x0800,
272   SystemIO = 0x0400,
273   SystemRegs = 0x0200,
274   PCIAddr = 0x0100,
275   PCIConfig = 0x80,
276   ISAAddr = 0x40,
277   Unpopulated = 0x20,                   /* Unpopulated part of System Memory  */
278   Free = 0x10,                          /* Free part of System Memory         */
279   BootImage = 0x08,                     /* BootImage part of System Memory    */
280   FirmwareCode = 0x04,                  /* FirmwareCode part of System Memory */
281   FirmwareHeap = 0x02,                  /* FirmwareHeap part of System Memory */
282   FirmwareStack = 0x01                  /* FirmwareStack part of System Memory*/
283   } MEM_USAGE;
284 
285 typedef struct _MEM_MAP {
286   unsigned long Usage;                  /* See MEM_USAGE above                */
287   unsigned long BasePage;               /* Page number measured in 4KB pages  */
288   unsigned long PageCount;              /* Page count measured in 4KB pages   */
289   } MEM_MAP;
290 
291 typedef struct _RESIDUAL {
292   unsigned long ResidualLength;         /* Length of Residual                 */
293   unsigned char Version;                /* of this data structure             */
294   unsigned char Revision;               /* of this data structure             */
295   unsigned short EC;                    /* of this data structure             */
296   /* VPD */
297   VPD VitalProductData;
298   /* CPU */
299   unsigned short MaxNumCpus;            /* Max CPUs in this system            */
300   unsigned short ActualNumCpus;         /* ActualNumCpus < MaxNumCpus means   */
301                                         /* that there are unpopulated or      */
302                                         /* otherwise unusable cpu locations   */
303   PPC_CPU Cpus[MAX_CPUS];
304   /* Memory */
305   unsigned long TotalMemory;            /* Total amount of memory installed   */
306   unsigned long GoodMemory;             /* Total amount of good memory        */
307   unsigned long ActualNumMemSegs;
308   MEM_MAP Segs[MAX_MEM_SEGS];
309   unsigned long ActualNumMemories;
310   PPC_MEM Memories[MAX_MEMS];
311   /* Devices */
312   unsigned long ActualNumDevices;
313   PPC_DEVICE Devices[MAX_DEVICES];
314   unsigned char DevicePnPHeap[2*MAX_DEVICES*AVE_PNP_SIZE];
315   } RESIDUAL;
316 
317 
318 extern RESIDUAL *res;
319 extern void print_residual_device_info(void);
320 extern PPC_DEVICE *residual_find_device(unsigned long BusMask,
321 					unsigned char * DevID, int BaseType,
322 					int SubType, int Interface, int n);
323 extern PnP_TAG_PACKET *PnP_find_packet(unsigned char *p, unsigned packet_tag,
324 				       int n);
325 extern PnP_TAG_PACKET *PnP_find_small_vendor_packet(unsigned char *p,
326 						    unsigned packet_type,
327 						    int n);
328 extern PnP_TAG_PACKET *PnP_find_large_vendor_packet(unsigned char *p,
329 						    unsigned packet_type,
330 						    int n);
331 #endif /* __ASSEMBLY__ */
332 #endif  /* ndef _RESIDUAL_ */
333 
334 #endif /* __KERNEL__ */
335