PERFORCE change 116720 for review
Marcel Moolenaar
marcel at FreeBSD.org
Wed Mar 28 07:07:56 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=116720
Change 116720 by marcel at marcel_xcllnt on 2007/03/28 07:07:26
IFC @116719
Affected files ...
.. //depot/projects/uart/Makefile#11 integrate
.. //depot/projects/uart/amd64/amd64/identcpu.c#13 integrate
.. //depot/projects/uart/amd64/amd64/prof_machdep.c#6 integrate
.. //depot/projects/uart/amd64/amd64/trap.c#17 integrate
.. //depot/projects/uart/amd64/amd64/tsc.c#6 integrate
.. //depot/projects/uart/arm/at91/at91_st.c#7 integrate
.. //depot/projects/uart/arm/at91/at91_twi.c#7 integrate
.. //depot/projects/uart/arm/at91/at91_twireg.h#2 integrate
.. //depot/projects/uart/arm/at91/kb920x_machdep.c#9 integrate
.. //depot/projects/uart/arm/conf/KB920X#7 integrate
.. //depot/projects/uart/arm/conf/KB920X.hints#1 branch
.. //depot/projects/uart/arm/xscale/i80321/i80321_wdog.c#3 integrate
.. //depot/projects/uart/arm/xscale/ixp425/ixp425_wdog.c#2 integrate
.. //depot/projects/uart/boot/ficl/ficl.h#3 integrate
.. //depot/projects/uart/boot/ficl/float.c#2 integrate
.. //depot/projects/uart/boot/ficl/softwords/fileaccess.fr#2 integrate
.. //depot/projects/uart/boot/ficl/softwords/jhlocal.fr#2 integrate
.. //depot/projects/uart/boot/ficl/softwords/oo.fr#2 integrate
.. //depot/projects/uart/boot/ficl/softwords/prefix.fr#2 integrate
.. //depot/projects/uart/boot/ficl/softwords/softcore.awk#2 integrate
.. //depot/projects/uart/boot/ficl/tools.c#2 integrate
.. //depot/projects/uart/boot/ficl/unix.c#2 integrate
.. //depot/projects/uart/boot/ficl/vm.c#2 integrate
.. //depot/projects/uart/boot/ficl/words.c#2 integrate
.. //depot/projects/uart/boot/i386/boot0/boot0.S#7 integrate
.. //depot/projects/uart/conf/NOTES#48 integrate
.. //depot/projects/uart/conf/files#80 integrate
.. //depot/projects/uart/conf/kern.post.mk#19 integrate
.. //depot/projects/uart/conf/options#45 integrate
.. //depot/projects/uart/contrib/altq/altq/altq_subr.c#4 integrate
.. //depot/projects/uart/dev/acpica/Osd/OsdSynch.c#9 integrate
.. //depot/projects/uart/dev/ce/if_ce.c#5 integrate
.. //depot/projects/uart/dev/cxgb/cxgb_adapter.h#2 integrate
.. //depot/projects/uart/dev/cxgb/cxgb_main.c#2 integrate
.. //depot/projects/uart/dev/cxgb/cxgb_sge.c#2 integrate
.. //depot/projects/uart/dev/exca/exca.c#14 integrate
.. //depot/projects/uart/dev/ichwd/ichwd.c#5 integrate
.. //depot/projects/uart/dev/iicbus/icee.c#1 branch
.. //depot/projects/uart/dev/iicbus/iic.c#9 integrate
.. //depot/projects/uart/dev/iicbus/iicbb.c#6 integrate
.. //depot/projects/uart/dev/iicbus/iicbus.c#7 integrate
.. //depot/projects/uart/dev/iicbus/iicbus.h#4 integrate
.. //depot/projects/uart/dev/iicbus/iiconf.c#5 integrate
.. //depot/projects/uart/dev/ipmi/ipmi.c#7 integrate
.. //depot/projects/uart/dev/ipw/if_ipw.c#9 integrate
.. //depot/projects/uart/dev/mk48txx/mk48txx.c#9 integrate
.. //depot/projects/uart/dev/mxge/if_mxge.c#7 integrate
.. //depot/projects/uart/dev/pci/pci.c#29 integrate
.. //depot/projects/uart/dev/pci/pcivar.h#12 integrate
.. //depot/projects/uart/dev/scc/scc_core.c#28 integrate
.. //depot/projects/uart/dev/snp/snp.c#10 integrate
.. //depot/projects/uart/dev/usb/uhci.c#20 integrate
.. //depot/projects/uart/dev/usb/uplcom.c#19 integrate
.. //depot/projects/uart/dev/usb/usb_quirks.c#12 integrate
.. //depot/projects/uart/dev/usb/usbdevs#30 integrate
.. //depot/projects/uart/dev/watchdog/watchdog.c#4 integrate
.. //depot/projects/uart/fs/devfs/devfs_vnops.c#20 integrate
.. //depot/projects/uart/fs/udf/udf_vnops.c#15 integrate
.. //depot/projects/uart/geom/geom_dev.c#14 integrate
.. //depot/projects/uart/i386/i386/elan-mmcr.c#8 integrate
.. //depot/projects/uart/i386/i386/geode.c#6 integrate
.. //depot/projects/uart/i386/i386/identcpu.c#24 integrate
.. //depot/projects/uart/i386/i386/locore.s#10 integrate
.. //depot/projects/uart/i386/i386/pmap.c#47 integrate
.. //depot/projects/uart/i386/i386/trap.c#18 integrate
.. //depot/projects/uart/i386/i386/tsc.c#8 integrate
.. //depot/projects/uart/i386/ibcs2/ibcs2_misc.c#12 integrate
.. //depot/projects/uart/i386/isa/prof_machdep.c#6 integrate
.. //depot/projects/uart/kern/init_main.c#19 integrate
.. //depot/projects/uart/kern/kern_cpu.c#6 integrate
.. //depot/projects/uart/kern/kern_exec.c#23 integrate
.. //depot/projects/uart/kern/kern_proc.c#19 integrate
.. //depot/projects/uart/kern/kern_thread.c#26 integrate
.. //depot/projects/uart/kern/sysv_sem.c#16 integrate
.. //depot/projects/uart/kern/uipc_sockbuf.c#4 integrate
.. //depot/projects/uart/kern/uipc_socket.c#26 integrate
.. //depot/projects/uart/kern/uipc_socket2.c#18 delete
.. //depot/projects/uart/kern/vfs_bio.c#28 integrate
.. //depot/projects/uart/kern/vfs_subr.c#38 integrate
.. //depot/projects/uart/modules/Makefile#46 integrate
.. //depot/projects/uart/modules/if_edsc/Makefile#1 branch
.. //depot/projects/uart/net/if.c#26 integrate
.. //depot/projects/uart/net/if_disc.c#10 integrate
.. //depot/projects/uart/net/if_edsc.c#1 branch
.. //depot/projects/uart/net/rtsock.c#16 integrate
.. //depot/projects/uart/netgraph/bluetooth/socket/ng_btsocket_l2cap.c#10 integrate
.. //depot/projects/uart/netinet/in_pcb.h#13 integrate
.. //depot/projects/uart/netinet/ip_input.c#21 integrate
.. //depot/projects/uart/netinet/ip_output.c#21 integrate
.. //depot/projects/uart/netinet/tcp_debug.h#4 integrate
.. //depot/projects/uart/netinet/tcp_input.c#30 integrate
.. //depot/projects/uart/netinet/tcp_sack.c#11 integrate
.. //depot/projects/uart/nfsclient/nfs_vfsops.c#18 integrate
.. //depot/projects/uart/nfsserver/nfs_serv.c#15 integrate
.. //depot/projects/uart/rpc/rpcclnt.c#6 integrate
.. //depot/projects/uart/sys/cpu.h#2 integrate
.. //depot/projects/uart/sys/eventhandler.h#6 integrate
.. //depot/projects/uart/sys/mbuf.h#17 integrate
.. //depot/projects/uart/sys/param.h#31 integrate
.. //depot/projects/uart/sys/rwlock.h#8 integrate
.. //depot/projects/uart/vm/vm_fault.c#21 integrate
.. //depot/projects/uart/vm/vm_map.c#26 integrate
.. //depot/projects/uart/vm/vm_object.c#27 integrate
Differences ...
==== //depot/projects/uart/Makefile#11 (text+ko) ====
@@ -1,4 +1,4 @@
-# $FreeBSD: src/sys/Makefile,v 1.40 2006/11/26 18:27:16 maxim Exp $
+# $FreeBSD: src/sys/Makefile,v 1.41 2007/03/24 22:21:01 maxim Exp $
.include <bsd.own.mk>
@@ -9,7 +9,7 @@
# Directories to include in cscope name file and TAGS.
CSCOPEDIRS= cam coda compat conf contrib crypto ddb dev fs geom gnu i4b \
- isa isofs kern libkern modules net net80211 netatalk netatm \
+ isa kern libkern modules net net80211 netatalk netatm \
netgraph netinet netinet6 netipx netkey netnatm netncp \
netsmb nfs nfsclient nfs4client rpc pccard pci sys \
ufs vm ${ARCHDIR}
==== //depot/projects/uart/amd64/amd64/identcpu.c#13 (text+ko) ====
@@ -39,12 +39,14 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/identcpu.c,v 1.152 2007/03/20 20:22:45 jkim Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/identcpu.c,v 1.153 2007/03/26 18:03:29 njl Exp $");
#include "opt_cpu.h"
#include <sys/param.h>
#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/eventhandler.h>
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/sysctl.h>
@@ -404,6 +406,21 @@
}
+/* Update TSC freq with the value indicated by the caller. */
+static void
+tsc_freq_changed(void *arg, const struct cf_level *level, int status)
+{
+ /* If there was an error during the transition, don't do anything. */
+ if (status != 0)
+ return;
+
+ /* Total setting for this level gives the new frequency in MHz. */
+ hw_clockrate = level->total_set.freq;
+}
+
+EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL,
+ EVENTHANDLER_PRI_ANY);
+
/*
* Final stage of CPU identification. -- Should I check TI?
*/
==== //depot/projects/uart/amd64/amd64/prof_machdep.c#6 (text+ko) ====
@@ -25,7 +25,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/prof_machdep.c,v 1.28 2006/10/29 09:48:44 bde Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/prof_machdep.c,v 1.29 2007/03/26 18:03:29 njl Exp $");
#ifdef GUPROF
#if 0
@@ -35,6 +35,9 @@
#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/eventhandler.h>
#include <sys/gmon.h>
#include <sys/kernel.h>
#include <sys/smp.h>
@@ -60,6 +63,9 @@
static int cputime_clock_pmc_init;
static struct gmonparam saved_gmp;
#endif
+#if defined(I586_CPU) || defined(I686_CPU)
+static int cputime_prof_active;
+#endif
#endif /* GUPROF */
#ifdef __GNUCLIKE_ASM
@@ -205,6 +211,7 @@
u_char high, low;
static u_int prev_count;
+#if defined(I586_CPU) || defined(I686_CPU)
if (cputime_clock == CPUTIME_CLOCK_TSC) {
/*
* Scale the TSC a little to make cputime()'s frequency
@@ -233,6 +240,7 @@
return (delta);
}
#endif /* PERFMON && I586_PMC_GUPROF && !SMP */
+#endif /* I586_CPU || I686_CPU */
/*
* Read the current value of the 8254 timer counter 0.
@@ -314,12 +322,17 @@
{
if (cputime_clock == CPUTIME_CLOCK_UNINITIALIZED) {
cputime_clock = CPUTIME_CLOCK_I8254;
- if (tsc_freq != 0 && !tsc_is_broken && mp_ncpus < 2)
+#if defined(I586_CPU) || defined(I686_CPU)
+ if (tsc_freq != 0 && !tsc_is_broken && mp_ncpus == 1)
cputime_clock = CPUTIME_CLOCK_TSC;
+#endif
}
gp->profrate = timer_freq << CPUTIME_CLOCK_I8254_SHIFT;
- if (cputime_clock == CPUTIME_CLOCK_TSC)
+#if defined(I586_CPU) || defined(I686_CPU)
+ if (cputime_clock == CPUTIME_CLOCK_TSC) {
gp->profrate = tsc_freq >> 1;
+ cputime_prof_active = 1;
+ }
#if defined(PERFMON) && defined(I586_PMC_GUPROF)
else if (cputime_clock == CPUTIME_CLOCK_I586_PMC) {
if (perfmon_avail() &&
@@ -346,6 +359,7 @@
}
}
#endif /* PERFMON && I586_PMC_GUPROF */
+#endif /* I586_CPU || I686_CPU */
cputime_bias = 0;
cputime();
}
@@ -361,5 +375,27 @@
cputime_clock_pmc_init = FALSE;
}
#endif
+#if defined(I586_CPU) || defined(I686_CPU)
+ if (cputime_clock == CPUTIME_CLOCK_TSC)
+ cputime_prof_active = 0;
+#endif
}
+
+#if defined(I586_CPU) || defined(I686_CPU)
+/* If the cpu frequency changed while profiling, report a warning. */
+static void
+tsc_freq_changed(void *arg, const struct cf_level *level, int status)
+{
+
+ /* If there was an error during the transition, don't do anything. */
+ if (status != 0)
+ return;
+ if (cputime_prof_active && cputime_clock == CPUTIME_CLOCK_TSC)
+ printf("warning: cpu freq changed while profiling active\n");
+}
+
+EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL,
+ EVENTHANDLER_PRI_ANY);
+#endif /* I586_CPU || I686_CPU */
+
#endif /* GUPROF */
==== //depot/projects/uart/amd64/amd64/trap.c#17 (text+ko) ====
@@ -38,7 +38,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.314 2007/03/09 04:02:36 mohans Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/trap.c,v 1.315 2007/03/26 21:45:44 kris Exp $");
/*
* AMD64 Trap and System call handling
@@ -745,10 +745,8 @@
#ifdef DIAGNOSTIC
if (ISPL(frame->tf_cs) != SEL_UPL) {
- mtx_lock(&Giant); /* try to stabilize the system XXX */
panic("syscall");
/* NOT REACHED */
- mtx_unlock(&Giant);
}
#endif
==== //depot/projects/uart/amd64/amd64/tsc.c#6 (text+ko) ====
@@ -25,11 +25,14 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/amd64/amd64/tsc.c,v 1.206 2006/02/11 09:33:05 phk Exp $");
+__FBSDID("$FreeBSD: src/sys/amd64/amd64/tsc.c,v 1.207 2007/03/26 18:03:29 njl Exp $");
#include "opt_clock.h"
#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/malloc.h>
#include <sys/systm.h>
#include <sys/sysctl.h>
#include <sys/time.h>
@@ -41,8 +44,11 @@
#include <machine/md_var.h>
#include <machine/specialreg.h>
+#include "cpufreq_if.h"
+
uint64_t tsc_freq;
int tsc_is_broken;
+static eventhandler_tag tsc_levels_tag, tsc_pre_tag, tsc_post_tag;
#ifdef SMP
static int smp_tsc;
@@ -51,14 +57,19 @@
TUNABLE_INT("kern.timecounter.smp_tsc", &smp_tsc);
#endif
+static void tsc_freq_changed(void *arg, const struct cf_level *level,
+ int status);
+static void tsc_freq_changing(void *arg, const struct cf_level *level,
+ int *status);
static unsigned tsc_get_timecount(struct timecounter *tc);
+static void tsc_levels_changed(void *arg, int unit);
static struct timecounter tsc_timecounter = {
tsc_get_timecount, /* get_timecount */
0, /* no poll_pps */
- ~0u, /* counter_mask */
+ ~0u, /* counter_mask */
0, /* frequency */
- "TSC", /* name */
+ "TSC", /* name */
800, /* quality (adjusted in code) */
};
@@ -77,10 +88,24 @@
tsc_freq = tscval[1] - tscval[0];
if (bootverbose)
printf("TSC clock: %lu Hz\n", tsc_freq);
+
+ /*
+ * Inform CPU accounting about our boot-time clock rate. Once the
+ * system is finished booting, we will get the real max clock rate
+ * via tsc_freq_max(). This also will be updated if someone loads
+ * a cpufreq driver after boot that discovers a new max frequency.
+ */
set_cputicker(rdtsc, tsc_freq, 1);
+
+ /* Register to find out about changes in CPU frequency. */
+ tsc_pre_tag = EVENTHANDLER_REGISTER(cpufreq_pre_change,
+ tsc_freq_changing, NULL, EVENTHANDLER_PRI_FIRST);
+ tsc_post_tag = EVENTHANDLER_REGISTER(cpufreq_post_change,
+ tsc_freq_changed, NULL, EVENTHANDLER_PRI_FIRST);
+ tsc_levels_tag = EVENTHANDLER_REGISTER(cpufreq_levels_changed,
+ tsc_levels_changed, NULL, EVENTHANDLER_PRI_ANY);
}
-
void
init_TSC_tc(void)
{
@@ -104,6 +129,72 @@
}
}
+/*
+ * When cpufreq levels change, find out about the (new) max frequency. We
+ * use this to update CPU accounting in case it got a lower estimate at boot.
+ */
+static void
+tsc_levels_changed(void *arg, int unit)
+{
+ device_t cf_dev;
+ struct cf_level *levels;
+ int count, error;
+ uint64_t max_freq;
+
+ /* Only use values from the first CPU, assuming all are equal. */
+ if (unit != 0)
+ return;
+
+ /* Find the appropriate cpufreq device instance. */
+ cf_dev = devclass_get_device(devclass_find("cpufreq"), unit);
+ if (cf_dev == NULL) {
+ printf("tsc_levels_changed() called but no cpufreq device?\n");
+ return;
+ }
+
+ /* Get settings from the device and find the max frequency. */
+ count = 64;
+ levels = malloc(count * sizeof(*levels), M_TEMP, M_NOWAIT);
+ if (levels == NULL)
+ return;
+ error = CPUFREQ_LEVELS(cf_dev, levels, &count);
+ if (error == 0 && count != 0) {
+ max_freq = (uint64_t)levels[0].total_set.freq * 1000000;
+ set_cputicker(rdtsc, max_freq, 1);
+ } else
+ printf("tsc_levels_changed: no max freq found\n");
+ free(levels, M_TEMP);
+}
+
+/*
+ * If the TSC timecounter is in use, veto the pending change. It may be
+ * possible in the future to handle a dynamically-changing timecounter rate.
+ */
+static void
+tsc_freq_changing(void *arg, const struct cf_level *level, int *status)
+{
+
+ if (*status != 0 || timecounter != &tsc_timecounter)
+ return;
+
+ printf("timecounter TSC must not be in use when "
+ "changing frequencies; change denied\n");
+ *status = EBUSY;
+}
+
+/* Update TSC freq with the value indicated by the caller. */
+static void
+tsc_freq_changed(void *arg, const struct cf_level *level, int status)
+{
+ /* If there was an error during the transition, don't do anything. */
+ if (status != 0)
+ return;
+
+ /* Total setting for this level gives the new frequency in MHz. */
+ tsc_freq = (uint64_t)level->total_set.freq * 1000000;
+ tsc_timecounter.tc_frequency = tsc_freq;
+}
+
static int
sysctl_machdep_tsc_freq(SYSCTL_HANDLER_ARGS)
{
==== //depot/projects/uart/arm/at91/at91_st.c#7 (text) ====
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/at91_st.c,v 1.8 2007/02/23 12:18:27 piso Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/at91_st.c,v 1.9 2007/03/27 21:03:35 n_hibma Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -171,13 +171,11 @@
int t;
t = cmd & WD_INTERVAL;
- if (cmd > 0 && t >= 22 && t <= 37) {
+ if (t >= 22 && t <= 37) {
wdog = (1 << (t - 22)) | ST_WDMR_RSTEN;
*error = 0;
} else {
wdog = 0;
- if (cmd > 0)
- *error = EINVAL;
}
WR4(ST_WDMR, wdog);
WR4(ST_CR, ST_CR_WDRST);
==== //depot/projects/uart/arm/at91/at91_twi.c#7 (text) ====
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/at91_twi.c,v 1.9 2007/02/23 12:18:27 piso Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/at91_twi.c,v 1.10 2007/03/23 22:57:24 imp Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -45,6 +45,10 @@
#include <dev/iicbus/iicbus.h>
#include "iicbus_if.h"
+#define TWI_SLOW_CLOCK 1500
+#define TWI_FAST_CLOCK 45000
+#define TWI_FASTEST_CLOCK 90000
+
struct at91_twi_softc
{
device_t dev; /* Myself */
@@ -123,7 +127,7 @@
AT91_TWI_LOCK_DESTROY(sc);
goto out;
}
- sc->cwgr = TWI_CWGR_CKDIV(8 * AT91C_MASTER_CLOCK / 90000) |
+ sc->cwgr = TWI_CWGR_CKDIV(8 * AT91C_MASTER_CLOCK / TWI_FASTEST_CLOCK) |
TWI_CWGR_CHDIV(TWI_CWGR_DIV(TWI_DEF_CLK)) |
TWI_CWGR_CLDIV(TWI_CWGR_DIV(TWI_DEF_CLK));
WR4(sc, TWI_CR, TWI_CR_SWRST);
@@ -226,14 +230,13 @@
int counter = 100000;
uint32_t sr;
- while (!((sr = RD4(sc, TWI_SR)) & bit) && counter-- > 0)
+ while (!((sr = RD4(sc, TWI_SR)) & bit) && counter-- > 0 &&
+ !(sr & TWI_SR_NACK))
continue;
if (counter <= 0)
err = EBUSY;
else if (sr & TWI_SR_NACK)
- err = EADDRNOTAVAIL;
- if (sr & ~bit)
- printf("status is %x\n", sr);
+ err = ENXIO; // iic nack convention
return (err);
}
@@ -253,17 +256,17 @@
*/
switch (speed) {
case IIC_SLOW:
- clk = 1500;
+ clk = TWI_SLOW_CLOCK;
break;
case IIC_FAST:
- clk = 45000;
+ clk = TWI_FAST_CLOCK;
break;
case IIC_UNKNOWN:
case IIC_FASTEST:
default:
- clk = 90000;
+ clk = TWI_FASTEST_CLOCK;
break;
}
sc->cwgr = TWI_CWGR_CKDIV(1) | TWI_CWGR_CHDIV(TWI_CWGR_DIV(clk)) |
@@ -302,6 +305,7 @@
int i, len, err;
uint32_t rdwr;
uint8_t *buf;
+ uint32_t sr;
sc = device_get_softc(dev);
err = 0;
@@ -320,26 +324,36 @@
WR4(sc, TWI_MMR, TWI_MMR_DADR(msgs[i].slave) | rdwr);
len = msgs[i].len;
buf = msgs[i].buf;
- if (len != 0 && buf == NULL)
- return (EINVAL);
- WR4(sc, TWI_CR, TWI_CR_START);
+ /* zero byte transfers aren't allowed */
+ if (len == 0 || buf == NULL) {
+ err = EINVAL;
+ goto out;
+ }
+ if (len == 1)
+ WR4(sc, TWI_CR, TWI_CR_START | TWI_CR_STOP);
+ else
+ WR4(sc, TWI_CR, TWI_CR_START);
if (msgs[i].flags & IIC_M_RD) {
- while (len--) {
- if (len == 0)
- WR4(sc, TWI_CR, TWI_CR_STOP);
- if ((err = at91_twi_wait(sc, TWI_SR_RXRDY)))
- goto out;
- *buf++ = RD4(sc, TWI_RHR) & 0xff;
+ sr = RD4(sc, TWI_SR);
+ while (!(sr & TWI_SR_TXCOMP)) {
+ if ((sr = RD4(sc, TWI_SR)) & TWI_SR_RXRDY) {
+ len--;
+ *buf++ = RD4(sc, TWI_RHR) & 0xff;
+ if (len == 0 && msgs[i].len != 1)
+ WR4(sc, TWI_CR, TWI_CR_STOP);
+ }
+ }
+ if (len > 0 || (sr & TWI_SR_NACK)) {
+ err = ENXIO; // iic nack convention
+ goto out;
}
} else {
while (len--) {
- WR4(sc, TWI_THR, *buf++);
- if (len == 0)
+ if (len == 0 && msgs[i].len != 1)
WR4(sc, TWI_CR, TWI_CR_STOP);
- if ((err = at91_twi_wait(sc, TWI_SR_TXRDY))) {
- printf("Len %d\n", len);
+ if ((err = at91_twi_wait(sc, TWI_SR_TXRDY)))
goto out;
- }
+ WR4(sc, TWI_THR, *buf++);
}
}
if ((err = at91_twi_wait(sc, TWI_SR_TXCOMP)))
@@ -347,8 +361,9 @@
}
out:;
if (err) {
- WR4(sc, TWI_CR, TWI_CR_STOP);
- printf("Err is %d\n", err);
+ WR4(sc, TWI_CR, TWI_CR_SWRST);
+ WR4(sc, TWI_CR, TWI_CR_MSEN | TWI_CR_SVDIS);
+ WR4(sc, TWI_CWGR, sc->cwgr);
}
AT91_TWI_UNLOCK(sc);
return (err);
==== //depot/projects/uart/arm/at91/at91_twireg.h#2 (text) ====
@@ -22,7 +22,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-/* $FreeBSD: src/sys/arm/at91/at91_twireg.h,v 1.1 2006/02/04 23:32:13 imp Exp $ */
+/* $FreeBSD: src/sys/arm/at91/at91_twireg.h,v 1.2 2007/03/23 22:57:24 imp Exp $ */
#ifndef ARM_AT91_AT91_TWIREG_H
#define ARM_AT91_AT91_TWIREG_H
@@ -56,7 +56,7 @@
#define TWI_MMR_IADRSZ(n) ((n) << 8) /* Set size of transfer */
#define TWI_MMR_MWRITE 0U /* Master Read Direction */
#define TWI_MMR_MREAD (1U << 12) /* Master Read Direction */
-#define TWI_MMR_DADR(n) ((n) << 16) /* Device Address */
+#define TWI_MMR_DADR(n) ((n) << 15) /* Device Address */
/* TWI_CWGR */
#define TWI_CWGR_CKDIV(x) ((x) << 16) /* Clock Divider */
==== //depot/projects/uart/arm/at91/kb920x_machdep.c#9 (text) ====
@@ -48,7 +48,7 @@
#include "opt_at91.h"
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.20 2006/12/06 06:34:53 julian Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/at91/kb920x_machdep.c,v 1.21 2007/03/27 06:29:19 kevlo Exp $");
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/param.h>
@@ -136,7 +136,6 @@
struct pv_addr undstack;
struct pv_addr abtstack;
struct pv_addr kernelstack;
-struct pv_addr minidataclean;
static struct trapframe proc0_tf;
@@ -355,7 +354,6 @@
valloc_pages(abtstack, ABT_STACK_SIZE);
valloc_pages(undstack, UND_STACK_SIZE);
valloc_pages(kernelstack, KSTACK_PAGES);
- alloc_pages(minidataclean.pv_pa, 1);
valloc_pages(msgbufpv, round_page(MSGBUF_SIZE) / PAGE_SIZE);
/*
* Now we start construction of the L1 page table
@@ -379,9 +377,6 @@
pmap_link_l2pt(l1pagetable, afterkern + i * 0x00100000,
&kernel_pt_table[KERNEL_PT_AFKERNEL + i]);
}
- pmap_map_entry(l1pagetable, afterkern, minidataclean.pv_pa,
- VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);
-
/* Map the vector page. */
pmap_map_entry(l1pagetable, ARM_VECTORS_HIGH, systempage.pv_pa,
==== //depot/projects/uart/arm/conf/KB920X#7 (text) ====
@@ -16,7 +16,7 @@
# If you are in doubt as to the purpose or necessity of a line, check first
# in NOTES.
#
-# $FreeBSD: src/sys/arm/conf/KB920X,v 1.11 2006/10/26 22:11:35 jb Exp $
+# $FreeBSD: src/sys/arm/conf/KB920X,v 1.12 2007/03/23 23:47:59 imp Exp $
machine arm
ident KB920X
@@ -24,6 +24,7 @@
include "../at91/std.kb920x"
#To statically compile in device wiring instead of /boot/device.hints
#hints "GENERIC.hints" #Default places to look for devices.
+hints "KB920X.hints"
makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
options DDB
@@ -38,12 +39,12 @@
#options UFS_DIRHASH #Improve performance on big directories
#options MD_ROOT #MD is a potential root device
#options MD_ROOT_SIZE=4096 # 3MB ram disk
-#options ROOTDEVNAME=\"ufs:md0\"
+options ROOTDEVNAME=\"ufs:/dev/mmcsd0s1a\"
options NFSCLIENT #Network Filesystem Client
#options NFSSERVER #Network Filesystem Server
-options NFS_ROOT #NFS usable as /, requires NFSCLIENT
-options BOOTP_NFSROOT
-options BOOTP
+#options NFS_ROOT #NFS usable as /, requires NFSCLIENT
+#options BOOTP_NFSROOT
+#options BOOTP
#options MSDOSFS #MSDOS Filesystem
#options CD9660 #ISO 9660 Filesystem
@@ -79,6 +80,16 @@
device mem # Memory and kernel memory devices
device md
-# device at91_twi # TWI: Two Wire Interface
+device at91_twi # TWI: Two Wire Interface
device at91_spi # SPI:
device spibus
+# MMC/SD
+device at91_mci
+device mmc
+device mmcsd
+# iic
+device iic
+device iicbus
+device icee
+
+device bpf
==== //depot/projects/uart/arm/xscale/i80321/i80321_wdog.c#3 (text+ko) ====
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/i80321_wdog.c,v 1.3 2006/12/15 21:44:48 n_hibma Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/xscale/i80321/i80321_wdog.c,v 1.4 2007/03/27 21:03:35 n_hibma Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -111,18 +111,15 @@
cmd &= WD_INTERVAL;
if (cmd > 0 && cmd <= 63
- && (uint64_t)1 << (cmd & WD_INTERVAL) <=
- (uint64_t)sc->wdog_period * 1000000000) {
+ && (uint64_t)1<<cmd <= (uint64_t)sc->wdog_period * 1000000000) {
/* Valid value -> Enable watchdog */
iopwdog_tickle(sc);
sc->armed = 1;
*error = 0;
} else {
- /* XXX Can't disable this watchdog? */
+ /* Can't disable this watchdog! */
if (sc->armed)
*error = EOPNOTSUPP;
- else if (cmd > 0)
- *error = EINVAL;
}
}
==== //depot/projects/uart/arm/xscale/ixp425/ixp425_wdog.c#2 (text+ko) ====
@@ -22,7 +22,7 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/arm/xscale/ixp425/ixp425_wdog.c,v 1.1 2006/11/19 23:55:23 sam Exp $");
+__FBSDID("$FreeBSD: src/sys/arm/xscale/ixp425/ixp425_wdog.c,v 1.2 2007/03/27 21:03:36 n_hibma Exp $");
/*
* IXP425 Watchdog Timer Support.
@@ -70,7 +70,7 @@
u_int u = cmd & WD_INTERVAL;
WR4(sc, IXP425_OST_WDOG_KEY, OST_WDOG_KEY_MAJICK);
- if (cmd && 4 <= u && u <= 35) {
+ if (4 <= u && u <= 35) {
WR4(sc, IXP425_OST_WDOG_ENAB, 0);
/* approximate 66.66MHz cycles */
WR4(sc, IXP425_OST_WDOG, 2<<(u - 4));
==== //depot/projects/uart/boot/ficl/ficl.h#3 (text+ko) ====
@@ -41,7 +41,7 @@
** SUCH DAMAGE.
*/
-/* $FreeBSD: src/sys/boot/ficl/ficl.h,v 1.21 2004/11/30 11:35:30 scottl Exp $ */
+/* $FreeBSD: src/sys/boot/ficl/ficl.h,v 1.22 2007/03/23 22:26:01 jkim Exp $ */
#if !defined (__FICL_H__)
#define __FICL_H__
@@ -237,9 +237,9 @@
/*
** the Good Stuff starts here...
*/
-#define FICL_VER "3.02"
+#define FICL_VER "3.03"
#define FICL_VER_MAJOR 3
-#define FICL_VER_MINOR 2
+#define FICL_VER_MINOR 3
#if !defined (FICL_PROMPT)
#define FICL_PROMPT "ok> "
#endif
@@ -857,7 +857,7 @@
FICL_WORD *pDoesParen;
FICL_WORD *pExitInner;
FICL_WORD *pExitParen;
- FICL_WORD *pIfParen;
+ FICL_WORD *pBranch0;
FICL_WORD *pInterpret;
FICL_WORD *pLitParen;
FICL_WORD *pTwoLitParen;
@@ -865,7 +865,9 @@
FICL_WORD *pPLoopParen;
FICL_WORD *pQDoParen;
FICL_WORD *pSemiParen;
+ FICL_WORD *pOfParen;
FICL_WORD *pStore;
+ FICL_WORD *pDrop;
FICL_WORD *pCStringLit;
FICL_WORD *pStringLit;
@@ -1086,6 +1088,7 @@
IF,
LITERAL,
LOOP,
+ OF,
PLOOP,
PRIMITIVE,
QDO,
==== //depot/projects/uart/boot/ficl/float.c#2 (text+ko) ====
@@ -41,7 +41,7 @@
** SUCH DAMAGE.
*/
-/* $FreeBSD: src/sys/boot/ficl/float.c,v 1.1 2002/04/09 17:45:11 dcs Exp $ */
+/* $FreeBSD: src/sys/boot/ficl/float.c,v 1.2 2007/03/23 22:26:01 jkim Exp $ */
#include <stdlib.h>
#include <stdio.h>
@@ -977,6 +977,8 @@
}
PUSHFLOAT(accum);
+ if (pVM->state == COMPILE)
+ fliteralIm(pVM);
return(1);
}
@@ -1062,3 +1064,4 @@
#endif
return;
}
+
==== //depot/projects/uart/boot/ficl/softwords/fileaccess.fr#2 (text+ko) ====
@@ -4,7 +4,7 @@
\ ** submitted by Larry Hastings, larry at hastings.org
\ **
\
-\ $FreeBSD: src/sys/boot/ficl/softwords/fileaccess.fr,v 1.1 2002/04/09 17:45:27 dcs Exp $
+\ $FreeBSD: src/sys/boot/ficl/softwords/fileaccess.fr,v 1.2 2007/03/23 22:26:01 jkim Exp $
: r/o 1 ;
: r/w 3 ;
@@ -15,12 +15,11 @@
r/o bin open-file 0= if
locals| f | end-locals
f include-file
- f close-file drop
else
drop
endif
;
-: include parse-word included ; immediate
+: include parse-word included ;
\ #endif
==== //depot/projects/uart/boot/ficl/softwords/jhlocal.fr#2 (text+ko) ====
@@ -14,11 +14,13 @@
\
\ revised 2 June 2000 - { | a -- } now works correctly
\
-\ $FreeBSD: src/sys/boot/ficl/softwords/jhlocal.fr,v 1.4 2001/04/29 02:36:36 dcs Exp $
+\ $FreeBSD: src/sys/boot/ficl/softwords/jhlocal.fr,v 1.5 2007/03/23 22:26:01 jkim Exp $
hide
+
0 constant zero
+
: ?-- ( c-addr u -- c-addr u flag )
2dup s" --" compare 0= ;
: ?} ( c-addr u -- c-addr u flag )
@@ -74,23 +76,24 @@
parse-word
?delim dup to locstate
0= while
- ?2loc if
- postpone zero postpone zero (2local)
- else
- postpone zero (local)
- endif
+ ?2loc if
+ postpone zero postpone zero (2local)
+ else
+ postpone zero (local)
+ endif
repeat
endif
0 0 (local)
\ toss words until }
+ \ (explicitly allow | and -- in the comment)
locstate 2 = if
begin
parse-word
- ?delim dup to locstate
- 0= while
- 2drop
+ ?delim dup to locstate
+ 3 < while
+ locstate 0= if 2drop endif
repeat
endif
==== //depot/projects/uart/boot/ficl/softwords/oo.fr#2 (text+ko) ====
@@ -3,7 +3,7 @@
\ ** F I C L O - O E X T E N S I O N S
\ ** john sadler aug 1998
\
-\ $FreeBSD: src/sys/boot/ficl/softwords/oo.fr,v 1.4 2002/04/09 17:45:28 dcs Exp $
+\ $FreeBSD: src/sys/boot/ficl/softwords/oo.fr,v 1.5 2007/03/23 22:26:01 jkim Exp $
17 ficl-vocabulary oop
also oop definitions
@@ -86,8 +86,6 @@
\ execute it at run-time...
\
-hide
-
\ p a r s e - m e t h o d
\ compiles a method name so that it pushes
\ the string base address and count at run-time.
@@ -97,6 +95,13 @@
postpone sliteral
; compile-only
+
+
+: (lookup-method) { class 2:name -- class 0 | class xt 1 | class xt -1 }
+ class name class cell+ @ ( class c-addr u wid )
+ search-wordlist
+;
+
\ l o o k u p - m e t h o d
\ takes a counted string method name from the stack (as compiled
\ by parse-method) and attempts to look this method up in the method list of
@@ -104,22 +109,18 @@
\ and pushes the xt of the method. If not, it aborts with an error message.
: lookup-method { class 2:name -- class xt }
- name class cell+ @ ( c-addr u wid )
- search-wordlist ( 0 | xt 1 | xt -1 )
+ class name (lookup-method) ( 0 | xt 1 | xt -1 )
0= if
name type ." not found in "
class body> >name type
cr abort
endif
- class swap
;
: find-method-xt \ name ( class -- class xt )
parse-word lookup-method
;
-set-current ( stop hiding definitions )
-
: catch-method ( instance class c-addr u -- <method-signature> exc-flag )
lookup-method catch
;
>>> TRUNCATED FOR MAIL (1000 lines) <<<
More information about the p4-projects
mailing list