Subversion Repositories HelenOS

Rev

Rev 3675 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3675 Rev 4377
Line 33... Line 33...
33
 */
33
 */
34
 
34
 
35
#include <config.h>
35
#include <config.h>
36
#include <arch.h>
36
#include <arch.h>
37
#include <arch/boot/boot.h>
37
#include <arch/boot/boot.h>
38
#include <arch/drivers/cuda.h>
38
#include <genarch/drivers/via-cuda/cuda.h>
39
#include <arch/interrupt.h>
39
#include <arch/interrupt.h>
40
#include <genarch/fb/fb.h>
40
#include <genarch/fb/fb.h>
41
#include <genarch/fb/visuals.h>
41
#include <genarch/fb/visuals.h>
42
#include <userspace.h>
42
#include <userspace.h>
43
#include <proc/uarg.h>
43
#include <proc/uarg.h>
44
#include <console/console.h>
44
#include <console/console.h>
45
#include <ddi/device.h>
-
 
46
#include <ddi/irq.h>
45
#include <ddi/irq.h>
47
#include <arch/drivers/pic.h>
46
#include <arch/drivers/pic.h>
-
 
47
#include <align.h>
-
 
48
#include <macros.h>
-
 
49
#include <string.h>
48
 
50
 
49
#define IRQ_COUNT   64
51
#define IRQ_COUNT  64
-
 
52
#define IRQ_CUDA   10
50
 
53
 
51
bootinfo_t bootinfo;
54
bootinfo_t bootinfo;
52
 
55
 
-
 
56
/** Performs ppc32-specific initialization before main_bsp() is called. */
53
void arch_pre_main(void)
57
void arch_pre_main(void)
54
{
58
{
55
    /* Setup usermode */
-
 
56
    init.cnt = bootinfo.taskmap.count;
59
    init.cnt = bootinfo.taskmap.count;
57
   
60
   
58
    uint32_t i;
61
    uint32_t i;
59
   
62
   
60
    for (i = 0; i < bootinfo.taskmap.count; i++) {
63
    for (i = 0; i < min3(bootinfo.taskmap.count, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); i++) {
61
        init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr);
64
        init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr);
62
        init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
65
        init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
-
 
66
        str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN,
-
 
67
            bootinfo.taskmap.tasks[i].name);
63
    }
68
    }
64
}
69
}
65
 
70
 
66
void arch_pre_mm_init(void)
71
void arch_pre_mm_init(void)
67
{
72
{
Line 73... Line 78...
73
}
78
}
74
 
79
 
75
void arch_post_mm_init(void)
80
void arch_post_mm_init(void)
76
{
81
{
77
    if (config.cpu_active == 1) {
82
    if (config.cpu_active == 1) {
-
 
83
 
-
 
84
#ifdef CONFIG_FB
78
        /* Initialize framebuffer */
85
        /* Initialize framebuffer */
-
 
86
        if (bootinfo.screen.addr) {
79
        unsigned int visual;
87
            unsigned int visual;
80
       
88
           
81
        switch (bootinfo.screen.bpp) {
89
            switch (bootinfo.screen.bpp) {
82
        case 8:
90
            case 8:
83
            visual = VISUAL_INDIRECT_8;
91
                visual = VISUAL_INDIRECT_8;
84
            break;
92
                break;
85
        case 16:
93
            case 16:
86
            visual = VISUAL_RGB_5_5_5;
94
                visual = VISUAL_RGB_5_5_5;
87
            break;
95
                break;
88
        case 24:
96
            case 24:
89
            visual = VISUAL_RGB_8_8_8;
97
                visual = VISUAL_RGB_8_8_8;
90
            break;
98
                break;
91
        case 32:
99
            case 32:
92
            visual = VISUAL_RGB_0_8_8_8;
100
                visual = VISUAL_RGB_0_8_8_8;
93
            break;
101
                break;
94
        default:
102
            default:
95
            panic("Unsupported bits per pixel");
103
                panic("Unsupported bits per pixel.");
-
 
104
            }
-
 
105
            fb_properties_t prop = {
-
 
106
                .addr = bootinfo.screen.addr,
-
 
107
                .offset = 0,
-
 
108
                .x = bootinfo.screen.width,
-
 
109
                .y = bootinfo.screen.height,
-
 
110
                .scan = bootinfo.screen.scanline,
-
 
111
                .visual = visual,
-
 
112
            };
-
 
113
            fb_init(&prop);
96
        }
114
        }
97
        fb_properties_t prop = {
-
 
98
            .addr = bootinfo.screen.addr,
-
 
99
            .offset = 0,
-
 
100
            .x = bootinfo.screen.width,
-
 
101
            .y = bootinfo.screen.height,
-
 
102
            .scan = bootinfo.screen.scanline,
-
 
103
            .visual = visual,
-
 
104
        };
115
#endif
105
        fb_init(&prop);
-
 
106
       
116
       
107
        /* Initialize IRQ routing */
117
        /* Initialize IRQ routing */
108
        irq_init(IRQ_COUNT, IRQ_COUNT);
118
        irq_init(IRQ_COUNT, IRQ_COUNT);
109
   
-
 
110
        /* Initialize PIC */
-
 
111
        pic_init(bootinfo.keyboard.addr, PAGE_SIZE);
-
 
112
       
119
       
-
 
120
        if (bootinfo.macio.addr) {
-
 
121
            /* Initialize PIC */
-
 
122
            cir_t cir;
-
 
123
            void *cir_arg;
-
 
124
            pic_init(bootinfo.macio.addr, PAGE_SIZE, &cir, &cir_arg);
-
 
125
           
-
 
126
#ifdef CONFIG_VIA_CUDA
-
 
127
            uintptr_t pa = bootinfo.macio.addr + 0x16000;
-
 
128
            uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE);
-
 
129
            size_t offset = pa - aligned_addr;
-
 
130
            size_t size = 2 * PAGE_SIZE;
-
 
131
           
-
 
132
            cuda_t *cuda = (cuda_t *)
-
 
133
                (hw_map(aligned_addr, offset + size) + offset);
-
 
134
           
113
        /* Initialize I/O controller */
135
            /* Initialize I/O controller */
114
        cuda_init(device_assign_devno(),
136
            cuda_instance_t *cuda_instance =
115
            bootinfo.keyboard.addr + 0x16000, 2 * PAGE_SIZE);
137
                cuda_init(cuda, IRQ_CUDA, cir, cir_arg);
-
 
138
            if (cuda_instance) {
-
 
139
                indev_t *sink = stdin_wire();
-
 
140
                cuda_wire(cuda_instance, sink);
-
 
141
            }
-
 
142
#endif
-
 
143
        }
116
       
144
       
117
        /* Merge all zones to 1 big zone */
145
        /* Merge all zones to 1 big zone */
118
        zone_merge_all();
146
        zone_merge_all();
119
    }
147
    }
120
}
148
}
Line 141... Line 169...
141
        (uintptr_t) kernel_uarg->uspace_stack +
169
        (uintptr_t) kernel_uarg->uspace_stack +
142
        THREAD_STACK_SIZE - SP_DELTA,
170
        THREAD_STACK_SIZE - SP_DELTA,
143
        (uintptr_t) kernel_uarg->uspace_entry);
171
        (uintptr_t) kernel_uarg->uspace_entry);
144
   
172
   
145
    /* Unreachable */
173
    /* Unreachable */
146
    for (;;)
174
    while (true);
147
        ;
-
 
148
}
175
}
149
 
176
 
150
/** Acquire console back for kernel
177
/** Acquire console back for kernel
151
 *
178
 *
152
 */
179
 */
153
void arch_grab_console(void)
180
void arch_grab_console(void)
154
{
181
{
-
 
182
#ifdef CONFIG_FB
155
    cuda_grab();
183
    fb_redraw();
-
 
184
#endif
156
}
185
}
157
 
186
 
158
/** Return console to userspace
187
/** Return console to userspace
159
 *
188
 *
160
 */
189
 */
161
void arch_release_console(void)
190
void arch_release_console(void)
162
{
191
{
-
 
192
}
-
 
193
 
-
 
194
/** Construct function pointer
-
 
195
 *
-
 
196
 * @param fptr   function pointer structure
-
 
197
 * @param addr   function address
-
 
198
 * @param caller calling function address
-
 
199
 *
-
 
200
 * @return address of the function pointer
-
 
201
 *
-
 
202
 */
-
 
203
void *arch_construct_function(fncptr_t *fptr, void *addr, void *caller)
-
 
204
{
-
 
205
    return addr;
-
 
206
}
-
 
207
 
-
 
208
void arch_reboot(void)
-
 
209
{
-
 
210
    // TODO
163
    cuda_release();
211
    while (1);
164
}
212
}
165
 
213
 
166
/** @}
214
/** @}
167
 */
215
 */