Changeset acc7ce4 in mainline


Ignore:
Timestamp:
2011-01-07T14:57:40Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7c34b28f
Parents:
b404a98
Message:

uspace interrupt controller drivers for i8259 and APIC (non-functional yet)
convert NE2000 driver to use these drivers (not enabling the IRQ in kernel), this solves the "spurious interrupt" issue
(however, on SMP machines this renders the driver unusable for now since the APIC driver does not do anything yet)

Files:
4 added
16 edited
5 moved

Legend:

Unmodified
Added
Removed
  • boot/arch/amd64/Makefile.inc

    rb404a98 racc7ce4  
    3030
    3131RD_SRVS_ESSENTIAL += \
    32         $(USPACE_PATH)/srv/hw/char/i8042/i8042
     32        $(USPACE_PATH)/srv/hw/char/i8042/i8042 \
     33        $(USPACE_PATH)/srv/hw/irc/apic/apic \
     34        $(USPACE_PATH)/srv/hw/irc/i8259/i8259
    3335
    3436RD_SRVS_NON_ESSENTIAL += \
     
    4143        isa \
    4244        ns8250
    43        
     45
    4446RD_DRV_CFG += \
    4547        isa/isa.dev
  • boot/arch/sparc64/Makefile.inc

    rb404a98 racc7ce4  
    4343
    4444RD_SRVS_ESSENTIAL += \
    45         $(USPACE_PATH)/srv/hw/cir/fhc/fhc \
    46         $(USPACE_PATH)/srv/hw/cir/obio/obio
     45        $(USPACE_PATH)/srv/hw/irc/fhc/fhc \
     46        $(USPACE_PATH)/srv/hw/irc/obio/obio
    4747
    4848SOURCES = \
  • kernel/arch/amd64/include/interrupt.h

    rb404a98 racc7ce4  
    7474extern void (* enable_irqs_function)(uint16_t);
    7575extern void (* eoi_function)(void);
     76extern const char *irqs_info;
    7677
    7778extern void interrupt_init(void);
  • kernel/arch/amd64/src/amd64.c

    rb404a98 racc7ce4  
    235235#endif
    236236       
    237         /*
    238          * This nasty hack should also go away ASAP.
    239          */
    240         trap_virtual_enable_irqs(1 << IRQ_DP8390);
     237        if (irqs_info != NULL)
     238                sysinfo_set_item_val(irqs_info, NULL, true);
     239       
    241240        sysinfo_set_item_val("netif.dp8390.inr", NULL, IRQ_DP8390);
    242241}
  • kernel/arch/amd64/src/interrupt.c

    rb404a98 racc7ce4  
    6262void (* enable_irqs_function)(uint16_t irqmask) = NULL;
    6363void (* eoi_function)(void) = NULL;
     64const char *irqs_info = NULL;
    6465
    6566void istate_decode(istate_t *istate)
  • kernel/arch/ia32/include/interrupt.h

    rb404a98 racc7ce4  
    7474extern void (* enable_irqs_function)(uint16_t);
    7575extern void (* eoi_function)(void);
     76extern const char *irqs_info;
    7677
    7778extern void interrupt_init(void);
  • kernel/arch/ia32/src/drivers/i8259.c

    rb404a98 racc7ce4  
    8686        disable_irqs_function = pic_disable_irqs;
    8787        eoi_function = pic_eoi;
     88        irqs_info = "i8259";
    8889
    8990        pic_disable_irqs(0xffff);               /* disable all irq's */
  • kernel/arch/ia32/src/ia32.c

    rb404a98 racc7ce4  
    193193#endif
    194194       
    195         /*
    196          * This nasty hack should also go away ASAP.
    197          */
    198         trap_virtual_enable_irqs(1 << IRQ_DP8390);
     195        if (irqs_info != NULL)
     196                sysinfo_set_item_val(irqs_info, NULL, true);
     197       
    199198        sysinfo_set_item_val("netif.dp8390.inr", NULL, IRQ_DP8390);
    200199}
  • kernel/arch/ia32/src/interrupt.c

    rb404a98 racc7ce4  
    6262void (* enable_irqs_function)(uint16_t irqmask) = NULL;
    6363void (* eoi_function)(void) = NULL;
     64const char *irqs_info = NULL;
    6465
    6566void istate_decode(istate_t *istate)
  • kernel/arch/ia32/src/smp/apic.c

    rb404a98 racc7ce4  
    178178        disable_irqs_function = io_apic_disable_irqs;
    179179        eoi_function = l_apic_eoi;
     180        irqs_info = "apic";
    180181       
    181182        /*
  • uspace/Makefile

    rb404a98 racc7ce4  
    108108
    109109ifeq ($(UARCH),amd64)
    110         DIRS += drv/rootpc
    111         DIRS += drv/pciintel
    112         DIRS += drv/isa
    113         DIRS += drv/ns8250
     110        DIRS += \
     111                drv/rootpc \
     112                drv/pciintel \
     113                drv/isa \
     114                drv/ns8250 \
     115                srv/hw/irc/apic \
     116                srv/hw/irc/i8259
    114117endif
    115118
    116119ifeq ($(UARCH),ia32)
    117         DIRS += drv/rootpc
    118         DIRS += drv/pciintel
    119         DIRS += drv/isa
    120         DIRS += drv/ns8250
     120        DIRS += \
     121                drv/rootpc \
     122                drv/pciintel \
     123                drv/isa \
     124                drv/ns8250 \
     125                srv/hw/irc/apic \
     126                srv/hw/irc/i8259
    121127endif
    122128
     
    127133ifeq ($(UARCH),sparc64)
    128134        DIRS += \
    129                 srv/hw/cir/fhc \
    130                 srv/hw/cir/obio
     135                srv/hw/irc/fhc \
     136                srv/hw/irc/obio
    131137endif
    132138
  • uspace/app/init/init.c

    rb404a98 racc7ce4  
    273273        mount_tmpfs();
    274274       
     275        spawn("/srv/apic");
     276        spawn("/srv/i8259");
    275277        spawn("/srv/fhc");
    276278        spawn("/srv/obio");
  • uspace/lib/c/include/ipc/irc.h

    rb404a98 racc7ce4  
    3131 */
    3232/** @file
    33  */ 
     33 */
    3434
    35 #ifndef LIBC_BUS_H_
    36 #define LIBC_BUS_H_
     35#ifndef LIBC_IRC_H_
     36#define LIBC_IRC_H_
    3737
    3838#include <ipc/ipc.h>
    3939
    4040typedef enum {
    41         BUS_CLEAR_INTERRUPT = IPC_FIRST_USER_METHOD
    42 } bus_request_t;
     41        IRC_ENABLE_INTERRUPT = IPC_FIRST_USER_METHOD,
     42        IRC_CLEAR_INTERRUPT
     43} irc_request_t;
    4344
    4445#endif
  • uspace/lib/c/include/ipc/services.h

    rb404a98 racc7ce4  
    4949        SERVICE_FHC,
    5050        SERVICE_OBIO,
     51        SERVICE_APIC,
     52        SERVICE_I8259,
    5153        SERVICE_CLIPBOARD,
    5254        SERVICE_NETWORKING,
  • uspace/srv/hid/kbd/port/ns16550.c

    rb404a98 racc7ce4  
    3636
    3737#include <ipc/ipc.h>
    38 #include <ipc/bus.h>
     38#include <ipc/irc.h>
    3939#include <async.h>
    4040#include <sysinfo.h>
     
    122122       
    123123        if (cir_service)
    124                 async_msg_1(cir_phone, BUS_CLEAR_INTERRUPT,
     124                async_msg_1(cir_phone, IRC_CLEAR_INTERRUPT,
    125125                    IPC_GET_IMETHOD(*call));
    126126}
  • uspace/srv/hid/kbd/port/z8530.c

    rb404a98 racc7ce4  
    3636
    3737#include <ipc/ipc.h>
    38 #include <ipc/bus.h>
     38#include <ipc/irc.h>
    3939#include <async.h>
    4040#include <sysinfo.h>
     
    110110       
    111111        if (cir_service)
    112                 async_msg_1(cir_phone, BUS_CLEAR_INTERRUPT,
     112                async_msg_1(cir_phone, IRC_CLEAR_INTERRUPT,
    113113                    IPC_GET_IMETHOD(*call));
    114114}
  • uspace/srv/hw/irc/fhc/fhc.c

    rb404a98 racc7ce4  
    3838#include <ipc/ipc.h>
    3939#include <ipc/services.h>
    40 #include <ipc/bus.h>
     40#include <ipc/irc.h>
    4141#include <ipc/ns.h>
    4242#include <sysinfo.h>
     
    8383                callid = async_get_call(&call);
    8484                switch (IPC_GET_IMETHOD(call)) {
    85                 case BUS_CLEAR_INTERRUPT:
     85                case IRC_ENABLE_INTERRUPT:
     86                        /* Noop */
     87                        ipc_answer_0(callid, EOK);
     88                        break;
     89                case IRC_CLEAR_INTERRUPT:
    8690                        inr = IPC_GET_ARG1(call);
    8791                        switch (inr) {
  • uspace/srv/hw/irc/obio/obio.c

    rb404a98 racc7ce4  
    4444#include <ipc/ipc.h>
    4545#include <ipc/services.h>
    46 #include <ipc/bus.h>
     46#include <ipc/irc.h>
    4747#include <ipc/ns.h>
    4848#include <sysinfo.h>
     
    9393                callid = async_get_call(&call);
    9494                switch (IPC_GET_IMETHOD(call)) {
    95                 case BUS_CLEAR_INTERRUPT:
     95                case IRC_ENABLE_INTERRUPT:
     96                        /* Noop */
     97                        ipc_answer_0(callid, EOK);
     98                        break;
     99                case IRC_CLEAR_INTERRUPT:
    96100                        inr = IPC_GET_ARG1(call);
    97101                        base_virt[OBIO_CIR(inr & INO_MASK)] = 0;
  • uspace/srv/hw/netif/dp8390/dp8390_module.c

    rb404a98 racc7ce4  
    4141#include <err.h>
    4242#include <malloc.h>
     43#include <sysinfo.h>
    4344#include <ipc/ipc.h>
    4445#include <ipc/services.h>
     46#include <ipc/irc.h>
    4547#include <net/modules.h>
    4648#include <packet_client.h>
     
    7173 */
    7274#define IRQ_GET_ISR(call)  ((int) IPC_GET_ARG2(call))
     75
     76static int irc_service = 0;
     77static int irc_phone = -1;
    7378
    7479/** DP8390 kernel interrupt command sequence.
     
    136141}
    137142
    138 /** Changes the network interface state.
     143/** Change the network interface state.
     144 *
    139145 *  @param[in,out] device The network interface.
    140  *  @param[in] state The new state.
    141  *  @returns The new state.
     146 *  @param[in]     state  The new state.
     147 *
     148 *  @return The new state.
     149 *
    142150 */
    143151static int change_state(netif_device_t *device, device_state_t state)
     
    272280                return rc;
    273281       
    274         if (device->state != NETIF_ACTIVE){
     282        if (device->state != NETIF_ACTIVE) {
    275283                netif_pq_release(packet_get_id(packet));
    276284                return EFORWARD;
     
    312320                }
    313321               
    314                 return change_state(device, NETIF_ACTIVE);
     322                rc = change_state(device, NETIF_ACTIVE);
     323               
     324                if (irc_service)
     325                        async_msg_1(irc_phone, IRC_ENABLE_INTERRUPT, dep->de_irq);
     326               
     327                return rc;
    315328        }
    316329       
     
    334347int netif_initialize(void)
    335348{
     349        sysarg_t apic;
     350        sysarg_t i8259;
     351       
     352        if ((sysinfo_get_value("apic", &apic) == EOK) && (apic))
     353                irc_service = SERVICE_APIC;
     354        else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))
     355                irc_service = SERVICE_I8259;
     356       
     357        if (irc_service) {
     358                while (irc_phone < 0) {
     359                        irc_phone = ipc_connect_me_to_blocking(PHONE_NS, irc_service,
     360                            0, 0);
     361                }
     362        }
     363       
     364        async_set_interrupt_received(irq_handler);
     365       
    336366        sysarg_t phonehash;
    337         async_set_interrupt_received(irq_handler);
    338367        return ipc_connect_to_me(PHONE_NS, SERVICE_DP8390, 0, 0, &phonehash);
    339368}
Note: See TracChangeset for help on using the changeset viewer.