Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 15 May 2014 17:30:16 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r266160 - in stable/10/sys: arm/arm arm/at91 arm/broadcom/bcm2835 arm/econa arm/freescale/imx arm/include arm/mv arm/s3c2xx0 arm/xscale/ixp425 conf dev/fdt dev/mmc dev/ofw dev/powermac_...
Message-ID:  <201405151730.s4FHUGw3005353@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ian
Date: Thu May 15 17:30:16 2014
New Revision: 266160
URL: http://svnweb.freebsd.org/changeset/base/266160

Log:
  MFC r261423, r261424, r261516, r261513, r261562, r261563, r261564, r261565,
      r261596, r261606
  
    Add the imx sdhci controller.
  
    Move Open Firmware device root on PowerPC, ARM, and MIPS systems to
    a sub-node of nexus (ofwbus) rather than direct attach under nexus. This
    fixes FDT on x86 and will make coexistence with ACPI on ARM systems easier.
    SPARC is unchanged.
  
    Add the missing ')' at end of sentence.  Reword it to use a more common idiom.
  
    Pass the kernel physical address to initarm through the boot param struct.
  
    Make functions only used in vfp.c static, and remove vfp_enable.
  
    Fix __syscall on armeb EABI. As it returns a 64-bit value it needs to
    place 32-bit data in r1, not r0. 64-bit data is already packed correctly.
  
    Use abp_physaddr for the physical address over KERNPHYSADDR. This helps us
    remove the need to load the kernel at a fixed address.
  
    Remove references to PHYSADDR where it's used only in debugging output.
  
    Dynamically generate the page table. This will allow us to detect the
    physical address we are loaded at to change the mapping.

Added:
  stable/10/sys/dev/ofw/ofwbus.c
     - copied unchanged from r261513, head/sys/dev/ofw/ofwbus.c
Deleted:
  stable/10/sys/dev/fdt/fdtbus.c
  stable/10/sys/dev/ofw/ofw_nexus.c
  stable/10/sys/dev/ofw/ofw_nexus.h
Modified:
  stable/10/sys/arm/arm/elf_trampoline.c
  stable/10/sys/arm/arm/locore.S
  stable/10/sys/arm/arm/machdep.c
  stable/10/sys/arm/arm/nexus.c
  stable/10/sys/arm/arm/pmap-v6.c
  stable/10/sys/arm/arm/pmap.c
  stable/10/sys/arm/arm/support.S
  stable/10/sys/arm/arm/vfp.c
  stable/10/sys/arm/arm/vm_machdep.c
  stable/10/sys/arm/at91/at91_machdep.c
  stable/10/sys/arm/broadcom/bcm2835/bcm2835_fb.c
  stable/10/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
  stable/10/sys/arm/econa/econa_machdep.c
  stable/10/sys/arm/freescale/imx/tzic.c
  stable/10/sys/arm/include/cpu.h
  stable/10/sys/arm/include/machdep.h
  stable/10/sys/arm/mv/mv_localbus.c
  stable/10/sys/arm/mv/mv_pci.c
  stable/10/sys/arm/s3c2xx0/s3c24x0_machdep.c
  stable/10/sys/arm/xscale/ixp425/avila_machdep.c
  stable/10/sys/conf/files
  stable/10/sys/conf/files.powerpc
  stable/10/sys/dev/fdt/simplebus.c
  stable/10/sys/dev/mmc/mmc.c
  stable/10/sys/dev/powermac_nvram/powermac_nvram.c
  stable/10/sys/mips/beri/beri_simplebus.c
  stable/10/sys/mips/mips/nexus.c
  stable/10/sys/powerpc/mambo/mambo.c
  stable/10/sys/powerpc/mpc85xx/lbc.c
  stable/10/sys/powerpc/mpc85xx/pci_mpc85xx.c
  stable/10/sys/powerpc/ofw/ofw_cpu.c
  stable/10/sys/powerpc/ofw/openpic_ofw.c
  stable/10/sys/powerpc/powermac/cpcht.c
  stable/10/sys/powerpc/powermac/grackle.c
  stable/10/sys/powerpc/powermac/smu.c
  stable/10/sys/powerpc/powermac/uninorth.c
  stable/10/sys/powerpc/powermac/uninorthpci.c
  stable/10/sys/powerpc/powerpc/nexus.c
  stable/10/sys/powerpc/pseries/rtas_dev.c
  stable/10/sys/powerpc/pseries/rtas_pci.c
  stable/10/sys/powerpc/pseries/vdevice.c
  stable/10/sys/powerpc/pseries/xics.c
  stable/10/sys/powerpc/psim/iobus.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/arm/arm/elf_trampoline.c
==============================================================================
--- stable/10/sys/arm/arm/elf_trampoline.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/elf_trampoline.c	Thu May 15 17:30:16 2014	(r266160)
@@ -189,7 +189,7 @@ _startC(void)
 	int physaddr = KERNPHYSADDR;
 	int tmp1;
 	unsigned int sp = ((unsigned int)&_end & ~3) + 4;
-#if defined(FLASHADDR) && defined(LOADERRAMADDR)
+#if defined(FLASHADDR) && defined(PHYSADDR) && defined(LOADERRAMADDR)
 	unsigned int pc;
 
 	__asm __volatile("mov %0, pc\n"

Modified: stable/10/sys/arm/arm/locore.S
==============================================================================
--- stable/10/sys/arm/arm/locore.S	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/locore.S	Thu May 15 17:30:16 2014	(r266160)
@@ -153,22 +153,27 @@ Lunmapped:
 	ldr	r2, =(KERNVIRTADDR - KERNPHYSADDR)
 	sub	r0, r1, r2
 
-	adr	r4, mmu_init_table
-	b	3f
-
-2:
-	str	r3, [r0, r2]
-	add	r2, r2, #4
-	add	r3, r3, #(L1_S_SIZE)
-	adds	r1, r1, #-1
-	bhi	2b
-3:
-	ldmia	r4!, {r1,r2,r3}   /* # of sections, VA, PA|attr */
-	cmp	r1, #0
-	adrne	r5, 2b
-	bicne	r5, r5, #0xf0000000
-	orrne	r5, r5, #PHYSADDR
-	movne	pc, r5
+	/*
+	 * Map PA == VA
+	 */
+	ldr	r5, =(PHYSADDR)
+	mov	r1, r5
+	mov	r2, r5
+	/* Map 64MiB, preserved over calls to build_pagetables */
+	mov	r3, #64
+	bl	build_pagetables
+
+	/* Create the kernel map to jump to */
+	mov	r1, r5
+	ldr	r2, =(KERNBASE)
+	bl	build_pagetables
+	
+#if defined(SOCDEV_PA) && defined(SOCDEV_VA)
+	/* Create the custom map */
+	ldr	r1, =SOCDEV_VA
+	ldr	r2, =SOCDEV_PA
+	bl	build_pagetables
+#endif
 
 #if defined(SMP)
 	orr 	r0, r0, #2		/* Set TTB shared memory flag */
@@ -216,7 +221,7 @@ mmu_done:
 	ldr	pc, .Lvirt_done
 
 virt_done:
-	mov	r1, #20			/* loader info size is 20 bytes also second arg */
+	mov	r1, #24			/* loader info size is 24 bytes also second arg */
 	subs	sp, sp, r1		/* allocate arm_boot_params struct on stack */
 	bic	sp, sp, #7		/* align stack to 8 bytes */
 	mov	r0, sp			/* loader info pointer is first arg */
@@ -225,6 +230,8 @@ virt_done:
 	str	r8, [r0, #8]		/* Store r1 from boot loader */
 	str	ip, [r0, #12]		/* store r2 from boot loader */
 	str	fp, [r0, #16]		/* store r3 from boot loader */
+	ldr	r5, =KERNPHYSADDR	/* load KERNPHYSADDR as the physical address */
+	str	r5, [r0, #20]		/* store the physical address */
 	mov	fp, #0			/* trace back starts here */
 	bl	_C_LABEL(initarm)	/* Off we go */
 
@@ -236,6 +243,40 @@ virt_done:
 	adr	r0, .Lmainreturned
 	b	_C_LABEL(panic)
 	/* NOTREACHED */
+END(btext)
+END(_start)
+
+/*
+ * Builds the page table
+ * r0 - The table base address
+ * r1 - The physical address (trashed)
+ * r2 - The virtual address (trashed)
+ * r3 - The number of 1MiB sections
+ * r4 - Trashed
+ *
+ * Addresses must be 1MiB aligned
+ */
+build_pagetables:
+	/* Set the required page attributed */
+	ldr	r4, =(L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
+#if defined(SMP)
+	orr	r4, #(L1_SHARED)
+#endif
+	orr	r1, r4
+
+	/* Move the virtual address to the correct bit location */
+	lsr	r2, #(L1_S_SHIFT - 2)
+
+	mov	r4, r3
+1:
+	str	r1, [r0, r2]
+	add	r2, r2, #4
+	add	r1, r1, #(L1_S_SIZE)
+	adds	r4, r4, #-1
+	bhi	1b
+
+	RET
+
 #define MMU_INIT(va,pa,n_sec,attr) \
 	.word	n_sec					    ; \
 	.word	4*((va)>>L1_S_SHIFT)			    ; \
@@ -255,27 +296,7 @@ Lstartup_pagetable:
 Lstartup_pagetable_secondary:
 	.word	temp_pagetable
 #endif
-END(btext)
-END(_start)
 
-mmu_init_table:
-	/* fill all table VA==PA */
-	/* map SDRAM VA==PA, WT cacheable */
-#if !defined(SMP)
-	MMU_INIT(PHYSADDR, PHYSADDR, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
-	/* map VA 0xc0000000..0xc3ffffff to PA */
-	MMU_INIT(KERNBASE, PHYSADDR, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
-#if defined(SOCDEV_PA) && defined(SOCDEV_VA)
-	/* Map in 0x04000000 worth of the SoC's devices for bootstrap debugging */
-	MMU_INIT(SOCDEV_VA, SOCDEV_PA, 64, L1_TYPE_S|L1_S_C|L1_S_AP(AP_KRW))
-#endif
-#else
-	MMU_INIT(PHYSADDR, PHYSADDR , 64, L1_TYPE_S|L1_SHARED|L1_S_C|L1_S_AP(AP_KRW))
-	/* map VA 0xc0000000..0xc3ffffff to PA */
-	MMU_INIT(KERNBASE, PHYSADDR, 64, L1_TYPE_S|L1_SHARED|L1_S_C|L1_S_AP(AP_KRW))
-	MMU_INIT(0x48000000, 0x48000000, 1, L1_TYPE_S|L1_SHARED|L1_S_C|L1_S_AP(AP_KRW))
-#endif /* SMP */
-	.word 0	/* end of table */
 .Lstart:
 	.word	_edata
 	.word	_ebss

Modified: stable/10/sys/arm/arm/machdep.c
==============================================================================
--- stable/10/sys/arm/arm/machdep.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/machdep.c	Thu May 15 17:30:16 2014	(r266160)
@@ -788,7 +788,7 @@ makectx(struct trapframe *tf, struct pcb
  * calling pmap_bootstrap.
  */
 void
-arm_dump_avail_init(vm_offset_t ramsize, size_t max)
+arm_dump_avail_init(vm_paddr_t physaddr, vm_offset_t ramsize, size_t max)
 {
 #ifdef LINUX_BOOT_ABI
 	/*
@@ -814,8 +814,8 @@ arm_dump_avail_init(vm_offset_t ramsize,
 	if (max < 4)
 		panic("dump_avail too small\n");
 
-	dump_avail[0] = round_page(PHYSADDR);
-	dump_avail[1] = trunc_page(PHYSADDR + ramsize);
+	dump_avail[0] = round_page(physaddr);
+	dump_avail[1] = trunc_page(physaddr + ramsize);
 	dump_avail[2] = 0;
 	dump_avail[3] = 0;
 }
@@ -901,7 +901,7 @@ linux_parse_boot_param(struct arm_boot_p
 
 	board_id = abp->abp_r1;
 	walker = (struct arm_lbabi_tag *)
-	    (abp->abp_r2 + KERNVIRTADDR - KERNPHYSADDR);
+	    (abp->abp_r2 + KERNVIRTADDR - abp->abp_physaddr);
 
 	/* xxx - Need to also look for binary device tree */
 	if (ATAG_TAG(walker) != ATAG_CORE)
@@ -979,7 +979,7 @@ freebsd_parse_boot_param(struct arm_boot
 	ksym_start = MD_FETCH(kmdp, MODINFOMD_SSYM, uintptr_t);
 	ksym_end = MD_FETCH(kmdp, MODINFOMD_ESYM, uintptr_t);
 #endif
-	preload_addr_relocate = KERNVIRTADDR - KERNPHYSADDR;
+	preload_addr_relocate = KERNVIRTADDR - abp->abp_physaddr;
 	return lastaddr;
 }
 #endif
@@ -1081,15 +1081,15 @@ print_kenv(void)
 }
 
 static void
-physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz)
+physmap_init(struct mem_region *availmem_regions, int availmem_regions_sz,
+    vm_offset_t kernload)
 {
 	int i, j, cnt;
-	vm_offset_t phys_kernelend, kernload;
+	vm_offset_t phys_kernelend;
 	uint32_t s, e, sz;
 	struct mem_region *mp, *mp1;
 
-	phys_kernelend = KERNPHYSADDR + (virtual_avail - KERNVIRTADDR);
-	kernload = KERNPHYSADDR;
+	phys_kernelend = kernload + (virtual_avail - KERNVIRTADDR);
 
 	/*
 	 * Remove kernel physical address range from avail
@@ -1327,7 +1327,7 @@ initarm(struct arm_boot_params *abp)
 	/* Define a macro to simplify memory allocation */
 #define valloc_pages(var, np)						\
 	alloc_pages((var).pv_va, (np));					\
-	(var).pv_pa = (var).pv_va + (KERNPHYSADDR - KERNVIRTADDR);
+	(var).pv_pa = (var).pv_va + (abp->abp_physaddr - KERNVIRTADDR);
 
 #define alloc_pages(var, np)						\
 	(var) = freemempos;						\
@@ -1348,7 +1348,7 @@ initarm(struct arm_boot_params *abp)
 			    L2_TABLE_SIZE_REAL * (i - j);
 			kernel_pt_table[i].pv_pa =
 			    kernel_pt_table[i].pv_va - KERNVIRTADDR +
-			    KERNPHYSADDR;
+			    abp->abp_physaddr;
 
 		}
 	}
@@ -1393,7 +1393,7 @@ initarm(struct arm_boot_params *abp)
 	pmap_curmaxkvaddr = l2_start + (l2size - 1) * L1_S_SIZE;
 
 	/* Map kernel code and data */
-	pmap_map_chunk(l1pagetable, KERNVIRTADDR, KERNPHYSADDR,
+	pmap_map_chunk(l1pagetable, KERNVIRTADDR, abp->abp_physaddr,
 	   (((uint32_t)(lastaddr) - KERNVIRTADDR) + PAGE_MASK) & ~PAGE_MASK,
 	    VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
 
@@ -1497,7 +1497,8 @@ initarm(struct arm_boot_params *abp)
 
 	arm_intrnames_init();
 	arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
-	arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+	arm_dump_avail_init(abp->abp_physaddr, memsize,
+	    sizeof(dump_avail) / sizeof(dump_avail[0]));
 	pmap_bootstrap(freemempos, &kernel_l1pt);
 	msgbufp = (void *)msgbufpv.pv_va;
 	msgbufinit(msgbufp, msgbufsize);
@@ -1506,7 +1507,7 @@ initarm(struct arm_boot_params *abp)
 	/*
 	 * Prepare map of physical memory regions available to vm subsystem.
 	 */
-	physmap_init(availmem_regions, availmem_regions_sz);
+	physmap_init(availmem_regions, availmem_regions_sz, abp->abp_physaddr);
 
 	init_param2(physmem);
 	kdb_init();

Modified: stable/10/sys/arm/arm/nexus.c
==============================================================================
--- stable/10/sys/arm/arm/nexus.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/nexus.c	Thu May 15 17:30:16 2014	(r266160)
@@ -63,11 +63,11 @@ __FBSDID("$FreeBSD$");
 #include "opt_platform.h"
 
 #ifdef FDT
-#include <dev/ofw/ofw_nexus.h>
 #include <dev/fdt/fdt_common.h>
 #include <machine/fdt.h>
 #include "ofw_bus_if.h"
-#else
+#endif
+
 static MALLOC_DEFINE(M_NEXUSDEV, "nexusdev", "Nexus device");
 
 struct nexus_device {
@@ -84,7 +84,6 @@ static	int nexus_print_child(device_t, d
 static	device_t nexus_add_child(device_t, u_int, const char *, int);
 static	struct resource *nexus_alloc_resource(device_t, device_t, int, int *,
     u_long, u_long, u_long, u_int);
-#endif
 static	int nexus_activate_resource(device_t, device_t, int, int,
     struct resource *);
 static int nexus_config_intr(device_t dev, int irq, enum intr_trigger trig,
@@ -102,7 +101,6 @@ static int nexus_ofw_map_intr(device_t d
 #endif
 
 static device_method_t nexus_methods[] = {
-#ifndef FDT
 	/* Device interface */
 	DEVMETHOD(device_probe,		nexus_probe),
 	DEVMETHOD(device_attach,	nexus_attach),
@@ -110,7 +108,6 @@ static device_method_t nexus_methods[] =
 	DEVMETHOD(bus_print_child,	nexus_print_child),
 	DEVMETHOD(bus_add_child,	nexus_add_child),
 	DEVMETHOD(bus_alloc_resource,	nexus_alloc_resource),
-#endif
 	DEVMETHOD(bus_activate_resource,	nexus_activate_resource),
 	DEVMETHOD(bus_config_intr,	nexus_config_intr),
 	DEVMETHOD(bus_deactivate_resource,	nexus_deactivate_resource),
@@ -123,19 +120,13 @@ static device_method_t nexus_methods[] =
 };
 
 static devclass_t nexus_devclass;
-#ifndef FDT
 static driver_t nexus_driver = {
 	"nexus",
 	nexus_methods,
 	1			/* no softc */
 };
-#else
-DEFINE_CLASS_1(nexus, nexus_driver, nexus_methods,
-    sizeof(struct ofw_nexus_softc), ofw_nexus_driver);
-#endif
 DRIVER_MODULE(nexus, root, nexus_driver, nexus_devclass, 0, 0);
 
-#ifndef FDT
 static int
 nexus_probe(device_t dev)
 {
@@ -235,7 +226,6 @@ nexus_alloc_resource(device_t bus, devic
 
 	return (rv);
 }
-#endif
 
 static int
 nexus_config_intr(device_t dev, int irq, enum intr_trigger trig,

Modified: stable/10/sys/arm/arm/pmap-v6.c
==============================================================================
--- stable/10/sys/arm/arm/pmap-v6.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/pmap-v6.c	Thu May 15 17:30:16 2014	(r266160)
@@ -1312,8 +1312,6 @@ pmap_init(void)
 	vm_size_t s;
 	int i, pv_npg;
 
-	PDEBUG(1, printf("pmap_init: phys_start = %08x\n", PHYSADDR));
-
 	l2zone = uma_zcreate("L2 Table", L2_TABLE_SIZE_REAL, pmap_l2ptp_ctor,
 	    NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE);
 	l2table_zone = uma_zcreate("L2 Table", sizeof(struct l2_dtable), NULL,

Modified: stable/10/sys/arm/arm/pmap.c
==============================================================================
--- stable/10/sys/arm/arm/pmap.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/pmap.c	Thu May 15 17:30:16 2014	(r266160)
@@ -1826,8 +1826,6 @@ pmap_init(void)
 {
 	int shpgperproc = PMAP_SHPGPERPROC;
 
-	PDEBUG(1, printf("pmap_init: phys_start = %08x\n", PHYSADDR));
-
 	l2zone = uma_zcreate("L2 Table", L2_TABLE_SIZE_REAL, pmap_l2ptp_ctor,
 	    NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM | UMA_ZONE_NOFREE);
 	l2table_zone = uma_zcreate("L2 Table", sizeof(struct l2_dtable), NULL,

Modified: stable/10/sys/arm/arm/support.S
==============================================================================
--- stable/10/sys/arm/arm/support.S	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/support.S	Thu May 15 17:30:16 2014	(r266160)
@@ -939,7 +939,7 @@ END(memmove)
 ENTRY(memcpy)
 	/* save leaf functions having to store this away */
 	/* Do not check arm_memcpy if we're running from flash */
-#ifdef FLASHADDR
+#if defined(FLASHADDR) && defined(PHYSADDR)
 #if FLASHADDR > PHYSADDR
 	ldr	r3, =FLASHADDR
 	cmp	r3, pc

Modified: stable/10/sys/arm/arm/vfp.c
==============================================================================
--- stable/10/sys/arm/arm/vfp.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/vfp.c	Thu May 15 17:30:16 2014	(r266160)
@@ -42,10 +42,9 @@ __FBSDID("$FreeBSD$");
 
 /* function prototypes */
 unsigned int get_coprocessorACR(void);
-int	vfp_bounce(u_int, u_int, struct trapframe *, int);
+static int vfp_bounce(u_int, u_int, struct trapframe *, int);
+static void vfp_restore(struct vfp_state *);
 void	vfp_discard(void);
-void	vfp_enable(void);
-void	vfp_restore(struct vfp_state *);
 void	vfp_store(struct vfp_state *);
 void	set_coprocessorACR(u_int);
 
@@ -134,7 +133,7 @@ SYSINIT(vfp, SI_SUB_CPU, SI_ORDER_ANY, v
 /* start VFP unit, restore the vfp registers from the PCB  and retry
  * the instruction
  */
-int
+static int
 vfp_bounce(u_int addr, u_int insn, struct trapframe *frame, int code)
 {
 	u_int fpexc;
@@ -196,7 +195,7 @@ vfp_bounce(u_int addr, u_int insn, struc
  * Eventually we will use the information that this process was the last
  * to use the VFP hardware and bypass the restore, just turn on the hardware.
  */
-void
+static void
 vfp_restore(struct vfp_state *vfpsave)
 {
 	u_int vfpscr = 0;
@@ -280,17 +279,5 @@ vfp_discard()
 	fmxr(VFPEXC, tmp);
 }
 
-/* Enable the VFP hardware without restoring registers.
- * Called when the registers are still in the VFP unit
- */
-void
-vfp_enable()
-{
-	u_int tmp = 0;
-
-	tmp = fmrx(VFPEXC);
-	tmp |= VFPEXC_EN;
-	fmxr(VFPEXC, tmp);
-}
 #endif
 

Modified: stable/10/sys/arm/arm/vm_machdep.c
==============================================================================
--- stable/10/sys/arm/arm/vm_machdep.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/arm/vm_machdep.c	Thu May 15 17:30:16 2014	(r266160)
@@ -298,15 +298,25 @@ cpu_set_syscall_retval(struct thread *td
 	struct trapframe *frame;
 	int fixup;
 #ifdef __ARMEB__
-	uint32_t insn;
+	u_int call;
 #endif
 
 	frame = td->td_frame;
 	fixup = 0;
 
 #ifdef __ARMEB__
-	insn = *(u_int32_t *)(frame->tf_pc - INSN_SIZE);
-	if ((insn & 0x000fffff) == SYS___syscall) {
+	/*
+	 * __syscall returns an off_t while most other syscalls return an
+	 * int. As an off_t is 64-bits and an int is 32-bits we need to
+	 * place the returned data into r1. As the lseek and frerebsd6_lseek
+	 * syscalls also return an off_t they do not need this fixup.
+	 */
+#ifdef __ARM_EABI__
+	call = frame->tf_r7;
+#else
+	call = *(u_int32_t *)(frame->tf_pc - INSN_SIZE) & 0x000fffff;
+#endif
+	if (call == SYS___syscall) {
 		register_t *ap = &frame->tf_r0;
 		register_t code = ap[_QUAD_LOWWORD];
 		if (td->td_proc->p_sysent->sv_mask)

Modified: stable/10/sys/arm/at91/at91_machdep.c
==============================================================================
--- stable/10/sys/arm/at91/at91_machdep.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/at91/at91_machdep.c	Thu May 15 17:30:16 2014	(r266160)
@@ -630,7 +630,8 @@ initarm(struct arm_boot_params *abp)
 	arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
 	pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
-	arm_dump_avail_init(memsize, sizeof(dump_avail)/sizeof(dump_avail[0]));
+	arm_dump_avail_init(abp->abp_physaddr, memsize,
+	    sizeof(dump_avail)/sizeof(dump_avail[0]));
 	/* Always use the 256MB of KVA we have available between the kernel and devices */
 	vm_max_kernel_address = KERNVIRTADDR + (256 << 20);
 	pmap_bootstrap(freemempos, &kernel_l1pt);

Modified: stable/10/sys/arm/broadcom/bcm2835/bcm2835_fb.c
==============================================================================
--- stable/10/sys/arm/broadcom/bcm2835/bcm2835_fb.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/broadcom/bcm2835/bcm2835_fb.c	Thu May 15 17:30:16 2014	(r266160)
@@ -361,7 +361,7 @@ static driver_t bcm_fb_driver = {
 	sizeof(struct bcmsc_softc),
 };
 
-DRIVER_MODULE(bcm2835fb, nexus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
+DRIVER_MODULE(bcm2835fb, ofwbus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
 
 /*
  * Video driver routines and glue.

Modified: stable/10/sys/arm/broadcom/bcm2835/bcm2835_fbd.c
==============================================================================
--- stable/10/sys/arm/broadcom/bcm2835/bcm2835_fbd.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/broadcom/bcm2835/bcm2835_fbd.c	Thu May 15 17:30:16 2014	(r266160)
@@ -315,4 +315,4 @@ static driver_t bcm_fb_driver = {
 	sizeof(struct bcmsc_softc),
 };
 
-DRIVER_MODULE(bcm2835fb, nexus, bcm_fb_driver, bcm_fb_devclass, 0, 0);
+DRIVER_MODULE(bcm2835fb, ofwbus, bcm_fb_driver, bcm_fb_devclass, 0, 0);

Modified: stable/10/sys/arm/econa/econa_machdep.c
==============================================================================
--- stable/10/sys/arm/econa/econa_machdep.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/econa/econa_machdep.c	Thu May 15 17:30:16 2014	(r266160)
@@ -322,7 +322,8 @@ initarm(struct arm_boot_params *abp)
 	arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
 	pmap_curmaxkvaddr = afterkern + L1_S_SIZE * (KERNEL_PT_KERN_NUM - 1);
-	arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+	arm_dump_avail_init(abp->abp_physaddr, memsize,
+	    sizeof(dump_avail) / sizeof(dump_avail[0]));
 	vm_max_kernel_address = KERNVIRTADDR + 3 * memsize;
 	pmap_bootstrap(freemempos, &kernel_l1pt);
 

Modified: stable/10/sys/arm/freescale/imx/tzic.c
==============================================================================
--- stable/10/sys/arm/freescale/imx/tzic.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/freescale/imx/tzic.c	Thu May 15 17:30:16 2014	(r266160)
@@ -146,9 +146,9 @@ static devclass_t tzic_devclass;
 
 /*
  * Memory space of controller located outside of device range, so let him to
- * attach not only to simplebus, but nexus also.
+ * attach not only to simplebus, but ofwbus also.
  */
-EARLY_DRIVER_MODULE(tzic, nexus, tzic_driver, tzic_devclass, 0, 0,
+EARLY_DRIVER_MODULE(tzic, ofwbus, tzic_driver, tzic_devclass, 0, 0,
     BUS_PASS_INTERRUPT);
 EARLY_DRIVER_MODULE(tzic, simplebus, tzic_driver, tzic_devclass, 0, 0,
     BUS_PASS_INTERRUPT);

Modified: stable/10/sys/arm/include/cpu.h
==============================================================================
--- stable/10/sys/arm/include/cpu.h	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/include/cpu.h	Thu May 15 17:30:16 2014	(r266160)
@@ -41,6 +41,7 @@ struct arm_boot_params {
 	register_t	abp_r1;		/* r1 from the boot loader */
 	register_t	abp_r2;		/* r2 from the boot loader */
 	register_t	abp_r3;		/* r3 from the boot loader */
+	vm_offset_t	abp_physaddr;	/* The kernel physical address */
 };
 
 void	arm_vector_init(vm_offset_t, int);

Modified: stable/10/sys/arm/include/machdep.h
==============================================================================
--- stable/10/sys/arm/include/machdep.h	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/include/machdep.h	Thu May 15 17:30:16 2014	(r266160)
@@ -72,6 +72,6 @@ void board_set_serial(uint64_t);
 void board_set_revision(uint32_t);
 
 /* Setup standard arrays */
-void arm_dump_avail_init( vm_offset_t memsize, size_t max);
+void arm_dump_avail_init(vm_paddr_t, vm_offset_t, size_t);
 
 #endif /* !_MACHINE_MACHDEP_H_ */

Modified: stable/10/sys/arm/mv/mv_localbus.c
==============================================================================
--- stable/10/sys/arm/mv/mv_localbus.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/mv/mv_localbus.c	Thu May 15 17:30:16 2014	(r266160)
@@ -156,7 +156,7 @@ static struct localbus_bank localbus_ban
 
 devclass_t localbus_devclass;
 
-DRIVER_MODULE(localbus, nexus, localbus_driver, localbus_devclass, 0, 0);
+DRIVER_MODULE(localbus, ofwbus, localbus_driver, localbus_devclass, 0, 0);
 
 static int
 fdt_localbus_reg_decode(phandle_t node, struct localbus_softc *sc,

Modified: stable/10/sys/arm/mv/mv_pci.c
==============================================================================
--- stable/10/sys/arm/mv/mv_pci.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/mv/mv_pci.c	Thu May 15 17:30:16 2014	(r266160)
@@ -398,7 +398,7 @@ static driver_t mv_pcib_driver = {
 
 devclass_t pcib_devclass;
 
-DRIVER_MODULE(pcib, nexus, mv_pcib_driver, pcib_devclass, 0, 0);
+DRIVER_MODULE(pcib, ofwbus, mv_pcib_driver, pcib_devclass, 0, 0);
 
 static struct mtx pcicfg_mtx;
 

Modified: stable/10/sys/arm/s3c2xx0/s3c24x0_machdep.c
==============================================================================
--- stable/10/sys/arm/s3c2xx0/s3c24x0_machdep.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/s3c2xx0/s3c24x0_machdep.c	Thu May 15 17:30:16 2014	(r266160)
@@ -384,7 +384,8 @@ initarm(struct arm_boot_params *abp)
 	arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
 	pmap_curmaxkvaddr = afterkern + 0x100000 * (KERNEL_PT_KERN_NUM - 1);
-	arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+	arm_dump_avail_init(abp->abp_physaddr, memsize,
+	    sizeof(dump_avail) / sizeof(dump_avail[0]));
 	vm_max_kernel_address = KERNVIRTADDR + 3 * memsize;
 	pmap_bootstrap(freemempos, &kernel_l1pt);
 	msgbufp = (void*)msgbufpv.pv_va;

Modified: stable/10/sys/arm/xscale/ixp425/avila_machdep.c
==============================================================================
--- stable/10/sys/arm/xscale/ixp425/avila_machdep.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/arm/xscale/ixp425/avila_machdep.c	Thu May 15 17:30:16 2014	(r266160)
@@ -433,7 +433,8 @@ initarm(struct arm_boot_params *abp)
 	arm_vector_init(ARM_VECTORS_HIGH, ARM_VEC_ALL);
 
 	pmap_curmaxkvaddr = afterkern + PAGE_SIZE;
-	arm_dump_avail_init(memsize, sizeof(dump_avail) / sizeof(dump_avail[0]));
+	arm_dump_avail_init(abp->abp_physaddr, memsize,
+	    sizeof(dump_avail) / sizeof(dump_avail[0]));
 	vm_max_kernel_address = 0xd0000000;
 	pmap_bootstrap(pmap_curmaxkvaddr, &kernel_l1pt);
 	msgbufp = (void*)msgbufpv.pv_va;

Modified: stable/10/sys/conf/files
==============================================================================
--- stable/10/sys/conf/files	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/conf/files	Thu May 15 17:30:16 2014	(r266160)
@@ -1407,7 +1407,6 @@ dev/fdt/fdt_common.c		optional fdt
 dev/fdt/fdt_slicer.c		optional fdt cfi | fdt nand
 dev/fdt/fdt_static_dtb.S	optional fdt fdt_dtb_static \
 	dependency	"$S/boot/fdt/dts/${FDT_DTS_FILE}"
-dev/fdt/fdtbus.c		optional fdtbus
 dev/fdt/simplebus.c		optional fdt
 dev/fe/if_fe.c			optional fe
 dev/fe/if_fe_pccard.c		optional fe pccard
@@ -1968,7 +1967,7 @@ dev/ofw/ofw_bus_subr.c		optional fdt
 dev/ofw/ofw_fdt.c		optional fdt
 dev/ofw/ofw_if.m		optional fdt
 dev/ofw/ofw_iicbus.c		optional fdt iicbus
-dev/ofw/ofw_nexus.c		optional fdt
+dev/ofw/ofwbus.c		optional fdt
 dev/ofw/openfirm.c		optional fdt
 dev/ofw/openfirmio.c		optional fdt
 dev/patm/if_patm.c		optional patm pci

Modified: stable/10/sys/conf/files.powerpc
==============================================================================
--- stable/10/sys/conf/files.powerpc	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/conf/files.powerpc	Thu May 15 17:30:16 2014	(r266160)
@@ -48,7 +48,7 @@ dev/ofw/ofw_bus_subr.c		optional	aim
 dev/ofw/ofw_console.c		optional	aim
 dev/ofw/ofw_disk.c		optional	ofwd aim
 dev/ofw/ofw_iicbus.c		optional	iicbus aim
-dev/ofw/ofw_nexus.c		optional	aim | fdt
+dev/ofw/ofwbus.c		optional	aim | fdt
 dev/ofw/ofw_standard.c		optional	aim powerpc
 dev/powermac_nvram/powermac_nvram.c optional	powermac_nvram powermac
 dev/quicc/quicc_bfe_fdt.c	optional	quicc mpc85xx

Modified: stable/10/sys/dev/fdt/simplebus.c
==============================================================================
--- stable/10/sys/dev/fdt/simplebus.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/dev/fdt/simplebus.c	Thu May 15 17:30:16 2014	(r266160)
@@ -121,7 +121,7 @@ static driver_t simplebus_driver = {
 	sizeof(struct simplebus_softc)
 };
 static devclass_t simplebus_devclass;
-DRIVER_MODULE(simplebus, nexus, simplebus_driver, simplebus_devclass, 0, 0);
+DRIVER_MODULE(simplebus, ofwbus, simplebus_driver, simplebus_devclass, 0, 0);
 DRIVER_MODULE(simplebus, simplebus, simplebus_driver, simplebus_devclass, 0, 0);
 
 static int

Modified: stable/10/sys/dev/mmc/mmc.c
==============================================================================
--- stable/10/sys/dev/mmc/mmc.c	Thu May 15 16:59:47 2014	(r266159)
+++ stable/10/sys/dev/mmc/mmc.c	Thu May 15 17:30:16 2014	(r266160)
@@ -1756,9 +1756,11 @@ static driver_t mmc_driver = {
 };
 static devclass_t mmc_devclass;
 
-DRIVER_MODULE(mmc, ti_mmchs, mmc_driver, mmc_devclass, NULL, NULL);
 DRIVER_MODULE(mmc, at91_mci, mmc_driver, mmc_devclass, NULL, NULL);
-DRIVER_MODULE(mmc, sdhci_pci, mmc_driver, mmc_devclass, NULL, NULL);
 DRIVER_MODULE(mmc, sdhci_bcm, mmc_driver, mmc_devclass, NULL, NULL);
 DRIVER_MODULE(mmc, sdhci_fdt, mmc_driver, mmc_devclass, NULL, NULL);
+DRIVER_MODULE(mmc, sdhci_imx, mmc_driver, mmc_devclass, NULL, NULL);
+DRIVER_MODULE(mmc, sdhci_pci, mmc_driver, mmc_devclass, NULL, NULL);
 DRIVER_MODULE(mmc, sdhci_ti, mmc_driver, mmc_devclass, NULL, NULL);
+DRIVER_MODULE(mmc, ti_mmchs, mmc_driver, mmc_devclass, NULL, NULL);
+

Copied: stable/10/sys/dev/ofw/ofwbus.c (from r261513, head/sys/dev/ofw/ofwbus.c)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ stable/10/sys/dev/ofw/ofwbus.c	Thu May 15 17:30:16 2014	(r266160, copy of r261513, head/sys/dev/ofw/ofwbus.c)
@@ -0,0 +1,527 @@
+/*-
+ * Copyright 1998 Massachusetts Institute of Technology
+ * Copyright 2001 by Thomas Moestl <tmm@FreeBSD.org>.
+ * Copyright 2006 by Marius Strobl <marius@FreeBSD.org>.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that both the above copyright notice and this
+ * permission notice appear in all copies, that both the above
+ * copyright notice and this permission notice appear in all
+ * supporting documentation, and that the name of M.I.T. not be used
+ * in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  M.I.T. makes
+ * no representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied
+ * warranty.
+ *
+ * THIS SOFTWARE IS PROVIDED BY M.I.T. ``AS IS''.  M.I.T. DISCLAIMS
+ * ALL EXPRESS OR IMPLIED WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
+ * SHALL M.I.T. 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.
+ *
+ * 	from: FreeBSD: src/sys/i386/i386/nexus.c,v 1.43 2001/02/09
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/pcpu.h>
+#include <sys/rman.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+#include <dev/ofw/openfirm.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+/*
+ * The ofwbus (which is a pseudo-bus actually) iterates over the nodes that
+ * hang from the Open Firmware root node and adds them as devices to this bus
+ * (except some special nodes which are excluded) so that drivers can be
+ * attached to them.
+ *
+ */
+
+struct ofwbus_devinfo {
+	struct ofw_bus_devinfo	ndi_obdinfo;
+	struct resource_list	ndi_rl;
+};
+
+struct ofwbus_softc {
+	uint32_t	acells, scells;
+	struct rman	sc_intr_rman;
+	struct rman	sc_mem_rman;
+};
+
+static device_identify_t ofwbus_identify;
+static device_probe_t ofwbus_probe;
+static device_attach_t ofwbus_attach;
+static bus_print_child_t ofwbus_print_child;
+static bus_add_child_t ofwbus_add_child;
+static bus_probe_nomatch_t ofwbus_probe_nomatch;
+static bus_alloc_resource_t ofwbus_alloc_resource;
+static bus_adjust_resource_t ofwbus_adjust_resource;
+static bus_release_resource_t ofwbus_release_resource;
+static bus_get_resource_list_t ofwbus_get_resource_list;
+static ofw_bus_get_devinfo_t ofwbus_get_devinfo;
+
+static int ofwbus_inlist(const char *, const char *const *);
+static struct ofwbus_devinfo * ofwbus_setup_dinfo(device_t, phandle_t);
+static void ofwbus_destroy_dinfo(struct ofwbus_devinfo *);
+static int ofwbus_print_res(struct ofwbus_devinfo *);
+
+static device_method_t ofwbus_methods[] = {
+	/* Device interface */
+	DEVMETHOD(device_identify,	ofwbus_identify),
+	DEVMETHOD(device_probe,		ofwbus_probe),
+	DEVMETHOD(device_attach,	ofwbus_attach),
+	DEVMETHOD(device_detach,	bus_generic_detach),
+	DEVMETHOD(device_shutdown,	bus_generic_shutdown),
+	DEVMETHOD(device_suspend,	bus_generic_suspend),
+	DEVMETHOD(device_resume,	bus_generic_resume),
+
+	/* Bus interface */
+	DEVMETHOD(bus_print_child,	ofwbus_print_child),
+	DEVMETHOD(bus_probe_nomatch,	ofwbus_probe_nomatch),
+	DEVMETHOD(bus_read_ivar,	bus_generic_read_ivar),
+	DEVMETHOD(bus_write_ivar,	bus_generic_write_ivar),
+	DEVMETHOD(bus_add_child,	ofwbus_add_child),
+	DEVMETHOD(bus_child_pnpinfo_str, ofw_bus_gen_child_pnpinfo_str),
+	DEVMETHOD(bus_alloc_resource,	ofwbus_alloc_resource),
+	DEVMETHOD(bus_adjust_resource,	ofwbus_adjust_resource),
+	DEVMETHOD(bus_release_resource,	ofwbus_release_resource),
+	DEVMETHOD(bus_set_resource,	bus_generic_rl_set_resource),
+	DEVMETHOD(bus_get_resource,	bus_generic_rl_get_resource),
+	DEVMETHOD(bus_get_resource_list, ofwbus_get_resource_list),
+	DEVMETHOD(bus_activate_resource, bus_generic_activate_resource),
+	DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource),
+	DEVMETHOD(bus_config_intr,	bus_generic_config_intr),
+	DEVMETHOD(bus_setup_intr,	bus_generic_setup_intr),
+	DEVMETHOD(bus_teardown_intr,	bus_generic_teardown_intr),
+
+	/* ofw_bus interface */
+	DEVMETHOD(ofw_bus_get_devinfo,	ofwbus_get_devinfo),
+	DEVMETHOD(ofw_bus_get_compat,	ofw_bus_gen_get_compat),
+	DEVMETHOD(ofw_bus_get_model,	ofw_bus_gen_get_model),
+	DEVMETHOD(ofw_bus_get_name,	ofw_bus_gen_get_name),
+	DEVMETHOD(ofw_bus_get_node,	ofw_bus_gen_get_node),
+	DEVMETHOD(ofw_bus_get_type,	ofw_bus_gen_get_type),
+
+	DEVMETHOD_END
+};
+
+static driver_t ofwbus_driver = {
+	"ofwbus",
+	ofwbus_methods,
+	sizeof(struct ofwbus_softc)
+};
+static devclass_t ofwbus_devclass;
+DRIVER_MODULE(ofwbus, nexus, ofwbus_driver, ofwbus_devclass, 0, 0);
+MODULE_VERSION(ofwbus, 1);
+
+static const char *const ofwbus_excl_name[] = {
+	"FJSV,system",
+	"aliases",
+	"associations",
+	"chosen",
+	"cmp",
+	"counter-timer",	/* No separate device; handled by psycho/sbus */
+	"failsafe",
+	"memory",
+	"openprom",
+	"options",
+	"packages",
+	"physical-memory",
+	"rsc",
+	"sgcn",
+	"todsg",
+	"virtual-memory",
+	NULL
+};
+
+static const char *const ofwbus_excl_type[] = {
+	"core",
+	"cpu",
+	NULL
+};
+
+static int
+ofwbus_inlist(const char *name, const char *const *list)
+{
+	int i;
+
+	if (name == NULL)
+		return (0);
+	for (i = 0; list[i] != NULL; i++)
+		if (strcmp(name, list[i]) == 0)
+			return (1);
+	return (0);
+}
+
+#define	OFWBUS_EXCLUDED(name, type)					\
+	(ofwbus_inlist((name), ofwbus_excl_name) ||			\
+	((type) != NULL && ofwbus_inlist((type), ofwbus_excl_type)))
+
+static void
+ofwbus_identify(driver_t *driver, device_t parent)
+{
+
+	/* Check if Open Firmware has been instantiated */
+	if (OF_peer(0) == -1)
+		return;
+        
+	if (device_find_child(parent, "ofwbus", -1) == NULL)
+		BUS_ADD_CHILD(parent, 0, "ofwbus", -1);
+}
+
+static int
+ofwbus_probe(device_t dev)
+{
+
+	device_set_desc(dev, "Open Firmware Device Tree");
+	return (BUS_PROBE_NOWILDCARD);
+}
+
+static int
+ofwbus_attach(device_t dev)
+{
+	struct ofwbus_devinfo *ndi;
+	struct ofwbus_softc *sc;
+	device_t cdev;
+	phandle_t node;
+
+	sc = device_get_softc(dev);
+
+	node = OF_peer(0);
+
+	/*
+	 * If no Open Firmware, bail early
+	 */
+	if (node == -1)
+		return (ENXIO);
+
+	sc->sc_intr_rman.rm_type = RMAN_ARRAY;
+	sc->sc_intr_rman.rm_descr = "Interrupts";
+	sc->sc_mem_rman.rm_type = RMAN_ARRAY;
+	sc->sc_mem_rman.rm_descr = "Device Memory";
+	if (rman_init(&sc->sc_intr_rman) != 0 ||
+	    rman_init(&sc->sc_mem_rman) != 0 ||
+	    rman_manage_region(&sc->sc_intr_rman, 0, ~0) != 0 ||
+	    rman_manage_region(&sc->sc_mem_rman, 0, BUS_SPACE_MAXADDR) != 0)
+		panic("%s: failed to set up rmans.", __func__);
+
+	/*
+	 * Allow devices to identify.
+	 */
+	bus_generic_probe(dev);
+
+	/*
+	 * Some important numbers
+	 */
+	sc->acells = 2;
+	OF_getencprop(node, "#address-cells", &sc->acells, sizeof(sc->acells));
+	sc->scells = 1;
+	OF_getencprop(node, "#size-cells", &sc->scells, sizeof(sc->scells));
+
+	/*
+	 * Now walk the OFW tree and attach top-level devices.
+	 */
+	for (node = OF_child(node); node > 0; node = OF_peer(node)) {
+		if ((ndi = ofwbus_setup_dinfo(dev, node)) == NULL)
+			continue;
+		cdev = device_add_child(dev, NULL, -1);
+		if (cdev == NULL) {
+			device_printf(dev, "<%s>: device_add_child failed\n",
+			    ndi->ndi_obdinfo.obd_name);
+			ofwbus_destroy_dinfo(ndi);
+			continue;
+		}
+		device_set_ivars(cdev, ndi);
+	}
+	return (bus_generic_attach(dev));
+}
+
+static device_t
+ofwbus_add_child(device_t dev, u_int order, const char *name, int unit)
+{
+	device_t cdev;
+	struct ofwbus_devinfo *ndi;
+
+	cdev = device_add_child_ordered(dev, order, name, unit);
+	if (cdev == NULL)
+		return (NULL);
+
+	ndi = malloc(sizeof(*ndi), M_DEVBUF, M_WAITOK | M_ZERO);
+	ndi->ndi_obdinfo.obd_node = -1;
+	resource_list_init(&ndi->ndi_rl);
+	device_set_ivars(cdev, ndi);
+
+	return (cdev);
+}
+
+static int
+ofwbus_print_child(device_t bus, device_t child)
+{
+	int rv;
+
+	rv = bus_print_child_header(bus, child);
+	rv += ofwbus_print_res(device_get_ivars(child));
+	rv += bus_print_child_footer(bus, child);
+	return (rv);
+}
+
+static void
+ofwbus_probe_nomatch(device_t bus, device_t child)
+{
+	const char *name, *type;
+
+	if (!bootverbose)
+		return;
+
+	name = ofw_bus_get_name(child);
+	type = ofw_bus_get_type(child);
+
+	device_printf(bus, "<%s>",
+	    name != NULL ? name : "unknown");
+	ofwbus_print_res(device_get_ivars(child));
+	printf(" type %s (no driver attached)\n",
+	    type != NULL ? type : "unknown");
+}
+
+static struct resource *
+ofwbus_alloc_resource(device_t bus, device_t child, int type, int *rid,
+    u_long start, u_long end, u_long count, u_int flags)
+{
+	struct ofwbus_softc *sc;
+	struct rman *rm;
+	struct resource *rv;
+	struct resource_list_entry *rle;
+	int isdefault, passthrough;
+
+	isdefault = (start == 0UL && end == ~0UL);
+	passthrough = (device_get_parent(child) != bus);
+	sc = device_get_softc(bus);
+	rle = NULL;
+
+	if (!passthrough && isdefault) {
+		rle = resource_list_find(BUS_GET_RESOURCE_LIST(bus, child),
+		    type, *rid);
+		if (rle == NULL)
+			return (NULL);
+		if (rle->res != NULL)
+			panic("%s: resource entry is busy", __func__);
+		start = rle->start;
+		count = ulmax(count, rle->count);
+		end = ulmax(rle->end, start + count - 1);
+	}
+
+	switch (type) {
+	case SYS_RES_IRQ:
+		rm = &sc->sc_intr_rman;
+		break;
+	case SYS_RES_MEMORY:
+		rm = &sc->sc_mem_rman;
+		break;
+	default:
+		return (NULL);
+	}
+
+	rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE,
+	    child);
+	if (rv == NULL)
+		return (NULL);
+	rman_set_rid(rv, *rid);
+
+	if ((flags & RF_ACTIVE) != 0 && bus_activate_resource(child, type,
+	    *rid, rv) != 0) {
+		rman_release_resource(rv);
+		return (NULL);
+	}
+
+	if (!passthrough && rle != NULL) {
+		rle->res = rv;
+		rle->start = rman_get_start(rv);
+		rle->end = rman_get_end(rv);
+		rle->count = rle->end - rle->start + 1;
+	}
+
+	return (rv);
+}
+
+static int
+ofwbus_adjust_resource(device_t bus, device_t child __unused, int type,
+    struct resource *r, u_long start, u_long end)
+{
+	struct ofwbus_softc *sc;
+	struct rman *rm;
+	device_t ofwbus;
+
+	ofwbus = bus;
+	while (strcmp(device_get_name(device_get_parent(ofwbus)), "root") != 0)
+		ofwbus = device_get_parent(ofwbus);
+	sc = device_get_softc(ofwbus);
+	switch (type) {
+	case SYS_RES_IRQ:

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201405151730.s4FHUGw3005353>