Changeset 59e4864 in mainline for kernel/arch/ia64/src


Ignore:
Timestamp:
2008-11-11T08:00:42Z (17 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
f3c4a26
Parents:
a2a5529
Message:

Alfa of SMP support on IA64

Location:
kernel/arch/ia64/src
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/drivers/it.c

    ra2a5529 r59e4864  
    5656{
    5757        cr_itv_t itv;
    58 
    59         irq_initialize(&it_irq);
    60         it_irq.inr = INTERRUPT_TIMER;
    61         it_irq.devno = device_assign_devno();
    62         it_irq.claim = it_claim;
    63         it_irq.handler = it_interrupt;
    64         irq_register(&it_irq);
    65 
     58       
     59        if(config.cpu_active==1)
     60        {
     61                irq_initialize(&it_irq);
     62                it_irq.inr = INTERRUPT_TIMER;
     63                it_irq.devno = device_assign_devno();
     64                it_irq.claim = it_claim;
     65                it_irq.handler = it_interrupt;
     66                irq_register(&it_irq);
     67        }
     68       
    6669        /* initialize Interval Timer external interrupt vector */
    6770        itv.value = itv_read();
  • kernel/arch/ia64/src/ia64.c

    ra2a5529 r59e4864  
    5555#include <arch/bootinfo.h>
    5656#include <genarch/kbd/i8042.h>
     57#include <genarch/kbd/ns16550.h>
     58#include <smp/smp.h>
     59#include <smp/ipi.h>
     60#include <arch/atomic.h>
     61#include <panic.h>
     62#include <print.h>
     63
     64/*NS16550 as a COM 1*/
     65#define NS16550_IRQ 4
     66#define NS16550_PORT 0x3f8
    5767
    5868bootinfo_t *bootinfo;
     
    103113void arch_post_mm_init(void)
    104114{
    105         irq_init(INR_COUNT, INR_COUNT);
    106 #ifdef SKI
    107         ski_init_console();
     115        if(config.cpu_active==1)
     116        {
     117                irq_init(INR_COUNT, INR_COUNT);
     118#ifdef SKI
     119                ski_init_console();
    108120#else   
    109         ega_init();
     121                ega_init();
    110122#endif 
     123        }
    111124        it_init();     
    112125}
     
    128141        while (1) {
    129142                i8042_poll();
     143#ifdef CONFIG_NS16550
     144                ns16550_poll();
     145#endif
    130146                thread_usleep(POLL_INTERVAL);
    131147        }
     
    136152{
    137153
    138         if (config.cpu_active == 1) {
     154        {
    139155                /*
    140156                 * Create thread that polls keyboard.
     
    154170                i8042_init(kbd, IRQ_KBD, mouse, IRQ_MOUSE);
    155171
     172#ifdef CONFIG_NS16550
     173                ns16550_init(kbd, NS16550_IRQ, NS16550_PORT); // as a COM 1
     174#else
     175#endif
    156176                thread_t *t;
    157177                t = thread_create(i8042_kkbdpoll, NULL, TASK, 0, "kkbdpoll", true);
     
    164184        }
    165185}
     186
    166187
    167188/** Enter userspace and never return. */
     
    225246void arch_reboot(void)
    226247{
    227         // TODO
     248        outb(0x64,0xfe);
    228249        while (1);
    229250}
  • kernel/arch/ia64/src/mm/frame.c

    ra2a5529 r59e4864  
    4343 */
    4444#define MEMORY_SIZE     (64 * 1024 * 1024)
    45 #define MEMORY_BASE     (64 * 1024 * 1024)
     45#define MEMORY_BASE     (0 * 64 * 1024 * 1024)
     46
     47#define ONE_TO_ONE_MAPPING_SIZE (256*1048576) // Mapped at start
    4648
    4749#define ROM_BASE        0xa0000               //For ski
    4850#define ROM_SIZE        (384 * 1024)          //For ski
    4951void poke_char(int x,int y,char ch, char c);
     52
     53uintptr_t last_frame;
     54
    5055void frame_arch_init(void)
    5156{
    52         zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0);
     57
     58        if(config.cpu_active==1)
     59        {
     60                zone_create(MEMORY_BASE >> FRAME_WIDTH, SIZE2FRAMES(MEMORY_SIZE), (MEMORY_SIZE) >> FRAME_WIDTH, 0);
    5361       
    54         /*
    55          * Blacklist ROM regions.
    56          */
    57         frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
    58        
     62                /*
     63                * Blacklist ROM regions.
     64                */
     65                //frame_mark_unavailable(ADDR2PFN(ROM_BASE), SIZE2FRAMES(ROM_SIZE));
     66
     67                frame_mark_unavailable(ADDR2PFN(0), SIZE2FRAMES(1048576));
     68                last_frame=SIZE2FRAMES((VRN_KERNEL<<VRN_SHIFT)+ONE_TO_ONE_MAPPING_SIZE);       
     69        }       
    5970}
    6071
  • kernel/arch/ia64/src/mm/page.c

    ra2a5529 r59e4864  
    4848#include <arch/barrier.h>
    4949#include <memstr.h>
     50#include <align.h>
    5051
    5152static void set_environment(void);
     
    263264}
    264265
     266extern uintptr_t last_frame;
     267
     268
     269uintptr_t hw_map(uintptr_t physaddr, size_t size)
     270{
     271        if (last_frame + ALIGN_UP(size, PAGE_SIZE) > KA2PA(KERNEL_ADDRESS_SPACE_END_ARCH))
     272                panic("Unable to map physical memory %p (%d bytes)", physaddr, size)
     273       
     274        uintptr_t virtaddr = PA2KA(last_frame);
     275        pfn_t i;
     276        for (i = 0; i < ADDR2PFN(ALIGN_UP(size, PAGE_SIZE)); i++) {
     277                uintptr_t addr = PFN2ADDR(i);
     278                page_mapping_insert(AS_KERNEL, virtaddr + addr, physaddr + addr, PAGE_NOT_CACHEABLE | PAGE_WRITE);
     279        }
     280       
     281        last_frame = ALIGN_UP(last_frame + size, FRAME_SIZE);
     282       
     283        return virtaddr;
     284}
     285
     286
     287
    265288/** @}
    266289 */
  • kernel/arch/ia64/src/start.S

    ra2a5529 r59e4864  
    4040#define KERNEL_TRANSLATION_VIO 0x0010000000000671
    4141#define KERNEL_TRANSLATION_IO 0x00100FFFFC000671
    42 #define VIO_OFFSET            0x0002000000000000
    43 
    44 #define IO_OFFSET             0x0001000000000000
     42#define KERNEL_TRANSLATION_FW 0x00100000F0000671
    4543
    4644
     
    5351kernel_image_start:
    5452        .auto
     53
     54#identifi self(CPU) in OS structures by ID / EID
     55        mov r9=cr64
     56        mov r10=1
     57        movl r12=0xffffffff
     58        movl r8=cpu_by_id_eid_list
     59        and r8=r8,r12
     60        shr r9=r9,16
     61        add r8=r8,r9
     62        st1 [r8]=r10
     63
     64
    5565
    5666        mov psr.l = r0
     
    113123        movl r10 = (KERNEL_TRANSLATION_IO)
    114124        itr.d dtr[r7] = r10
     125
     126
     127#setup mapping for fimware arrea (also SAPIC)
     128        mov r11 = cr.itir ;;
     129        movl r10 = ~0xfc;;
     130        and r10 =r10 , r11  ;;
     131        movl r11 = (FW_PAGE_WIDTH << PS_SHIFT);;
     132        or r10 =r10 , r11  ;;
     133        mov cr.itir = r10;;
     134
     135
     136        movl r7 = 3
     137        movl r8 = (VRN_KERNEL << VRN_SHIFT) | FW_OFFSET
     138        mov cr.ifa = r8
     139        movl r10 = (KERNEL_TRANSLATION_FW)
     140        itr.d dtr[r7] = r10
     141
    115142
    116143
     
    143170        # switch to register bank 1
    144171        bsw.1
     172
     173#Am'I BSP or AP
     174        movl r20=bsp_started;;
     175        ld8 r20=[r20];;
     176        cmp.eq p3,p2=r20,r0;;
     177
    145178       
    146179        # initialize register stack
     
    161194       
    162195        /*
    163          * Initialize hardcoded_* variables.
     196         * Initialize hardcoded_* variables. Do only BSP
    164197         */
    165         movl r14 = _hardcoded_ktext_size
    166         movl r15 = _hardcoded_kdata_size
    167         movl r16 = _hardcoded_load_address ;;
    168         addl r17 = @gprel(hardcoded_ktext_size), gp
    169         addl r18 = @gprel(hardcoded_kdata_size), gp
    170         addl r19 = @gprel(hardcoded_load_address), gp
    171         addl r21 = @gprel(bootinfo), gp
     198(p3)    movl r14 = _hardcoded_ktext_size
     199(p3)    movl r15 = _hardcoded_kdata_size
     200(p3)    movl r16 = _hardcoded_load_address ;;
     201(p3)    addl r17 = @gprel(hardcoded_ktext_size), gp
     202(p3)    addl r18 = @gprel(hardcoded_kdata_size), gp
     203(p3)    addl r19 = @gprel(hardcoded_load_address), gp
     204(p3)    addl r21 = @gprel(bootinfo), gp
    172205        ;;
    173         st8 [r17] = r14
    174         st8 [r18] = r15
    175         st8 [r19] = r16
    176         st8 [r21] = r20
     206(p3)    st8 [r17] = r14
     207(p3)    st8 [r18] = r15
     208(p3)    st8 [r19] = r16
     209(p3)    st8 [r21] = r20
    177210
    178211        ssm (1 << 19) ;; /* Disable f32 - f127 */
     
    180213        srlz.d ;;
    181214
     215(p2)    movl r18 = main_ap ;;
     216(p2)    mov b1 = r18 ;;
     217(p2)    br.call.sptk.many b0 = b1
     218
     219#Mark that BSP is on
     220        mov r20=1;;
     221        movl r21=bsp_started;;
     222        st8 [r21]=r20;;
     223
     224
    182225        br.call.sptk.many b0 = arch_pre_main
    183226
     
    1892320:
    190233        br 0b
     234.align 4096
     235
     236kernel_image_ap_start:
     237        .auto
     238#identifi self(CPU) in OS structures by ID / EID
     239        mov r9=cr64
     240        mov r10=1
     241        movl r12=0xffffffff
     242        movl r8=cpu_by_id_eid_list
     243        and r8=r8,r12
     244        shr r9=r9,16
     245        add r8=r8,r9
     246        st1 [r8]=r10
     247       
     248#wait for wakeup sychro signal (#3 in cpu_by_id_eid_list)
     249kernel_image_ap_start_loop:
     250        movl r11=kernel_image_ap_start_loop
     251        and r11=r11,r12
     252        mov b1 = r11
     253
     254        ld1 r20=[r8];;
     255        movl r21=3;;
     256        cmp.eq p2,p3=r20,r21;;
     257(p3)br.call.sptk.many b0 = b1
     258
     259        movl r11=kernel_image_start
     260        and r11=r11,r12
     261    mov b1 = r11
     262        br.call.sptk.many b0 = b1
     263
     264
     265.align 16
     266.global bsp_started
     267bsp_started:
     268.space 8
     269
     270
     271.align 4096
     272.global cpu_by_id_eid_list
     273cpu_by_id_eid_list:
     274.space 65536
     275
     276
Note: See TracChangeset for help on using the changeset viewer.