diff options
Diffstat (limited to 'arch/powerpc/include/asm/residual.h')
| -rw-r--r-- | arch/powerpc/include/asm/residual.h | 331 | 
1 files changed, 331 insertions, 0 deletions
| diff --git a/arch/powerpc/include/asm/residual.h b/arch/powerpc/include/asm/residual.h new file mode 100644 index 000000000..dc85edbc3 --- /dev/null +++ b/arch/powerpc/include/asm/residual.h @@ -0,0 +1,331 @@ +/* 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_ */ |