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