diff options
author | imp <imp@FreeBSD.org> | 2014-08-14 04:21:20 +0000 |
---|---|---|
committer | imp <imp@FreeBSD.org> | 2014-08-14 04:21:20 +0000 |
commit | 7603d1d8c5d27d90217e5add74840bed15a3b1e1 (patch) | |
tree | 1b6dbf61b89ca870da42fca31da826827f809f96 /sys/arm | |
parent | a2466e5139b4ec91444cb30f51e04df165cae920 (diff) | |
download | FreeBSD-src-7603d1d8c5d27d90217e5add74840bed15a3b1e1.zip FreeBSD-src-7603d1d8c5d27d90217e5add74840bed15a3b1e1.tar.gz |
Start to add FDT support.
Diffstat (limited to 'sys/arm')
-rw-r--r-- | sys/arm/at91/at91_common.c | 90 | ||||
-rw-r--r-- | sys/arm/at91/at91_machdep.c | 26 |
2 files changed, 107 insertions, 9 deletions
diff --git a/sys/arm/at91/at91_common.c b/sys/arm/at91/at91_common.c new file mode 100644 index 0000000..25306f0 --- /dev/null +++ b/sys/arm/at91/at91_common.c @@ -0,0 +1,90 @@ +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#define _ARM32_BUS_DMA_PRIVATE +#include <sys/param.h> +#include <sys/systm.h> +#include <vm/vm.h> +#include <machine/devmap.h> +#include <machine/machdep.h> +#include <arm/at91/at91var.h> +#include <arm/at91/at91soc.h> +#include <arm/at91/at91_aicreg.h> +#include <dev/fdt/fdt_common.h> +#include <dev/ofw/openfirm.h> +#include <machine/fdt.h> + +extern const struct arm_devmap_entry at91_devmap[]; +extern struct bus_space at91_bs_tag; +bus_space_tag_t fdtbus_bs_tag = &at91_bs_tag; + +struct fdt_fixup_entry fdt_fixup_table[] = { + { NULL, NULL } +}; + +static int +fdt_aic_decode_ic(phandle_t node, pcell_t *intr, int *interrupt, int *trig, + int *pol) +{ + int offset; + + if (fdt_is_compatible(node, "atmel,at91rm9200-aic")) + offset = 0; + else + return (ENXIO); + + *interrupt = fdt32_to_cpu(intr[0]) + offset; + *trig = INTR_TRIGGER_CONFORM; + *pol = INTR_POLARITY_CONFORM; + + return (0); +} + +fdt_pic_decode_t fdt_pic_table[] = { + &fdt_aic_decode_ic, + NULL +}; + +static void +at91_eoi(void *unused) +{ + uint32_t *eoicr = (uint32_t *)(0xdffff000 + IC_EOICR); + + *eoicr = 0; +} + + +vm_offset_t +initarm_lastaddr(void) +{ + + return (arm_devmap_lastaddr()); +} + +void +initarm_early_init(void) +{ + + arm_post_filter = at91_eoi; + at91_soc_id(); + arm_devmap_register_table(at91_devmap); +} + +int +initarm_devmap_init(void) +{ + +// arm_devmap_add_entry(0xfff00000, 0x00100000); /* 1MB - uart, aic and timers*/ + + return (0); +} + +void +initarm_gpio_init(void) +{ +} + +void +initarm_late_init(void) +{ +} diff --git a/sys/arm/at91/at91_machdep.c b/sys/arm/at91/at91_machdep.c index 3da9e18..cb06598 100644 --- a/sys/arm/at91/at91_machdep.c +++ b/sys/arm/at91/at91_machdep.c @@ -43,6 +43,8 @@ * Created : 17/09/94 */ +#include "opt_platform.h" + #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -111,8 +113,12 @@ __FBSDID("$FreeBSD$"); /* this should be evenly divisable by PAGE_SIZE / L2_TABLE_SIZE_REAL (or 4) */ #define NUM_KERNEL_PTS (KERNEL_PT_AFKERNEL + KERNEL_PT_AFKERNEL_NUM) +extern struct bus_space at91_bs_tag; + struct pv_addr kernel_pt_table[NUM_KERNEL_PTS]; +uint32_t at91_master_clock; + /* Static device mappings. */ const struct arm_devmap_entry at91_devmap[] = { /* @@ -194,15 +200,6 @@ const struct arm_devmap_entry at91_devmap[] = { { 0, 0, 0, 0, 0, } }; -/* Physical and virtual addresses for some global pages */ - -struct pv_addr systempage; -struct pv_addr msgbufpv; -struct pv_addr irqstack; -struct pv_addr undstack; -struct pv_addr abtstack; -struct pv_addr kernelstack; - #ifdef LINUX_BOOT_ABI extern int membanks; extern int memstart[]; @@ -444,6 +441,16 @@ board_init(void) } #endif +#ifndef FDT +/* Physical and virtual addresses for some global pages */ + +struct pv_addr msgbufpv; +struct pv_addr kernelstack; +struct pv_addr systempage; +struct pv_addr irqstack; +struct pv_addr abtstack; +struct pv_addr undstack; + void * initarm(struct arm_boot_params *abp) { @@ -651,6 +658,7 @@ initarm(struct arm_boot_params *abp) return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP - sizeof(struct pcb))); } +#endif /* * These functions are handled elsewhere, so make them nops here. |