Date: Sun, 29 Nov 2015 07:20:30 +0000 (UTC) From: Nathan Whitehorn <nwhitehorn@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r291443 - in projects/powernv: amd64/amd64 amd64/conf amd64/linux amd64/linux32 arm/arm arm/freescale/imx arm/include arm/samsung/exynos arm64/arm64 arm64/include boot/common boot/i386/... Message-ID: <201511290720.tAT7KUxf082883@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: nwhitehorn Date: Sun Nov 29 07:20:30 2015 New Revision: 291443 URL: https://svnweb.freebsd.org/changeset/base/291443 Log: Up to date with HEAD. Added: projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9462_2p0_initvals.h - copied unchanged from r291442, head/sys/contrib/dev/ath/ath_hal/ar9300/ar9462_2p0_initvals.h projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9462_2p1_initvals.h - copied unchanged from r291442, head/sys/contrib/dev/ath/ath_hal/ar9300/ar9462_2p1_initvals.h projects/powernv/dev/ath/if_ath_descdma.c - copied unchanged from r291442, head/sys/dev/ath/if_ath_descdma.c projects/powernv/dev/ath/if_ath_descdma.h - copied unchanged from r291442, head/sys/dev/ath/if_ath_descdma.h projects/powernv/dev/ath/if_ath_ioctl.c - copied unchanged from r291442, head/sys/dev/ath/if_ath_ioctl.c projects/powernv/dev/ath/if_ath_ioctl.h - copied unchanged from r291442, head/sys/dev/ath/if_ath_ioctl.h projects/powernv/modules/if_enc/ - copied from r291442, head/sys/modules/if_enc/ Modified: projects/powernv/amd64/amd64/elf_machdep.c projects/powernv/amd64/conf/GENERIC projects/powernv/amd64/linux/linux_sysvec.c projects/powernv/amd64/linux32/linux32_sysvec.c projects/powernv/arm/arm/cpufunc.c projects/powernv/arm/arm/elf_machdep.c projects/powernv/arm/arm/gic.c projects/powernv/arm/arm/identcpu.c projects/powernv/arm/arm/pmap-v6-new.c projects/powernv/arm/arm/pmu.c projects/powernv/arm/freescale/imx/imx6_anatop.c projects/powernv/arm/freescale/imx/imx6_machdep.c projects/powernv/arm/freescale/imx/imx_machdep.c projects/powernv/arm/freescale/imx/imx_machdep.h projects/powernv/arm/freescale/imx/imx_wdogreg.h projects/powernv/arm/include/armreg.h projects/powernv/arm/include/atomic-v4.h projects/powernv/arm/include/atomic-v6.h projects/powernv/arm/include/atomic.h projects/powernv/arm/include/sf_buf.h projects/powernv/arm/samsung/exynos/exynos5_combiner.c projects/powernv/arm/samsung/exynos/exynos5_ehci.c projects/powernv/arm/samsung/exynos/exynos5_pad.c projects/powernv/arm64/arm64/elf_machdep.c projects/powernv/arm64/arm64/gic_v3.c projects/powernv/arm64/arm64/pmap.c projects/powernv/arm64/include/vmparam.h projects/powernv/boot/common/disk.c projects/powernv/boot/common/disk.h projects/powernv/boot/i386/boot2/Makefile projects/powernv/boot/kshim/bsd_busspace.c projects/powernv/boot/kshim/bsd_global.h projects/powernv/boot/kshim/bsd_kernel.c projects/powernv/boot/kshim/bsd_kernel.h projects/powernv/boot/usb/storage/umass_common.c projects/powernv/boot/usb/storage/umass_loader.c projects/powernv/boot/usb/usb_busdma_loader.c projects/powernv/boot/usb/usbcore.mk projects/powernv/cam/ctl/ctl.c projects/powernv/compat/ia32/ia32_sysvec.c projects/powernv/compat/svr4/svr4_sysvec.c projects/powernv/conf/NOTES projects/powernv/conf/files projects/powernv/conf/ldscript.powerpc64 projects/powernv/conf/newvers.sh projects/powernv/conf/options projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_attach.c projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_eeprom.c projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_freebsd_inc.h projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_radar.c projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_radio.c projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_recv.c projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300_reset.c projects/powernv/contrib/dev/ath/ath_hal/ar9300/ar9300reg.h projects/powernv/ddb/db_run.c projects/powernv/dev/ahci/ahci.c projects/powernv/dev/ath/ath_hal/ah.c projects/powernv/dev/ath/ath_hal/ah_devid.h projects/powernv/dev/ath/ath_hal/ar9003/ar9300_devid.h projects/powernv/dev/ath/if_ath.c projects/powernv/dev/ath/if_ath_misc.h projects/powernv/dev/ath/if_ath_rx.c projects/powernv/dev/ath/if_ath_rx_edma.c projects/powernv/dev/ath/if_ath_tx_edma.c projects/powernv/dev/ath/if_ath_tx_ht.c projects/powernv/dev/drm2/i915/i915_debug.c projects/powernv/dev/drm2/i915/i915_dma.c projects/powernv/dev/drm2/i915/i915_drm.h projects/powernv/dev/isp/isp.c projects/powernv/dev/isp/isp_freebsd.c projects/powernv/dev/isp/isp_freebsd.h projects/powernv/dev/isp/isp_library.c projects/powernv/dev/isp/isp_pci.c projects/powernv/dev/isp/isp_sbus.c projects/powernv/dev/isp/isp_target.c projects/powernv/dev/isp/ispmbox.h projects/powernv/dev/isp/ispvar.h projects/powernv/dev/ntb/ntb_hw/ntb_hw.c projects/powernv/dev/ntb/ntb_hw/ntb_hw.h projects/powernv/dev/pci/pcireg.h projects/powernv/dev/pci/pcivar.h projects/powernv/dev/sfxge/common/efsys.h projects/powernv/dev/sfxge/common/efx.h projects/powernv/dev/sfxge/common/efx_bootcfg.c projects/powernv/dev/sfxge/common/efx_ev.c projects/powernv/dev/sfxge/common/efx_filter.c projects/powernv/dev/sfxge/common/efx_impl.h projects/powernv/dev/sfxge/common/efx_intr.c projects/powernv/dev/sfxge/common/efx_mac.c projects/powernv/dev/sfxge/common/efx_mcdi.c projects/powernv/dev/sfxge/common/efx_mcdi.h projects/powernv/dev/sfxge/common/efx_mon.c projects/powernv/dev/sfxge/common/efx_nic.c projects/powernv/dev/sfxge/common/efx_nvram.c projects/powernv/dev/sfxge/common/efx_phy.c projects/powernv/dev/sfxge/common/efx_port.c projects/powernv/dev/sfxge/common/efx_rx.c projects/powernv/dev/sfxge/common/efx_sram.c projects/powernv/dev/sfxge/common/efx_tx.c projects/powernv/dev/sfxge/common/efx_vpd.c projects/powernv/dev/sfxge/common/efx_wol.c projects/powernv/dev/sfxge/common/hunt_ev.c projects/powernv/dev/sfxge/common/hunt_filter.c projects/powernv/dev/sfxge/common/hunt_impl.h projects/powernv/dev/sfxge/common/hunt_intr.c projects/powernv/dev/sfxge/common/hunt_mac.c projects/powernv/dev/sfxge/common/hunt_mcdi.c projects/powernv/dev/sfxge/common/hunt_nic.c projects/powernv/dev/sfxge/common/hunt_nvram.c projects/powernv/dev/sfxge/common/hunt_phy.c projects/powernv/dev/sfxge/common/hunt_rx.c projects/powernv/dev/sfxge/common/hunt_sram.c projects/powernv/dev/sfxge/common/hunt_tx.c projects/powernv/dev/sfxge/common/hunt_vpd.c projects/powernv/dev/sfxge/common/mcdi_mon.c projects/powernv/dev/sfxge/common/mcdi_mon.h projects/powernv/dev/sfxge/common/siena_flash.h projects/powernv/dev/sfxge/common/siena_impl.h projects/powernv/dev/sfxge/common/siena_mac.c projects/powernv/dev/sfxge/common/siena_mcdi.c projects/powernv/dev/sfxge/common/siena_nic.c projects/powernv/dev/sfxge/common/siena_nvram.c projects/powernv/dev/sfxge/common/siena_phy.c projects/powernv/dev/sfxge/common/siena_sram.c projects/powernv/dev/sfxge/common/siena_vpd.c projects/powernv/dev/usb/wlan/if_urtwn.c projects/powernv/dev/usb/wlan/if_urtwnreg.h projects/powernv/dev/usb/wlan/if_urtwnvar.h projects/powernv/i386/conf/GENERIC projects/powernv/i386/conf/NOTES projects/powernv/i386/i386/elf_machdep.c projects/powernv/i386/i386/machdep.c projects/powernv/i386/linux/linux_sysvec.c projects/powernv/kern/imgact_aout.c projects/powernv/kern/init_main.c projects/powernv/kern/kern_hhook.c projects/powernv/kern/subr_witness.c projects/powernv/kern/vfs_subr.c projects/powernv/mips/conf/AP143.hints projects/powernv/mips/conf/QCA953X_BASE projects/powernv/mips/conf/QCA953X_BASE.hints projects/powernv/mips/mips/elf_machdep.c projects/powernv/mips/mips/freebsd32_machdep.c projects/powernv/modules/Makefile projects/powernv/modules/ath/Makefile projects/powernv/net/if.c projects/powernv/net/if_enc.c projects/powernv/net/if_enc.h projects/powernv/net/if_var.h projects/powernv/net80211/ieee80211_ht.c projects/powernv/net80211/ieee80211_ioctl.c projects/powernv/netinet/in_pcb.c projects/powernv/netinet/ip_input.c projects/powernv/netinet/sctp_output.c projects/powernv/netinet/sctp_usrreq.c projects/powernv/netinet/sctputil.c projects/powernv/netinet6/ip6_input.c projects/powernv/netipsec/ipsec.c projects/powernv/netipsec/ipsec.h projects/powernv/netipsec/ipsec_input.c projects/powernv/netipsec/ipsec_output.c projects/powernv/netpfil/ipfw/ip_fw_private.h projects/powernv/netpfil/ipfw/ip_fw_sockopt.c projects/powernv/ofed/include/rdma/ib_pma.h projects/powernv/pc98/conf/GENERIC projects/powernv/pc98/conf/NOTES projects/powernv/powerpc/aim/locore64.S projects/powernv/powerpc/aim/slb.c projects/powernv/powerpc/conf/GENERIC projects/powernv/powerpc/include/asm.h projects/powernv/powerpc/include/atomic.h projects/powernv/powerpc/powerpc/elf32_machdep.c projects/powernv/powerpc/powerpc/elf64_machdep.c projects/powernv/powerpc/powerpc/exec_machdep.c projects/powernv/powerpc/powerpc/swtch64.S projects/powernv/powerpc/powerpc/vm_machdep.c projects/powernv/sparc64/conf/GENERIC projects/powernv/sparc64/include/kerneldump.h projects/powernv/sparc64/sparc64/elf_machdep.c projects/powernv/sys/hhook.h projects/powernv/sys/sysent.h projects/powernv/sys/vnode.h projects/powernv/vm/vm_pageout.c projects/powernv/vm/vm_reserv.c projects/powernv/x86/x86/identcpu.c Directory Properties: projects/powernv/ (props changed) projects/powernv/boot/ (props changed) projects/powernv/conf/ (props changed) Modified: projects/powernv/amd64/amd64/elf_machdep.c ============================================================================== --- projects/powernv/amd64/amd64/elf_machdep.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/amd64/amd64/elf_machdep.c Sun Nov 29 07:20:30 2015 (r291443) @@ -51,8 +51,6 @@ struct sysentvec elf64_freebsd_sysvec = .sv_size = SYS_MAXSYSCALL, .sv_table = sysent, .sv_mask = 0, - .sv_sigsize = 0, - .sv_sigtbl = NULL, .sv_errsize = 0, .sv_errtbl = NULL, .sv_transtrap = NULL, @@ -60,7 +58,6 @@ struct sysentvec elf64_freebsd_sysvec = .sv_sendsig = sendsig, .sv_sigcode = sigcode, .sv_szsigcode = &szsigcode, - .sv_prepsyscall = NULL, .sv_name = "FreeBSD ELF64", .sv_coredump = __elfN(coredump), .sv_imgact_try = NULL, Modified: projects/powernv/amd64/conf/GENERIC ============================================================================== --- projects/powernv/amd64/conf/GENERIC Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/amd64/conf/GENERIC Sun Nov 29 07:20:30 2015 (r291443) @@ -28,7 +28,7 @@ options SCHED_ULE # ULE scheduler options PREEMPTION # Enable kernel thread preemption options INET # InterNETworking options INET6 # IPv6 communications protocols -options IPSEC # IP (v4/v6) security +options IPSEC # IP (v4/v6) security options TCP_OFFLOAD # TCP offload options SCTP # Stream Control Transmission Protocol options FFS # Berkeley Fast Filesystem Modified: projects/powernv/amd64/linux/linux_sysvec.c ============================================================================== --- projects/powernv/amd64/linux/linux_sysvec.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/amd64/linux/linux_sysvec.c Sun Nov 29 07:20:30 2015 (r291443) @@ -750,8 +750,6 @@ struct sysentvec elf_linux_sysvec = { .sv_size = LINUX_SYS_MAXSYSCALL, .sv_table = linux_sysent, .sv_mask = 0, - .sv_sigsize = 0, - .sv_sigtbl = NULL, .sv_errsize = ELAST + 1, .sv_errtbl = bsd_to_linux_errno, .sv_transtrap = translate_traps, @@ -759,7 +757,6 @@ struct sysentvec elf_linux_sysvec = { .sv_sendsig = linux_rt_sendsig, .sv_sigcode = &_binary_linux_locore_o_start, .sv_szsigcode = &linux_szsigcode, - .sv_prepsyscall = NULL, .sv_name = "Linux ELF64", .sv_coredump = elf64_coredump, .sv_imgact_try = exec_linux_imgact_try, Modified: projects/powernv/amd64/linux32/linux32_sysvec.c ============================================================================== --- projects/powernv/amd64/linux32/linux32_sysvec.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/amd64/linux32/linux32_sysvec.c Sun Nov 29 07:20:30 2015 (r291443) @@ -1011,8 +1011,6 @@ struct sysentvec elf_linux_sysvec = { .sv_size = LINUX32_SYS_MAXSYSCALL, .sv_table = linux32_sysent, .sv_mask = 0, - .sv_sigsize = 0, - .sv_sigtbl = NULL, .sv_errsize = ELAST + 1, .sv_errtbl = bsd_to_linux_errno, .sv_transtrap = translate_traps, @@ -1020,7 +1018,6 @@ struct sysentvec elf_linux_sysvec = { .sv_sendsig = linux_sendsig, .sv_sigcode = &_binary_linux32_locore_o_start, .sv_szsigcode = &linux_szsigcode, - .sv_prepsyscall = NULL, .sv_name = "Linux ELF32", .sv_coredump = elf32_coredump, .sv_imgact_try = exec_linux_imgact_try, Modified: projects/powernv/arm/arm/cpufunc.c ============================================================================== --- projects/powernv/arm/arm/cpufunc.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/arm/cpufunc.c Sun Nov 29 07:20:30 2015 (r291443) @@ -910,7 +910,8 @@ set_cpufuncs() cputype == CPU_ID_CORTEXA15R1 || cputype == CPU_ID_CORTEXA15R2 || cputype == CPU_ID_CORTEXA15R3 || - cputype == CPU_ID_KRAIT ) { + cputype == CPU_ID_KRAIT300R0 || + cputype == CPU_ID_KRAIT300R1 ) { cpufuncs = cortexa_cpufuncs; cpu_reset_needs_v4_MMU_disable = 1; /* V4 or higher */ get_cachetype_cp15(); Modified: projects/powernv/arm/arm/elf_machdep.c ============================================================================== --- projects/powernv/arm/arm/elf_machdep.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/arm/elf_machdep.c Sun Nov 29 07:20:30 2015 (r291443) @@ -52,8 +52,6 @@ struct sysentvec elf32_freebsd_sysvec = .sv_size = SYS_MAXSYSCALL, .sv_table = sysent, .sv_mask = 0, - .sv_sigsize = 0, - .sv_sigtbl = NULL, .sv_errsize = 0, .sv_errtbl = NULL, .sv_transtrap = NULL, @@ -61,7 +59,6 @@ struct sysentvec elf32_freebsd_sysvec = .sv_sendsig = sendsig, .sv_sigcode = sigcode, .sv_szsigcode = &szsigcode, - .sv_prepsyscall = NULL, .sv_name = "FreeBSD ELF32", .sv_coredump = __elfN(coredump), .sv_imgact_try = NULL, Modified: projects/powernv/arm/arm/gic.c ============================================================================== --- projects/powernv/arm/arm/gic.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/arm/gic.c Sun Nov 29 07:20:30 2015 (r291443) @@ -68,6 +68,8 @@ __FBSDID("$FreeBSD$"); #include "pic_if.h" #endif +#define GIC_DEBUG_SPURIOUS + /* We are using GICv2 register naming */ /* Distributor Registers */ @@ -135,6 +137,9 @@ struct arm_gic_softc { uint8_t ver; struct mtx mutex; uint32_t nirqs; +#ifdef GIC_DEBUG_SPURIOUS + uint32_t last_irq[MAXCPU]; +#endif }; static struct resource_spec arm_gic_spec[] = { @@ -287,7 +292,7 @@ arm_gic_init_secondary(device_t dev) } #endif /* ARM_INTRNG */ #endif /* SMP */ - + #ifndef ARM_INTRNG int gic_decode_fdt(phandle_t iparent, pcell_t *intr, int *interrupt, @@ -335,11 +340,10 @@ gic_decode_fdt(phandle_t iparent, pcell_ */ if (fdt32_to_cpu(intr[2]) & 0x0a) { printf("unsupported trigger/polarity configuration " - "0x%2x\n", fdt32_to_cpu(intr[2]) & 0x0f); - return (ENOTSUP); + "0x%02x\n", fdt32_to_cpu(intr[2]) & 0x0f); } *pol = INTR_POLARITY_CONFORM; - if (fdt32_to_cpu(intr[2]) & 0x01) + if (fdt32_to_cpu(intr[2]) & 0x03) *trig = INTR_TRIGGER_EDGE; else *trig = INTR_TRIGGER_LEVEL; @@ -367,6 +371,7 @@ arm_gic_attach(device_t dev) int i; uint32_t icciidr; #ifdef ARM_INTRNG + phandle_t pxref; intptr_t xref = gic_xref(dev); #endif @@ -456,7 +461,9 @@ arm_gic_attach(device_t dev) goto cleanup; } - if (sc->gic_res[2] == NULL) { + i = OF_getencprop(ofw_bus_get_node(dev), "interrupt-parent", + &pxref, sizeof(pxref)); + if (i > 0 && xref == pxref) { if (arm_pic_claim_root(dev, xref, arm_gic_intr, sc, GIC_LAST_SGI - GIC_FIRST_SGI + 1) != 0) { device_printf(dev, "could not set PIC as a root\n"); @@ -472,6 +479,7 @@ arm_gic_attach(device_t dev) } } + OF_device_register_xref(xref, dev); return (0); cleanup: @@ -516,8 +524,11 @@ arm_gic_intr(void *arg) */ if (irq >= sc->nirqs) { - device_printf(sc->gic_dev, "Spurious interrupt detected\n"); - gic_c_write_4(sc, GICC_EOIR, irq_active_reg); +#ifdef GIC_DEBUG_SPURIOUS + device_printf(sc->gic_dev, + "Spurious interrupt detected: last irq: %d on CPU%d\n", + sc->last_irq[PCPU_GET(cpuid)], PCPU_GET(cpuid)); +#endif return (FILTER_HANDLED); } @@ -542,12 +553,16 @@ dispatch_irq: arm_ipi_dispatch(isrc, tf); goto next_irq; #else - printf("SGI %u on UP system detected\n", irq - GIC_FIRST_SGI); + device_printf(sc->gic_dev, "SGI %u on UP system detected\n", + irq - GIC_FIRST_SGI); gic_c_write_4(sc, GICC_EOIR, irq_active_reg); goto next_irq; #endif } +#ifdef GIC_DEBUG_SPURIOUS + sc->last_irq[PCPU_GET(cpuid)] = irq; +#endif if (isrc->isrc_trig == INTR_TRIGGER_EDGE) gic_c_write_4(sc, GICC_EOIR, irq_active_reg); @@ -729,12 +744,12 @@ gic_map_fdt(struct arm_gic_softc *sc, st */ tripol = isrc->isrc_cells[2]; if (tripol & 0x0a) { - printf("unsupported trigger/polarity configuration " - "0x%2x\n", tripol & 0x0f); - return (ENOTSUP); + device_printf(sc->gic_dev, + "unsupported trigger/polarity configuration " + "0x%02x\n", tripol & 0x0f); } pol = INTR_POLARITY_CONFORM; - if (tripol & 0x01) + if (tripol & 0x03) trig = INTR_TRIGGER_EDGE; else trig = INTR_TRIGGER_LEVEL; @@ -911,7 +926,8 @@ arm_gic_next_irq(struct arm_gic_softc *s if (active_irq == 0x3FF) { if (last_irq == -1) - printf("Spurious interrupt detected\n"); + device_printf(sc->gic_dev, + "Spurious interrupt detected\n"); return -1; } Modified: projects/powernv/arm/arm/identcpu.c ============================================================================== --- projects/powernv/arm/arm/identcpu.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/arm/identcpu.c Sun Nov 29 07:20:30 2015 (r291443) @@ -197,7 +197,9 @@ const struct cpuidtab cpuids[] = { generic_steppings }, { CPU_ID_CORTEXA15R3, CPU_CLASS_CORTEXA, "Cortex A15-r3", generic_steppings }, - { CPU_ID_KRAIT, CPU_CLASS_KRAIT, "Krait", + { CPU_ID_KRAIT300R0, CPU_CLASS_KRAIT, "Krait 300-r0", + generic_steppings }, + { CPU_ID_KRAIT300R1, CPU_CLASS_KRAIT, "Krait 300-r1", generic_steppings }, { CPU_ID_80200, CPU_CLASS_XSCALE, "i80200", Modified: projects/powernv/arm/arm/pmap-v6-new.c ============================================================================== --- projects/powernv/arm/arm/pmap-v6-new.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/arm/pmap-v6-new.c Sun Nov 29 07:20:30 2015 (r291443) @@ -1541,12 +1541,12 @@ pmap_pt2pg_zero(vm_page_t m) panic("%s: CMAP2 busy", __func__); pte2_store(sysmaps->CMAP2, PTE2_KERN_NG(pa, PTE2_AP_KRW, m->md.pat_mode)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR2); /* Even VM_ALLOC_ZERO request is only advisory. */ if ((m->flags & PG_ZERO) == 0) pagezero(sysmaps->CADDR2); pte2_sync_range((pt2_entry_t *)sysmaps->CADDR2, PAGE_SIZE); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); @@ -5470,7 +5470,6 @@ pmap_page_set_memattr(vm_page_t m, vm_me struct sysmaps *sysmaps; vm_memattr_t oma; vm_paddr_t pa; - vm_offset_t va; oma = m->md.pat_mode; m->md.pat_mode = ma; @@ -5502,10 +5501,9 @@ pmap_page_set_memattr(vm_page_t m, vm_me if (*sysmaps->CMAP2) panic("%s: CMAP2 busy", __func__); pte2_store(sysmaps->CMAP2, PTE2_KERN_NG(pa, PTE2_AP_KRW, ma)); - va = (vm_offset_t)sysmaps->CADDR2; - tlb_flush_local(va); - dcache_wbinv_poc(va, pa, PAGE_SIZE); + dcache_wbinv_poc((vm_offset_t)sysmaps->CADDR2, pa, PAGE_SIZE); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); } @@ -5594,9 +5592,9 @@ pmap_zero_page(vm_page_t m) panic("%s: CMAP2 busy", __func__); pte2_store(sysmaps->CMAP2, PTE2_KERN_NG(VM_PAGE_TO_PHYS(m), PTE2_AP_KRW, m->md.pat_mode)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR2); pagezero(sysmaps->CADDR2); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); } @@ -5619,12 +5617,12 @@ pmap_zero_page_area(vm_page_t m, int off panic("%s: CMAP2 busy", __func__); pte2_store(sysmaps->CMAP2, PTE2_KERN_NG(VM_PAGE_TO_PHYS(m), PTE2_AP_KRW, m->md.pat_mode)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR2); if (off == 0 && size == PAGE_SIZE) pagezero(sysmaps->CADDR2); else bzero(sysmaps->CADDR2 + off, size); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); } @@ -5644,9 +5642,9 @@ pmap_zero_page_idle(vm_page_t m) sched_pin(); pte2_store(CMAP3, PTE2_KERN_NG(VM_PAGE_TO_PHYS(m), PTE2_AP_KRW, m->md.pat_mode)); - tlb_flush_local((vm_offset_t)CADDR3); pagezero(CADDR3); pte2_clear(CMAP3); + tlb_flush((vm_offset_t)CADDR3); sched_unpin(); } @@ -5670,13 +5668,13 @@ pmap_copy_page(vm_page_t src, vm_page_t panic("%s: CMAP2 busy", __func__); pte2_store(sysmaps->CMAP1, PTE2_KERN_NG(VM_PAGE_TO_PHYS(src), PTE2_AP_KR | PTE2_NM, src->md.pat_mode)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR1); pte2_store(sysmaps->CMAP2, PTE2_KERN_NG(VM_PAGE_TO_PHYS(dst), PTE2_AP_KRW, dst->md.pat_mode)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR2); bcopy(sysmaps->CADDR1, sysmaps->CADDR2, PAGE_SIZE); pte2_clear(sysmaps->CMAP1); + tlb_flush((vm_offset_t)sysmaps->CADDR1); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); } @@ -5721,7 +5719,9 @@ pmap_copy_pages(vm_page_t ma[], vm_offse xfersize -= cnt; } pte2_clear(sysmaps->CMAP1); + tlb_flush((vm_offset_t)sysmaps->CADDR1); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); } @@ -5740,8 +5740,6 @@ pmap_quick_enter_page(vm_page_t m) pte2_store(pte2p, PTE2_KERN_NG(VM_PAGE_TO_PHYS(m), PTE2_AP_KRW, pmap_page_get_memattr(m))); - tlb_flush_local(qmap_addr); - return (qmap_addr); } @@ -5758,6 +5756,7 @@ pmap_quick_remove_page(vm_offset_t addr) KASSERT(pte2_load(pte2p) != 0, ("%s: PTE2 not in use", __func__)); pte2_clear(pte2p); + tlb_flush(qmap_addr); critical_exit(); } @@ -6059,9 +6058,9 @@ pmap_dcache_wb_pou(vm_paddr_t pa, vm_siz if (*sysmaps->CMAP3) panic("%s: CMAP3 busy", __func__); pte2_store(sysmaps->CMAP3, PTE2_KERN_NG(pa, PTE2_AP_KRW, ma)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR3); dcache_wb_pou((vm_offset_t)sysmaps->CADDR3 + (pa & PAGE_MASK), size); pte2_clear(sysmaps->CMAP3); + tlb_flush((vm_offset_t)sysmaps->CADDR3); sched_unpin(); mtx_unlock(&sysmaps->lock); } @@ -6313,13 +6312,13 @@ pmap_zero_page_check(vm_page_t m) panic("%s: CMAP2 busy", __func__); pte2_store(sysmaps->CMAP2, PTE2_KERN_NG(VM_PAGE_TO_PHYS(m), PTE2_AP_KRW, m->md.pat_mode)); - tlb_flush_local((vm_offset_t)sysmaps->CADDR2); end = (uint32_t*)(sysmaps->CADDR2 + PAGE_SIZE); for (p = (uint32_t*)sysmaps->CADDR2; p < end; p++) if (*p != 0) panic("%s: page %p not zero, va: %p", __func__, m, sysmaps->CADDR2); pte2_clear(sysmaps->CMAP2); + tlb_flush((vm_offset_t)sysmaps->CADDR2); sched_unpin(); mtx_unlock(&sysmaps->lock); } Modified: projects/powernv/arm/arm/pmu.c ============================================================================== --- projects/powernv/arm/arm/pmu.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/arm/pmu.c Sun Nov 29 07:20:30 2015 (r291443) @@ -89,7 +89,7 @@ static struct ofw_compat_data compat_dat static struct resource_spec pmu_spec[] = { { SYS_RES_IRQ, 0, RF_ACTIVE }, /* We don't currently handle pmu events, other than on cpu 0 */ -#if notyet +#ifdef notyet { SYS_RES_IRQ, 1, RF_ACTIVE | RF_OPTIONAL }, { SYS_RES_IRQ, 2, RF_ACTIVE | RF_OPTIONAL }, { SYS_RES_IRQ, 3, RF_ACTIVE | RF_OPTIONAL }, Modified: projects/powernv/arm/freescale/imx/imx6_anatop.c ============================================================================== --- projects/powernv/arm/freescale/imx/imx6_anatop.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/freescale/imx/imx6_anatop.c Sun Nov 29 07:20:30 2015 (r291443) @@ -72,11 +72,10 @@ __FBSDID("$FreeBSD$"); #include <arm/freescale/fsl_ocotpreg.h> #include <arm/freescale/fsl_ocotpvar.h> #include <arm/freescale/imx/imx_ccmvar.h> +#include <arm/freescale/imx/imx_machdep.h> #include <arm/freescale/imx/imx6_anatopreg.h> #include <arm/freescale/imx/imx6_anatopvar.h> -static SYSCTL_NODE(_hw, OID_AUTO, imx6, CTLFLAG_RW, NULL, "i.MX6 container"); - static struct resource_spec imx6_anatop_spec[] = { { SYS_RES_MEMORY, 0, RF_ACTIVE }, { SYS_RES_IRQ, 0, RF_ACTIVE }, @@ -395,23 +394,23 @@ cpufreq_initialize(struct imx6_anatop_so uint32_t cfg3speed; struct oppt * op; - SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "cpu_mhz", CTLFLAG_RD, &sc->cpu_curmhz, 0, "CPU frequency"); - SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "cpu_minmhz", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NOFETCH, sc, 0, cpufreq_sysctl_minmhz, "IU", "Minimum CPU frequency"); - SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "cpu_maxmhz", CTLTYPE_INT | CTLFLAG_RWTUN | CTLFLAG_NOFETCH, sc, 0, cpufreq_sysctl_maxmhz, "IU", "Maximum CPU frequency"); - SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "cpu_maxmhz_hw", CTLFLAG_RD, &sc->cpu_maxmhz_hw, 0, "Maximum CPU frequency allowed by hardware"); - SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_INT(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "cpu_overclock_enable", CTLFLAG_RWTUN, &sc->cpu_overclock_enable, 0, "Allow setting CPU frequency higher than cpu_maxmhz_hw"); @@ -626,10 +625,10 @@ initialize_tempmon(struct imx6_anatop_so callout_reset_sbt(&sc->temp_throttle_callout, sc->temp_throttle_delay, 0, tempmon_throttle_check, sc, 0); - SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "temperature", CTLTYPE_INT | CTLFLAG_RD, sc, 0, temp_sysctl_handler, "IK", "Current die temperature"); - SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx6), + SYSCTL_ADD_PROC(NULL, SYSCTL_STATIC_CHILDREN(_hw_imx), OID_AUTO, "throttle_temperature", CTLTYPE_INT | CTLFLAG_RW, sc, 0, temp_throttle_sysctl_handler, "IK", "Throttle CPU when exceeding this temperature"); Modified: projects/powernv/arm/freescale/imx/imx6_machdep.c ============================================================================== --- projects/powernv/arm/freescale/imx/imx6_machdep.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/freescale/imx/imx6_machdep.c Sun Nov 29 07:20:30 2015 (r291443) @@ -104,7 +104,6 @@ imx6_lastaddr(platform_t plat) static int imx6_attach(platform_t plat) { - /* Inform the MPCore timer driver that its clock is variable. */ arm_tmr_change_frequency(ARM_TMR_FREQUENCY_VARIES); @@ -114,6 +113,9 @@ imx6_attach(platform_t plat) static void imx6_late_init(platform_t plat) { + const uint32_t IMX6_WDOG_SR_PHYS = 0x020bc004; + + imx_wdog_init_last_reset(IMX6_WDOG_SR_PHYS); /* Cache the gpio1 node handle for imx6_decode_fdt() workaround code. */ gpio1_node = OF_node_from_xref( Modified: projects/powernv/arm/freescale/imx/imx_machdep.c ============================================================================== --- projects/powernv/arm/freescale/imx/imx_machdep.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/freescale/imx/imx_machdep.c Sun Nov 29 07:20:30 2015 (r291443) @@ -45,6 +45,15 @@ __FBSDID("$FreeBSD$"); #include <arm/freescale/imx/imx_machdep.h> #include <arm/freescale/imx/imx_wdogreg.h> +SYSCTL_NODE(_hw, OID_AUTO, imx, CTLFLAG_RW, NULL, "i.MX container"); + +static int last_reset_status; +SYSCTL_UINT(_hw_imx, OID_AUTO, last_reset_status, CTLFLAG_RD, + &last_reset_status, 0, "Last reset status register"); + +SYSCTL_STRING(_hw_imx, OID_AUTO, last_reset_reason, CTLFLAG_RD, + "unknown", 0, "Last reset reason"); + struct arm32_dma_range * bus_dma_get_range(void) { @@ -85,6 +94,23 @@ imx_wdog_cpu_reset(vm_offset_t wdcr_phys continue; } +void +imx_wdog_init_last_reset(vm_offset_t wdsr_phys) +{ + volatile uint16_t * psr; + + if ((psr = arm_devmap_ptov(wdsr_phys, sizeof(*psr))) == NULL) + return; + last_reset_status = *psr; + if (last_reset_status & WDOG_RSR_SFTW) { + sysctl___hw_imx_last_reset_reason.oid_arg1 = "SoftwareReset"; + } else if (last_reset_status & WDOG_RSR_TOUT) { + sysctl___hw_imx_last_reset_reason.oid_arg1 = "WatchdogTimeout"; + } else if (last_reset_status & WDOG_RSR_POR) { + sysctl___hw_imx_last_reset_reason.oid_arg1 = "PowerOnReset"; + } +} + u_int imx_soc_family(void) { Modified: projects/powernv/arm/freescale/imx/imx_machdep.h ============================================================================== --- projects/powernv/arm/freescale/imx/imx_machdep.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/freescale/imx/imx_machdep.h Sun Nov 29 07:20:30 2015 (r291443) @@ -30,10 +30,14 @@ #define IMX_MACHDEP_H #include <sys/types.h> +#include <sys/sysctl.h> + +SYSCTL_DECL(_hw_imx); /* Common functions, implemented in imx_machdep.c. */ void imx_wdog_cpu_reset(vm_offset_t _wdcr_phys) __attribute__((__noreturn__)); +void imx_wdog_init_last_reset(vm_offset_t _wdsr_phys); /* From here down, routines are implemented in imxNN_machdep.c. */ Modified: projects/powernv/arm/freescale/imx/imx_wdogreg.h ============================================================================== --- projects/powernv/arm/freescale/imx/imx_wdogreg.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/freescale/imx/imx_wdogreg.h Sun Nov 29 07:20:30 2015 (r291443) @@ -47,6 +47,7 @@ #define WDOG_SR_STEP2 0xaaaa #define WDOG_RSR_REG 0x04 /* Reset Status Register */ +#define WDOG_RSR_POR (1 << 4) /* Due to Power-On Reset */ #define WDOG_RSR_TOUT (1 << 1) /* Due WDog timeout reset */ #define WDOG_RSR_SFTW (1 << 0) /* Due Soft reset */ Modified: projects/powernv/arm/include/armreg.h ============================================================================== --- projects/powernv/arm/include/armreg.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/include/armreg.h Sun Nov 29 07:20:30 2015 (r291443) @@ -139,7 +139,9 @@ #define CPU_ID_CORTEXA15R1 0x411fc0f0 #define CPU_ID_CORTEXA15R2 0x412fc0f0 #define CPU_ID_CORTEXA15R3 0x413fc0f0 -#define CPU_ID_KRAIT 0x510f06f0 /* Snapdragon S4 Pro/APQ8064 */ +#define CPU_ID_KRAIT300R0 0x510f06f0 /* Snapdragon S4 Pro/APQ8064 */ +#define CPU_ID_KRAIT300R1 0x511f06f0 + #define CPU_ID_TI925T 0x54029250 #define CPU_ID_MV88FR131 0x56251310 /* Marvell Feroceon 88FR131 Core */ #define CPU_ID_MV88FR331 0x56153310 /* Marvell Feroceon 88FR331 Core */ Modified: projects/powernv/arm/include/atomic-v4.h ============================================================================== --- projects/powernv/arm/include/atomic-v4.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/include/atomic-v4.h Sun Nov 29 07:20:30 2015 (r291443) @@ -363,6 +363,13 @@ atomic_readandclear_32(volatile u_int32_ return (__swp(0, p)); } +static __inline uint32_t +atomic_swap_32(volatile u_int32_t *p, u_int32_t v) +{ + + return (__swp(v, p)); +} + #define atomic_cmpset_rel_32 atomic_cmpset_32 #define atomic_cmpset_acq_32 atomic_cmpset_32 #define atomic_set_rel_32 atomic_set_32 Modified: projects/powernv/arm/include/atomic-v6.h ============================================================================== --- projects/powernv/arm/include/atomic-v6.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/include/atomic-v6.h Sun Nov 29 07:20:30 2015 (r291443) @@ -641,6 +641,25 @@ atomic_testandset_64(volatile uint64_t * return (atomic_testandset_32(p32, v)); } +static __inline uint32_t +atomic_swap_32(volatile uint32_t *p, uint32_t v) +{ + uint32_t ret, exflag; + + __asm __volatile( + "1: ldrex %[ret], [%[ptr]] \n" + " strex %[exf], %[val], [%[ptr]] \n" + " teq %[exf], #0 \n" + " it ne \n" + " bne 1b \n" + : [ret] "=r" (ret), + [exf] "=&r" (exflag) + : [val] "r" (v), + [ptr] "r" (p) + : "cc", "memory"); + return (ret); +} + #undef ATOMIC_ACQ_REL #undef ATOMIC_ACQ_REL_LONG Modified: projects/powernv/arm/include/atomic.h ============================================================================== --- projects/powernv/arm/include/atomic.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/include/atomic.h Sun Nov 29 07:20:30 2015 (r291443) @@ -109,5 +109,6 @@ atomic_store_long(volatile u_long *dst, #define atomic_readandclear_int atomic_readandclear_32 #define atomic_load_acq_int atomic_load_acq_32 #define atomic_store_rel_int atomic_store_rel_32 +#define atomic_swap_int atomic_swap_32 #endif /* _MACHINE_ATOMIC_H_ */ Modified: projects/powernv/arm/include/sf_buf.h ============================================================================== --- projects/powernv/arm/include/sf_buf.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/include/sf_buf.h Sun Nov 29 07:20:30 2015 (r291443) @@ -44,7 +44,11 @@ static inline int sf_buf_unmap(struct sf_buf *sf) { +#ifdef ARM_NEW_PMAP + pmap_qremove(sf->kva, 1); +#else pmap_kremove(sf->kva); +#endif return (1); } #endif /* !_MACHINE_SF_BUF_H_ */ Modified: projects/powernv/arm/samsung/exynos/exynos5_combiner.c ============================================================================== --- projects/powernv/arm/samsung/exynos/exynos5_combiner.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/samsung/exynos/exynos5_combiner.c Sun Nov 29 07:20:30 2015 (r291443) @@ -28,7 +28,9 @@ * Samsung Exynos 5 Interrupt Combiner * Chapter 7, Exynos 5 Dual User's Manual Public Rev 1.00 */ - +#ifdef USB_GLOBAL_INCLUDE_FILE +#include USB_GLOBAL_INCLUDE_FILE +#else #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -50,6 +52,7 @@ __FBSDID("$FreeBSD$"); #include <machine/bus.h> #include <machine/cpu.h> #include <machine/intr.h> +#endif #include <arm/samsung/exynos/exynos5_common.h> #include <arm/samsung/exynos/exynos5_combiner.h> Modified: projects/powernv/arm/samsung/exynos/exynos5_ehci.c ============================================================================== --- projects/powernv/arm/samsung/exynos/exynos5_ehci.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/samsung/exynos/exynos5_ehci.c Sun Nov 29 07:20:30 2015 (r291443) @@ -24,6 +24,9 @@ * SUCH DAMAGE. */ +#ifdef USB_GLOBAL_INCLUDE_FILE +#include USB_GLOBAL_INCLUDE_FILE +#else #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -59,6 +62,7 @@ __FBSDID("$FreeBSD$"); #include "gpio_if.h" #include "opt_platform.h" +#endif /* GPIO control */ #define GPIO_OUTPUT 1 Modified: projects/powernv/arm/samsung/exynos/exynos5_pad.c ============================================================================== --- projects/powernv/arm/samsung/exynos/exynos5_pad.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm/samsung/exynos/exynos5_pad.c Sun Nov 29 07:20:30 2015 (r291443) @@ -28,7 +28,9 @@ * Samsung Exynos 5 Pad Control * Chapter 4, Exynos 5 Dual User's Manual Public Rev 1.00 */ - +#ifdef USB_GLOBAL_INCLUDE_FILE +#include USB_GLOBAL_INCLUDE_FILE +#else #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); @@ -55,6 +57,7 @@ __FBSDID("$FreeBSD$"); #include <machine/intr.h> #include "gpio_if.h" +#endif #include <arm/samsung/exynos/exynos5_combiner.h> #include <arm/samsung/exynos/exynos5_pad.h> Modified: projects/powernv/arm64/arm64/elf_machdep.c ============================================================================== --- projects/powernv/arm64/arm64/elf_machdep.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm64/arm64/elf_machdep.c Sun Nov 29 07:20:30 2015 (r291443) @@ -59,8 +59,6 @@ static struct sysentvec elf64_freebsd_sy .sv_size = SYS_MAXSYSCALL, .sv_table = sysent, .sv_mask = 0, - .sv_sigsize = 0, - .sv_sigtbl = NULL, .sv_errsize = 0, .sv_errtbl = NULL, .sv_transtrap = NULL, @@ -68,7 +66,6 @@ static struct sysentvec elf64_freebsd_sy .sv_sendsig = sendsig, .sv_sigcode = sigcode, .sv_szsigcode = &szsigcode, - .sv_prepsyscall = NULL, .sv_name = "FreeBSD ELF64", .sv_coredump = __elfN(coredump), .sv_imgact_try = NULL, Modified: projects/powernv/arm64/arm64/gic_v3.c ============================================================================== --- projects/powernv/arm64/arm64/gic_v3.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm64/arm64/gic_v3.c Sun Nov 29 07:20:30 2015 (r291443) @@ -155,7 +155,7 @@ gic_v3_attach(device_t dev) * One entry for Distributor and all remaining for Re-Distributor. */ sc->gic_res = malloc( - sizeof(sc->gic_res) * (sc->gic_redists.nregions + 1), + sizeof(*sc->gic_res) * (sc->gic_redists.nregions + 1), M_GIC_V3, M_WAITOK); /* Now allocate corresponding resources */ Modified: projects/powernv/arm64/arm64/pmap.c ============================================================================== --- projects/powernv/arm64/arm64/pmap.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm64/arm64/pmap.c Sun Nov 29 07:20:30 2015 (r291443) @@ -215,6 +215,8 @@ struct msgbuf *msgbufp = NULL; static struct rwlock_padalign pvh_global_lock; +vm_paddr_t dmap_phys_base; /* The start of the dmap region */ + /* * Data for the pv entry allocation mechanism */ @@ -446,18 +448,19 @@ pmap_early_vtophys(vm_offset_t l1pt, vm_ } static void -pmap_bootstrap_dmap(vm_offset_t l1pt) +pmap_bootstrap_dmap(vm_offset_t l1pt, vm_paddr_t kernstart) { vm_offset_t va; vm_paddr_t pa; pd_entry_t *l1; u_int l1_slot; + pa = dmap_phys_base = kernstart & ~L1_OFFSET; va = DMAP_MIN_ADDRESS; l1 = (pd_entry_t *)l1pt; l1_slot = pmap_l1_index(DMAP_MIN_ADDRESS); - for (pa = 0; va < DMAP_MAX_ADDRESS; + for (; va < DMAP_MAX_ADDRESS; pa += L1_SIZE, va += L1_SIZE, l1_slot++) { KASSERT(l1_slot < Ln_ENTRIES, ("Invalid L1 index")); @@ -548,7 +551,8 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd pt_entry_t *l2; vm_offset_t va, freemempos; vm_offset_t dpcpu, msgbufpv; - vm_paddr_t pa; + vm_paddr_t pa, min_pa; + int i; kern_delta = KERNBASE - kernstart; physmem = 0; @@ -566,8 +570,23 @@ pmap_bootstrap(vm_offset_t l1pt, vm_padd */ rw_init(&pvh_global_lock, "pmap pv global"); + /* Assume the address we were loaded to is a valid physical address */ + min_pa = KERNBASE - kern_delta; + + /* + * Find the minimum physical address. physmap is sorted, + * but may contain empty ranges. + */ + for (i = 0; i < (physmap_idx * 2); i += 2) { + if (physmap[i] == physmap[i + 1]) + continue; + if (physmap[i] <= min_pa) + min_pa = physmap[i]; + break; + } + /* Create a direct map region early so we can use it for pa -> va */ - pmap_bootstrap_dmap(l1pt); + pmap_bootstrap_dmap(l1pt, min_pa); va = KERNBASE; pa = KERNBASE - kern_delta; Modified: projects/powernv/arm64/include/vmparam.h ============================================================================== --- projects/powernv/arm64/include/vmparam.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/arm64/include/vmparam.h Sun Nov 29 07:20:30 2015 (r291443) @@ -160,11 +160,13 @@ #define DMAP_MIN_ADDRESS (0xffffffc000000000UL) #define DMAP_MAX_ADDRESS (0xffffffdfffffffffUL) -#define DMAP_MIN_PHYSADDR (0x0000000000000000UL) -#define DMAP_MAX_PHYSADDR (DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) +extern vm_paddr_t dmap_phys_base; +#define DMAP_MIN_PHYSADDR (dmap_phys_base) +#define DMAP_MAX_PHYSADDR (dmap_phys_base + (DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS)) /* True if pa is in the dmap range */ -#define PHYS_IN_DMAP(pa) ((pa) <= DMAP_MAX_PHYSADDR) +#define PHYS_IN_DMAP(pa) ((pa) >= DMAP_MIN_PHYSADDR && \ + (pa) <= DMAP_MAX_PHYSADDR) /* True if va is in the dmap range */ #define VIRT_IN_DMAP(va) ((va) >= DMAP_MIN_ADDRESS && \ (va) <= DMAP_MAX_ADDRESS) @@ -174,7 +176,7 @@ KASSERT(PHYS_IN_DMAP(pa), \ ("%s: PA out of range, PA: 0x%lx", __func__, \ (vm_paddr_t)(pa))); \ - (pa) | DMAP_MIN_ADDRESS; \ + ((pa) - dmap_phys_base) | DMAP_MIN_ADDRESS; \ }) #define DMAP_TO_PHYS(va) \ @@ -182,7 +184,7 @@ KASSERT(VIRT_IN_DMAP(va), \ ("%s: VA out of range, VA: 0x%lx", __func__, \ (vm_offset_t)(va))); \ - (va) & ~DMAP_MIN_ADDRESS; \ + ((va) & ~DMAP_MIN_ADDRESS) + dmap_phys_base; \ }) #define VM_MIN_USER_ADDRESS (0x0000000000000000UL) Modified: projects/powernv/boot/common/disk.c ============================================================================== --- projects/powernv/boot/common/disk.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/boot/common/disk.c Sun Nov 29 07:20:30 2015 (r291443) @@ -233,6 +233,42 @@ disk_print(struct disk_devdesc *dev, cha } int +disk_read(struct disk_devdesc *dev, void *buf, off_t offset, u_int blocks) +{ + struct open_disk *od; + int ret; + + od = (struct open_disk *)dev->d_opendata; + ret = dev->d_dev->dv_strategy(dev, F_READ, dev->d_offset + offset, + blocks * od->sectorsize, buf, NULL); + + return (ret); +} + +int +disk_write(struct disk_devdesc *dev, void *buf, off_t offset, u_int blocks) +{ + struct open_disk *od; + int ret; + + od = (struct open_disk *)dev->d_opendata; + ret = dev->d_dev->dv_strategy(dev, F_WRITE, dev->d_offset + offset, + blocks * od->sectorsize, buf, NULL); + + return (ret); +} + +int +disk_ioctl(struct disk_devdesc *dev, u_long cmd, void *buf) +{ + + if (dev->d_dev->dv_ioctl) + return ((*dev->d_dev->dv_ioctl)(dev->d_opendata, cmd, buf)); + + return (ENXIO); +} + +int disk_open(struct disk_devdesc *dev, off_t mediasize, u_int sectorsize, u_int flags) { Modified: projects/powernv/boot/common/disk.h ============================================================================== --- projects/powernv/boot/common/disk.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/boot/common/disk.h Sun Nov 29 07:20:30 2015 (r291443) @@ -89,6 +89,11 @@ struct disk_devdesc off_t d_offset; }; +enum disk_ioctl { + IOCTL_GET_BLOCKS, + IOCTL_GET_BLOCK_SIZE +}; + /* * Parse disk metadata and initialise dev->d_offset. */ @@ -97,6 +102,11 @@ extern int disk_open(struct disk_devdesc #define DISK_F_NOCACHE 0x0001 /* Do not use metadata caching */ extern int disk_close(struct disk_devdesc *dev); extern void disk_cleanup(const struct devsw *d_dev); +extern int disk_ioctl(struct disk_devdesc *dev, u_long cmd, void *buf); +extern int disk_read(struct disk_devdesc *dev, void *buf, off_t offset, + u_int blocks); +extern int disk_write(struct disk_devdesc *dev, void *buf, off_t offset, + u_int blocks); /* * Print information about slices on a disk. Modified: projects/powernv/boot/i386/boot2/Makefile ============================================================================== --- projects/powernv/boot/i386/boot2/Makefile Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/boot/i386/boot2/Makefile Sun Nov 29 07:20:30 2015 (r291443) @@ -107,8 +107,8 @@ boot2.h: boot1.out .if ${MACHINE_CPUARCH} == "amd64" beforedepend boot2.s: machine CLEANFILES+= machine -machine: - ln -sf ${.CURDIR}/../../../i386/include machine +machine: ${.CURDIR}/../../../i386/include .NOMETA + ln -sf ${.ALLSRC} ${.TARGET} .endif .include <bsd.prog.mk> Modified: projects/powernv/boot/kshim/bsd_busspace.c ============================================================================== --- projects/powernv/boot/kshim/bsd_busspace.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/boot/kshim/bsd_busspace.c Sun Nov 29 07:20:30 2015 (r291443) @@ -37,6 +37,15 @@ struct burst { uint32_t dw7; }; +int +bus_space_subregion(bus_space_tag_t t, bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp) +{ + + *nbshp = bsh + offset; + return (0); +} + void bus_space_read_multi_1(bus_space_tag_t t, bus_space_handle_t h, bus_size_t offset, uint8_t *datap, bus_size_t count) Modified: projects/powernv/boot/kshim/bsd_global.h ============================================================================== --- projects/powernv/boot/kshim/bsd_global.h Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/boot/kshim/bsd_global.h Sun Nov 29 07:20:30 2015 (r291443) @@ -29,6 +29,8 @@ #include <bsd_kernel.h> +#include <sys/gpio.h> + #define USB_DEBUG_VAR usb_debug #include <dev/usb/usb_freebsd_loader.h> #include <dev/usb/usb_endian.h> @@ -59,6 +61,8 @@ #include <dev/usb/usb_generic.h> #include <dev/usb/quirk/usb_quirk.h> #include <dev/usb/template/usb_template.h> +#include <dev/usb/controller/ehci.h> +#include <dev/usb/controller/ehcireg.h> extern struct usb_process usb_process[USB_PROC_MAX]; Modified: projects/powernv/boot/kshim/bsd_kernel.c ============================================================================== --- projects/powernv/boot/kshim/bsd_kernel.c Sun Nov 29 07:16:08 2015 (r291442) +++ projects/powernv/boot/kshim/bsd_kernel.c Sun Nov 29 07:20:30 2015 (r291443) @@ -35,6 +35,10 @@ static device_t usb_pci_root; *------------------------------------------------------------------------*/ struct mtx Giant; +int (*bus_alloc_resource_any_cb)(struct resource *res, device_t dev, + int type, int *rid, unsigned int flags); +int (*ofw_bus_status_ok_cb)(device_t dev); +int (*ofw_bus_is_compatible_cb)(device_t dev, char *name); static void mtx_system_init(void *arg) @@ -43,6 +47,146 @@ mtx_system_init(void *arg) } SYSINIT(mtx_system_init, SI_SUB_LOCK, SI_ORDER_MIDDLE, mtx_system_init, NULL); +struct resource * +bus_alloc_resource_any(device_t dev, int type, int *rid, unsigned int flags) +{ + struct resource *res; + int ret = EINVAL; + + res = malloc(sizeof(*res), XXX, XXX); + if (res == NULL) + return (NULL); + + res->__r_i = malloc(sizeof(struct resource_i), XXX, XXX); + if (res->__r_i == NULL) { + free(res, XXX); + return (NULL); + } + + if (bus_alloc_resource_any_cb != NULL) + ret = (*bus_alloc_resource_any_cb)(res, dev, type, rid, flags); + if (ret == 0) + return (res); + + free(res->__r_i, XXX); + free(res, XXX); + return (NULL); +} + +int +bus_alloc_resources(device_t dev, struct resource_spec *rs, + struct resource **res) +{ + int i; + + for (i = 0; rs[i].type != -1; i++) + res[i] = NULL; + for (i = 0; rs[i].type != -1; i++) { + res[i] = bus_alloc_resource_any(dev, + rs[i].type, &rs[i].rid, rs[i].flags); + if (res[i] == NULL && !(rs[i].flags & RF_OPTIONAL)) { + bus_release_resources(dev, rs, res); + return (ENXIO); + } + } + return (0); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511290720.tAT7KUxf082883>