From owner-svn-src-projects@FreeBSD.ORG Sat Jan 31 23:24:30 2015 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id A4571480; Sat, 31 Jan 2015 23:24:30 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 8B5E9967; Sat, 31 Jan 2015 23:24:30 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t0VNOUTU068254; Sat, 31 Jan 2015 23:24:30 GMT (envelope-from nwhitehorn@FreeBSD.org) Received: (from nwhitehorn@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t0VNOR6C068237; Sat, 31 Jan 2015 23:24:27 GMT (envelope-from nwhitehorn@FreeBSD.org) Message-Id: <201501312324.t0VNOR6C068237@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: nwhitehorn set sender to nwhitehorn@FreeBSD.org using -f From: Nathan Whitehorn Date: Sat, 31 Jan 2015 23:24:27 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r278015 - in projects/powernv: amd64/amd64 amd64/conf amd64/ia32 arm/allwinner arm/altera/socfpga arm/arm arm/broadcom/bcm2835 arm/freescale/imx arm/freescale/vybrid arm/include arm/lpc... X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 31 Jan 2015 23:24:30 -0000 Author: nwhitehorn Date: Sat Jan 31 23:24:25 2015 New Revision: 278015 URL: https://svnweb.freebsd.org/changeset/base/278015 Log: IFC @ 278014 This brings in all the relocatable kernel infrastructure, which is critical for this branch. Added: projects/powernv/arm/arm/pmu.c - copied unchanged from r278014, head/sys/arm/arm/pmu.c projects/powernv/arm/freescale/imx/imx6_audmux.c - copied unchanged from r278014, head/sys/arm/freescale/imx/imx6_audmux.c projects/powernv/arm/freescale/imx/imx6_sdma.c - copied unchanged from r278014, head/sys/arm/freescale/imx/imx6_sdma.c projects/powernv/arm/freescale/imx/imx6_sdma.h - copied unchanged from r278014, head/sys/arm/freescale/imx/imx6_sdma.h projects/powernv/arm/freescale/imx/imx6_ssi.c - copied unchanged from r278014, head/sys/arm/freescale/imx/imx6_ssi.c projects/powernv/dev/hwpmc/hwpmc_armv7.c - copied unchanged from r278014, head/sys/dev/hwpmc/hwpmc_armv7.c projects/powernv/dev/hwpmc/hwpmc_armv7.h - copied unchanged from r278014, head/sys/dev/hwpmc/hwpmc_armv7.h projects/powernv/dev/iscsi/icl_conn_if.m - copied unchanged from r278014, head/sys/dev/iscsi/icl_conn_if.m projects/powernv/dev/iscsi/icl_soft.c - copied unchanged from r278014, head/sys/dev/iscsi/icl_soft.c projects/powernv/dev/iscsi/icl_wrappers.h - copied unchanged from r278014, head/sys/dev/iscsi/icl_wrappers.h Replaced: projects/powernv/dev/iscsi/icl.c - copied unchanged from r278014, head/sys/dev/iscsi/icl.c Modified: projects/powernv/amd64/amd64/machdep.c projects/powernv/amd64/conf/GENERIC projects/powernv/amd64/ia32/ia32_signal.c projects/powernv/arm/allwinner/a10_gpio.c projects/powernv/arm/altera/socfpga/socfpga_gpio.c projects/powernv/arm/arm/intr.c projects/powernv/arm/arm/machdep.c projects/powernv/arm/arm/mem.c projects/powernv/arm/broadcom/bcm2835/bcm2835_gpio.c projects/powernv/arm/freescale/imx/files.imx6 projects/powernv/arm/freescale/imx/imx6_anatop.c projects/powernv/arm/freescale/imx/imx6_anatopreg.h projects/powernv/arm/freescale/imx/imx6_anatopvar.h projects/powernv/arm/freescale/imx/imx6_ccm.c projects/powernv/arm/freescale/imx/imx6_ccmreg.h projects/powernv/arm/freescale/imx/imx_ccmvar.h projects/powernv/arm/freescale/imx/imx_gpio.c projects/powernv/arm/freescale/vybrid/vf_gpio.c projects/powernv/arm/include/pmc_mdep.h projects/powernv/arm/include/profile.h projects/powernv/arm/lpc/lpc_gpio.c projects/powernv/arm/rockchip/rk30xx_gpio.c projects/powernv/arm/samsung/exynos/exynos5_pad.c projects/powernv/arm/ti/am335x/am335x_lcd.c projects/powernv/arm/ti/am335x/am335x_prcm.c projects/powernv/arm/ti/am335x/files.am335x projects/powernv/arm/ti/files.ti projects/powernv/arm/ti/ti_gpio.c projects/powernv/arm/ti/ti_gpio.h projects/powernv/arm/ti/ti_i2c.c projects/powernv/arm/ti/ti_pruss.c projects/powernv/arm/xilinx/zy7_gpio.c projects/powernv/arm/xscale/ixp425/avila_gpio.c projects/powernv/arm/xscale/ixp425/cambria_gpio.c projects/powernv/boot/common/load_elf.c projects/powernv/boot/efi/libefi/efinet.c projects/powernv/boot/fdt/dts/arm/am335x.dtsi projects/powernv/boot/fdt/dts/arm/apalis-imx6.dts projects/powernv/boot/fdt/dts/arm/imx6.dtsi projects/powernv/boot/forth/beastie.4th projects/powernv/boot/forth/brand.4th projects/powernv/boot/i386/libi386/libi386.h projects/powernv/boot/i386/libi386/smbios.c projects/powernv/boot/powerpc/kboot/conf.c projects/powernv/boot/powerpc/kboot/kbootfdt.c projects/powernv/boot/powerpc/kboot/kerneltramp.S projects/powernv/boot/powerpc/kboot/main.c projects/powernv/boot/powerpc/kboot/ppc64_elf_freebsd.c projects/powernv/cam/ctl/ctl.c projects/powernv/cam/ctl/ctl_frontend_iscsi.c projects/powernv/cam/ctl/ctl_tpc.c projects/powernv/cam/scsi/scsi_all.h projects/powernv/cam/scsi/scsi_da.c projects/powernv/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c projects/powernv/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c projects/powernv/conf/files projects/powernv/conf/files.amd64 projects/powernv/conf/files.arm projects/powernv/conf/kern.mk projects/powernv/conf/kern.opts.mk projects/powernv/dev/acpica/acpi.c projects/powernv/dev/alc/if_alc.c projects/powernv/dev/ath/ath_hal/ah_internal.h projects/powernv/dev/ath/ath_rate/sample/sample.c projects/powernv/dev/ath/ath_rate/sample/sample.h projects/powernv/dev/cxgbe/t4_main.c projects/powernv/dev/cxgbe/tom/t4_ddp.c projects/powernv/dev/drm2/i915/intel_display.c projects/powernv/dev/drm2/radeon/ni.c projects/powernv/dev/drm2/radeon/si.c projects/powernv/dev/fb/fbd.c projects/powernv/dev/fdt/fdt_clock.c projects/powernv/dev/gpio/gpio_if.m projects/powernv/dev/gpio/gpiobus.c projects/powernv/dev/gpio/gpiobusvar.h projects/powernv/dev/hwpmc/hwpmc_arm.c projects/powernv/dev/hwpmc/pmc_events.h projects/powernv/dev/iscsi/icl.h projects/powernv/dev/iscsi/iscsi.c projects/powernv/dev/mem/memdev.c projects/powernv/dev/mps/mps.c projects/powernv/dev/mps/mps_user.c projects/powernv/dev/netmap/netmap.c projects/powernv/dev/ofw/openfirm.c projects/powernv/dev/pci/pci_pci.c projects/powernv/dev/sfxge/common/efsys.h projects/powernv/dev/sfxge/common/efx_ev.c projects/powernv/dev/sfxge/common/efx_tx.c projects/powernv/dev/sfxge/sfxge.c projects/powernv/dev/sfxge/sfxge.h projects/powernv/dev/sfxge/sfxge_dma.c projects/powernv/dev/sfxge/sfxge_ev.c projects/powernv/dev/sfxge/sfxge_intr.c projects/powernv/dev/sfxge/sfxge_port.c projects/powernv/dev/sfxge/sfxge_tx.c projects/powernv/dev/sfxge/sfxge_tx.h projects/powernv/dev/syscons/syscons.c projects/powernv/dev/usb/input/uhid.c projects/powernv/dev/virtio/block/virtio_blk.c projects/powernv/dev/vt/hw/fb/vt_fb.c projects/powernv/dev/vt/hw/fb/vt_fb.h projects/powernv/dev/vt/vt.h projects/powernv/dev/vt/vt_core.c projects/powernv/fs/cd9660/cd9660_util.c projects/powernv/fs/fdescfs/fdesc_vfsops.c projects/powernv/fs/msdosfs/msdosfs_conv.c projects/powernv/fs/smbfs/smbfs_subr.c projects/powernv/fs/tmpfs/tmpfs.h projects/powernv/fs/tmpfs/tmpfs_subr.c projects/powernv/fs/tmpfs/tmpfs_vfsops.c projects/powernv/fs/tmpfs/tmpfs_vnops.c projects/powernv/fs/udf/udf_vnops.c projects/powernv/i386/i386/machdep.c projects/powernv/i386/i386/mem.c projects/powernv/kern/kern_jail.c projects/powernv/kern/kern_timeout.c projects/powernv/kern/kern_umtx.c projects/powernv/kern/subr_sglist.c projects/powernv/kern/vfs_subr.c projects/powernv/libkern/strtol.c projects/powernv/libkern/strtoq.c projects/powernv/libkern/strtoul.c projects/powernv/libkern/strtouq.c projects/powernv/mips/atheros/ar71xx_gpio.c projects/powernv/mips/atheros/ar71xx_gpiovar.h projects/powernv/mips/cavium/octeon_gpio.c projects/powernv/mips/cavium/octeon_gpiovar.h projects/powernv/mips/mips/freebsd32_machdep.c projects/powernv/mips/mips/mem.c projects/powernv/mips/mips/pm_machdep.c projects/powernv/mips/rt305x/rt305x_gpio.c projects/powernv/mips/rt305x/rt305x_gpiovar.h projects/powernv/modules/Makefile projects/powernv/modules/aesni/Makefile projects/powernv/modules/ctl/Makefile projects/powernv/modules/cxgbe/if_cxgbe/Makefile projects/powernv/modules/geom/Makefile projects/powernv/modules/iscsi/Makefile projects/powernv/netgraph/ng_parse.c projects/powernv/netinet/sctp_input.c projects/powernv/netinet/sctp_usrreq.c projects/powernv/netinet/tcp_hostcache.c projects/powernv/netinet/tcp_syncache.c projects/powernv/netipsec/key.c projects/powernv/powerpc/ofw/ofw_machdep.c projects/powernv/powerpc/powerpc/exec_machdep.c projects/powernv/powerpc/pseries/plpar_iommu.c projects/powernv/sparc64/sparc64/machdep.c projects/powernv/sparc64/sparc64/mem.c projects/powernv/sys/cdefs.h projects/powernv/sys/conf.h projects/powernv/sys/eventhandler.h projects/powernv/sys/jail.h projects/powernv/sys/param.h projects/powernv/sys/pmc.h projects/powernv/sys/proc.h projects/powernv/sys/tree.h projects/powernv/sys/ucontext.h projects/powernv/ufs/ffs/ffs_softdep.c projects/powernv/ufs/ffs/softdep.h projects/powernv/ufs/ufs/ufs_quota.c projects/powernv/ufs/ufs/ufs_vfsops.c projects/powernv/vm/vm_fault.c projects/powernv/vm/vm_map.c projects/powernv/vm/vm_object.c projects/powernv/vm/vm_object.h projects/powernv/vm/vm_pageout.c projects/powernv/x86/x86/tsc.c Directory Properties: projects/powernv/ (props changed) projects/powernv/boot/ (props changed) projects/powernv/boot/powerpc/kboot/ (props changed) projects/powernv/cddl/contrib/opensolaris/ (props changed) projects/powernv/conf/ (props changed) Modified: projects/powernv/amd64/amd64/machdep.c ============================================================================== --- projects/powernv/amd64/amd64/machdep.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/amd64/amd64/machdep.c Sat Jan 31 23:24:25 2015 (r278015) @@ -157,7 +157,7 @@ extern u_int64_t hammer_time(u_int64_t, static void cpu_startup(void *); static void get_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpusave, size_t xfpusave_len); -static int set_fpcontext(struct thread *td, const mcontext_t *mcp, +static int set_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpustate, size_t xfpustate_len); SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL); @@ -1355,8 +1355,10 @@ add_physmap_entry(uint64_t base, uint64_ /* * Find insertion point while checking for overlap. Start off by * assuming the new entry will be added to the end. + * + * NB: physmap_idx points to the next free slot. */ - insert_idx = physmap_idx + 2; + insert_idx = physmap_idx; for (i = 0; i <= physmap_idx; i += 2) { if (base < physmap[i + 1]) { if (base + length <= physmap[i]) { @@ -1394,7 +1396,7 @@ add_physmap_entry(uint64_t base, uint64_ * Move the last 'N' entries down to make room for the new * entry if needed. */ - for (i = physmap_idx; i > insert_idx; i -= 2) { + for (i = (physmap_idx - 2); i > insert_idx; i -= 2) { physmap[i] = physmap[i - 2]; physmap[i + 1] = physmap[i - 1]; } @@ -1557,6 +1559,8 @@ native_parse_memmap(caddr_t kmdp, vm_pad } } +#define PAGES_PER_GB (1024 * 1024 * 1024 / PAGE_SIZE) + /* * Populate the (physmap) array with base/bound pairs describing the * available physical memory in the system, then test this memory and @@ -1575,25 +1579,30 @@ getmemsize(caddr_t kmdp, u_int64_t first u_long physmem_start, physmem_tunable, memtest; pt_entry_t *pte; quad_t dcons_addr, dcons_size; + int page_counter; bzero(physmap, sizeof(physmap)); - basemem = 0; physmap_idx = 0; init_ops.parse_memmap(kmdp, physmap, &physmap_idx); + physmap_idx -= 2; /* * Find the 'base memory' segment for SMP */ basemem = 0; for (i = 0; i <= physmap_idx; i += 2) { - if (physmap[i] == 0x00000000) { + if (physmap[i] <= 0xA0000) { basemem = physmap[i + 1] / 1024; break; } } - if (basemem == 0) - panic("BIOS smap did not include a basemem segment!"); + if (basemem == 0 || basemem > 640) { + if (bootverbose) + printf( + "Memory map doesn't contain a basemem segment, faking it"); + basemem = 640; + } /* * Make hole for "AP -> long mode" bootstrap code. The @@ -1601,8 +1610,12 @@ getmemsize(caddr_t kmdp, u_int64_t first * is configured to support APs and APs for the system start * in 32bit mode (e.g. SMP bare metal). */ - if (init_ops.mp_bootaddress) + if (init_ops.mp_bootaddress) { + if (physmap[1] >= 0x100000000) + panic( + "Basemem segment is not suitable for AP bootstrap code!"); physmap[1] = init_ops.mp_bootaddress(physmap[1] / 1024); + } /* * Maxmem isn't the "maximum memory", it's one larger than the @@ -1654,12 +1667,14 @@ getmemsize(caddr_t kmdp, u_int64_t first */ physmem_start = (vm_guest > VM_GUEST_NO ? 1 : 16) << PAGE_SHIFT; TUNABLE_ULONG_FETCH("hw.physmem.start", &physmem_start); - if (physmem_start < PAGE_SIZE) - physmap[0] = PAGE_SIZE; - else if (physmem_start >= physmap[1]) - physmap[0] = round_page(physmap[1] - PAGE_SIZE); - else - physmap[0] = round_page(physmem_start); + if (physmap[0] < physmem_start) { + if (physmem_start < PAGE_SIZE) + physmap[0] = PAGE_SIZE; + else if (physmem_start >= physmap[1]) + physmap[0] = round_page(physmap[1] - PAGE_SIZE); + else + physmap[0] = round_page(physmem_start); + } pa_indx = 0; da_indx = 1; phys_avail[pa_indx++] = physmap[0]; @@ -1678,6 +1693,9 @@ getmemsize(caddr_t kmdp, u_int64_t first * physmap is in bytes, so when converting to page boundaries, * round up the start address and round down the end address. */ + page_counter = 0; + if (memtest != 0) + printf("Testing system memory"); for (i = 0; i <= physmap_idx; i += 2) { vm_paddr_t end; @@ -1708,6 +1726,14 @@ getmemsize(caddr_t kmdp, u_int64_t first goto skip_memtest; /* + * Print a "." every GB to show we're making + * progress. + */ + page_counter++; + if ((page_counter % PAGES_PER_GB) == 0) + printf("."); + + /* * map page into kernel: valid, read/write,non-cacheable */ *pte = pa | PG_V | PG_RW | PG_NC_PWT | PG_NC_PCD; @@ -1794,6 +1820,8 @@ do_next: } *pte = 0; invltlb(); + if (memtest != 0) + printf("\n"); /* * XXX @@ -2452,7 +2480,7 @@ get_mcontext(struct thread *td, mcontext * touch the cs selector. */ int -set_mcontext(struct thread *td, const mcontext_t *mcp) +set_mcontext(struct thread *td, mcontext_t *mcp) { struct pcb *pcb; struct trapframe *tp; @@ -2539,7 +2567,7 @@ get_fpcontext(struct thread *td, mcontex } static int -set_fpcontext(struct thread *td, const mcontext_t *mcp, char *xfpustate, +set_fpcontext(struct thread *td, mcontext_t *mcp, char *xfpustate, size_t xfpustate_len) { struct savefpu *fpstate; Modified: projects/powernv/amd64/conf/GENERIC ============================================================================== --- projects/powernv/amd64/conf/GENERIC Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/amd64/conf/GENERIC Sat Jan 31 23:24:25 2015 (r278015) @@ -260,16 +260,6 @@ device vr # VIA Rhine, Rhine II device wb # Winbond W89C840F device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'') -# ISA Ethernet NICs. pccard NICs included. -device cs # Crystal Semiconductor CS89x0 NIC -# 'device ed' requires 'device miibus' -device ed # NE[12]000, SMC Ultra, 3c503, DS8390 cards -device ex # Intel EtherExpress Pro/10 and Pro/10+ -device ep # Etherlink III based cards -device fe # Fujitsu MB8696x based cards -device sn # SMC's 9000 series of Ethernet chips -device xe # Xircom pccard Ethernet - # Wireless NIC cards device wlan # 802.11 support options IEEE80211_DEBUG # enable debug msgs Modified: projects/powernv/amd64/ia32/ia32_signal.c ============================================================================== --- projects/powernv/amd64/ia32/ia32_signal.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/amd64/ia32/ia32_signal.c Sat Jan 31 23:24:25 2015 (r278015) @@ -118,7 +118,7 @@ ia32_get_fpcontext(struct thread *td, st } static int -ia32_set_fpcontext(struct thread *td, const struct ia32_mcontext *mcp, +ia32_set_fpcontext(struct thread *td, struct ia32_mcontext *mcp, char *xfpustate, size_t xfpustate_len) { int error; @@ -197,7 +197,7 @@ ia32_get_mcontext(struct thread *td, str * touch the cs selector. */ static int -ia32_set_mcontext(struct thread *td, const struct ia32_mcontext *mcp) +ia32_set_mcontext(struct thread *td, struct ia32_mcontext *mcp) { struct trapframe *tp; char *xfpustate; Modified: projects/powernv/arm/allwinner/a10_gpio.c ============================================================================== --- projects/powernv/arm/allwinner/a10_gpio.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/allwinner/a10_gpio.c Sat Jan 31 23:24:25 2015 (r278015) @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -75,6 +76,7 @@ __FBSDID("$FreeBSD$"); struct a10_gpio_softc { device_t sc_dev; + device_t sc_busdev; struct mtx sc_mtx; struct resource * sc_mem_res; struct resource * sc_irq_res; @@ -217,6 +219,16 @@ a10_gpio_pin_configure(struct a10_gpio_s A10_GPIO_UNLOCK(sc); } +static device_t +a10_gpio_get_bus(device_t dev) +{ + struct a10_gpio_softc *sc; + + sc = device_get_softc(dev); + + return (sc->sc_busdev); +} + static int a10_gpio_pin_max(device_t dev, int *maxpin) { @@ -427,7 +439,7 @@ a10_gpio_attach(device_t dev) RF_ACTIVE); if (!sc->sc_mem_res) { device_printf(dev, "cannot allocate memory window\n"); - return (ENXIO); + goto fail; } sc->sc_bst = rman_get_bustag(sc->sc_mem_res); @@ -437,9 +449,8 @@ a10_gpio_attach(device_t dev) sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE); if (!sc->sc_irq_res) { - bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); device_printf(dev, "cannot allocate interrupt\n"); - return (ENXIO); + goto fail; } /* Find our node. */ @@ -459,19 +470,20 @@ a10_gpio_attach(device_t dev) sc->sc_gpio_pins[i].gp_flags = a10_gpio_func_flag(func); } sc->sc_gpio_npins = i; - - device_add_child(dev, "gpioc", -1); - device_add_child(dev, "gpiobus", -1); - a10_gpio_sc = sc; + sc->sc_busdev = gpiobus_attach_bus(dev); + if (sc->sc_busdev == NULL) + goto fail; - return (bus_generic_attach(dev)); + return (0); fail: if (sc->sc_irq_res) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); if (sc->sc_mem_res) bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); + mtx_destroy(&sc->sc_mtx); + return (ENXIO); } @@ -489,6 +501,7 @@ static device_method_t a10_gpio_methods[ DEVMETHOD(device_detach, a10_gpio_detach), /* GPIO protocol */ + DEVMETHOD(gpio_get_bus, a10_gpio_get_bus), DEVMETHOD(gpio_pin_max, a10_gpio_pin_max), DEVMETHOD(gpio_pin_getname, a10_gpio_pin_getname), DEVMETHOD(gpio_pin_getflags, a10_gpio_pin_getflags), Modified: projects/powernv/arm/altera/socfpga/socfpga_gpio.c ============================================================================== --- projects/powernv/arm/altera/socfpga/socfpga_gpio.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/altera/socfpga/socfpga_gpio.c Sat Jan 31 23:24:25 2015 (r278015) @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include #include @@ -107,6 +108,7 @@ enum port_no { /* * GPIO interface */ +static device_t socfpga_gpio_get_bus(device_t); static int socfpga_gpio_pin_max(device_t, int *); static int socfpga_gpio_pin_getcaps(device_t, uint32_t, uint32_t *); static int socfpga_gpio_pin_getname(device_t, uint32_t, char *); @@ -122,6 +124,7 @@ struct socfpga_gpio_softc { bus_space_handle_t bsh; device_t dev; + device_t busdev; struct mtx sc_mtx; int gpio_npins; struct gpio_pin gpio_pins[NR_GPIO_MAX]; @@ -163,6 +166,7 @@ socfpga_gpio_attach(device_t dev) if (bus_alloc_resources(dev, socfpga_gpio_spec, sc->res)) { device_printf(dev, "could not allocate resources\n"); + mtx_destroy(&sc->sc_mtx); return (ENXIO); } @@ -195,11 +199,24 @@ socfpga_gpio_attach(device_t dev) snprintf(sc->gpio_pins[i].gp_name, GPIOMAXNAME, "socfpga_gpio%d.%d", device_get_unit(dev), i); } + sc->busdev = gpiobus_attach_bus(dev); + if (sc->busdev == NULL) { + bus_release_resources(dev, socfpga_gpio_spec, sc->res); + mtx_destroy(&sc->sc_mtx); + return (ENXIO); + } + + return (0); +} - device_add_child(dev, "gpioc", -1); - device_add_child(dev, "gpiobus", -1); +static device_t +socfpga_gpio_get_bus(device_t dev) +{ + struct socfpga_gpio_softc *sc; + + sc = device_get_softc(dev); - return (bus_generic_attach(dev)); + return (sc->busdev); } static int @@ -414,6 +431,7 @@ static device_method_t socfpga_gpio_meth DEVMETHOD(device_attach, socfpga_gpio_attach), /* GPIO protocol */ + DEVMETHOD(gpio_get_bus, socfpga_gpio_get_bus), DEVMETHOD(gpio_pin_max, socfpga_gpio_pin_max), DEVMETHOD(gpio_pin_getname, socfpga_gpio_pin_getname), DEVMETHOD(gpio_pin_getcaps, socfpga_gpio_pin_getcaps), Modified: projects/powernv/arm/arm/intr.c ============================================================================== --- projects/powernv/arm/arm/intr.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/arm/intr.c Sat Jan 31 23:24:25 2015 (r278015) @@ -37,6 +37,7 @@ */ #include "opt_platform.h" +#include "opt_hwpmc_hooks.h" #include __FBSDID("$FreeBSD$"); @@ -50,6 +51,8 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include +#include #include #include @@ -190,6 +193,10 @@ arm_irq_handler(struct trapframe *frame) arm_mask_irq(i); } } +#ifdef HWPMC_HOOKS + if (pmc_hook && (PCPU_GET(curthread)->td_pflags & TDP_CALLCHAIN)) + pmc_hook(PCPU_GET(curthread), PMC_FN_USER_CALLCHAIN, frame); +#endif } /* Modified: projects/powernv/arm/arm/machdep.c ============================================================================== --- projects/powernv/arm/arm/machdep.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/arm/machdep.c Sat Jan 31 23:24:25 2015 (r278015) @@ -700,7 +700,7 @@ get_mcontext(struct thread *td, mcontext * touch the cs selector. */ int -set_mcontext(struct thread *td, const mcontext_t *mcp) +set_mcontext(struct thread *td, mcontext_t *mcp) { struct trapframe *tf = td->td_frame; const __greg_t *gr = mcp->__gregs; Modified: projects/powernv/arm/arm/mem.c ============================================================================== --- projects/powernv/arm/arm/mem.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/arm/mem.c Sat Jan 31 23:24:25 2015 (r278015) @@ -55,6 +55,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include @@ -72,6 +73,9 @@ MALLOC_DEFINE(M_MEMDESC, "memdesc", "mem struct mem_range_softc mem_range_softc; +static struct sx tmppt_lock; +SX_SYSINIT(tmppt, &tmppt_lock, "mem4map"); + /* ARGSUSED */ int memrw(struct cdev *dev, struct uio *uio, int flags) @@ -82,8 +86,6 @@ memrw(struct cdev *dev, struct uio *uio, int error = 0; vm_offset_t addr, eaddr; - GIANT_REQUIRED; - while (uio->uio_resid > 0 && error == 0) { iov = uio->uio_iov; if (iov->iov_len == 0) { @@ -109,6 +111,7 @@ memrw(struct cdev *dev, struct uio *uio, } if (!address_valid) return (EINVAL); + sx_xlock(&tmppt_lock); pmap_kenter((vm_offset_t)_tmppt, v); o = (int)uio->uio_offset & PAGE_MASK; c = (u_int)(PAGE_SIZE - ((int)iov->iov_base & PAGE_MASK)); @@ -116,6 +119,7 @@ memrw(struct cdev *dev, struct uio *uio, c = min(c, (u_int)iov->iov_len); error = uiomove((caddr_t)&_tmppt[o], (int)c, uio); pmap_qremove((vm_offset_t)_tmppt, 1); + sx_xunlock(&tmppt_lock); continue; } else if (dev2unit(dev) == CDEV_MINOR_KMEM) { Copied: projects/powernv/arm/arm/pmu.c (from r278014, head/sys/arm/arm/pmu.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ projects/powernv/arm/arm/pmu.c Sat Jan 31 23:24:25 2015 (r278015, copy of r278014, head/sys/arm/arm/pmu.c) @@ -0,0 +1,157 @@ +/*- + * Copyright (c) 2015 Ruslan Bukin + * All rights reserved. + * + * This software was developed by SRI International and the University of + * Cambridge Computer Laboratory under DARPA/AFRL contract (FA8750-10-C-0237) + * ("CTSRD"), as part of the DARPA CRASH research programme. + * + * 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. + */ + +/* + * Performance Monitoring Unit + */ + +#include +__FBSDID("$FreeBSD$"); + +#include "opt_hwpmc_hooks.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include +#include +#include + +struct pmu_softc { + struct resource *res[1]; + device_t dev; + void *ih; +}; + +static struct ofw_compat_data compat_data[] = { + {"arm,cortex-a17-pmu", 1}, + {"arm,cortex-a15-pmu", 1}, + {"arm,cortex-a12-pmu", 1}, + {"arm,cortex-a9-pmu", 1}, + {"arm,cortex-a8-pmu", 1}, + {"arm,cortex-a7-pmu", 1}, + {"arm,cortex-a5-pmu", 1}, + {"arm,arm11mpcore-pmu", 1}, + {"arm,arm1176-pmu", 1}, + {"arm,arm1136-pmu", 1}, + {"qcom,krait-pmu", 1}, + {NULL, 0} +}; + +static struct resource_spec pmu_spec[] = { + { SYS_RES_IRQ, 0, RF_ACTIVE }, + { -1, 0 } +}; + +static int +pmu_intr(void *arg) +{ + struct trapframe *tf; + + tf = arg; + +#ifdef HWPMC_HOOKS + if (pmc_intr) + (*pmc_intr)(PCPU_GET(cpuid), tf); +#endif + + return (FILTER_HANDLED); +} + +static int +pmu_probe(device_t dev) +{ + + if (!ofw_bus_status_okay(dev)) + return (ENXIO); + + if (ofw_bus_search_compatible(dev, compat_data)->ocd_data != 0) { + device_set_desc(dev, "Performance Monitoring Unit"); + return (BUS_PROBE_DEFAULT); + } + + return (ENXIO); +} + +static int +pmu_attach(device_t dev) +{ + struct pmu_softc *sc; + int err; + + sc = device_get_softc(dev); + sc->dev = dev; + + if (bus_alloc_resources(dev, pmu_spec, sc->res)) { + device_printf(dev, "could not allocate resources\n"); + return (ENXIO); + } + + /* Setup interrupt handler */ + err = bus_setup_intr(dev, sc->res[0], INTR_MPSAFE | INTR_TYPE_MISC, + pmu_intr, NULL, NULL, &sc->ih); + if (err) { + device_printf(dev, "Unable to setup interrupt handler.\n"); + return (ENXIO); + } + + return (0); +} + +static device_method_t pmu_methods[] = { + DEVMETHOD(device_probe, pmu_probe), + DEVMETHOD(device_attach, pmu_attach), + { 0, 0 } +}; + +static driver_t pmu_driver = { + "pmu", + pmu_methods, + sizeof(struct pmu_softc), +}; + +static devclass_t pmu_devclass; + +DRIVER_MODULE(pmu, simplebus, pmu_driver, pmu_devclass, 0, 0); Modified: projects/powernv/arm/broadcom/bcm2835/bcm2835_gpio.c ============================================================================== --- projects/powernv/arm/broadcom/bcm2835/bcm2835_gpio.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/broadcom/bcm2835/bcm2835_gpio.c Sat Jan 31 23:24:25 2015 (r278015) @@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$"); #include #include +#include #include #include @@ -62,10 +63,20 @@ __FBSDID("$FreeBSD$"); #define dprintf(fmt, args...) #endif +#define BCM_GPIO_IRQS 4 #define BCM_GPIO_PINS 54 #define BCM_GPIO_DEFAULT_CAPS (GPIO_PIN_INPUT | GPIO_PIN_OUTPUT | \ GPIO_PIN_PULLUP | GPIO_PIN_PULLDOWN) +static struct resource_spec bcm_gpio_res_spec[] = { + { SYS_RES_MEMORY, 0, RF_ACTIVE }, + { SYS_RES_IRQ, 0, RF_ACTIVE }, + { SYS_RES_IRQ, 1, RF_ACTIVE }, + { SYS_RES_IRQ, 2, RF_ACTIVE }, + { SYS_RES_IRQ, 3, RF_ACTIVE }, + { -1, 0, 0 } +}; + struct bcm_gpio_sysctl { struct bcm_gpio_softc *sc; uint32_t pin; @@ -73,9 +84,9 @@ struct bcm_gpio_sysctl { struct bcm_gpio_softc { device_t sc_dev; + device_t sc_busdev; struct mtx sc_mtx; - struct resource * sc_mem_res; - struct resource * sc_irq_res; + struct resource * sc_res[BCM_GPIO_IRQS + 1]; bus_space_tag_t sc_bst; bus_space_handle_t sc_bsh; void * sc_intrhand; @@ -308,6 +319,16 @@ bcm_gpio_pin_configure(struct bcm_gpio_s BCM_GPIO_UNLOCK(sc); } +static device_t +bcm_gpio_get_bus(device_t dev) +{ + struct bcm_gpio_softc *sc; + + sc = device_get_softc(dev); + + return (sc->sc_busdev); +} + static int bcm_gpio_pin_max(device_t dev, int *maxpin) { @@ -494,39 +515,6 @@ bcm_gpio_pin_toggle(device_t dev, uint32 } static int -bcm_gpio_get_ro_pins(struct bcm_gpio_softc *sc) -{ - int i, len; - pcell_t pins[BCM_GPIO_PINS]; - phandle_t gpio; - - /* Find the gpio node to start. */ - gpio = ofw_bus_get_node(sc->sc_dev); - - len = OF_getproplen(gpio, "broadcom,read-only"); - if (len < 0 || len > sizeof(pins)) - return (-1); - - if (OF_getprop(gpio, "broadcom,read-only", &pins, len) < 0) - return (-1); - - sc->sc_ro_npins = len / sizeof(pcell_t); - - device_printf(sc->sc_dev, "read-only pins: "); - for (i = 0; i < sc->sc_ro_npins; i++) { - sc->sc_ro_pins[i] = fdt32_to_cpu(pins[i]); - if (i > 0) - printf(","); - printf("%d", sc->sc_ro_pins[i]); - } - if (i > 0) - printf("."); - printf("\n"); - - return (0); -} - -static int bcm_gpio_func_proc(SYSCTL_HANDLER_ARGS) { char buf[16]; @@ -545,7 +533,9 @@ bcm_gpio_func_proc(SYSCTL_HANDLER_ARGS) error = sysctl_handle_string(oidp, buf, sizeof(buf), req); if (error != 0 || req->newptr == NULL) return (error); - + /* Ignore changes on read-only pins. */ + if (bcm_gpio_pin_is_ro(sc, sc_sysctl->pin)) + return (0); /* Parse the user supplied string and check for a valid pin function. */ if (bcm_gpio_str_func(buf, &nfunc) != 0) return (EINVAL); @@ -595,63 +585,82 @@ bcm_gpio_sysctl_init(struct bcm_gpio_sof } static int +bcm_gpio_get_ro_pins(struct bcm_gpio_softc *sc, phandle_t node, + const char *propname, const char *label) +{ + int i, need_comma, npins, range_start, range_stop; + pcell_t *pins; + + /* Get the property data. */ + npins = OF_getencprop_alloc(node, propname, sizeof(*pins), + (void **)&pins); + if (npins < 0) + return (-1); + if (npins == 0) { + free(pins, M_OFWPROP); + return (0); + } + for (i = 0; i < npins; i++) + sc->sc_ro_pins[i + sc->sc_ro_npins] = pins[i]; + sc->sc_ro_npins += npins; + need_comma = 0; + device_printf(sc->sc_dev, "%s pins: ", label); + range_start = range_stop = pins[0]; + for (i = 1; i < npins; i++) { + if (pins[i] != range_stop + 1) { + if (need_comma) + printf(","); + if (range_start != range_stop) + printf("%d-%d", range_start, range_stop); + else + printf("%d", range_start); + range_start = range_stop = pins[i]; + need_comma = 1; + } else + range_stop++; + } + if (need_comma) + printf(","); + if (range_start != range_stop) + printf("%d-%d.\n", range_start, range_stop); + else + printf("%d.\n", range_start); + free(pins, M_OFWPROP); + + return (0); +} + +static int bcm_gpio_get_reserved_pins(struct bcm_gpio_softc *sc) { - int i, j, len, npins; - pcell_t pins[BCM_GPIO_PINS]; + char *name; phandle_t gpio, node, reserved; - char name[32]; + ssize_t len; /* Get read-only pins. */ - if (bcm_gpio_get_ro_pins(sc) != 0) - return (-1); - - /* Find the gpio/reserved pins node to start. */ gpio = ofw_bus_get_node(sc->sc_dev); - node = OF_child(gpio); - - /* - * Find reserved node - */ + if (bcm_gpio_get_ro_pins(sc, gpio, "broadcom,read-only", + "read-only") != 0) + return (-1); + /* Traverse the GPIO subnodes to find the reserved pins node. */ reserved = 0; + node = OF_child(gpio); while ((node != 0) && (reserved == 0)) { - len = OF_getprop(node, "name", name, - sizeof(name) - 1); - name[len] = 0; + len = OF_getprop_alloc(node, "name", 1, (void **)&name); + if (len == -1) + return (-1); if (strcmp(name, "reserved") == 0) reserved = node; + free(name, M_OFWPROP); node = OF_peer(node); } - if (reserved == 0) return (-1); - /* Get the reserved pins. */ - len = OF_getproplen(reserved, "broadcom,pins"); - if (len < 0 || len > sizeof(pins)) - return (-1); - - if (OF_getprop(reserved, "broadcom,pins", &pins, len) < 0) + if (bcm_gpio_get_ro_pins(sc, reserved, "broadcom,pins", + "reserved") != 0) return (-1); - npins = len / sizeof(pcell_t); - - j = 0; - device_printf(sc->sc_dev, "reserved pins: "); - for (i = 0; i < npins; i++) { - if (i > 0) - printf(","); - printf("%d", fdt32_to_cpu(pins[i])); - /* Some pins maybe already on the list of read-only pins. */ - if (bcm_gpio_pin_is_ro(sc, fdt32_to_cpu(pins[i]))) - continue; - sc->sc_ro_pins[j++ + sc->sc_ro_npins] = fdt32_to_cpu(pins[i]); - } - sc->sc_ro_npins += j; - if (i > 0) - printf("."); - printf("\n"); - return (0); } @@ -672,34 +681,20 @@ bcm_gpio_probe(device_t dev) static int bcm_gpio_attach(device_t dev) { - struct bcm_gpio_softc *sc = device_get_softc(dev); - uint32_t func; - int i, j, rid; + int i, j; phandle_t gpio; + struct bcm_gpio_softc *sc; + uint32_t func; + sc = device_get_softc(dev); sc->sc_dev = dev; - mtx_init(&sc->sc_mtx, "bcm gpio", "gpio", MTX_DEF); - - rid = 0; - sc->sc_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, - RF_ACTIVE); - if (!sc->sc_mem_res) { - device_printf(dev, "cannot allocate memory window\n"); - return (ENXIO); - } - - sc->sc_bst = rman_get_bustag(sc->sc_mem_res); - sc->sc_bsh = rman_get_bushandle(sc->sc_mem_res); - - rid = 0; - sc->sc_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_ACTIVE); - if (!sc->sc_irq_res) { - bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); - device_printf(dev, "cannot allocate interrupt\n"); - return (ENXIO); + if (bus_alloc_resources(dev, bcm_gpio_res_spec, sc->sc_res) != 0) { + device_printf(dev, "cannot allocate resources\n"); + goto fail; } + sc->sc_bst = rman_get_bustag(sc->sc_res[0]); + sc->sc_bsh = rman_get_bushandle(sc->sc_res[0]); /* Find our node. */ gpio = ofw_bus_get_node(sc->sc_dev); @@ -717,8 +712,6 @@ bcm_gpio_attach(device_t dev) /* Initialize the software controlled pins. */ for (i = 0, j = 0; j < BCM_GPIO_PINS; j++) { - if (bcm_gpio_pin_is_ro(sc, j)) - continue; snprintf(sc->sc_gpio_pins[i].gp_name, GPIOMAXNAME, "pin %d", j); func = bcm_gpio_get_function(sc, j); @@ -728,19 +721,17 @@ bcm_gpio_attach(device_t dev) i++; } sc->sc_gpio_npins = i; - bcm_gpio_sysctl_init(sc); + sc->sc_busdev = gpiobus_attach_bus(dev); + if (sc->sc_busdev == NULL) + goto fail; - device_add_child(dev, "gpioc", -1); - device_add_child(dev, "gpiobus", -1); - - return (bus_generic_attach(dev)); + return (0); fail: - if (sc->sc_irq_res) - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->sc_irq_res); - if (sc->sc_mem_res) - bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->sc_mem_res); + bus_release_resources(dev, bcm_gpio_res_spec, sc->sc_res); + mtx_destroy(&sc->sc_mtx); + return (ENXIO); } @@ -766,6 +757,7 @@ static device_method_t bcm_gpio_methods[ DEVMETHOD(device_detach, bcm_gpio_detach), /* GPIO protocol */ + DEVMETHOD(gpio_get_bus, bcm_gpio_get_bus), DEVMETHOD(gpio_pin_max, bcm_gpio_pin_max), DEVMETHOD(gpio_pin_getname, bcm_gpio_pin_getname), DEVMETHOD(gpio_pin_getflags, bcm_gpio_pin_getflags), Modified: projects/powernv/arm/freescale/imx/files.imx6 ============================================================================== --- projects/powernv/arm/freescale/imx/files.imx6 Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/freescale/imx/files.imx6 Sat Jan 31 23:24:25 2015 (r278015) @@ -28,6 +28,9 @@ arm/freescale/imx/imx_machdep.c standar arm/freescale/imx/imx_gpt.c standard arm/freescale/imx/imx_gpio.c optional gpio arm/freescale/imx/imx_i2c.c optional fsliic +arm/freescale/imx/imx6_sdma.c optional sdma +arm/freescale/imx/imx6_audmux.c optional sound +arm/freescale/imx/imx6_ssi.c optional sound # # Optional devices. @@ -52,3 +55,19 @@ arm/freescale/imx/imx6_usbphy.c optiona # Not ready yet... # #arm/freescale/imx/imx51_ipuv3.c optional sc + +# SDMA firmware +sdma_fw.c optional sdma_fw \ + compile-with "${AWK} -f $S/tools/fw_stub.awk sdma-imx6q-to1.bin:sdma_fw -msdma -c${.TARGET}" \ + no-implicit-rule before-depend local \ + clean "sdma_fw.c" +sdma-imx6q-to1.fwo optional sdma_fw \ + dependency "sdma-imx6q-to1.bin" \ + compile-with "${LD} -b binary -d -warn-common -r -d -o ${.TARGET} sdma-imx6q-to1.bin" \ + no-implicit-rule \ + clean "sdma-imx6q-to1.fwo" +sdma-imx6q-to1.bin optional sdma_fw \ + dependency "$S/contrib/dev/imx/sdma-imx6q-to1.bin.uu" \ + compile-with "uudecode < $S/contrib/dev/imx/sdma-imx6q-to1.bin.uu" \ + no-obj no-implicit-rule \ + clean "sdma-imx6q-to1.bin" Modified: projects/powernv/arm/freescale/imx/imx6_anatop.c ============================================================================== --- projects/powernv/arm/freescale/imx/imx6_anatop.c Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/freescale/imx/imx6_anatop.c Sat Jan 31 23:24:25 2015 (r278015) @@ -710,6 +710,27 @@ out: return (err); } +uint32_t +pll4_configure_output(uint32_t mfi, uint32_t mfn, uint32_t mfd) +{ + int reg; + + /* + * Audio PLL (PLL4). + * PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM) + */ + + reg = (IMX6_ANALOG_CCM_PLL_AUDIO_ENABLE); + reg &= ~(IMX6_ANALOG_CCM_PLL_AUDIO_DIV_SELECT_MASK << \ + IMX6_ANALOG_CCM_PLL_AUDIO_DIV_SELECT_SHIFT); + reg |= (mfi << IMX6_ANALOG_CCM_PLL_AUDIO_DIV_SELECT_SHIFT); + imx6_anatop_write_4(IMX6_ANALOG_CCM_PLL_AUDIO, reg); + imx6_anatop_write_4(IMX6_ANALOG_CCM_PLL_AUDIO_NUM, mfn); + imx6_anatop_write_4(IMX6_ANALOG_CCM_PLL_AUDIO_DENOM, mfd); + + return (0); +} + static int imx6_anatop_probe(device_t dev) { Modified: projects/powernv/arm/freescale/imx/imx6_anatopreg.h ============================================================================== --- projects/powernv/arm/freescale/imx/imx6_anatopreg.h Sat Jan 31 23:16:11 2015 (r278014) +++ projects/powernv/arm/freescale/imx/imx6_anatopreg.h Sat Jan 31 23:24:25 2015 (r278015) @@ -58,6 +58,9 @@ #define IMX6_ANALOG_CCM_PLL_SYS_NUM 0x050 #define IMX6_ANALOG_CCM_PLL_SYS_DENOM 0x060 #define IMX6_ANALOG_CCM_PLL_AUDIO 0x070 +#define IMX6_ANALOG_CCM_PLL_AUDIO_ENABLE (1 << 13) +#define IMX6_ANALOG_CCM_PLL_AUDIO_DIV_SELECT_SHIFT 0 +#define IMX6_ANALOG_CCM_PLL_AUDIO_DIV_SELECT_MASK 0x7f *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***