Index: head/sys/arm/arm/generic_timer.c
===================================================================
--- head/sys/arm/arm/generic_timer.c (revision 320776)
+++ head/sys/arm/arm/generic_timer.c (revision 320777)
@@ -1,544 +1,540 @@
/*-
* Copyright (c) 2011 The FreeBSD Foundation
* Copyright (c) 2013 Ruslan Bukin
* All rights reserved.
*
* Based on mpcore_timer.c developed by Ben Gray
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the company nor the name of the author may be used to
* endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/**
* Cortex-A7, Cortex-A15, ARMv8 and later Generic Timer
*/
#include "opt_acpi.h"
#include "opt_platform.h"
#include
__FBSDID("$FreeBSD$");
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#if defined(__arm__)
#include /* For arm_set_delay */
#endif
#ifdef FDT
#include
#include
#include
#endif
#ifdef DEV_ACPI
#include
#include
#endif
-#if defined(__arm__) && !defined(MULTIDELAY)
-#error The generic timer requires MULTIDELAY on 32bit arm
-#endif
-
#define GT_CTRL_ENABLE (1 << 0)
#define GT_CTRL_INT_MASK (1 << 1)
#define GT_CTRL_INT_STAT (1 << 2)
#define GT_REG_CTRL 0
#define GT_REG_TVAL 1
#define GT_CNTKCTL_PL0PTEN (1 << 9) /* PL0 Physical timer reg access */
#define GT_CNTKCTL_PL0VTEN (1 << 8) /* PL0 Virtual timer reg access */
#define GT_CNTKCTL_EVNTI (0xf << 4) /* Virtual counter event bits */
#define GT_CNTKCTL_EVNTDIR (1 << 3) /* Virtual counter event transition */
#define GT_CNTKCTL_EVNTEN (1 << 2) /* Enables virtual counter events */
#define GT_CNTKCTL_PL0VCTEN (1 << 1) /* PL0 CNTVCT and CNTFRQ access */
#define GT_CNTKCTL_PL0PCTEN (1 << 0) /* PL0 CNTPCT and CNTFRQ access */
struct arm_tmr_softc {
struct resource *res[4];
void *ihl[4];
uint32_t clkfreq;
struct eventtimer et;
bool physical;
};
static struct arm_tmr_softc *arm_tmr_sc = NULL;
static struct resource_spec timer_spec[] = {
{ SYS_RES_IRQ, 0, RF_ACTIVE }, /* Secure */
{ SYS_RES_IRQ, 1, RF_ACTIVE }, /* Non-secure */
{ SYS_RES_IRQ, 2, RF_ACTIVE | RF_OPTIONAL }, /* Virt */
{ SYS_RES_IRQ, 3, RF_ACTIVE | RF_OPTIONAL }, /* Hyp */
{ -1, 0 }
};
static uint32_t arm_tmr_fill_vdso_timehands(struct vdso_timehands *vdso_th,
struct timecounter *tc);
static void arm_tmr_do_delay(int usec, void *);
static timecounter_get_t arm_tmr_get_timecount;
static struct timecounter arm_tmr_timecount = {
.tc_name = "ARM MPCore Timecounter",
.tc_get_timecount = arm_tmr_get_timecount,
.tc_poll_pps = NULL,
.tc_counter_mask = ~0u,
.tc_frequency = 0,
.tc_quality = 1000,
.tc_fill_vdso_timehands = arm_tmr_fill_vdso_timehands,
};
#ifdef __arm__
#define get_el0(x) cp15_## x ##_get()
#define get_el1(x) cp15_## x ##_get()
#define set_el0(x, val) cp15_## x ##_set(val)
#define set_el1(x, val) cp15_## x ##_set(val)
#else /* __aarch64__ */
#define get_el0(x) READ_SPECIALREG(x ##_el0)
#define get_el1(x) READ_SPECIALREG(x ##_el1)
#define set_el0(x, val) WRITE_SPECIALREG(x ##_el0, val)
#define set_el1(x, val) WRITE_SPECIALREG(x ##_el1, val)
#endif
static int
get_freq(void)
{
return (get_el0(cntfrq));
}
static long
get_cntxct(bool physical)
{
uint64_t val;
isb();
if (physical)
val = get_el0(cntpct);
else
val = get_el0(cntvct);
return (val);
}
static int
set_ctrl(uint32_t val, bool physical)
{
if (physical)
set_el0(cntp_ctl, val);
else
set_el0(cntv_ctl, val);
isb();
return (0);
}
static int
set_tval(uint32_t val, bool physical)
{
if (physical)
set_el0(cntp_tval, val);
else
set_el0(cntv_tval, val);
isb();
return (0);
}
static int
get_ctrl(bool physical)
{
uint32_t val;
if (physical)
val = get_el0(cntp_ctl);
else
val = get_el0(cntv_ctl);
return (val);
}
static void
setup_user_access(void *arg __unused)
{
uint32_t cntkctl;
cntkctl = get_el1(cntkctl);
cntkctl &= ~(GT_CNTKCTL_PL0PTEN | GT_CNTKCTL_PL0VTEN |
GT_CNTKCTL_EVNTEN);
if (arm_tmr_sc->physical) {
cntkctl |= GT_CNTKCTL_PL0PCTEN;
cntkctl &= ~GT_CNTKCTL_PL0VCTEN;
} else {
cntkctl |= GT_CNTKCTL_PL0VCTEN;
cntkctl &= ~GT_CNTKCTL_PL0PCTEN;
}
set_el1(cntkctl, cntkctl);
isb();
}
static void
tmr_setup_user_access(void *arg __unused)
{
if (arm_tmr_sc != NULL)
smp_rendezvous(NULL, setup_user_access, NULL, NULL);
}
SYSINIT(tmr_ua, SI_SUB_SMP, SI_ORDER_SECOND, tmr_setup_user_access, NULL);
static unsigned
arm_tmr_get_timecount(struct timecounter *tc)
{
return (get_cntxct(arm_tmr_sc->physical));
}
static int
arm_tmr_start(struct eventtimer *et, sbintime_t first,
sbintime_t period __unused)
{
struct arm_tmr_softc *sc;
int counts, ctrl;
sc = (struct arm_tmr_softc *)et->et_priv;
if (first != 0) {
counts = ((uint32_t)et->et_frequency * first) >> 32;
ctrl = get_ctrl(sc->physical);
ctrl &= ~GT_CTRL_INT_MASK;
ctrl |= GT_CTRL_ENABLE;
set_tval(counts, sc->physical);
set_ctrl(ctrl, sc->physical);
return (0);
}
return (EINVAL);
}
static int
arm_tmr_stop(struct eventtimer *et)
{
struct arm_tmr_softc *sc;
int ctrl;
sc = (struct arm_tmr_softc *)et->et_priv;
ctrl = get_ctrl(sc->physical);
ctrl &= ~GT_CTRL_ENABLE;
set_ctrl(ctrl, sc->physical);
return (0);
}
static int
arm_tmr_intr(void *arg)
{
struct arm_tmr_softc *sc;
int ctrl;
sc = (struct arm_tmr_softc *)arg;
ctrl = get_ctrl(sc->physical);
if (ctrl & GT_CTRL_INT_STAT) {
ctrl |= GT_CTRL_INT_MASK;
set_ctrl(ctrl, sc->physical);
}
if (sc->et.et_active)
sc->et.et_event_cb(&sc->et, sc->et.et_arg);
return (FILTER_HANDLED);
}
#ifdef FDT
static int
arm_tmr_fdt_probe(device_t dev)
{
if (!ofw_bus_status_okay(dev))
return (ENXIO);
if (ofw_bus_is_compatible(dev, "arm,armv7-timer")) {
device_set_desc(dev, "ARMv7 Generic Timer");
return (BUS_PROBE_DEFAULT);
} else if (ofw_bus_is_compatible(dev, "arm,armv8-timer")) {
device_set_desc(dev, "ARMv8 Generic Timer");
return (BUS_PROBE_DEFAULT);
}
return (ENXIO);
}
#endif
#ifdef DEV_ACPI
static void
arm_tmr_acpi_identify(driver_t *driver, device_t parent)
{
ACPI_TABLE_GTDT *gtdt;
vm_paddr_t physaddr;
device_t dev;
physaddr = acpi_find_table(ACPI_SIG_GTDT);
if (physaddr == 0)
return;
gtdt = acpi_map_table(physaddr, ACPI_SIG_GTDT);
if (gtdt == NULL) {
device_printf(parent, "gic: Unable to map the GTDT\n");
return;
}
dev = BUS_ADD_CHILD(parent, BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE,
"generic_timer", -1);
if (dev == NULL) {
device_printf(parent, "add gic child failed\n");
goto out;
}
BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 0,
gtdt->SecureEl1Interrupt, 1);
BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 1,
gtdt->NonSecureEl1Interrupt, 1);
BUS_SET_RESOURCE(parent, dev, SYS_RES_IRQ, 2,
gtdt->VirtualTimerInterrupt, 1);
out:
acpi_unmap_table(gtdt);
}
static int
arm_tmr_acpi_probe(device_t dev)
{
device_set_desc(dev, "ARM Generic Timer");
return (BUS_PROBE_NOWILDCARD);
}
#endif
static int
arm_tmr_attach(device_t dev)
{
struct arm_tmr_softc *sc;
#ifdef FDT
phandle_t node;
pcell_t clock;
#endif
int error;
int i;
sc = device_get_softc(dev);
if (arm_tmr_sc)
return (ENXIO);
#ifdef FDT
/* Get the base clock frequency */
node = ofw_bus_get_node(dev);
if (node > 0) {
error = OF_getencprop(node, "clock-frequency", &clock,
sizeof(clock));
if (error > 0)
sc->clkfreq = clock;
}
#endif
if (sc->clkfreq == 0) {
/* Try to get clock frequency from timer */
sc->clkfreq = get_freq();
}
if (sc->clkfreq == 0) {
device_printf(dev, "No clock frequency specified\n");
return (ENXIO);
}
if (bus_alloc_resources(dev, timer_spec, sc->res)) {
device_printf(dev, "could not allocate resources\n");
return (ENXIO);
}
#ifdef __arm__
sc->physical = true;
#else /* __aarch64__ */
/* If we do not have a virtual timer use the physical. */
sc->physical = (sc->res[2] == NULL) ? true : false;
#endif
arm_tmr_sc = sc;
/* Setup secure, non-secure and virtual IRQs handler */
for (i = 0; i < 3; i++) {
/* If we do not have the interrupt, skip it. */
if (sc->res[i] == NULL)
continue;
error = bus_setup_intr(dev, sc->res[i], INTR_TYPE_CLK,
arm_tmr_intr, NULL, sc, &sc->ihl[i]);
if (error) {
device_printf(dev, "Unable to alloc int resource.\n");
return (ENXIO);
}
}
arm_tmr_timecount.tc_frequency = sc->clkfreq;
tc_init(&arm_tmr_timecount);
sc->et.et_name = "ARM MPCore Eventtimer";
sc->et.et_flags = ET_FLAGS_ONESHOT | ET_FLAGS_PERCPU;
sc->et.et_quality = 1000;
sc->et.et_frequency = sc->clkfreq;
sc->et.et_min_period = (0x00000010LLU << 32) / sc->et.et_frequency;
sc->et.et_max_period = (0xfffffffeLLU << 32) / sc->et.et_frequency;
sc->et.et_start = arm_tmr_start;
sc->et.et_stop = arm_tmr_stop;
sc->et.et_priv = sc;
et_register(&sc->et);
#if defined(__arm__)
arm_set_delay(arm_tmr_do_delay, sc);
#endif
return (0);
}
#ifdef FDT
static device_method_t arm_tmr_fdt_methods[] = {
DEVMETHOD(device_probe, arm_tmr_fdt_probe),
DEVMETHOD(device_attach, arm_tmr_attach),
{ 0, 0 }
};
static driver_t arm_tmr_fdt_driver = {
"generic_timer",
arm_tmr_fdt_methods,
sizeof(struct arm_tmr_softc),
};
static devclass_t arm_tmr_fdt_devclass;
EARLY_DRIVER_MODULE(timer, simplebus, arm_tmr_fdt_driver, arm_tmr_fdt_devclass,
0, 0, BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
EARLY_DRIVER_MODULE(timer, ofwbus, arm_tmr_fdt_driver, arm_tmr_fdt_devclass,
0, 0, BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
#endif
#ifdef DEV_ACPI
static device_method_t arm_tmr_acpi_methods[] = {
DEVMETHOD(device_identify, arm_tmr_acpi_identify),
DEVMETHOD(device_probe, arm_tmr_acpi_probe),
DEVMETHOD(device_attach, arm_tmr_attach),
{ 0, 0 }
};
static driver_t arm_tmr_acpi_driver = {
"generic_timer",
arm_tmr_acpi_methods,
sizeof(struct arm_tmr_softc),
};
static devclass_t arm_tmr_acpi_devclass;
EARLY_DRIVER_MODULE(timer, acpi, arm_tmr_acpi_driver, arm_tmr_acpi_devclass,
0, 0, BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
#endif
static void
arm_tmr_do_delay(int usec, void *arg)
{
struct arm_tmr_softc *sc = arg;
int32_t counts, counts_per_usec;
uint32_t first, last;
/* Get the number of times to count */
counts_per_usec = ((arm_tmr_timecount.tc_frequency / 1000000) + 1);
/*
* Clamp the timeout at a maximum value (about 32 seconds with
* a 66MHz clock). *Nobody* should be delay()ing for anywhere
* near that length of time and if they are, they should be hung
* out to dry.
*/
if (usec >= (0x80000000U / counts_per_usec))
counts = (0x80000000U / counts_per_usec) - 1;
else
counts = usec * counts_per_usec;
first = get_cntxct(sc->physical);
while (counts > 0) {
last = get_cntxct(sc->physical);
counts -= (int32_t)(last - first);
first = last;
}
}
#if defined(__aarch64__)
void
DELAY(int usec)
{
int32_t counts;
/*
* Check the timers are setup, if not just
* use a for loop for the meantime
*/
if (arm_tmr_sc == NULL) {
for (; usec > 0; usec--)
for (counts = 200; counts > 0; counts--)
/*
* Prevent the compiler from optimizing
* out the loop
*/
cpufunc_nullop();
} else
arm_tmr_do_delay(usec, arm_tmr_sc);
}
#endif
static uint32_t
arm_tmr_fill_vdso_timehands(struct vdso_timehands *vdso_th,
struct timecounter *tc)
{
vdso_th->th_algo = VDSO_TH_ALGO_ARM_GENTIM;
vdso_th->th_physical = arm_tmr_sc->physical;
bzero(vdso_th->th_res, sizeof(vdso_th->th_res));
return (1);
}
Index: head/sys/arm/arm/machdep.c
===================================================================
--- head/sys/arm/arm/machdep.c (revision 320776)
+++ head/sys/arm/arm/machdep.c (revision 320777)
@@ -1,1217 +1,1217 @@
/* $NetBSD: arm32_machdep.c,v 1.44 2004/03/24 15:34:47 atatat Exp $ */
/*-
* Copyright (c) 2004 Olivier Houchard
* Copyright (c) 1994-1998 Mark Brinicombe.
* Copyright (c) 1994 Brini.
* All rights reserved.
*
* This code is derived from software written for Brini by Mark Brinicombe
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Mark Brinicombe
* for the NetBSD Project.
* 4. The name of the company nor the name of the author may be used to
* endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* Machine dependent functions for kernel setup
*
* Created : 17/09/94
* Updated : 18/04/01 updated for new wscons
*/
#include "opt_compat.h"
#include "opt_ddb.h"
#include "opt_kstack_pages.h"
#include "opt_platform.h"
#include "opt_sched.h"
#include "opt_timer.h"
#include
__FBSDID("$FreeBSD$");
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef FDT
#include
#include
#endif
#ifdef DEBUG
#define debugf(fmt, args...) printf(fmt, ##args)
#else
#define debugf(fmt, args...)
#endif
#if defined(COMPAT_FREEBSD4) || defined(COMPAT_FREEBSD5) || \
defined(COMPAT_FREEBSD6) || defined(COMPAT_FREEBSD7) || \
defined(COMPAT_FREEBSD9)
#error FreeBSD/arm doesn't provide compatibility with releases prior to 10
#endif
#if __ARM_ARCH >= 6 && !defined(INTRNG)
#error armv6 requires INTRNG
#endif
struct pcpu __pcpu[MAXCPU];
struct pcpu *pcpup = &__pcpu[0];
static struct trapframe proc0_tf;
uint32_t cpu_reset_address = 0;
int cold = 1;
vm_offset_t vector_page;
int (*_arm_memcpy)(void *, void *, int, int) = NULL;
int (*_arm_bzero)(void *, int, int) = NULL;
int _min_memcpy_size = 0;
int _min_bzero_size = 0;
extern int *end;
#ifdef FDT
vm_paddr_t pmap_pa;
#if __ARM_ARCH >= 6
vm_offset_t systempage;
vm_offset_t irqstack;
vm_offset_t undstack;
vm_offset_t abtstack;
#else
/*
* This is the number of L2 page tables required for covering max
* (hypothetical) memsize of 4GB and all kernel mappings (vectors, msgbuf,
* stacks etc.), uprounded to be divisible by 4.
*/
#define KERNEL_PT_MAX 78
static struct pv_addr kernel_pt_table[KERNEL_PT_MAX];
struct pv_addr systempage;
static struct pv_addr msgbufpv;
struct pv_addr irqstack;
struct pv_addr undstack;
struct pv_addr abtstack;
static struct pv_addr kernelstack;
#endif /* __ARM_ARCH >= 6 */
#endif /* FDT */
-#ifdef MULTIDELAY
+#ifdef PLATFORM
static delay_func *delay_impl;
static void *delay_arg;
#endif
struct kva_md_info kmi;
/*
* arm32_vector_init:
*
* Initialize the vector page, and select whether or not to
* relocate the vectors.
*
* NOTE: We expect the vector page to be mapped at its expected
* destination.
*/
extern unsigned int page0[], page0_data[];
void
arm_vector_init(vm_offset_t va, int which)
{
unsigned int *vectors = (int *) va;
unsigned int *vectors_data = vectors + (page0_data - page0);
int vec;
/*
* Loop through the vectors we're taking over, and copy the
* vector's insn and data word.
*/
for (vec = 0; vec < ARM_NVEC; vec++) {
if ((which & (1 << vec)) == 0) {
/* Don't want to take over this vector. */
continue;
}
vectors[vec] = page0[vec];
vectors_data[vec] = page0_data[vec];
}
/* Now sync the vectors. */
icache_sync(va, (ARM_NVEC * 2) * sizeof(u_int));
vector_page = va;
#if __ARM_ARCH < 6
if (va == ARM_VECTORS_HIGH) {
/*
* Enable high vectors in the system control reg (SCTLR).
*
* Assume the MD caller knows what it's doing here, and really
* does want the vector page relocated.
*
* Note: This has to be done here (and not just in
* cpu_setup()) because the vector page needs to be
* accessible *before* cpu_startup() is called.
* Think ddb(9) ...
*/
cpu_control(CPU_CONTROL_VECRELOC, CPU_CONTROL_VECRELOC);
}
#endif
}
static void
cpu_startup(void *dummy)
{
struct pcb *pcb = thread0.td_pcb;
const unsigned int mbyte = 1024 * 1024;
#if __ARM_ARCH < 6 && !defined(ARM_CACHE_LOCK_ENABLE)
vm_page_t m;
#endif
identify_arm_cpu();
vm_ksubmap_init(&kmi);
/*
* Display the RAM layout.
*/
printf("real memory = %ju (%ju MB)\n",
(uintmax_t)arm32_ptob(realmem),
(uintmax_t)arm32_ptob(realmem) / mbyte);
printf("avail memory = %ju (%ju MB)\n",
(uintmax_t)arm32_ptob(vm_cnt.v_free_count),
(uintmax_t)arm32_ptob(vm_cnt.v_free_count) / mbyte);
if (bootverbose) {
arm_physmem_print_tables();
devmap_print_table();
}
bufinit();
vm_pager_bufferinit();
pcb->pcb_regs.sf_sp = (u_int)thread0.td_kstack +
USPACE_SVC_STACK_TOP;
pmap_set_pcb_pagedir(kernel_pmap, pcb);
#if __ARM_ARCH < 6
vector_page_setprot(VM_PROT_READ);
pmap_postinit();
#ifdef ARM_CACHE_LOCK_ENABLE
pmap_kenter_user(ARM_TP_ADDRESS, ARM_TP_ADDRESS);
arm_lock_cache_line(ARM_TP_ADDRESS);
#else
m = vm_page_alloc(NULL, 0, VM_ALLOC_NOOBJ | VM_ALLOC_ZERO);
pmap_kenter_user(ARM_TP_ADDRESS, VM_PAGE_TO_PHYS(m));
#endif
*(uint32_t *)ARM_RAS_START = 0;
*(uint32_t *)ARM_RAS_END = 0xffffffff;
#endif
}
SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
/*
* Flush the D-cache for non-DMA I/O so that the I-cache can
* be made coherent later.
*/
void
cpu_flush_dcache(void *ptr, size_t len)
{
dcache_wb_poc((vm_offset_t)ptr, (vm_paddr_t)vtophys(ptr), len);
}
/* Get current clock frequency for the given cpu id. */
int
cpu_est_clockrate(int cpu_id, uint64_t *rate)
{
return (ENXIO);
}
void
cpu_idle(int busy)
{
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d", busy, curcpu);
spinlock_enter();
#ifndef NO_EVENTTIMERS
if (!busy)
cpu_idleclock();
#endif
if (!sched_runnable())
cpu_sleep(0);
#ifndef NO_EVENTTIMERS
if (!busy)
cpu_activeclock();
#endif
spinlock_exit();
CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done", busy, curcpu);
}
int
cpu_idle_wakeup(int cpu)
{
return (0);
}
#ifdef NO_EVENTTIMERS
/*
* Most ARM platforms don't need to do anything special to init their clocks
* (they get intialized during normal device attachment), and by not defining a
* cpu_initclocks() function they get this generic one. Any platform that needs
* to do something special can just provide their own implementation, which will
* override this one due to the weak linkage.
*/
void
arm_generic_initclocks(void)
{
}
__weak_reference(arm_generic_initclocks, cpu_initclocks);
#else
void
cpu_initclocks(void)
{
#ifdef SMP
if (PCPU_GET(cpuid) == 0)
cpu_initclocks_bsp();
else
cpu_initclocks_ap();
#else
cpu_initclocks_bsp();
#endif
}
#endif
-#ifdef MULTIDELAY
+#ifdef PLATFORM
void
arm_set_delay(delay_func *impl, void *arg)
{
KASSERT(impl != NULL, ("No DELAY implementation"));
delay_impl = impl;
delay_arg = arg;
}
void
DELAY(int usec)
{
delay_impl(usec, delay_arg);
}
#endif
void
cpu_pcpu_init(struct pcpu *pcpu, int cpuid, size_t size)
{
}
void
spinlock_enter(void)
{
struct thread *td;
register_t cspr;
td = curthread;
if (td->td_md.md_spinlock_count == 0) {
cspr = disable_interrupts(PSR_I | PSR_F);
td->td_md.md_spinlock_count = 1;
td->td_md.md_saved_cspr = cspr;
} else
td->td_md.md_spinlock_count++;
critical_enter();
}
void
spinlock_exit(void)
{
struct thread *td;
register_t cspr;
td = curthread;
critical_exit();
cspr = td->td_md.md_saved_cspr;
td->td_md.md_spinlock_count--;
if (td->td_md.md_spinlock_count == 0)
restore_interrupts(cspr);
}
/*
* Clear registers on exec
*/
void
exec_setregs(struct thread *td, struct image_params *imgp, u_long stack)
{
struct trapframe *tf = td->td_frame;
memset(tf, 0, sizeof(*tf));
tf->tf_usr_sp = stack;
tf->tf_usr_lr = imgp->entry_addr;
tf->tf_svc_lr = 0x77777777;
tf->tf_pc = imgp->entry_addr;
tf->tf_spsr = PSR_USR32_MODE;
}
#ifdef VFP
/*
* Get machine VFP context.
*/
static void
get_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
{
struct pcb *curpcb;
curpcb = curthread->td_pcb;
critical_enter();
vfp_store(&curpcb->pcb_vfpstate, false);
memcpy(vfp->mcv_reg, curpcb->pcb_vfpstate.reg,
sizeof(vfp->mcv_reg));
vfp->mcv_fpscr = curpcb->pcb_vfpstate.fpscr;
critical_exit();
}
/*
* Set machine VFP context.
*/
static void
set_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
{
struct pcb *curpcb;
curpcb = curthread->td_pcb;
critical_enter();
vfp_discard(td);
memcpy(curpcb->pcb_vfpstate.reg, vfp->mcv_reg,
sizeof(curpcb->pcb_vfpstate.reg));
curpcb->pcb_vfpstate.fpscr = vfp->mcv_fpscr;
critical_exit();
}
#endif
/*
* Get machine context.
*/
int
get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
{
struct trapframe *tf = td->td_frame;
__greg_t *gr = mcp->__gregs;
if (clear_ret & GET_MC_CLEAR_RET) {
gr[_REG_R0] = 0;
gr[_REG_CPSR] = tf->tf_spsr & ~PSR_C;
} else {
gr[_REG_R0] = tf->tf_r0;
gr[_REG_CPSR] = tf->tf_spsr;
}
gr[_REG_R1] = tf->tf_r1;
gr[_REG_R2] = tf->tf_r2;
gr[_REG_R3] = tf->tf_r3;
gr[_REG_R4] = tf->tf_r4;
gr[_REG_R5] = tf->tf_r5;
gr[_REG_R6] = tf->tf_r6;
gr[_REG_R7] = tf->tf_r7;
gr[_REG_R8] = tf->tf_r8;
gr[_REG_R9] = tf->tf_r9;
gr[_REG_R10] = tf->tf_r10;
gr[_REG_R11] = tf->tf_r11;
gr[_REG_R12] = tf->tf_r12;
gr[_REG_SP] = tf->tf_usr_sp;
gr[_REG_LR] = tf->tf_usr_lr;
gr[_REG_PC] = tf->tf_pc;
mcp->mc_vfp_size = 0;
mcp->mc_vfp_ptr = NULL;
memset(&mcp->mc_spare, 0, sizeof(mcp->mc_spare));
return (0);
}
/*
* Set machine context.
*
* However, we don't set any but the user modifiable flags, and we won't
* touch the cs selector.
*/
int
set_mcontext(struct thread *td, mcontext_t *mcp)
{
mcontext_vfp_t mc_vfp, *vfp;
struct trapframe *tf = td->td_frame;
const __greg_t *gr = mcp->__gregs;
#ifdef WITNESS
if (mcp->mc_vfp_size != 0 && mcp->mc_vfp_size != sizeof(mc_vfp)) {
printf("%s: %s: Malformed mc_vfp_size: %d (0x%08X)\n",
td->td_proc->p_comm, __func__,
mcp->mc_vfp_size, mcp->mc_vfp_size);
} else if (mcp->mc_vfp_size != 0 && mcp->mc_vfp_ptr == NULL) {
printf("%s: %s: c_vfp_size != 0 but mc_vfp_ptr == NULL\n",
td->td_proc->p_comm, __func__);
}
#endif
if (mcp->mc_vfp_size == sizeof(mc_vfp) && mcp->mc_vfp_ptr != NULL) {
if (copyin(mcp->mc_vfp_ptr, &mc_vfp, sizeof(mc_vfp)) != 0)
return (EFAULT);
vfp = &mc_vfp;
} else {
vfp = NULL;
}
tf->tf_r0 = gr[_REG_R0];
tf->tf_r1 = gr[_REG_R1];
tf->tf_r2 = gr[_REG_R2];
tf->tf_r3 = gr[_REG_R3];
tf->tf_r4 = gr[_REG_R4];
tf->tf_r5 = gr[_REG_R5];
tf->tf_r6 = gr[_REG_R6];
tf->tf_r7 = gr[_REG_R7];
tf->tf_r8 = gr[_REG_R8];
tf->tf_r9 = gr[_REG_R9];
tf->tf_r10 = gr[_REG_R10];
tf->tf_r11 = gr[_REG_R11];
tf->tf_r12 = gr[_REG_R12];
tf->tf_usr_sp = gr[_REG_SP];
tf->tf_usr_lr = gr[_REG_LR];
tf->tf_pc = gr[_REG_PC];
tf->tf_spsr = gr[_REG_CPSR];
#ifdef VFP
if (vfp != NULL)
set_vfpcontext(td, vfp);
#endif
return (0);
}
void
sendsig(catcher, ksi, mask)
sig_t catcher;
ksiginfo_t *ksi;
sigset_t *mask;
{
struct thread *td;
struct proc *p;
struct trapframe *tf;
struct sigframe *fp, frame;
struct sigacts *psp;
struct sysentvec *sysent;
int onstack;
int sig;
int code;
td = curthread;
p = td->td_proc;
PROC_LOCK_ASSERT(p, MA_OWNED);
sig = ksi->ksi_signo;
code = ksi->ksi_code;
psp = p->p_sigacts;
mtx_assert(&psp->ps_mtx, MA_OWNED);
tf = td->td_frame;
onstack = sigonstack(tf->tf_usr_sp);
CTR4(KTR_SIG, "sendsig: td=%p (%s) catcher=%p sig=%d", td, p->p_comm,
catcher, sig);
/* Allocate and validate space for the signal handler context. */
if ((td->td_pflags & TDP_ALTSTACK) != 0 && !(onstack) &&
SIGISMEMBER(psp->ps_sigonstack, sig)) {
fp = (struct sigframe *)((uintptr_t)td->td_sigstk.ss_sp +
td->td_sigstk.ss_size);
#if defined(COMPAT_43)
td->td_sigstk.ss_flags |= SS_ONSTACK;
#endif
} else
fp = (struct sigframe *)td->td_frame->tf_usr_sp;
/* make room on the stack */
fp--;
/* make the stack aligned */
fp = (struct sigframe *)STACKALIGN(fp);
/* Populate the siginfo frame. */
get_mcontext(td, &frame.sf_uc.uc_mcontext, 0);
#ifdef VFP
get_vfpcontext(td, &frame.sf_vfp);
frame.sf_uc.uc_mcontext.mc_vfp_size = sizeof(fp->sf_vfp);
frame.sf_uc.uc_mcontext.mc_vfp_ptr = &fp->sf_vfp;
#else
frame.sf_uc.uc_mcontext.mc_vfp_size = 0;
frame.sf_uc.uc_mcontext.mc_vfp_ptr = NULL;
#endif
frame.sf_si = ksi->ksi_info;
frame.sf_uc.uc_sigmask = *mask;
frame.sf_uc.uc_stack.ss_flags = (td->td_pflags & TDP_ALTSTACK )
? ((onstack) ? SS_ONSTACK : 0) : SS_DISABLE;
frame.sf_uc.uc_stack = td->td_sigstk;
mtx_unlock(&psp->ps_mtx);
PROC_UNLOCK(td->td_proc);
/* Copy the sigframe out to the user's stack. */
if (copyout(&frame, fp, sizeof(*fp)) != 0) {
/* Process has trashed its stack. Kill it. */
CTR2(KTR_SIG, "sendsig: sigexit td=%p fp=%p", td, fp);
PROC_LOCK(p);
sigexit(td, SIGILL);
}
/*
* Build context to run handler in. We invoke the handler
* directly, only returning via the trampoline. Note the
* trampoline version numbers are coordinated with machine-
* dependent code in libc.
*/
tf->tf_r0 = sig;
tf->tf_r1 = (register_t)&fp->sf_si;
tf->tf_r2 = (register_t)&fp->sf_uc;
/* the trampoline uses r5 as the uc address */
tf->tf_r5 = (register_t)&fp->sf_uc;
tf->tf_pc = (register_t)catcher;
tf->tf_usr_sp = (register_t)fp;
sysent = p->p_sysent;
if (sysent->sv_sigcode_base != 0)
tf->tf_usr_lr = (register_t)sysent->sv_sigcode_base;
else
tf->tf_usr_lr = (register_t)(sysent->sv_psstrings -
*(sysent->sv_szsigcode));
/* Set the mode to enter in the signal handler */
#if __ARM_ARCH >= 7
if ((register_t)catcher & 1)
tf->tf_spsr |= PSR_T;
else
tf->tf_spsr &= ~PSR_T;
#endif
CTR3(KTR_SIG, "sendsig: return td=%p pc=%#x sp=%#x", td, tf->tf_usr_lr,
tf->tf_usr_sp);
PROC_LOCK(p);
mtx_lock(&psp->ps_mtx);
}
int
sys_sigreturn(td, uap)
struct thread *td;
struct sigreturn_args /* {
const struct __ucontext *sigcntxp;
} */ *uap;
{
ucontext_t uc;
int spsr;
if (uap == NULL)
return (EFAULT);
if (copyin(uap->sigcntxp, &uc, sizeof(uc)))
return (EFAULT);
/*
* Make sure the processor mode has not been tampered with and
* interrupts have not been disabled.
*/
spsr = uc.uc_mcontext.__gregs[_REG_CPSR];
if ((spsr & PSR_MODE) != PSR_USR32_MODE ||
(spsr & (PSR_I | PSR_F)) != 0)
return (EINVAL);
/* Restore register context. */
set_mcontext(td, &uc.uc_mcontext);
/* Restore signal mask. */
kern_sigprocmask(td, SIG_SETMASK, &uc.uc_sigmask, NULL, 0);
return (EJUSTRETURN);
}
/*
* Construct a PCB from a trapframe. This is called from kdb_trap() where
* we want to start a backtrace from the function that caused us to enter
* the debugger. We have the context in the trapframe, but base the trace
* on the PCB. The PCB doesn't have to be perfect, as long as it contains
* enough for a backtrace.
*/
void
makectx(struct trapframe *tf, struct pcb *pcb)
{
pcb->pcb_regs.sf_r4 = tf->tf_r4;
pcb->pcb_regs.sf_r5 = tf->tf_r5;
pcb->pcb_regs.sf_r6 = tf->tf_r6;
pcb->pcb_regs.sf_r7 = tf->tf_r7;
pcb->pcb_regs.sf_r8 = tf->tf_r8;
pcb->pcb_regs.sf_r9 = tf->tf_r9;
pcb->pcb_regs.sf_r10 = tf->tf_r10;
pcb->pcb_regs.sf_r11 = tf->tf_r11;
pcb->pcb_regs.sf_r12 = tf->tf_r12;
pcb->pcb_regs.sf_pc = tf->tf_pc;
pcb->pcb_regs.sf_lr = tf->tf_usr_lr;
pcb->pcb_regs.sf_sp = tf->tf_usr_sp;
}
void
pcpu0_init(void)
{
#if __ARM_ARCH >= 6
set_curthread(&thread0);
#endif
pcpu_init(pcpup, 0, sizeof(struct pcpu));
PCPU_SET(curthread, &thread0);
}
/*
* Initialize proc0
*/
void
init_proc0(vm_offset_t kstack)
{
proc_linkup0(&proc0, &thread0);
thread0.td_kstack = kstack;
thread0.td_pcb = (struct pcb *)
(thread0.td_kstack + kstack_pages * PAGE_SIZE) - 1;
thread0.td_pcb->pcb_flags = 0;
thread0.td_pcb->pcb_vfpcpu = -1;
thread0.td_pcb->pcb_vfpstate.fpscr = VFPSCR_DN;
thread0.td_frame = &proc0_tf;
pcpup->pc_curpcb = thread0.td_pcb;
}
#if __ARM_ARCH >= 6
void
set_stackptrs(int cpu)
{
set_stackptr(PSR_IRQ32_MODE,
irqstack + ((IRQ_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
set_stackptr(PSR_ABT32_MODE,
abtstack + ((ABT_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
set_stackptr(PSR_UND32_MODE,
undstack + ((UND_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
}
#else
void
set_stackptrs(int cpu)
{
set_stackptr(PSR_IRQ32_MODE,
irqstack.pv_va + ((IRQ_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
set_stackptr(PSR_ABT32_MODE,
abtstack.pv_va + ((ABT_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
set_stackptr(PSR_UND32_MODE,
undstack.pv_va + ((UND_STACK_SIZE * PAGE_SIZE) * (cpu + 1)));
}
#endif
#ifdef FDT
#if __ARM_ARCH < 6
void *
initarm(struct arm_boot_params *abp)
{
struct mem_region mem_regions[FDT_MEM_REGIONS];
struct pv_addr kernel_l1pt;
struct pv_addr dpcpu;
vm_offset_t dtbp, freemempos, l2_start, lastaddr;
uint64_t memsize;
uint32_t l2size;
char *env;
void *kmdp;
u_int l1pagetable;
int i, j, err_devmap, mem_regions_sz;
lastaddr = parse_boot_param(abp);
arm_physmem_kernaddr = abp->abp_physaddr;
memsize = 0;
cpuinfo_init();
set_cpufuncs();
/*
* Find the dtb passed in by the boot loader.
*/
kmdp = preload_search_by_type("elf kernel");
if (kmdp != NULL)
dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
else
dtbp = (vm_offset_t)NULL;
#if defined(FDT_DTB_STATIC)
/*
* In case the device tree blob was not retrieved (from metadata) try
* to use the statically embedded one.
*/
if (dtbp == (vm_offset_t)NULL)
dtbp = (vm_offset_t)&fdt_static_dtb;
#endif
if (OF_install(OFW_FDT, 0) == FALSE)
panic("Cannot install FDT");
if (OF_init((void *)dtbp) != 0)
panic("OF_init failed with the found device tree");
/* Grab physical memory regions information from device tree. */
if (fdt_get_mem_regions(mem_regions, &mem_regions_sz, &memsize) != 0)
panic("Cannot get physical memory regions");
arm_physmem_hardware_regions(mem_regions, mem_regions_sz);
/* Grab reserved memory regions information from device tree. */
if (fdt_get_reserved_regions(mem_regions, &mem_regions_sz) == 0)
arm_physmem_exclude_regions(mem_regions, mem_regions_sz,
EXFLAG_NODUMP | EXFLAG_NOALLOC);
/* Platform-specific initialisation */
platform_probe_and_attach();
pcpu0_init();
/* Do basic tuning, hz etc */
init_param1();
/* Calculate number of L2 tables needed for mapping vm_page_array */
l2size = (memsize / PAGE_SIZE) * sizeof(struct vm_page);
l2size = (l2size >> L1_S_SHIFT) + 1;
/*
* Add one table for end of kernel map, one for stacks, msgbuf and
* L1 and L2 tables map, one for vectors map and two for
* l2 structures from pmap_bootstrap.
*/
l2size += 5;
/* Make it divisible by 4 */
l2size = (l2size + 3) & ~3;
freemempos = (lastaddr + PAGE_MASK) & ~PAGE_MASK;
/* Define a macro to simplify memory allocation */
#define valloc_pages(var, np) \
alloc_pages((var).pv_va, (np)); \
(var).pv_pa = (var).pv_va + (abp->abp_physaddr - KERNVIRTADDR);
#define alloc_pages(var, np) \
(var) = freemempos; \
freemempos += (np * PAGE_SIZE); \
memset((char *)(var), 0, ((np) * PAGE_SIZE));
while (((freemempos - L1_TABLE_SIZE) & (L1_TABLE_SIZE - 1)) != 0)
freemempos += PAGE_SIZE;
valloc_pages(kernel_l1pt, L1_TABLE_SIZE / PAGE_SIZE);
for (i = 0, j = 0; i < l2size; ++i) {
if (!(i % (PAGE_SIZE / L2_TABLE_SIZE_REAL))) {
valloc_pages(kernel_pt_table[i],
L2_TABLE_SIZE / PAGE_SIZE);
j = i;
} else {
kernel_pt_table[i].pv_va = kernel_pt_table[j].pv_va +
L2_TABLE_SIZE_REAL * (i - j);
kernel_pt_table[i].pv_pa =
kernel_pt_table[i].pv_va - KERNVIRTADDR +
abp->abp_physaddr;
}
}
/*
* Allocate a page for the system page mapped to 0x00000000
* or 0xffff0000. This page will just contain the system vectors
* and can be shared by all processes.
*/
valloc_pages(systempage, 1);
/* Allocate dynamic per-cpu area. */
valloc_pages(dpcpu, DPCPU_SIZE / PAGE_SIZE);
dpcpu_init((void *)dpcpu.pv_va, 0);
/* Allocate stacks for all modes */
valloc_pages(irqstack, IRQ_STACK_SIZE * MAXCPU);
valloc_pages(abtstack, ABT_STACK_SIZE * MAXCPU);
valloc_pages(undstack, UND_STACK_SIZE * MAXCPU);
valloc_pages(kernelstack, kstack_pages * MAXCPU);
valloc_pages(msgbufpv, round_page(msgbufsize) / PAGE_SIZE);
/*
* Now we start construction of the L1 page table
* We start by mapping the L2 page tables into the L1.
* This means that we can replace L1 mappings later on if necessary
*/
l1pagetable = kernel_l1pt.pv_va;
/*
* Try to map as much as possible of kernel text and data using
* 1MB section mapping and for the rest of initial kernel address
* space use L2 coarse tables.
*
* Link L2 tables for mapping remainder of kernel (modulo 1MB)
* and kernel structures
*/
l2_start = lastaddr & ~(L1_S_OFFSET);
for (i = 0 ; i < l2size - 1; i++)
pmap_link_l2pt(l1pagetable, l2_start + i * L1_S_SIZE,
&kernel_pt_table[i]);
pmap_curmaxkvaddr = l2_start + (l2size - 1) * L1_S_SIZE;
/* Map kernel code and data */
pmap_map_chunk(l1pagetable, KERNVIRTADDR, abp->abp_physaddr,
(((uint32_t)(lastaddr) - KERNVIRTADDR) + PAGE_MASK) & ~PAGE_MASK,
VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
/* Map L1 directory and allocated L2 page tables */
pmap_map_chunk(l1pagetable, kernel_l1pt.pv_va, kernel_l1pt.pv_pa,
L1_TABLE_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
pmap_map_chunk(l1pagetable, kernel_pt_table[0].pv_va,
kernel_pt_table[0].pv_pa,
L2_TABLE_SIZE_REAL * l2size,
VM_PROT_READ|VM_PROT_WRITE, PTE_PAGETABLE);
/* Map allocated DPCPU, stacks and msgbuf */
pmap_map_chunk(l1pagetable, dpcpu.pv_va, dpcpu.pv_pa,
freemempos - dpcpu.pv_va,
VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
/* Link and map the vector page */
pmap_link_l2pt(l1pagetable, ARM_VECTORS_HIGH,
&kernel_pt_table[l2size - 1]);
pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa,
VM_PROT_READ|VM_PROT_WRITE|VM_PROT_EXECUTE, PTE_CACHE);
/* Establish static device mappings. */
err_devmap = platform_devmap_init();
devmap_bootstrap(l1pagetable, NULL);
vm_max_kernel_address = platform_lastaddr();
cpu_domains((DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL * 2)) | DOMAIN_CLIENT);
pmap_pa = kernel_l1pt.pv_pa;
cpu_setttb(kernel_l1pt.pv_pa);
cpu_tlb_flushID();
cpu_domains(DOMAIN_CLIENT << (PMAP_DOMAIN_KERNEL * 2));
/*
* Now that proper page tables are installed, call cpu_setup() to enable
* instruction and data caches and other chip-specific features.
*/
cpu_setup();
/*
* Only after the SOC registers block is mapped we can perform device
* tree fixups, as they may attempt to read parameters from hardware.
*/
OF_interpret("perform-fixup", 0);
platform_gpio_init();
cninit();
debugf("initarm: console initialized\n");
debugf(" arg1 kmdp = 0x%08x\n", (uint32_t)kmdp);
debugf(" boothowto = 0x%08x\n", boothowto);
debugf(" dtbp = 0x%08x\n", (uint32_t)dtbp);
arm_print_kenv();
env = kern_getenv("kernelname");
if (env != NULL) {
strlcpy(kernelname, env, sizeof(kernelname));
freeenv(env);
}
if (err_devmap != 0)
printf("WARNING: could not fully configure devmap, error=%d\n",
err_devmap);
platform_late_init();
/*
* Pages were allocated during the secondary bootstrap for the
* stacks for different CPU modes.
* We must now set the r13 registers in the different CPU modes to
* point to these stacks.
* Since the ARM stacks use STMFD etc. we must set r13 to the top end
* of the stack memory.
*/
cpu_control(CPU_CONTROL_MMU_ENABLE, CPU_CONTROL_MMU_ENABLE);
set_stackptrs(0);
/*
* We must now clean the cache again....
* Cleaning may be done by reading new data to displace any
* dirty data in the cache. This will have happened in cpu_setttb()
* but since we are boot strapping the addresses used for the read
* may have just been remapped and thus the cache could be out
* of sync. A re-clean after the switch will cure this.
* After booting there are no gross relocations of the kernel thus
* this problem will not occur after initarm().
*/
cpu_idcache_wbinv_all();
undefined_init();
init_proc0(kernelstack.pv_va);
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
pmap_bootstrap(freemempos, &kernel_l1pt);
msgbufp = (void *)msgbufpv.pv_va;
msgbufinit(msgbufp, msgbufsize);
mutex_init();
/*
* Exclude the kernel (and all the things we allocated which immediately
* follow the kernel) from the VM allocation pool but not from crash
* dumps. virtual_avail is a global variable which tracks the kva we've
* "allocated" while setting up pmaps.
*
* Prepare the list of physical memory available to the vm subsystem.
*/
arm_physmem_exclude_region(abp->abp_physaddr,
(virtual_avail - KERNVIRTADDR), EXFLAG_NOALLOC);
arm_physmem_init_kernel_globals();
init_param2(physmem);
dbg_monitor_init();
kdb_init();
return ((void *)(kernelstack.pv_va + USPACE_SVC_STACK_TOP -
sizeof(struct pcb)));
}
#else /* __ARM_ARCH < 6 */
void *
initarm(struct arm_boot_params *abp)
{
struct mem_region mem_regions[FDT_MEM_REGIONS];
vm_paddr_t lastaddr;
vm_offset_t dtbp, kernelstack, dpcpu;
char *env;
void *kmdp;
int err_devmap, mem_regions_sz;
#ifdef EFI
struct efi_map_header *efihdr;
#endif
/* get last allocated physical address */
arm_physmem_kernaddr = abp->abp_physaddr;
lastaddr = parse_boot_param(abp) - KERNVIRTADDR + arm_physmem_kernaddr;
set_cpufuncs();
cpuinfo_init();
/*
* Find the dtb passed in by the boot loader.
*/
kmdp = preload_search_by_type("elf kernel");
dtbp = MD_FETCH(kmdp, MODINFOMD_DTBP, vm_offset_t);
#if defined(FDT_DTB_STATIC)
/*
* In case the device tree blob was not retrieved (from metadata) try
* to use the statically embedded one.
*/
if (dtbp == (vm_offset_t)NULL)
dtbp = (vm_offset_t)&fdt_static_dtb;
#endif
if (OF_install(OFW_FDT, 0) == FALSE)
panic("Cannot install FDT");
if (OF_init((void *)dtbp) != 0)
panic("OF_init failed with the found device tree");
#if defined(LINUX_BOOT_ABI)
arm_parse_fdt_bootargs();
#endif
#ifdef EFI
efihdr = (struct efi_map_header *)preload_search_info(kmdp,
MODINFO_METADATA | MODINFOMD_EFI_MAP);
if (efihdr != NULL) {
arm_add_efi_map_entries(efihdr, mem_regions, &mem_regions_sz);
} else
#endif
{
/* Grab physical memory regions information from device tree. */
if (fdt_get_mem_regions(mem_regions, &mem_regions_sz,NULL) != 0)
panic("Cannot get physical memory regions");
}
arm_physmem_hardware_regions(mem_regions, mem_regions_sz);
/* Grab reserved memory regions information from device tree. */
if (fdt_get_reserved_regions(mem_regions, &mem_regions_sz) == 0)
arm_physmem_exclude_regions(mem_regions, mem_regions_sz,
EXFLAG_NODUMP | EXFLAG_NOALLOC);
/*
* Set TEX remapping registers.
* Setup kernel page tables and switch to kernel L1 page table.
*/
pmap_set_tex();
pmap_bootstrap_prepare(lastaddr);
/*
* Now that proper page tables are installed, call cpu_setup() to enable
* instruction and data caches and other chip-specific features.
*/
cpu_setup();
/* Platform-specific initialisation */
platform_probe_and_attach();
pcpu0_init();
/* Do basic tuning, hz etc */
init_param1();
/*
* Allocate a page for the system page mapped to 0xffff0000
* This page will just contain the system vectors and can be
* shared by all processes.
*/
systempage = pmap_preboot_get_pages(1);
/* Map the vector page. */
pmap_preboot_map_pages(systempage, ARM_VECTORS_HIGH, 1);
if (virtual_end >= ARM_VECTORS_HIGH)
virtual_end = ARM_VECTORS_HIGH - 1;
/* Allocate dynamic per-cpu area. */
dpcpu = pmap_preboot_get_vpages(DPCPU_SIZE / PAGE_SIZE);
dpcpu_init((void *)dpcpu, 0);
/* Allocate stacks for all modes */
irqstack = pmap_preboot_get_vpages(IRQ_STACK_SIZE * MAXCPU);
abtstack = pmap_preboot_get_vpages(ABT_STACK_SIZE * MAXCPU);
undstack = pmap_preboot_get_vpages(UND_STACK_SIZE * MAXCPU );
kernelstack = pmap_preboot_get_vpages(kstack_pages * MAXCPU);
/* Allocate message buffer. */
msgbufp = (void *)pmap_preboot_get_vpages(
round_page(msgbufsize) / PAGE_SIZE);
/*
* Pages were allocated during the secondary bootstrap for the
* stacks for different CPU modes.
* We must now set the r13 registers in the different CPU modes to
* point to these stacks.
* Since the ARM stacks use STMFD etc. we must set r13 to the top end
* of the stack memory.
*/
set_stackptrs(0);
mutex_init();
/* Establish static device mappings. */
err_devmap = platform_devmap_init();
devmap_bootstrap(0, NULL);
vm_max_kernel_address = platform_lastaddr();
/*
* Only after the SOC registers block is mapped we can perform device
* tree fixups, as they may attempt to read parameters from hardware.
*/
OF_interpret("perform-fixup", 0);
platform_gpio_init();
cninit();
debugf("initarm: console initialized\n");
debugf(" arg1 kmdp = 0x%08x\n", (uint32_t)kmdp);
debugf(" boothowto = 0x%08x\n", boothowto);
debugf(" dtbp = 0x%08x\n", (uint32_t)dtbp);
debugf(" lastaddr1: 0x%08x\n", lastaddr);
arm_print_kenv();
env = kern_getenv("kernelname");
if (env != NULL)
strlcpy(kernelname, env, sizeof(kernelname));
if (err_devmap != 0)
printf("WARNING: could not fully configure devmap, error=%d\n",
err_devmap);
platform_late_init();
/*
* We must now clean the cache again....
* Cleaning may be done by reading new data to displace any
* dirty data in the cache. This will have happened in cpu_setttb()
* but since we are boot strapping the addresses used for the read
* may have just been remapped and thus the cache could be out
* of sync. A re-clean after the switch will cure this.
* After booting there are no gross relocations of the kernel thus
* this problem will not occur after initarm().
*/
/* Set stack for exception handlers */
undefined_init();
init_proc0(kernelstack);
arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
enable_interrupts(PSR_A);
pmap_bootstrap(0);
/* Exclude the kernel (and all the things we allocated which immediately
* follow the kernel) from the VM allocation pool but not from crash
* dumps. virtual_avail is a global variable which tracks the kva we've
* "allocated" while setting up pmaps.
*
* Prepare the list of physical memory available to the vm subsystem.
*/
arm_physmem_exclude_region(abp->abp_physaddr,
pmap_preboot_get_pages(0) - abp->abp_physaddr, EXFLAG_NOALLOC);
arm_physmem_init_kernel_globals();
init_param2(physmem);
/* Init message buffer. */
msgbufinit(msgbufp, msgbufsize);
dbg_monitor_init();
kdb_init();
return ((void *)STACKALIGN(thread0.td_pcb));
}
#endif /* __ARM_ARCH < 6 */
#endif /* FDT */
Index: head/sys/arm/arm/mpcore_timer.c
===================================================================
--- head/sys/arm/arm/mpcore_timer.c (revision 320776)
+++ head/sys/arm/arm/mpcore_timer.c (revision 320777)
@@ -1,566 +1,560 @@
/*-
* Copyright (c) 2011 The FreeBSD Foundation
* All rights reserved.
*
* Developed by Ben Gray
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the company nor the name of the author may be used to
* endorse or promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/**
* The ARM Cortex-A9 core can support a global timer plus a private and
* watchdog timer per core. This driver reserves memory and interrupt
* resources for accessing both timer register sets, these resources are
* stored globally and used to setup the timecount and eventtimer.
*
* The timecount timer uses the global 64-bit counter, whereas the
* per-CPU eventtimer uses the private 32-bit counters.
*
*
* REF: ARM Cortex-A9 MPCore, Technical Reference Manual (rev. r2p2)
*/
#include
__FBSDID("$FreeBSD$");
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
-#ifdef MULTIDELAY
#include /* For arm_set_delay */
-#endif
#include
#include
#include
#include
#include
-#if defined(PLATFORM) && !defined(MULTIDELAY)
-#error The MPCore Timer driver requires MULTIDELAY when building with PLATFORM
-#endif
-
/* Private (per-CPU) timer register map */
#define PRV_TIMER_LOAD 0x0000
#define PRV_TIMER_COUNT 0x0004
#define PRV_TIMER_CTRL 0x0008
#define PRV_TIMER_INTR 0x000C
#define PRV_TIMER_CTR_PRESCALER_SHIFT 8
#define PRV_TIMER_CTRL_IRQ_ENABLE (1UL << 2)
#define PRV_TIMER_CTRL_AUTO_RELOAD (1UL << 1)
#define PRV_TIMER_CTRL_TIMER_ENABLE (1UL << 0)
#define PRV_TIMER_INTR_EVENT (1UL << 0)
/* Global timer register map */
#define GBL_TIMER_COUNT_LOW 0x0000
#define GBL_TIMER_COUNT_HIGH 0x0004
#define GBL_TIMER_CTRL 0x0008
#define GBL_TIMER_INTR 0x000C
#define GBL_TIMER_CTR_PRESCALER_SHIFT 8
#define GBL_TIMER_CTRL_AUTO_INC (1UL << 3)
#define GBL_TIMER_CTRL_IRQ_ENABLE (1UL << 2)
#define GBL_TIMER_CTRL_COMP_ENABLE (1UL << 1)
#define GBL_TIMER_CTRL_TIMER_ENABLE (1UL << 0)
#define GBL_TIMER_INTR_EVENT (1UL << 0)
struct arm_tmr_softc {
device_t dev;
int irqrid;
int memrid;
struct resource * gbl_mem;
struct resource * prv_mem;
struct resource * prv_irq;
uint64_t clkfreq;
struct eventtimer et;
};
static struct eventtimer *arm_tmr_et;
static struct timecounter *arm_tmr_tc;
static uint64_t arm_tmr_freq;
static boolean_t arm_tmr_freq_varies;
#define tmr_prv_read_4(sc, reg) bus_read_4((sc)->prv_mem, reg)
#define tmr_prv_write_4(sc, reg, val) bus_write_4((sc)->prv_mem, reg, val)
#define tmr_gbl_read_4(sc, reg) bus_read_4((sc)->gbl_mem, reg)
#define tmr_gbl_write_4(sc, reg, val) bus_write_4((sc)->gbl_mem, reg, val)
static void arm_tmr_delay(int, void *);
static timecounter_get_t arm_tmr_get_timecount;
static struct timecounter arm_tmr_timecount = {
.tc_name = "MPCore",
.tc_get_timecount = arm_tmr_get_timecount,
.tc_poll_pps = NULL,
.tc_counter_mask = ~0u,
.tc_frequency = 0,
.tc_quality = 800,
};
#define TMR_GBL 0x01
#define TMR_PRV 0x02
#define TMR_BOTH (TMR_GBL | TMR_PRV)
#define TMR_NONE 0
static struct ofw_compat_data compat_data[] = {
{"arm,mpcore-timers", TMR_BOTH}, /* Non-standard, FreeBSD. */
{"arm,cortex-a9-global-timer", TMR_GBL},
{"arm,cortex-a5-global-timer", TMR_GBL},
{"arm,cortex-a9-twd-timer", TMR_PRV},
{"arm,cortex-a5-twd-timer", TMR_PRV},
{"arm,arm11mp-twd-timer", TMR_PRV},
{NULL, TMR_NONE}
};
/**
* arm_tmr_get_timecount - reads the timecount (global) timer
* @tc: pointer to arm_tmr_timecount struct
*
* We only read the lower 32-bits, the timecount stuff only uses 32-bits
* so (for now?) ignore the upper 32-bits.
*
* RETURNS
* The lower 32-bits of the counter.
*/
static unsigned
arm_tmr_get_timecount(struct timecounter *tc)
{
struct arm_tmr_softc *sc;
sc = tc->tc_priv;
return (tmr_gbl_read_4(sc, GBL_TIMER_COUNT_LOW));
}
/**
* arm_tmr_start - starts the eventtimer (private) timer
* @et: pointer to eventtimer struct
* @first: the number of seconds and fractional sections to trigger in
* @period: the period (in seconds and fractional sections) to set
*
* If the eventtimer is required to be in oneshot mode, period will be
* NULL and first will point to the time to trigger. If in periodic mode
* period will contain the time period and first may optionally contain
* the time for the first period.
*
* RETURNS
* Always returns 0
*/
static int
arm_tmr_start(struct eventtimer *et, sbintime_t first, sbintime_t period)
{
struct arm_tmr_softc *sc;
uint32_t load, count;
uint32_t ctrl;
sc = et->et_priv;
tmr_prv_write_4(sc, PRV_TIMER_CTRL, 0);
tmr_prv_write_4(sc, PRV_TIMER_INTR, PRV_TIMER_INTR_EVENT);
ctrl = PRV_TIMER_CTRL_IRQ_ENABLE | PRV_TIMER_CTRL_TIMER_ENABLE;
if (period != 0) {
load = ((uint32_t)et->et_frequency * period) >> 32;
ctrl |= PRV_TIMER_CTRL_AUTO_RELOAD;
} else
load = 0;
if (first != 0)
count = (uint32_t)((et->et_frequency * first) >> 32);
else
count = load;
tmr_prv_write_4(sc, PRV_TIMER_LOAD, load);
tmr_prv_write_4(sc, PRV_TIMER_COUNT, count);
tmr_prv_write_4(sc, PRV_TIMER_CTRL, ctrl);
return (0);
}
/**
* arm_tmr_stop - stops the eventtimer (private) timer
* @et: pointer to eventtimer struct
*
* Simply stops the private timer by clearing all bits in the ctrl register.
*
* RETURNS
* Always returns 0
*/
static int
arm_tmr_stop(struct eventtimer *et)
{
struct arm_tmr_softc *sc;
sc = et->et_priv;
tmr_prv_write_4(sc, PRV_TIMER_CTRL, 0);
tmr_prv_write_4(sc, PRV_TIMER_INTR, PRV_TIMER_INTR_EVENT);
return (0);
}
/**
* arm_tmr_intr - ISR for the eventtimer (private) timer
* @arg: pointer to arm_tmr_softc struct
*
* Clears the event register and then calls the eventtimer callback.
*
* RETURNS
* Always returns FILTER_HANDLED
*/
static int
arm_tmr_intr(void *arg)
{
struct arm_tmr_softc *sc;
sc = arg;
tmr_prv_write_4(sc, PRV_TIMER_INTR, PRV_TIMER_INTR_EVENT);
if (sc->et.et_active)
sc->et.et_event_cb(&sc->et, sc->et.et_arg);
return (FILTER_HANDLED);
}
/**
* arm_tmr_probe - timer probe routine
* @dev: new device
*
* The probe function returns success when probed with the fdt compatible
* string set to "arm,mpcore-timers".
*
* RETURNS
* BUS_PROBE_DEFAULT if the fdt device is compatible, otherwise ENXIO.
*/
static int
arm_tmr_probe(device_t dev)
{
if (!ofw_bus_status_okay(dev))
return (ENXIO);
if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == TMR_NONE)
return (ENXIO);
device_set_desc(dev, "ARM MPCore Timers");
return (BUS_PROBE_DEFAULT);
}
static int
attach_tc(struct arm_tmr_softc *sc)
{
int rid;
if (arm_tmr_tc != NULL)
return (EBUSY);
rid = sc->memrid;
sc->gbl_mem = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, &rid,
RF_ACTIVE);
if (sc->gbl_mem == NULL) {
device_printf(sc->dev, "could not allocate gbl mem resources\n");
return (ENXIO);
}
tmr_gbl_write_4(sc, GBL_TIMER_CTRL, 0x00000000);
arm_tmr_timecount.tc_frequency = sc->clkfreq;
arm_tmr_timecount.tc_priv = sc;
tc_init(&arm_tmr_timecount);
arm_tmr_tc = &arm_tmr_timecount;
tmr_gbl_write_4(sc, GBL_TIMER_CTRL, GBL_TIMER_CTRL_TIMER_ENABLE);
return (0);
}
static int
attach_et(struct arm_tmr_softc *sc)
{
void *ihl;
int irid, mrid;
if (arm_tmr_et != NULL)
return (EBUSY);
mrid = sc->memrid;
sc->prv_mem = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY, &mrid,
RF_ACTIVE);
if (sc->prv_mem == NULL) {
device_printf(sc->dev, "could not allocate prv mem resources\n");
return (ENXIO);
}
tmr_prv_write_4(sc, PRV_TIMER_CTRL, 0x00000000);
irid = sc->irqrid;
sc->prv_irq = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &irid, RF_ACTIVE);
if (sc->prv_irq == NULL) {
bus_release_resource(sc->dev, SYS_RES_MEMORY, mrid, sc->prv_mem);
device_printf(sc->dev, "could not allocate prv irq resources\n");
return (ENXIO);
}
if (bus_setup_intr(sc->dev, sc->prv_irq, INTR_TYPE_CLK, arm_tmr_intr,
NULL, sc, &ihl) != 0) {
bus_release_resource(sc->dev, SYS_RES_MEMORY, mrid, sc->prv_mem);
bus_release_resource(sc->dev, SYS_RES_IRQ, irid, sc->prv_irq);
device_printf(sc->dev, "unable to setup the et irq handler.\n");
return (ENXIO);
}
/*
* Setup and register the eventtimer. Most event timers set their min
* and max period values to some value calculated from the clock
* frequency. We might not know yet what our runtime clock frequency
* will be, so we just use some safe values. A max of 2 seconds ensures
* that even if our base clock frequency is 2GHz (meaning a 4GHz CPU),
* we won't overflow our 32-bit timer count register. A min of 20
* nanoseconds is pretty much completely arbitrary.
*/
sc->et.et_name = "MPCore";
sc->et.et_flags = ET_FLAGS_PERIODIC | ET_FLAGS_ONESHOT | ET_FLAGS_PERCPU;
sc->et.et_quality = 1000;
sc->et.et_frequency = sc->clkfreq;
sc->et.et_min_period = 20 * SBT_1NS;
sc->et.et_max_period = 2 * SBT_1S;
sc->et.et_start = arm_tmr_start;
sc->et.et_stop = arm_tmr_stop;
sc->et.et_priv = sc;
et_register(&sc->et);
arm_tmr_et = &sc->et;
return (0);
}
/**
* arm_tmr_attach - attaches the timer to the simplebus
* @dev: new device
*
* Reserves memory and interrupt resources, stores the softc structure
* globally and registers both the timecount and eventtimer objects.
*
* RETURNS
* Zero on success or ENXIO if an error occuried.
*/
static int
arm_tmr_attach(device_t dev)
{
struct arm_tmr_softc *sc;
phandle_t node;
pcell_t clock;
int et_err, tc_err, tmrtype;
sc = device_get_softc(dev);
sc->dev = dev;
if (arm_tmr_freq_varies) {
sc->clkfreq = arm_tmr_freq;
} else {
if (arm_tmr_freq != 0) {
sc->clkfreq = arm_tmr_freq;
} else {
/* Get the base clock frequency */
node = ofw_bus_get_node(dev);
if ((OF_getencprop(node, "clock-frequency", &clock,
sizeof(clock))) <= 0) {
device_printf(dev, "missing clock-frequency "
"attribute in FDT\n");
return (ENXIO);
}
sc->clkfreq = clock;
}
}
tmrtype = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
tc_err = ENXIO;
et_err = ENXIO;
/*
* If we're handling the global timer and it is fixed-frequency, set it
* up to use as a timecounter. If it's variable frequency it won't work
* as a timecounter. We also can't use it for DELAY(), so hopefully the
* platform provides its own implementation. If it doesn't, ours will
* get used, but since the frequency isn't set, it will only use the
* bogus loop counter.
*/
if (tmrtype & TMR_GBL) {
if (!arm_tmr_freq_varies)
tc_err = attach_tc(sc);
else if (bootverbose)
device_printf(sc->dev,
"not using variable-frequency device as timecounter");
sc->memrid++;
sc->irqrid++;
}
/* If we are handling the private timer, set it up as an eventtimer. */
if (tmrtype & TMR_PRV) {
et_err = attach_et(sc);
}
/*
* If we didn't successfully set up a timecounter or eventtimer then we
* didn't actually attach at all, return error.
*/
if (tc_err != 0 && et_err != 0) {
return (ENXIO);
}
-#ifdef MULTIDELAY
+#ifdef PLATFORM
/*
* We can register as the DELAY() implementation only if we successfully
* set up the global timer.
*/
if (tc_err == 0)
arm_set_delay(arm_tmr_delay, sc);
#endif
return (0);
}
static device_method_t arm_tmr_methods[] = {
DEVMETHOD(device_probe, arm_tmr_probe),
DEVMETHOD(device_attach, arm_tmr_attach),
{ 0, 0 }
};
static driver_t arm_tmr_driver = {
"mp_tmr",
arm_tmr_methods,
sizeof(struct arm_tmr_softc),
};
static devclass_t arm_tmr_devclass;
EARLY_DRIVER_MODULE(mp_tmr, simplebus, arm_tmr_driver, arm_tmr_devclass, 0, 0,
BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
EARLY_DRIVER_MODULE(mp_tmr, ofwbus, arm_tmr_driver, arm_tmr_devclass, 0, 0,
BUS_PASS_TIMER + BUS_PASS_ORDER_MIDDLE);
/*
* Handle a change in clock frequency. The mpcore timer runs at half the CPU
* frequency. When the CPU frequency changes due to power-saving or thermal
* management, the platform-specific code that causes the frequency change calls
* this routine to inform the clock driver, and we in turn inform the event
* timer system, which actually updates the value in et->frequency for us and
* reschedules the current event(s) in a way that's atomic with respect to
* start/stop/intr code that may be running on various CPUs at the time of the
* call.
*
* This routine can also be called by a platform's early init code. If the
* value passed is ARM_TMR_FREQUENCY_VARIES, that will cause the attach() code
* to register as an eventtimer, but not a timecounter. If the value passed in
* is any other non-zero value it is used as the fixed frequency for the timer.
*/
void
arm_tmr_change_frequency(uint64_t newfreq)
{
if (newfreq == ARM_TMR_FREQUENCY_VARIES) {
arm_tmr_freq_varies = true;
return;
}
arm_tmr_freq = newfreq;
if (arm_tmr_et != NULL)
et_change_frequency(arm_tmr_et, newfreq);
}
static void
arm_tmr_delay(int usec, void *arg)
{
struct arm_tmr_softc *sc = arg;
int32_t counts_per_usec;
int32_t counts;
uint32_t first, last;
/* Get the number of times to count */
counts_per_usec = ((arm_tmr_timecount.tc_frequency / 1000000) + 1);
/*
* Clamp the timeout at a maximum value (about 32 seconds with
* a 66MHz clock). *Nobody* should be delay()ing for anywhere
* near that length of time and if they are, they should be hung
* out to dry.
*/
if (usec >= (0x80000000U / counts_per_usec))
counts = (0x80000000U / counts_per_usec) - 1;
else
counts = usec * counts_per_usec;
first = tmr_gbl_read_4(sc, GBL_TIMER_COUNT_LOW);
while (counts > 0) {
last = tmr_gbl_read_4(sc, GBL_TIMER_COUNT_LOW);
counts -= (int32_t)(last - first);
first = last;
}
}
-#ifndef MULTIDELAY
+#ifndef PLATFORM
/**
* DELAY - Delay for at least usec microseconds.
* @usec: number of microseconds to delay by
*
* This function is called all over the kernel and is suppose to provide a
* consistent delay. This function may also be called before the console
* is setup so no printf's can be called here.
*
* RETURNS:
* nothing
*/
void
DELAY(int usec)
{
struct arm_tmr_softc *sc;
int32_t counts;
/* Check the timers are setup, if not just use a for loop for the meantime */
if (arm_tmr_tc == NULL || arm_tmr_timecount.tc_frequency == 0) {
for (; usec > 0; usec--)
for (counts = 200; counts > 0; counts--)
cpufunc_nullop(); /* Prevent gcc from optimizing
* out the loop
*/
} else {
sc = arm_tmr_tc->tc_priv;
arm_tmr_delay(usec, sc);
}
}
#endif
Index: head/sys/arm/arm/platform.c
===================================================================
--- head/sys/arm/arm/platform.c (revision 320776)
+++ head/sys/arm/arm/platform.c (revision 320777)
@@ -1,243 +1,237 @@
/*-
* Copyright (c) 2005 Peter Grehan
* Copyright (c) 2009 Nathan Whitehorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#include
__FBSDID("$FreeBSD$");
/*
* Dispatch platform calls to the appropriate platform implementation
* through a previously registered kernel object.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "platform_if.h"
static platform_def_t *plat_def_impl;
static platform_t plat_obj;
static struct kobj_ops plat_kernel_kops;
static struct platform_kobj plat_kernel_obj;
static char plat_name[64];
SYSCTL_STRING(_hw, OID_AUTO, platform, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, plat_name, 0,
"Platform currently in use");
/*
* Platform install routines. Highest priority wins, using the same
* algorithm as bus attachment.
*/
SET_DECLARE(platform_set, platform_def_t);
-#ifdef MULTIDELAY
static delay_func platform_delay;
-#endif
void
platform_probe_and_attach(void)
{
platform_def_t **platpp, *platp;
int prio, best_prio;
plat_obj = &plat_kernel_obj;
best_prio = 0;
/*
* We are unable to use TUNABLE_STR as the read will happen
* well after this function has returned.
*/
TUNABLE_STR_FETCH("hw.platform", plat_name, sizeof(plat_name));
/*
* Try to locate the best platform kobj
*/
SET_FOREACH(platpp, platform_set) {
platp = *platpp;
/*
* Take care of compiling the selected class, and
* then statically initialise the MMU object
*/
kobj_class_compile_static((kobj_class_t)platp,
&plat_kernel_kops);
kobj_init_static((kobj_t)plat_obj, (kobj_class_t)platp);
plat_obj->cls = platp;
prio = PLATFORM_PROBE(plat_obj);
/* Check for errors */
if (prio > 0)
continue;
/*
* Check if this module was specifically requested through
* the loader tunable we provide.
*/
if (strcmp(platp->name,plat_name) == 0) {
plat_def_impl = platp;
break;
}
/* Otherwise, see if it is better than our current best */
if (plat_def_impl == NULL || prio > best_prio) {
best_prio = prio;
plat_def_impl = platp;
}
/*
* We can't free the KOBJ, since it is static. Reset the ops
* member of this class so that we can come back later.
*/
platp->ops = NULL;
}
if (plat_def_impl == NULL)
panic("No platform module found!");
/*
* Recompile to make sure we ended with the
* correct one, and then attach.
*/
kobj_class_compile_static((kobj_class_t)plat_def_impl,
&plat_kernel_kops);
kobj_init_static((kobj_t)plat_obj, (kobj_class_t)plat_def_impl);
strlcpy(plat_name, plat_def_impl->name, sizeof(plat_name));
-#ifdef MULTIDELAY
/* Set a default delay function */
arm_set_delay(platform_delay, NULL);
-#endif
PLATFORM_ATTACH(plat_obj);
}
int
platform_devmap_init(void)
{
return PLATFORM_DEVMAP_INIT(plat_obj);
}
vm_offset_t
platform_lastaddr(void)
{
return PLATFORM_LASTADDR(plat_obj);
}
void
platform_gpio_init(void)
{
PLATFORM_GPIO_INIT(plat_obj);
}
void
platform_late_init(void)
{
PLATFORM_LATE_INIT(plat_obj);
}
void
cpu_reset(void)
{
PLATFORM_CPU_RESET(plat_obj);
printf("cpu_reset failed");
intr_disable();
while(1) {
cpu_sleep(0);
}
}
-#ifdef MULTIDELAY
static void
platform_delay(int usec, void *arg __unused)
{
int counts;
for (; usec > 0; usec--)
for (counts = plat_obj->cls->delay_count; counts > 0; counts--)
/*
* Prevent the compiler from optimizing
* out the loop
*/
cpufunc_nullop();
}
-#endif
#if defined(SMP)
void
platform_mp_setmaxid(void)
{
int ncpu;
PLATFORM_MP_SETMAXID(plat_obj);
if (TUNABLE_INT_FETCH("hw.ncpu", &ncpu)) {
if (ncpu >= 1 && ncpu <= mp_ncpus) {
mp_ncpus = ncpu;
mp_maxid = ncpu - 1;
}
}
}
void
platform_mp_start_ap(void)
{
PLATFORM_MP_START_AP(plat_obj);
}
#endif
Index: head/sys/arm/conf/ALLWINNER_UP
===================================================================
--- head/sys/arm/conf/ALLWINNER_UP (revision 320776)
+++ head/sys/arm/conf/ALLWINNER_UP (revision 320777)
@@ -1,109 +1,108 @@
#
# ALLWINNER_UP -- Custom configuration for the AllWinner Uniprocessor SoC
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident ALLWINNER_UP
include "std.armv6"
include "../allwinner/std.allwinner_up"
options INTRNG
options SOC_ALLWINNER_A10
options SOC_ALLWINNER_A13
options SCHED_4BSD # 4BSD scheduler
options PLATFORM
-options MULTIDELAY
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=emac0
# EXT_RESOURCES pseudo devices
options EXT_RESOURCES
device clk
device phy
device hwreset
device regulator
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
# ATA controllers
device ahci # AHCI-compatible SATA controllers
#device ata # Legacy ATA/SATA controllers
# Console and misc
device uart
device uart_snps
device pty
device snp
device md
device random # Entropy device
# I2C support
device iicbus
device iic
device twsi
device axp209 # AXP209 Power Management Unit
device pcf8563 # RTC
# GPIO
device gpio
device gpioled
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device pass # Passthrough device (direct ATA/SCSI access)
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device usb
#device uhci
device ohci
device ehci
device umass
# Ethernet
device loop
device ether
device mii
device bpf
device emac
# USB ethernet support, requires miibus
device miibus
# Sound support
device sound
# Pinmux
device fdt_pinctrl
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
makeoptions MODULES_EXTRA=dtb/allwinner
Index: head/sys/arm/conf/ALPINE
===================================================================
--- head/sys/arm/conf/ALPINE (revision 320776)
+++ head/sys/arm/conf/ALPINE (revision 320777)
@@ -1,86 +1,85 @@
# Kernel configuration for Alpine Board.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident ALPINE
include "std.armv6"
include "../annapurna/alpine/std.alpine"
makeoptions MODULES_OVERRIDE=""
makeoptions WERROR="-Werror"
options SCHED_4BSD # 4BSD scheduler
options SMP # Enable multiple cores
options PLATFORM
-options MULTIDELAY
# Interrupt controller
device gic
options INTRNG
# Annapurna Alpine drivers
device al_ccu # Alpine Cache Coherency Unit
device al_nb_service # Alpine North Bridge Service
device al_iofic # I/O Fabric Interrupt Controller
device al_serdes # Serializer/Deserializer
device al_udma # Universal DMA
# Pseudo devices
device loop
device random
device pty
device md
device gpio
# ATA controllers
device ahci # AHCI-compatible SATA controllers
device ata # Legacy ATA/SATA controllers
# ATA/SCSI peripherals
device scbus # SCSI bus (required for ATA/SCSI)
device ch # SCSI media changers
device da # Direct Access (disks)
device sa # Sequential Access (tape etc)
device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
device ses # Enclosure Services (SES and SAF-TE)
#device ctl # CAM Target Layer
# Serial ports
device uart
# PCI/PCIE
device pci
device pci_host_generic
device al_pci # Annapurna Alpine PCI-E
# Ethernet
device ether
device mii
device bpf
device al_eth # Annapurna Alpine Ethernet NIC
options DEVICE_POLLING
# USB ethernet support, requires miibus
device miibus
#FDT
options FDT
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=annapurna-alpine.dts
Index: head/sys/arm/conf/BEAGLEBONE
===================================================================
--- head/sys/arm/conf/BEAGLEBONE (revision 320776)
+++ head/sys/arm/conf/BEAGLEBONE (revision 320777)
@@ -1,136 +1,135 @@
#
# BEAGLEBONE -- Custom configuration for the BeagleBone ARM development
# platforms, check out http://www.beagleboard.org/bone and
# http://www.beagleboard.org/black. This kernel config file is used for the
# original BeagleBone and the BeagleBone Black.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident BEAGLEBONE
include "std.armv6"
include "../ti/am335x/std.am335x"
makeoptions MODULES_EXTRA="dtb/am335x am335x_dmtpps"
options INTRNG
-options MULTIDELAY
options SCHED_4BSD # 4BSD scheduler
options PLATFORM
# NFS server support
#options NFSD
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=cpsw0
# Boot device is 2nd slice on MMC/SD card
options ROOTDEVNAME=\"ufs:mmcsd0s2\"
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device sdhci # mmc/sd host controller
# I2C support
device iicbus
device iic
device ti_i2c
device am335x_pmic # AM335x Power Management IC (TPC65217)
device am335x_rtc # RTC support (power management only)
#define am335x_dmtpps # Pulse Per Second capture driver
# Console and misc
device uart
device uart_ns8250
device pty
device snp
device md
device random # Entropy device
# GPIO
device gpio
device gpioled
device gpiobacklight
# SPI
device ti_spi
device spibus
# ADC support
device ti_adc
# Watchdog support
# If we don't enable the watchdog driver, the system could potentially
# reboot automatically because the boot loader might have enabled the
# watchdog.
device ti_wdt
# TI Programmable Realtime Unit support
device ti_pruss
# Mailbox support
device ti_mbox
# PMU support (for CCNT).
device pmu
# USB support
device usb
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device musb
device umass
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
# Ethernet
device loop
device ether
device mii
device smscphy
device cpsw
device bpf
# USB Ethernet support, requires miibus
device miibus
# Device mode support
device usb_template # Control of the gadget
# Pinmux
device fdt_pinctrl
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
# Comment following lines for boot console on serial port
device vt
device videomode
device hdmi
device ums
device ukbd
device kbdmux
# Uncomment to enable evdev support for ti_adc
# options EVDEV_SUPPORT
Index: head/sys/arm/conf/EFIKA_MX
===================================================================
--- head/sys/arm/conf/EFIKA_MX (revision 320776)
+++ head/sys/arm/conf/EFIKA_MX (revision 320777)
@@ -1,135 +1,134 @@
#
# Kernel configuration for Efika MX Smarttop/Smartbook boards
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident EFIKA_MX
include "std.armv6"
include "../freescale/imx/std.imx51"
makeoptions WITHOUT_MODULES="ahc"
options SOC_IMX51
options SCHED_4BSD # 4BSD scheduler
#options MD_ROOT # MD is a potential root device
#options NFSD # Network Filesystem Server
options PLATFORM
-options MULTIDELAY
options INCLUDE_CONFIG_FILE # Include this file in kernel
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ue0
options ROOTDEVNAME=\"ufs:ada0s2a\"
# kernel/memory size reduction
#options MUTEX_NOINLINE
#options NO_FFS_SNAPSHOT
#options NO_SWAPPING
#options NO_SYSCTL_DESCR
#options RWLOCK_NOINLINE
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device bpf # Berkeley packet filter
# Pseudo devices.
device loop # Network loopback
device random # Entropy device
device ether # Ethernet support
#device vlan # 802.1Q VLAN support
#device tun # Packet tunnel.
#device md # Memory "disks"
#device gif # IPv6 and IPv4 tunneling
#device firmware # firmware assist module
# Serial (COM) ports
device uart # Multi-uart driver
device ata
device atapci # Only for helper functions
device imxata
device gpio
device gpioled
device fsliic
device iic
device iicbus
# SCSI peripherals
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device ehci # OHCI USB interface
device usb # USB Bus (required)
device umass # Disks/Mass storage - Requires scbus and da
device uhid # "Human Interface Devices"
device u3g
# USB Ethernet, requires miibus
device miibus
device aue # ADMtek USB Ethernet
device axe # ASIX Electronics USB Ethernet
device cdce # Generic USB over Ethernet
device cue # CATC USB Ethernet
device kue # Kawasaki LSI USB Ethernet
device rue # RealTek RTL8150 USB Ethernet
device udav # Davicom DM9601E USB
# USB Wireless
device rum # Ralink Technology RT2501USB wireless NICs
# Watchdog timer.
# WARNING: can't be disabled!!!
device imxwdt # Watchdog
# Wireless NIC cards
device wlan # 802.11 support
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=efikamx.dts
# NOTE: serial console will be disabled if syscons enabled
# Uncomment following lines for framebuffer/syscons support
device sc
device kbdmux
options SC_DFLT_FONT # compile font in
makeoptions SC_DFLT_FONT=cp437
device ukbd # Allow keyboard like HIDs to control console
device ums
options INTRNG
Index: head/sys/arm/conf/EXYNOS5.common
===================================================================
--- head/sys/arm/conf/EXYNOS5.common (revision 320776)
+++ head/sys/arm/conf/EXYNOS5.common (revision 320777)
@@ -1,128 +1,127 @@
#
# Kernel configuration for Samsung Exynos 5 SoC.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
makeoptions WERROR="-Werror"
include "std.armv6"
options SCHED_ULE # ULE scheduler
options PLATFORM # Platform based SoC
-options MULTIDELAY
options PREEMPTION # Enable kernel thread preemption
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options TCP_HHOOK # hhook(9) framework for TCP
options SCTP # Stream Control Transmission Protocol
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
options UFS_DIRHASH # Improve performance on big directories
options UFS_GJOURNAL # Enable gjournal-based UFS journaling
options QUOTA # Enable disk quotas for UFS
options NFSCL # Network Filesystem Client
options NFSLOCKD # Network Lock Manager
options NFS_ROOT # NFS usable as /, requires NFSCL
options MSDOSFS # MSDOS Filesystem
options CD9660 # ISO 9660 Filesystem
options PROCFS # Process filesystem (requires PSEUDOFS)
options PSEUDOFS # Pseudo-filesystem framework
options TMPFS # Efficient memory filesystem
options GEOM_PART_GPT # GUID Partition Tables
options GEOM_PART_BSD # BSD partition scheme
options GEOM_PART_MBR # MBR partition scheme
options COMPAT_43 # Compatible with BSD 4.3 [KEEP THIS!]
options SCSI_DELAY=5000 # Delay (in ms) before probing SCSI
options KTRACE # ktrace(1) support
options SYSVSHM # SYSV-style shared memory
options SYSVMSG # SYSV-style message queues
options SYSVSEM # SYSV-style semaphores
options _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options KBD_INSTALL_CDEV # install a CDEV entry in /dev
options FREEBSD_BOOT_LOADER # Process metadata passed from loader(8)
options VFP # Enable floating point hardware support
options SMP # Enable multiple cores
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ue0
options ROOTDEVNAME=\"ufs:/dev/da0\"
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device dwmmc
# Interrupt controller
device gic
options INTRNG
# ARM Generic Timer
device generic_timer
# Pseudo devices
device loop
device random
device pty
device md
device gpio
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device usb
#device musb
device ehci
#device ohci
device xhci
device umass
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device pass
# SATA
#device ata
#device atadisk
#device mvs
# Serial ports
device uart
# I2C (TWSI)
device iic
device iicbus
# SPI
device spibus
device exynos_spi
# Ethernet
device ether
device mii
device smsc
device smscphy
# USB ethernet support, requires miibus
device miibus
device axe # ASIX Electronics USB Ethernet
device bpf # Berkeley packet filter
Index: head/sys/arm/conf/GENERIC
===================================================================
--- head/sys/arm/conf/GENERIC (revision 320776)
+++ head/sys/arm/conf/GENERIC (revision 320777)
@@ -1,233 +1,232 @@
#
# GENERICV6 -- Generic(ish) kernel config.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident GENERIC
cpu CPU_CORTEXA
options SMP_ON_UP
machine arm armv6
makeoptions CONF_CFLAGS="-march=armv7a"
makeoptions KERNVIRTADDR=0xc0000000
options KERNVIRTADDR=0xc0000000
include "std.armv6"
files "../allwinner/files.allwinner"
files "../allwinner/files.allwinner_up"
files "../allwinner/a10/files.a10"
files "../allwinner/a13/files.a13"
files "../allwinner/a20/files.a20"
files "../allwinner/a31/files.a31"
files "../allwinner/a33/files.a33"
files "../allwinner/a83t/files.a83t"
files "../allwinner/h3/files.h3"
files "../broadcom/bcm2835/files.bcm2836"
files "../broadcom/bcm2835/files.bcm283x"
files "../nvidia/tegra124/files.tegra124"
files "../qemu/files.qemu"
files "../ti/files.ti"
files "../ti/am335x/files.am335x"
files "../ti/omap4/files.omap4"
options SOC_ALLWINNER_A10
options SOC_ALLWINNER_A13
options SOC_ALLWINNER_A20
options SOC_ALLWINNER_A31
options SOC_ALLWINNER_A31S
options SOC_ALLWINNER_A33
options SOC_ALLWINNER_A83T
options SOC_ALLWINNER_H2PLUS
options SOC_ALLWINNER_H3
options SOC_BCM2836
options SOC_TI_AM335X
options SOC_OMAP4
options SCHED_ULE # ULE scheduler
options SMP # Enable multiple cores
options PLATFORM
-options MULTIDELAY
options LINUX_BOOT_ABI
# EXT_RESOURCES pseudo devices
options EXT_RESOURCES
device clk
device phy
device hwreset
device regulator
# CPU frequency control
device cpufreq
# Interrupt controller
options INTRNG
device gic
# PMU support (for CCNT).
device pmu
# ARM Generic Timer
device generic_timer
device mpcore_timer
# MMC/SD/SDIO Card slot support
device sdhci # SD controller
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
# ATA controllers
device ahci # AHCI-compatible SATA controllers
#device ata # Legacy ATA/SATA controllers
# PCI
options NEW_PCIB
device pci
# PCI NICs
device re # RealTek 8139C+/8169/8169S/8110S
# VirtIO
device virtio
device virtio_mmio
device virtio_blk
device vtnet
# Console and misc
device uart
device uart_ns8250
device uart_snps
device pl011
device pty
device snp
device md # Memory "disks"
device random # Entropy device
device psci
# I2C support
device iicbus
device iic
device twsi
device rsb # Allwinner Reduced Serial Bus
device p2wi # Allwinner Push-Pull Two Wire
device axp209 # AXP209 Power Management Unit
device axp81x # AXP813/818 Power Management Unit
device bcm2835_bsc
device icee
device sy8106a # SY8106A Buck Regulator
device ti_i2c
device am335x_pmic # AM335x Power Management IC (TPC65217)
device am335x_rtc # RTC support (power management only)
#define am335x_dmtpps # Pulse Per Second capture driver
device twl # TI TWLX0X0/TPS659x0 Power Management
device twl_vreg # twl voltage regulation
device twl_clks # twl external clocks
# GPIO
device gpio
device gpiobacklight
device gpioled
device gpioregulator
# EVDEV support
device evdev # input event device support
options EVDEV_SUPPORT # evdev support in legacy drivers
device uinput # install /dev/uinput cdev
device aw_cir
# SPI
device spibus
device spigen
device bcm2835_spi
device ti_spi
# ADC support
device ti_adc
# Watchdog support
# If we don't enable the watchdog driver, the BealeBone could potentially
# reboot automatically because the boot loader might have enabled the
# watchdog.
device ti_wdt
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device usb
#device uhci
device ohci
device ehci
device dwcotg # DWC OTG controller
device musb
device umass # Disks/Mass storage - Requires scbus and da
device uhid # "Human Interface Devices"
device ukbd # Allow keyboard like HIDs to control console
# Device mode support
device usb_template # Control of the gadget
# Ethernet
device loop
device ether
device vlan # 802.1Q VLAN support
device bpf
# Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device miibus
device awg # 10/100/1000 integrated EMAC controller
device cpsw # TI Common Platform Ethernet Switch (CPSW)
device dwc # 10/100/1000 integrated GMAC controller
device emac # 10/100 integrated EMAC controller
device smsc # SMSC LAN91C111
# Sound support
device sound
# Framebuffer support
device vt
device kbdmux
device ums
device videomode
device hdmi
device vchiq
# Pinmux
device fdt_pinctrl
# TI Programmable Realtime Unit support
device ti_pruss
# Mailbox support
device ti_mbox
# DMA controller
device ti_sdma
# Extensible Firmware Interface
options EFI
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
makeoptions MODULES_EXTRA="dtb/allwinner dtb/am335x dtb/nvidia dtb/rpi dtb/omap4"
Index: head/sys/arm/conf/IMX53
===================================================================
--- head/sys/arm/conf/IMX53 (revision 320776)
+++ head/sys/arm/conf/IMX53 (revision 320777)
@@ -1,123 +1,122 @@
#
# Kernel configuration for i.MX53 boards
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident IMX53
include "std.armv6"
include "../freescale/imx/std.imx53"
options SOC_IMX53
options SCHED_4BSD # 4BSD scheduler
#options NFSD # Network Filesystem Server
options PLATFORM
-options MULTIDELAY
options INCLUDE_CONFIG_FILE # Include this file in kernel
# kernel/memory size reduction
#options MUTEX_NOINLINE
#options NO_FFS_SNAPSHOT
#options NO_SWAPPING
#options NO_SYSCTL_DESCR
#options RWLOCK_NOINLINE
# The `bpf' device enables the Berkeley Packet Filter.
# Be aware of the administrative consequences of enabling this!
# Note that 'bpf' is required for DHCP.
device bpf # Berkeley packet filter
# Pseudo devices.
device loop # Network loopback
device random # Entropy device
device ether # Ethernet support
#device vlan # 802.1Q VLAN support
#device tun # Packet tunnel.
device md # Memory "disks"
#device gif # IPv6 and IPv4 tunneling
#device firmware # firmware assist module
# Ethernet
device ffec # Freescale Fast Ethernet Controller
device miibus # Standard mii bus
# Serial (COM) ports
device uart # Multi-uart driver
device ata
device atapci # Only for helper functions
device imxata
device gpio
device gpioled
device fsliic
device iic
device iicbus
# SCSI peripherals
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device ehci # OHCI USB interface
device usb # USB Bus (required)
device umass # Disks/Mass storage - Requires scbus and da
device uhid # "Human Interface Devices"
#device ukbd # Allow keyboard like HIDs to control console
device ums
# USB Ethernet, requires miibus
#device miibus
#device aue # ADMtek USB Ethernet
#device axe # ASIX Electronics USB Ethernet
#device cdce # Generic USB over Ethernet
#device cue # CATC USB Ethernet
#device kue # Kawasaki LSI USB Ethernet
#device rue # RealTek RTL8150 USB Ethernet
#device udav # Davicom DM9601E USB
# USB Wireless
#device rum # Ralink Technology RT2501USB wireless NICs
# Watchdog timer.
# WARNING: can't be disabled!!!
device imxwdt # Watchdog
# Wireless NIC cards
device wlan # 802.11 support
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device wlan_amrr # AMRR transmit rate control algorithm
# MMC
#device sdhci # SD controller
#device mmc # SD/MMC protocol
#device mmcsd # SDCard disk device
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
makeoptions MODULES_EXTRA=dtb/imx5
options INTRNG
Index: head/sys/arm/conf/IMX6
===================================================================
--- head/sys/arm/conf/IMX6 (revision 320776)
+++ head/sys/arm/conf/IMX6 (revision 320777)
@@ -1,126 +1,125 @@
#
# Kernel configuration for Freescale i.MX6 systems.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident IMX6
include "std.armv6"
include "../freescale/imx/std.imx6"
options INTRNG
options SOC_IMX6
options SCHED_ULE # ULE scheduler
#options NFSD # Network Filesystem Server
options INCLUDE_CONFIG_FILE # Include this file in kernel
options PLATFORM
options SMP # Enable multiple cores
-options MULTIDELAY
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ffec0
# U-Boot stuff lives on slice 1, FreeBSD on slice 2.
options ROOTDEVNAME=\"ufs:mmcsd0s2a\"
# Interrupt controller
device gic
# Cache controller
device pl310 # PL310 L2 cache controller
# ARM MPCore timer
device mpcore_timer
# Pseudo devices.
device loop # Network loopback
device random # Entropy device
device vlan # 802.1Q VLAN support
device tun # Packet tunnel.
device md # Memory "disks"
#device gif # IPv6 and IPv4 tunneling
#device firmware # firmware assist module
device ether # Ethernet support
device miibus # Required for ethernet
device bpf # Berkeley packet filter (required for DHCP)
# General-purpose input/output
device gpio
# Serial (COM) ports
device uart # Multi-uart driver
# SDCard
device sdhci # SD controller
device mmc # SD/MMC protocol
device mmcsd # SDCard disk device
# SCSI peripherals
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
# USB support
device ehci # OHCI USB interface
device usb # USB Bus (required)
device umass # Disks/Mass storage - Requires scbus and da
device uhid # "Human Interface Devices"
device u3g # USB modems
#device ukbd # Allow keyboard like HIDs to control console
#device ums # USB mouse
# USB Ethernet, requires miibus
#device aue # ADMtek USB Ethernet
#device axe # ASIX Electronics USB Ethernet
#device cdce # Generic USB over Ethernet
#device cue # CATC USB Ethernet
#device kue # Kawasaki LSI USB Ethernet
#device rue # RealTek RTL8150 USB Ethernet
#device udav # Davicom DM9601E USB
# USB Wireless
#device rum # Ralink Technology RT2501USB wireless NICs
# Wireless NIC cards
#device wlan # 802.11 support
#device wlan_wep # 802.11 WEP support
#device wlan_ccmp # 802.11 CCMP support
#device wlan_tkip # 802.11 TKIP support
#device wlan_amrr # AMRR transmit rate control algorithm
device vt
device kbdmux
device ukbd
device videomode
device hdmi
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
makeoptions MODULES_EXTRA=dtb/imx6
# SoC-specific devices
device ffec # Freescale Fast Ethernet Controller
device fsliic # Freescale i2c/iic
device iic # iic protocol
device iicbus # iic bus
device imxwdt # Watchdog. WARNING: can't be disabled!!!
Index: head/sys/arm/conf/PANDABOARD
===================================================================
--- head/sys/arm/conf/PANDABOARD (revision 320776)
+++ head/sys/arm/conf/PANDABOARD (revision 320777)
@@ -1,117 +1,116 @@
#
# PANDABOARD -- Custom configuration for the PandaBoard ARM development
# platform, check out www.pandaboard.org
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident PANDABOARD
# This probably wants to move somewhere else. Maybe we can create a basic
# OMAP4340 config, then make a PANDABOARD config that includes the basic one,
# adds the start addresses and custom devices plus pulls in this hints file.
hints "PANDABOARD.hints"
include "std.armv6"
include "../ti/omap4/std.omap4"
makeoptions MODULES_EXTRA=dtb/omap4
options SCHED_ULE # ULE scheduler
options PLATFORM
-options MULTIDELAY
options SMP # Enable multiple cores
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ue0
device fdt_pinctrl
# Interrupt controller
device gic
options INTRNG
# ARM MPCore timer
device mpcore_timer
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device sdhci # mmc/sd host controller
# I2C support
device iicbus
device iic
device ti_i2c
# Console and misc
device uart
device uart_ns8250
device pty
device snp
device md
device random # Entropy device
device pl310 # PL310 L2 cache controller
# GPIO
device gpio
device gpioled
# The following enables MFS as root, this seems similar to an initramfs or initrd
# as used in Linux.
#options MD_ROOT
#options MD_ROOT_SIZE=7560
# USB support
device usb
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device ohci
device ehci
device umass
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
# Ethernet
device loop
device ether
device mii
device smc
device smcphy
device bpf
# USB Ethernet support, requires miibus
device miibus
#device axe # ASIX Electronics USB Ethernet
device smsc # SMSC LAN95xx USB Ethernet
# OMAP-specific devices
device ti_sdma
device twl
device twl_vreg
device twl_clks
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=pandaboard.dts
Index: head/sys/arm/conf/RK3188
===================================================================
--- head/sys/arm/conf/RK3188 (revision 320776)
+++ head/sys/arm/conf/RK3188 (revision 320777)
@@ -1,96 +1,95 @@
#
# Kernel configuration for Rockchip RK3188 systems.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident RK3188
include "std.armv6"
include "../rockchip/std.rk30xx"
options SOC_ROCKCHIP_RK3188
options SCHED_ULE # ULE scheduler
options SMP # Enable multiple cores
options PLATFORM
-options MULTIDELAY
# Root mount from MMC/SD card
options ROOTDEVNAME=\"ufs:/dev/mmcsd0\"
# Interrupt controller
device gic
options INTRNG
# ARM MPCore timer
device mpcore_timer
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device dwmmc
# Console and misc
device uart
device uart_snps
device pty
device snp
device md
device random # Entropy device
# I2C support
#device iicbus
#device iic
# GPIO
device gpio
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device pass
# USB support
options USB_HOST_ALIGN=32 # Align usb buffers to cache line size.
device usb
device dwcotg # DWC OTG controller
device umass
# Ethernet
device loop
device ether
device mii
device bpf
# Wireless NIC cards
options IEEE80211_DEBUG
options IEEE80211_AMPDU_AGE
options IEEE80211_SUPPORT_MESH
options IEEE80211_SUPPORT_TDMA
device wlan # 802.11 support
device wlan_wep # 802.11 WEP support
device wlan_ccmp # 802.11 CCMP support
device wlan_tkip # 802.11 TKIP support
device firmware # Used by the above
# USB Ethernet support, requires miibus
device miibus
device udav
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
Index: head/sys/arm/conf/RPI-B
===================================================================
--- head/sys/arm/conf/RPI-B (revision 320776)
+++ head/sys/arm/conf/RPI-B (revision 320777)
@@ -1,97 +1,96 @@
#
# RPI-B -- Custom configuration for the Raspberry Pi
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident RPI-B
include "std.armv6"
include "../broadcom/bcm2835/std.rpi"
include "../broadcom/bcm2835/std.bcm2835"
options INTRNG
options SCHED_4BSD # 4BSD scheduler
options PLATFORM
-options MULTIDELAY
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ue0
#options ROOTDEVNAME=\"ufs:mmcsd0s2\"
device bpf
device loop
device ether
device uart
device pty
device snp
device pl011
# Comment following lines for boot console on serial port
device vt
device kbdmux
device ukbd
device sdhci
device mmc
device mmcsd
device gpio
device gpioled
# I2C
device iic
device iicbus
device bcm2835_bsc
device md
device random # Entropy device
# USB support
device usb
device dwcotg # DWC OTG controller
# USB storage support
device scbus
device da
device umass
# USB ethernet support
device smcphy
device mii
device smsc
# SPI
device spibus
device bcm2835_spi
device vchiq
device sound
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
# Note: DTB is normally loaded and modified by RPi boot loader, then
# handed to kernel via U-Boot and ubldr.
#options FDT_DTB_STATIC
#makeoptions FDT_DTS_FILE=rpi.dts
makeoptions MODULES_EXTRA="dtb/rpi rpi_ft5406"
Index: head/sys/arm/conf/RPI2
===================================================================
--- head/sys/arm/conf/RPI2 (revision 320776)
+++ head/sys/arm/conf/RPI2 (revision 320777)
@@ -1,103 +1,102 @@
#
# RPI2 -- Custom configuration for the Raspberry Pi 2
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
#
#NO_UNIVERSE
ident RPI2
include "std.armv6"
include "../broadcom/bcm2835/std.rpi"
include "../broadcom/bcm2835/std.bcm2836"
options INTRNG
options SCHED_ULE # ULE scheduler
options SMP # Enable multiple cores
options PLATFORM
-options MULTIDELAY
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ue0
options ROOTDEVNAME=\"ufs:mmcsd0s2\"
# ARM Generic Timer
device generic_timer
device bpf
device loop
device ether
device uart
device pty
device snp
device pl011
# Comment following lines for boot console on serial port
device vt
device kbdmux
device ukbd
device sdhci
device mmc
device mmcsd
device gpio
device gpioled
# I2C
device iic
device iicbus
device bcm2835_bsc
device md
device random # Entropy device
# USB support
device usb
device dwcotg # DWC OTG controller
# USB storage support
device scbus
device da
device umass
# USB ethernet support
device smcphy
device mii
device smsc
# SPI
device spibus
device bcm2835_spi
device vchiq
device sound
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
# Note: DTB is normally loaded and modified by RPi boot loader, then
# handed to kernel via U-Boot and ubldr.
#options FDT_DTB_STATIC
#makeoptions FDT_DTS_FILE=rpi2.dts
makeoptions MODULES_EXTRA="dtb/rpi rpi_ft5406"
Index: head/sys/arm/conf/SOCFPGA
===================================================================
--- head/sys/arm/conf/SOCFPGA (revision 320776)
+++ head/sys/arm/conf/SOCFPGA (revision 320777)
@@ -1,99 +1,98 @@
#
# Kernel configuration for Altera SOCFPGA development kits.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident SOCFPGA
include "std.armv6"
include "../altera/socfpga/std.socfpga"
makeoptions MODULES_OVERRIDE=""
makeoptions WERROR="-Werror"
options SCHED_ULE # ULE scheduler
options PLATFORM # Platform based SoC
options SMP # Enable multiple cores
-options MULTIDELAY
options SOC_ALTERA_ARRIA10
options SOC_ALTERA_CYCLONE5
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ue0
# Interrupt controller
device gic
options INTRNG
# ARM MPCore timer
device mpcore_timer
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device dwmmc
# Pseudo devices
device loop
device random
device pty
device md
device gpio
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device usb
device dwcotg
device umass
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device pass
# Serial ports
device uart
device uart_snps
# I2C (TWSI)
device iic
device iicbus
# SPI
device spibus
# Ethernet
device ether
device mii
device smsc
device smscphy
device dwc
device micphy
# USB ethernet support, requires miibus
device miibus
device axe # ASIX Electronics USB Ethernet
device bpf # Berkeley packet filter
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
Index: head/sys/arm/conf/TEGRA124
===================================================================
--- head/sys/arm/conf/TEGRA124 (revision 320776)
+++ head/sys/arm/conf/TEGRA124 (revision 320777)
@@ -1,140 +1,139 @@
#
# Kernel configuration for NVIDIA Tegra124 based boards.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
include "std.armv6"
include "../nvidia/tegra124/std.tegra124"
ident TEGRA124
options SCHED_ULE # ULE scheduler
options PLATFORM # Platform based SoC
-options MULTIDELAY
options SMP # Enable multiple cores
options LINUX_BOOT_ABI
# Interrupt controller
device gic
# ARM Generic Timer
device generic_timer
# EXT_RESOURCES pseudo devices
options EXT_RESOURCES
device clk
device phy
device hwreset
device regulator
# Pseudo devices.
device loop # Network loopback
device random # Entropy device
device vlan # 802.1Q VLAN support
#device tun # Packet tunnel.
device md # Memory "disks"
#device gif # IPv6 and IPv4 tunneling
device firmware # firmware assist module
device ether # Ethernet support
device miibus # Required for ethernet
device bpf # Berkeley packet filter (required for DHCP)
# General-purpose input/output
device gpio
#device gpioled
# I2C support
device iic
device iicbus
device icee
# Serial (COM) ports
device uart # Multi-uart driver
device uart_ns8250
# MMC/SD/SDIO Card slot support
device sdhci # SD controller
device mmc # SD/MMC protocol
device mmcsd # SDCard disk device
# ATA controllers
device ahci # AHCI-compatible SATA controllers
# SCSI peripherals
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device cd # CD
device pass # Passthrough device (direct ATA/SCSI access)
# USB support
options USB_HOST_ALIGN=64 # Align usb buffers to cache line size.
device ehci # EHCI USB interface
device xhci # XHCI USB interface
device tegra124_xusb_fw # Tegra XUSB firmware
device usb # USB Bus (required)
device umass # Disks/Mass storage - Requires scbus and da
device uhid # "Human Interface Devices"
#device u3g # USB modems
device ukbd # Allow keyboard like HIDs to control console
device ums # USB mouse
# USB Ethernet, requires miibus
#device aue # ADMtek USB Ethernet
#device axe # ASIX Electronics USB Ethernet
#device cdce # Generic USB over Ethernet
#device cue # CATC USB Ethernet
#device kue # Kawasaki LSI USB Ethernet
#device rue # RealTek RTL8150 USB Ethernet
#device udav # Davicom DM9601E USB
# USB Wireless
#device rum # Ralink Technology RT2501USB wireless NICs
# Wireless NIC cards
#device wlan # 802.11 support
#device wlan_wep # 802.11 WEP support
#device wlan_ccmp # 802.11 CCMP support
#device wlan_tkip # 802.11 TKIP support
#device wlan_amrr # AMRR transmit rate control algorithm
# PCI
options NEW_PCIB
device pci
# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device re # RealTek 8139C+/8169/8169S/8110S
# DRM2
device fbd
device vt
device kbdmux
device drm2
# Sound
#device sound
#device snd_hda
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
device fdt_pinctrl
# SoC-specific devices
#device hwpmc
Index: head/sys/arm/conf/VERSATILEPB
===================================================================
--- head/sys/arm/conf/VERSATILEPB (revision 320776)
+++ head/sys/arm/conf/VERSATILEPB (revision 320777)
@@ -1,78 +1,77 @@
#
# VERSATILEPB - Configuration for QEMU version of Versatile Platform Board
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident VERSATILEPB
machine arm armv6
cpu CPU_ARM1176
include "std.armv6"
files "../versatile/files.versatile"
makeoptions MODULES_OVERRIDE=""
options KERNVIRTADDR=0xc0100000
makeoptions KERNVIRTADDR=0xc0100000
options SCHED_4BSD # 4BSD scheduler
options LINUX_BOOT_ABI # Process metadata passed from Linux boot loaders
options ROOTDEVNAME=\"ufs:da0s1a\"
device bpf
device loop
device mii
device mii_bitbang
device smc
device smcphy
device ether
device uart
device pl011
device pl190
device pty
device snp
device pci
# SCSI Controllers
device sym # NCR/Symbios/LSI Logic 53C8XX/53C1010/53C1510D
# ATA/SCSI peripherals
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device pass # Passthrough device (direct ATA/SCSI access)
# NOTE: serial console is disabled if syscons enabled
# Comment following lines for headless setup
device sc
device kbdmux
options SC_DFLT_FONT # compile font in
makeoptions SC_DFLT_FONT=cp437
device md
device random # Entropy device
options INTRNG
options PLATFORM
-options MULTIDELAY
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
options FDT_DTB_STATIC
makeoptions FDT_DTS_FILE=versatile-pb.dts
Index: head/sys/arm/conf/VIRT
===================================================================
--- head/sys/arm/conf/VIRT (revision 320776)
+++ head/sys/arm/conf/VIRT (revision 320777)
@@ -1,60 +1,59 @@
#
# VIRT -- Custom configuration for the qemu virt platform
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident VIRT
include "std.armv6"
include "../qemu/std.virt"
options SCHED_ULE # ULE scheduler
options PLATFORM
options SMP # Enable multiple cores
-options MULTIDELAY
# Interrupt controller
device gic
options INTRNG
# ARM Generic Timer
device generic_timer
device bpf
device loop
device ether
device uart
device pty
device snp
device pl011
device psci
device virtio
device virtio_mmio
device virtio_blk
device vtnet
device md
device random # Entropy device
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
# Extensible Firmware Interface
options EFI
Index: head/sys/arm/conf/VYBRID
===================================================================
--- head/sys/arm/conf/VYBRID (revision 320776)
+++ head/sys/arm/conf/VYBRID (revision 320777)
@@ -1,116 +1,115 @@
#
# Kernel configuration for Vybrid Family boards.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident VYBRID
include "std.armv6"
include "../freescale/vybrid/std.vybrid"
makeoptions WERROR="-Werror"
options SCHED_4BSD # 4BSD scheduler
options PLATFORM # Platform based SoC
-options MULTIDELAY
#options NANDFS # NAND Filesystem
#options SMP # Enable multiple cores
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
#options BOOTP_WIRED_TO=ffec0
#options ROOTDEVNAME=\"nfs:10.5.0.1:/tftpboot/cosmic\"
#options ROOTDEVNAME=\"nandfs:/dev/gnand0s.root\"
options ROOTDEVNAME=\"ufs:/dev/da0\"
options MUTEX_NOINLINE
options RWLOCK_NOINLINE
options NO_FFS_SNAPSHOT
options NO_SWAPPING
# Interrupt controller
device gic
options INTRNG
# ARM MPCore timer
device mpcore_timer
# MMC/SD/SDIO Card slot support
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device sdhci # generic sdhci
# Pseudo devices
device loop
device random
device pty
device md
device gpio
# USB support
options USB_HOST_ALIGN=32 # Align usb buffers to cache line size.
device usb
#device musb
device ehci
#device ohci
device umass
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device pass
# SATA
#device ata
#device atadisk
#device mvs
device nand
# Serial ports
device uart
# I2C (TWSI)
device iic
device iicbus
# Ethernet
device ether
device ffec
# USB ethernet support, requires miibus
device miibus
device axe # ASIX Electronics USB Ethernet
device bpf # Berkeley packet filter
device sound
# SPI
device spibus
device vf_spi
# Framebuffer
device vt
device kbdmux
device ukbd
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
Index: head/sys/arm/conf/ZEDBOARD
===================================================================
--- head/sys/arm/conf/ZEDBOARD (revision 320776)
+++ head/sys/arm/conf/ZEDBOARD (revision 320777)
@@ -1,82 +1,81 @@
#
# ZEDBOARD -- Custom configuration for the Xilinx Zynq-7000 based
# ZedBoard (www.zedboard.org) and similar Zynq boards.
#
# For more information on this file, please read the config(5) manual page,
# and/or the handbook section on Kernel Configuration Files:
#
# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
#
# The handbook is also available locally in /usr/share/doc/handbook
# if you've installed the doc distribution, otherwise always see the
# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
# latest information.
#
# An exhaustive list of options and more detailed explanations of the
# device lines is also present in the ../../conf/NOTES and NOTES files.
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
# $FreeBSD$
ident ZEDBOARD
include "std.armv6"
include "../xilinx/std.zynq7"
makeoptions MODULES_EXTRA="dtb/zynq"
options SCHED_ULE # ULE scheduler
options PLATFORM # Platform based SoC
-options MULTIDELAY
#options NFSSD # Network Filesystem Server
options SMP # Enable multiple cores
# NFS root from boopt/dhcp
#options BOOTP
#options BOOTP_NFSROOT
#options BOOTP_COMPAT
#options BOOTP_NFSV3
options ROOTDEVNAME=\"ufs:mmcsd0s2a\"
# Interrupt controller
device gic
options INTRNG
# Cache controller
device pl310 # PL310 L2 cache controller
# ARM MPCore timer
device mpcore_timer
device loop
device random
device ether
device cgem # Zynq-7000 gig ethernet device
device mii
device e1000phy
device rgephy # Zybo uses Realtek RTL8211E
device pty
device uart
device gpio
device md
device mmc # mmc/sd bus
device mmcsd # mmc/sd flash cards
device sdhci # generic sdhci
device bpf # Berkeley packet filter
# USB support
device usb
device ehci
device umass
device scbus # SCSI bus (required for ATA/SCSI)
device da # Direct Access (disks)
device axe # USB-Ethernet
# Flattened Device Tree
options FDT # Configure using FDT/DTB data
#options FDT_DTB_STATIC
#makeoptions FDT_DTS_FILE=zedboard.dts
Index: head/sys/arm/include/machdep.h
===================================================================
--- head/sys/arm/include/machdep.h (revision 320776)
+++ head/sys/arm/include/machdep.h (revision 320777)
@@ -1,63 +1,63 @@
/* $NetBSD: machdep.h,v 1.7 2002/02/21 02:52:21 thorpej Exp $ */
/* $FreeBSD$ */
#ifndef _MACHDEP_BOOT_MACHDEP_H_
#define _MACHDEP_BOOT_MACHDEP_H_
/* Structs that need to be initialised by initarm */
#if __ARM_ARCH >= 6
extern vm_offset_t irqstack;
extern vm_offset_t undstack;
extern vm_offset_t abtstack;
#else
struct pv_addr;
extern struct pv_addr irqstack;
extern struct pv_addr undstack;
extern struct pv_addr abtstack;
#endif
/* Define various stack sizes in pages */
#define IRQ_STACK_SIZE 1
#define ABT_STACK_SIZE 1
#define UND_STACK_SIZE 1
/* misc prototypes used by the many arm machdeps */
struct trapframe;
void arm_lock_cache_line(vm_offset_t);
void init_proc0(vm_offset_t kstack);
void halt(void);
void abort_handler(struct trapframe *, int );
void set_stackptrs(int cpu);
void undefinedinstruction_bounce(struct trapframe *);
/* Early boot related helper functions */
struct arm_boot_params;
vm_offset_t default_parse_boot_param(struct arm_boot_params *abp);
vm_offset_t fake_preload_metadata(struct arm_boot_params *abp,
void *dtb_ptr, size_t dtb_size);
vm_offset_t parse_boot_param(struct arm_boot_params *abp);
void arm_parse_fdt_bootargs(void);
void arm_print_kenv(void);
void arm_generic_initclocks(void);
/* Board-specific attributes */
void board_set_serial(uint64_t);
void board_set_revision(uint32_t);
int arm_predict_branch(void *, u_int, register_t, register_t *,
u_int (*)(void*, int), u_int (*)(void*, vm_offset_t, u_int*));
-#ifdef MULTIDELAY
+#ifdef PLATFORM
typedef void delay_func(int, void *);
void arm_set_delay(delay_func *, void *);
#endif
#ifdef EFI
struct efi_map_header;
struct mem_region;
void arm_add_efi_map_entries(struct efi_map_header *efihdr,
struct mem_region *mr, int *mrcnt);
#endif
#endif /* !_MACHINE_MACHDEP_H_ */
Index: head/sys/arm/include/platformvar.h
===================================================================
--- head/sys/arm/include/platformvar.h (revision 320776)
+++ head/sys/arm/include/platformvar.h (revision 320777)
@@ -1,125 +1,119 @@
/*-
* Copyright (c) 2005 Peter Grehan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
#ifndef _MACHINE_PLATFORMVAR_H_
#define _MACHINE_PLATFORMVAR_H_
/*
* An ARM platform implementation is declared with a kernel object and
* an associated method table, similar to a device driver.
*
* e.g.
*
* static platform_method_t bcm2835_methods[] = {
* PLATFORMMETHOD(platform_probe, bcm2835_probe),
* ...
* PLATFORMMETHOD_END
* };
*
* static platform_def_t bcm3835_platform = {
* "bcm2835",
* bcm2835_methods,
* sizeof(bcm2835_platform_softc), // or 0 if no softc
* };
*
* PLATFORM_DEF(bcm2835_platform);
*/
#include
#include
struct platform_class {
KOBJ_CLASS_FIELDS;
/* How many times to loop to delay approximately 1us */
int delay_count;
};
struct platform_kobj {
/*
* A platform instance is a kernel object
*/
KOBJ_FIELDS;
/* Platform class, for access to class specific data */
struct platform_class *cls;
};
typedef struct platform_kobj *platform_t;
typedef struct platform_class platform_def_t;
#define platform_method_t kobj_method_t
#define PLATFORMMETHOD KOBJMETHOD
#define PLATFORMMETHOD_END KOBJMETHOD_END
#define PLATFORM_DEF(name) DATA_SET(platform_set, name)
#ifdef FDT
struct fdt_platform_class {
KOBJ_CLASS_FIELDS;
const char *fdt_compatible;
};
typedef struct fdt_platform_class fdt_platform_def_t;
extern platform_method_t fdt_platform_methods[];
-#ifdef MULTIDELAY
-#define FDT_PLATFORM_CTASSERT(delay) CTASSERT(delay > 0)
-#else
-#define FDT_PLATFORM_CTASSERT(delay)
-#endif
-
#define FDT_PLATFORM_DEF2(NAME, VAR_NAME, NAME_STR, size, compatible, \
delay) \
-FDT_PLATFORM_CTASSERT(delay); \
+CTASSERT(delay > 0); \
static fdt_platform_def_t VAR_NAME ## _fdt_platform = { \
.name = NAME_STR, \
.methods = fdt_platform_methods, \
.fdt_compatible = compatible, \
}; \
static kobj_class_t VAR_NAME ## _baseclasses[] = \
{ (kobj_class_t)&VAR_NAME ## _fdt_platform, NULL }; \
static platform_def_t VAR_NAME ## _platform = { \
NAME_STR, \
NAME ## _methods, \
size, \
VAR_NAME ## _baseclasses, \
delay, \
}; \
DATA_SET(platform_set, VAR_NAME ## _platform)
#define FDT_PLATFORM_DEF(NAME, NAME_STR, size, compatible, delay) \
FDT_PLATFORM_DEF2(NAME, NAME, NAME_STR, size, compatible, delay)
#endif
bool arm_tmr_timed_wait(platform_t, int);
#endif /* _MACHINE_PLATFORMVAR_H_ */
Index: head/sys/conf/options.arm
===================================================================
--- head/sys/conf/options.arm (revision 320776)
+++ head/sys/conf/options.arm (revision 320777)
@@ -1,84 +1,83 @@
#$FreeBSD$
ARMV6 opt_global.h
ARM_CACHE_LOCK_ENABLE opt_global.h
ARM_KERN_DIRECTMAP opt_vm.h
ARM_L2_PIPT opt_global.h
ARM_MANY_BOARD opt_global.h
ARM_USE_V6_BUSDMA opt_global.h
ARM_WANT_TP_ADDRESS opt_global.h
COUNTS_PER_SEC opt_timer.h
CPSW_ETHERSWITCH opt_cpsw.h
CPU_ARM9 opt_global.h
CPU_ARM9E opt_global.h
CPU_ARM1176 opt_global.h
CPU_CORTEXA opt_global.h
CPU_KRAIT opt_global.h
CPU_FA526 opt_global.h
CPU_MV_PJ4B opt_global.h
CPU_XSCALE_81342 opt_global.h
CPU_XSCALE_IXP425 opt_global.h
CPU_XSCALE_IXP435 opt_global.h
CPU_XSCALE_PXA2X0 opt_global.h
SMP_ON_UP opt_global.h # Runtime detection of MP extensions
DEV_GIC opt_global.h
DEV_PMU opt_global.h
EFI opt_platform.h
FLASHADDR opt_global.h
GIC_DEFAULT_ICFGR_INIT opt_global.h
INTRNG opt_global.h
IPI_IRQ_START opt_smp.h
IPI_IRQ_END opt_smp.h
FREEBSD_BOOT_LOADER opt_global.h
IXP4XX_FLASH_SIZE opt_global.h
KERNBASE opt_global.h
KERNVIRTADDR opt_global.h
LINUX_BOOT_ABI opt_global.h
LOADERRAMADDR opt_global.h
-MULTIDELAY opt_global.h
NKPT2PG opt_pmap.h
PHYSADDR opt_global.h
PLATFORM opt_global.h
SOCDEV_PA opt_global.h
SOCDEV_VA opt_global.h
PV_STATS opt_pmap.h
QEMU_WORKAROUNDS opt_global.h
SOC_ALLWINNER_A10 opt_global.h
SOC_ALLWINNER_A13 opt_global.h
SOC_ALLWINNER_A20 opt_global.h
SOC_ALLWINNER_A31 opt_global.h
SOC_ALLWINNER_A31S opt_global.h
SOC_ALLWINNER_A33 opt_global.h
SOC_ALLWINNER_A83T opt_global.h
SOC_ALLWINNER_H2PLUS opt_global.h
SOC_ALLWINNER_H3 opt_global.h
SOC_ALTERA_ARRIA10 opt_global.h
SOC_ALTERA_CYCLONE5 opt_global.h
SOC_BCM2835 opt_global.h
SOC_BCM2836 opt_global.h
SOC_IMX51 opt_global.h
SOC_IMX53 opt_global.h
SOC_IMX6 opt_global.h
SOC_MV_ARMADAXP opt_global.h
SOC_MV_ARMADA38X opt_global.h
SOC_MV_DISCOVERY opt_global.h
SOC_MV_KIRKWOOD opt_global.h
SOC_MV_ORION opt_global.h
SOC_OMAP3 opt_global.h
SOC_OMAP4 opt_global.h
SOC_ROCKCHIP_RK3188 opt_global.h
SOC_TI_AM335X opt_global.h
SOC_TEGRA2 opt_global.h
XSCALE_CACHE_READ_WRITE_ALLOCATE opt_global.h
XSACLE_DISABLE_CCNT opt_timer.h
VERBOSE_INIT_ARM opt_global.h
VM_MAXUSER_ADDRESS opt_global.h
AT91_ATE_USE_RMII opt_at91.h
AT91_MACB_USE_RMII opt_at91.h
AT91_MCI_ALLOW_OVERCLOCK opt_at91.h
AT91_MCI_HAS_4WIRE opt_at91.h
AT91_MCI_SLOT_B opt_at91.h
GFB_DEBUG opt_gfb.h
GFB_NO_FONT_LOADING opt_gfb.h
GFB_NO_MODE_CHANGE opt_gfb.h
AT91C_MAIN_CLOCK opt_at91.h
VFP opt_global.h