| /* |
| * Copyright (C) 1997 Geert Uytterhoeven |
| * |
| * This file is based on the following documentation: |
| * |
| * The Open Programmable Interrupt Controller (PIC) |
| * Register Interface Specification Revision 1.2 |
| * |
| * Issue Date: October 1995 |
| * |
| * Issued jointly by Advanced Micro Devices and Cyrix Corporation |
| * |
| * AMD is a registered trademark of Advanced Micro Devices, Inc. |
| * Copyright (C) 1995, Advanced Micro Devices, Inc. and Cyrix, Inc. |
| * All Rights Reserved. |
| * |
| * To receive a copy of this documentation, send an email to openpic@amd.com. |
| * |
| * This file is subject to the terms and conditions of the GNU General Public |
| * License. See the file COPYING in the main directory of this archive |
| * for more details. |
| */ |
| |
| #ifndef _LINUX_OPENPIC_H |
| #define _LINUX_OPENPIC_H |
| |
| #ifdef __KERNEL__ |
| |
| /* |
| * OpenPIC supports up to 2048 interrupt sources and up to 32 processors |
| */ |
| |
| #define OPENPIC_MAX_SOURCES 2048 |
| #define OPENPIC_MAX_PROCESSORS 32 |
| #define OPENPIC_MAX_ISU 16 |
| |
| #define OPENPIC_NUM_TIMERS 4 |
| #define OPENPIC_NUM_IPI 4 |
| #define OPENPIC_NUM_PRI 16 |
| #define OPENPIC_NUM_VECTORS 256 |
| |
| |
| |
| /* |
| * OpenPIC Registers are 32 bits and aligned on 128 bit boundaries |
| */ |
| |
| typedef struct _OpenPIC_Reg { |
| u_int Reg; /* Little endian! */ |
| char Pad[0xc]; |
| } OpenPIC_Reg; |
| |
| |
| /* |
| * Per Processor Registers |
| */ |
| |
| typedef struct _OpenPIC_Processor { |
| /* |
| * Private Shadow Registers (for SLiC backwards compatibility) |
| */ |
| u_int IPI0_Dispatch_Shadow; /* Write Only */ |
| char Pad1[0x4]; |
| u_int IPI0_Vector_Priority_Shadow; /* Read/Write */ |
| char Pad2[0x34]; |
| /* |
| * Interprocessor Interrupt Command Ports |
| */ |
| OpenPIC_Reg _IPI_Dispatch[OPENPIC_NUM_IPI]; /* Write Only */ |
| /* |
| * Current Task Priority Register |
| */ |
| OpenPIC_Reg _Current_Task_Priority; /* Read/Write */ |
| char Pad3[0x10]; |
| /* |
| * Interrupt Acknowledge Register |
| */ |
| OpenPIC_Reg _Interrupt_Acknowledge; /* Read Only */ |
| /* |
| * End of Interrupt (EOI) Register |
| */ |
| OpenPIC_Reg _EOI; /* Read/Write */ |
| char Pad5[0xf40]; |
| } OpenPIC_Processor; |
| |
| |
| /* |
| * Timer Registers |
| */ |
| |
| typedef struct _OpenPIC_Timer { |
| OpenPIC_Reg _Current_Count; /* Read Only */ |
| OpenPIC_Reg _Base_Count; /* Read/Write */ |
| OpenPIC_Reg _Vector_Priority; /* Read/Write */ |
| OpenPIC_Reg _Destination; /* Read/Write */ |
| } OpenPIC_Timer; |
| |
| |
| /* |
| * Global Registers |
| */ |
| |
| typedef struct _OpenPIC_Global { |
| /* |
| * Feature Reporting Registers |
| */ |
| OpenPIC_Reg _Feature_Reporting0; /* Read Only */ |
| OpenPIC_Reg _Feature_Reporting1; /* Future Expansion */ |
| /* |
| * Global Configuration Registers |
| */ |
| OpenPIC_Reg _Global_Configuration0; /* Read/Write */ |
| OpenPIC_Reg _Global_Configuration1; /* Future Expansion */ |
| /* |
| * Vendor Specific Registers |
| */ |
| OpenPIC_Reg _Vendor_Specific[4]; |
| /* |
| * Vendor Identification Register |
| */ |
| OpenPIC_Reg _Vendor_Identification; /* Read Only */ |
| /* |
| * Processor Initialization Register |
| */ |
| OpenPIC_Reg _Processor_Initialization; /* Read/Write */ |
| /* |
| * IPI Vector/Priority Registers |
| */ |
| OpenPIC_Reg _IPI_Vector_Priority[OPENPIC_NUM_IPI]; /* Read/Write */ |
| /* |
| * Spurious Vector Register |
| */ |
| OpenPIC_Reg _Spurious_Vector; /* Read/Write */ |
| /* |
| * Global Timer Registers |
| */ |
| OpenPIC_Reg _Timer_Frequency; /* Read/Write */ |
| OpenPIC_Timer Timer[OPENPIC_NUM_TIMERS]; |
| char Pad1[0xee00]; |
| } OpenPIC_Global; |
| |
| |
| /* |
| * Interrupt Source Registers |
| */ |
| |
| typedef struct _OpenPIC_Source { |
| OpenPIC_Reg _Vector_Priority; /* Read/Write */ |
| OpenPIC_Reg _Destination; /* Read/Write */ |
| } OpenPIC_Source, *OpenPIC_SourcePtr; |
| |
| |
| /* |
| * OpenPIC Register Map |
| */ |
| |
| struct OpenPIC { |
| char Pad1[0x1000]; |
| /* |
| * Global Registers |
| */ |
| OpenPIC_Global Global; |
| /* |
| * Interrupt Source Configuration Registers |
| */ |
| OpenPIC_Source Source[OPENPIC_MAX_SOURCES]; |
| /* |
| * Per Processor Registers |
| */ |
| OpenPIC_Processor Processor[OPENPIC_MAX_PROCESSORS]; |
| }; |
| |
| /* |
| * Current Task Priority Register |
| */ |
| |
| #define OPENPIC_CURRENT_TASK_PRIORITY_MASK 0x0000000f |
| |
| /* |
| * Who Am I Register |
| */ |
| |
| #define OPENPIC_WHO_AM_I_ID_MASK 0x0000001f |
| |
| /* |
| * Feature Reporting Register 0 |
| */ |
| |
| #define OPENPIC_FEATURE_LAST_SOURCE_MASK 0x07ff0000 |
| #define OPENPIC_FEATURE_LAST_SOURCE_SHIFT 16 |
| #define OPENPIC_FEATURE_LAST_PROCESSOR_MASK 0x00001f00 |
| #define OPENPIC_FEATURE_LAST_PROCESSOR_SHIFT 8 |
| #define OPENPIC_FEATURE_VERSION_MASK 0x000000ff |
| |
| /* |
| * Global Configuration Register 0 |
| */ |
| |
| #define OPENPIC_CONFIG_RESET 0x80000000 |
| #define OPENPIC_CONFIG_8259_PASSTHROUGH_DISABLE 0x20000000 |
| #define OPENPIC_CONFIG_BASE_MASK 0x000fffff |
| |
| /* |
| * Global Configuration Register 1 |
| * This is the EICR on EPICs. |
| */ |
| |
| #define OPENPIC_EICR_S_CLK_MASK 0x70000000 |
| #define OPENPIC_EICR_SIE 0x08000000 |
| |
| /* |
| * Vendor Identification Register |
| */ |
| |
| #define OPENPIC_VENDOR_ID_STEPPING_MASK 0x00ff0000 |
| #define OPENPIC_VENDOR_ID_STEPPING_SHIFT 16 |
| #define OPENPIC_VENDOR_ID_DEVICE_ID_MASK 0x0000ff00 |
| #define OPENPIC_VENDOR_ID_DEVICE_ID_SHIFT 8 |
| #define OPENPIC_VENDOR_ID_VENDOR_ID_MASK 0x000000ff |
| |
| /* |
| * Vector/Priority Registers |
| */ |
| |
| #define OPENPIC_MASK 0x80000000 |
| #define OPENPIC_ACTIVITY 0x40000000 /* Read Only */ |
| #define OPENPIC_PRIORITY_MASK 0x000f0000 |
| #define OPENPIC_PRIORITY_SHIFT 16 |
| #define OPENPIC_VECTOR_MASK 0x000000ff |
| |
| |
| /* |
| * Interrupt Source Registers |
| */ |
| |
| #define OPENPIC_POLARITY_POSITIVE 0x00800000 |
| #define OPENPIC_POLARITY_NEGATIVE 0x00000000 |
| #define OPENPIC_POLARITY_MASK 0x00800000 |
| #define OPENPIC_SENSE_LEVEL 0x00400000 |
| #define OPENPIC_SENSE_EDGE 0x00000000 |
| #define OPENPIC_SENSE_MASK 0x00400000 |
| |
| |
| /* |
| * Timer Registers |
| */ |
| |
| #define OPENPIC_COUNT_MASK 0x7fffffff |
| #define OPENPIC_TIMER_TOGGLE 0x80000000 |
| #define OPENPIC_TIMER_COUNT_INHIBIT 0x80000000 |
| |
| |
| /* |
| * Aliases to make life simpler |
| */ |
| |
| /* Per Processor Registers */ |
| #define IPI_Dispatch(i) _IPI_Dispatch[i].Reg |
| #define Current_Task_Priority _Current_Task_Priority.Reg |
| #define Interrupt_Acknowledge _Interrupt_Acknowledge.Reg |
| #define EOI _EOI.Reg |
| |
| /* Global Registers */ |
| #define Feature_Reporting0 _Feature_Reporting0.Reg |
| #define Feature_Reporting1 _Feature_Reporting1.Reg |
| #define Global_Configuration0 _Global_Configuration0.Reg |
| #define Global_Configuration1 _Global_Configuration1.Reg |
| #define Vendor_Specific(i) _Vendor_Specific[i].Reg |
| #define Vendor_Identification _Vendor_Identification.Reg |
| #define Processor_Initialization _Processor_Initialization.Reg |
| #define IPI_Vector_Priority(i) _IPI_Vector_Priority[i].Reg |
| #define Spurious_Vector _Spurious_Vector.Reg |
| #define Timer_Frequency _Timer_Frequency.Reg |
| |
| /* Timer Registers */ |
| #define Current_Count _Current_Count.Reg |
| #define Base_Count _Base_Count.Reg |
| #define Vector_Priority _Vector_Priority.Reg |
| #define Destination _Destination.Reg |
| |
| /* Interrupt Source Registers */ |
| #define Vector_Priority _Vector_Priority.Reg |
| #define Destination _Destination.Reg |
| |
| #endif /* __KERNEL__ */ |
| |
| #endif /* _LINUX_OPENPIC_H */ |