Changeset View
Changeset View
Standalone View
Standalone View
head/sys/mips/mips/nexus.c
Show First 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
#ifdef INTRNG | #ifdef INTRNG | ||||
#include <machine/intr.h> | #include <machine/intr.h> | ||||
#else | #else | ||||
#include <machine/intr_machdep.h> | #include <machine/intr_machdep.h> | ||||
#endif | #endif | ||||
#ifdef FDT | #ifdef FDT | ||||
#include <dev/ofw/ofw_bus_subr.h> | |||||
#include <dev/ofw/openfirm.h> | #include <dev/ofw/openfirm.h> | ||||
#include "ofw_bus_if.h" | #include "ofw_bus_if.h" | ||||
#endif | #endif | ||||
#undef NEXUS_DEBUG | #undef NEXUS_DEBUG | ||||
#ifdef NEXUS_DEBUG | #ifdef NEXUS_DEBUG | ||||
#define dprintf printf | #define dprintf printf | ||||
#else | #else | ||||
▲ Show 20 Lines • Show All 349 Lines • ▼ Show 20 Lines | if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { | ||||
err = bus_space_map(rman_get_bustag(r), paddr, psize, 0, | err = bus_space_map(rman_get_bustag(r), paddr, psize, 0, | ||||
(bus_space_handle_t *)&vaddr); | (bus_space_handle_t *)&vaddr); | ||||
if (err != 0) { | if (err != 0) { | ||||
rman_deactivate_resource(r); | rman_deactivate_resource(r); | ||||
return (err); | return (err); | ||||
} | } | ||||
rman_set_virtual(r, vaddr); | rman_set_virtual(r, vaddr); | ||||
rman_set_bushandle(r, (bus_space_handle_t)(uintptr_t)vaddr); | rman_set_bushandle(r, (bus_space_handle_t)(uintptr_t)vaddr); | ||||
} else if (type == SYS_RES_IRQ) { | |||||
#ifdef INTRNG | |||||
intr_activate_irq(child, r); | |||||
#endif | |||||
} | } | ||||
return (rman_activate_resource(r)); | return (rman_activate_resource(r)); | ||||
} | } | ||||
static int | static int | ||||
nexus_deactivate_resource(device_t bus, device_t child, int type, int rid, | nexus_deactivate_resource(device_t bus, device_t child, int type, int rid, | ||||
struct resource *r) | struct resource *r) | ||||
{ | { | ||||
bus_space_handle_t vaddr; | bus_space_handle_t vaddr; | ||||
bus_size_t psize; | bus_size_t psize; | ||||
vaddr = rman_get_bushandle(r); | vaddr = rman_get_bushandle(r); | ||||
if (type == SYS_RES_MEMORY && vaddr != 0) { | if (type == SYS_RES_MEMORY && vaddr != 0) { | ||||
psize = (bus_size_t)rman_get_size(r); | psize = (bus_size_t)rman_get_size(r); | ||||
bus_space_unmap(rman_get_bustag(r), vaddr, psize); | bus_space_unmap(rman_get_bustag(r), vaddr, psize); | ||||
rman_set_virtual(r, NULL); | rman_set_virtual(r, NULL); | ||||
rman_set_bushandle(r, 0); | rman_set_bushandle(r, 0); | ||||
} else if (type == SYS_RES_IRQ) { | |||||
#ifdef INTRNG | |||||
intr_deactivate_irq(child, r); | |||||
#endif | |||||
} | } | ||||
return (rman_deactivate_resource(r)); | return (rman_deactivate_resource(r)); | ||||
} | } | ||||
static int | static int | ||||
nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, | nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, | ||||
driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) | driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep) | ||||
▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
#endif | #endif | ||||
#ifdef FDT | #ifdef FDT | ||||
static int | static int | ||||
nexus_ofw_map_intr(device_t dev, device_t child, phandle_t iparent, int icells, | nexus_ofw_map_intr(device_t dev, device_t child, phandle_t iparent, int icells, | ||||
pcell_t *intr) | pcell_t *intr) | ||||
{ | { | ||||
u_int irq; | |||||
struct intr_map_data_fdt *fdt_data; | |||||
size_t len; | |||||
#ifdef INTRNG | len = sizeof(*fdt_data) + icells * sizeof(pcell_t); | ||||
return (INTR_IRQ_INVALID); | fdt_data = (struct intr_map_data_fdt *)intr_alloc_map_data( | ||||
#else | INTR_MAP_DATA_FDT, len, M_WAITOK | M_ZERO); | ||||
return (intr_fdt_map_irq(iparent, intr, icells)); | fdt_data->iparent = iparent; | ||||
#endif | fdt_data->ncells = icells; | ||||
memcpy(fdt_data->cells, intr, icells * sizeof(pcell_t)); | |||||
irq = intr_map_irq(NULL, iparent, (struct intr_map_data *)fdt_data); | |||||
return (irq); | |||||
} | } | ||||
#endif | #endif | ||||
#endif /* INTRNG */ | #endif /* INTRNG */ | ||||
static void | static void | ||||
nexus_hinted_child(device_t bus, const char *dname, int dunit) | nexus_hinted_child(device_t bus, const char *dname, int dunit) | ||||
{ | { | ||||
device_t child; | device_t child; | ||||
▲ Show 20 Lines • Show All 51 Lines • Show Last 20 Lines |