Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/include/smp/apic.h

    rda1bafb rd99c1d2  
    2727 */
    2828
    29 /** @addtogroup ia32
     29/** @addtogroup ia32   
    3030 * @{
    3131 */
     
    3939#include <cpu.h>
    4040
    41 #define FIXED  (0 << 0)
    42 #define LOPRI  (1 << 0)
    43 
    44 #define APIC_ID_COUNT  16
     41#define FIXED           (0<<0)
     42#define LOPRI           (1<<0)
     43
     44#define APIC_ID_COUNT   16
    4545
    4646/* local APIC macros */
    47 #define IPI_INIT     0
    48 #define IPI_STARTUP  0
     47#define IPI_INIT        0
     48#define IPI_STARTUP     0
    4949
    5050/** Delivery modes. */
    51 #define DELMOD_FIXED    0x0
    52 #define DELMOD_LOWPRI   0x1
    53 #define DELMOD_SMI      0x2
     51#define DELMOD_FIXED    0x0
     52#define DELMOD_LOWPRI   0x1
     53#define DELMOD_SMI      0x2
    5454/* 0x3 reserved */
    55 #define DELMOD_NMI      0x4
    56 #define DELMOD_INIT     0x5
    57 #define DELMOD_STARTUP  0x6
    58 #define DELMOD_EXTINT   0x7
     55#define DELMOD_NMI      0x4
     56#define DELMOD_INIT     0x5
     57#define DELMOD_STARTUP  0x6
     58#define DELMOD_EXTINT   0x7
    5959
    6060/** Destination modes. */
    61 #define DESTMOD_PHYS   0x0
    62 #define DESTMOD_LOGIC  0x1
     61#define DESTMOD_PHYS    0x0
     62#define DESTMOD_LOGIC   0x1
    6363
    6464/** Trigger Modes. */
    65 #define TRIGMOD_EDGE   0x0
    66 #define TRIGMOD_LEVEL  0x1
     65#define TRIGMOD_EDGE    0x0
     66#define TRIGMOD_LEVEL   0x1
    6767
    6868/** Levels. */
    69 #define LEVEL_DEASSERT  0x0
    70 #define LEVEL_ASSERT    0x1
     69#define LEVEL_DEASSERT  0x0
     70#define LEVEL_ASSERT    0x1
    7171
    7272/** Destination Shorthands. */
    73 #define SHORTHAND_NONE      0x0
    74 #define SHORTHAND_SELF      0x1
    75 #define SHORTHAND_ALL_INCL  0x2
    76 #define SHORTHAND_ALL_EXCL  0x3
     73#define SHORTHAND_NONE          0x0
     74#define SHORTHAND_SELF          0x1
     75#define SHORTHAND_ALL_INCL      0x2
     76#define SHORTHAND_ALL_EXCL      0x3
    7777
    7878/** Interrupt Input Pin Polarities. */
    79 #define POLARITY_HIGH  0x0
    80 #define POLARITY_LOW   0x1
     79#define POLARITY_HIGH   0x0
     80#define POLARITY_LOW    0x1
    8181
    8282/** Divide Values. (Bit 2 is always 0) */
    83 #define DIVIDE_2    0x0
    84 #define DIVIDE_4    0x1
    85 #define DIVIDE_8    0x2
    86 #define DIVIDE_16   0x3
    87 #define DIVIDE_32   0x8
    88 #define DIVIDE_64   0x9
    89 #define DIVIDE_128  0xa
    90 #define DIVIDE_1    0xb
     83#define DIVIDE_2        0x0
     84#define DIVIDE_4        0x1
     85#define DIVIDE_8        0x2
     86#define DIVIDE_16       0x3
     87#define DIVIDE_32       0x8
     88#define DIVIDE_64       0x9
     89#define DIVIDE_128      0xa
     90#define DIVIDE_1        0xb
    9191
    9292/** Timer Modes. */
    93 #define TIMER_ONESHOT   0x0
    94 #define TIMER_PERIODIC  0x1
     93#define TIMER_ONESHOT   0x0
     94#define TIMER_PERIODIC  0x1
    9595
    9696/** Delivery status. */
    97 #define DELIVS_IDLE     0x0
    98 #define DELIVS_PENDING  0x1
     97#define DELIVS_IDLE     0x0
     98#define DELIVS_PENDING  0x1
    9999
    100100/** Destination masks. */
    101 #define DEST_ALL  0xff
     101#define DEST_ALL        0xff
    102102
    103103/** Dest format models. */
    104 #define MODEL_FLAT     0xf
    105 #define MODEL_CLUSTER  0x0
     104#define MODEL_FLAT      0xf
     105#define MODEL_CLUSTER   0x0
    106106
    107107/** Interrupt Command Register. */
    108 #define ICRlo  (0x300 / sizeof(uint32_t))
    109 #define ICRhi  (0x310 / sizeof(uint32_t))
    110 
     108#define ICRlo           (0x300 / sizeof(uint32_t))
     109#define ICRhi           (0x310 / sizeof(uint32_t))
    111110typedef struct {
    112111        union {
    113112                uint32_t lo;
    114113                struct {
    115                         uint8_t vector;                 /**< Interrupt Vector. */
    116                         unsigned int delmod : 3;        /**< Delivery Mode. */
    117                         unsigned int destmod : 1;       /**< Destination Mode. */
    118                         unsigned int delivs : 1;        /**< Delivery status (RO). */
    119                         unsigned int : 1;               /**< Reserved. */
    120                         unsigned int level : 1;         /**< Level. */
    121                         unsigned int trigger_mode : 1;  /**< Trigger Mode. */
    122                         unsigned int : 2;               /**< Reserved. */
    123                         unsigned int shorthand : 2;     /**< Destination Shorthand. */
    124                         unsigned int : 12;              /**< Reserved. */
     114                        uint8_t vector;                 /**< Interrupt Vector. */
     115                        unsigned delmod : 3;            /**< Delivery Mode. */
     116                        unsigned destmod : 1;           /**< Destination Mode. */
     117                        unsigned delivs : 1;            /**< Delivery status (RO). */
     118                        unsigned : 1;                   /**< Reserved. */
     119                        unsigned level : 1;             /**< Level. */
     120                        unsigned trigger_mode : 1;      /**< Trigger Mode. */
     121                        unsigned : 2;                   /**< Reserved. */
     122                        unsigned shorthand : 2;         /**< Destination Shorthand. */
     123                        unsigned : 12;                  /**< Reserved. */
    125124                } __attribute__ ((packed));
    126125        };
     
    128127                uint32_t hi;
    129128                struct {
    130                         unsigned int : 24;  /**< Reserved. */
    131                         uint8_t dest;       /**< Destination field. */
     129                        unsigned : 24;                  /**< Reserved. */
     130                        uint8_t dest;                   /**< Destination field. */
    132131                } __attribute__ ((packed));
    133132        };
     
    135134
    136135/* End Of Interrupt. */
    137 #define EOI  (0x0b0 / sizeof(uint32_t))
     136#define EOI             (0x0b0 / sizeof(uint32_t))
    138137
    139138/** Error Status Register. */
    140 #define ESR  (0x280 / sizeof(uint32_t))
    141 
     139#define ESR             (0x280 / sizeof(uint32_t))
    142140typedef union {
    143141        uint32_t value;
    144142        uint8_t err_bitmap;
    145143        struct {
    146                 unsigned int send_checksum_error : 1;
    147                 unsigned int receive_checksum_error : 1;
    148                 unsigned int send_accept_error : 1;
    149                 unsigned int receive_accept_error : 1;
    150                 unsigned int : 1;
    151                 unsigned int send_illegal_vector : 1;
    152                 unsigned int received_illegal_vector : 1;
    153                 unsigned int illegal_register_address : 1;
    154                 unsigned int : 24;
     144                unsigned send_checksum_error : 1;
     145                unsigned receive_checksum_error : 1;
     146                unsigned send_accept_error : 1;
     147                unsigned receive_accept_error : 1;
     148                unsigned : 1;
     149                unsigned send_illegal_vector : 1;
     150                unsigned received_illegal_vector : 1;
     151                unsigned illegal_register_address : 1;
     152                unsigned : 24;
    155153        } __attribute__ ((packed));
    156154} esr_t;
    157155
    158156/* Task Priority Register */
    159 #define TPR  (0x080 / sizeof(uint32_t))
    160 
    161 typedef union {
    162         uint32_t value;
    163         struct {
    164                 unsigned int pri_sc : 4;  /**< Task Priority Sub-Class. */
    165                 unsigned int pri : 4;     /**< Task Priority. */
     157#define TPR             (0x080 / sizeof(uint32_t))
     158typedef union {
     159        uint32_t value;
     160        struct {
     161                unsigned pri_sc : 4;            /**< Task Priority Sub-Class. */
     162                unsigned pri : 4;               /**< Task Priority. */
    166163        } __attribute__ ((packed));
    167164} tpr_t;
    168165
    169166/** Spurious-Interrupt Vector Register. */
    170 #define SVR  (0x0f0 / sizeof(uint32_t))
    171 
    172 typedef union {
    173         uint32_t value;
    174         struct {
    175                 uint8_t vector;                   /**< Spurious Vector. */
    176                 unsigned int lapic_enabled : 1;   /**< APIC Software Enable/Disable. */
    177                 unsigned int focus_checking : 1;  /**< Focus Processor Checking. */
    178                 unsigned int : 22;                /**< Reserved. */
     167#define SVR             (0x0f0 / sizeof(uint32_t))
     168typedef union {
     169        uint32_t value;
     170        struct {
     171                uint8_t vector;                 /**< Spurious Vector. */
     172                unsigned lapic_enabled : 1;     /**< APIC Software Enable/Disable. */
     173                unsigned focus_checking : 1;    /**< Focus Processor Checking. */
     174                unsigned : 22;                  /**< Reserved. */
    179175        } __attribute__ ((packed));
    180176} svr_t;
    181177
    182178/** Time Divide Configuration Register. */
    183 #define TDCR  (0x3e0 / sizeof(uint32_t))
    184 
    185 typedef union {
    186         uint32_t value;
    187         struct {
    188                 unsigned int div_value : 4;  /**< Divide Value, bit 2 is always 0. */
    189                 unsigned int : 28;           /**< Reserved. */
     179#define TDCR            (0x3e0 / sizeof(uint32_t))
     180typedef union {
     181        uint32_t value;
     182        struct {
     183                unsigned div_value : 4;         /**< Divide Value, bit 2 is always 0. */
     184                unsigned : 28;                  /**< Reserved. */
    190185        } __attribute__ ((packed));
    191186} tdcr_t;
    192187
    193188/* Initial Count Register for Timer */
    194 #define ICRT  (0x380 / sizeof(uint32_t))
     189#define ICRT            (0x380 / sizeof(uint32_t))
    195190
    196191/* Current Count Register for Timer */
    197 #define CCRT  (0x390 / sizeof(uint32_t))
     192#define CCRT            (0x390 / sizeof(uint32_t))
    198193
    199194/** LVT Timer register. */
    200 #define LVT_Tm  (0x320 / sizeof(uint32_t))
    201 
    202 typedef union {
    203         uint32_t value;
    204         struct {
    205                 uint8_t vector;           /**< Local Timer Interrupt vector. */
    206                 unsigned int : 4;         /**< Reserved. */
    207                 unsigned int delivs : 1;  /**< Delivery status (RO). */
    208                 unsigned int : 3;         /**< Reserved. */
    209                 unsigned int masked : 1;  /**< Interrupt Mask. */
    210                 unsigned int mode : 1;    /**< Timer Mode. */
    211                 unsigned int : 14;        /**< Reserved. */
     195#define LVT_Tm          (0x320 / sizeof(uint32_t))
     196typedef union {
     197        uint32_t value;
     198        struct {
     199                uint8_t vector;         /**< Local Timer Interrupt vector. */
     200                unsigned : 4;           /**< Reserved. */
     201                unsigned delivs : 1;    /**< Delivery status (RO). */
     202                unsigned : 3;           /**< Reserved. */
     203                unsigned masked : 1;    /**< Interrupt Mask. */
     204                unsigned mode : 1;      /**< Timer Mode. */
     205                unsigned : 14;          /**< Reserved. */
    212206        } __attribute__ ((packed));
    213207} lvt_tm_t;
    214208
    215209/** LVT LINT registers. */
    216 #define LVT_LINT0  (0x350 / sizeof(uint32_t))
    217 #define LVT_LINT1  (0x360 / sizeof(uint32_t))
    218 
    219 typedef union {
    220         uint32_t value;
    221         struct {
    222                 uint8_t vector;                 /**< LINT Interrupt vector. */
    223                 unsigned int delmod : 3;        /**< Delivery Mode. */
    224                 unsigned int : 1;               /**< Reserved. */
    225                 unsigned int delivs : 1;        /**< Delivery status (RO). */
    226                 unsigned int intpol : 1;        /**< Interrupt Input Pin Polarity. */
    227                 unsigned int irr : 1;           /**< Remote IRR (RO). */
    228                 unsigned int trigger_mode : 1;  /**< Trigger Mode. */
    229                 unsigned int masked : 1;        /**< Interrupt Mask. */
    230                 unsigned int : 15;              /**< Reserved. */
     210#define LVT_LINT0       (0x350 / sizeof(uint32_t))
     211#define LVT_LINT1       (0x360 / sizeof(uint32_t))
     212typedef union {
     213        uint32_t value;
     214        struct {
     215                uint8_t vector;                 /**< LINT Interrupt vector. */
     216                unsigned delmod : 3;            /**< Delivery Mode. */
     217                unsigned : 1;                   /**< Reserved. */
     218                unsigned delivs : 1;            /**< Delivery status (RO). */
     219                unsigned intpol : 1;            /**< Interrupt Input Pin Polarity. */
     220                unsigned irr : 1;               /**< Remote IRR (RO). */
     221                unsigned trigger_mode : 1;      /**< Trigger Mode. */
     222                unsigned masked : 1;            /**< Interrupt Mask. */
     223                unsigned : 15;                  /**< Reserved. */
    231224        } __attribute__ ((packed));
    232225} lvt_lint_t;
    233226
    234227/** LVT Error register. */
    235 #define LVT_Err  (0x370 / sizeof(uint32_t))
    236 
    237 typedef union {
    238         uint32_t value;
    239         struct {
    240                 uint8_t vector;           /**< Local Timer Interrupt vector. */
    241                 unsigned int : 4;         /**< Reserved. */
    242                 unsigned int delivs : 1;  /**< Delivery status (RO). */
    243                 unsigned int : 3;         /**< Reserved. */
    244                 unsigned int masked : 1;  /**< Interrupt Mask. */
    245                 unsigned int : 15;        /**< Reserved. */
     228#define LVT_Err         (0x370 / sizeof(uint32_t))
     229typedef union {
     230        uint32_t value;
     231        struct {
     232                uint8_t vector;         /**< Local Timer Interrupt vector. */
     233                unsigned : 4;           /**< Reserved. */
     234                unsigned delivs : 1;    /**< Delivery status (RO). */
     235                unsigned : 3;           /**< Reserved. */
     236                unsigned masked : 1;    /**< Interrupt Mask. */
     237                unsigned : 15;          /**< Reserved. */
    246238        } __attribute__ ((packed));
    247239} lvt_error_t;
    248240
    249241/** Local APIC ID Register. */
    250 #define L_APIC_ID  (0x020 / sizeof(uint32_t))
    251 
    252 typedef union {
    253         uint32_t value;
    254         struct {
    255                 unsigned int : 24;  /**< Reserved. */
    256                 uint8_t apic_id;    /**< Local APIC ID. */
     242#define L_APIC_ID       (0x020 / sizeof(uint32_t))
     243typedef union {
     244        uint32_t value;
     245        struct {
     246                unsigned : 24;          /**< Reserved. */
     247                uint8_t apic_id;                /**< Local APIC ID. */
    257248        } __attribute__ ((packed));
    258249} l_apic_id_t;
    259250
    260251/** Local APIC Version Register */
    261 #define LAVR       (0x030 / sizeof(uint32_t))
    262 #define LAVR_Mask  0xff
    263 
    264 #define is_local_apic(x)    (((x) & LAVR_Mask & 0xf0) == 0x1)
    265 #define is_82489DX_apic(x)  ((((x) & LAVR_Mask & 0xf0) == 0x0))
    266 #define is_local_xapic(x)   (((x) & LAVR_Mask) == 0x14)
     252#define LAVR            (0x030 / sizeof(uint32_t))
     253#define LAVR_Mask       0xff
     254#define is_local_apic(x)        (((x) & LAVR_Mask & 0xf0) == 0x1)
     255#define is_82489DX_apic(x)      ((((x) & LAVR_Mask & 0xf0) == 0x0))
     256#define is_local_xapic(x)       (((x) & LAVR_Mask) == 0x14)
    267257
    268258/** Logical Destination Register. */
    269 #define  LDR  (0x0d0 / sizeof(uint32_t))
    270 
    271 typedef union {
    272         uint32_t value;
    273         struct {
    274                 unsigned int : 24;  /**< Reserved. */
    275                 uint8_t id;         /**< Logical APIC ID. */
     259#define  LDR            (0x0d0 / sizeof(uint32_t))
     260typedef union {
     261        uint32_t value;
     262        struct {
     263                unsigned : 24;          /**< Reserved. */
     264                uint8_t id;             /**< Logical APIC ID. */
    276265        } __attribute__ ((packed));
    277266} ldr_t;
    278267
    279268/** Destination Format Register. */
    280 #define DFR  (0x0e0 / sizeof(uint32_t))
    281 
    282 typedef union {
    283         uint32_t value;
    284         struct {
    285                 unsigned int : 28;       /**< Reserved, all ones. */
    286                 unsigned int model : 4;  /**< Model. */
     269#define DFR             (0x0e0 / sizeof(uint32_t))
     270typedef union {
     271        uint32_t value;
     272        struct {
     273                unsigned : 28;          /**< Reserved, all ones. */
     274                unsigned model : 4;     /**< Model. */
    287275        } __attribute__ ((packed));
    288276} dfr_t;
    289277
    290278/* IO APIC */
    291 #define IOREGSEL  (0x00 / sizeof(uint32_t))
    292 #define IOWIN     (0x10 / sizeof(uint32_t))
    293 
    294 #define IOAPICID   0x00
    295 #define IOAPICVER  0x01
    296 #define IOAPICARB  0x02
    297 #define IOREDTBL   0x10
     279#define IOREGSEL        (0x00 / sizeof(uint32_t))
     280#define IOWIN           (0x10 / sizeof(uint32_t))
     281
     282#define IOAPICID        0x00
     283#define IOAPICVER       0x01
     284#define IOAPICARB       0x02
     285#define IOREDTBL        0x10
    298286
    299287/** I/O Register Select Register. */
     
    301289        uint32_t value;
    302290        struct {
    303                 uint8_t reg_addr;   /**< APIC Register Address. */
    304                 unsigned int : 24;  /**< Reserved. */
     291                uint8_t reg_addr;               /**< APIC Register Address. */
     292                unsigned : 24;          /**< Reserved. */
    305293        } __attribute__ ((packed));
    306294} io_regsel_t;
     
    311299                uint32_t lo;
    312300                struct {
    313                         uint8_t intvec;                 /**< Interrupt Vector. */
    314                         unsigned int delmod : 3;        /**< Delivery Mode. */
    315                         unsigned int destmod : 1;       /**< Destination mode. */
    316                         unsigned int delivs : 1;        /**< Delivery status (RO). */
    317                         unsigned int intpol : 1;        /**< Interrupt Input Pin Polarity. */
    318                         unsigned int irr : 1;           /**< Remote IRR (RO). */
    319                         unsigned int trigger_mode : 1;  /**< Trigger Mode. */
    320                         unsigned int masked : 1;        /**< Interrupt Mask. */
    321                         unsigned int : 15;              /**< Reserved. */
     301                        uint8_t intvec;                 /**< Interrupt Vector. */
     302                        unsigned delmod : 3;            /**< Delivery Mode. */
     303                        unsigned destmod : 1;           /**< Destination mode. */
     304                        unsigned delivs : 1;            /**< Delivery status (RO). */
     305                        unsigned intpol : 1;            /**< Interrupt Input Pin Polarity. */
     306                        unsigned irr : 1;               /**< Remote IRR (RO). */
     307                        unsigned trigger_mode : 1;      /**< Trigger Mode. */
     308                        unsigned masked : 1;            /**< Interrupt Mask. */
     309                        unsigned : 15;                  /**< Reserved. */
    322310                } __attribute__ ((packed));
    323311        };
     
    325313                uint32_t hi;
    326314                struct {
    327                         unsigned int : 24;  /**< Reserved. */
    328                         uint8_t dest : 8;   /**< Destination Field. */
     315                        unsigned : 24;                  /**< Reserved. */
     316                        uint8_t dest : 8;                       /**< Destination Field. */
    329317                } __attribute__ ((packed));
    330318        };
     
    337325        uint32_t value;
    338326        struct {
    339                 unsigned int : 24;         /**< Reserved. */
    340                 unsigned int apic_id : 4;  /**< IO APIC ID. */
    341                 unsigned int : 4;          /**< Reserved. */
     327                unsigned : 24;          /**< Reserved. */
     328                unsigned apic_id : 4;   /**< IO APIC ID. */
     329                unsigned : 4;           /**< Reserved. */
    342330        } __attribute__ ((packed));
    343331} io_apic_id_t;
     
    352340extern void l_apic_init(void);
    353341extern void l_apic_eoi(void);
    354 extern int l_apic_broadcast_custom_ipi(uint8_t);
    355 extern int l_apic_send_init_ipi(uint8_t);
     342extern int l_apic_broadcast_custom_ipi(uint8_t vector);
     343extern int l_apic_send_init_ipi(uint8_t apicid);
    356344extern void l_apic_debug(void);
    357345extern uint8_t l_apic_id(void);
    358346
    359 extern uint32_t io_apic_read(uint8_t);
    360 extern void io_apic_write(uint8_t, uint32_t);
    361 extern void io_apic_change_ioredtbl(uint8_t pin, uint8_t dest, uint8_t v, unsigned int);
    362 extern void io_apic_disable_irqs(uint16_t);
    363 extern void io_apic_enable_irqs(uint16_t);
     347extern uint32_t io_apic_read(uint8_t address);
     348extern void io_apic_write(uint8_t address , uint32_t x);
     349extern void io_apic_change_ioredtbl(uint8_t pin, uint8_t dest, uint8_t v, int flags);
     350extern void io_apic_disable_irqs(uint16_t irqmask);
     351extern void io_apic_enable_irqs(uint16_t irqmask);
    364352
    365353#endif
Note: See TracChangeset for help on using the changeset viewer.