Ignore:
Timestamp:
Jul 13, 2017, 3:24:38 PM (5 years ago)
Author:
max@…
Message:

start moving the APIC code into the PIC driver

Location:
trunk/hal/x86_64/drivers
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/x86_64/drivers/pic_apic.c

    r197 r203  
    2727#include <vfs.h>
    2828
    29 void pic_apic_init( chdev_t * pic )
     29#include <hal_internal.h>
     30#include <hal_segmentation.h>
     31#include <hal_apic.h>
     32
     33extern iopic_input_t iopic_input;
     34
     35static void
     36idt_set_seg(struct idt_seg *seg, void *func, int ist, int type, int dpl, int sel)
    3037{
    31         x86_panic((char *)__func__);
     38        seg->gd_looffset = (uint64_t)func & 0xffff;
     39        seg->gd_selector = sel;
     40        seg->gd_ist = ist;
     41        seg->gd_type = type;
     42        seg->gd_dpl = dpl;
     43        seg->gd_p = 1;
     44        seg->gd_hioffset = (uint64_t)func >> 16;
     45        seg->gd_zero = 0;
     46        seg->gd_xx1 = 0;
     47        seg->gd_xx2 = 0;
     48        seg->gd_xx3 = 0;
     49}
     50
     51/* -------------------------------------------------------------------------- */
     52
     53extern uint8_t *idtstore;
     54
     55void pic_apic_init(chdev_t *pic)
     56{
     57        /* XXX APIC already initialized earlier */
    3258}
    3359
     
    3763}
    3864
    39 void pic_apic_bind_irq( lid_t     lid,
    40                           chdev_t * src_chdev )
     65void pic_apic_bind_irq(lid_t lid, chdev_t *src_chdev)
    4166{
    42         x86_panic((char *)__func__);
     67        struct idt_seg seg, *idt;
     68        void *isr;
     69        int slot;
     70
     71        /* get the source chdev functional type, channel, and direction */
     72        uint32_t func    = src_chdev->func;
     73        uint32_t channel = src_chdev->channel;
     74
     75        /* get external IRQ index */
     76        uint32_t irq_id;
     77        if (func == DEV_FUNC_IOC)
     78                irq_id = iopic_input.ioc[channel];
     79        else if (func == DEV_FUNC_TXT)
     80                irq_id = iopic_input.txt[channel];
     81        else
     82                assert(false, __FUNCTION__, "unsupported device\n");
     83
     84        /* get the ISR pointer */
     85        isr = src_chdev->isr;
     86
     87        /* create the IDT entry, and register it */
     88        idt_set_seg(&seg, isr, 0, SDT_SYS386IGT, SEL_KPL,
     89            GDT_FIXED_SEL(GDT_KCODE_SEL, SEL_KPL));
     90        slot = idt_slot_alloc();
     91        idt = (struct idt_seg *)&idtstore;
     92        memcpy(&idt[slot], &seg, sizeof(struct idt_seg));
     93
     94        /* Bind the IRQ line in IOAPIC */
     95        hal_ioapic_bind_irq(irq_id, slot, lid);
     96
     97x86_printf("-> allocated %z\n", (uint64_t)slot);
    4398}
    4499
     
    46101                            chdev_t * src_chdev )
    47102{
    48         x86_panic((char *)__func__);
     103        uint32_t func = src_chdev->func;
     104        uint32_t channel = src_chdev->channel;
     105        uint32_t irq_id;
     106
     107        /* get external IRQ index */
     108        if (func == DEV_FUNC_IOC)
     109                irq_id = iopic_input.ioc[channel];
     110        else if (func == DEV_FUNC_TXT)
     111                irq_id = iopic_input.txt[channel];
     112        else
     113                assert(false, __FUNCTION__, "unsupported device\n");
     114
     115        /* enable the line */
     116        hal_ioapic_enable_irq(irq_id);
    49117}
    50118
     
    53121{
    54122        x86_panic((char *)__func__);
     123
     124        uint32_t func = src_chdev->func;
     125        uint32_t channel = src_chdev->channel;
     126        uint32_t irq_id;
     127
     128        /* get external IRQ index */
     129        if (func == DEV_FUNC_IOC)
     130                irq_id = iopic_input.ioc[channel];
     131        else if (func == DEV_FUNC_TXT)
     132                irq_id = iopic_input.txt[channel];
     133        else
     134                assert(false, __FUNCTION__, "unsupported device\n");
     135
     136        /* disable the line */
     137        hal_ioapic_disable_irq(irq_id);
    55138}
    56139
  • trunk/hal/x86_64/drivers/soclib_bdv.c

    r194 r203  
    184184void __attribute__ ((noinline)) soclib_bdv_cmd( xptr_t th_xp )
    185185{
    186 
    187         x86_panic("myshit!\n");
    188 
    189186        uint32_t   cmd_type;     // IOC_READ / IOC_WRITE / IOC_SYNC_READ
    190187        uint32_t   lba;          // command argument
     
    216213                x86_panic("!IOC_SYNC_READ not supported");
    217214        }
     215
     216        x86_panic("STOP HERE");
    218217}
    219218
    220219void __attribute__ ((noinline)) soclib_bdv_isr( chdev_t * chdev )
    221220{
    222 
    223 }
    224 
     221        x86_panic((char *)__func__);
     222}
     223
  • trunk/hal/x86_64/drivers/soclib_xcu.c

    r139 r203  
    2929#include <hal_internal.h>
    3030
    31 extern size_t ioapic_pins;
    32 
    33 /*
    34  * These indexes are used to translate a type::idx to a pin on the IOAPIC.
    35  */
    36 uint32_t hwi_baseidx __in_kdata = 0;
    37 uint32_t wti_baseidx __in_kdata = 0;
    38 uint32_t pti_baseidx __in_kdata = 0;
    39 
    40 static uint32_t get_pin(uint32_t idx, uint32_t type)
    41 {
    42         switch (type) {
    43                 case HWI_TYPE:
    44                         return hwi_baseidx + idx;
    45                 case WTI_TYPE:
    46                         return wti_baseidx + idx;
    47                 case PTI_TYPE:
    48                         return pti_baseidx + idx;
    49                 default:
    50                         x86_panic("get_pin: wrong type");
    51                         return 0;
    52         }
    53 }
    5431
    5532void soclib_xcu_init(chdev_t *icu, lid_t lid)
    5633{
    57         size_t i;
    58 
    59         /* disable all IRQs */
    60         for (i = 0; i < ioapic_pins; i++) {
    61                 hal_ioapic_disable_entry(i);
    62         }
    63 
    6434        x86_panic((char *)__func__);
    6535}
     
    6838    lid_t lid)
    6939{
    70         uint8_t dest = (uint8_t)lid; /* XXX */
    71         uint32_t pin;
    72         uint8_t vec;
    73 
    74         pin = get_pin(idx, type);
    75 
    76         switch (type) {
    77                 case HWI_TYPE:
    78                         vec = VECTOR_APIC_XCU_HWI;
    79                         break;
    80                 case WTI_TYPE:
    81                         vec = VECTOR_APIC_XCU_WTI;
    82                         break;
    83                 case PTI_TYPE:
    84                         vec = VECTOR_APIC_XCU_PTI;
    85                         break;
    86                 default:
    87                         x86_panic("enabling wrong irq");
    88         }
    89 
    90         hal_ioapic_set_entry(pin, vec, dest);
    91 
    9240        x86_panic((char *)__func__);
    9341}
     
    9644    lid_t lid)
    9745{
    98         uint32_t pin = get_pin(idx, type);
    99 
    100         hal_ioapic_disable_entry(pin);
    101 
    10246        x86_panic((char *)__func__);
    10347}
Note: See TracChangeset for help on using the changeset viewer.