PERFORCE change 119203 for review
Scott Long
scottl at FreeBSD.org
Thu May 3 18:53:42 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=119203
Change 119203 by scottl at scottl-x64 on 2007/05/03 18:53:13
IFC
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/amd64/amd64/local_apic.c#13 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/amd64/mptable_pci.c#7 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/amd64/msi.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/amd64/nexus.c#13 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/amd64/pmap.c#20 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/include/intr_machdep.h#11 integrate
.. //depot/projects/scottl-camlock/src/sys/amd64/pci/pci_bus.c#9 integrate
.. //depot/projects/scottl-camlock/src/sys/arm/xscale/i80321/ep80219_machdep.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/arm/xscale/i80321/iq31244_machdep.c#10 integrate
.. //depot/projects/scottl-camlock/src/sys/arm/xscale/ixp425/avila_machdep.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#65 integrate
.. //depot/projects/scottl-camlock/src/sys/compat/freebsd32/freebsd32_misc.c#12 integrate
.. //depot/projects/scottl-camlock/src/sys/compat/linprocfs/linprocfs.c#18 integrate
.. //depot/projects/scottl-camlock/src/sys/compat/opensolaris/kern/opensolaris_kobj.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/compat/opensolaris/kern/opensolaris_vfs.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/conf/files#24 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/gfs.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/acpi_support/acpi_ibm.c#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/acpica/acpi.c#14 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/acpica/acpi_pcib_acpi.c#10 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/acpica/acpi_pcib_pci.c#7 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/ata/ata-disk.c#12 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/ata/atapi-cam.c#11 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/bge/if_bge.c#16 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/bge/if_bgereg.h#14 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/ciss/ciss.c#15 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/ciss/cissvar.h#4 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/cxgb/cxgb_main.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/cxgb/cxgb_sge.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/firewire.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/firewirereg.h#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/fwdev.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/fwohci.c#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/fwohcireg.h#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/if_fwip.c#7 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/sbp.c#10 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/firewire/sbp_targ.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/hme/if_hme.c#10 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/ipmi/ipmi_smbios.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/mii/brgphy.c#14 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/mii/mii.c#7 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/msk/if_msk.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/msk/if_mskreg.h#2 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/mxge/if_mxge.c#10 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pci.c#16 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pci_if.m#7 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pci_pci.c#13 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pci_private.h#10 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pcib_if.m#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pcib_private.h#6 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pcireg.h#11 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/pci/pcivar.h#12 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/stge/if_stge.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/stge/if_stgereg.h#2 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/uart/uart_kbd_sun.c#11 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/usb/if_axe.c#11 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/usb/if_axereg.h#7 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/usb/uftdi.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/dev/usb/usbdevs#18 integrate
.. //depot/projects/scottl-camlock/src/sys/fs/procfs/procfs_ioctl.c#6 integrate
.. //depot/projects/scottl-camlock/src/sys/geom/part/g_part.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/i386/local_apic.c#14 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/i386/mptable_pci.c#7 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/i386/msi.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/i386/nexus.c#12 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/i386/pmap.c#21 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/include/intr_machdep.h#11 integrate
.. //depot/projects/scottl-camlock/src/sys/i386/pci/pci_bus.c#9 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/kern_descrip.c#15 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/subr_rman.c#14 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/sys_generic.c#11 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/uipc_debug.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/uipc_sockbuf.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/uipc_socket.c#16 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/uipc_syscalls.c#20 integrate
.. //depot/projects/scottl-camlock/src/sys/kern/vfs_mount.c#21 integrate
.. //depot/projects/scottl-camlock/src/sys/net/ieee8023ad_lacp.c#3 integrate
.. //depot/projects/scottl-camlock/src/sys/net/if.h#9 integrate
.. //depot/projects/scottl-camlock/src/sys/net/if_lagg.c#2 integrate
.. //depot/projects/scottl-camlock/src/sys/net/if_lagg.h#2 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/in_pcb.c#15 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/in_pcb.h#10 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/ip_divert.c#12 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/libalias/alias_proxy.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/raw_ip.c#13 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp.h#4 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_auth.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_bsd_addr.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_constants.h#6 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_header.h#3 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_indata.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_indata.h#4 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_input.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_os_bsd.h#5 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_output.c#9 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_output.h#5 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_pcb.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_pcb.h#6 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_peeloff.c#5 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctp_usrreq.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctputil.c#8 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/sctputil.h#7 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp_subr.c#15 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/tcp_usrreq.c#16 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet/udp_usrreq.c#14 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet6/in6_pcb.c#11 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet6/in6_src.c#12 integrate
.. //depot/projects/scottl-camlock/src/sys/netinet6/sctp6_usrreq.c#6 integrate
.. //depot/projects/scottl-camlock/src/sys/nfsclient/nfs_bio.c#10 integrate
.. //depot/projects/scottl-camlock/src/sys/nfsclient/nfs_vnops.c#14 integrate
.. //depot/projects/scottl-camlock/src/sys/security/audit/audit_ioctl.h#4 integrate
.. //depot/projects/scottl-camlock/src/sys/sparc64/sparc64/machdep.c#12 integrate
.. //depot/projects/scottl-camlock/src/sys/sparc64/sparc64/upa.c#4 integrate
.. //depot/projects/scottl-camlock/src/sys/sys/ioctl_compat.h#5 integrate
.. //depot/projects/scottl-camlock/src/sys/sys/param.h#16 integrate
.. //depot/projects/scottl-camlock/src/sys/sys/socketvar.h#13 integrate
.. //depot/projects/scottl-camlock/src/sys/vm/vm_map.c#13 integrate
Differences ...
==== //depot/projects/scottl-camlock/src/sys/amd64/amd64/local_apic.c#13 (text+ko) ====
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/local_apic.c,v 1.37 2007/03/20 21:53:30 jhb Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/local_apic.c,v 1.38 2007/04/25 19:58:41 ariff Exp $");
#include "opt_hwpmc_hooks.h"
@@ -326,6 +326,29 @@
/* XXX: Error and thermal LVTs */
+ if (strcmp(cpu_vendor, "AuthenticAMD") == 0) {
+ /*
+ * Detect the presence of C1E capability mostly on latest
+ * dual-cores (or future) k8 family. This feature renders
+ * the local APIC timer dead, so we disable it by reading
+ * the Interrupt Pending Message register and clearing both
+ * C1eOnCmpHalt (bit 28) and SmiOnCmpHalt (bit 27).
+ *
+ * Reference:
+ * "BIOS and Kernel Developer's Guide for AMD NPT
+ * Family 0Fh Processors"
+ * #32559 revision 3.00
+ */
+ if ((cpu_id & 0x00000f00) == 0x00000f00 &&
+ (cpu_id & 0x0fff0000) >= 0x00040000) {
+ uint64_t msr;
+
+ msr = rdmsr(0xc0010055);
+ if (msr & 0x18000000)
+ wrmsr(0xc0010055, msr & ~0x18000000ULL);
+ }
+ }
+
intr_restore(eflags);
}
==== //depot/projects/scottl-camlock/src/sys/amd64/amd64/mptable_pci.c#7 (text+ko) ====
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/systm.h>
@@ -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/scottl-camlock/src/sys/amd64/amd64/msi.c#4 (text+ko) ====
@@ -34,7 +34,7 @@
*/
#include <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/bus.h>
@@ -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/scottl-camlock/src/sys/amd64/amd64/nexus.c#13 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__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/scottl-camlock/src/sys/amd64/amd64/pmap.c#20 (text+ko) ====
@@ -77,7 +77,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.583 2007/04/21 14:17:29 ups Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.584 2007/04/25 18:10:43 ups Exp $");
/*
* Manages physical address maps.
==== //depot/projects/scottl-camlock/src/sys/amd64/include/intr_machdep.h#11 (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/scottl-camlock/src/sys/amd64/pci/pci_bus.c#9 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__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/scottl-camlock/src/sys/arm/xscale/i80321/ep80219_machdep.c#5 (text+ko) ====
@@ -49,7 +49,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__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 <sys/param.h>
@@ -125,8 +125,6 @@
extern void *_end;
-extern vm_offset_t sa1_cache_clean_addr;
-
extern int *end;
struct pcpu __pcpu;
==== //depot/projects/scottl-camlock/src/sys/arm/xscale/i80321/iq31244_machdep.c#10 (text+ko) ====
@@ -49,7 +49,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__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 <sys/param.h>
@@ -125,8 +125,6 @@
extern void *_end;
-extern vm_offset_t sa1_cache_clean_addr;
-
extern int *end;
struct pcpu __pcpu;
==== //depot/projects/scottl-camlock/src/sys/arm/xscale/ixp425/avila_machdep.c#4 (text+ko) ====
@@ -49,7 +49,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__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 <sys/param.h>
@@ -124,8 +124,6 @@
extern void *_end;
-extern vm_offset_t sa1_cache_clean_addr;
-
extern int *end;
struct pcpu __pcpu;
==== //depot/projects/scottl-camlock/src/sys/cam/cam_xpt.c#65 (text+ko) ====
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.182 2007/04/19 23:34:51 scottl Exp $");
+__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.183 2007/04/27 14:23:05 scottl Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -5306,10 +5306,12 @@
}
}
- task = malloc(sizeof(struct xpt_task), M_CAMXPT, M_NOWAIT);
- if (task != NULL) {
- TASK_INIT(&task->task, 0, xpt_finishconfig_task, task);
- taskqueue_enqueue(taskqueue_thread, &task->task);
+ if (busses_to_config == 0) {
+ task = malloc(sizeof(struct xpt_task), M_CAMXPT, M_NOWAIT);
+ if (task != NULL) {
+ TASK_INIT(&task->task, 0, xpt_finishconfig_task, task);
+ taskqueue_enqueue(taskqueue_thread, &task->task);
+ }
}
if (done_ccb != NULL)
==== //depot/projects/scottl-camlock/src/sys/compat/freebsd32/freebsd32_misc.c#12 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__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/scottl-camlock/src/sys/compat/linprocfs/linprocfs.c#18 (text+ko) ====
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/queue.h>
@@ -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/scottl-camlock/src/sys/compat/opensolaris/kern/opensolaris_kobj.c#2 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__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 <sys/types.h>
#include <sys/systm.h>
@@ -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/scottl-camlock/src/sys/compat/opensolaris/kern/opensolaris_vfs.c#4 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__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 <sys/param.h>
#include <sys/kernel.h>
@@ -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/scottl-camlock/src/sys/conf/files#24 (text+ko) ====
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list