#ifndef _RESIDUAL_
#define _RESIDUAL_
#ifndef __ASSEMBLY__
#define MAX_CPUS 32
#define MAX_MEMS 64
#define MAX_DEVICES 256
#define AVE_PNP_SIZE 32
#define MAX_MEM_SEGS 64
#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,
FirmWorks = 0x02,
Bull = 0x03,
} FIRMWARE_SUPPLIERS;
typedef enum _ENDIAN_SWITCH_METHODS {
UsePort92 = 0x01,
UsePCIConfigA8 = 0x02,
UseFF001030 = 0x03,
} ENDIAN_SWITCH_METHODS;
typedef enum _SPREAD_IO_METHODS {
UsePort850 = 0x00,
} SPREAD_IO_METHODS;
typedef struct _VPD {
unsigned char PrintableModel[32];
unsigned char Serial[16];
unsigned char Reserved[48];
unsigned long FirmwareSupplier;
unsigned long FirmwareSupports;
unsigned long NvramSize;
unsigned long NumSIMMSlots;
unsigned short EndianSwitchMethod;
unsigned short SpreadIOMethod;
unsigned long SmpIar;
unsigned long RAMErrLogOffset;
unsigned long Reserved5;
unsigned long Reserved6;
unsigned long ProcessorHz;
unsigned long ProcessorBusHz;
unsigned long Reserved7;
unsigned long TimeBaseDivisor;
unsigned long WordWidth;
unsigned long PageSize;
unsigned long CoherenceBlockSize;
unsigned long GranuleSize;
unsigned long CacheSize;
unsigned long CacheAttrib;
unsigned long CacheAssoc;
unsigned long CacheLineSize;
unsigned long I_CacheSize;
unsigned long I_CacheAssoc;
unsigned long I_CacheLineSize;
unsigned long D_CacheSize;
unsigned long D_CacheAssoc;
unsigned long D_CacheLineSize;
unsigned long TLBSize;
unsigned long TLBAttrib;
unsigned long TLBAssoc;
unsigned long I_TLBSize;
unsigned long I_TLBAssoc;
unsigned long D_TLBSize;
unsigned long D_TLBAssoc;
unsigned long ExtendedVPD;
} VPD;
typedef enum _DEVICE_FLAGS {
Enabled = 0x4000,
Integrated = 0x2000,
Failed = 0x1000,
Static = 0x0800,
Dock = 0x0400,
Boot = 0x0200,
Configurable = 0x0100,
Disableable = 0x80,
PowerManaged = 0x40,
ReadOnly = 0x20,
Removable = 0x10,
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,
PROCESSORDEVICE = 0x80,
VMEDEVICE = 0x100,
} BUS_ID;
typedef struct _DEVICE_ID {
unsigned long BusId;
unsigned long DevId;
unsigned long SerialNum;
unsigned long Flags;
unsigned char BaseType;
unsigned char SubType;
unsigned char Interface;
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;
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;
typedef struct _PPC_DEVICE {
DEVICE_ID DeviceId;
BUS_ACCESS BusAccess;
unsigned long AllocatedOffset;
unsigned long PossibleOffset;
unsigned long CompatibleOffset;
} PPC_DEVICE;
typedef enum _CPU_STATE {
CPU_GOOD = 0,
CPU_GOOD_FW = 1,
CPU_OFF = 2,
CPU_FAILED = 3,
CPU_NOT_PRESENT = 255
} CPU_STATE;
typedef struct _PPC_CPU {
unsigned long CpuType;
unsigned char CpuNumber;
unsigned char CpuState;
unsigned short Reserved;
} PPC_CPU;
typedef struct _PPC_MEM {
unsigned long SIMMSize;
} PPC_MEM;
typedef enum _MEM_USAGE {
Other = 0x8000,
ResumeBlock = 0x4000,
SystemROM = 0x2000,
UnPopSystemROM = 0x1000,
IOMemory = 0x0800,
SystemIO = 0x0400,
SystemRegs = 0x0200,
PCIAddr = 0x0100,
PCIConfig = 0x80,
ISAAddr = 0x40,
Unpopulated = 0x20,
Free = 0x10,
BootImage = 0x08,
FirmwareCode = 0x04,
FirmwareHeap = 0x02,
FirmwareStack = 0x01
} MEM_USAGE;
typedef struct _MEM_MAP {
unsigned long Usage;
unsigned long BasePage;
unsigned long PageCount;
} MEM_MAP;
typedef struct _RESIDUAL {
unsigned long ResidualLength;
unsigned char Version;
unsigned char Revision;
unsigned short EC;
VPD VitalProductData;
unsigned short MaxNumCpus;
unsigned short ActualNumCpus;
PPC_CPU Cpus[MAX_CPUS];
unsigned long TotalMemory;
unsigned long GoodMemory;
unsigned long ActualNumMemSegs;
MEM_MAP Segs[MAX_MEM_SEGS];
unsigned long ActualNumMemories;
PPC_MEM Memories[MAX_MEMS];
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);
extern PPC_DEVICE *find_nth_pnp_device(const char *devid, int busid, int n);
extern int count_pnp_devices(const char *devid);
extern void pnp_devid_to_string(uint32_t devid, char *s);
extern int pnp_pci_busno(void *, int *bus);
extern int pnp_pci_configbase(void *v, uint32_t *addr, uint32_t *data);
#endif
#endif