Date: Mon, 12 Apr 2010 23:16:02 +0000 (UTC) From: Warner Losh <imp@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r206524 - in user/imp/tbemd/sys: pc98/cbus pc98/conf pc98/pc98 pci powerpc/aim powerpc/booke powerpc/conf powerpc/mpc85xx powerpc/ofw powerpc/powermac powerpc/powerpc rpc sparc64/conf s... Message-ID: <201004122316.o3CNG2Ys070511@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: imp Date: Mon Apr 12 23:16:01 2010 New Revision: 206524 URL: http://svn.freebsd.org/changeset/base/206524 Log: merge from head, part 9 of many Added: user/imp/tbemd/sys/sparc64/pci/sbbc.c - copied unchanged from r206514, head/sys/sparc64/pci/sbbc.c Modified: user/imp/tbemd/sys/pc98/cbus/clock.c user/imp/tbemd/sys/pc98/conf/GENERIC user/imp/tbemd/sys/pc98/pc98/machdep.c user/imp/tbemd/sys/pci/if_rlreg.h user/imp/tbemd/sys/powerpc/aim/interrupt.c user/imp/tbemd/sys/powerpc/aim/machdep.c user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c user/imp/tbemd/sys/powerpc/aim/nexus.c user/imp/tbemd/sys/powerpc/aim/ofw_machdep.c user/imp/tbemd/sys/powerpc/booke/interrupt.c user/imp/tbemd/sys/powerpc/booke/machdep.c user/imp/tbemd/sys/powerpc/booke/trap_subr.S user/imp/tbemd/sys/powerpc/conf/GENERIC user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.c user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.h user/imp/tbemd/sys/powerpc/mpc85xx/pci_ocp.c user/imp/tbemd/sys/powerpc/ofw/ofw_real.c user/imp/tbemd/sys/powerpc/ofw/ofw_syscons.c user/imp/tbemd/sys/powerpc/powermac/cuda.c user/imp/tbemd/sys/powerpc/powermac/cudavar.h user/imp/tbemd/sys/powerpc/powermac/pmu.c user/imp/tbemd/sys/powerpc/powermac/smu.c user/imp/tbemd/sys/powerpc/powermac/uninorth.c user/imp/tbemd/sys/powerpc/powerpc/cpu.c user/imp/tbemd/sys/rpc/svc.c user/imp/tbemd/sys/sparc64/conf/GENERIC user/imp/tbemd/sys/sparc64/conf/NOTES user/imp/tbemd/sys/sparc64/fhc/fhc.c user/imp/tbemd/sys/sparc64/include/dcr.h user/imp/tbemd/sys/sparc64/include/lsu.h user/imp/tbemd/sys/sparc64/include/tlb.h user/imp/tbemd/sys/sparc64/include/tte.h user/imp/tbemd/sys/sparc64/include/ver.h user/imp/tbemd/sys/sparc64/include/wstate.h user/imp/tbemd/sys/sparc64/pci/apb.c user/imp/tbemd/sys/sparc64/pci/psycho.c user/imp/tbemd/sys/sparc64/pci/schizo.c user/imp/tbemd/sys/sparc64/pci/schizovar.h user/imp/tbemd/sys/sparc64/sbus/sbus.c user/imp/tbemd/sys/sparc64/sparc64/cheetah.c user/imp/tbemd/sys/sparc64/sparc64/exception.S user/imp/tbemd/sys/sparc64/sparc64/genassym.c user/imp/tbemd/sys/sparc64/sparc64/locore.S user/imp/tbemd/sys/sparc64/sparc64/machdep.c user/imp/tbemd/sys/sparc64/sparc64/ofw_machdep.c user/imp/tbemd/sys/sparc64/sparc64/pmap.c user/imp/tbemd/sys/sparc64/sparc64/support.S user/imp/tbemd/sys/sparc64/sparc64/swtch.S user/imp/tbemd/sys/sparc64/sparc64/trap.c user/imp/tbemd/sys/sun4v/conf/GENERIC user/imp/tbemd/sys/sun4v/sun4v/machdep.c user/imp/tbemd/sys/sys/_timespec.h user/imp/tbemd/sys/sys/eventhandler.h user/imp/tbemd/sys/sys/iconv.h user/imp/tbemd/sys/sys/imgact.h user/imp/tbemd/sys/sys/ioccom.h user/imp/tbemd/sys/sys/mchain.h user/imp/tbemd/sys/sys/param.h user/imp/tbemd/sys/sys/pcpu.h user/imp/tbemd/sys/sys/pioctl.h user/imp/tbemd/sys/sys/pmc.h user/imp/tbemd/sys/sys/proc.h user/imp/tbemd/sys/sys/ptrace.h user/imp/tbemd/sys/sys/stat.h user/imp/tbemd/sys/sys/sysent.h user/imp/tbemd/sys/sys/timeb.h user/imp/tbemd/sys/sys/timespec.h user/imp/tbemd/sys/sys/vnode.h user/imp/tbemd/sys/sys/vtoc.h user/imp/tbemd/sys/teken/teken.c user/imp/tbemd/sys/ufs/ffs/ffs_vfsops.c user/imp/tbemd/sys/vm/memguard.c user/imp/tbemd/sys/vm/memguard.h user/imp/tbemd/sys/vm/uma_int.h user/imp/tbemd/sys/vm/vm_contig.c user/imp/tbemd/sys/vm/vm_extern.h user/imp/tbemd/sys/vm/vm_fault.c user/imp/tbemd/sys/vm/vm_glue.c user/imp/tbemd/sys/vm/vm_map.c user/imp/tbemd/sys/vm/vm_map.h user/imp/tbemd/sys/vm/vm_mmap.c user/imp/tbemd/sys/vm/vm_page.c user/imp/tbemd/sys/vm/vm_pageout.c user/imp/tbemd/sys/x86/isa/clock.c Modified: user/imp/tbemd/sys/pc98/cbus/clock.c ============================================================================== --- user/imp/tbemd/sys/pc98/cbus/clock.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/pc98/cbus/clock.c Mon Apr 12 23:16:01 2010 (r206524) @@ -93,6 +93,9 @@ TUNABLE_INT("hw.i8254.freq", &i8254_freq int i8254_max_count; static int i8254_real_max_count; +static int lapic_allclocks = 1; +TUNABLE_INT("machdep.lapic_allclocks", &lapic_allclocks); + static struct mtx clock_lock; static struct intsrc *i8254_intsrc; static u_int32_t i8254_lastcount; @@ -432,9 +435,11 @@ startrtclock() void cpu_initclocks() { +#if defined(DEV_APIC) + enum lapic_clock tlsca; -#ifdef DEV_APIC - using_lapic_timer = lapic_setup_clock(); + tlsca = lapic_allclocks == 0 ? LAPIC_CLOCK_HARDCLOCK : LAPIC_CLOCK_ALL; + using_lapic_timer = lapic_setup_clock(tlsca); #endif /* * If we aren't using the local APIC timer to drive the kernel Modified: user/imp/tbemd/sys/pc98/conf/GENERIC ============================================================================== --- user/imp/tbemd/sys/pc98/conf/GENERIC Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/pc98/conf/GENERIC Mon Apr 12 23:16:01 2010 (r206524) @@ -46,7 +46,6 @@ options PROCFS # Process filesystem ( options PSEUDOFS # Pseudo-filesystem framework options GEOM_PART_GPT # GUID Partition Tables. options GEOM_LABEL # Provides labelization -options COMPAT_43TTY # BSD 4.3 TTY compat (sgtty) options COMPAT_FREEBSD4 # Compatible with FreeBSD4 options COMPAT_FREEBSD5 # Compatible with FreeBSD5 options COMPAT_FREEBSD6 # Compatible with FreeBSD6 Modified: user/imp/tbemd/sys/pc98/pc98/machdep.c ============================================================================== --- user/imp/tbemd/sys/pc98/pc98/machdep.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/pc98/pc98/machdep.c Mon Apr 12 23:16:01 2010 (r206524) @@ -1172,11 +1172,7 @@ void (*cpu_idle_hook)(void) = cpu_idle_d * Reset registers to default values on exec. */ void -exec_setregs(td, entry, stack, ps_strings) - struct thread *td; - u_long entry; - u_long stack; - u_long ps_strings; +exec_setregs(struct thread *td, struct image_params *imgp, u_long stack) { struct trapframe *regs = td->td_frame; struct pcb *pcb = td->td_pcb; @@ -1192,7 +1188,7 @@ exec_setregs(td, entry, stack, ps_string mtx_unlock_spin(&dt_lock); bzero((char *)regs, sizeof(struct trapframe)); - regs->tf_eip = entry; + regs->tf_eip = imgp->entry_addr; regs->tf_esp = stack; regs->tf_eflags = PSL_USER | (regs->tf_eflags & PSL_T); regs->tf_ss = _udatasel; @@ -1202,7 +1198,7 @@ exec_setregs(td, entry, stack, ps_string regs->tf_cs = _ucodesel; /* PS_STRINGS value for BSD/OS binaries. It is 0 for non-BSD/OS. */ - regs->tf_ebx = ps_strings; + regs->tf_ebx = imgp->ps_strings; /* * Reset the hardware debug registers if they were in use. Modified: user/imp/tbemd/sys/pci/if_rlreg.h ============================================================================== --- user/imp/tbemd/sys/pci/if_rlreg.h Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/pci/if_rlreg.h Mon Apr 12 23:16:01 2010 (r206524) @@ -133,6 +133,7 @@ #define RL_GMEDIASTAT 0x006C /* 8 bits */ #define RL_MACDBG 0x006D /* 8 bits, 8168C SPIN2 only */ #define RL_GPIO 0x006E /* 8 bits, 8168C SPIN2 only */ +#define RL_PMCH 0x006F /* 8 bits */ #define RL_MAXRXPKTLEN 0x00DA /* 16 bits, chip multiplies by 8 */ #define RL_GTXSTART 0x0038 /* 8 bits */ @@ -159,9 +160,10 @@ #define RL_HWREV_8169_8110SB 0x10000000 #define RL_HWREV_8169_8110SC 0x18000000 #define RL_HWREV_8102EL 0x24800000 -#define RL_HWREV_8102EL_SPIN1 0x24c00000 +#define RL_HWREV_8102EL_SPIN1 0x24C00000 #define RL_HWREV_8168D 0x28000000 #define RL_HWREV_8168DP 0x28800000 +#define RL_HWREV_8168E 0x2C000000 #define RL_HWREV_8168_SPIN1 0x30000000 #define RL_HWREV_8100E 0x30800000 #define RL_HWREV_8101E 0x34000000 @@ -180,7 +182,7 @@ #define RL_HWREV_8139C 0x74000000 #define RL_HWREV_8139D 0x74400000 #define RL_HWREV_8139CPLUS 0x74800000 -#define RL_HWREV_8101 0x74c00000 +#define RL_HWREV_8101 0x74C00000 #define RL_HWREV_8100 0x78800000 #define RL_HWREV_8169_8110SBL 0x7CC00000 #define RL_HWREV_8169_8110SCE 0x98000000 @@ -884,6 +886,7 @@ struct rl_softc { uint32_t rl_flags; #define RL_FLAG_MSI 0x0001 #define RL_FLAG_AUTOPAD 0x0002 +#define RL_FLAG_PHYWAKE_PM 0x0004 #define RL_FLAG_PHYWAKE 0x0008 #define RL_FLAG_NOJUMBO 0x0010 #define RL_FLAG_PAR 0x0020 Modified: user/imp/tbemd/sys/powerpc/aim/interrupt.c ============================================================================== --- user/imp/tbemd/sys/powerpc/aim/interrupt.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/aim/interrupt.c Mon Apr 12 23:16:01 2010 (r206524) @@ -80,15 +80,17 @@ powerpc_interrupt(struct trapframe *fram switch (framep->exc) { case EXC_EXI: - atomic_add_int(&td->td_intr_nesting_level, 1); + critical_enter(); PIC_DISPATCH(pic, framep); - atomic_subtract_int(&td->td_intr_nesting_level, 1); + critical_exit(); break; case EXC_DECR: + critical_enter(); atomic_add_int(&td->td_intr_nesting_level, 1); decr_intr(framep); atomic_subtract_int(&td->td_intr_nesting_level, 1); + critical_exit(); break; default: Modified: user/imp/tbemd/sys/powerpc/aim/machdep.c ============================================================================== --- user/imp/tbemd/sys/powerpc/aim/machdep.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/aim/machdep.c Mon Apr 12 23:16:01 2010 (r206524) @@ -951,7 +951,7 @@ cpu_idle_wakeup(int cpu) * Set set up registers on exec. */ void -exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings) +exec_setregs(struct thread *td, struct image_params *imgp, u_long stack) { struct trapframe *tf; struct ps_strings arginfo; @@ -995,7 +995,7 @@ exec_setregs(struct thread *td, u_long e tf->fixreg[7] = 0; /* termination vector */ tf->fixreg[8] = (register_t)PS_STRINGS; /* NetBSD extension */ - tf->srr0 = entry; + tf->srr0 = imgp->entry_addr; tf->srr1 = PSL_MBO | PSL_USERSET | PSL_FE_DFLT; td->td_pcb->pcb_flags = 0; } Modified: user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c ============================================================================== --- user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/aim/mmu_oea64.c Mon Apr 12 23:16:01 2010 (r206524) @@ -1507,10 +1507,10 @@ moea64_remove_write(mmu_t mmu, vm_page_t return; lo = moea64_attr_fetch(m); SYNC(); - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { pmap = pvo->pvo_pmap; PMAP_LOCK(pmap); + LOCK_TABLE(); if ((pvo->pvo_pte.lpte.pte_lo & LPTE_PP) != LPTE_BR) { pt = moea64_pvo_to_pte(pvo, -1); pvo->pvo_pte.lpte.pte_lo &= ~LPTE_PP; @@ -1523,9 +1523,9 @@ moea64_remove_write(mmu_t mmu, vm_page_t pvo->pvo_pmap, PVO_VADDR(pvo)); } } + UNLOCK_TABLE(); PMAP_UNLOCK(pmap); } - UNLOCK_TABLE(); if ((lo & LPTE_CHG) != 0) { moea64_attr_clear(m, LPTE_CHG); vm_page_dirty(m); @@ -1604,6 +1604,13 @@ moea64_kextract(mmu_t mmu, vm_offset_t v struct pvo_entry *pvo; vm_paddr_t pa; + /* + * Shortcut the direct-mapped case when applicable. We never put + * anything but 1:1 mappings below VM_MIN_KERNEL_ADDRESS. + */ + if (va < VM_MIN_KERNEL_ADDRESS) + return (va); + PMAP_LOCK(kernel_pmap); pvo = moea64_pvo_find_va(kernel_pmap, va & ~ADDR_POFF, NULL); KASSERT(pvo != NULL, ("moea64_kextract: no addr found")); @@ -1661,17 +1668,15 @@ moea64_page_exists_quick(mmu_t mmu, pmap if (!moea64_initialized || (m->flags & PG_FICTITIOUS)) return FALSE; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + loops = 0; - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { - if (pvo->pvo_pmap == pmap) { - UNLOCK_TABLE(); + if (pvo->pvo_pmap == pmap) return (TRUE); - } if (++loops >= 16) break; } - UNLOCK_TABLE(); return (FALSE); } @@ -1690,11 +1695,9 @@ moea64_page_wired_mappings(mmu_t mmu, vm if (!moea64_initialized || (m->flags & PG_FICTITIOUS) != 0) return (count); mtx_assert(&vm_page_queue_mtx, MA_OWNED); - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) if ((pvo->pvo_vaddr & PVO_WIRED) != 0) count++; - UNLOCK_TABLE(); return (count); } @@ -1913,7 +1916,6 @@ moea64_remove_all(mmu_t mmu, vm_page_t m mtx_assert(&vm_page_queue_mtx, MA_OWNED); pvo_head = vm_page_to_pvoh(m); - LOCK_TABLE(); for (pvo = LIST_FIRST(pvo_head); pvo != NULL; pvo = next_pvo) { next_pvo = LIST_NEXT(pvo, pvo_vlink); @@ -1923,7 +1925,6 @@ moea64_remove_all(mmu_t mmu, vm_page_t m moea64_pvo_remove(pvo, -1); PMAP_UNLOCK(pmap); } - UNLOCK_TABLE(); if ((m->flags & PG_WRITEABLE) && moea64_is_modified(mmu, m)) { moea64_attr_clear(m, LPTE_CHG); vm_page_dirty(m); @@ -2268,7 +2269,7 @@ moea64_pvo_to_pte(const struct pvo_entry } if (((pt->pte_lo ^ pvo->pvo_pte.lpte.pte_lo) & - ~(LPTE_CHG|LPTE_REF)) != 0) { + ~(LPTE_M|LPTE_CHG|LPTE_REF)) != 0) { panic("moea64_pvo_to_pte: pvo %p pte does not match " "pte %p in moea64_pteg_table difference is %#x", pvo, pt, @@ -2334,7 +2335,8 @@ moea64_query_bit(vm_page_t m, u_int64_t if (moea64_attr_fetch(m) & ptebit) return (TRUE); - LOCK_TABLE(); + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ @@ -2344,7 +2346,6 @@ moea64_query_bit(vm_page_t m, u_int64_t */ if (pvo->pvo_pte.lpte.pte_lo & ptebit) { moea64_attr_save(m, ptebit); - UNLOCK_TABLE(); MOEA_PVO_CHECK(pvo); /* sanity check */ return (TRUE); } @@ -2364,6 +2365,7 @@ moea64_query_bit(vm_page_t m, u_int64_t * REF/CHG bits from the valid PTE. If the appropriate * ptebit is set, cache it and return success. */ + LOCK_TABLE(); pt = moea64_pvo_to_pte(pvo, -1); if (pt != NULL) { moea64_pte_synch(pt, &pvo->pvo_pte.lpte); @@ -2375,8 +2377,8 @@ moea64_query_bit(vm_page_t m, u_int64_t return (TRUE); } } + UNLOCK_TABLE(); } - UNLOCK_TABLE(); return (FALSE); } @@ -2389,6 +2391,8 @@ moea64_clear_bit(vm_page_t m, u_int64_t struct lpte *pt; uint64_t rv; + mtx_assert(&vm_page_queue_mtx, MA_OWNED); + /* * Clear the cached value. */ @@ -2409,10 +2413,10 @@ moea64_clear_bit(vm_page_t m, u_int64_t * valid pte clear the ptebit from the valid pte. */ count = 0; - LOCK_TABLE(); LIST_FOREACH(pvo, vm_page_to_pvoh(m), pvo_vlink) { MOEA_PVO_CHECK(pvo); /* sanity check */ + LOCK_TABLE(); pt = moea64_pvo_to_pte(pvo, -1); if (pt != NULL) { moea64_pte_synch(pt, &pvo->pvo_pte.lpte); @@ -2424,8 +2428,8 @@ moea64_clear_bit(vm_page_t m, u_int64_t rv |= pvo->pvo_pte.lpte.pte_lo; pvo->pvo_pte.lpte.pte_lo &= ~ptebit; MOEA_PVO_CHECK(pvo); /* sanity check */ + UNLOCK_TABLE(); } - UNLOCK_TABLE(); if (origbit != NULL) { *origbit = rv; @@ -2511,7 +2515,7 @@ moea64_sync_icache(mmu_t mmu, pmap_t pm, len = MIN(lim - va, sz); pvo = moea64_pvo_find_va(pm, va & ~ADDR_POFF, NULL); if (pvo != NULL) { - pa = (pvo->pvo_pte.pte.pte_lo & PTE_RPGN) | + pa = (pvo->pvo_pte.pte.pte_lo & LPTE_RPGN) | (va & ADDR_POFF); moea64_syncicache(pm, va, pa, len); } Modified: user/imp/tbemd/sys/powerpc/aim/nexus.c ============================================================================== --- user/imp/tbemd/sys/powerpc/aim/nexus.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/aim/nexus.c Mon Apr 12 23:16:01 2010 (r206524) @@ -60,7 +60,6 @@ #include <sys/systm.h> #include <sys/module.h> #include <sys/bus.h> -#include <sys/clock.h> #include <sys/cons.h> #include <sys/kernel.h> #include <sys/malloc.h> @@ -74,7 +73,6 @@ #include <sys/rman.h> -#include "clock_if.h" #include "ofw_bus_if.h" #include "pic_if.h" @@ -143,12 +141,6 @@ static const char *nexus_ofw_get_type(de static const char *nexus_ofw_get_compat(device_t, device_t); /* - * Clock interface. - */ -static int nexus_gettime(device_t, struct timespec *); -static int nexus_settime(device_t, struct timespec *); - -/* * Local routines */ static device_t nexus_device_from_node(device_t, phandle_t); @@ -181,10 +173,6 @@ static device_method_t nexus_methods[] = DEVMETHOD(ofw_bus_get_type, nexus_ofw_get_type), DEVMETHOD(ofw_bus_get_compat, nexus_ofw_get_compat), - /* Clock interface */ - DEVMETHOD(clock_gettime, nexus_gettime), - DEVMETHOD(clock_settime, nexus_settime), - { 0, 0 } }; @@ -240,7 +228,6 @@ nexus_attach(device_t dev) } - clock_register(dev, 1000); return (bus_generic_attach(dev)); } @@ -512,50 +499,3 @@ nexus_ofw_get_compat(device_t bus, devic return (dinfo->ndi_compatible); } -#define DIFF19041970 2082844800 - -static int -nexus_gettime(device_t dev, struct timespec *ts) -{ - char path[128]; - ihandle_t ih; - phandle_t ph; - u_int rtc; - - ph = OF_finddevice("rtc"); - if (ph == -1) - return (ENOENT); - - OF_package_to_path(ph, path, sizeof(path)); - ih = OF_open(path); - if (ih == -1) - return (ENXIO); - - if (OF_call_method("read-rtc", ih, 0, 1, &rtc)) - return (EIO); - - ts->tv_sec = rtc - DIFF19041970; - ts->tv_nsec = 0; - return (0); -} - -static int -nexus_settime(device_t dev, struct timespec *ts) -{ - char path[128]; - ihandle_t ih; - phandle_t ph; - u_int rtc; - - ph = OF_finddevice("rtc"); - if (ph == -1) - return (ENOENT); - - OF_package_to_path(ph, path, sizeof(path)); - ih = OF_open(path); - if (ih == -1) - return (ENXIO); - - rtc = ts->tv_sec + DIFF19041970; - return ((OF_call_method("write-rtc", ih, 1, 0, rtc) != 0) ? EIO : 0); -} Modified: user/imp/tbemd/sys/powerpc/aim/ofw_machdep.c ============================================================================== --- user/imp/tbemd/sys/powerpc/aim/ofw_machdep.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/aim/ofw_machdep.c Mon Apr 12 23:16:01 2010 (r206524) @@ -63,6 +63,8 @@ __FBSDID("$FreeBSD$"); static struct mem_region OFmem[OFMEM_REGIONS + 1], OFavail[OFMEM_REGIONS + 3]; static struct mem_region OFfree[OFMEM_REGIONS + 3]; +static struct mtx ofw_mutex; + struct mem_region64 { vm_offset_t mr_start_hi; vm_offset_t mr_start_lo; @@ -281,6 +283,8 @@ OF_bootstrap() { boolean_t status = FALSE; + mtx_init(&ofw_mutex, "open firmware", NULL, MTX_DEF); + if (ofwcall != NULL) { if (ofw_real_mode) status = OF_install(OFW_STD_REAL, 0); @@ -314,6 +318,8 @@ openfirmware(void *args) if (pmap_bootstrapped && ofw_real_mode) args = (void *)pmap_kextract((vm_offset_t)args); + mtx_lock(&ofw_mutex); + __asm __volatile( "\t" "sync\n\t" "mfmsr %0\n\t" @@ -366,6 +372,8 @@ openfirmware(void *args) : : "r" (oldmsr) ); + mtx_unlock(&ofw_mutex); + return (result); } Modified: user/imp/tbemd/sys/powerpc/booke/interrupt.c ============================================================================== --- user/imp/tbemd/sys/powerpc/booke/interrupt.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/booke/interrupt.c Mon Apr 12 23:16:01 2010 (r206524) @@ -118,9 +118,12 @@ powerpc_decr_interrupt(struct trapframe struct thread *td; td = PCPU_GET(curthread); + critical_enter(); atomic_add_int(&td->td_intr_nesting_level, 1); decr_intr(framep); atomic_subtract_int(&td->td_intr_nesting_level, 1); + critical_exit(); + framep->srr1 &= ~PSL_WE; } /* @@ -129,10 +132,9 @@ powerpc_decr_interrupt(struct trapframe void powerpc_extr_interrupt(struct trapframe *framep) { - struct thread *td; - td = PCPU_GET(curthread); - atomic_add_int(&td->td_intr_nesting_level, 1); + critical_enter(); PIC_DISPATCH(pic, framep); - atomic_subtract_int(&td->td_intr_nesting_level, 1); + critical_exit(); + framep->srr1 &= ~PSL_WE; } Modified: user/imp/tbemd/sys/powerpc/booke/machdep.c ============================================================================== --- user/imp/tbemd/sys/powerpc/booke/machdep.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/booke/machdep.c Mon Apr 12 23:16:01 2010 (r206524) @@ -509,7 +509,7 @@ cpu_pcpu_init(struct pcpu *pcpu, int cpu /* Set set up registers on exec. */ void -exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings) +exec_setregs(struct thread *td, struct image_params *imgp, u_long stack) { struct trapframe *tf; struct ps_strings arginfo; @@ -553,7 +553,7 @@ exec_setregs(struct thread *td, u_long e tf->fixreg[7] = 0; /* termination vector */ tf->fixreg[8] = (register_t)PS_STRINGS; /* NetBSD extension */ - tf->srr0 = entry; + tf->srr0 = imgp->entry_addr; tf->srr1 = PSL_USERSET; td->td_pcb->pcb_flags = 0; } @@ -706,6 +706,7 @@ cpu_idle (int busy) register_t msr; msr = mfmsr(); + #ifdef INVARIANTS if ((msr & PSL_EE) != PSL_EE) { struct thread *td = curthread; @@ -713,19 +714,10 @@ cpu_idle (int busy) panic("ints disabled in idleproc!"); } #endif -#if 0 - /* - * Freescale E500 core RM section 6.4.1 - */ - msr = msr | PSL_WE; - __asm__(" msync;" - " mtmsr %0;" - " isync;" - "loop: b loop" : - /* no output */ : - "r" (msr)); -#endif + /* Freescale E500 core RM section 6.4.1. */ + msr = msr | PSL_WE; + __asm __volatile("msync; mtmsr %0; isync" :: "r" (msr)); } int Modified: user/imp/tbemd/sys/powerpc/booke/trap_subr.S ============================================================================== --- user/imp/tbemd/sys/powerpc/booke/trap_subr.S Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/booke/trap_subr.S Mon Apr 12 23:16:01 2010 (r206524) @@ -441,6 +441,7 @@ INTERRUPT(int_instr_storage) INTERRUPT(int_external_input) STANDARD_PROLOG(SPR_SPRG1, PC_TEMPSAVE, SPR_SRR0, SPR_SRR1) FRAME_SETUP(SPR_SPRG1, PC_TEMPSAVE, EXC_EXI) + addi %r3, %r1, 8 bl CNAME(powerpc_extr_interrupt) b trapexit Modified: user/imp/tbemd/sys/powerpc/conf/GENERIC ============================================================================== --- user/imp/tbemd/sys/powerpc/conf/GENERIC Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/conf/GENERIC Mon Apr 12 23:16:01 2010 (r206524) @@ -47,7 +47,6 @@ options PROCFS #Process filesystem (r options PSEUDOFS #Pseudo-filesystem framework options GEOM_PART_GPT #GUID Partition Tables. options GEOM_LABEL #Provides labelization -options COMPAT_43TTY #BSD 4.3 TTY compat (sgtty) options COMPAT_FREEBSD4 #Keep this for a while options COMPAT_FREEBSD5 #Compatible with FreeBSD5 options COMPAT_FREEBSD6 #Compatible with FreeBSD6 Modified: user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.c ============================================================================== --- user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.c Mon Apr 12 23:16:01 2010 (r206524) @@ -152,6 +152,10 @@ ocpbus_write_law(int trgt, int type, u_l addr = 0xA0000000; size = 0x10000000; break; + case OCP85XX_TGTIF_PCI3: + addr = 0xB0000000; + size = 0x10000000; + break; default: return (EINVAL); } @@ -170,6 +174,10 @@ ocpbus_write_law(int trgt, int type, u_l addr = 0xfee20000; size = 0x00010000; break; + case OCP85XX_TGTIF_PCI3: + addr = 0xfee30000; + size = 0x00010000; + break; default: return (EINVAL); } @@ -188,7 +196,7 @@ static int ocpbus_probe(device_t dev) { - device_set_desc(dev, "On-Chip Peripherals bus"); + device_set_desc(dev, "Freescale on-chip peripherals bus"); return (BUS_PROBE_DEFAULT); } @@ -210,6 +218,7 @@ ocpbus_attach(device_t dev) ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 0); ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 1); ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 2); + ocpbus_mk_child(dev, OCPBUS_DEVTYPE_PCIB, 3); ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 0); ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 1); ocpbus_mk_child(dev, OCPBUS_DEVTYPE_TSEC, 2); @@ -338,6 +347,10 @@ const struct ocp_resource mpc8555_resour OCP85XX_PCI_SIZE}, {OCPBUS_DEVTYPE_PCIB, 2, SYS_RES_MEMORY, 1, 0, OCP85XX_TGTIF_PCI2}, {OCPBUS_DEVTYPE_PCIB, 2, SYS_RES_IOPORT, 1, 0, OCP85XX_TGTIF_PCI2}, + {OCPBUS_DEVTYPE_PCIB, 3, SYS_RES_MEMORY, 0, OCP85XX_PCI3_OFF, + OCP85XX_PCI_SIZE}, + {OCPBUS_DEVTYPE_PCIB, 3, SYS_RES_MEMORY, 1, 0, OCP85XX_TGTIF_PCI3}, + {OCPBUS_DEVTYPE_PCIB, 3, SYS_RES_IOPORT, 1, 0, OCP85XX_TGTIF_PCI3}, {OCPBUS_DEVTYPE_LBC, 0, SYS_RES_MEMORY, 0, OCP85XX_LBC_OFF, OCP85XX_LBC_SIZE}, Modified: user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.h ============================================================================== --- user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.h Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/mpc85xx/ocpbus.h Mon Apr 12 23:16:01 2010 (r206524) @@ -50,6 +50,7 @@ #define OCP85XX_TGTIF_PCI0 0 #define OCP85XX_TGTIF_PCI1 1 #define OCP85XX_TGTIF_PCI2 2 +#define OCP85XX_TGTIF_PCI3 3 #define OCP85XX_TGTIF_LBC 4 #define OCP85XX_TGTIF_RAM_INTL 11 #define OCP85XX_TGTIF_RIO 12 @@ -86,6 +87,7 @@ #define OCP85XX_PCI0_OFF 0x08000 #define OCP85XX_PCI1_OFF 0x09000 #define OCP85XX_PCI2_OFF 0x0A000 +#define OCP85XX_PCI3_OFF 0x0B000 #define OCP85XX_PCI_SIZE 0x1000 #define OCP85XX_TSEC0_OFF 0x24000 #define OCP85XX_TSEC1_OFF 0x25000 Modified: user/imp/tbemd/sys/powerpc/mpc85xx/pci_ocp.c ============================================================================== --- user/imp/tbemd/sys/powerpc/mpc85xx/pci_ocp.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/mpc85xx/pci_ocp.c Mon Apr 12 23:16:01 2010 (r206524) @@ -264,7 +264,7 @@ pci_ocp_maxslots(device_t dev) { struct pci_ocp_softc *sc = device_get_softc(dev); - return ((sc->sc_pcie_cap) ? 0 : 30); + return ((sc->sc_pcie_cap) ? 0 : 31); } static uint32_t @@ -328,6 +328,7 @@ pci_ocp_probe(device_t dev) return (ENXIO); sc = device_get_softc(dev); + sc->sc_dev = dev; sc->sc_rid = 0; sc->sc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->sc_rid, @@ -492,7 +493,7 @@ pci_ocp_route_int(struct pci_ocp_softc * } static int -pci_ocp_init(struct pci_ocp_softc *sc, int bus, int maxslot) +pci_ocp_init(struct pci_ocp_softc *sc, int bus, int nslots) { int secbus, slot; int func, maxfunc; @@ -502,7 +503,7 @@ pci_ocp_init(struct pci_ocp_softc *sc, i uint8_t intline, intpin; secbus = bus; - for (slot = 0; slot < maxslot; slot++) { + for (slot = 0; slot < nslots; slot++) { maxfunc = 0; for (func = 0; func <= maxfunc; func++) { hdrtype = pci_ocp_read_config(sc->sc_dev, bus, slot, @@ -599,7 +600,7 @@ pci_ocp_init(struct pci_ocp_softc *sc, i PCIR_SUBBUS_1, 0xff, 1); secbus = pci_ocp_init(sc, secbus, - (subclass == PCIS_BRIDGE_PCI) ? 31 : 1); + (subclass == PCIS_BRIDGE_PCI) ? 32 : 1); pci_ocp_write_config(sc->sc_dev, bus, slot, func, PCIR_SUBBUS_1, secbus, 1); @@ -721,7 +722,7 @@ pci_ocp_attach(device_t dev) { struct pci_ocp_softc *sc; uint32_t cfgreg; - int error, maxslot; + int error, nslots; sc = device_get_softc(dev); sc->sc_dev = dev; @@ -765,8 +766,8 @@ pci_ocp_attach(device_t dev) return (0); } - maxslot = (sc->sc_pcie_cap) ? 1 : 31; - pci_ocp_init(sc, sc->sc_busnr, maxslot); + nslots = (sc->sc_pcie_cap) ? 1 : 32; + pci_ocp_init(sc, sc->sc_busnr, nslots); device_add_child(dev, "pci", -1); return (bus_generic_attach(dev)); Modified: user/imp/tbemd/sys/powerpc/ofw/ofw_real.c ============================================================================== --- user/imp/tbemd/sys/powerpc/ofw/ofw_real.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/ofw/ofw_real.c Mon Apr 12 23:16:01 2010 (r206524) @@ -273,7 +273,7 @@ ofw_real_init(ofw_t ofw, void *openfirm) static int ofw_real_test(ofw_t ofw, const char *name) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -304,7 +304,7 @@ ofw_real_test(ofw_t ofw, const char *nam static phandle_t ofw_real_peer(ofw_t ofw, phandle_t node) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -326,7 +326,7 @@ ofw_real_peer(ofw_t ofw, phandle_t node) static phandle_t ofw_real_child(ofw_t ofw, phandle_t node) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -348,7 +348,7 @@ ofw_real_child(ofw_t ofw, phandle_t node static phandle_t ofw_real_parent(ofw_t ofw, phandle_t node) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -370,7 +370,7 @@ ofw_real_parent(ofw_t ofw, phandle_t nod static phandle_t ofw_real_instance_to_package(ofw_t ofw, ihandle_t instance) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -392,7 +392,7 @@ ofw_real_instance_to_package(ofw_t ofw, static ssize_t ofw_real_getproplen(ofw_t ofw, phandle_t package, const char *propname) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -422,7 +422,7 @@ static ssize_t ofw_real_getprop(ofw_t ofw, phandle_t package, const char *propname, void *buf, size_t buflen) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -458,7 +458,7 @@ static int ofw_real_nextprop(ofw_t ofw, phandle_t package, const char *previous, char *buf, size_t size) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -493,7 +493,7 @@ static int ofw_real_setprop(ofw_t ofw, phandle_t package, const char *propname, const void *buf, size_t len) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -526,7 +526,7 @@ ofw_real_setprop(ofw_t ofw, phandle_t pa static ssize_t ofw_real_canon(ofw_t ofw, const char *device, char *buf, size_t len) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -559,7 +559,7 @@ ofw_real_canon(ofw_t ofw, const char *de static phandle_t ofw_real_finddevice(ofw_t ofw, const char *device) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -586,7 +586,7 @@ ofw_real_finddevice(ofw_t ofw, const cha static ssize_t ofw_real_instance_to_path(ofw_t ofw, ihandle_t instance, char *buf, size_t len) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -619,7 +619,7 @@ ofw_real_instance_to_path(ofw_t ofw, iha static ssize_t ofw_real_package_to_path(ofw_t ofw, phandle_t package, char *buf, size_t len) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -653,7 +653,7 @@ static int ofw_real_call_method(ofw_t ofw, ihandle_t instance, const char *method, int nargs, int nreturns, unsigned long *args_and_returns) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -701,7 +701,7 @@ ofw_real_call_method(ofw_t ofw, ihandle_ static ihandle_t ofw_real_open(ofw_t ofw, const char *device) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -729,7 +729,7 @@ ofw_real_open(ofw_t ofw, const char *dev static void ofw_real_close(ofw_t ofw, ihandle_t instance) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -737,6 +737,7 @@ ofw_real_close(ofw_t ofw, ihandle_t inst } args = { (cell_t)"close", 1, + 0, }; args.instance = instance; @@ -747,7 +748,7 @@ ofw_real_close(ofw_t ofw, ihandle_t inst static ssize_t ofw_real_read(ofw_t ofw, ihandle_t instance, void *addr, size_t len) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -780,7 +781,7 @@ ofw_real_read(ofw_t ofw, ihandle_t insta static ssize_t ofw_real_write(ofw_t ofw, ihandle_t instance, const void *addr, size_t len) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -811,7 +812,7 @@ ofw_real_write(ofw_t ofw, ihandle_t inst static int ofw_real_seek(ofw_t ofw, ihandle_t instance, u_int64_t pos) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -841,7 +842,7 @@ ofw_real_seek(ofw_t ofw, ihandle_t insta static caddr_t ofw_real_claim(ofw_t ofw, void *virt, size_t size, u_int align) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -867,7 +868,7 @@ ofw_real_claim(ofw_t ofw, void *virt, si static void ofw_real_release(ofw_t ofw, void *virt, size_t size) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; @@ -876,6 +877,7 @@ ofw_real_release(ofw_t ofw, void *virt, } args = { (cell_t)"release", 2, + 0, }; args.virt = (cell_t)virt; @@ -891,12 +893,14 @@ ofw_real_release(ofw_t ofw, void *virt, static void ofw_real_enter(ofw_t ofw) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; } args = { (cell_t)"enter", + 0, + 0, }; openfirmware(&args); @@ -907,12 +911,14 @@ ofw_real_enter(ofw_t ofw) static void ofw_real_exit(ofw_t ofw) { - static struct { + struct { cell_t name; cell_t nargs; cell_t nreturns; } args = { (cell_t)"exit", + 0, + 0, }; openfirmware(&args); Modified: user/imp/tbemd/sys/powerpc/ofw/ofw_syscons.c ============================================================================== --- user/imp/tbemd/sys/powerpc/ofw/ofw_syscons.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/ofw/ofw_syscons.c Mon Apr 12 23:16:01 2010 (r206524) @@ -55,10 +55,10 @@ __FBSDID("$FreeBSD$"); #include <dev/ofw/ofw_pci.h> #include <powerpc/ofw/ofw_syscons.h> -static int ofwfb_ignore_mmap_checks; +static int ofwfb_ignore_mmap_checks = 1; SYSCTL_NODE(_hw, OID_AUTO, ofwfb, CTLFLAG_RD, 0, "ofwfb"); SYSCTL_INT(_hw_ofwfb, OID_AUTO, relax_mmap, CTLFLAG_RW, - &ofwfb_ignore_mmap_checks, 0, "relax mmap bounds checking"); + &ofwfb_ignore_mmap_checks, 0, "relaxed mmap bounds checking"); extern u_char dflt_font_16[]; extern u_char dflt_font_14[]; Modified: user/imp/tbemd/sys/powerpc/powermac/cuda.c ============================================================================== --- user/imp/tbemd/sys/powerpc/powermac/cuda.c Mon Apr 12 23:14:06 2010 (r206523) +++ user/imp/tbemd/sys/powerpc/powermac/cuda.c Mon Apr 12 23:16:01 2010 (r206524) @@ -37,6 +37,7 @@ __FBSDID("$FreeBSD$"); #include <sys/bus.h> #include <sys/conf.h> #include <sys/kernel.h> +#include <sys/clock.h> #include <dev/ofw/ofw_bus.h> #include <dev/ofw/openfirm.h> @@ -55,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include <dev/adb/adb.h> +#include "clock_if.h" #include "cudavar.h" #include "viareg.h" @@ -72,6 +74,12 @@ static u_int cuda_poll(device_t dev); static void cuda_send_inbound(struct cuda_softc *sc); static void cuda_send_outbound(struct cuda_softc *sc); +/* + * Clock interface + */ +static int cuda_gettime(device_t dev, struct timespec *ts); +static int cuda_settime(device_t dev, struct timespec *ts); + static device_method_t cuda_methods[] = { /* Device interface */ DEVMETHOD(device_probe, cuda_probe), @@ -90,6 +98,10 @@ static device_method_t cuda_methods[] = DEVMETHOD(adb_hb_controller_poll, cuda_poll), DEVMETHOD(adb_hb_set_autopoll_mask, cuda_adb_autopoll), + /* Clock interface */ + DEVMETHOD(clock_gettime, cuda_gettime), + DEVMETHOD(clock_settime, cuda_settime), + { 0, 0 }, }; @@ -173,6 +185,7 @@ cuda_attach(device_t dev) sc->sc_polling = 0; sc->sc_state = CUDA_NOTREADY; sc->sc_autopoll = 0; + sc->sc_rtc = -1; *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004122316.o3CNG2Ys070511>