Changeset a83a802 in mainline


Ignore:
Timestamp:
2005-11-23T13:28:17Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
8418c7d
Parents:
607c5f9
Message:

SMP work.
Add madt_irq_to_pin().
Make ksmp() use virtual irq_to_pin() function, which makes better sence for ACPI configurations.

Files:
13 edited

Legend:

Unmodified
Added
Removed
  • arch/amd64/src/amd64.c

    r607c5f9 ra83a802  
    7070        if (config.cpu_active == 1) {
    7171                bios_init();
    72                 i8042_init();   /* a20 bit */
    7372                i8259_init();   /* PIC */
    7473                i8254_init();   /* hard clock */
     
    103102void arch_post_smp_init(void)
    104103{
    105         trap_virtual_enable_irqs(1<<IRQ_KBD);
     104                i8042_init();   /* keyboard controller */
    106105}
    107106
  • arch/ia32/include/smp/apic.h

    r607c5f9 ra83a802  
    115115#define IOREDTBL        0x10
    116116
     117/** Delivery modes. */
     118#define DELMOD_FIXED    0x0
     119#define DELMOD_LOWPRI   0x1
     120#define DELMOD_SMI      0x2
     121/* 0x3 reserved */
     122#define DELMOD_NMI      0x4
     123#define DELMOD_INIT     0x5
     124/* 0x6 reserved */
     125#define DELMOD_EXTINT   0x7
     126
     127/** Destination modes. */
     128#define DESTMOD_PHYS    0x0
     129#define DESTMOD_LOGIC   0x1
     130
     131/** Trigger Modes. */
     132#define TRIGMOD_EDGE    0x0
     133#define TRIGMOD_LEVEL   0x1
     134
     135/** Interrupt Input Pin Polarities. */
     136#define POLARITY_HIGH   0x0
     137#define POLARITY_LOW    0x1
     138
     139/** I/O Redirection Register. */
     140struct io_redirection_reg {
     141        union {
     142                __u32 lo;
     143                struct {
     144                        unsigned intvec : 8;            /**< Interrupt Vector. */
     145                        unsigned delmod : 3;            /**< Delivery Mode. */
     146                        unsigned destmod : 1;           /**< Destination mode. */
     147                        unsigned delivs : 1;            /**< Delivery status (RO). */
     148                        unsigned intpol : 1;            /**< Interrupt Input Pin Polarity. */
     149                        unsigned irr : 1;               /**< Remote IRR (RO). */
     150                        unsigned trigger_mode : 1;      /**< Trigger Mode. */
     151                        unsigned masked : 1;            /**< Interrupt Mask. */
     152                        unsigned : 15;                  /**< Reserved. */
     153                };
     154        };
     155        union {
     156                __u32 hi;
     157                struct {
     158                        unsigned : 24;                  /**< Reserved. */
     159                        unsigned dest : 8;              /**< Destination Field. */
     160                };
     161        };
     162       
     163} __attribute__ ((packed));
     164
     165typedef struct io_redirection_reg io_redirection_reg_t;
    117166
    118167extern volatile __u32 *l_apic;
  • arch/ia32/include/smp/mps.h

    r607c5f9 ra83a802  
    121121extern struct smp_config_operations mps_config_operations;
    122122
    123 extern int mps_irq_to_pin(int irq);
    124 
    125123extern void mps_init(void);
    126124extern void kmp(void *arg);
  • arch/ia32/include/smp/smp.h

    r607c5f9 ra83a802  
    3333#include <typedefs.h>
    3434
     35/** SMP config opertaions interface. */
    3536struct smp_config_operations {
    36         count_t (* cpu_count)(void);
    37         bool (* cpu_enabled)(index_t i);
    38         bool (*cpu_bootstrap)(index_t i);
    39         __u8 (*cpu_apic_id)(index_t i);
     37        count_t (* cpu_count)(void);            /**< Return number of detected processors. */
     38        bool (* cpu_enabled)(index_t i);        /**< Check whether the processor of index i is enabled. */
     39        bool (*cpu_bootstrap)(index_t i);       /**< Check whether the processor of index i is BSP. */
     40        __u8 (*cpu_apic_id)(index_t i);         /**< Return APIC ID of the processor of index i. */
     41        int (*irq_to_pin)(int irq);             /**< Return mapping between irq and APIC pin. */
    4042};
    4143
     44extern int smp_irq_to_pin(int irq);
     45
    4246#endif
  • arch/ia32/src/drivers/i8042.c

    r607c5f9 ra83a802  
    4343 * It takes care of low-level keyboard functions.
    4444 */
     45
     46#define i8042_DATA              0x60
     47#define i8042_STATUS            0x64
     48
     49/** Keyboard commands. */
     50#define KBD_ENABLE      0xf4
     51#define KBD_DISABLE     0xf5
     52#define KBD_ACK         0xfa
    4553
    4654#define SPECIAL         '?'
     
    231239{
    232240        trap_register(VECTOR_KBD, i8042_interrupt);
     241        trap_virtual_enable_irqs(1<<IRQ_KBD);
    233242        spinlock_initialize(&keylock);
    234243        chardev_initialize(&kbrd, &ops);
     
    246255
    247256        trap_virtual_eoi();
    248         x = inb(0x60);
     257        x = inb(i8042_DATA);
    249258        if (x & KEY_RELEASE)
    250259                key_released(x ^ KEY_RELEASE);
  • arch/ia32/src/ia32.c

    r607c5f9 ra83a802  
    5757        if (config.cpu_active == 1) {
    5858                bios_init();
    59                 i8042_init();   /* keyboard controller */
    6059                i8259_init();   /* PIC */
    6160                i8254_init();   /* hard clock */
     
    9089void arch_post_smp_init(void)
    9190{
    92         trap_virtual_enable_irqs(1<<IRQ_KBD);
     91        i8042_init();   /* keyboard controller */
    9392}
    9493
  • arch/ia32/src/smp/apic.c

    r607c5f9 ra83a802  
    4141
    4242/*
    43  * This is functional, far-from-general-enough interface to the APIC.
    44  * Advanced Programmable Interrupt Controller for MP systems.
     43 * Advanced Programmable Interrupt Controller for SMP systems.
    4544 * Tested on:
    4645 *      Bochs 2.0.2 - Bochs 2.2 with 2-8 CPUs
     
    8382        io_apic_disable_irqs(0xffff);
    8483        trap_register(VECTOR_CLK, l_apic_timer_interrupt);
    85         for (i=1; i<16; i++) {
     84        for (i=0; i<16; i++) {
    8685                int pin;
    8786       
    88                 if ((pin = mps_irq_to_pin(i)) != -1)
    89                 io_apic_change_ioredtbl(pin,0xf,IVT_IRQBASE+i,LOPRI);
     87                if ((pin = smp_irq_to_pin(i)) != -1) {
     88                        io_apic_change_ioredtbl(pin,0xff,IVT_IRQBASE+i,LOPRI);
     89                }
    9090        }
    9191       
     
    353353void io_apic_change_ioredtbl(int signal, int dest, __u8 v, int flags)
    354354{
    355         __u32 reglo, reghi;
     355        io_redirection_reg_t reg;
    356356        int dlvr = 0;
    357357       
    358358        if (flags & LOPRI)
    359                 dlvr = 1;
    360        
    361         reglo = io_apic_read(IOREDTBL + signal*2);
    362         reghi = io_apic_read(IOREDTBL + signal*2 + 1);
    363        
    364         reghi &= ~0x0f000000;
    365         reghi |= (dest<<24);
    366 
    367         reglo &= (~0x1ffff) | (1<<16); /* don't touch the mask */
    368         reglo |= (0<<15) | (0<<13) | (0<<11) | (dlvr<<8) | v;
    369 
    370         io_apic_write(IOREDTBL + signal*2, reglo);             
    371         io_apic_write(IOREDTBL + signal*2 + 1, reghi);
     359                dlvr = DELMOD_LOWPRI;
     360
     361       
     362        reg.lo = io_apic_read(IOREDTBL + signal*2);
     363        reg.hi = io_apic_read(IOREDTBL + signal*2 + 1);
     364       
     365        reg.dest =  dest;
     366        reg.destmod = DESTMOD_LOGIC;
     367        reg.trigger_mode = TRIGMOD_EDGE;
     368        reg.intpol = POLARITY_HIGH;
     369        reg.delmod = dlvr;
     370        reg.intvec = v;
     371
     372        io_apic_write(IOREDTBL + signal*2, reg.lo);
     373        io_apic_write(IOREDTBL + signal*2 + 1, reg.hi);
    372374}
    373375
    374376void io_apic_disable_irqs(__u16 irqmask)
    375377{
    376         int i,pin;
    377         __u32 reglo;
     378        io_redirection_reg_t reg;
     379        int i, pin;
    378380       
    379381        for (i=0;i<16;i++) {
     
    383385                         * mapping for the respective IRQ number.
    384386                         */
    385                         pin = mps_irq_to_pin(i);
     387                        pin = smp_irq_to_pin(i);
    386388                        if (pin != -1) {
    387                                 reglo = io_apic_read(IOREDTBL + pin*2);
    388                                 reglo |= (1<<16);
    389                                 io_apic_write(IOREDTBL + pin*2,reglo);
     389                                reg.lo = io_apic_read(IOREDTBL + pin*2);
     390                                reg.masked = true;
     391                                io_apic_write(IOREDTBL + pin*2, reg.lo);
    390392                        }
    391393                       
     
    396398void io_apic_enable_irqs(__u16 irqmask)
    397399{
    398         int i,pin;
    399         __u32 reglo;
     400        int i, pin;
     401        io_redirection_reg_t reg;       
    400402       
    401403        for (i=0;i<16;i++) {
     
    405407                         * mapping for the respective IRQ number.
    406408                         */
    407                         pin = mps_irq_to_pin(i);
     409                        pin = smp_irq_to_pin(i);
    408410                        if (pin != -1) {
    409                                 reglo = io_apic_read(IOREDTBL + pin*2);
    410                                 reglo &= ~(1<<16);
    411                                 io_apic_write(IOREDTBL + pin*2,reglo);
     411                                reg.lo = io_apic_read(IOREDTBL + pin*2);
     412                                reg.masked = false;
     413                                io_apic_write(IOREDTBL + pin*2, reg.lo);
    412414                        }
    413415                       
  • arch/ia32/src/smp/mps.c

    r607c5f9 ra83a802  
    9090static bool is_bsp(index_t i);
    9191static __u8 get_cpu_apic_id(index_t i);
     92static int mps_irq_to_pin(int irq);
    9293
    9394struct smp_config_operations mps_config_operations = {
     
    9596        .cpu_enabled = is_cpu_enabled,
    9697        .cpu_bootstrap = is_bsp,
    97         .cpu_apic_id = get_cpu_apic_id
     98        .cpu_apic_id = get_cpu_apic_id,
     99        .irq_to_pin = mps_irq_to_pin
    98100};
    99101
  • arch/ia32/src/smp/smp.c

    r607c5f9 ra83a802  
    166166}
    167167
     168int smp_irq_to_pin(int irq)
     169{
     170        ASSERT(ops != NULL);
     171        return ops->irq_to_pin(irq);
     172}
     173
    168174#endif /* CONFIG_SMP */
  • genarch/src/acpi/matd.c

    r607c5f9 ra83a802  
    4545#ifdef CONFIG_SMP
    4646
     47/** Standard ISA IRQ map; can be overriden by Interrupt Source Override entries of MADT. */
     48int isa_irq_map[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
     49
    4750static void madt_l_apic_entry(struct madt_l_apic *la, __u32 index);
    4851static void madt_io_apic_entry(struct madt_io_apic *ioa, __u32 index);
     52static void madt_intr_src_ovrd_entry(struct madt_intr_src_ovrd *override, __u32 index);
    4953static int madt_cmp(void * a, void * b);
    5054
     
    8084static bool madt_cpu_bootstrap(index_t i);
    8185static __u8 madt_cpu_apic_id(index_t i);
     86static int madt_irq_to_pin(int irq);
    8287
    8388struct smp_config_operations madt_config_operations = {
     
    8590        .cpu_enabled = madt_cpu_enabled,
    8691        .cpu_bootstrap = madt_cpu_bootstrap,
    87         .cpu_apic_id = madt_cpu_apic_id
     92        .cpu_apic_id = madt_cpu_apic_id,
     93        .irq_to_pin = madt_irq_to_pin
    8894};
    8995
    90 static count_t madt_cpu_count(void)
     96count_t madt_cpu_count(void)
    9197{
    9298        return madt_l_apic_entry_cnt;
    9399}
    94100
    95 static bool madt_cpu_enabled(index_t i)
     101bool madt_cpu_enabled(index_t i)
    96102{
    97103        ASSERT(i < madt_l_apic_entry_cnt);
     
    100106}
    101107
    102 static bool madt_cpu_bootstrap(index_t i)
     108bool madt_cpu_bootstrap(index_t i)
    103109{
    104110        ASSERT(i < madt_l_apic_entry_cnt);
     
    106112}
    107113
    108 static __u8 madt_cpu_apic_id(index_t i)
     114__u8 madt_cpu_apic_id(index_t i)
    109115{
    110116        ASSERT(i < madt_l_apic_entry_cnt);
    111117        return ((struct madt_l_apic *) madt_entries_index[madt_l_apic_entry_index + i])->apic_id;
     118}
     119
     120int madt_irq_to_pin(int irq)
     121{
     122        ASSERT(irq < sizeof(isa_irq_map)/sizeof(int));
     123        return isa_irq_map[irq];
    112124}
    113125
     
    155167                                break;
    156168                        case MADT_INTR_SRC_OVRD:
     169                                madt_intr_src_ovrd_entry((struct madt_intr_src_ovrd *) h, index);
     170                                break;
    157171                        case MADT_NMI_SRC:
    158172                        case MADT_L_APIC_NMI:
     
    210224}
    211225
     226void madt_intr_src_ovrd_entry(struct madt_intr_src_ovrd *override, __u32 index)
     227{
     228        ASSERT(override->source < sizeof(isa_irq_map)/sizeof(int));
     229        printf("Remapping irq%d to IO APIC pin%d\n",  override->source, override->global_intr);
     230        isa_irq_map[override->source] = override->global_intr;
     231       
     232}
    212233
    213234#endif /* CONFIG_SMP */
  • generic/src/main/kconsole.c

    r607c5f9 ra83a802  
    5050                printf("%s> ", __FUNCTION__);
    5151                gets(stdin, buf, sizeof(buf));
     52                printf("?\n");
    5253        }
    5354}
  • generic/src/main/kinit.c

    r607c5f9 ra83a802  
    118118
    119119        /*
     120         * At this point SMP, if present, is configured.
     121         */
     122        arch_post_smp_init();
     123
     124        /*
    120125         * Create kernel console.
    121126         */
     
    165170
    166171        while (1) {
    167                 thread_sleep(60);
     172                thread_sleep(1);
    168173                printf("kinit... ");
    169174        }
  • generic/src/main/main.c

    r607c5f9 ra83a802  
    171171        arch_pre_smp_init();
    172172        smp_init();
    173         arch_post_smp_init();
    174173        printf("config.memory_size=%dM\n", config.memory_size/(1024*1024));
    175174        printf("config.cpu_count=%d\n", config.cpu_count);
Note: See TracChangeset for help on using the changeset viewer.