From owner-p4-projects@FreeBSD.ORG Mon Jul 3 10:34:21 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 74DC416A602; Mon, 3 Jul 2006 10:34:20 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id DCC9116A5B9 for ; Mon, 3 Jul 2006 10:34:19 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6D8FD43D53 for ; Mon, 3 Jul 2006 10:33:54 +0000 (GMT) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k63AXsbm069206 for ; Mon, 3 Jul 2006 10:33:54 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k63AXkMS069202 for perforce@freebsd.org; Mon, 3 Jul 2006 10:33:46 GMT (envelope-from piso@freebsd.org) Date: Mon, 3 Jul 2006 10:33:46 GMT Message-Id: <200607031033.k63AXkMS069202@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to piso@freebsd.org using -f From: Paolo Pisati To: Perforce Change Reviews Cc: Subject: PERFORCE change 100484 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Jul 2006 10:34:22 -0000 http://perforce.freebsd.org/chv.cgi?CH=100484 Change 100484 by piso@piso_newluxor on 2006/07/03 10:32:54 IFC Affected files ... .. //depot/projects/soc2006/intr_filter/amd64/amd64/pmap.c#4 integrate .. //depot/projects/soc2006/intr_filter/amd64/conf/GENERIC#3 integrate .. //depot/projects/soc2006/intr_filter/amd64/conf/NOTES#3 integrate .. //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_proto.h#4 integrate .. //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_syscall.h#4 integrate .. //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_sysent.c#4 integrate .. //depot/projects/soc2006/intr_filter/amd64/linux32/syscalls.master#4 integrate .. //depot/projects/soc2006/intr_filter/arm/arm/elf_trampoline.c#4 integrate .. //depot/projects/soc2006/intr_filter/arm/arm/locore.S#2 integrate .. //depot/projects/soc2006/intr_filter/arm/at91/at91_pio.c#4 integrate .. //depot/projects/soc2006/intr_filter/arm/at91/at91_pio_rm9200.h#1 branch .. //depot/projects/soc2006/intr_filter/arm/at91/at91_piovar.h#1 branch .. //depot/projects/soc2006/intr_filter/arm/at91/files.at91#2 integrate .. //depot/projects/soc2006/intr_filter/arm/at91/uart_dev_at91usart.c#2 integrate .. //depot/projects/soc2006/intr_filter/cam/cam_xpt.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_proto.h#2 integrate .. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_syscall.h#2 integrate .. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_syscalls.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_sysent.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/freebsd32/syscalls.master#2 integrate .. //depot/projects/soc2006/intr_filter/compat/linprocfs/linprocfs.c#3 integrate .. //depot/projects/soc2006/intr_filter/compat/linux/linux_ipc.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/linux/linux_misc.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/linux/linux_util.h#2 integrate .. //depot/projects/soc2006/intr_filter/compat/ndis/kern_ndis.c#3 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/Makefile#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_ipc.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_misc.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_proto.h#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_syscall.h#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_syscallnames.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/svr4_sysent.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/svr4/syscalls.master#2 integrate .. //depot/projects/soc2006/intr_filter/conf/NOTES#4 integrate .. //depot/projects/soc2006/intr_filter/conf/files#3 integrate .. //depot/projects/soc2006/intr_filter/conf/files.amd64#2 integrate .. //depot/projects/soc2006/intr_filter/conf/files.i386#2 integrate .. //depot/projects/soc2006/intr_filter/conf/files.ia64#2 integrate .. //depot/projects/soc2006/intr_filter/conf/kern.mk#2 integrate .. //depot/projects/soc2006/intr_filter/conf/kern.pre.mk#2 integrate .. //depot/projects/soc2006/intr_filter/conf/kmod.mk#2 integrate .. //depot/projects/soc2006/intr_filter/conf/options#3 integrate .. //depot/projects/soc2006/intr_filter/dev/acpica/acpi_dock.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/ata/ata-all.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/ata/ata-chipset.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/ata/atapi-cd.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/ath/if_ath.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/ath/if_athioctl.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/ath/if_athvar.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/bge/if_bge.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/bge/if_bgereg.h#3 integrate .. //depot/projects/soc2006/intr_filter/dev/bktr/CHANGELOG.TXT#2 integrate .. //depot/projects/soc2006/intr_filter/dev/isp/isp.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/isp/isp_pci.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/isp/ispmbox.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/isp/ispreg.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/isp/ispvar.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/ispfw/asm_2322.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/ispfw/ispfw.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mfi/mfi.c#5 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/acphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/amphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/bmtphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/brgphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/ciphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/e1000phy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/exphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/inphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/lxtphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/mlphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/nsgphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/nsphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/pnaphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/qsphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/rgephy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/rlphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/ruephy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/tdkphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/tlphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/ukphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/xmphy.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mpt/mpt.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mpt/mpt.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/mpt/mpt_cam.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/mpt/mpt_pci.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/nfe/if_nfe.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/nfe/if_nfereg.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/nfe/if_nfevar.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/puc/puc.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/puc/puc_cfg.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/puc/puc_pccard.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/puc/puc_pci.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/puc/pucdata.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/re/if_re.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/sio/sio.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/if_ural.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/uplcom.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/usbdevs#3 integrate .. //depot/projects/soc2006/intr_filter/fs/pseudofs/pseudofs_vnops.c#2 integrate .. //depot/projects/soc2006/intr_filter/fs/udf/udf_vfsops.c#2 integrate .. //depot/projects/soc2006/intr_filter/geom/geom_gpt.c#2 integrate .. //depot/projects/soc2006/intr_filter/i386/conf/GENERIC#4 integrate .. //depot/projects/soc2006/intr_filter/i386/conf/NOTES#3 integrate .. //depot/projects/soc2006/intr_filter/i386/conf/XBOX#3 integrate .. //depot/projects/soc2006/intr_filter/i386/i386/pmap.c#4 integrate .. //depot/projects/soc2006/intr_filter/i386/linux/linux_proto.h#4 integrate .. //depot/projects/soc2006/intr_filter/i386/linux/linux_syscall.h#4 integrate .. //depot/projects/soc2006/intr_filter/i386/linux/linux_sysent.c#4 integrate .. //depot/projects/soc2006/intr_filter/i386/linux/syscalls.master#4 integrate .. //depot/projects/soc2006/intr_filter/ia64/conf/GENERIC#3 integrate .. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm.h#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_decode.c#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_extract.c#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_format.c#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/disasm/disasm_int.h#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/ia64/emulate.c#1 branch .. //depot/projects/soc2006/intr_filter/ia64/ia64/machdep.c#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/ia64/pmap.c#3 integrate .. //depot/projects/soc2006/intr_filter/ia64/ia64/trap.c#2 integrate .. //depot/projects/soc2006/intr_filter/ia64/include/md_var.h#2 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_descrip.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_fork.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_ktrace.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_linker.c#4 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_module.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_thread.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/link_elf.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/link_elf_obj.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/sched_4bsd.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/sched_core.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/subr_bus.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/subr_firmware.c#4 integrate .. //depot/projects/soc2006/intr_filter/kern/syscalls.master#2 integrate .. //depot/projects/soc2006/intr_filter/kern/sysv_sem.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/uipc_usrreq.c#4 integrate .. //depot/projects/soc2006/intr_filter/kern/vfs_init.c#3 integrate .. //depot/projects/soc2006/intr_filter/kern/vfs_mount.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/vfs_subr.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/vfs_vnops.c#2 integrate .. //depot/projects/soc2006/intr_filter/modules/Makefile#4 integrate .. //depot/projects/soc2006/intr_filter/modules/bktr/bktr_mem/Makefile#2 integrate .. //depot/projects/soc2006/intr_filter/modules/netgraph/Makefile#2 integrate .. //depot/projects/soc2006/intr_filter/modules/netgraph/tag/Makefile#1 branch .. //depot/projects/soc2006/intr_filter/modules/nfe/Makefile#1 branch .. //depot/projects/soc2006/intr_filter/modules/streams/Makefile#2 integrate .. //depot/projects/soc2006/intr_filter/modules/svr4/Makefile#2 integrate .. //depot/projects/soc2006/intr_filter/net/if.c#4 integrate .. //depot/projects/soc2006/intr_filter/net/if_atmsubr.c#2 integrate .. //depot/projects/soc2006/intr_filter/net/if_enc.c#1 branch .. //depot/projects/soc2006/intr_filter/net/if_gif.c#2 integrate .. //depot/projects/soc2006/intr_filter/net/if_stf.c#2 integrate .. //depot/projects/soc2006/intr_filter/net/if_tun.c#2 integrate .. //depot/projects/soc2006/intr_filter/net/if_types.h#2 integrate .. //depot/projects/soc2006/intr_filter/net/if_vlan.c#3 integrate .. //depot/projects/soc2006/intr_filter/net80211/ieee80211_freebsd.c#3 integrate .. //depot/projects/soc2006/intr_filter/netgraph/ng_tag.c#1 branch .. //depot/projects/soc2006/intr_filter/netgraph/ng_tag.h#1 branch .. //depot/projects/soc2006/intr_filter/netinet/if_ether.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/in_pcb.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/ip_divert.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/ip_fw2.c#3 integrate .. //depot/projects/soc2006/intr_filter/netinet/ip_output.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_input.c#3 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_syncache.c#3 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_usrreq.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_var.h#3 integrate .. //depot/projects/soc2006/intr_filter/netinet6/in6.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet6/in6_cksum.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet6/in6_pcb.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet6/in6_var.h#2 integrate .. //depot/projects/soc2006/intr_filter/netinet6/ipsec.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet6/raw_ip6.c#2 integrate .. //depot/projects/soc2006/intr_filter/netipsec/ipsec.h#2 integrate .. //depot/projects/soc2006/intr_filter/netipsec/ipsec_input.c#2 integrate .. //depot/projects/soc2006/intr_filter/netipsec/ipsec_osdep.h#2 integrate .. //depot/projects/soc2006/intr_filter/netipsec/ipsec_output.c#2 integrate .. //depot/projects/soc2006/intr_filter/netipsec/xform_ipip.c#2 integrate .. //depot/projects/soc2006/intr_filter/nfsclient/bootp_subr.c#2 integrate .. //depot/projects/soc2006/intr_filter/nfsclient/nfs_diskless.c#2 integrate .. //depot/projects/soc2006/intr_filter/nfsserver/nfs_srvcache.c#2 integrate .. //depot/projects/soc2006/intr_filter/nfsserver/nfsrvcache.h#2 integrate .. //depot/projects/soc2006/intr_filter/pc98/conf/GENERIC#3 integrate .. //depot/projects/soc2006/intr_filter/pci/agp_i810.c#2 integrate .. //depot/projects/soc2006/intr_filter/pci/if_rlreg.h#2 integrate .. //depot/projects/soc2006/intr_filter/powerpc/conf/GENERIC#3 integrate .. //depot/projects/soc2006/intr_filter/powerpc/powerpc/mmu_oea.c#4 integrate .. //depot/projects/soc2006/intr_filter/sparc64/conf/GENERIC#3 integrate .. //depot/projects/soc2006/intr_filter/sys/gpt.h#2 integrate .. //depot/projects/soc2006/intr_filter/sys/rwlock.h#2 integrate .. //depot/projects/soc2006/intr_filter/sys/sx.h#2 integrate .. //depot/projects/soc2006/intr_filter/sys/syscallsubr.h#3 integrate .. //depot/projects/soc2006/intr_filter/vm/vm_mmap.c#2 integrate .. //depot/projects/soc2006/intr_filter/vm/vm_page.c#2 integrate .. //depot/projects/soc2006/intr_filter/vm/vm_pageq.c#2 integrate Differences ... ==== //depot/projects/soc2006/intr_filter/amd64/amd64/pmap.c#4 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.558 2006/06/20 20:52:10 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.563 2006/07/02 18:22:46 alc Exp $"); /* * Manages physical address maps. @@ -490,8 +490,7 @@ * (physical) address starting relative to 0] */ void -pmap_bootstrap(firstaddr) - vm_paddr_t *firstaddr; +pmap_bootstrap(vm_paddr_t *firstaddr) { vm_offset_t va; pt_entry_t *pte, *unused; @@ -1132,8 +1131,7 @@ } void -pmap_pinit0(pmap) - struct pmap *pmap; +pmap_pinit0(pmap_t pmap) { PMAP_LOCK_INIT(pmap); @@ -1148,8 +1146,7 @@ * such as one in a vmspace structure. */ void -pmap_pinit(pmap) - register struct pmap *pmap; +pmap_pinit(pmap_t pmap) { vm_page_t pml4pg; static vm_pindex_t color; @@ -1611,9 +1608,9 @@ vm_page_flag_clear(m, PG_WRITEABLE); m->md.pv_list_count--; pmap_unuse_pt(pmap, va, ptepde); + free_pv_entry(pmap, pv); if (pmap != locked_pmap) PMAP_UNLOCK(pmap); - free_pv_entry(locked_pmap, pv); } } } @@ -1979,7 +1976,7 @@ void pmap_remove_all(vm_page_t m) { - register pv_entry_t pv; + pv_entry_t pv; pmap_t pmap; pt_entry_t *pte, tpte; pd_entry_t ptepde; @@ -2145,7 +2142,7 @@ { vm_paddr_t pa; pd_entry_t *pde; - register pt_entry_t *pte; + pt_entry_t *pte; vm_paddr_t opa; pt_entry_t origpte, newpte; vm_page_t mpte, om; @@ -2582,12 +2579,9 @@ * The mapping must already exist in the pmap. */ void -pmap_change_wiring(pmap, va, wired) - register pmap_t pmap; - vm_offset_t va; - boolean_t wired; +pmap_change_wiring(pmap_t pmap, vm_offset_t va, boolean_t wired) { - register pt_entry_t *pte; + pt_entry_t *pte; /* * Wiring is not a hardware characteristic so there is no need to @@ -2674,7 +2668,7 @@ PHYS_TO_DMAP(VM_PAGE_TO_PHYS(dstmpde)); pde = &pde[pmap_pde_index(addr)]; if (*pde == 0) { - *pde = srcptepaddr; + *pde = srcptepaddr & ~PG_W; dst_pmap->pm_stats.resident_count += NBPDR / PAGE_SIZE; } else @@ -2697,11 +2691,6 @@ * we only virtual copy managed pages */ if ((ptetemp & PG_MANAGED) != 0) { - /* - * We have to check after allocpte for the - * pte still being around... allocpte can - * block. - */ dstmpte = pmap_allocpte(dst_pmap, addr, M_NOWAIT); if (dstmpte == NULL) @@ -2713,14 +2702,16 @@ pmap_try_insert_pv_entry(dst_pmap, addr, PHYS_TO_VM_PAGE(ptetemp & PG_FRAME))) { /* - * Clear the modified and + * Clear the wired, modified, and * accessed (referenced) bits * during the copy. */ - *dst_pte = ptetemp & ~(PG_M | PG_A); + *dst_pte = ptetemp & ~(PG_W | PG_M | + PG_A); dst_pmap->pm_stats.resident_count++; } else - pmap_unwire_pte_hold(dst_pmap, addr, dstmpte); + pmap_unwire_pte_hold(dst_pmap, addr, + dstmpte); if (dstmpte->wire_count >= srcmpte->wire_count) break; } @@ -2799,9 +2790,7 @@ * subset of pmaps for proper page aging. */ boolean_t -pmap_page_exists_quick(pmap, m) - pmap_t pmap; - vm_page_t m; +pmap_page_exists_quick(pmap_t pmap, vm_page_t m) { pv_entry_t pv; int loops = 0; @@ -2985,7 +2974,7 @@ static __inline void pmap_clear_ptes(vm_page_t m, long bit) { - register pv_entry_t pv; + pv_entry_t pv; pmap_t pmap; pt_entry_t pbits, *pte; @@ -3055,35 +3044,26 @@ int pmap_ts_referenced(vm_page_t m) { - register pv_entry_t pv, pvf, pvn; + pv_entry_t pv, pvf, pvn; pmap_t pmap; pt_entry_t *pte; - pt_entry_t v; int rtval = 0; if (m->flags & PG_FICTITIOUS) return (rtval); - mtx_assert(&vm_page_queue_mtx, MA_OWNED); if ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { - pvf = pv; - do { pvn = TAILQ_NEXT(pv, pv_list); - TAILQ_REMOVE(&m->md.pv_list, pv, pv_list); - TAILQ_INSERT_TAIL(&m->md.pv_list, pv, pv_list); - pmap = PV_PMAP(pv); PMAP_LOCK(pmap); pte = pmap_pte(pmap, pv->pv_va); - - if (pte && ((v = pte_load(pte)) & PG_A) != 0) { + if (pte != NULL && (*pte & PG_A) != 0) { atomic_clear_long(pte, PG_A); pmap_invalidate_page(pmap, pv->pv_va); - rtval++; if (rtval > 4) { PMAP_UNLOCK(pmap); @@ -3093,7 +3073,6 @@ PMAP_UNLOCK(pmap); } while ((pv = pvn) != NULL && pv != pvf); } - return (rtval); } @@ -3128,9 +3107,7 @@ * NOT real memory. */ void * -pmap_mapdev(pa, size) - vm_paddr_t pa; - vm_size_t size; +pmap_mapdev(vm_paddr_t pa, vm_size_t size) { vm_offset_t va, tmpva, offset; @@ -3154,9 +3131,7 @@ } void -pmap_unmapdev(va, size) - vm_offset_t va; - vm_size_t size; +pmap_unmapdev(vm_offset_t va, vm_size_t size) { vm_offset_t base, offset, tmpva; @@ -3176,9 +3151,7 @@ * perform the pmap work for mincore */ int -pmap_mincore(pmap, addr) - pmap_t pmap; - vm_offset_t addr; +pmap_mincore(pmap_t pmap, vm_offset_t addr) { pt_entry_t *ptep, pte; vm_page_t m; ==== //depot/projects/soc2006/intr_filter/amd64/conf/GENERIC#3 (text+ko) ==== @@ -16,7 +16,7 @@ # If you are in doubt as to the purpose or necessity of a line, check first # in NOTES. # -# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.460 2006/06/15 19:58:52 netchild Exp $ +# $FreeBSD: src/sys/amd64/conf/GENERIC,v 1.462 2006/06/26 22:03:20 babkin Exp $ cpu HAMMER ident GENERIC ==== //depot/projects/soc2006/intr_filter/amd64/conf/NOTES#3 (text+ko) ==== @@ -4,7 +4,7 @@ # This file contains machine dependent kernel configuration notes. For # machine independent notes, look in /sys/conf/NOTES. # -# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.56 2006/06/12 20:38:17 jhb Exp $ +# $FreeBSD: src/sys/amd64/conf/NOTES,v 1.57 2006/06/26 23:41:06 obrien Exp $ # # @@ -223,6 +223,7 @@ # (requires miibus) # ipw: Intel PRO/Wireless 2100 IEEE 802.11 adapter # iwi: Intel PRO/Wireless 2200BG/2225BG/2915ABG IEEE 802.11 adapters +# nfe: nVidia nForce MCP on-board Ethernet Networking (BSD open source) # nve: nVidia nForce MCP on-board Ethernet Networking # ral: Ralink Technology IEEE 802.11 wireless adapter # ural: Ralink Technology RT2500USB IEEE 802.11 wireless adapter @@ -233,6 +234,7 @@ options ED_SIC device iwi device ipw +device nfe # nVidia nForce MCP on-board Ethernet Networking device nve # nVidia nForce MCP on-board Ethernet Networking device ral device ural ==== //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_proto.h#4 (text+ko) ==== @@ -2,8 +2,8 @@ * System call prototypes. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.13 2006/06/20 20:41:28 netchild Exp $ - * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp + * $FreeBSD: src/sys/amd64/linux32/linux32_proto.h,v 1.16 2006/06/27 18:32:16 jhb Exp $ + * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp */ #ifndef _LINUX_SYSPROTO_H_ ==== //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_syscall.h#4 (text+ko) ==== @@ -2,8 +2,8 @@ * System call numbers. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.13 2006/06/20 20:41:28 netchild Exp $ - * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp + * $FreeBSD: src/sys/amd64/linux32/linux32_syscall.h,v 1.16 2006/06/27 18:32:16 jhb Exp $ + * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp */ #define LINUX_SYS_exit 1 ==== //depot/projects/soc2006/intr_filter/amd64/linux32/linux32_sysent.c#4 (text+ko) ==== @@ -2,8 +2,8 @@ * System call switch table. * * DO NOT EDIT-- this file is automatically generated. - * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.13 2006/06/20 20:41:28 netchild Exp $ - * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp + * $FreeBSD: src/sys/amd64/linux32/linux32_sysent.c,v 1.16 2006/06/27 18:32:16 jhb Exp $ + * created from FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp */ #include @@ -41,8 +41,8 @@ { SYF_MPSAFE | AS(linux_stat_args), (sy_call_t *)linux_stat, AUE_STAT }, /* 18 = linux_stat */ { SYF_MPSAFE | AS(linux_lseek_args), (sy_call_t *)linux_lseek, AUE_LSEEK }, /* 19 = linux_lseek */ { SYF_MPSAFE | 0, (sy_call_t *)linux_getpid, AUE_GETPID }, /* 20 = linux_getpid */ - { AS(linux_mount_args), (sy_call_t *)linux_mount, AUE_MOUNT }, /* 21 = linux_mount */ - { AS(linux_oldumount_args), (sy_call_t *)linux_oldumount, AUE_UMOUNT }, /* 22 = linux_oldumount */ + { SYF_MPSAFE | AS(linux_mount_args), (sy_call_t *)linux_mount, AUE_MOUNT }, /* 21 = linux_mount */ + { SYF_MPSAFE | AS(linux_oldumount_args), (sy_call_t *)linux_oldumount, AUE_UMOUNT }, /* 22 = linux_oldumount */ { SYF_MPSAFE | AS(linux_setuid16_args), (sy_call_t *)linux_setuid16, AUE_SETUID }, /* 23 = linux_setuid16 */ { SYF_MPSAFE | 0, (sy_call_t *)linux_getuid16, AUE_GETUID }, /* 24 = linux_getuid16 */ { SYF_MPSAFE | 0, (sy_call_t *)linux_stime, AUE_SETTIMEOFDAY }, /* 25 = linux_stime */ @@ -65,14 +65,14 @@ { SYF_MPSAFE | AS(linux_pipe_args), (sy_call_t *)linux_pipe, AUE_PIPE }, /* 42 = linux_pipe */ { SYF_MPSAFE | AS(linux_times_args), (sy_call_t *)linux_times, AUE_NULL }, /* 43 = linux_times */ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 44 = prof */ - { AS(linux_brk_args), (sy_call_t *)linux_brk, AUE_NULL }, /* 45 = linux_brk */ + { SYF_MPSAFE | AS(linux_brk_args), (sy_call_t *)linux_brk, AUE_NULL }, /* 45 = linux_brk */ { SYF_MPSAFE | AS(linux_setgid16_args), (sy_call_t *)linux_setgid16, AUE_SETGID }, /* 46 = linux_setgid16 */ { SYF_MPSAFE | 0, (sy_call_t *)linux_getgid16, AUE_GETGID }, /* 47 = linux_getgid16 */ { SYF_MPSAFE | AS(linux_signal_args), (sy_call_t *)linux_signal, AUE_NULL }, /* 48 = linux_signal */ { SYF_MPSAFE | 0, (sy_call_t *)linux_geteuid16, AUE_GETEUID }, /* 49 = linux_geteuid16 */ { SYF_MPSAFE | 0, (sy_call_t *)linux_getegid16, AUE_GETEGID }, /* 50 = linux_getegid16 */ { SYF_MPSAFE | AS(acct_args), (sy_call_t *)acct, AUE_ACCT }, /* 51 = acct */ - { AS(linux_umount_args), (sy_call_t *)linux_umount, AUE_UMOUNT }, /* 52 = linux_umount */ + { SYF_MPSAFE | AS(linux_umount_args), (sy_call_t *)linux_umount, AUE_UMOUNT }, /* 52 = linux_umount */ { 0, (sy_call_t *)nosys, AUE_NULL }, /* 53 = lock */ { AS(linux_ioctl_args), (sy_call_t *)linux_ioctl, AUE_IOCTL }, /* 54 = linux_ioctl */ { SYF_MPSAFE | AS(linux_fcntl_args), (sy_call_t *)linux_fcntl, AUE_FCNTL }, /* 55 = linux_fcntl */ @@ -137,7 +137,7 @@ { SYF_MPSAFE | AS(linux_wait4_args), (sy_call_t *)linux_wait4, AUE_WAIT4 }, /* 114 = linux_wait4 */ { SYF_MPSAFE | 0, (sy_call_t *)linux_swapoff, AUE_SWAPOFF }, /* 115 = linux_swapoff */ { SYF_MPSAFE | AS(linux_sysinfo_args), (sy_call_t *)linux_sysinfo, AUE_NULL }, /* 116 = linux_sysinfo */ - { AS(linux_ipc_args), (sy_call_t *)linux_ipc, AUE_NULL }, /* 117 = linux_ipc */ + { SYF_MPSAFE | AS(linux_ipc_args), (sy_call_t *)linux_ipc, AUE_NULL }, /* 117 = linux_ipc */ { SYF_MPSAFE | AS(fsync_args), (sy_call_t *)fsync, AUE_FSYNC }, /* 118 = fsync */ { SYF_MPSAFE | AS(linux_sigreturn_args), (sy_call_t *)linux_sigreturn, AUE_SIGRETURN }, /* 119 = linux_sigreturn */ { SYF_MPSAFE | AS(linux_clone_args), (sy_call_t *)linux_clone, AUE_RFORK }, /* 120 = linux_clone */ ==== //depot/projects/soc2006/intr_filter/amd64/linux32/syscalls.master#4 (text+ko) ==== @@ -1,4 +1,4 @@ - $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.11 2006/06/20 20:38:44 netchild Exp $ + $FreeBSD: src/sys/amd64/linux32/syscalls.master,v 1.14 2006/06/27 18:28:49 jhb Exp $ ; @(#)syscalls.master 8.1 (Berkeley) 7/19/93 ; System call name/number master file (or rather, slave, from LINUX). @@ -75,10 +75,10 @@ 19 AUE_LSEEK MSTD { int linux_lseek(l_uint fdes, l_off_t off, \ l_int whence); } 20 AUE_GETPID MSTD { int linux_getpid(void); } -21 AUE_MOUNT STD { int linux_mount(char *specialfile, \ +21 AUE_MOUNT MSTD { int linux_mount(char *specialfile, \ char *dir, char *filesystemtype, \ l_ulong rwflag, void *data); } -22 AUE_UMOUNT STD { int linux_oldumount(char *path); } +22 AUE_UMOUNT MSTD { int linux_oldumount(char *path); } 23 AUE_SETUID MSTD { int linux_setuid16(l_uid16_t uid); } 24 AUE_GETUID MSTD { int linux_getuid16(void); } 25 AUE_SETTIMEOFDAY MSTD { int linux_stime(void); } @@ -103,7 +103,7 @@ 42 AUE_PIPE MSTD { int linux_pipe(l_ulong *pipefds); } 43 AUE_NULL MSTD { int linux_times(struct l_times_argv *buf); } 44 AUE_NULL UNIMPL prof -45 AUE_NULL STD { int linux_brk(l_ulong dsend); } +45 AUE_NULL MSTD { int linux_brk(l_ulong dsend); } 46 AUE_SETGID MSTD { int linux_setgid16(l_gid16_t gid); } 47 AUE_GETGID MSTD { int linux_getgid16(void); } 48 AUE_NULL MSTD { int linux_signal(l_int sig, \ @@ -111,7 +111,7 @@ 49 AUE_GETEUID MSTD { int linux_geteuid16(void); } 50 AUE_GETEGID MSTD { int linux_getegid16(void); } 51 AUE_ACCT MNOPROTO { int acct(char *path); } -52 AUE_UMOUNT STD { int linux_umount(char *path, l_int flags); } +52 AUE_UMOUNT MSTD { int linux_umount(char *path, l_int flags); } 53 AUE_NULL UNIMPL lock 54 AUE_IOCTL STD { int linux_ioctl(l_uint fd, l_uint cmd, \ uintptr_t arg); } @@ -212,7 +212,7 @@ struct l_rusage *rusage); } 115 AUE_SWAPOFF MSTD { int linux_swapoff(void); } 116 AUE_NULL MSTD { int linux_sysinfo(struct l_sysinfo *info); } -117 AUE_NULL STD { int linux_ipc(l_uint what, l_int arg1, \ +117 AUE_NULL MSTD { int linux_ipc(l_uint what, l_int arg1, \ l_int arg2, l_int arg3, void *ptr, \ l_long arg5); } 118 AUE_FSYNC MNOPROTO { int fsync(int fd); } ==== //depot/projects/soc2006/intr_filter/arm/arm/elf_trampoline.c#4 (text+ko) ==== @@ -23,7 +23,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/arm/elf_trampoline.c,v 1.8 2006/06/18 22:46:30 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/elf_trampoline.c,v 1.11 2006/06/23 22:45:35 cognet Exp $"); #include #include #include @@ -131,6 +131,8 @@ } } +static void arm9_setup(void); + void _start(void) { @@ -174,7 +176,6 @@ __start(); } -#ifdef KZIP static void get_cachetype_cp15() { @@ -255,6 +256,7 @@ } +#ifdef KZIP static unsigned char *orig_input, *i_input, *i_output; @@ -348,8 +350,8 @@ int d) { Elf32_Ehdr *eh; - Elf32_Phdr phdr[512] /* XXX */, *php; - Elf32_Shdr shdr[512] /* XXX */; + Elf32_Phdr phdr[64] /* XXX */, *php; + Elf32_Shdr shdr[64] /* XXX */; int i,j; void *entry_point; int symtabindex = -1; ==== //depot/projects/soc2006/intr_filter/arm/arm/locore.S#2 (text+ko) ==== @@ -37,9 +37,9 @@ #include #include #include -__FBSDID("$FreeBSD: src/sys/arm/arm/locore.S,v 1.13 2005/12/21 15:02:31 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/locore.S,v 1.14 2006/06/21 23:47:25 imp Exp $"); -/* What size should this really be ? It is only used by init_arm() */ +/* What size should this really be ? It is only used by initarm() */ #define INIT_ARM_STACK_SIZE 2048 /* ==== //depot/projects/soc2006/intr_filter/arm/at91/at91_pio.c#4 (text) ==== @@ -23,7 +23,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/at91/at91_pio.c,v 1.1 2006/03/24 07:39:29 imp Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/at91_pio.c,v 1.2 2006/07/02 03:50:44 imp Exp $"); #include #include @@ -38,7 +38,9 @@ #include #include +#include #include +#include struct at91_pio_softc { @@ -103,7 +105,26 @@ static int at91_pio_probe(device_t dev) { - device_set_desc(dev, "PIO"); + const char *name; + + switch (device_get_unit(dev)) { + case 0: + name = "PIOA"; + break; + case 1: + name = "PIOB"; + break; + case 2: + name = "PIOC"; + break; + case 3: + name = "PIOD"; + break; + default: + name = "PIO"; + break; + } + device_set_desc(dev, name); return (0); } @@ -118,6 +139,9 @@ if (err) goto out; + device_printf(dev, "ABSR: %#x OSR: %#x PSR:%#x ODSR: %#x\n", + RD4(sc, PIO_ABSR), RD4(sc, PIO_OSR), RD4(sc, PIO_PSR), + RD4(sc, PIO_ODSR)); AT91_PIO_LOCK_INIT(sc); /* @@ -250,6 +274,69 @@ return (ENXIO); } +/* + * The following functions are called early in the boot process, so + * don't use bus_space, as that isn't yet available when we need to use + * them. + */ +void +at91_pio_use_periph_a(uint32_t pio, uint32_t periph_a_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_ASR / 4] = periph_a_mask; + PIO[PIO_PDR / 4] = periph_a_mask; +} + +void +at91_pio_use_periph_b(uint32_t pio, uint32_t periph_b_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_BSR / 4] = periph_b_mask; + PIO[PIO_PDR / 4] = periph_b_mask; +} + +void +at91_pio_use_gpio(uint32_t pio, uint32_t gpio_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_PER / 4] = gpio_mask; +} + +void +at91_pio_gpio_input(uint32_t pio, uint32_t input_enable_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_ODR / 4] = input_enable_mask; +} + +void +at91_pio_gpio_output(uint32_t pio, uint32_t output_enable_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_OER / 4] = output_enable_mask; +} + +void +at91_pio_gpio_set(uint32_t pio, uint32_t data_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_SODR / 4] = data_mask; +} + +void +at91_pio_gpio_clear(uint32_t pio, uint32_t data_mask) +{ + uint32_t *PIO = (uint32_t *)(AT91RM92_BASE + pio); + + PIO[PIO_CODR / 4] = data_mask; +} + static device_method_t at91_pio_methods[] = { /* Device interface */ DEVMETHOD(device_probe, at91_pio_probe), ==== //depot/projects/soc2006/intr_filter/arm/at91/files.at91#2 (text) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/arm/at91/files.at91,v 1.3 2006/03/24 07:36:23 imp Exp $ +# $FreeBSD: src/sys/arm/at91/files.at91,v 1.5 2006/06/23 23:07:11 cognet Exp $ arm/arm/cpufunc_asm_arm9.S standard arm/arm/irq_dispatch.S standard arm/at91/at91.c standard ==== //depot/projects/soc2006/intr_filter/arm/at91/uart_dev_at91usart.c#2 (text) ==== @@ -26,7 +26,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/arm/at91/uart_dev_at91usart.c,v 1.6 2006/05/13 23:41:16 cognet Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/at91/uart_dev_at91usart.c,v 1.7 2006/07/02 03:45:33 imp Exp $"); #include #include @@ -45,19 +45,29 @@ #include "uart_if.h" +#define DEFAULT_RCLK AT91C_MASTER_CLOCK +#define USART_BUFFER_SIZE 128 + /* * High-level UART interface. */ +struct at91_usart_rx { + bus_addr_t pa; + uint8_t buffer[USART_BUFFER_SIZE]; + bus_dmamap_t map; +}; + struct at91_usart_softc { struct uart_softc base; bus_dma_tag_t dmatag; /* bus dma tag for mbufs */ bus_dmamap_t tx_map; - bus_dmamap_t rx_map; + uint32_t flags; +#define HAS_TIMEOUT 1 + struct at91_usart_rx ping_pong[2]; + struct at91_usart_rx *ping; + struct at91_usart_rx *pong; }; -#define DEFAULT_RCLK AT91C_MASTER_CLOCK -#define USART_BUFFER_SIZE 128 - #define RD4(bas, reg) \ bus_space_read_4((bas)->bst, (bas)->bsh, uart_regofs(bas, reg)) #define WR4(bas, reg, value) \ @@ -72,6 +82,9 @@ } \ } while (0); +#define BAUD2DIVISOR(b) \ + ((((DEFAULT_RCLK * 10) / ((b) * 16)) + 5) / 10) + /* * Low-level UART interface. */ @@ -147,16 +160,19 @@ } /* - * Or in the stop bits. Note: The hardware supports - * 1.5 stop bits in async mode, but there's no way to - * specify that AFAICT. + * Or in the stop bits. Note: The hardware supports 1.5 stop + * bits in async mode, but there's no way to specify that + * AFAICT. Instead, rely on the convention documented at + * http://www.lammertbies.nl/comm/info/RS-232_specs.html which + * states that 1.5 stop bits are used for 5 bit bytes and + * 2 stop bits only for longer bytes. */ - if (stopbits > 1) + if (stopbits == 1) + mr |= USART_MR_NBSTOP_1; + else if (databits > 5) mr |= USART_MR_NBSTOP_2; else - mr |= USART_MR_NBSTOP_2; - /* else if (stopbits == 1.5) - mr |= USART_MR_NBSTOP_1_5; */ + mr |= USART_MR_NBSTOP_1_5; /* * We want normal plumbing mode too, none of this fancy @@ -167,6 +183,13 @@ mr &= ~USART_MR_MSBF; /* lsb first */ mr &= ~USART_MR_CKLO_SCK; /* Don't drive SCK */ + WR4(bas, USART_MR, mr); + + /* + * Set the baud rate + */ + WR4(bas, USART_BRGR, BAUD2DIVISOR(baudrate)); + /* XXX Need to take possible synchronous mode into account */ return (0); } @@ -188,25 +211,19 @@ } /* - * Initialize this device (I think as the console) + * Initialize this device for use as a console. */ static void at91_usart_init(struct uart_bas *bas, int baudrate, int databits, int stopbits, int parity) { - int cr; at91_usart_param(bas, baudrate, databits, stopbits, parity); - /* Turn on rx and tx */ - cr = USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX; - WR4(bas, USART_CR, cr); + /* Reset the rx and tx buffers and turn on rx and tx */ + WR4(bas, USART_CR, USART_CR_RSTSTA | USART_CR_RSTRX | USART_CR_RSTTX); WR4(bas, USART_CR, USART_CR_RXEN | USART_CR_TXEN); - WR4(bas, USART_IER, USART_CSR_TIMEOUT | - USART_CSR_TXRDY | USART_CSR_RXRDY | - USART_CSR_RXBRK | USART_CSR_ENDRX | USART_CSR_ENDTX); - /* Set the receive timeout to be 1.5 character times. */ - WR4(bas, USART_RTOR, 12); + WR4(bas, USART_IDR, 0xffffffff); } /* @@ -227,8 +244,8 @@ at91_usart_putc(struct uart_bas *bas, int c) { - while (!(RD4(bas, USART_CSR) & - USART_CSR_TXRDY)); + while (!(RD4(bas, USART_CSR) & USART_CSR_TXRDY)) + continue; WR4(bas, USART_THR, c); } @@ -252,8 +269,8 @@ { int c; - while (!(RD4(bas, USART_CSR) & USART_CSR_RXRDY)) - ; + while (!(RD4(bas, USART_CSR) & USART_CSR_RXRDY)) + continue; c = RD4(bas, USART_RHR); c &= 0xff; return (c); @@ -291,14 +308,35 @@ return (0); } +#ifndef SKYEYE_WORKAROUNDS +static void +at91_getaddr(void *arg, bus_dma_segment_t *segs, int nsegs, int error) +{ + if (error != 0) + return; + *(bus_addr_t *)arg = segs[0].ds_addr; +} +#endif + static int at91_usart_bus_attach(struct uart_softc *sc) { - int err; + int err, i; + uint32_t cr; struct at91_usart_softc *atsc; atsc = (struct at91_usart_softc *)sc; + /* + * See if we have a TIMEOUT bit. We disable all interrupts to + * minimize interference. + */ + WR4(&sc->sc_bas, USART_IDR, 0xffffffff); + WR4(&sc->sc_bas, USART_IER, USART_CSR_TIMEOUT); + if (RD4(&sc->sc_bas, USART_IMR) & USART_CSR_TIMEOUT) + atsc->flags |= HAS_TIMEOUT; + WR4(&sc->sc_bas, USART_IDR, 0xffffffff); + sc->sc_txfifosz = USART_BUFFER_SIZE; sc->sc_rxfifosz = USART_BUFFER_SIZE; sc->sc_hwiflow = 0; @@ -314,25 +352,62 @@ err = bus_dmamap_create(atsc->dmatag, 0, &atsc->tx_map); if (err != 0) goto errout; - err = bus_dmamap_create(atsc->dmatag, 0, &atsc->rx_map); - if (err != 0) - goto errout; + if (atsc->flags & HAS_TIMEOUT) { + for (i = 0; i < 2; i++) { + err = bus_dmamap_create(atsc->dmatag, 0, + &atsc->ping_pong[i].map); + if (err != 0) + goto errout; + err = bus_dmamap_load(atsc->dmatag, + atsc->ping_pong[i].map, + atsc->ping_pong[i].buffer, sc->sc_rxfifosz, >>> TRUNCATED FOR MAIL (1000 lines) <<<