/* 7/18/95 */ /*----------------------------------------------------------------------------*/ /* Residual Data header definitions and prototypes */ /*----------------------------------------------------------------------------*/ /* Structure map for RESIDUAL on PowerPC Reference Platform */ /* residual.h - Residual data structure passed in r3. */ /* Load point passed in r4 to boot image. */ /* For enum's: if given in hex then they are bit significant, */ /* i.e. only one bit is on for each enum */ /* Reserved fields must be filled with zeros. */ #ifndef _RESIDUAL_ #define _RESIDUAL_ #ifndef __ASSEMBLY__ #define MAX_CPUS 32 /* These should be set to the maximum */ #define MAX_MEMS 64 /* number possible for this system. */ #define MAX_DEVICES 256 /* Changing these will change the */ #define AVE_PNP_SIZE 32 /* structure, hence the version of */ #define MAX_MEM_SEGS 64 /* this header file. */ /*----------------------------------------------------------------------------*/ /* Public structures... */ /*----------------------------------------------------------------------------*/ #include "pnp.h" typedef enum _L1CACHE_TYPE { NoneCAC = 0, SplitCAC = 1, CombinedCAC = 2 } L1CACHE_TYPE; typedef enum _TLB_TYPE { NoneTLB = 0, SplitTLB = 1, CombinedTLB = 2 } TLB_TYPE; typedef enum _FIRMWARE_SUPPORT { Conventional = 0x01, OpenFirmware = 0x02, Diagnostics = 0x04, LowDebug = 0x08, Multiboot = 0x10, LowClient = 0x20, Hex41 = 0x40, FAT = 0x80, ISO9660 = 0x0100, SCSI_InitiatorID_Override = 0x0200, Tape_Boot = 0x0400, FW_Boot_Path = 0x0800 } FIRMWARE_SUPPORT; typedef enum _FIRMWARE_SUPPLIERS { IBMFirmware = 0x00, MotoFirmware = 0x01, /* 7/18/95 */ FirmWorks = 0x02, /* 10/5/95 */ Bull = 0x03, /* 04/03/96 */ } FIRMWARE_SUPPLIERS; typedef enum _ENDIAN_SWITCH_METHODS { UsePort92 = 0x01, UsePCIConfigA8 = 0x02, UseFF001030 = 0x03, } ENDIAN_SWITCH_METHODS; typedef enum _SPREAD_IO_METHODS { UsePort850 = 0x00, /*UsePCIConfigA8 = 0x02,*/ } SPREAD_IO_METHODS; typedef struct _VPD { /* Box dependent stuff */ unsigned char PrintableModel[32]; /* Null terminated string. Must be of the form: vvv,<20h>,<model designation>,<0x0> where vvv is the vendor ID e.g. IBM PPS MODEL 6015<0x0> */ unsigned char Serial[16]; /* 12/94: Serial Number; must be of the form: vvv<serial number> where vvv is the vendor ID. e.g. IBM60151234567<20h><20h> */ unsigned char Reserved[48]; unsigned long FirmwareSupplier; /* See FirmwareSuppliers enum */ unsigned long FirmwareSupports; /* See FirmwareSupport enum */ unsigned long NvramSize; /* Size of nvram in bytes */ unsigned long NumSIMMSlots; unsigned short EndianSwitchMethod; /* See EndianSwitchMethods enum */ unsigned short SpreadIOMethod; /* See SpreadIOMethods enum */ unsigned long SmpIar; unsigned long RAMErrLogOffset; /* Heap offset to error log */ unsigned long Reserved5; unsigned long Reserved6; unsigned long ProcessorHz; /* Processor clock frequency in Hertz */ unsigned long ProcessorBusHz; /* Processor bus clock frequency */ unsigned long Reserved7; unsigned long TimeBaseDivisor; /* (Bus clocks per timebase tic)*1000 */ unsigned long WordWidth; /* Word width in bits */ unsigned long PageSize; /* Page size in bytes */ unsigned long CoherenceBlockSize; /* Unit of transfer in/out of cache for which coherency is maintained; normally <= CacheLineSize. */ unsigned long GranuleSize; /* Unit of lock allocation to avoid */ /* false sharing of locks. */ /* L1 Cache variables */ unsigned long CacheSize; /* L1 Cache size in KB. This is the */ /* total size of the L1, whether */ /* combined or split */ unsigned long CacheAttrib; /* L1CACHE_TYPE */ unsigned long CacheAssoc; /* L1 Cache associativity. Use this for combined cache. If split, put zeros here. */ unsigned long CacheLineSize; /* L1 Cache line size in bytes. Use for combined cache. If split, put zeros here. */ /* For split L1 Cache: (= combined if combined cache) */ unsigned long I_CacheSize; unsigned long I_CacheAssoc; unsigned long I_CacheLineSize; unsigned long D_CacheSize; unsigned long D_CacheAssoc; unsigned long D_CacheLineSize; /* Translation Lookaside Buffer variables */ unsigned long TLBSize; /* Total number of TLBs on the system */ unsigned long TLBAttrib; /* Combined I+D or split TLB */ unsigned long TLBAssoc; /* TLB Associativity. Use this for combined TLB. If split, put zeros here. */ /* For split TLB: (= combined if combined TLB) */ unsigned long I_TLBSize; unsigned long I_TLBAssoc; unsigned long D_TLBSize; unsigned long D_TLBAssoc; unsigned long ExtendedVPD; /* Offset to extended VPD area; null if unused */ } VPD; typedef enum _DEVICE_FLAGS { Enabled = 0x4000, /* 1 - PCI device is enabled */ Integrated = 0x2000, Failed = 0x1000, /* 1 - device failed POST code tests */ Static = 0x0800, /* 0 - dynamically configurable 1 - static */ Dock = 0x0400, /* 0 - not a docking station device 1 - is a docking station device */ Boot = 0x0200, /* 0 - device cannot be used for BOOT 1 - can be a BOOT device */ Configurable = 0x0100, /* 1 - device is configurable */ Disableable = 0x80, /* 1 - device can be disabled */ PowerManaged = 0x40, /* 0 - not managed; 1 - managed */ ReadOnly = 0x20, /* 1 - device is read only */ Removable = 0x10, /* 1 - device is removable */ ConsoleIn = 0x08, ConsoleOut = 0x04, Input = 0x02, Output = 0x01 } DEVICE_FLAGS; typedef enum _BUS_ID { ISADEVICE = 0x01, EISADEVICE = 0x02, PCIDEVICE = 0x04, PCMCIADEVICE = 0x08, PNPISADEVICE = 0x10, MCADEVICE = 0x20, MXDEVICE = 0x40, /* Devices on mezzanine bus */ PROCESSORDEVICE = 0x80, /* Devices on processor bus */ VMEDEVICE = 0x100, } BUS_ID; typedef struct _DEVICE_ID { unsigned long BusId; /* See BUS_ID enum above */ unsigned long DevId; /* Big Endian format */ unsigned long SerialNum; /* For multiple usage of a single DevId */ unsigned long Flags; /* See DEVICE_FLAGS enum above */ unsigned char BaseType; /* See pnp.h for bit definitions */ unsigned char SubType; /* See pnp.h for bit definitions */ unsigned char Interface; /* See pnp.h for bit definitions */ unsigned char Spare; } DEVICE_ID; typedef union _BUS_ACCESS { struct _PnPAccess{ unsigned char CSN; unsigned char LogicalDevNumber; unsigned short ReadDataPort; } PnPAccess; struct _ISAAccess{ unsigned char SlotNumber; /* ISA Slot Number generally not available; 0 if unknown */ unsigned char LogicalDevNumber; unsigned short ISAReserved; } ISAAccess; struct _MCAAccess{ unsigned char SlotNumber; unsigned char LogicalDevNumber; unsigned short MCAReserved; } MCAAccess; struct _PCMCIAAccess{ unsigned char SlotNumber; unsigned char LogicalDevNumber; unsigned short PCMCIAReserved; } PCMCIAAccess; struct _EISAAccess{ unsigned char SlotNumber; unsigned char FunctionNumber; unsigned short EISAReserved; } EISAAccess; struct _PCIAccess{ unsigned char BusNumber; unsigned char DevFuncNumber; unsigned short PCIReserved; } PCIAccess; struct _ProcBusAccess{ unsigned char BusNumber; unsigned char BUID; unsigned short ProcBusReserved; } ProcBusAccess; } BUS_ACCESS; /* Per logical device information */ typedef struct _PPC_DEVICE { DEVICE_ID DeviceId; BUS_ACCESS BusAccess; /* The following three are offsets into the DevicePnPHeap */ /* All are in PnP compressed format */ unsigned long AllocatedOffset; /* Allocated resource description */ unsigned long PossibleOffset; /* Possible resource description */ unsigned long CompatibleOffset; /* Compatible device identifiers */ } PPC_DEVICE; typedef enum _CPU_STATE { CPU_GOOD = 0, /* CPU is present, and active */ CPU_GOOD_FW = 1, /* CPU is present, and in firmware */ CPU_OFF = 2, /* CPU is present, but inactive */ CPU_FAILED = 3, /* CPU is present, but failed POST */ CPU_NOT_PRESENT = 255 /* CPU not present */ } CPU_STATE; typedef struct _PPC_CPU { unsigned long CpuType; /* Result of mfspr from Processor Version Register (PVR). PVR(0-15) = Version (e.g. 601) PVR(16-31 = EC Level */ unsigned char CpuNumber; /* CPU Number for this processor */ unsigned char CpuState; /* CPU State, see CPU_STATE enum */ unsigned short Reserved; } PPC_CPU; typedef struct _PPC_MEM { unsigned long SIMMSize; /* 0 - absent or bad 8M, 32M (in MB) */ } PPC_MEM; typedef enum _MEM_USAGE { Other = 0x8000, ResumeBlock = 0x4000, /* for use by power management */ SystemROM = 0x2000, /* Flash memory (populated) */ UnPopSystemROM = 0x1000, /* Unpopulated part of SystemROM area */ IOMemory = 0x0800, SystemIO = 0x0400, SystemRegs = 0x0200, PCIAddr = 0x0100, PCIConfig = 0x80, ISAAddr = 0x40, Unpopulated = 0x20, /* Unpopulated part of System Memory */ Free = 0x10, /* Free part of System Memory */ BootImage = 0x08, /* BootImage part of System Memory */ FirmwareCode = 0x04, /* FirmwareCode part of System Memory */ FirmwareHeap = 0x02, /* FirmwareHeap part of System Memory */ FirmwareStack = 0x01 /* FirmwareStack part of System Memory*/ } MEM_USAGE; typedef struct _MEM_MAP { unsigned long Usage; /* See MEM_USAGE above */ unsigned long BasePage; /* Page number measured in 4KB pages */ unsigned long PageCount; /* Page count measured in 4KB pages */ } MEM_MAP; typedef struct _RESIDUAL { unsigned long ResidualLength; /* Length of Residual */ unsigned char Version; /* of this data structure */ unsigned char Revision; /* of this data structure */ unsigned short EC; /* of this data structure */ /* VPD */ VPD VitalProductData; /* CPU */ unsigned short MaxNumCpus; /* Max CPUs in this system */ unsigned short ActualNumCpus; /* ActualNumCpus < MaxNumCpus means */ /* that there are unpopulated or */ /* otherwise unusable cpu locations */ PPC_CPU Cpus[MAX_CPUS]; /* Memory */ unsigned long TotalMemory; /* Total amount of memory installed */ unsigned long GoodMemory; /* Total amount of good memory */ unsigned long ActualNumMemSegs; MEM_MAP Segs[MAX_MEM_SEGS]; unsigned long ActualNumMemories; PPC_MEM Memories[MAX_MEMS]; /* Devices */ unsigned long ActualNumDevices; PPC_DEVICE Devices[MAX_DEVICES]; unsigned char DevicePnPHeap[2*MAX_DEVICES*AVE_PNP_SIZE]; } RESIDUAL; extern RESIDUAL *res; extern void print_residual_device_info(void); extern PPC_DEVICE *residual_find_device(unsigned long BusMask, unsigned char * DevID, int BaseType, int SubType, int Interface, int n); extern PnP_TAG_PACKET *PnP_find_packet(unsigned char *p, unsigned packet_tag, int n); extern PnP_TAG_PACKET *PnP_find_small_vendor_packet(unsigned char *p, unsigned packet_type, int n); extern PnP_TAG_PACKET *PnP_find_large_vendor_packet(unsigned char *p, unsigned packet_type, int n); #endif /* __ASSEMBLY__ */ #endif /* ndef _RESIDUAL_ */