Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ppc32/src/ppc32.c

    re731b0d r19490ce  
    4141#include <genarch/fb/fb.h>
    4242#include <genarch/fb/visuals.h>
    43 #include <genarch/ofw/ofw_tree.h>
    44 #include <genarch/ofw/pci.h>
    4543#include <userspace.h>
    4644#include <proc/uarg.h>
     
    5149#include <macros.h>
    5250#include <string.h>
    53 #include <print.h>
    5451
    5552#define IRQ_COUNT  64
     
    6663       
    6764        for (i = 0; i < min3(bootinfo.taskmap.count, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); i++) {
    68                 init.tasks[i].addr = bootinfo.taskmap.tasks[i].addr;
     65                init.tasks[i].addr = PA2KA(bootinfo.taskmap.tasks[i].addr);
    6966                init.tasks[i].size = bootinfo.taskmap.tasks[i].size;
    7067                str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN,
    7168                    bootinfo.taskmap.tasks[i].name);
    7269        }
    73        
    74         /* Copy boot allocations info. */
    75         ballocs.base = bootinfo.ballocs.base;
    76         ballocs.size = bootinfo.ballocs.size;
    77        
    78         ofw_tree_init(bootinfo.ofw_root);
    7970}
    8071
     
    8374        /* Initialize dispatch table */
    8475        interrupt_init();
    85        
     76
    8677        /* Start decrementer */
    8778        start_decrementer();
    8879}
    8980
    90 static bool display_register(ofw_tree_node_t *node, void *arg)
    91 {
    92         uintptr_t fb_addr = 0;
    93         uint32_t fb_width = 0;
    94         uint32_t fb_height = 0;
    95         uint32_t fb_scanline = 0;
    96         unsigned int visual = VISUAL_UNKNOWN;
    97        
    98         ofw_tree_property_t *prop = ofw_tree_getprop(node, "address");
    99         if ((prop) && (prop->value))
    100                 fb_addr = *((uintptr_t *) prop->value);
    101        
    102         prop = ofw_tree_getprop(node, "width");
    103         if ((prop) && (prop->value))
    104                 fb_width = *((uint32_t *) prop->value);
    105        
    106         prop = ofw_tree_getprop(node, "height");
    107         if ((prop) && (prop->value))
    108                 fb_height = *((uint32_t *) prop->value);
    109        
    110         prop = ofw_tree_getprop(node, "depth");
    111         if ((prop) && (prop->value)) {
    112                 uint32_t fb_bpp = *((uint32_t *) prop->value);
    113                 switch (fb_bpp) {
    114                 case 8:
    115                         visual = VISUAL_INDIRECT_8;
    116                         break;
    117                 case 16:
    118                         visual = VISUAL_RGB_5_5_5_BE;
    119                         break;
    120                 case 24:
    121                         visual = VISUAL_BGR_8_8_8;
    122                         break;
    123                 case 32:
    124                         visual = VISUAL_RGB_0_8_8_8;
    125                         break;
    126                 default:
    127                         visual = VISUAL_UNKNOWN;
     81void arch_post_mm_init(void)
     82{
     83        if (config.cpu_active == 1) {
     84
     85#ifdef CONFIG_FB
     86                /* Initialize framebuffer */
     87                if (bootinfo.screen.addr) {
     88                        unsigned int visual;
     89                       
     90                        switch (bootinfo.screen.bpp) {
     91                        case 8:
     92                                visual = VISUAL_INDIRECT_8;
     93                                break;
     94                        case 16:
     95                                visual = VISUAL_RGB_5_5_5_BE;
     96                                break;
     97                        case 24:
     98                                visual = VISUAL_BGR_8_8_8;
     99                                break;
     100                        case 32:
     101                                visual = VISUAL_RGB_0_8_8_8;
     102                                break;
     103                        default:
     104                                panic("Unsupported bits per pixel.");
     105                        }
     106                        fb_properties_t prop = {
     107                                .addr = bootinfo.screen.addr,
     108                                .offset = 0,
     109                                .x = bootinfo.screen.width,
     110                                .y = bootinfo.screen.height,
     111                                .scan = bootinfo.screen.scanline,
     112                                .visual = visual,
     113                        };
     114                        fb_init(&prop);
    128115                }
    129         }
    130        
    131         prop = ofw_tree_getprop(node, "linebytes");
    132         if ((prop) && (prop->value))
    133                 fb_scanline = *((uint32_t *) prop->value);
    134        
    135         if ((fb_addr) && (fb_width > 0) && (fb_height > 0)
    136             && (fb_scanline > 0) && (visual != VISUAL_UNKNOWN)) {
    137                 fb_properties_t fb_prop = {
    138                         .addr = fb_addr,
    139                         .offset = 0,
    140                         .x = fb_width,
    141                         .y = fb_height,
    142                         .scan = fb_scanline,
    143                         .visual = visual,
    144                 };
    145                 fb_init(&fb_prop);
    146         }
    147        
    148         /* Consider only a single device for now */
    149         return false;
    150 }
    151 
    152 void arch_post_mm_init(void)
    153 {
    154         if (config.cpu_active == 1) {
    155 #ifdef CONFIG_FB
    156                 ofw_tree_walk_by_device_type("display", display_register, NULL);
    157116#endif
    158117               
     
    173132}
    174133
    175 static bool macio_register(ofw_tree_node_t *node, void *arg)
    176 {
    177         ofw_pci_reg_t *assigned_address = NULL;
    178        
    179         ofw_tree_property_t *prop = ofw_tree_getprop(node, "assigned-addresses");
    180         if ((prop) && (prop->value))
    181                 assigned_address = ((ofw_pci_reg_t *) prop->value);
    182        
    183         if (assigned_address) {
     134void arch_post_smp_init(void)
     135{
     136        if (bootinfo.macio.addr) {
    184137                /* Initialize PIC */
    185138                cir_t cir;
    186139                void *cir_arg;
    187                 pic_init(assigned_address[0].addr, PAGE_SIZE, &cir, &cir_arg);
    188                
     140                pic_init(bootinfo.macio.addr, PAGE_SIZE, &cir, &cir_arg);
     141
    189142#ifdef CONFIG_MAC_KBD
    190                 uintptr_t pa = assigned_address[0].addr + 0x16000;
     143                uintptr_t pa = bootinfo.macio.addr + 0x16000;
    191144                uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE);
    192145                size_t offset = pa - aligned_addr;
    193146                size_t size = 2 * PAGE_SIZE;
    194                
     147                       
    195148                cuda_t *cuda = (cuda_t *)
    196149                    (hw_map(aligned_addr, offset + size) + offset);
    197                
     150                       
    198151                /* Initialize I/O controller */
    199152                cuda_instance_t *cuda_instance =
     
    210163#endif
    211164        }
    212        
    213         /* Consider only a single device for now */
    214         return false;
    215 }
    216 
    217 void arch_post_smp_init(void)
    218 {
    219         ofw_tree_walk_by_device_type("mac-io", macio_register, NULL);
    220165}
    221166
Note: See TracChangeset for help on using the changeset viewer.