Changeset 8418c7d in mainline for arch/ia32/src/smp/apic.c


Ignore:
Timestamp:
2005-11-23T17:19:32Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f701b236
Parents:
a83a802
Message:

APIC code cleanup.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/ia32/src/smp/apic.c

    ra83a802 r8418c7d  
    4444 * Tested on:
    4545 *      Bochs 2.0.2 - Bochs 2.2 with 2-8 CPUs
    46  *      Simics 2.0.28 - Simics 2.2.14 2-4 CPUs
     46 *      Simics 2.0.28 - Simics 2.2.19 2-8 CPUs
    4747 *      ASUS P/I-P65UP5 + ASUS C-P55T2D REV. 1.41 with 2x 200Mhz Pentium CPUs
    4848 *      ASUS PCH-DL with 2x 3000Mhz Pentium 4 Xeon (HT) CPUs
     
    6565int apic_poll_errors(void);
    6666
     67/** Initialize APIC on BSP. */
    6768void apic_init(void)
    6869{
     
    8687       
    8788                if ((pin = smp_irq_to_pin(i)) != -1) {
    88                         io_apic_change_ioredtbl(pin,0xff,IVT_IRQBASE+i,LOPRI);
     89                        io_apic_change_ioredtbl(pin, 0xff, IVT_IRQBASE+i, LOPRI);
    8990                }
    9091        }
     
    148149int l_apic_broadcast_custom_ipi(__u8 vector)
    149150{
    150         __u32 lo;
    151 
    152         /*
    153          * Read the ICR register in and zero all non-reserved fields.
    154          */
    155         lo = l_apic[ICRlo] & ICRloClear;
    156 
    157         lo |= DLVRMODE_FIXED | DESTMODE_LOGIC | LEVEL_ASSERT | SHORTHAND_EXCL | TRGRMODE_LEVEL | vector;
    158        
    159         l_apic[ICRlo] = lo;
    160 
    161         lo = l_apic[ICRlo] & ICRloClear;
    162         if (lo & SEND_PENDING)
     151        icr_t icr;
     152
     153        icr.lo = l_apic[ICRlo];
     154        icr.delmod = DELMOD_FIXED;
     155        icr.destmod = DESTMOD_LOGIC;
     156        icr.level = LEVEL_ASSERT;
     157        icr.shorthand = SHORTHAND_ALL_EXCL;
     158        icr.trigger_mode = TRIGMOD_LEVEL;
     159        icr.vector = vector;
     160
     161        l_apic[ICRlo] = icr.lo;
     162
     163        icr.lo = l_apic[ICRlo];
     164        if (icr.lo & SEND_PENDING)
    163165                printf("IPI is pending.\n");
    164166
     
    171173int l_apic_send_init_ipi(__u8 apicid)
    172174{
    173         __u32 lo, hi;
     175        icr_t icr;
    174176        int i;
    175177
     
    177179         * Read the ICR register in and zero all non-reserved fields.
    178180         */
    179         lo = l_apic[ICRlo] & ICRloClear;
    180         hi = l_apic[ICRhi] & ICRhiClear;
    181        
    182         lo |= DLVRMODE_INIT | DESTMODE_PHYS | LEVEL_ASSERT | SHORTHAND_DEST | TRGRMODE_LEVEL;
    183         hi |= apicid << 24;
    184        
    185         l_apic[ICRhi] = hi;
    186         l_apic[ICRlo] = lo;
     181        icr.lo = l_apic[ICRlo];
     182        icr.hi = l_apic[ICRhi];
     183       
     184        icr.delmod = DELMOD_INIT;
     185        icr.destmod = DESTMOD_PHYS;
     186        icr.level = LEVEL_ASSERT;
     187        icr.trigger_mode = TRIGMOD_LEVEL;
     188        icr.shorthand = SHORTHAND_NONE;
     189        icr.vector = 0;
     190        icr.dest = apicid;
     191       
     192        l_apic[ICRhi] = icr.hi;
     193        l_apic[ICRlo] = icr.lo;
    187194
    188195        /*
     
    194201        if (!apic_poll_errors()) return 0;
    195202
    196         lo = l_apic[ICRlo] & ICRloClear;
    197         if (lo & SEND_PENDING)
     203        icr.lo = l_apic[ICRlo];
     204        if (icr.lo & SEND_PENDING)
    198205                printf("IPI is pending.\n");
    199206
    200         l_apic[ICRlo] = lo | DLVRMODE_INIT | DESTMODE_PHYS | LEVEL_DEASSERT | SHORTHAND_DEST | TRGRMODE_LEVEL;
     207        icr.delmod = DELMOD_INIT;
     208        icr.destmod = DESTMOD_PHYS;
     209        icr.level = LEVEL_DEASSERT;
     210        icr.shorthand = SHORTHAND_NONE;
     211        icr.trigger_mode = TRIGMOD_LEVEL;
     212        icr.vector = 0;
     213        l_apic[ICRlo] = icr.lo;
    201214
    202215        /*
     
    210223                 */
    211224                for (i = 0; i<2; i++) {
    212                         lo = l_apic[ICRlo] & ICRloClear;
    213                         lo |= ((__address) ap_boot) / 4096; /* calculate the reset vector */
    214                         l_apic[ICRlo] = lo | DLVRMODE_STUP | DESTMODE_PHYS | LEVEL_ASSERT | SHORTHAND_DEST | TRGRMODE_LEVEL;
     225                        icr.lo = l_apic[ICRlo];
     226                        icr.vector = ((__address) ap_boot) / 4096; /* calculate the reset vector */
     227                        icr.delmod = DELMOD_STARTUP;
     228                        icr.destmod = DESTMOD_PHYS;
     229                        icr.level = LEVEL_ASSERT;
     230                        icr.shorthand = SHORTHAND_NONE;
     231                        icr.trigger_mode = TRIGMOD_LEVEL;
     232                        l_apic[ICRlo] = icr.lo;
    215233                        delay(200);
    216234                }
     
    223241void l_apic_init(void)
    224242{
    225         __u32 tmp, t1, t2;
    226 
    227         l_apic[LVT_Err] |= (1<<16);
    228         l_apic[LVT_LINT0] |= (1<<16);
    229         l_apic[LVT_LINT1] |= (1<<16);
    230 
    231         tmp = l_apic[SVR] & SVRClear;
    232         l_apic[SVR] = tmp | (1<<8) | (VECTOR_APIC_SPUR);
     243        lvt_error_t error;
     244        lvt_lint_t lint;
     245        svr_t svr;
     246        lvt_tm_t tm;
     247        icr_t icr;
     248        __u32 t1, t2;
     249
     250        /* Initialize LVT Error register. */
     251        error.value = l_apic[LVT_Err];
     252        error.masked = true;
     253        l_apic[LVT_Err] = error.value;
     254
     255        /* Initialize LVT LINT0 register. */
     256        lint.value = l_apic[LVT_LINT0];
     257        lint.masked = true;
     258        l_apic[LVT_LINT0] = lint.value;
     259
     260        /* Initialize LVT LINT1 register. */
     261        lint.value = l_apic[LVT_LINT1];
     262        lint.masked = true;
     263        l_apic[LVT_LINT1] = lint.value;
     264       
     265        /* Spurious-Interrupt Vector Register initialization. */
     266        svr.value = l_apic[SVR];
     267        svr.vector = VECTOR_APIC_SPUR;
     268        svr.lapic_enabled = true;
     269        l_apic[SVR] = svr.value;
    233270
    234271        l_apic[TPR] &= TPRClear;
     
    237274                enable_l_apic_in_msr();
    238275       
    239         tmp = l_apic[ICRlo] & ICRloClear;
    240         l_apic[ICRlo] = tmp | DLVRMODE_INIT | DESTMODE_PHYS | LEVEL_DEASSERT | SHORTHAND_INCL | TRGRMODE_LEVEL;
     276        /* Interrupt Command Register initialization. */
     277        icr.lo = l_apic[ICRlo];
     278        icr.delmod = DELMOD_INIT;
     279        icr.destmod = DESTMOD_PHYS;
     280        icr.level = LEVEL_DEASSERT;
     281        icr.shorthand = SHORTHAND_ALL_INCL;
     282        icr.trigger_mode = TRIGMOD_LEVEL;
     283        l_apic[ICRlo] = icr.lo;
    241284       
    242285        /*
     
    246289        l_apic[TDCR] &= TDCRClear;
    247290        l_apic[TDCR] |= 0xb;
    248         tmp = l_apic[LVT_Tm] | (1<<17) | (VECTOR_CLK);
    249         l_apic[LVT_Tm] = tmp & ~(1<<16);
     291
     292        tm.value = l_apic[LVT_Tm];
     293        tm.vector = VECTOR_CLK;
     294        tm.mode = TIMER_PERIODIC;
     295        tm.masked = false;
     296        l_apic[LVT_Tm] = tm.value;
    250297
    251298        t1 = l_apic[CCRT];
Note: See TracChangeset for help on using the changeset viewer.