/*++ BUILD Version: 0000     Increment this if a change has global effects

Copyright (c) 1996 Digital Euipment Corporation

Module Name:

    axp21264.h

Abstract:

    This module defines the DECchip 21264-specific structures that are
    defined in the PAL but must be visible to the HAL.

Revision History:

--*/

#ifndef _AXP21264_
#define _AXP21264_


//
// Define the "special" processor bus used by all machines that run a
// DECchip 21264.  The processor bus is used to access the internal
// performance counters.
//

#define PROCESSOR_BUS_21264 21264

//
// Define the physical address bit that turns on user-mode access
// to I/O space in the pfn of a pte.  This bit is required because of
// the current 36 bit physical address space limit on NT.
//

#define EV6_USER_IO_ADDRESS_SPACE (ULONGLONG)(0x800000000)

//
// Define the Ebox Internal Processor Register formats.
//

//
// Define the CC_CTL.
//

typedef union _CC_CTL_21264{
    struct {
        ULONGLONG Count : 32;
        ULONGLONG CcEna : 1;
        ULONGLONG Ignore : 31;
    } ;
    ULONGLONG all;
} CC_CTL_21264, *PCC_CTL_21264;

//
//  Define VA_CTL.
//

typedef union _VA_CTL_21264{
    struct {
        ULONGLONG BigEndian : 1;
        ULONGLONG Va48 : 1;
        ULONGLONG VaForm32 : 1;
        ULONGLONG Mbz : 27;
        ULONGLONG VPtb : 34;
    };
    ULONGLONG all;
} VA_CTL_21264, *PVA_CTL_21264;

//
// Define the Ibox Internal Processor Register formats.
//

//
//  Define ITB_PTE.
//

typedef union _ITB_PTE_21264{
    struct {
        ULONGLONG Ignore1 : 4;
        ULONGLONG Asm : 1;
        ULONGLONG Gh : 2;
        ULONGLONG Ignore2 : 1;
        ULONGLONG Kre : 1;
        ULONGLONG Ere : 1;
        ULONGLONG Sre : 1;
        ULONGLONG Ure : 1;
        ULONGLONG Ignore3 : 1;
        ULONGLONG Pfn : 31;
        ULONGLONG Ignore4 : 20;
    };
    ULONGLONG all;
} ITB_PTE_21264, *PITB_PTE_21264;

//
// Define EXC_ADDR
//

typedef union _EXC_ADDR_21264{
	  struct{
		  ULONGLONG Pal : 1;
		  ULONGLONG Raz : 1;
		  ULONGLONG Pc  : 62;
	  };
	  ULONGLONG all;
}  EXC_ADDR_21264, *PEXC_ADDR_21264;



//
//  Define IER_CM - Interrupt Enable/Current Mode Register
//  Note that this can be also be written as two independant registers.
//

typedef union _IER_CM_21264{
    struct {
        ULONGLONG Raz1 : 3;
        ULONGLONG Cm : 2;
        ULONGLONG Raz2 : 8;
        ULONGLONG AstEn : 1;
        ULONGLONG SiEn : 15;
        ULONGLONG PcEn : 2;
        ULONGLONG CrEn : 1;
        ULONGLONG SlEn : 1;
        ULONGLONG EiEn : 6;
        ULONGLONG Raz3 : 25;
    };
    ULONGLONG all;
} IER_CM_21264, *PIER_CM_21264;

//
//  Define SIRR - Software Interrupt Request Register
//

typedef union _SIRR_21264{
    struct{
        ULONGLONG Raz1 : 14;
        ULONGLONG Sir : 15;
        ULONGLONG Raz2 : 35;
    };
    ULONGLONG all;
} SIRR_21264, *PSIRR_21264;

//
//  Define ISUM - Interrupt Summary register
//

typedef union _ISUM_21264{
    struct{
        ULONGLONG Raz1 : 3;
        ULONGLONG AstK : 1;
        ULONGLONG AstE : 1;
        ULONGLONG Raz2 : 4;
        ULONGLONG AstS : 1;
        ULONGLONG AstU : 1;
        ULONGLONG Raz3 : 3;
        ULONGLONG Si : 15;
        ULONGLONG Pc : 2;
        ULONGLONG Cr : 1;
        ULONGLONG Sl : 1;
        ULONGLONG Ei : 6;
        ULONGLONG Raz4 : 25;
    };
    ULONGLONG all;
} ISUM_21264, *PISUM_21264;

//
//  Define HW_INT_CLR - Hardware Interrupt Clear Register
//

typedef union _HW_INT_CLR_21264{
    struct{
        ULONGLONG Ign1 : 26;
        ULONGLONG Fbtp : 1;
        ULONGLONG Fbdp : 1;
        ULONGLONG MchkD : 1;
        ULONGLONG Pc : 2;
        ULONGLONG Cr : 1;
        ULONGLONG Sl : 1;
        ULONGLONG Ign2 : 31;
    };
    ULONGLONG all;
} HW_INT_CLR_21264, *PHW_INT_CLR_21264;

//
//  Define EXC_SUM - Exception Summary Register
//

typedef union _EXC_SUM_21264{
    struct{
        ULONGLONG Swc : 1;
        ULONGLONG Inv : 1;
        ULONGLONG Dze : 1;
        ULONGLONG Fov : 1;
        ULONGLONG Unf : 1;
        ULONGLONG Ine : 1;
        ULONGLONG Iov : 1;
        ULONGLONG Int : 1;
        ULONGLONG Reg : 5;
        ULONGLONG BadIva : 1;
        ULONGLONG Ignore1 : 27;
        ULONGLONG PcOvf	 : 1;
        ULONGLONG SetInv : 1;
        ULONGLONG SetDze : 1;
        ULONGLONG SetOvf : 1;
        ULONGLONG SetUnf : 1;
        ULONGLONG SetIne : 1;
        ULONGLONG SetIov : 1;
        ULONGLONG Ignore2 : 16;
    };
    ULONGLONG all;
} EXC_SUM_21264, *PEXC_SUM_21264;

//
//  Define I_CTL - Ibox Control Register
//

typedef union _I_CTL_21264{
    struct{
        ULONGLONG PcEn : 1;
        ULONGLONG IcEnable : 2;
        ULONGLONG Sp32 : 1;
        ULONGLONG Sp43 : 1;
        ULONGLONG Sp48 : 1;
        ULONGLONG Raz1 : 1;
        ULONGLONG Sde : 1;
        ULONGLONG Sbe : 2;
        ULONGLONG BpMode : 2;
        ULONGLONG Hwe : 1;
        ULONGLONG Fbtp : 1;
        ULONGLONG Fbdp : 1;
        ULONGLONG Va48 : 1;
        ULONGLONG VaForm32 : 1;
        ULONGLONG SingleIssue : 1;
        ULONGLONG Pct0En : 1;
        ULONGLONG Pct1En : 1;
        ULONGLONG CallPalR23 : 1;
        ULONGLONG MchkEn : 1;
        ULONGLONG TbMbEn : 1;
        ULONGLONG BistFail : 1;
        ULONGLONG ChipId : 6;
        ULONGLONG Vptb : 18;
        ULONGLONG Sext : 16;
    };
    ULONGLONG all;
} I_CTL_21264, *PI_CTL_21264;

//
//  Define I_STAT - Ibox Status Register
//

typedef union _I_STAT_21264{
    struct{
        ULONGLONG Raz1 : 29;
        ULONGLONG Tpe : 1;
        ULONGLONG Dpe : 1;
        ULONGLONG Raz2 : 33;
    };
    ULONGLONG all;
} I_STAT_21264, *PI_STAT_21264;

//
//  Define PCTX - Ibox Process Context Register
//  Note that this can be also be written as five independant registers.
//  (ASN, ASTER, ASTRR, PPCE, FPE)
//

typedef union _PCTX_21264{
    struct{
        ULONGLONG Raz1 : 1;
        ULONGLONG Ppce : 1;
        ULONGLONG Fpe : 1;
        ULONGLONG Raz2 : 2;
        ULONGLONG AstEr : 4;
        ULONGLONG AstRr : 4;
        ULONGLONG Raz3 : 26;
        ULONGLONG Asn : 8;
        ULONGLONG Raz4 : 17;
    };
    ULONGLONG all;
} PCTX_21264, *PPCTX_21264;

//
//  Define PCTR_CTL - Performance Counter Control Register
//

typedef union _PCTR_CTL_21264{
    struct{
        ULONGLONG Sel1 : 4;
        ULONGLONG Sel0 : 1;
        ULONGLONG Raz1 : 1;
        ULONGLONG Pctr1 : 20;
        ULONGLONG Raz2 : 2;
        ULONGLONG Pctr0 : 20;
        ULONGLONG Raz3 : 16;
    };
    ULONGLONG all;
} PCTR_CTL_21264, *PPCTR_CTL_21264;


//
// Define the Mbox and Dcache Internal Processor Register formats.
//

//
//  Define DTB_PTE
//

typedef union _DTB_PTE_21264{
    struct{
        ULONGLONG Ignore1 : 1;
        ULONGLONG For : 1;
        ULONGLONG Fow : 1;
        ULONGLONG Ignore2 : 1;
        ULONGLONG Asm : 1;
        ULONGLONG Gh : 2;
        ULONGLONG Ignore3 : 1;
        ULONGLONG Kre : 1;
        ULONGLONG Ere : 1;
        ULONGLONG Sre : 1;
        ULONGLONG Ure : 1;
        ULONGLONG Kwe : 1;
        ULONGLONG Ewe : 1;
        ULONGLONG Swe : 1;
        ULONGLONG Uwe : 1;
        ULONGLONG Ignore4 : 16;
        ULONGLONG Pfn : 31;
        ULONGLONG Ignore5 : 1;
    };
    ULONGLONG all;
} DTB_PTE_21264, *PDTB_PTE_21264;

//
//  Define DTB_ASN
//

typedef union _DTB_ASN_21264{
    struct{
        ULONGLONG Ignore1 : 56;
        ULONGLONG Asn : 8;
    };
    ULONGLONG all;
} DTB_ASN_21264, *PDTB_ASN_21264;

//
//  Define MM_STAT - MBOX Status Register
//

typedef union _MM_STAT_21264{
    struct{
        ULONGLONG Wr : 1;
        ULONGLONG Acv : 1;
        ULONGLONG For : 1;
        ULONGLONG Fow : 1;
        ULONGLONG Opcode : 6;
        ULONGLONG DcTagPerr : 1;
        ULONGLONG Ignore1 : 53;
    };
    ULONGLONG all;
} MM_STAT_21264, *PMM_STAT_21264;

//
//  Define M_CTL - MBOX Control Register
//

typedef union _M_CTL_21264{
    struct{
        ULONGLONG Mbz1	: 1;
        ULONGLONG sp32	: 1;
		ULONGLONG sp43	: 1;
		ULONGLONG sp48	: 1;
        ULONGLONG Mbz2	: 60;
    };
    ULONGLONG all;
} M_CTL_21264, *PM_CTL_21264;

//
//  Define DC_CTL - Dcache Control Register
//

typedef union _DC_CTL_21264{
    struct{
        ULONGLONG SetEn : 2;
        ULONGLONG Fhit : 1;
        ULONGLONG Flush : 1;
        ULONGLONG FBadTpar : 1;
        ULONGLONG FBadDecc : 1;
        ULONGLONG DcTagParEn : 1;
        ULONGLONG DcDatErrEn : 1;
        ULONGLONG Mbz1 : 56;
    };
    ULONGLONG all;
} DC_CTL_21264, *PDC_CTL_21264;

//
//  Define DC_STAT - Dcache Status Register
//

typedef union _DC_STAT_21264{
    struct{
        ULONGLONG TPerrP0 : 1;
        ULONGLONG TPerrP1 : 1;
        ULONGLONG EccErrSt : 1;
        ULONGLONG EccErrLd : 1;
        ULONGLONG Seo : 1;
        ULONGLONG Raz1 : 59;
    };
    ULONGLONG all;
} DC_STAT_21264, *PDC_STAT_21264;

        
//
// Define Cbox Internal Processor Registers.
//

//
// Define CSTAT field in CBOX read IPR
//

typedef union _C_STAT_21264 {
    struct {
        ULONGLONG       ErrorQualifier  :3;
        ULONGLONG       IstreamError    :1;
        ULONGLONG       DoubleBitError  :1;
        ULONGLONG       Reserved        :59;
    };
    ULONGLONG all;
} C_STAT_21264, *PC_STAT_21264;


// SjBfix. CBOX Register chain not defined yet.



//
// Define the Interrupt Mask structure communicated between the 
// HAL and PALcode.
//
// This is the bit defintion for the IRQL fields that are stored
// in the PCR IrqlTable. Keep it the same as on EV4.
//

typedef struct _IETEntry_21264{
    ULONG ApcEnable: 1;
    ULONG DispatchEnable: 1;
    ULONG PerformanceCounter0Enable: 1;
    ULONG PerformanceCounter1Enable: 1;
    ULONG CorrectableReadEnable: 1;
    ULONG Irq0Enable: 1;
    ULONG Irq1Enable: 1;
    ULONG Irq2Enable: 1;
    ULONG Irq3Enable: 1;
    ULONG Irq4Enable: 1;
    ULONG Irq5Enable: 1;
    ULONG Reserved: 21;
} IETEntry_21264, *PIETEntry_21264;

//
// Define the offsets and sizes of the mask sub-tables within the interrupt
// mask table in the PCR.
//

#define IRQLMASK_HDW_SUBTABLE_21264 (8)
#define IRQLMASK_HDW_SUBTABLE_21264_ENTRIES (64)

#define IRQLMASK_SFW_SUBTABLE_21264 (0)
#define IRQLMASK_SFW_SUBTABLE_21264_ENTRIES (4)

#define IRQLMASK_PC_SUBTABLE_21264  (4)
#define IRQLMASK_PC_SUBTABLE_21264_ENTRIES (4)

//
// HACKHACK - this should probably be in a table
//
#define EV6_CRD_VECTOR (25)

//
// PALcode Event Counters for the 21264
// This is the structure of the data returned by the rdcounters call pal.
//

typedef struct _COUNTERS_21264{
    ULONGLONG MachineCheckCount;
    ULONGLONG ArithmeticExceptionCount;
    ULONGLONG InterruptCount;
    ULONGLONG ItbMissCount;
    ULONGLONG DtbMissSingleCount;
    ULONGLONG DtbMissDoubleCount;
    ULONGLONG IAccvioCount;
    ULONGLONG DfaultCount;
    ULONGLONG UnalignedCount;
    ULONGLONG OpcdecCount;
    ULONGLONG FenCount;
    ULONGLONG ItbTnvCount;
    ULONGLONG DtbTnvCount;
    ULONGLONG PdeTnvCount;
    ULONGLONG FPCRCount;
    ULONGLONG RestCount;
    ULONGLONG DtbMissDouble4Count;
    ULONGLONG HardwareInterruptCount;
    ULONGLONG SoftwareInterruptCount;
    ULONGLONG SpecialInterruptCount;
    ULONGLONG HaltCount;
    ULONGLONG RestartCount;
    ULONGLONG DrainaCount;
    ULONGLONG RebootCount;
    ULONGLONG InitpalCount;
    ULONGLONG WrentryCount;
    ULONGLONG SwpirqlCount;
    ULONGLONG RdirqlCount;
    ULONGLONG DiCount;
    ULONGLONG EiCount;
    ULONGLONG SwppalCount;
    ULONGLONG SsirCount;
    ULONGLONG CsirCount;
    ULONGLONG RfeCount;
    ULONGLONG RetsysCount;
    ULONGLONG SwpctxCount;
    ULONGLONG SwpprocessCount;
    ULONGLONG RdmcesCount;
    ULONGLONG WrmcesCount;
    ULONGLONG TbiaCount;
    ULONGLONG TbisCount;
    ULONGLONG TbisasnCount;
    ULONGLONG DtbisCount;
    ULONGLONG RdkspCount;
    ULONGLONG SwpkspCount;
    ULONGLONG RdpsrCount;
    ULONGLONG RdpcrCount;
    ULONGLONG RdthreadCount;
    ULONGLONG TbimCount;
    ULONGLONG TbimasnCount;
    ULONGLONG RdcountersCount;
    ULONGLONG RdstateCount;
    ULONGLONG WrperfmonCount;
    ULONGLONG InitpcrCount;
    ULONGLONG BptCount;
    ULONGLONG CallsysCount;
    ULONGLONG ImbCount;
    ULONGLONG GentrapCount;
    ULONGLONG RdtebCount;
    ULONGLONG KbptCount;
    ULONGLONG CallkdCount;
    ULONGLONG AddressSpaceSwapCount;
    ULONGLONG AsnWrapCount;
    ULONGLONG EalnfixCount;
    ULONGLONG DalnfixCount;
    ULONGLONG SleepCount;
    ULONGLONG Misc1Count;
    ULONGLONG Misc2Count;
    ULONGLONG Misc3Count;
    ULONGLONG Misc4Count;
    ULONGLONG Misc5Count;
    ULONGLONG Misc6Count;
    ULONGLONG Misc7Count;
    ULONGLONG Misc8Count;
    ULONGLONG Misc9Count;
    ULONGLONG Misc10Count;
    ULONGLONG Misc11Count;
    ULONGLONG Misc12Count;
    ULONGLONG Misc13Count;
    ULONGLONG Misc14Count;
    ULONGLONG Misc15Count;
    ULONGLONG Misc16Count;
    ULONGLONG Misc17Count;
} COUNTERS_21264, *PCOUNTERS_21264;

//
// Types of performance counters.
//

typedef enum _AXP21264_PCCOUNTER{
	Ev6PerformanceCounter0 = 0,
	Ev6PerformanceCounter1 = 1,
} AXP21264_PCCOUNTER, *PAXP21264_PCCOUNTER;

//
// Mux control values
//

typedef enum _AXP21264_PCMUXCONTROL{
    //
    //  Mux values for PCTR1:
    //
    Ev6Instructions = 0x00,
    Ev6CondBranches = 0x01,
    Ev6Mispredicts = 0x02,
    Ev6ITBMisses = 0x03,
    Ev6DTBMisses = 0x04,
    Ev6Unaligned = 0x05,
    Ev6IcacheMisses = 0x06,
    Ev6ReplayTraps = 0x07,
    Ev6LoadMisses = 0x08,
    Ev6DcacheMisses = 0x09,
    Ev6BcacheReads = 0x0a,
    Ev6BcacheWrites = 0x0b,
    Ev6SysPortReads = 0x0c,
    Ev6SysPortWrites = 0x0d,
    Ev6MBStalls = 0x0e,             // SjBfix. Not documented
    Ev6StcStalls = 0x0f,            // SjBfix. Not documented

    //
    //  Mux values for PCTR0:
    //
    Ev6Cycles = 0x00,
    Ev6RetiredInstructions = 0x01

} AXP21264_PCMUXCONTROL, *PAXP21264_PCMUXCONTROL;


//
// Internal processor state record.
// This is the structure of the data returned by the rdstate call pal.
//

typedef struct _PROCESSOR_STATE_21264{
    IER_CM_21264 IerCm;
    SIRR_21264 Sirr;
    ISUM_21264 Isum;
    EXC_SUM_21264 ExcSum;
    ULONGLONG PalBase;
    I_CTL_21264 ICtl;
    I_STAT_21264 IStat;
    PCTX_21264 PCtx;
    PCTR_CTL_21264 PCtr;
    MM_STAT_21264 MmStat;
    DC_STAT_21264 DcStat;

} PROCESSOR_STATE_21264, *PPROCESSOR_STATE_21264;

//
// Machine-check logout frame.
//

typedef struct _LOGOUT_FRAME_21264{
    ULONG               FrameSize;
    ULONG               RSDC;
    ULONG               CpuAreaOffset;
    ULONG               SystemAreaOffset;
    ULONG               MchkCode;
    ULONG               MchkFrameRev;
    I_STAT_21264        IStat;
    DC_STAT_21264       DcStat;
    ULONGLONG           CAddr;
    ULONGLONG           Dc1Syndrome;
    ULONGLONG           Dc0Syndrome;
    ULONGLONG           CStat;
    ULONGLONG           CSts;
    ULONGLONG           Va;
    ULONGLONG           ExcAddr;
    IER_CM_21264        IerCm;
    ISUM_21264          ISum;
    MM_STAT_21264       MmStat;
    ULONGLONG           PalBase;
    I_CTL_21264         ICtl;
    PCTX_21264          PCtx;
    VA_CTL_21264        VaCtl;
    ULONGLONG           Ps;
} LOGOUT_FRAME_21264, *PLOGOUT_FRAME_21264;

//
// Correctable logout frame
//

typedef struct _CORRECTABLE_FRAME_21264 {
    ULONG               FrameSize;
    ULONG               RSDC;
    ULONG               CpuAreaOffset;
    ULONG               SystemAreaOffset;
    ULONG               MchkCode;
    ULONG               MchkFrameRev;
    I_STAT_21264        IStat;
    DC_STAT_21264       DCStat;
    ULONGLONG           CAddr;
    ULONGLONG           Dc1Syndrome;
    ULONGLONG           Dc0Syndrome;
    ULONGLONG           CStat;
    ULONGLONG           CSts;
    ULONGLONG           MmStat;
} CORRECTABLE_FRAME_21264, *PCORRECTABLE_FRAME_21264;

//
// Define the number of physical and virtual address bits
//

#define EV6_PHYSICAL_ADDRESS_BITS       44
#define EV6_VIRTUAL_ADDRESS_BITS        43

#endif //!_AXP21264_