forked from luck/tmp_suning_uos_patched
351 lines
15 KiB
C
351 lines
15 KiB
C
|
/* 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. */
|
||
|
|
||
|
#ifdef __KERNEL__
|
||
|
#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 <asm/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;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Forward declaration - we can't include <linux/pci.h> because it
|
||
|
* breaks the boot loader
|
||
|
*/
|
||
|
struct pci_dev;
|
||
|
|
||
|
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 int residual_pcidev_irq(struct pci_dev *dev);
|
||
|
extern void residual_irq_mask(char *irq_edge_mask_lo, char *irq_edge_mask_hi);
|
||
|
extern unsigned int residual_isapic_addr(void);
|
||
|
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);
|
||
|
|
||
|
#ifdef CONFIG_PREP_RESIDUAL
|
||
|
#define have_residual_data (res && res->ResidualLength)
|
||
|
#else
|
||
|
#define have_residual_data 0
|
||
|
#endif
|
||
|
|
||
|
#endif /* __ASSEMBLY__ */
|
||
|
#endif /* ndef _RESIDUAL_ */
|
||
|
|
||
|
#endif /* __KERNEL__ */
|