Changeset 0b414b5 in mainline for kernel/genarch/src/ofw/ebus.c


Ignore:
Timestamp:
2006-10-02T21:07:23Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
233af8c5
Parents:
36db5ac
Message:

Extend the OFW device tree node with a void pointer. The boot loader is
supposed to reset all pointers in all nodes. The kernel uses the pointer
to recognize that a particular device has already been visited and initialized.

Read interrupt mapping from the OFW device tree for FHC devices (z8530) and
EBUS devices (ns16550). In case of FHC devices, remove hardwired values from
the code and use only values read from the tree. FHC initialization is started
when a FHC device wants to map its interrupt. In case of EBUS devices, map
the interrupt to INO. Interrupt enabling in the interrupt controller for that
specific interrupt is not implemented yet.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/ofw/ebus.c

    r36db5ac r0b414b5  
    4040#include <func.h>
    4141#include <panic.h>
     42#include <debug.h>
    4243#include <macros.h>
    4344
     
    7475}
    7576
     77bool ofw_ebus_map_interrupts(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uint32_t interrupt, int *ino)
     78{
     79        ofw_tree_property_t *prop;
     80        ofw_tree_node_t *controller;
     81       
     82        prop = ofw_tree_getprop(node, "interrupt-map");
     83        if (!prop || !prop->value)
     84                return false;
     85
     86        ofw_ebus_intr_map_t *intr_map = prop->value;
     87        count_t count = prop->size / sizeof(ofw_ebus_intr_map_t);
     88       
     89        ASSERT(count);
     90       
     91        prop = ofw_tree_getprop(node, "interrupt-map-mask");
     92        if (!prop || !prop->value)
     93                return false;
     94       
     95        ofw_ebus_intr_mask_t *intr_mask = prop->value;
     96       
     97        ASSERT(prop->size == sizeof(ofw_ebus_intr_mask_t));
     98       
     99        uint32_t space = reg->space & intr_mask->space_mask;
     100        uint32_t addr = reg->addr & intr_mask->addr_mask;
     101        uint32_t intr = interrupt & intr_mask->intr_mask;
     102       
     103        int i;
     104        for (i = 0; i < count; i++) {
     105                if ((intr_map[i].space == space) && (intr_map[i].addr == addr)
     106                        && (intr_map[i].intr == intr))
     107                        goto found;
     108        }
     109        return false;
     110
     111found:
     112        /*
     113         * We found the device that functions as an interrupt controller
     114         * for the interrupt. We also found mapping from interrupt to INO.
     115         */
     116
     117        controller = ofw_tree_find_node_by_handle(ofw_tree_lookup("/"), intr_map[i].controller_handle);
     118       
     119        *ino = intr_map[i].controller_ino;
     120        return true;
     121}
     122
    76123/** @}
    77124 */
Note: See TracChangeset for help on using the changeset viewer.