Subversion Repositories HelenOS

Rev

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

Rev 1896 Rev 1909
Line 37... Line 37...
37
 
37
 
38
#include <genarch/ofw/ofw_tree.h>
38
#include <genarch/ofw/ofw_tree.h>
39
#include <arch/memstr.h>
39
#include <arch/memstr.h>
40
#include <func.h>
40
#include <func.h>
41
#include <panic.h>
41
#include <panic.h>
-
 
42
#include <debug.h>
42
#include <macros.h>
43
#include <macros.h>
43
 
44
 
44
bool ofw_ebus_apply_ranges(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uintptr_t *pa)
45
bool ofw_ebus_apply_ranges(ofw_tree_node_t *node, ofw_ebus_reg_t *reg, uintptr_t *pa)
45
{
46
{
46
    ofw_tree_property_t *prop;
47
    ofw_tree_property_t *prop;
Line 71... Line 72...
71
    }
72
    }
72
 
73
 
73
    return false;
74
    return false;
74
}
75
}
75
 
76
 
-
 
77
bool 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
 
-
 
111
found:
-
 
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
 
76
/** @}
123
/** @}
77
 */
124
 */