svn commit: r212361 - in user/nwhitehorn/ps3: arm/conf boot/fdt/dts
boot/forth cddl/contrib/opensolaris/uts/common/dtrace
cddl/contrib/opensolaris/uts/common/sys dev/acpica dev/ata
dev/ata/chipsets...
Nathan Whitehorn
nwhitehorn at FreeBSD.org
Thu Sep 9 13:38:37 UTC 2010
Author: nwhitehorn
Date: Thu Sep 9 13:38:36 2010
New Revision: 212361
URL: http://svn.freebsd.org/changeset/base/212361
Log:
IFC @ r212360 to pick up recent PowerPC-related memory management and VM
fixes.
Added:
user/nwhitehorn/ps3/arm/conf/DOCKSTAR
- copied unchanged from r212360, head/sys/arm/conf/DOCKSTAR
user/nwhitehorn/ps3/boot/fdt/dts/dockstar.dts
- copied unchanged from r212360, head/sys/boot/fdt/dts/dockstar.dts
Modified:
user/nwhitehorn/ps3/boot/forth/beastie.4th
user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c
user/nwhitehorn/ps3/dev/ata/ata-all.h
user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c
user/nwhitehorn/ps3/dev/ata/chipsets/ata-serverworks.c
user/nwhitehorn/ps3/dev/atkbdc/psm.c
user/nwhitehorn/ps3/dev/bge/if_bge.c
user/nwhitehorn/ps3/dev/e1000/if_em.c
user/nwhitehorn/ps3/dev/e1000/if_em.h
user/nwhitehorn/ps3/dev/mii/brgphy.c
user/nwhitehorn/ps3/dev/mii/brgphyreg.h
user/nwhitehorn/ps3/dev/pci/pcireg.h
user/nwhitehorn/ps3/fs/nfsclient/nfs_clrpcops.c
user/nwhitehorn/ps3/fs/nfsclient/nfs_clvnops.c
user/nwhitehorn/ps3/fs/nfsclient/nfsnode.h
user/nwhitehorn/ps3/fs/tmpfs/tmpfs_vnops.c
user/nwhitehorn/ps3/kern/kern_fork.c
user/nwhitehorn/ps3/kern/subr_bus.c
user/nwhitehorn/ps3/kern/vfs_mount.c
user/nwhitehorn/ps3/mips/mips/busdma_machdep.c
user/nwhitehorn/ps3/mips/rmi/dev/nlge/if_nlge.c
user/nwhitehorn/ps3/mips/rmi/dev/xlr/rge.c
user/nwhitehorn/ps3/mips/rmi/fmn.c
user/nwhitehorn/ps3/mips/rmi/msgring.h
user/nwhitehorn/ps3/mips/rmi/xlr_pci.c
user/nwhitehorn/ps3/nfsclient/nfs_vnops.c
user/nwhitehorn/ps3/nfsclient/nfsnode.h
user/nwhitehorn/ps3/powerpc/aim/mmu_oea.c
user/nwhitehorn/ps3/powerpc/aim/mmu_oea64.c
user/nwhitehorn/ps3/sys/time.h
user/nwhitehorn/ps3/vm/vm_mmap.c
user/nwhitehorn/ps3/vm/vm_pageout.c
user/nwhitehorn/ps3/x86/pci/qpi.c
Directory Properties:
user/nwhitehorn/ps3/ (props changed)
user/nwhitehorn/ps3/amd64/include/xen/ (props changed)
user/nwhitehorn/ps3/boot/powerpc/ps3/ (props changed)
user/nwhitehorn/ps3/cddl/contrib/opensolaris/ (props changed)
user/nwhitehorn/ps3/contrib/dev/acpica/ (props changed)
user/nwhitehorn/ps3/contrib/pf/ (props changed)
user/nwhitehorn/ps3/contrib/x86emu/ (props changed)
user/nwhitehorn/ps3/dev/xen/xenpci/ (props changed)
user/nwhitehorn/ps3/powerpc/ps3/ (props changed)
Copied: user/nwhitehorn/ps3/arm/conf/DOCKSTAR (from r212360, head/sys/arm/conf/DOCKSTAR)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/nwhitehorn/ps3/arm/conf/DOCKSTAR Thu Sep 9 13:38:36 2010 (r212361, copy of r212360, head/sys/arm/conf/DOCKSTAR)
@@ -0,0 +1,76 @@
+#
+# Custom kernel for Seagate DockStar (Marvell SheevaPlug based) devices.
+#
+# $FreeBSD$
+#
+
+ident DOCKSTAR
+include "../mv/kirkwood/std.sheevaplug"
+
+options SOC_MV_KIRKWOOD
+makeoptions MODULES_OVERRIDE=""
+
+#makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
+makeoptions WERROR="-Werror"
+
+options SCHED_4BSD #4BSD scheduler
+options INET #InterNETworking
+options INET6 #IPv6 communications protocols
+options FFS #Berkeley Fast Filesystem
+options NFSCLIENT #Network Filesystem Client
+options NFSLOCKD #Network Lock Manager
+options NFS_ROOT #NFS usable as /, requires NFSCLIENT
+options BOOTP
+options BOOTP_NFSROOT
+options BOOTP_NFSV3
+options BOOTP_COMPAT
+options BOOTP_WIRED_TO=mge0
+
+# Root fs on USB device
+#options ROOTDEVNAME=\"ufs:/dev/da0a\"
+
+options SYSVSHM #SYSV-style shared memory
+options SYSVMSG #SYSV-style message queues
+options SYSVSEM #SYSV-style semaphores
+options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions
+options MUTEX_NOINLINE
+options RWLOCK_NOINLINE
+options NO_FFS_SNAPSHOT
+options NO_SWAPPING
+
+# Debugging
+options ALT_BREAK_TO_DEBUGGER
+options DDB
+options KDB
+
+# Pseudo devices
+device md
+device random
+device pty
+device loop
+
+# Serial ports
+device uart
+
+# Networking
+device ether
+device mge # Marvell Gigabit Ethernet controller
+device mii
+device bpf
+options HZ=1000
+options DEVICE_POLLING
+device vlan
+
+# USB
+options USB_DEBUG # enable debug msgs
+device usb
+device ehci
+device umass
+device scbus
+device pass
+device da
+
+# Flattened Device Tree
+options FDT
+options FDT_DTB_STATIC
+makeoptions FDT_DTS_FILE=dockstar.dts
Copied: user/nwhitehorn/ps3/boot/fdt/dts/dockstar.dts (from r212360, head/sys/boot/fdt/dts/dockstar.dts)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ user/nwhitehorn/ps3/boot/fdt/dts/dockstar.dts Thu Sep 9 13:38:36 2010 (r212361, copy of r212360, head/sys/boot/fdt/dts/dockstar.dts)
@@ -0,0 +1,265 @@
+/*
+ * Copyright (c) 2010 The FreeBSD Foundation
+ * All rights reserved.
+ *
+ * This software was developed by Semihalf under sponsorship from
+ * the FreeBSD Foundation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Seagate DockStar (Marvell SheevaPlug based) Device Tree Source.
+ *
+ * $FreeBSD$
+ */
+
+/dts-v1/;
+
+/ {
+ model = "seagate,DockStar";
+ compatible = "DockStar";
+ #address-cells = <1>;
+ #size-cells = <1>;
+
+ aliases {
+ ethernet0 = &enet0;
+ mpp = &MPP;
+ serial0 = &serial0;
+ serial1 = &serial1;
+ soc = &SOC;
+ sram = &SRAM;
+ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu at 0 {
+ device_type = "cpu";
+ compatible = "ARM,88FR131";
+ reg = <0x0>;
+ d-cache-line-size = <32>; // 32 bytes
+ i-cache-line-size = <32>; // 32 bytes
+ d-cache-size = <0x4000>; // L1, 16K
+ i-cache-size = <0x4000>; // L1, 16K
+ timebase-frequency = <0>;
+ bus-frequency = <0>;
+ clock-frequency = <0>;
+ };
+ };
+
+ memory {
+ device_type = "memory";
+ reg = <0x0 0x8000000>; // 128M at 0x0
+ };
+
+ localbus at f1000000 {
+ #address-cells = <2>;
+ #size-cells = <1>;
+ compatible = "mrvl,lbc";
+
+ /* This reflects CPU decode windows setup. */
+ ranges = <0x0 0x0f 0xf9300000 0x00100000
+ 0x1 0x1e 0xfa000000 0x00100000
+ 0x2 0x1d 0xfa100000 0x02000000
+ 0x3 0x1b 0xfc100000 0x00000400>;
+
+ nor at 0,0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "cfi-flash";
+ reg = <0x0 0x0 0x00100000>;
+ bank-width = <2>;
+ device-width = <1>;
+ };
+
+ led at 1,0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "led";
+ reg = <0x1 0x0 0x00100000>;
+ };
+
+ nor at 2,0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "cfi-flash";
+ reg = <0x2 0x0 0x02000000>;
+ bank-width = <2>;
+ device-width = <1>;
+ };
+
+ nand at 3,0 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ reg = <0x3 0x0 0x00100000>;
+ bank-width = <2>;
+ device-width = <1>;
+ };
+ };
+
+ SOC: soc88f6281 at f1000000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ compatible = "simple-bus";
+ ranges = <0x0 0xf1000000 0x00100000>;
+ bus-frequency = <0>;
+
+ PIC: pic at 20200 {
+ interrupt-controller;
+ #address-cells = <0>;
+ #interrupt-cells = <1>;
+ reg = <0x20200 0x3c>;
+ compatible = "mrvl,pic";
+ };
+
+ timer at 20300 {
+ compatible = "mrvl,timer";
+ reg = <0x20300 0x30>;
+ interrupts = <1>;
+ interrupt-parent = <&PIC>;
+ mrvl,has-wdt;
+ };
+
+ MPP: mpp at 10000 {
+ #pin-cells = <2>;
+ compatible = "mrvl,mpp";
+ reg = <0x10000 0x34>;
+ pin-count = <50>;
+ pin-map = <
+ 0 1 /* MPP[0]: NF_IO[2] */
+ 1 1 /* MPP[1]: NF_IO[3] */
+ 2 1 /* MPP[2]: NF_IO[4] */
+ 3 1 /* MPP[3]: NF_IO[5] */
+ 4 1 /* MPP[4]: NF_IO[6] */
+ 5 1 /* MPP[5]: NF_IO[7] */
+ 6 1 /* MPP[6]: SYSRST_OUTn */
+ 8 2 /* MPP[8]: UA0_RTS */
+ 9 2 /* MPP[9]: UA0_CTS */
+ 10 3 /* MPP[10]: UA0_TXD */
+ 11 3 /* MPP[11]: UA0_RXD */
+ 12 1 /* MPP[12]: SD_CLK */
+ 13 1 /* MPP[13]: SD_CMD */
+ 14 1 /* MPP[14]: SD_D[0] */
+ 15 1 /* MPP[15]: SD_D[1] */
+ 16 1 /* MPP[16]: SD_D[2] */
+ 17 1 /* MPP[17]: SD_D[3] */
+ 18 1 /* MPP[18]: NF_IO[0] */
+ 19 1 /* MPP[19]: NF_IO[1] */
+ 29 1 >; /* MPP[29]: TSMP[9] */
+ };
+
+ GPIO: gpio at 10100 {
+ #gpio-cells = <3>;
+ compatible = "mrvl,gpio";
+ reg = <0x10100 0x20>;
+ gpio-controller;
+ interrupts = <35 36 37 38 39 40 41>;
+ interrupt-parent = <&PIC>;
+ };
+
+ rtc at 10300 {
+ compatible = "mrvl,rtc";
+ reg = <0x10300 0x08>;
+ };
+
+ twsi at 11000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "mrvl,twsi";
+ reg = <0x11000 0x20>;
+ interrupts = <43>;
+ interrupt-parent = <&PIC>;
+ };
+
+ enet0: ethernet at 72000 {
+ #address-cells = <1>;
+ #size-cells = <1>;
+ model = "V2";
+ compatible = "mrvl,ge";
+ reg = <0x72000 0x2000>;
+ ranges = <0x0 0x72000 0x2000>;
+ local-mac-address = [ 00 00 00 00 00 00 ];
+ interrupts = <12 13 14 11 46>;
+ interrupt-parent = <&PIC>;
+ phy-handle = <&phy0>;
+
+ mdio at 0 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+ compatible = "mrvl,mdio";
+
+ phy0: ethernet-phy at 0 {
+ reg = <0x0>;
+ };
+ };
+ };
+
+ serial0: serial at 12000 {
+ compatible = "ns16550";
+ reg = <0x12000 0x20>;
+ reg-shift = <2>;
+ clock-frequency = <0>;
+ interrupts = <33>;
+ interrupt-parent = <&PIC>;
+ };
+
+ serial1: serial at 12100 {
+ compatible = "ns16550";
+ reg = <0x12100 0x20>;
+ reg-shift = <2>;
+ clock-frequency = <0>;
+ interrupts = <34>;
+ interrupt-parent = <&PIC>;
+ };
+
+ crypto at 30000 {
+ compatible = "mrvl,cesa";
+ reg = <0x30000 0x10000>;
+ interrupts = <22>;
+ interrupt-parent = <&PIC>;
+ };
+
+ usb at 50000 {
+ compatible = "mrvl,usb-ehci", "usb-ehci";
+ reg = <0x50000 0x1000>;
+ interrupts = <48 19>;
+ interrupt-parent = <&PIC>;
+ };
+
+ xor at 60000 {
+ compatible = "mrvl,xor";
+ reg = <0x60000 0x1000>;
+ interrupts = <5 6 7 8>;
+ interrupt-parent = <&PIC>;
+ };
+ };
+
+ SRAM: sram at fd000000 {
+ compatible = "mrvl,cesa-sram";
+ reg = <0xfd000000 0x00100000>;
+ };
+
+ chosen {
+ stdin = "serial0";
+ stdout = "serial0";
+ };
+};
Modified: user/nwhitehorn/ps3/boot/forth/beastie.4th
==============================================================================
--- user/nwhitehorn/ps3/boot/forth/beastie.4th Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/boot/forth/beastie.4th Thu Sep 9 13:38:36 2010 (r212361)
@@ -240,7 +240,10 @@ set-current
drop
10
else
- 0 0 2swap >number drop drop drop
+ 2dup s" -1" compare 0= if
+ 0 boot
+ then
+ 0 s>d 2swap >number 2drop drop
then
begin
dup tkey
Modified: user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
==============================================================================
--- user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -9218,7 +9218,6 @@ dtrace_difo_init(dtrace_difo_t *dp, dtra
dtrace_difo_hold(dp);
}
-#if defined(sun)
static dtrace_difo_t *
dtrace_difo_duplicate(dtrace_difo_t *dp, dtrace_vstate_t *vstate)
{
@@ -9262,7 +9261,6 @@ dtrace_difo_duplicate(dtrace_difo_t *dp,
dtrace_difo_init(new, vstate);
return (new);
}
-#endif
static void
dtrace_difo_destroy(dtrace_difo_t *dp, dtrace_vstate_t *vstate)
@@ -14615,12 +14613,16 @@ dtrace_helpers_create(proc_t *p)
}
#if defined(sun)
-static void
-dtrace_helpers_destroy(void)
+static
+#endif
+void
+dtrace_helpers_destroy(proc_t *p)
{
dtrace_helpers_t *help;
dtrace_vstate_t *vstate;
+#if defined(sun)
proc_t *p = curproc;
+#endif
int i;
mutex_enter(&dtrace_lock);
@@ -14707,7 +14709,10 @@ dtrace_helpers_destroy(void)
mutex_exit(&dtrace_lock);
}
-static void
+#if defined(sun)
+static
+#endif
+void
dtrace_helpers_duplicate(proc_t *from, proc_t *to)
{
dtrace_helpers_t *help, *newhelp;
@@ -14788,7 +14793,6 @@ dtrace_helpers_duplicate(proc_t *from, p
if (hasprovs)
dtrace_helper_provider_register(to, newhelp, NULL);
}
-#endif
#if defined(sun)
/*
Modified: user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c
==============================================================================
--- user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -456,6 +456,16 @@ fasttrap_fork(proc_t *p, proc_t *cp)
#if defined(sun)
ASSERT(p->p_dtrace_count > 0);
#else
+ if (p->p_dtrace_helpers) {
+ /*
+ * dtrace_helpers_duplicate() allocates memory.
+ */
+ PROC_UNLOCK(p);
+ PROC_UNLOCK(cp);
+ dtrace_helpers_duplicate(p, cp);
+ PROC_LOCK(cp);
+ PROC_LOCK(p);
+ }
/*
* This check is purposely here instead of in kern_fork.c because,
* for legal resons, we cannot include the dtrace_cddl.h header
@@ -539,6 +549,10 @@ fasttrap_exec_exit(proc_t *p)
* static probes are handled by the meta-provider remove entry point.
*/
fasttrap_provider_retire(p->p_pid, FASTTRAP_PID_NAME, 0);
+#if !defined(sun)
+ if (p->p_dtrace_helpers)
+ dtrace_helpers_destroy(p);
+#endif
PROC_LOCK(p);
}
Modified: user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
==============================================================================
--- user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/sys/dtrace.h Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/cddl/contrib/opensolaris/uts/common/sys/dtrace.h Thu Sep 9 13:38:36 2010 (r212361)
@@ -2289,6 +2289,11 @@ extern int dtrace_blksuword32(uintptr_t,
extern void dtrace_getfsr(uint64_t *);
#endif
+#if !defined(sun)
+extern void dtrace_helpers_duplicate(proc_t *, proc_t *);
+extern void dtrace_helpers_destroy(proc_t *);
+#endif
+
#define DTRACE_CPUFLAG_ISSET(flag) \
(cpu_core[curcpu].cpuc_dtrace_flags & (flag))
Modified: user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c
==============================================================================
--- user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/acpica/acpi_hpet.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -89,6 +89,8 @@ struct hpet_softc {
int mode;
int intr_rid;
int irq;
+ int pcpu_cpu;
+ int pcpu_misrouted;
int pcpu_master;
int pcpu_slaves[MAXCPU];
struct resource *intr_res;
@@ -185,7 +187,7 @@ restart:
if (fdiv < 5000) {
bus_read_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num));
t->last = bus_read_4(sc->mem_res, HPET_MAIN_COUNTER);
- if ((int32_t)(t->last - cmp) < 0) {
+ if ((int32_t)(t->last - cmp) >= 0) {
fdiv *= 2;
goto restart;
}
@@ -215,6 +217,26 @@ hpet_intr_single(void *arg)
struct hpet_softc *sc = t->sc;
uint32_t now;
+ /* Check that per-CPU timer interrupt reached right CPU. */
+ if (t->pcpu_cpu >= 0 && t->pcpu_cpu != curcpu) {
+ if ((++t->pcpu_misrouted) % 32 == 0) {
+ printf("HPET interrupt routed to the wrong CPU"
+ " (timer %d CPU %d -> %d)!\n",
+ t->num, t->pcpu_cpu, curcpu);
+ }
+
+ /*
+ * Reload timer, hoping that next time may be more lucky
+ * (system will manage proper interrupt binding).
+ */
+ if ((t->mode == 1 && (t->caps & HPET_TCAP_PER_INT) == 0) ||
+ t->mode == 2) {
+ t->last = bus_read_4(sc->mem_res, HPET_MAIN_COUNTER);
+ bus_write_4(sc->mem_res, HPET_TIMER_COMPARATOR(t->num),
+ t->last + sc->freq / 8);
+ }
+ return (FILTER_HANDLED);
+ }
if (t->mode == 1 &&
(t->caps & HPET_TCAP_PER_INT) == 0) {
t->last += t->div;
@@ -394,6 +416,8 @@ hpet_attach(device_t dev)
t->mode = 0;
t->intr_rid = -1;
t->irq = -1;
+ t->pcpu_cpu = -1;
+ t->pcpu_misrouted = 0;
t->pcpu_master = -1;
t->caps = bus_read_4(sc->mem_res, HPET_TIMER_CAP_CNF(i));
t->vectors = bus_read_4(sc->mem_res, HPET_TIMER_CAP_CNF(i) + 4);
@@ -534,6 +558,7 @@ hpet_attach(device_t dev)
if (t->irq >= 0 && num_percpu_t > 0) {
if (cur_cpu == CPU_FIRST())
pcpu_master = i;
+ t->pcpu_cpu = cur_cpu;
t->pcpu_master = pcpu_master;
sc->t[pcpu_master].
pcpu_slaves[cur_cpu] = i;
Modified: user/nwhitehorn/ps3/dev/ata/ata-all.h
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/ata-all.h Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/ata/ata-all.h Thu Sep 9 13:38:36 2010 (r212361)
@@ -566,6 +566,7 @@ struct ata_channel {
#define ATA_SATA 0x80
#define ATA_DMA_BEFORE_CMD 0x100
#define ATA_KNOWN_PRESENCE 0x200
+#define ATA_STATUS_IS_LONG 0x400
int pm_level; /* power management level */
int devices; /* what is present */
Modified: user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/ata/ata-lowlevel.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -516,10 +516,13 @@ ata_generic_reset(device_t dev)
if ((mask & 0x01) && (stat0 & ATA_S_BUSY)) {
ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_MASTER));
DELAY(10);
+ if (ch->flags & ATA_STATUS_IS_LONG)
+ stat0 = ATA_IDX_INL(ch, ATA_STATUS) & 0xff;
+ else
+ stat0 = ATA_IDX_INB(ch, ATA_STATUS);
err = ATA_IDX_INB(ch, ATA_ERROR);
lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
- stat0 = ATA_IDX_INB(ch, ATA_STATUS);
if (bootverbose)
device_printf(dev,
"stat0=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
@@ -546,10 +549,13 @@ ata_generic_reset(device_t dev)
!((mask & 0x01) && (stat0 & ATA_S_BUSY))) {
ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_SLAVE));
DELAY(10);
+ if (ch->flags & ATA_STATUS_IS_LONG)
+ stat1 = ATA_IDX_INL(ch, ATA_STATUS) & 0xff;
+ else
+ stat1 = ATA_IDX_INB(ch, ATA_STATUS);
err = ATA_IDX_INB(ch, ATA_ERROR);
lsb = ATA_IDX_INB(ch, ATA_CYL_LSB);
msb = ATA_IDX_INB(ch, ATA_CYL_MSB);
- stat1 = ATA_IDX_INB(ch, ATA_STATUS);
if (bootverbose)
device_printf(dev,
"stat1=0x%02x err=0x%02x lsb=0x%02x msb=0x%02x\n",
Modified: user/nwhitehorn/ps3/dev/ata/chipsets/ata-serverworks.c
==============================================================================
--- user/nwhitehorn/ps3/dev/ata/chipsets/ata-serverworks.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/ata/chipsets/ata-serverworks.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -58,9 +58,8 @@ static int ata_serverworks_ch_detach(dev
static void ata_serverworks_tf_read(struct ata_request *request);
static void ata_serverworks_tf_write(struct ata_request *request);
static int ata_serverworks_setmode(device_t dev, int target, int mode);
-#ifdef __powerpc__
+static void ata_serverworks_sata_reset(device_t dev);
static int ata_serverworks_status(device_t dev);
-#endif
/* misc defines */
#define SWKS_33 0
@@ -101,7 +100,6 @@ ata_serverworks_probe(device_t dev)
return (BUS_PROBE_DEFAULT);
}
-#ifdef __powerpc__
static int
ata_serverworks_status(device_t dev)
{
@@ -123,7 +121,6 @@ ata_serverworks_status(device_t dev)
return ata_pci_status(dev);
}
-#endif
static int
ata_serverworks_chipinit(device_t dev)
@@ -145,6 +142,7 @@ ata_serverworks_chipinit(device_t dev)
ctlr->ch_detach = ata_serverworks_ch_detach;
ctlr->setmode = ata_sata_setmode;
ctlr->getrev = ata_sata_getrev;
+ ctlr->reset = ata_serverworks_sata_reset;
return 0;
}
else if (ctlr->chip->cfg1 == SWKS_33) {
@@ -210,30 +208,20 @@ ata_serverworks_ch_attach(device_t dev)
ch->r_io[ATA_SERROR].offset = ch_offset + 0x44;
ch->r_io[ATA_SCONTROL].offset = ch_offset + 0x48;
- ch->flags |= ATA_NO_SLAVE;
- ch->flags |= ATA_SATA;
+ ch->flags |= ATA_NO_SLAVE | ATA_SATA | ATA_KNOWN_PRESENCE;
ata_pci_hw(dev);
ch->hw.tf_read = ata_serverworks_tf_read;
ch->hw.tf_write = ata_serverworks_tf_write;
-#ifdef __powerpc__
- ch->hw.status = ata_serverworks_status;
-#endif
if (ctlr->chip->chipid == ATA_K2) {
/*
- * The revision 1 K2 SATA controller has interesting bugs. Patch them.
- * These magic numbers regulate interrupt delivery in the first few
- * cases and are pure magic in the last case.
- *
- * Values obtained from the Darwin driver.
+ * Set SICR registers to turn off waiting for a status message
+ * before sending FIS. Values obtained from the Darwin driver.
*/
- ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, 0x04);
- ATA_IDX_OUTL(ch, ATA_SERROR, 0xffffffff);
- ATA_IDX_OUTL(ch, ATA_SCONTROL, 0x00000300);
- ATA_OUTL(ctlr->r_res2, ch_offset + 0x88, 0);
ATA_OUTL(ctlr->r_res2, ch_offset + 0x80,
ATA_INL(ctlr->r_res2, ch_offset + 0x80) & ~0x00040000);
+ ATA_OUTL(ctlr->r_res2, ch_offset + 0x88, 0);
/*
* Some controllers have a bug where they will send the command
@@ -244,6 +232,14 @@ ata_serverworks_ch_attach(device_t dev)
*/
ch->flags |= ATA_DMA_BEFORE_CMD;
+
+ /*
+ * The status register must be read as a long to fill the other
+ * registers.
+ */
+
+ ch->hw.status = ata_serverworks_status;
+ ch->flags |= ATA_STATUS_IS_LONG;
}
/* chip does not reliably do 64K DMA transfers */
@@ -404,4 +400,15 @@ ata_serverworks_setmode(device_t dev, in
return (mode);
}
+static void
+ata_serverworks_sata_reset(device_t dev)
+{
+ struct ata_channel *ch = device_get_softc(dev);
+
+ if (ata_sata_phy_reset(dev, -1, 1))
+ ata_generic_reset(dev);
+ else
+ ch->devices = 0;
+}
+
ATA_DECLARE_DRIVER(ata_serverworks);
Modified: user/nwhitehorn/ps3/dev/atkbdc/psm.c
==============================================================================
--- user/nwhitehorn/ps3/dev/atkbdc/psm.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/atkbdc/psm.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -143,11 +143,6 @@ __FBSDID("$FreeBSD$");
#define MOUSE_PS2PLUS_PACKET_TYPE(b) \
(((b[0] & 0x30) >> 2) | ((b[1] & 0x30) >> 4))
-/* some macros */
-#define PSM_UNIT(dev) (dev2unit(dev) >> 1)
-#define PSM_NBLOCKIO(dev) (dev2unit(dev) & 1)
-#define PSM_MKMINOR(unit,block) (((unit) << 1) | ((block) ? 0:1))
-
/* ring buffer */
typedef struct ringbuf {
int count; /* # of valid elements in the buffer */
@@ -305,8 +300,6 @@ struct psm_softc { /* Driver status inf
struct sigio *async; /* Processes waiting for SIGIO */
};
static devclass_t psm_devclass;
-#define PSM_SOFTC(unit) \
- ((struct psm_softc*)devclass_get_softc(psm_devclass, unit))
/* driver state flags (state) */
#define PSM_VALID 0x80
@@ -1457,10 +1450,10 @@ psmattach(device_t dev)
}
/* Done */
- sc->dev = make_dev(&psm_cdevsw, PSM_MKMINOR(unit, FALSE), 0, 0, 0666,
- "psm%d", unit);
- sc->bdev = make_dev(&psm_cdevsw, PSM_MKMINOR(unit, TRUE), 0, 0, 0666,
- "bpsm%d", unit);
+ sc->dev = make_dev(&psm_cdevsw, 0, 0, 0, 0666, "psm%d", unit);
+ sc->dev->si_drv1 = sc;
+ sc->bdev = make_dev(&psm_cdevsw, 0, 0, 0, 0666, "bpsm%d", unit);
+ sc->bdev->si_drv1 = sc;
if (!verbose)
printf("psm%d: model %s, device ID %d\n",
@@ -1504,14 +1497,13 @@ psmdetach(device_t dev)
static int
psmopen(struct cdev *dev, int flag, int fmt, struct thread *td)
{
- int unit = PSM_UNIT(dev);
struct psm_softc *sc;
int command_byte;
int err;
int s;
/* Get device data */
- sc = PSM_SOFTC(unit);
+ sc = dev->si_drv1;
if ((sc == NULL) || (sc->state & PSM_VALID) == 0) {
/* the device is no longer valid/functioning */
return (ENXIO);
@@ -1521,7 +1513,7 @@ psmopen(struct cdev *dev, int flag, int
if (sc->state & PSM_OPEN)
return (EBUSY);
- device_busy(devclass_get_device(psm_devclass, unit));
+ device_busy(devclass_get_device(psm_devclass, sc->unit));
/* Initialize state */
sc->mode.level = sc->dflt_mode.level;
@@ -1565,7 +1557,8 @@ psmopen(struct cdev *dev, int flag, int
kbdc_lock(sc->kbdc, FALSE);
splx(s);
log(LOG_ERR,
- "psm%d: unable to set the command byte (psmopen).\n", unit);
+ "psm%d: unable to set the command byte (psmopen).\n",
+ sc->unit);
return (EIO);
}
/*
@@ -1590,8 +1583,7 @@ psmopen(struct cdev *dev, int flag, int
static int
psmclose(struct cdev *dev, int flag, int fmt, struct thread *td)
{
- int unit = PSM_UNIT(dev);
- struct psm_softc *sc = PSM_SOFTC(unit);
+ struct psm_softc *sc = dev->si_drv1;
int stat[3];
int command_byte;
int s;
@@ -1615,7 +1607,8 @@ psmclose(struct cdev *dev, int flag, int
KBD_DISABLE_KBD_PORT | KBD_DISABLE_KBD_INT |
KBD_ENABLE_AUX_PORT | KBD_DISABLE_AUX_INT)) {
log(LOG_ERR,
- "psm%d: failed to disable the aux int (psmclose).\n", unit);
+ "psm%d: failed to disable the aux int (psmclose).\n",
+ sc->unit);
/* CONTROLLER ERROR;
* NOTE: we shall force our way through. Because the only
* ill effect we shall see is that we may not be able
@@ -1643,12 +1636,13 @@ psmclose(struct cdev *dev, int flag, int
*/
log(LOG_ERR,
"psm%d: failed to disable the device (psmclose).\n",
- unit);
+ sc->unit);
}
if (get_mouse_status(sc->kbdc, stat, 0, 3) < 3)
log(LOG_DEBUG,
- "psm%d: failed to get status (psmclose).\n", unit);
+ "psm%d: failed to get status (psmclose).\n",
+ sc->unit);
}
if (!set_controller_command_byte(sc->kbdc,
@@ -1661,7 +1655,7 @@ psmclose(struct cdev *dev, int flag, int
*/
log(LOG_ERR,
"psm%d: failed to disable the aux port (psmclose).\n",
- unit);
+ sc->unit);
}
/* remove anything left in the output buffer */
@@ -1676,7 +1670,7 @@ psmclose(struct cdev *dev, int flag, int
/* close is almost always successful */
sc->state &= ~PSM_OPEN;
kbdc_lock(sc->kbdc, FALSE);
- device_unbusy(devclass_get_device(psm_devclass, unit));
+ device_unbusy(devclass_get_device(psm_devclass, sc->unit));
return (0);
}
@@ -1745,7 +1739,7 @@ tame_mouse(struct psm_softc *sc, packetb
static int
psmread(struct cdev *dev, struct uio *uio, int flag)
{
- register struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev));
+ struct psm_softc *sc = dev->si_drv1;
u_char buf[PSM_SMALLBUFSIZE];
int error = 0;
int s;
@@ -1757,7 +1751,7 @@ psmread(struct cdev *dev, struct uio *ui
/* block until mouse activity occured */
s = spltty();
while (sc->queue.count <= 0) {
- if (PSM_NBLOCKIO(dev)) {
+ if (dev != sc->bdev) {
splx(s);
return (EWOULDBLOCK);
}
@@ -1892,7 +1886,7 @@ unblock_mouse_data(struct psm_softc *sc,
static int
psmwrite(struct cdev *dev, struct uio *uio, int flag)
{
- register struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev));
+ struct psm_softc *sc = dev->si_drv1;
u_char buf[PSM_SMALLBUFSIZE];
int error = 0, i, l;
@@ -1925,7 +1919,7 @@ static int
psmioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
struct thread *td)
{
- struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev));
+ struct psm_softc *sc = dev->si_drv1;
mousemode_t mode;
mousestatus_t status;
#if (defined(MOUSE_GETVARS))
@@ -3270,7 +3264,7 @@ psmsoftintr(void *arg)
MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN,
MOUSE_BUTTON1DOWN | MOUSE_BUTTON2DOWN | MOUSE_BUTTON3DOWN
};
- register struct psm_softc *sc = arg;
+ struct psm_softc *sc = arg;
mousestatus_t ms;
packetbuf_t *pb;
int x, y, z, c, l, s;
@@ -3519,7 +3513,7 @@ next:
static int
psmpoll(struct cdev *dev, int events, struct thread *td)
{
- struct psm_softc *sc = PSM_SOFTC(PSM_UNIT(dev));
+ struct psm_softc *sc = dev->si_drv1;
int s;
int revents = 0;
Modified: user/nwhitehorn/ps3/dev/bge/if_bge.c
==============================================================================
--- user/nwhitehorn/ps3/dev/bge/if_bge.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/bge/if_bge.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -2258,6 +2258,15 @@ bge_dma_alloc(struct bge_softc *sc)
if (error)
return (error);
+ /* Create tag for statistics block. */
+ error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_STATS_SZ,
+ &sc->bge_cdata.bge_stats_tag,
+ (uint8_t **)&sc->bge_ldata.bge_stats,
+ &sc->bge_cdata.bge_stats_map,
+ &sc->bge_ldata.bge_stats_paddr, "statistics block");
+ if (error)
+ return (error);
+
/* Create tag for jumbo RX ring. */
if (BGE_IS_JUMBO_CAPABLE(sc)) {
error = bge_dma_ring_alloc(sc, PAGE_SIZE, BGE_JUMBO_RX_RING_SZ,
Modified: user/nwhitehorn/ps3/dev/e1000/if_em.c
==============================================================================
--- user/nwhitehorn/ps3/dev/e1000/if_em.c Thu Sep 9 13:32:58 2010 (r212360)
+++ user/nwhitehorn/ps3/dev/e1000/if_em.c Thu Sep 9 13:38:36 2010 (r212361)
@@ -93,7 +93,7 @@ int em_display_debug_stats = 0;
/*********************************************************************
* Driver version:
*********************************************************************/
-char em_driver_version[] = "7.0.5";
+char em_driver_version[] = "7.0.6";
/*********************************************************************
@@ -281,6 +281,8 @@ static void em_handle_link(void *context
static void em_add_rx_process_limit(struct adapter *, const char *,
const char *, int *, int);
+static __inline void em_rx_discard(struct rx_ring *, int);
+
#ifdef DEVICE_POLLING
static poll_handler_t em_poll;
#endif /* POLLING */
@@ -2563,11 +2565,11 @@ msi:
val = pci_msi_count(dev);
if (val == 1 && pci_alloc_msi(dev, &val) == 0) {
adapter->msix = 1;
- device_printf(adapter->dev,"Using MSI interrupt\n");
+ device_printf(adapter->dev,"Using an MSI interrupt\n");
return (val);
}
- /* Should only happen due to manual invention */
- device_printf(adapter->dev,"Setup MSIX failure\n");
+ /* Should only happen due to manual configuration */
+ device_printf(adapter->dev,"No MSI/MSIX using a Legacy IRQ\n");
return (0);
}
@@ -3681,14 +3683,27 @@ em_refresh_mbufs(struct rx_ring *rxr, in
struct adapter *adapter = rxr->adapter;
struct mbuf *m;
bus_dma_segment_t segs[1];
- bus_dmamap_t map;
struct em_buffer *rxbuf;
int i, error, nsegs, cleaned;
i = rxr->next_to_refresh;
cleaned = -1;
while (i != limit) {
+ rxbuf = &rxr->rx_buffers[i];
+ /*
+ ** Just skip entries with a buffer,
+ ** they can only be due to an error
+ ** and are to be reused.
+ */
+ if (rxbuf->m_head != NULL)
+ goto reuse;
m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
+ /*
+ ** If we have a temporary resource shortage
+ ** that causes a failure, just abort refresh
+ ** for now, we will return to this point when
+ ** reinvoked from em_rxeof.
+ */
if (m == NULL)
goto update;
m->m_len = m->m_pkthdr.len = MCLBYTES;
@@ -3696,11 +3711,8 @@ em_refresh_mbufs(struct rx_ring *rxr, in
if (adapter->max_frame_size <= (MCLBYTES - ETHER_ALIGN))
m_adj(m, ETHER_ALIGN);
- /*
- * Using memory from the mbuf cluster pool, invoke the
- * bus_dma machinery to arrange the memory mapping.
- */
- error = bus_dmamap_load_mbuf_sg(rxr->rxtag, rxr->rx_sparemap,
+ /* Use bus_dma machinery to setup the memory mapping */
+ error = bus_dmamap_load_mbuf_sg(rxr->rxtag, rxbuf->map,
m, segs, &nsegs, BUS_DMA_NOWAIT);
if (error != 0) {
m_free(m);
@@ -3710,18 +3722,11 @@ em_refresh_mbufs(struct rx_ring *rxr, in
/* If nsegs is wrong then the stack is corrupt. */
KASSERT(nsegs == 1, ("Too many segments returned!"));
- rxbuf = &rxr->rx_buffers[i];
- if (rxbuf->m_head != NULL)
- bus_dmamap_unload(rxr->rxtag, rxbuf->map);
-
- map = rxbuf->map;
- rxbuf->map = rxr->rx_sparemap;
- rxr->rx_sparemap = map;
bus_dmamap_sync(rxr->rxtag,
rxbuf->map, BUS_DMASYNC_PREREAD);
rxbuf->m_head = m;
rxr->rx_base[i].buffer_addr = htole64(segs[0].ds_addr);
-
+reuse:
cleaned = i;
/* Calculate next index */
if (++i == adapter->num_rx_desc)
@@ -3730,8 +3735,10 @@ em_refresh_mbufs(struct rx_ring *rxr, in
rxr->next_to_refresh = i;
}
update:
- bus_dmamap_sync(rxr->rxdma.dma_tag, rxr->rxdma.dma_map,
- BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+ /*
+ ** Update the tail pointer only if,
+ ** and as far as we have refreshed.
+ */
if (cleaned != -1) /* Update tail index */
E1000_WRITE_REG(&adapter->hw,
E1000_RDT(rxr->me), cleaned);
@@ -3781,15 +3788,6 @@ em_allocate_receive_buffers(struct rx_ri
goto fail;
}
- /* Create the spare map (used by getbuf) */
- error = bus_dmamap_create(rxr->rxtag, BUS_DMA_NOWAIT,
- &rxr->rx_sparemap);
- if (error) {
- device_printf(dev, "%s: bus_dmamap_create failed: %d\n",
- __func__, error);
- goto fail;
- }
-
rxbuf = rxr->rx_buffers;
for (int i = 0; i < adapter->num_rx_desc; i++, rxbuf++) {
rxbuf = &rxr->rx_buffers[i];
@@ -3956,11 +3954,6 @@ em_free_receive_buffers(struct rx_ring *
INIT_DEBUGOUT("free_receive_buffers: begin");
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-user
mailing list