From owner-p4-projects@FreeBSD.ORG Sat May 5 10:52:20 2007 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 116E116A406; Sat, 5 May 2007 10:52:20 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id BB78B16A403 for ; Sat, 5 May 2007 10:52:19 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [69.147.83.41]) by mx1.freebsd.org (Postfix) with ESMTP id AB67613C447 for ; Sat, 5 May 2007 10:52:19 +0000 (UTC) (envelope-from piso@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.8/8.13.8) with ESMTP id l45AqJIi064532 for ; Sat, 5 May 2007 10:52:19 GMT (envelope-from piso@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.8/8.13.8/Submit) id l45AqHT7064527 for perforce@freebsd.org; Sat, 5 May 2007 10:52:17 GMT (envelope-from piso@freebsd.org) Date: Sat, 5 May 2007 10:52:17 GMT Message-Id: <200705051052.l45AqHT7064527@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 119271 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: Sat, 05 May 2007 10:52:20 -0000 http://perforce.freebsd.org/chv.cgi?CH=119271 Change 119271 by piso@piso_newluxor on 2007/05/05 10:51:55 IFC@119270 Affected files ... .. //depot/projects/soc2006/intr_filter/amd64/amd64/mptable_pci.c#5 integrate .. //depot/projects/soc2006/intr_filter/amd64/amd64/msi.c#3 integrate .. //depot/projects/soc2006/intr_filter/amd64/amd64/nexus.c#8 integrate .. //depot/projects/soc2006/intr_filter/amd64/include/intr_machdep.h#9 integrate .. //depot/projects/soc2006/intr_filter/amd64/pci/pci_bus.c#5 integrate .. //depot/projects/soc2006/intr_filter/arm/xscale/i80321/ep80219_machdep.c#5 integrate .. //depot/projects/soc2006/intr_filter/arm/xscale/i80321/iq31244_machdep.c#7 integrate .. //depot/projects/soc2006/intr_filter/arm/xscale/ixp425/avila_machdep.c#4 integrate .. //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_misc.c#6 integrate .. //depot/projects/soc2006/intr_filter/compat/linprocfs/linprocfs.c#12 integrate .. //depot/projects/soc2006/intr_filter/compat/opensolaris/kern/opensolaris_kobj.c#2 integrate .. //depot/projects/soc2006/intr_filter/compat/opensolaris/kern/opensolaris_vfs.c#2 integrate .. //depot/projects/soc2006/intr_filter/conf/files#18 integrate .. //depot/projects/soc2006/intr_filter/conf/kern.pre.mk#6 integrate .. //depot/projects/soc2006/intr_filter/contrib/opensolaris/uts/common/fs/gfs.c#2 integrate .. //depot/projects/soc2006/intr_filter/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c#2 integrate .. //depot/projects/soc2006/intr_filter/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c#2 integrate .. //depot/projects/soc2006/intr_filter/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c#2 integrate .. //depot/projects/soc2006/intr_filter/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#2 integrate .. //depot/projects/soc2006/intr_filter/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c#2 integrate .. //depot/projects/soc2006/intr_filter/dev/acpica/acpi_pcib_acpi.c#5 integrate .. //depot/projects/soc2006/intr_filter/dev/acpica/acpi_pcib_pci.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/ata/atapi-cam.c#6 integrate .. //depot/projects/soc2006/intr_filter/dev/bce/if_bce.c#14 integrate .. //depot/projects/soc2006/intr_filter/dev/bce/if_bcefw.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/bce/if_bcereg.h#5 integrate .. //depot/projects/soc2006/intr_filter/dev/bge/if_bge.c#17 integrate .. //depot/projects/soc2006/intr_filter/dev/bge/if_bgereg.h#13 integrate .. //depot/projects/soc2006/intr_filter/dev/ciss/ciss.c#7 integrate .. //depot/projects/soc2006/intr_filter/dev/ciss/cissvar.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/em/LICENSE#2 integrate .. //depot/projects/soc2006/intr_filter/dev/em/README#3 integrate .. //depot/projects/soc2006/intr_filter/dev/em/e1000_80003es2lan.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_80003es2lan.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82540.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82541.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82541.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82542.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82543.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82543.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82571.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82571.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82575.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_82575.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_api.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_api.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_defines.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_hw.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_ich8lan.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_ich8lan.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_mac.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_mac.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_manage.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_manage.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_nvm.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_nvm.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_osdep.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_phy.c#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_phy.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/e1000_regs.h#1 branch .. //depot/projects/soc2006/intr_filter/dev/em/if_em.c#20 integrate .. //depot/projects/soc2006/intr_filter/dev/em/if_em.h#9 integrate .. //depot/projects/soc2006/intr_filter/dev/em/if_em_hw.c#5 delete .. //depot/projects/soc2006/intr_filter/dev/em/if_em_hw.h#5 delete .. //depot/projects/soc2006/intr_filter/dev/em/if_em_osdep.h#4 delete .. //depot/projects/soc2006/intr_filter/dev/firewire/firewire.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/firewirereg.h#3 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/fwdev.c#5 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/fwohci.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/fwohcireg.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/if_fwip.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/sbp.c#6 integrate .. //depot/projects/soc2006/intr_filter/dev/firewire/sbp_targ.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/gem/if_gem.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/gem/if_gem_pci.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/gem/if_gemvar.h#3 integrate .. //depot/projects/soc2006/intr_filter/dev/hme/if_hme.c#4 integrate .. //depot/projects/soc2006/intr_filter/dev/ipmi/ipmi_smbios.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/brgphy.c#10 integrate .. //depot/projects/soc2006/intr_filter/dev/mii/mii.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pci.c#13 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pci_if.m#5 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pci_pci.c#7 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pci_private.h#6 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pcib_if.m#4 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pcib_private.h#6 integrate .. //depot/projects/soc2006/intr_filter/dev/pci/pcivar.h#9 integrate .. //depot/projects/soc2006/intr_filter/dev/sound/pci/emu10kx.c#7 integrate .. //depot/projects/soc2006/intr_filter/dev/sound/pci/hda/hdac.c#11 integrate .. //depot/projects/soc2006/intr_filter/dev/sound/pci/hda/hdac_private.h#5 integrate .. //depot/projects/soc2006/intr_filter/dev/sound/pci/ich.c#9 integrate .. //depot/projects/soc2006/intr_filter/dev/stge/if_stge.c#7 integrate .. //depot/projects/soc2006/intr_filter/dev/stge/if_stgereg.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/uart/uart_kbd_sun.c#6 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/if_axe.c#5 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/if_axereg.h#2 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/uftdi.c#3 integrate .. //depot/projects/soc2006/intr_filter/dev/usb/usbdevs#13 integrate .. //depot/projects/soc2006/intr_filter/fs/procfs/procfs_ioctl.c#6 integrate .. //depot/projects/soc2006/intr_filter/i386/i386/mptable_pci.c#5 integrate .. //depot/projects/soc2006/intr_filter/i386/i386/msi.c#3 integrate .. //depot/projects/soc2006/intr_filter/i386/i386/nexus.c#9 integrate .. //depot/projects/soc2006/intr_filter/i386/include/intr_machdep.h#9 integrate .. //depot/projects/soc2006/intr_filter/i386/pci/pci_bus.c#5 integrate .. //depot/projects/soc2006/intr_filter/kern/kern_descrip.c#14 integrate .. //depot/projects/soc2006/intr_filter/kern/sys_generic.c#9 integrate .. //depot/projects/soc2006/intr_filter/kern/uipc_debug.c#2 integrate .. //depot/projects/soc2006/intr_filter/kern/uipc_sockbuf.c#5 integrate .. //depot/projects/soc2006/intr_filter/kern/uipc_socket.c#14 integrate .. //depot/projects/soc2006/intr_filter/kern/uipc_syscalls.c#12 integrate .. //depot/projects/soc2006/intr_filter/kern/vfs_syscalls.c#11 integrate .. //depot/projects/soc2006/intr_filter/modules/em/Makefile#2 integrate .. //depot/projects/soc2006/intr_filter/net/ieee8023ad_lacp.c#2 integrate .. //depot/projects/soc2006/intr_filter/net/if.h#4 integrate .. //depot/projects/soc2006/intr_filter/net/if_lagg.c#2 integrate .. //depot/projects/soc2006/intr_filter/net/if_lagg.h#2 integrate .. //depot/projects/soc2006/intr_filter/netgraph/ng_mppc.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/in_pcb.c#10 integrate .. //depot/projects/soc2006/intr_filter/netinet/in_pcb.h#5 integrate .. //depot/projects/soc2006/intr_filter/netinet/ip_divert.c#6 integrate .. //depot/projects/soc2006/intr_filter/netinet/ip_fw.h#4 integrate .. //depot/projects/soc2006/intr_filter/netinet/ip_fw2.c#14 integrate .. //depot/projects/soc2006/intr_filter/netinet/libalias/alias_proxy.c#5 integrate .. //depot/projects/soc2006/intr_filter/netinet/raw_ip.c#7 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp.h#4 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_auth.c#7 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_bsd_addr.c#5 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_constants.h#8 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_header.h#3 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_indata.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_indata.h#4 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_input.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_os_bsd.h#8 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_output.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_output.h#5 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_pcb.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_pcb.h#7 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_peeloff.c#7 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctp_usrreq.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctputil.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/sctputil.h#8 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_debug.c#2 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_input.c#13 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_subr.c#10 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_usrreq.c#10 integrate .. //depot/projects/soc2006/intr_filter/netinet/tcp_var.h#9 integrate .. //depot/projects/soc2006/intr_filter/netinet/udp_usrreq.c#9 integrate .. //depot/projects/soc2006/intr_filter/netinet6/in6_pcb.c#6 integrate .. //depot/projects/soc2006/intr_filter/netinet6/in6_src.c#6 integrate .. //depot/projects/soc2006/intr_filter/netinet6/nd6.c#8 integrate .. //depot/projects/soc2006/intr_filter/netinet6/nd6_nbr.c#4 integrate .. //depot/projects/soc2006/intr_filter/netinet6/sctp6_usrreq.c#9 integrate .. //depot/projects/soc2006/intr_filter/security/audit/audit_ioctl.h#3 integrate .. //depot/projects/soc2006/intr_filter/sparc64/sparc64/machdep.c#5 integrate .. //depot/projects/soc2006/intr_filter/sparc64/sparc64/upa.c#8 integrate .. //depot/projects/soc2006/intr_filter/sys/filedesc.h#3 integrate .. //depot/projects/soc2006/intr_filter/sys/param.h#12 integrate .. //depot/projects/soc2006/intr_filter/sys/socketvar.h#7 integrate .. //depot/projects/soc2006/intr_filter/ufs/ffs/ffs_softdep.c#7 integrate Differences ... ==== //depot/projects/soc2006/intr_filter/amd64/amd64/mptable_pci.c#5 (text+ko) ==== @@ -33,7 +33,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/mptable_pci.c,v 1.7 2007/01/22 21:48:42 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/mptable_pci.c,v 1.8 2007/05/02 17:50:34 jhb Exp $"); #include #include @@ -72,7 +72,7 @@ return (bus_generic_attach(dev)); } -/* Pass MSI alloc requests up to the nexus. */ +/* Pass MSI requests up to the nexus. */ static int mptable_hostb_alloc_msi(device_t pcib, device_t dev, int count, int maxcount, int *irqs) @@ -85,12 +85,22 @@ } static int -mptable_hostb_alloc_msix(device_t pcib, device_t dev, int index, int *irq) +mptable_hostb_alloc_msix(device_t pcib, device_t dev, int *irq) +{ + device_t bus; + + bus = device_get_parent(pcib); + return (PCIB_ALLOC_MSIX(device_get_parent(bus), dev, irq)); +} + +static int +mptable_hostb_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, + uint32_t *data) { device_t bus; bus = device_get_parent(pcib); - return (PCIB_ALLOC_MSIX(device_get_parent(bus), dev, index, irq)); + return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data)); } static device_method_t mptable_hostb_methods[] = { @@ -120,8 +130,8 @@ DEVMETHOD(pcib_alloc_msi, mptable_hostb_alloc_msi), DEVMETHOD(pcib_release_msi, pcib_release_msi), DEVMETHOD(pcib_alloc_msix, mptable_hostb_alloc_msix), - DEVMETHOD(pcib_remap_msix, pcib_remap_msix), DEVMETHOD(pcib_release_msix, pcib_release_msix), + DEVMETHOD(pcib_map_msi, mptable_hostb_map_msi), { 0, 0 } }; @@ -177,8 +187,8 @@ DEVMETHOD(pcib_alloc_msi, pcib_alloc_msi), DEVMETHOD(pcib_release_msi, pcib_release_msi), DEVMETHOD(pcib_alloc_msix, pcib_alloc_msix), - DEVMETHOD(pcib_remap_msix, pcib_remap_msix), DEVMETHOD(pcib_release_msix, pcib_release_msix), + DEVMETHOD(pcib_map_msi, pcib_map_msi), {0, 0} }; ==== //depot/projects/soc2006/intr_filter/amd64/amd64/msi.c#3 (text+ko) ==== @@ -34,7 +34,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/msi.c,v 1.4 2007/02/15 22:22:56 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/msi.c,v 1.5 2007/05/02 17:50:34 jhb Exp $"); #include #include @@ -99,21 +99,20 @@ * assigned an ID by the system; however, a group will use the ID from * the first message. * - * For MSI-X, each message is isolated, and msi_index indicates the - * index of this message in the device's MSI-X table. + * For MSI-X, each message is isolated. */ struct msi_intsrc { struct intsrc msi_intsrc; device_t msi_dev; /* Owning device. (g) */ struct msi_intsrc *msi_first; /* First source in group. */ u_int msi_irq; /* IRQ cookie. */ - u_int msi_index; /* Index of this message. */ u_int msi_msix; /* MSI-X message. */ u_int msi_vector:8; /* IDT vector. */ u_int msi_cpu:8; /* Local APIC ID. (g) */ u_int msi_count:8; /* Messages in this group. (g) */ }; +static struct msi_intsrc *msi_create_source(u_int irq); static void msi_enable_source(struct intsrc *isrc); static void msi_disable_source(struct intsrc *isrc, int eoi); static void msi_eoi_source(struct intsrc *isrc); @@ -123,16 +122,10 @@ static int msi_config_intr(struct intsrc *isrc, enum intr_trigger trig, enum intr_polarity pol); static void msi_assign_cpu(struct intsrc *isrc, u_int apic_id); -static void msix_enable_intr(struct intsrc *isrc); -static int msix_source_pending(struct intsrc *isrc); -static void msix_assign_cpu(struct intsrc *isrc, u_int apic_id); struct pic msi_pic = { msi_enable_source, msi_disable_source, msi_eoi_source, msi_enable_intr, msi_vector, msi_source_pending, NULL, NULL, msi_config_intr, msi_assign_cpu }; -struct pic msix_pic = { msi_enable_source, msi_disable_source, msi_eoi_source, - msix_enable_intr, msi_vector, msix_source_pending, - NULL, NULL, msi_config_intr, msix_assign_cpu }; static int msi_enabled; static struct sx msi_sx; @@ -162,17 +155,6 @@ { struct msi_intsrc *msi = (struct msi_intsrc *)isrc; - /* - * Since we can only enable the entire group at once, go ahead and - * enable the messages when the first message is given a handler. - * Note that we assume all devices will register a handler for the - * first message. - */ - if (msi->msi_index == 0) { - mtx_lock_spin(&icu_lock); - pci_enable_msi(msi->msi_dev, INTEL_ADDR(msi), INTEL_DATA(msi)); - mtx_unlock_spin(&icu_lock); - } apic_enable_vector(msi->msi_vector); } @@ -206,51 +188,13 @@ msi->msi_cpu = apic_id; if (bootverbose) - printf("msi: Assigning MSI IRQ %d to local APIC %u\n", - msi->msi_irq, msi->msi_cpu); - mtx_lock_spin(&icu_lock); + printf("msi: Assigning %s IRQ %d to local APIC %u\n", + msi->msi_msix ? "MSI-X" : "MSI", msi->msi_irq, + msi->msi_cpu); if (isrc->is_enabled) - pci_enable_msi(msi->msi_dev, INTEL_ADDR(msi), INTEL_DATA(msi)); - mtx_unlock_spin(&icu_lock); + pci_remap_msi_irq(msi->msi_dev, msi->msi_irq); } -static void -msix_enable_intr(struct intsrc *isrc) -{ - struct msi_intsrc *msi = (struct msi_intsrc *)isrc; - - mtx_lock_spin(&icu_lock); - pci_enable_msix(msi->msi_dev, msi->msi_index, INTEL_ADDR(msi), - INTEL_DATA(msi)); - pci_unmask_msix(msi->msi_dev, msi->msi_index); - mtx_unlock_spin(&icu_lock); - apic_enable_vector(msi->msi_vector); -} - -static int -msix_source_pending(struct intsrc *isrc) -{ - struct msi_intsrc *msi = (struct msi_intsrc *)isrc; - - return (pci_pending_msix(msi->msi_dev, msi->msi_index)); -} - -static void -msix_assign_cpu(struct intsrc *isrc, u_int apic_id) -{ - struct msi_intsrc *msi = (struct msi_intsrc *)isrc; - - msi->msi_cpu = apic_id; - if (bootverbose) - printf("msi: Assigning MSI-X IRQ %d to local APIC %u\n", - msi->msi_irq, msi->msi_cpu); - mtx_lock_spin(&icu_lock); - if (isrc->is_enabled) - pci_enable_msix(msi->msi_dev, msi->msi_index, INTEL_ADDR(msi), - INTEL_DATA(msi)); - mtx_unlock_spin(&icu_lock); -} - void msi_init(void) { @@ -262,10 +206,21 @@ msi_enabled = 1; intr_register_pic(&msi_pic); - intr_register_pic(&msix_pic); sx_init(&msi_sx, "msi"); } +struct msi_intsrc * +msi_create_source(u_int irq) +{ + struct msi_intsrc *msi; + + msi = malloc(sizeof(struct msi_intsrc), M_MSI, M_WAITOK | M_ZERO); + msi->msi_intsrc.is_pic = &msi_pic; + msi->msi_irq = irq; + intr_register_source(&msi->msi_intsrc); + return (msi); +} + /* * Try to allocate 'count' interrupt sources with contiguous IDT values. If * we allocate any new sources, then their IRQ values will be at the end of @@ -317,14 +272,8 @@ *newcount = count - cnt; for (j = 0; j < *newcount; j++) { - /* Create a new MSI source. */ - msi = malloc(sizeof(struct msi_intsrc), M_MSI, - M_WAITOK | M_ZERO); - msi->msi_intsrc.is_pic = &msi_pic; - msi->msi_irq = i + j; - intr_register_source(&msi->msi_intsrc); - - /* Add it to our array. */ + /* Create a new MSI source and add it to our array. */ + msi_create_source(i + j); irqs[cnt] = i + j; cnt++; } @@ -344,13 +293,11 @@ fsrc = (struct msi_intsrc *)intr_lookup_source(irqs[0]); for (i = 0; i < count; i++) { msi = (struct msi_intsrc *)intr_lookup_source(irqs[i]); - msi->msi_intsrc.is_pic = &msi_pic; msi->msi_dev = dev; msi->msi_vector = vector + i; if (bootverbose) printf("msi: routing MSI IRQ %d to vector %u\n", msi->msi_irq, msi->msi_vector); - msi->msi_index = i; msi->msi_first = fsrc; /* XXX: Somewhat gross. */ @@ -395,8 +342,6 @@ sx_xunlock(&msi_sx); return (EINVAL); } - KASSERT(first->msi_index == 0, ("index mismatch")); - KASSERT(first->msi_dev != NULL, ("unowned group")); /* Clear all the extra messages in the group. */ @@ -408,7 +353,6 @@ msi->msi_dev = NULL; apic_free_vector(msi->msi_vector, msi->msi_irq); msi->msi_vector = 0; - msi->msi_index = 0; } /* Clear out the first message. */ @@ -423,7 +367,44 @@ } int -msix_alloc(device_t dev, int index, int *irq, int *new) +msi_map(int irq, uint64_t *addr, uint32_t *data) +{ + struct msi_intsrc *msi; + + sx_slock(&msi_sx); + msi = (struct msi_intsrc *)intr_lookup_source(irq); + if (msi == NULL) { + sx_sunlock(&msi_sx); + return (ENOENT); + } + + /* Make sure this message is allocated to a device. */ + if (msi->msi_dev == NULL) { + sx_sunlock(&msi_sx); + return (ENXIO); + } + + /* + * If this message isn't an MSI-X message, make sure it's part + * of a gruop, and switch to the first message in the + * group. + */ + if (!msi->msi_msix) { + if (msi->msi_first == NULL) { + sx_sunlock(&msi_sx); + return (ENXIO); + } + msi = msi->msi_first; + } + + *addr = INTEL_ADDR(msi); + *data = INTEL_DATA(msi); + sx_sunlock(&msi_sx); + return (0); +} + +int +msix_alloc(device_t dev, int *irq, int *new) { struct msi_intsrc *msi; int i, vector; @@ -457,11 +438,7 @@ /* Create a new source. */ *new = 1; - msi = malloc(sizeof(struct msi_intsrc), M_MSI, - M_WAITOK | M_ZERO); - msi->msi_intsrc.is_pic = &msix_pic; - msi->msi_irq = i; - intr_register_source(&msi->msi_intsrc); + msi = msi_create_source(i); } /* Allocate an IDT vector. */ @@ -471,10 +448,8 @@ vector); /* Setup source. */ - msi->msi_intsrc.is_pic = &msix_pic; msi->msi_dev = dev; msi->msi_vector = vector; - msi->msi_index = index; msi->msi_msix = 1; /* XXX: Somewhat gross. */ @@ -486,30 +461,6 @@ } int -msix_remap(int index, int irq) -{ - struct msi_intsrc *msi; - - sx_xlock(&msi_sx); - msi = (struct msi_intsrc *)intr_lookup_source(irq); - if (msi == NULL) { - sx_xunlock(&msi_sx); - return (ENOENT); - } - - /* Make sure this is an MSI-X message. */ - if (!msi->msi_msix) { - sx_xunlock(&msi_sx); - return (EINVAL); - } - - KASSERT(msi->msi_dev != NULL, ("unowned message")); - msi->msi_index = index; - sx_xunlock(&msi_sx); - return (0); -} - -int msix_release(int irq) { struct msi_intsrc *msi; @@ -533,7 +484,6 @@ msi->msi_dev = NULL; apic_free_vector(msi->msi_vector, msi->msi_irq); msi->msi_vector = 0; - msi->msi_index = 0; msi->msi_msix = 0; sx_xunlock(&msi_sx); ==== //depot/projects/soc2006/intr_filter/amd64/amd64/nexus.c#8 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/amd64/nexus.c,v 1.75 2007/03/21 15:36:38 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/nexus.c,v 1.76 2007/05/02 17:50:34 jhb Exp $"); /* * This code implements a `root nexus' for Intel Architecture @@ -108,9 +108,9 @@ static void nexus_delete_resource(device_t, device_t, int, int); static int nexus_alloc_msi(device_t pcib, device_t dev, int count, int maxcount, int *irqs); static int nexus_release_msi(device_t pcib, device_t dev, int count, int *irqs); -static int nexus_alloc_msix(device_t pcib, device_t dev, int index, int *irq); -static int nexus_remap_msix(device_t pcib, device_t dev, int index, int irq); +static int nexus_alloc_msix(device_t pcib, device_t dev, int *irq); static int nexus_release_msix(device_t pcib, device_t dev, int irq); +static int nexus_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, uint32_t *data); static device_method_t nexus_methods[] = { /* Device interface */ @@ -140,8 +140,8 @@ DEVMETHOD(pcib_alloc_msi, nexus_alloc_msi), DEVMETHOD(pcib_release_msi, nexus_release_msi), DEVMETHOD(pcib_alloc_msix, nexus_alloc_msix), - DEVMETHOD(pcib_remap_msix, nexus_remap_msix), DEVMETHOD(pcib_release_msix, nexus_release_msix), + DEVMETHOD(pcib_map_msi, nexus_map_msi), { 0, 0 } }; @@ -504,24 +504,17 @@ } static int -nexus_alloc_msix(device_t pcib, device_t dev, int index, int *irq) +nexus_alloc_msix(device_t pcib, device_t dev, int *irq) { int error, new; - error = msix_alloc(dev, index, irq, &new); + error = msix_alloc(dev, irq, &new); if (new) rman_manage_region(&irq_rman, *irq, *irq); return (error); } static int -nexus_remap_msix(device_t pcib, device_t dev, int index, int irq) -{ - - return (msix_remap(index, irq)); -} - -static int nexus_release_msix(device_t pcib, device_t dev, int irq) { @@ -551,6 +544,13 @@ return (msi_release(irqs, count)); } +static int +nexus_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, uint32_t *data) +{ + + return (msi_map(irq, addr, data)); +} + /* Placeholder for system RAM. */ static void ram_identify(driver_t *driver, device_t parent) ==== //depot/projects/soc2006/intr_filter/amd64/include/intr_machdep.h#9 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/amd64/include/intr_machdep.h,v 1.16 2007/03/06 17:16:46 jhb Exp $ + * $FreeBSD: src/sys/amd64/include/intr_machdep.h,v 1.17 2007/05/02 17:50:34 jhb Exp $ */ #ifndef __MACHINE_INTR_MACHDEP_H__ @@ -149,9 +149,9 @@ int msi_alloc(device_t dev, int count, int maxcount, int *irqs, int *newirq, int *newcount); void msi_init(void); +int msi_map(int irq, uint64_t *addr, uint32_t *data); int msi_release(int *irqs, int count); -int msix_alloc(device_t dev, int index, int *irq, int *new); -int msix_remap(int index, int irq); +int msix_alloc(device_t dev, int *irq, int *new); int msix_release(int irq); #endif /* !LOCORE */ ==== //depot/projects/soc2006/intr_filter/amd64/pci/pci_bus.c#5 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/amd64/pci/pci_bus.c,v 1.120 2007/01/22 21:48:42 jhb Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/pci/pci_bus.c,v 1.121 2007/05/02 17:50:34 jhb Exp $"); #include "opt_cpu.h" @@ -81,7 +81,7 @@ return (PCI_INVALID_IRQ); } -/* Pass MSI alloc requests up to the nexus. */ +/* Pass MSI requests up to the nexus. */ static int legacy_pcib_alloc_msi(device_t pcib, device_t dev, int count, int maxcount, @@ -95,12 +95,22 @@ } static int -legacy_pcib_alloc_msix(device_t pcib, device_t dev, int index, int *irq) +legacy_pcib_alloc_msix(device_t pcib, device_t dev, int *irq) +{ + device_t bus; + + bus = device_get_parent(pcib); + return (PCIB_ALLOC_MSIX(device_get_parent(bus), dev, irq)); +} + +static int +legacy_pcib_map_msi(device_t pcib, device_t dev, int irq, uint64_t *addr, + uint32_t *data) { device_t bus; bus = device_get_parent(pcib); - return (PCIB_ALLOC_MSIX(device_get_parent(bus), dev, index, irq)); + return (PCIB_MAP_MSI(device_get_parent(bus), dev, irq, addr, data)); } static const char * @@ -347,8 +357,8 @@ DEVMETHOD(pcib_alloc_msi, legacy_pcib_alloc_msi), DEVMETHOD(pcib_release_msi, pcib_release_msi), DEVMETHOD(pcib_alloc_msix, legacy_pcib_alloc_msix), - DEVMETHOD(pcib_remap_msix, pcib_remap_msix), DEVMETHOD(pcib_release_msix, pcib_release_msix), + DEVMETHOD(pcib_map_msi, legacy_pcib_map_msi), { 0, 0 } }; ==== //depot/projects/soc2006/intr_filter/arm/xscale/i80321/ep80219_machdep.c#5 (text+ko) ==== @@ -49,7 +49,7 @@ #include "opt_ddb.h" #include -__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/ep80219_machdep.c,v 1.5 2006/12/06 06:34:54 julian Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/ep80219_machdep.c,v 1.6 2007/05/03 09:51:12 kevlo Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include @@ -125,8 +125,6 @@ extern void *_end; -extern vm_offset_t sa1_cache_clean_addr; - extern int *end; struct pcpu __pcpu; ==== //depot/projects/soc2006/intr_filter/arm/xscale/i80321/iq31244_machdep.c#7 (text+ko) ==== @@ -49,7 +49,7 @@ #include "opt_ddb.h" #include -__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/iq31244_machdep.c,v 1.26 2006/12/06 06:34:54 julian Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/iq31244_machdep.c,v 1.27 2007/05/03 09:51:12 kevlo Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include @@ -125,8 +125,6 @@ extern void *_end; -extern vm_offset_t sa1_cache_clean_addr; - extern int *end; struct pcpu __pcpu; ==== //depot/projects/soc2006/intr_filter/arm/xscale/ixp425/avila_machdep.c#4 (text+ko) ==== @@ -49,7 +49,7 @@ #include "opt_ddb.h" #include -__FBSDID("$FreeBSD: src/sys/arm/xscale/ixp425/avila_machdep.c,v 1.3 2007/02/02 05:14:21 kevlo Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/xscale/ixp425/avila_machdep.c,v 1.4 2007/05/03 09:51:12 kevlo Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include @@ -124,8 +124,6 @@ extern void *_end; -extern vm_offset_t sa1_cache_clean_addr; - extern int *end; struct pcpu __pcpu; ==== //depot/projects/soc2006/intr_filter/compat/freebsd32/freebsd32_misc.c#6 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/freebsd32/freebsd32_misc.c,v 1.62 2006/12/20 19:36:03 jkim Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/freebsd32/freebsd32_misc.c,v 1.63 2007/05/01 17:10:01 alc Exp $"); #include "opt_compat.h" @@ -407,7 +407,6 @@ start = addr; end = addr + len; - mtx_lock(&Giant); if (start != trunc_page(start)) { error = freebsd32_mmap_partial(td, start, round_page(start), prot, @@ -438,14 +437,11 @@ prot |= VM_PROT_WRITE; map = &td->td_proc->p_vmspace->vm_map; rv = vm_map_remove(map, start, end); - if (rv != KERN_SUCCESS) { - mtx_unlock(&Giant); + if (rv != KERN_SUCCESS) return (EINVAL); - } rv = vm_map_find(map, 0, 0, &start, end - start, FALSE, prot, VM_PROT_ALL, 0); - mtx_unlock(&Giant); if (rv != KERN_SUCCESS) return (EINVAL); r.fd = fd; @@ -459,7 +455,6 @@ td->td_retval[0] = addr; return (0); } - mtx_unlock(&Giant); if (end == start) { /* * After dealing with the ragged ends, there ==== //depot/projects/soc2006/intr_filter/compat/linprocfs/linprocfs.c#12 (text+ko) ==== @@ -40,7 +40,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.111 2007/04/22 08:41:52 des Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/linprocfs/linprocfs.c,v 1.112 2007/05/01 03:09:57 alc Exp $"); #include #include @@ -860,12 +860,14 @@ { char mebuffer[512]; vm_map_t map = &p->p_vmspace->vm_map; - vm_map_entry_t entry; + vm_map_entry_t entry, tmp_entry; vm_object_t obj, tobj, lobj; + vm_offset_t saved_end; vm_ooffset_t off = 0; char *name = "", *freename = NULL; size_t len; ino_t ino; + unsigned int last_timestamp; int ref_count, shadow_count, flags; int error; struct vnode *vp; @@ -885,8 +887,7 @@ return (0); error = 0; - if (map != &curthread->td_proc->p_vmspace->vm_map) - vm_map_lock_read(map); + vm_map_lock_read(map); for (entry = map->header.next; ((uio->uio_resid > 0) && (entry != &map->header)); entry = entry->next) { @@ -894,12 +895,16 @@ freename = NULL; if (entry->eflags & MAP_ENTRY_IS_SUB_MAP) continue; + saved_end = entry->end; obj = entry->object.vm_object; - for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) + for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) { + VM_OBJECT_LOCK(tobj); + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); lobj = tobj; + } ino = 0; if (lobj) { - VM_OBJECT_LOCK(lobj); off = IDX_TO_OFF(lobj->size); if (lobj->type == OBJT_VNODE) { vp = lobj->handle; @@ -908,10 +913,12 @@ } else vp = NULL; + if (lobj != obj) + VM_OBJECT_UNLOCK(lobj); flags = obj->flags; ref_count = obj->ref_count; shadow_count = obj->shadow_count; - VM_OBJECT_UNLOCK(lobj); + VM_OBJECT_UNLOCK(obj); if (vp) { vn_fullpath(td, vp, &name, &freename); locked = VFS_LOCK_GIANT(vp->v_mount); @@ -953,12 +960,23 @@ * XXX We should probably return * EFBIG here, as in procfs. */ + last_timestamp = map->timestamp; + vm_map_unlock_read(map); error = uiomove(mebuffer, len, uio); + vm_map_lock_read(map); if (error) break; + if (last_timestamp + 1 != map->timestamp) { + /* + * Look again for the entry because the map was + * modified while it was unlocked. Specifically, + * the entry may have been clipped, merged, or deleted. + */ + vm_map_lookup_entry(map, saved_end - 1, &tmp_entry); + entry = tmp_entry; + } } - if (map != &curthread->td_proc->p_vmspace->vm_map) - vm_map_unlock_read(map); + vm_map_unlock_read(map); return (error); } ==== //depot/projects/soc2006/intr_filter/compat/opensolaris/kern/opensolaris_kobj.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_kobj.c,v 1.2 2007/04/08 23:57:08 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_kobj.c,v 1.3 2007/05/02 01:03:10 pjd Exp $"); #include #include @@ -123,7 +123,7 @@ struct vattr va; int error; - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); + vn_lock(vp, LK_SHARED | LK_RETRY, td); error = VOP_GETATTR(vp, &va, td->td_ucred, td); VOP_UNLOCK(vp, 0, td); if (error == 0) @@ -176,7 +176,7 @@ auio.uio_resid = size; auio.uio_td = td; - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); + vn_lock(vp, LK_SHARED | LK_RETRY, td); error = VOP_READ(vp, &auio, IO_UNIT | IO_SYNC, td->td_ucred); VOP_UNLOCK(vp, 0, td); return (error != 0 ? -1 : size - auio.uio_resid); ==== //depot/projects/soc2006/intr_filter/compat/opensolaris/kern/opensolaris_vfs.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include -__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_vfs.c,v 1.4 2007/04/21 12:02:57 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/opensolaris/kern/opensolaris_vfs.c,v 1.5 2007/05/02 01:03:10 pjd Exp $"); #include #include @@ -187,7 +187,7 @@ /* * Allocate and initialize the filesystem. */ - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td); + vn_lock(vp, LK_SHARED | LK_RETRY, td); mp = vfs_mount_alloc(vp, vfsp, fspath, td); VOP_UNLOCK(vp, 0, td); ==== //depot/projects/soc2006/intr_filter/conf/files#18 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD: src/sys/conf/files,v 1.1198 2007/04/25 15:30:17 mav Exp $ +# $FreeBSD: src/sys/conf/files,v 1.1201 2007/05/04 13:29:45 rwatson Exp $ # # The long compile-with and dependency lines are required because of # limitations in config: backslash-newline doesn't work in strings, and @@ -600,8 +600,34 @@ dev/ed/if_ed_pci.c optional ed pci dev/eisa/eisa_if.m standard dev/eisa/eisaconf.c optional eisa -dev/em/if_em.c optional em -dev/em/if_em_hw.c optional em +dev/em/if_em.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_80003es2lan.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_82540.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_82541.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_82542.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_82543.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_82571.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_82575.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_api.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_ich8lan.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_mac.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_manage.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_nvm.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" +dev/em/e1000_phy.c optional em \ + compile-with "${NORMAL_C} -I$S/dev/em" dev/en/if_en_pci.c optional en pci dev/en/midway.c optional en dev/ep/if_ep.c optional ep ==== //depot/projects/soc2006/intr_filter/conf/kern.pre.mk#6 (text+ko) ==== @@ -1,4 +1,4 @@ >>> TRUNCATED FOR MAIL (1000 lines) <<<