From 9c7b98f8cec679a3b26c7fb6fba1ff9fbfa5140b Mon Sep 17 00:00:00 2001 From: shige Date: Tue, 23 Sep 2003 14:45:12 +0000 Subject: [PATCH] Add new evbppc port. This port is for OpenBlockS266. OpenBlockS266: IBM405GPr OpenBIOS. X1226 is a rtc chip connected with IIC bus. --- sys/arch/evbppc/conf/Makefile.obs405.inc | 21 ++ sys/arch/evbppc/conf/OPENBLOCKS266 | 210 ++++++++++++++++ sys/arch/evbppc/conf/files.obs405 | 47 ++++ sys/arch/evbppc/conf/std.obs405 | 28 +++ sys/arch/evbppc/obs405/consinit.c | 139 +++++++++++ sys/arch/evbppc/obs405/dev/x1226.c | 266 ++++++++++++++++++++ sys/arch/evbppc/obs405/dev/x1226reg.h | 78 ++++++ sys/arch/evbppc/obs405/machdep.c | 293 +++++++++++++++++++++++ 8 files changed, 1082 insertions(+) create mode 100644 sys/arch/evbppc/conf/Makefile.obs405.inc create mode 100644 sys/arch/evbppc/conf/OPENBLOCKS266 create mode 100644 sys/arch/evbppc/conf/files.obs405 create mode 100644 sys/arch/evbppc/conf/std.obs405 create mode 100644 sys/arch/evbppc/obs405/consinit.c create mode 100644 sys/arch/evbppc/obs405/dev/x1226.c create mode 100644 sys/arch/evbppc/obs405/dev/x1226reg.h create mode 100644 sys/arch/evbppc/obs405/machdep.c diff --git a/sys/arch/evbppc/conf/Makefile.obs405.inc b/sys/arch/evbppc/conf/Makefile.obs405.inc new file mode 100644 index 000000000000..fcdd3ee708f8 --- /dev/null +++ b/sys/arch/evbppc/conf/Makefile.obs405.inc @@ -0,0 +1,21 @@ +# $NetBSD: Makefile.obs405.inc,v 1.1 2003/09/23 14:45:12 shige Exp $ + +MKIMG?= ${THISPPC}/compile/walnut-mkimg.sh + +CFLAGS+=-mcpu=403 +AFLAGS+=-mcpu=403 +TEXTADDR?= 25000 + +SYSTEM_FIRST_OBJ= locore.o +SYSTEM_FIRST_SFILE= ${POWERPC}/${PPCDIR}/openbios/locore.S + +.ifdef DBSYM +SYSTEM_LD_TAIL_EXTRA+=; \ + echo "${DBSYM} $@ || true"; \ + ${DBSYM} $@ || true +.endif + +SYSTEM_LD_TAIL_EXTRA+=; \ + echo ${MKIMG} netbsd netbsd.img ; \ + OBJDUMP=${OBJDUMP}; OBJCOPY=${OBJCOPY}; export OBJDUMP OBJCOPY; \ + ${MKIMG} $@ $@.img diff --git a/sys/arch/evbppc/conf/OPENBLOCKS266 b/sys/arch/evbppc/conf/OPENBLOCKS266 new file mode 100644 index 000000000000..4585bd02a6ba --- /dev/null +++ b/sys/arch/evbppc/conf/OPENBLOCKS266 @@ -0,0 +1,210 @@ +# $NetBSD: OPENBLOCKS266,v 1.1 2003/09/23 14:45:13 shige Exp $ +# +# GENERIC -- everything that's currently supported +# + +include "arch/evbppc/conf/std.obs405" + +#options INCLUDE_CONFIG_FILE # embed config file in kernel binary + +#ident "OPENBLOCKS266" + +maxusers 32 + +#options UVMHIST +#options UVMHIST_PRINT + +# Options for necessary to use MD +#options MEMORY_DISK_HOOKS +#options MEMORY_DISK_IS_ROOT # force root on memory disk +#options MEMORY_DISK_SERVER=0 # no userspace memory disk support +#options MEMORY_DISK_ROOT_SIZE=16384 # size of memory disk, in blocks + + +#options INSECURE # disable kernel security levels +#options NTP # NTP phase/frequency locked loop +#options KTRACE # system call tracing via ktrace(1) + +options SYSVMSG # System V message queues +options SYSVSEM # System V semaphores +options SYSVSHM # System V shared memory +#options SHMMAXPGS=1024 # 1024 pages is the default + +#options LKM # loadable kernel modules + +#options USERCONF # userconf(4) support +#options PIPE_SOCKETPAIR # smaller, but slower pipe(2) + +# Diagnostic/debugging support options +#options DIAGNOSTIC # cheap kernel consistency checks +options DEBUG # expensive debugging checks/support +options DDB # in-kernel debugger +options DDB_HISTORY_SIZE=512 # enable history editing in DDB +options TRAP_PANICWAIT +options SYMTAB_SPACE=300000 # size for embedded symbol table + +makeoptions DEBUG="-g" # compile full symbol table + +# Compatibility options +#options COMPAT_09 # NetBSD 0.9, +#options COMPAT_10 # NetBSD 1.0, +#options COMPAT_11 # NetBSD 1.1, +#options COMPAT_12 # NetBSD 1.2, +options COMPAT_13 # NetBSD 1.3, +options COMPAT_14 # NetBSD 1.4, +options COMPAT_43 # and 4.3BSD +#options COMPAT_386BSD_MBRPART # recognize old partition ID +#options TCP_COMPAT_42 # 4.2BSD TCP/IP bug compat. Not recommended. + +# File systems +file-system FFS # UFS +file-system EXT2FS # second extended file system (linux) +file-system LFS # log-structured file system +file-system MFS # memory file system +file-system NFS # Network File System client +file-system CD9660 # ISO 9660 + Rock Ridge file system +file-system MSDOSFS # MS-DOS file system +file-system FDESC # /dev/fd +file-system KERNFS # /kern +file-system NULLFS # loopback file system +file-system OVERLAY # overlay file system +file-system PORTAL # portal filesystem (still experimental) +file-system PROCFS # /proc +file-system UMAPFS # NULLFS + uid and gid remapping +file-system UNION # union file system + +# File system options +options QUOTA # UFS quotas +options FFS_EI # FFS Endian Independant support +options SOFTDEP # FFS soft updates support. +options NFSSERVER # Network File System server +options EXT2FS_SYSTEM_FLAGS # makes ext2fs file flags (append and + # immutable) behave as system flags. + +options NFS_BOOT_DHCP # Support DHCP NFS root + +# Networking options +options GATEWAY # packet forwarding +options INET # IP + ICMP + TCP + UDP +options INET6 # IPV6 +#options IPSEC # IP security +#options IPSEC_ESP # IP security (encryption part; define w/IPSEC) +#options IPSEC_DEBUG # debug for IP security +#options MROUTING # IP multicast routing +#options DIRECTED_BROADCAST # allow broadcasts through routers +#options NS # XNS +#options NSIP # XNS tunneling over IP +options ISO,TPIP # OSI +#options EON # OSI tunneling over IP +#options CCITT,LLC,HDLC # X.25 +#options NETATALK # AppleTalk networking protocols +options PPP_BSDCOMP # BSD-Compress compression support for PPP +options PPP_DEFLATE # Deflate compression support for PPP +options PPP_FILTER # Active filter support for PPP (requires bpf) +options PFIL_HOOKS # pfil(9) packet filter hooks +options IPFILTER_LOG # ipmon(8) log support +#options TCP_DEBUG # Record last TCP_NDEBUG packets with SO_DEBUG +options NMBCLUSTERS=1024 + +# These options enable verbose messages for several subsystems. +# Warning, these may compile large string tables into the kernel! +options PCIVERBOSE # verbose PCI device autoconfig messages +options MIIVERBOSE # verbose PHY autoconfig messages +#options PCI_CONFIG_DUMP # verbosely dump PCI config space +options SCSIVERBOSE # human readable SCSI error messages +options PCI_NETBSD_CONFIGURE # Do not rely on BIOS/whatever to configure PCI devices +#options PCI_CONFIGURE_VERBOSE # Show PCI config information + +# wscons options +#options WSEMUL_SUN # sun terminal emulation +#options WSEMUL_VT100 # VT100 / VT220 emulation + +# Kernel root file system and dump configuration. +config netbsd root on ? type ? + +# +# Device configuration +# + +plb0 at root # Processor Local Bus + +cpu0 at plb? + +ecc0 at plb? irq 16 # On-chip ECC controller + +opb* at plb? # On-chip Peripheral Bus + +wdog* at opb? # Watchdog timer + +com* at opb? addr ? irq ? # UARTs + +emac0 at opb? addr ? irq ? # Ethernet Media Access Controller +options EMAC_EVENT_COUNTERS + +iic0 at opb? addr ? irq ? # IIC +rtc0 at iic? addr ? # RTC +todclock0 at rtc? # time-of-day device via rtc device + +pchb0 at plb? # PCI-Host bridges + +pci* at pchb? +ppb* at pci? dev ? function ? # PCI-PCI bridges +pciide* at pci? dev ? function ? + +tlp* at pci? dev ? function ? # DECchip 21x4x and clones + +lxtphy* at mii? phy ? # Level One LXT-970 PHYs +ukphy* at mii? phy ? # generic unknown PHYs + +#cardslot* at cbb? +#cardbus* at cardslot? +#pcmcia* at cardslot? + +#com* at pcmcia? function ? # Modems and serial cards +#wdc* at pcmcia? function ? # PCMCIA IDE controllers +#ep* at pcmcia? function ? # 3Com 3c589 and 3c562 Ethernet +#mbe* at pcmcia? function ? # MB8696x based Ethernet +#ne* at pcmcia? function ? # NE2000-compatible Ethernet +#ex* at cardbus? dev ? function ? # 3Com 3C575TX +#tlp* at cardbus? dev ? function ? # DECchip 21143 +#rtk* at cardbus? dev ? function ? # Realtek 8129/8139 + +wd* at pciide? channel ? drive ? + +atapibus* at pciide? channel ? + +cd* at atapibus? drive ? flags 0x0000 # ATAPI CD-ROM drives +sd* at atapibus? drive ? flags 0x0000 # ATAPI disk drives +uk* at atapibus? drive ? flags 0x0000 # ATAPI unknown + +#pckbc0 at pbus? +#pckbd* at pckbc? +#wskbd* at pckbd? console ? +#pms* at pckbc? +#wsmouse* at pms? mux 0 + +#vga* at pci? dev ? function ? +#wsdisplay* at vga? console ? + +pseudo-device vnd 4 # disk-like interface to files +pseudo-device ccd 4 # concatenated/striped disk devices +#pseudo-device cgd 4 # cryptographic disk devices +#pseudo-device raid 4 # RAIDframe disk driver +#options RAID_AUTOCONFIG # auto-configuration of RAID components +pseudo-device md 1 # memory disk device +pseudo-device loop # network loopback +pseudo-device bpfilter 8 # packet filter +pseudo-device ipfilter # IP filter (firewall) and NAT +pseudo-device ppp 2 # Point-to-Point Protocol +pseudo-device sl 2 # Serial Line IP +pseudo-device tun 4 # network tunneling over tty +#pseudo-device gre 2 # generic L3 over IP tunnel +pseudo-device gif 4 # IPv[46] over IPv[46] tunnel (RFC1933) +#pseudo-device faith 1 # IPv[46] tcp relay translation i/f +#pseudo-device stf 1 # 6to4 IPv6 over IPv4 encapsulation +pseudo-device vlan # IEEE 802.1q encapsulation +pseudo-device pty # pseudo-terminals +pseudo-device rnd # /dev/random and in-kernel generator +#pseudo-device wsmux # ick +pseudo-device clockctl # user control of clock subsystem +pseudo-device kttcp # kernel ttcp diff --git a/sys/arch/evbppc/conf/files.obs405 b/sys/arch/evbppc/conf/files.obs405 new file mode 100644 index 000000000000..e16ece7dbac5 --- /dev/null +++ b/sys/arch/evbppc/conf/files.obs405 @@ -0,0 +1,47 @@ +# $NetBSD: files.obs405,v 1.1 2003/09/23 14:45:13 shige Exp $ +# +# obs405-specific configuration info + +file arch/powerpc/ibm4xx/ibm4xxGPx_autoconf.c +file arch/powerpc/ibm4xx/ibm40x_machdep.c +file arch/evbppc/obs405/consinit.c +file arch/evbppc/obs405/machdep.c + +# Memory Disk for install kernel +file dev/md_root.c memory_disk_hooks + +# Machine-independent SCSI drivers +include "dev/scsipi/files.scsipi" + +# Machine-independent ATA drivers +include "dev/ata/files.ata" + +# Workstation Console +include "dev/wscons/files.wscons" + +# Raster operations +include "dev/rasops/files.rasops" +include "dev/wsfont/files.wsfont" + +define todservice {} + +device todclock +attach todclock at todservice +file arch/powerpc/ibm4xx/dev/todclock.c todclock needs-count +#file arch/evbppc/obs405/dev/todclock.c todclock needs-count + +device rtc: todservice +attach rtc at iic +file arch/evbppc/obs405/dev/x1226.c rtc + +# +# Machine-independent CardBus drivers +# + +# XXX dev/pcmcia needs fdc +device fdc {drive = -1} + +include "dev/cardbus/files.cardbus" +include "dev/pcmcia/files.pcmcia" + +file arch/macppc/macppc/rbus_machdep.c cardbus diff --git a/sys/arch/evbppc/conf/std.obs405 b/sys/arch/evbppc/conf/std.obs405 new file mode 100644 index 000000000000..995055f4f90b --- /dev/null +++ b/sys/arch/evbppc/conf/std.obs405 @@ -0,0 +1,28 @@ +# $NetBSD: std.obs405,v 1.1 2003/09/23 14:45:13 shige Exp $ +# +# Standard/required options for NetBSD/obs405. + +machine evbppc powerpc + +# standard ("mandatory") kernel options. +options PPC_IBM4XX # IBM 40x family + +# Executable support: +options EXEC_ELF32 # (native) ELF32 binary support +options EXEC_AOUT # (native) a.out binary support (deprecated) +options EXEC_SCRIPT # shell script support + +makeoptions TEXTADDR=0x25000 +makeoptions BOARDTYPE="obs405" +makeoptions PPCDIR="ibm4xx" + +options PPC_INTR_IMPL="" +options PPC_PCI_MACHDEP_IMPL="" +options KERNBASE=0x25000 + +options INTSTK=16384 +options SPILLSTK=1024 + +include "arch/powerpc/conf/files.ibm4xx" +include "arch/powerpc/conf/files.ibm405gp" +include "arch/evbppc/conf/files.obs405" diff --git a/sys/arch/evbppc/obs405/consinit.c b/sys/arch/evbppc/obs405/consinit.c new file mode 100644 index 000000000000..82c4454e4e75 --- /dev/null +++ b/sys/arch/evbppc/obs405/consinit.c @@ -0,0 +1,139 @@ +/* $NetBSD: consinit.c,v 1.1 2003/09/23 14:45:14 shige Exp $ */ + +/* + * Copyright (c) 1998 + * Matthias Drochner. All rights reserved. + * + * 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 ``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 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. + * + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: consinit.c,v 1.1 2003/09/23 14:45:14 shige Exp $"); + +#include "opt_kgdb.h" + +#include +#include +#include +#include + +#include +#include + +#include "com.h" +#if (NCOM > 0) +#include +#include +#include +#endif + +#include + +#ifndef CONSDEVNAME +#define CONSDEVNAME "com" +#endif + +#if (NCOM > 0) +#ifndef CONADDR +#define CONADDR IBM405GP_UART0_BASE +#endif +#ifndef CONSPEED +#define CONSPEED B9600 /* */ +// #define CONSPEED B115200 /* 9600 is too slow for my taste */ +#endif +#ifndef CONMODE +#define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */ +#endif +int comcnmode = CONMODE; +#endif /* NCOM */ + +#ifdef KGDB +#ifndef KGDB_DEVNAME +#define KGDB_DEVNAME "com" +#endif +char kgdb_devname[] = KGDB_DEVNAME; + +#if (NCOM > 1) +#ifndef KGDB_DEVADDR +#define KGDB_DEVADDR UART1_BASE +#endif +int comkgdbaddr = KGDB_DEVADDR; + +#ifndef KGDB_DEVRATE +#define KGDB_DEVRATE CONSPEED +#endif +int comkgdbrate = KGDB_DEVRATE; + +#ifndef KGDB_DEVMODE +#define KGDB_DEVMODE ((TTYDEF_CFLAG & ~(CSIZE | CSTOPB | PARENB)) | CS8) /* 8N1 */ +#endif +int comkgdbmode = KGDB_DEVMODE; + +#endif /* NCOM */ + +#endif /* KGDB */ + +/* + * consinit: + * initialize the system console. + * XXX - shouldn't deal with this initted thing, but then, + * it shouldn't be called from initppc either. + */ +void +consinit(void) +{ + static int initted = 0; +#if (NCOM > 0) + bus_space_tag_t tag; +#endif + + if (initted) + return; + initted = 1; + +#if (NCOM > 0) + /* We *know* the com-console attaches to opb */ + tag = opb_get_bus_space_tag(); + + if (comcnattach(tag, CONADDR, CONSPEED, COM_FREQ*4, + COM_TYPE_NORMAL, comcnmode)) + panic("can't init serial console @%x", CONADDR); + else + return; +#endif + panic("console device missing -- serial console not in kernel"); + /* Of course, this is moot if there is no console... */ +} + +#ifdef KGDB +void +kgdb_port_init(void) +{ +#if (NCOM > 0) + if(!strcmp(kgdb_devname, "com")) { + bus_space_tag_t tag = opb_get_bus_space_tag(); + com_kgdb_attach(tag, comkgdbaddr, comkgdbrate, COM_FREQ * 4, + COM_TYPE_NORMAL, comkgdbmode); + } +#endif +} +#endif diff --git a/sys/arch/evbppc/obs405/dev/x1226.c b/sys/arch/evbppc/obs405/dev/x1226.c new file mode 100644 index 000000000000..bd318e6200e0 --- /dev/null +++ b/sys/arch/evbppc/obs405/dev/x1226.c @@ -0,0 +1,266 @@ +/* $NetBSD: x1226.c,v 1.1 2003/09/23 14:45:15 shige Exp $ */ + +/* + * Copyright (c) 2003 Shigeyuki Fukushima. + * All rights reserved. + * + * Written by Shigeyuki Fukushima. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Mark Brinicombe + * for the NetBSD Project. + * 4. The name of the company nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY CAUASLITY LIMITED ``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 CAUSALITY LIMITED 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. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: x1226.c,v 1.1 2003/09/23 14:45:15 shige Exp $"); + +#include +#include +#include + +#include +#include + +#include +#include +#include + +struct xrtc_softc { + struct device sc_dev; + bus_space_tag_t sc_iot; + bus_space_handle_t sc_ioh; + struct iic_softc *adap; +}; + +static void xrtc_attach(struct device *, struct device *, void *); +static int xrtc_match(struct device *, struct cfdata *, void *); + +static int xrtc_read(void *, rtc_t *); +static int xrtc_write(void *, rtc_t *); + +static inline u_char x1226_read(struct xrtc_softc *, u_int16_t); +static inline u_char x1226_write(struct xrtc_softc *, u_int16_t, u_char); +static int x1226_lock(struct xrtc_softc *); +static int x1226_unlock(struct xrtc_softc *); + +/* device and attach structures */ +CFATTACH_DECL(rtc, sizeof(struct xrtc_softc), + xrtc_match, xrtc_attach, NULL, NULL); + +/* + * xrtc_match() + */ + +static int +xrtc_match(struct device *parent, struct cfdata *cf, void *aux) +{ + struct iicbus_attach_args *iaa = aux; + + /* match only RTC devices */ + if (strcmp(iaa->iicb_name, cf->cf_name) == 0) + return (1); + + return (0); +} + +/* + * xrtc_attach() + */ + +static void +xrtc_attach(struct device *parent, struct device *self, void *aux) +{ + struct xrtc_softc *sc = (struct xrtc_softc *)self; + struct iicbus_attach_args *iaa = aux; + struct todclock_attach_args ta; + + sc->sc_iot = 0; + sc->sc_ioh = iaa->iicb_addr; + sc->adap = iaa->adap; + + /* Make sure the clock is running */ + /* x1226_unlock(sc); */ + if (x1226_read(sc, X1226_SR) & X1226_SR_RTCF) + printf(": power failure, RTC unreliable"); + printf("\n"); + +#ifdef DEBUG + { + rtc_t rtc; + xrtc_read(sc, &rtc); + printf("RTC: %02d%02d/%02d/%02d %02d:%02d:%02d\n", + rtc.rtc_cen, rtc.rtc_year, + rtc.rtc_mon, rtc.rtc_day, + rtc.rtc_hour, rtc.rtc_min, rtc.rtc_sec); + } +#endif + + ta.ta_name = "todclock"; + ta.ta_rtc_arg = sc; + ta.ta_rtc_write = xrtc_write; + ta.ta_rtc_read = xrtc_read; + ta.ta_flags = 0; + config_found(self, &ta, NULL); +} + +static inline u_char +x1226_read(struct xrtc_softc *sc, u_int16_t addr) +{ + u_char ret, baddr[2]; + int addrmsk = (X1226_SIZE - 1); + + baddr[0] = (((addr & addrmsk) >> 8) & 0xff); + baddr[1] = ((addr & addrmsk) & 0xff); + + iic_read(sc->adap, X1226_DEVID_CCR, baddr, 2, &ret, 1); + + return ret; +} + +static inline u_char +x1226_write(struct xrtc_softc *sc, u_int16_t addr, u_char d) +{ + u_char ret, data[1], baddr[2]; + int addrmsk = (X1226_SIZE - 1); + + data[0] = d; + baddr[0] = (((addr & addrmsk) >> 8) & 0xff); + baddr[1] = ((addr & addrmsk) & 0xff); + + ret = iic_write(sc->adap, X1226_DEVID_CCR, baddr, 2, data, 1); + + return ret; +} + +#define BIN2BCD(x) ((((x) / 10) << 4) | (x % 10)) +#define BCD2BIN(x) (((((x) >> 4) & 0xf) * 10) + ((x) & 0xf)) + +static int +x1226_unlock(struct xrtc_softc *sc) +{ + u_char sr; + + sr = X1226_SR_WEL; + x1226_write(sc, X1226_SR, sr); + sr |= X1226_SR_RWEL; + x1226_write(sc, X1226_SR, sr); + + sr = 0; + sr = x1226_read(sc, X1226_SR); + sr &= (X1226_SR_RWEL | X1226_SR_WEL); + if (sr != (X1226_SR_RWEL | X1226_SR_WEL)) { + return 1; + } + return 0; +} + +static int +x1226_lock(struct xrtc_softc *sc) +{ + u_char sr; + + sr = 0; + x1226_write(sc, X1226_SR, sr); + + sr = 0; + sr = x1226_read(sc, X1226_SR); + sr &= (X1226_SR_RWEL | X1226_SR_WEL); + if (sr != 0) { + return 1; + } + return 0; +} + +static int +xrtc_write(void * arg, rtc_t * rtc) +{ + struct xrtc_softc *sc = arg; + + if (x1226_unlock(sc) != 0) { + return (1); + } + + x1226_write(sc, X1226_RTC_SC, + BIN2BCD(rtc->rtc_sec) & 0x7f); + x1226_write(sc, X1226_RTC_MN, + BIN2BCD(rtc->rtc_min) & 0x7f); + x1226_write(sc, X1226_RTC_HR, /* 24 hour format */ + (BIN2BCD(rtc->rtc_hour) & 0x1f) | X1226_RTC_HR_MIL); + x1226_write(sc, X1226_RTC_DT, + BIN2BCD(rtc->rtc_day) & 0x3f); + x1226_write(sc, X1226_RTC_MO, + BIN2BCD(rtc->rtc_mon) & 0x1f); + x1226_write(sc, X1226_RTC_YR, + BIN2BCD(rtc->rtc_year) & 0xff); + x1226_write(sc, X1226_RTC_Y2K, + BIN2BCD(rtc->rtc_cen) & 0x3f); + + x1226_lock(sc); + + xrtc_read(arg, rtc); + + return (0); +} + +static int +xrtc_read(void *arg, rtc_t *rtc) +{ + struct xrtc_softc *sc = arg; + u_char hreg; + + rtc->rtc_micro = 0; + rtc->rtc_centi = 0; + + /* YYYY */ + rtc->rtc_cen = BCD2BIN(x1226_read(sc, X1226_RTC_Y2K) & 0x3f); + rtc->rtc_year = BCD2BIN(x1226_read(sc, X1226_RTC_YR)); + + /* MM */ + rtc->rtc_mon = BCD2BIN(x1226_read(sc, X1226_RTC_MO) & 0x1f); + + /* DD */ + rtc->rtc_day = BCD2BIN(x1226_read(sc, X1226_RTC_DT) & 0x3f); + + /* HH */ + hreg = x1226_read(sc, X1226_RTC_HR); + rtc->rtc_hour = BCD2BIN(hreg & 0x1f); + if (!(hreg & X1226_RTC_HR_MIL)) { + if (hreg & X1226_RTC_HR_H21) { + rtc->rtc_hour += 12; + if (rtc->rtc_hour >= 24) + rtc->rtc_hour = 0; + } + } + + /* MM */ + rtc->rtc_min = BCD2BIN(x1226_read(sc, X1226_RTC_MN) & 0x7f); + + /* SS */ + rtc->rtc_sec = BCD2BIN(x1226_read(sc, X1226_RTC_SC) & 0x7f); + + return (1); +} diff --git a/sys/arch/evbppc/obs405/dev/x1226reg.h b/sys/arch/evbppc/obs405/dev/x1226reg.h new file mode 100644 index 000000000000..14fd8cc3d5db --- /dev/null +++ b/sys/arch/evbppc/obs405/dev/x1226reg.h @@ -0,0 +1,78 @@ +/* $NetBSD: x1226reg.h,v 1.1 2003/09/23 14:45:15 shige Exp $ */ + +/* + * Copyright 2003 Shigeyuki Fukushima. + * All rights reserved. + * + * Written by Shigeyuki Fukushima. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC + * 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. + */ + +#ifndef __X1226REG_H__ +#define __X1226REG_H__ + +/* XICOR X1226 Device Identifier */ +#define X1226_DEVID_CCR 0x6f +#define X1226_DEVID_EEPROM 0x57 + +/* XICOR X1226 Watchdog RTC registers */ +#define X1226_SR 0x3f +#define X1226_RTC_Y2K 0x37 /* century (19/20) */ +#define X1226_RTC_DW 0x36 /* day of week (0-6) */ +#define X1226_RTC_YR 0x35 /* year (0-99) */ +#define X1226_RTC_MO 0x34 /* month (1-12) */ +#define X1226_RTC_DT 0x33 /* day (1-31) */ +#define X1226_RTC_HR 0x32 /* hour (0-23) */ +#define X1226_RTC_MN 0x31 /* minute (0-59) */ +#define X1226_RTC_SC 0x30 /* second (0-59) */ +#define X1226_RTC_BASE 0x30 +#define X1226_CTRL_DTR 0x13 +#define X1226_CTRL_ATR 0x12 +#define X1226_CTRL_INT 0x11 +#define X1226_CTRL_BL 0x10 + +/* XICOR X1226 RTC flags */ +#define X1226_SR_RTCF 0x01 +#define X1226_SR_WEL 0x02 +#define X1226_SR_RWEL 0x04 +#define X1226_SR_AL0 0x20 +#define X1226_SR_AL1 0x40 +#define X1226_SR_BAT 0x80 +#define X1226_RTC_HR_H21 0x20 +#define X1226_RTC_HR_MIL 0x80 + +/* XICOR X1226 size */ +#define X1226_SIZE 0x0100 /* 4kbit (512 x 8bit) */ + +/* Y2K definitions */ +#define EPOCH 2000 +#define SYS_EPOCH 1900 + +#endif /* __X1226REG_H__ */ diff --git a/sys/arch/evbppc/obs405/machdep.c b/sys/arch/evbppc/obs405/machdep.c new file mode 100644 index 000000000000..25c10ded6bdc --- /dev/null +++ b/sys/arch/evbppc/obs405/machdep.c @@ -0,0 +1,293 @@ +/* $NetBSD: machdep.c,v 1.1 2003/09/23 14:45:14 shige Exp $ */ + +/* + * Copyright 2001, 2002 Wasabi Systems, Inc. + * All rights reserved. + * + * Written by Eduardo Horvath and Simon Burge for Wasabi Systems, Inc. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed for the NetBSD Project by + * Wasabi Systems, Inc. + * 4. The name of Wasabi Systems, Inc. may not be used to endorse + * or promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``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 WASABI SYSTEMS, INC + * 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. + */ + +/* + * Copyright (C) 1995, 1996 Wolfgang Solfrank. + * Copyright (C) 1995, 1996 TooLs GmbH. + * All rights reserved. + * + * 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by TooLs GmbH. + * 4. The name of TooLs GmbH may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``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 TOOLS GMBH 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. + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.1 2003/09/23 14:45:14 shige Exp $"); + +#include "opt_compat_netbsd.h" +#include "opt_ddb.h" +#include "opt_ipkdb.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include "ksyms.h" + +/* + * Global variables used here and there + */ +char bootpath[256]; + +extern paddr_t msgbuf_paddr; +extern struct board_cfg_data board_data; + +#if NKSYMS || defined(DDB) || defined(LKM) +void *startsym, *endsym; +#endif + +void initppc(u_int, u_int, char *, void *); +int lcsplx(int); + + +void +initppc(u_int startkernel, u_int endkernel, char *args, void *info_block) +{ + /* Disable all external interrupts */ + mtdcr(DCR_UIC0_ER, 0); + + ibm4xx_init_board_data(info_block, startkernel); + + ibm4xx_init((void (*)(void))ext_intr); + + /* + * Initialize console. + */ + consinit(); + + /* + * Set the page size. + */ + uvm_setpagesize(); + + /* + * Initialize pmap module. + */ + pmap_bootstrap(startkernel, endkernel); + +#ifdef DEBUG + printf("Board config data:\n"); + printf(" usr_config_ver = %s\n", board_data.usr_config_ver); + printf(" rom_sw_ver = %s\n", board_data.rom_sw_ver); + printf(" mem_size = %u\n", board_data.mem_size); + printf(" mac_address_local = %02x:%02x:%02x:%02x:%02x:%02x\n", + board_data.mac_address_local[0], board_data.mac_address_local[1], + board_data.mac_address_local[2], board_data.mac_address_local[3], + board_data.mac_address_local[4], board_data.mac_address_local[5]); + printf(" mac_address_pci = %02x:%02x:%02x:%02x:%02x:%02x\n", + board_data.mac_address_pci[0], board_data.mac_address_pci[1], + board_data.mac_address_pci[2], board_data.mac_address_pci[3], + board_data.mac_address_pci[4], board_data.mac_address_pci[5]); + printf(" processor_speed = %u\n", board_data.processor_speed); + printf(" plb_speed = %u\n", board_data.plb_speed); + printf(" pci_speed = %u\n", board_data.pci_speed); +#endif + +#if NKSYMS || defined(DDB) || defined(LKM) + ksyms_init((int)((u_int)endsym - (u_int)startsym), startsym, endsym); +#endif +#ifdef DDB + if (boothowto & RB_KDB) + Debugger(); +#endif +#ifdef IPKDB + /* + * Now trap to IPKDB + */ + ipkdb_init(); + if (boothowto & RB_KDB) + ipkdb_connect(0); +#endif +} + +int +lcsplx(int ipl) +{ + + return spllower(ipl); /* XXX */ +} + + +/* + * Machine dependent startup code. + */ +void +cpu_startup(void) +{ + + /* + * cpu common startup + */ + ibm4xx_startup("OpenBlockS266 IBM PowerPC 405GPr Board"); + + /* + * Set up the board properties database. + */ + ibm4xx_setup_propdb(); + + /* + * Now that we have VM, malloc()s are OK in bus_space. + */ + bus_space_mallocok(); + + /* + * no fake mapiodev + */ + fake_mapiodev = 0; +} + +/* + * Halt or reboot the machine after syncing/dumping according to howto. + */ +void +cpu_reboot(int howto, char *what) +{ + static int syncing; + static char str[256]; + char *ap = str, *ap1 = ap; + + boothowto = howto; + if (!cold && !(howto & RB_NOSYNC) && !syncing) { + syncing = 1; + vfs_shutdown(); /* sync */ + resettodr(); /* set wall clock */ + } + + splhigh(); + + if (!cold && (howto & RB_DUMP)) + ibm4xx_dumpsys(); + + doshutdownhooks(); + + if ((howto & RB_POWERDOWN) == RB_POWERDOWN) { + /* Power off here if we know how...*/ + } + + if (howto & RB_HALT) { + printf("halted\n\n"); + + goto reboot; /* XXX for now... */ + +#ifdef DDB + printf("dropping to debugger\n"); + while(1) + Debugger(); +#endif + } + + printf("rebooting\n\n"); + if (what && *what) { + if (strlen(what) > sizeof str - 5) + printf("boot string too large, ignored\n"); + else { + strcpy(str, what); + ap1 = ap = str + strlen(str); + *ap++ = ' '; + } + } + *ap++ = '-'; + if (howto & RB_SINGLE) + *ap++ = 's'; + if (howto & RB_KDB) + *ap++ = 'd'; + *ap++ = 0; + if (ap[-2] == '-') + *ap1 = 0; + + /* flush cache for msgbuf */ + __syncicache((void *)msgbuf_paddr, round_page(MSGBUFSIZE)); + + reboot: + ppc4xx_reset(); + + printf("ppc4xx_reset() failed!\n"); +#ifdef DDB + while(1) + Debugger(); +#else + while (1) + /* nothing */; +#endif +}