Module Name: src Committed By: macallan Date: Sat Nov 22 15:17:02 UTC 2014
Modified Files: src/sys/arch/evbmips/evbmips: interrupt.c Added Files: src/sys/arch/evbmips/conf: CI20 files.ingenic std.ingenic src/sys/arch/evbmips/ingenic: autoconf.c clock.c machdep.c mainbus.c src/sys/arch/mips/conf: files.ingenic src/sys/arch/mips/ingenic: ingenic_com.c ingenic_regs.h Log Message: initial support for CI20 / Ingenic JZ4780 not much there yet, it loads, attaches a serial port and you can drop into ddb To generate a diff of this commit: cvs rdiff -u -r0 -r1.1 src/sys/arch/evbmips/conf/CI20 \ src/sys/arch/evbmips/conf/files.ingenic \ src/sys/arch/evbmips/conf/std.ingenic cvs rdiff -u -r1.19 -r1.20 src/sys/arch/evbmips/evbmips/interrupt.c cvs rdiff -u -r0 -r1.1 src/sys/arch/evbmips/ingenic/autoconf.c \ src/sys/arch/evbmips/ingenic/clock.c \ src/sys/arch/evbmips/ingenic/machdep.c \ src/sys/arch/evbmips/ingenic/mainbus.c cvs rdiff -u -r0 -r1.1 src/sys/arch/mips/conf/files.ingenic cvs rdiff -u -r0 -r1.1 src/sys/arch/mips/ingenic/ingenic_com.c \ src/sys/arch/mips/ingenic/ingenic_regs.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbmips/evbmips/interrupt.c diff -u src/sys/arch/evbmips/evbmips/interrupt.c:1.19 src/sys/arch/evbmips/evbmips/interrupt.c:1.20 --- src/sys/arch/evbmips/evbmips/interrupt.c:1.19 Tue May 14 09:16:59 2013 +++ src/sys/arch/evbmips/evbmips/interrupt.c Sat Nov 22 15:17:02 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: interrupt.c,v 1.19 2013/05/14 09:16:59 macallan Exp $ */ +/* $NetBSD: interrupt.c,v 1.20 2014/11/22 15:17:02 macallan Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.19 2013/05/14 09:16:59 macallan Exp $"); +__KERNEL_RCSID(0, "$NetBSD: interrupt.c,v 1.20 2014/11/22 15:17:02 macallan Exp $"); #include <sys/param.h> #include <sys/cpu.h> @@ -79,8 +79,10 @@ cpu_intr(int ppl, vaddr_t pc, uint32_t s KASSERTMSG(ipl == IPL_SCHED, "%s: ipl (%d) != IPL_SCHED (%d)", __func__, ipl, IPL_SCHED); +#ifdef MIPS3_ENABLE_CLOCK_INTR /* call the common MIPS3 clock interrupt handler */ mips3_clockintr(&cf); +#endif pending ^= MIPS_INT_MASK_5; } Added files: Index: src/sys/arch/evbmips/conf/CI20 diff -u /dev/null src/sys/arch/evbmips/conf/CI20:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/conf/CI20 Sat Nov 22 15:17:02 2014 @@ -0,0 +1,215 @@ +# $NetBSD: CI20,v 1.1 2014/11/22 15:17:02 macallan Exp $ +# +# MIPS Creator CI20 +# + +# for now +include "arch/evbmips/conf/std.ingenic" + +#options INCLUDE_CONFIG_FILE # embed config file in kernel binary + +#ident "DB120-$Revision: 1.1 $" + +maxusers 32 + +#makeoptions COPTS="-Os" # Optimise for space. Implies -O2 + +options MIPS32R2 +makeoptions CPUFLAGS+="-mips32r2" +makeoptions NEED_MDSETIMAGE="yes" +makeoptions NEED_BINARY="yes" +makeoptions NEED_UBOOTIMAGE="gz" +options COM_16650,COM_TOLERANCE=50 # +/- 5% +options CONSPEED=115200 # u-boot default +options CONSADDR=0x10030000 +options MEMSIZE="(256*1024*1024)" + +# 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=6144 # size of memory disk, in blocks +#options MEMORY_DISK_ROOT_SIZE=16384 # size of memory disk, in blocks +#options MEMORY_DISK_ROOT_SIZE=7300 + +# Size reduction options +#options VNODE_OP_NOINLINE +#options PIPE_SOCKETPAIR +options SOSEND_NO_LOAN + +# Standard system options +options KTRACE # system call tracing support +#options SYSVMSG # System V message queues +#options SYSVSEM # System V semaphores +#options SYSVSHM # System V shared memory +options NTP # network time protocol + +# Debugging options +options DIAGNOSTIC # extra kernel sanity checking +options DEBUG # extra kernel debugging support +#options KMEMSTATS # kernel memory statistics (vmstat -m) +#options USERCONF # userconf(4) support +#options SYSCTL_INCLUDE_DESCR # Include sysctl descriptions in kernel +options DDB # kernel dynamic debugger +options DDB_HISTORY_SIZE=100 # enable history editing in DDB +makeoptions DEBUG="-g" # compile full symbol table +makeoptions COPY_SYMTAB=1 # size for embedded symbol table + +# Compatibility options +#options COMPAT_43 # compatibility with 4.3BSD binaries +#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_15 # NetBSD 1.5, +#options COMPAT_16 # NetBSD 1.6, +#options COMPAT_20 # NetBSD 2.0, +#options COMPAT_30 # NetBSD 3.0, and +#options COMPAT_40 # NetBSD 4.0 binary compatibility. +#options EXEC_ECOFF # exec ECOFF binaries +#options COMPAT_ULTRIX # binary compatibility with Ultrix +#options COMPAT_BSDPTY # /dev/[pt]ty?? ptys. + +# File systems +file-system FFS # Berkeley Fast Filesystem +file-system MFS # memory-based filesystem +#file-system EXT2FS # second extended file system (linux) +file-system NFS # Sun NFS-compatible filesystem client +#file-system KERNFS # kernel data-structure filesystem +#file-system NULLFS # NULL layered filesystem +#file-system OVERLAY # overlay file system +#file-system FDESC # user file descriptor filesystem +#file-system UMAPFS # uid/gid remapping filesystem +#file-system LFS # Log-based filesystem (still experimental) +#file-system PROCFS # /proc +#file-system CD9660 # ISO 9660 + Rock Ridge file system +#file-system UNION # union file system +#file-system MSDOSFS # MS-DOS FAT filesystem(s). +#file-system CODA # Coda File System; also needs vcoda (below) +#file-system PTYFS # /dev/pts/N support + +# File system options +#options NFSSERVER # Sun NFS-compatible filesystem server +#options QUOTA # legacy UFS quotas +#options QUOTA2 # new, in-filesystem UFS quotas +#options FFS_EI # FFS Endian Independent support +options WAPBL # File system journaling support +options FFS_NO_SNAPSHOT # No FFS snapshot support +#options EXT2FS_SYSTEM_FLAGS # makes ext2fs file flags (append and + # immutable) behave as system flags. + +# Networking options +#options GATEWAY # IP packet forwarding +options INET # Internet protocols +#options INET6 # IPV6 +#options IPSEC # IP security +#options IPSEC_DEBUG # debug for IP security +#options MROUTING # packet forwarding of multicast packets +#options PIM # Protocol Independent Multicast +#options NETATALK # AppleTalk (over Ethernet) protocol +#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 IPFILTER_LOG # ipmon(8) log support +#options IPFILTER_LOOKUP # ippool(8) support + +# Compatibility with 4.2BSD implementation of TCP/IP. Not recommended. +#options TCP_COMPAT_42 + +# JIT compiler for bpfilter +#options SLJIT +#options BPFJIT + +# These options enable verbose messages for several subsystems. +# Warning, these may compile large string tables into the kernel! +options MIIVERBOSE # verbose PHY autoconfig messages + +# Bitmask for enabling the PCI IDE channels in the southbridge. +# Set bit 0 (0x01) for channel 0, bit 1 (0x02) for channel 1. +# +# Do this if your firmware (usually PMON and YAMON) doens't enable the IDE +# channels for you (thus causing the NetBSD `pciide' driver to ignore them). +#options PCI_NETBSD_ENABLE_IDE=0x1 + +options NFS_BOOT_BOOTP +#options NFS_BOOT_DHCP +#options NFS_V2_ONLY + +config netbsd root on ? type ? + +mainbus0 at root +cpu0 at mainbus? +#wdog0 at mainbus? +#options COM_REGMAP +com* at mainbus? +#ehci* at arbus? addr ? +#usb* at ehci? +#uhub* at usb? +#uhub* at uhub? port ? +#umass* at uhub? port ? configuration ? interface ? +#scsibus* at umass? channel ? +#sd* at scsibus? target ? lun ? +#ae* at arbus? addr ? +#ath* at arbus? addr ? +#athflash* at arbus? addr ? +#argpio* at arbus? addr ? +#gpio* at argpio? + +# no RTC! so fake with a stub (required to prevent evbmips panic) + + +# MII/PHY support +#acphy* at mii? phy ? # DAltima AC101 and AMD Am79c874 PHYs +#amhphy* at mii? phy ? # AMD 79c901 Ethernet PHYs +#dmphy* at mii? phy ? # Davicom DM9101 PHYs +#glxtphy* at mii? phy ? # Level One LXT-1000 PHYs +#gphyter* at mii? phy ? # NS83861 Gig-E PHY +#icsphy* at mii? phy ? # Integrated Circuit Systems ICS1890 +#lxtphy* at mii? phy ? # Level One LXT-970 PHYs +#makphy* at mii? phy ? # Marvell Semiconductor 88E1000 PHYs +#nsphy* at mii? phy ? # NS83840 PHYs +#nsphyter* at mii? phy ? # NS83843 PHYs +#pnaphy* at mii? phy ? # generic HomePNA PHYs +#qsphy* at mii? phy ? # Quality Semiconductor QS6612 PHYs +#sqphy* at mii? phy ? # Seeq 80220/80221/80223 PHYs +#tlphy* at mii? phy ? # ThunderLAN PHYs +#tqphy* at mii? phy ? # TDK Semiconductor PHYs +#rlphy* at mii? phy ? # RealTek PHYs +#ukphy* at mii? phy ? # generic unknown PHYs + + +# Pseudo-devices + +# Disk/mass storage pseudo-devices +#pseudo-device ccd # concatenated disk devices +#pseudo-device raid # RAIDframe disk driver +#pseudo-device fss # file system snapshot device +#pseudo-device md # memory disk device (ramdisk) +#pseudo-device vnd # disk-like interface to files + +# Network pseudo-devices +pseudo-device bpfilter # Berkeley packet filter +#pseudo-device ipfilter # IP filter (firewall) and NAT +pseudo-device loop # network loopback +#pseudo-device ppp # Point-to-Point Protocol +#pseudo-device sl # Serial Line IP +#pseudo-device strip # Starmode Radio IP (Metricom) +#pseudo-device tun # network tunneling over tty +#pseudo-device tap # virtual Ethernet +#pseudo-device gre # generic L3 over IP tunnel +#pseudo-device ipip # RFC 2003 IP Encapsulation +#pseudo-device gif # RFC1933 tunnel +#pseudo-device faith # IPv[46] tcp relay translation +#pseudo-device stf # 6to4 IPv6 over IPv4 encapsulation +#pseudo-device vlan # IEEE 802.1q encapsulation +#pseudo-device bridge # simple inter-network bridging + +# Miscellaneous pseudo-devices +pseudo-device pty # pseudo-terminals +pseudo-device clockctl # user control of clock subsystem +pseudo-device ksyms # /dev/ksyms + +# A pseudo device needed for Coda # also needs CODA (above) +#pseudo-device vcoda # coda minicache <-> venus comm. Index: src/sys/arch/evbmips/conf/files.ingenic diff -u /dev/null src/sys/arch/evbmips/conf/files.ingenic:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/conf/files.ingenic Sat Nov 22 15:17:02 2014 @@ -0,0 +1,23 @@ +# $NetBSD: files.ingenic,v 1.1 2014/11/22 15:17:02 macallan Exp $ + +#file arch/evbmips/ingenic/intr.c + +file arch/evbmips/ingenic/autoconf.c +file arch/evbmips/ingenic/machdep.c + +file arch/mips/mips/bus_dma.c +file arch/evbmips/evbmips/disksubr.c +file arch/evbmips/evbmips/interrupt.c +file arch/evbmips/ingenic/clock.c + +# System bus +device mainbus { } +attach mainbus at root +file arch/evbmips/ingenic/mainbus.c mainbus + +device cpu +attach cpu at mainbus +file arch/evbmips/evbmips/cpu.c cpu + +# Memory Disk +file dev/md_root.c memory_disk_hooks Index: src/sys/arch/evbmips/conf/std.ingenic diff -u /dev/null src/sys/arch/evbmips/conf/std.ingenic:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/conf/std.ingenic Sat Nov 22 15:17:02 2014 @@ -0,0 +1,15 @@ +# $NetBSD: std.ingenic,v 1.1 2014/11/22 15:17:02 macallan Exp $ + +machine evbmips mips +include "conf/std" # MI standard options + +options EXEC_ELF32 # exec ELF32 binaries +options EXEC_SCRIPT # exec #! scripts + +makeoptions CPUFLAGS+="-mips32r2" +makeoptions DEFTEXTADDR="0x80020000" +makeoptions BOARDTYPE="ingenic" + +include "arch/evbmips/conf/files.ingenic" +include "arch/mips/conf/files.ingenic" + Index: src/sys/arch/evbmips/ingenic/autoconf.c diff -u /dev/null src/sys/arch/evbmips/ingenic/autoconf.c:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/ingenic/autoconf.c Sat Nov 22 15:17:02 2014 @@ -0,0 +1,69 @@ +/* $NetBSD: autoconf.c,v 1.1 2014/11/22 15:17:02 macallan Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe. + * + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: autoconf.c,v 1.1 2014/11/22 15:17:02 macallan Exp $"); + +#include <sys/param.h> +#include <sys/bus.h> +#include <sys/conf.h> +#include <sys/device.h> +#include <sys/systm.h> + +/* + * Configure all devices on system + */ +void +cpu_configure(void) +{ + + intr_init(); + + /* Kick off autoconfiguration. */ + (void)splhigh(); + if (config_rootfound("mainbus", NULL) == NULL) + panic("no mainbus found"); +} + +void +cpu_rootconf(void) +{ + + rootconf(); +} + +void +device_register(device_t dev, void *aux) +{ +#ifdef notyet + (*platformsw->apsw_device_register)(dev, aux); +#endif +} Index: src/sys/arch/evbmips/ingenic/clock.c diff -u /dev/null src/sys/arch/evbmips/ingenic/clock.c:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/ingenic/clock.c Sat Nov 22 15:17:02 2014 @@ -0,0 +1,93 @@ +/* $NetBSD: clock.c,v 1.1 2014/11/22 15:17:02 macallan Exp $ */ + +/*- + * Copyright (c) 2014 Michael Lorenz + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.1 2014/11/22 15:17:02 macallan Exp $"); + +#include <sys/param.h> +#include <sys/cpu.h> +#include <sys/device.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <mips/ingenic/ingenic_regs.h> + +void +cpu_initclocks(void) +{ + + /* timecounter setup and such */ +} + +/* shamelessly stolen from mips3_clock.c */ +void +delay(int n) +{ + u_long divisor_delay; + uint32_t cur, last, delta, usecs; + + last = readreg(JZ_OST_CNT_LO); + delta = usecs = 0; + + divisor_delay = curcpu()->ci_divisor_delay; + if (divisor_delay == 0) { + /* + * Frequency values in curcpu() are not initialized. + * Assume faster frequency since longer delays are harmless. + * Note CPU_MIPS_DOUBLE_COUNT is ignored here. + */ +#define FAST_FREQ (300 * 1000 * 1000) /* fast enough? */ + divisor_delay = FAST_FREQ / (1000 * 1000); + } + while (n > usecs) { + cur = readreg(JZ_OST_CNT_LO); + + /* + * We setup the OS timer to always counts upto UINT32_MAX, + * so no need to check wrapped around case. + */ + delta += (cur - last); + + last = cur; + + while (delta >= divisor_delay) { + /* + * delta is not so larger than divisor_delay here, + * and using DIV/DIVU ops could be much slower. + * (though longer delay may be harmless) + */ + usecs++; + delta -= divisor_delay; + } + } +} + +void +setstatclockrate(int r) +{ + /* nothing to see here */ +} Index: src/sys/arch/evbmips/ingenic/machdep.c diff -u /dev/null src/sys/arch/evbmips/ingenic/machdep.c:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/ingenic/machdep.c Sat Nov 22 15:17:02 2014 @@ -0,0 +1,346 @@ +/* $NetBSD: machdep.c,v 1.1 2014/11/22 15:17:02 macallan Exp $ */ + +/*- + * Copyright (c) 2014 Michael Lorenz + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.1 2014/11/22 15:17:02 macallan Exp $"); + +#include "opt_ddb.h" +#include "opt_kgdb.h" +#include "opt_modular.h" + +#include <sys/param.h> +#include <sys/boot_flag.h> +#include <sys/device.h> +#include <sys/kernel.h> +#include <sys/kcore.h> +#include <sys/ksyms.h> +#include <sys/mount.h> +#include <sys/reboot.h> +#include <sys/cpu.h> + +#include <uvm/uvm_extern.h> + +#include <dev/cons.h> + +#include <mips/ingenic/ingenic_regs.h> + +#include "ksyms.h" + +#if NKSYMS || defined(DDB) || defined(MODULAR) +#include <mips/db_machdep.h> +#include <ddb/db_extern.h> +#endif + +#include <mips/cache.h> +#include <mips/locore.h> +#include <mips/cpuregs.h> + +/* Maps for VM objects. */ +struct vm_map *phys_map = NULL; + +int maxmem; /* max memory per process */ + +int mem_cluster_cnt; +phys_ram_seg_t mem_clusters[VM_PHYSSEG_MAX]; + +void mach_init(void); /* XXX */ +void ingenic_reset(void); + +void ingenic_putchar_init(void); +void ingenic_puts(const char *); +void ingenic_com_cnattach(void); + +static void +cal_timer(void) +{ + uint32_t cntfreq; + volatile uint32_t junk; + + /* + * The manual seems to imply that EXCCLK is 12MHz, although in real + * life it appears to be 48MHz. Either way, we want a 12MHz counter. + */ + curcpu()->ci_cpu_freq = 1200000000; /* for now */ + cntfreq = 12000000; /* EXTCLK / 4 */ + + curcpu()->ci_cctr_freq = cntfreq; + curcpu()->ci_cycles_per_hz = (cntfreq + hz / 2) / hz; + + /* Compute number of cycles per 1us (1/MHz). 0.5MHz is for roundup. */ + curcpu()->ci_divisor_delay = ((cntfreq + 500000) / 1000000); + + /* actually start the counter now */ + /* stop OS timer */ + writereg(JZ_TC_TECR, TESR_OST); + /* zero everything */ + writereg(JZ_OST_CTRL, 0); + writereg(JZ_OST_CNT_LO, 0); + writereg(JZ_OST_CNT_HI, 0); + writereg(JZ_OST_DATA, 0xffffffff); + /* use EXTCLK, don't reset */ + writereg(JZ_OST_CTRL, OSTC_EXT_EN | OSTC_MODE | OSTC_DIV_4); + /* start the timer */ + writereg(JZ_TC_TESR, TESR_OST); + /* make sure the timer actually runs */ + junk = readreg(JZ_OST_CNT_LO); + do {} while (junk == readreg(JZ_OST_CNT_LO)); +} + +void +mach_init(void) +{ + void *kernend; + uint32_t memsize; + extern char edata[], end[]; /* XXX */ + + /* clear the BSS segment */ + kernend = (void *)mips_round_page(end); + + memset(edata, 0, (char *)kernend - edata); + + /* setup early console */ + ingenic_putchar_init(); + + /* set CPU model info for sysctl_hw */ + cpu_setmodel("Ingenic XBurst"); + mips_vector_init(NULL, false); + cal_timer(); + uvm_setpagesize(); + /* + * Look at arguments passed to us and compute boothowto. + */ + boothowto = RB_AUTOBOOT; +#ifdef KADB + boothowto |= RB_KDB; +#endif + + /* + * Determine the memory size. + * + * Note: Reserve the first page! That's where the trap + * vectors are located. + */ + memsize = 0x40000000; + + printf("Memory size: 0x%08x\n", memsize); + physmem = btoc(memsize); + + /* XXX this is CI20 specific */ + mem_clusters[0].start = PAGE_SIZE; + mem_clusters[0].size = 0x10000000 - PAGE_SIZE; + mem_clusters[1].start = 0x30000000; + mem_clusters[1].size = 0x30000000; + mem_cluster_cnt = 2; + + /* + * Load the available pages into the VM system. + */ + mips_page_physload(MIPS_KSEG0_START, (vaddr_t)kernend, + mem_clusters, mem_cluster_cnt, NULL, 0); + + /* + * Initialize message buffer (at end of core). + */ + mips_init_msgbuf(); + + /* + * Initialize the virtual memory system. + */ + pmap_bootstrap(); + + /* + * Allocate uarea page for lwp0 and set it. + */ + mips_init_lwp0_uarea(); + + /* + * Initialize debuggers, and break into them, if appropriate. + */ +#ifdef DDB + if (boothowto & RB_KDB) + Debugger(); +#endif +} + +void +consinit(void) +{ + /* + * Everything related to console initialization is done + * in mach_init(). + */ + ingenic_com_cnattach(); +} + +void +cpu_startup(void) +{ + char pbuf[9]; + vaddr_t minaddr, maxaddr; +#ifdef DEBUG + extern int pmapdebug; /* XXX */ + int opmapdebug = pmapdebug; + + pmapdebug = 0; /* Shut up pmap debug during bootstrap */ +#endif + + /* + * Good {morning,afternoon,evening,night}. + */ + printf("%s%s", copyright, version); + printf("%s\n", cpu_getmodel()); + format_bytes(pbuf, sizeof(pbuf), ctob(physmem)); + printf("total memory = %s\n", pbuf); + + minaddr = 0; + /* + * Allocate a submap for physio + */ + phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr, + VM_PHYS_SIZE, 0, FALSE, NULL); + + /* + * No need to allocate an mbuf cluster submap. Mbuf clusters + * are allocated via the pool allocator, and we use KSEG to + * map those pages. + */ + +#ifdef DEBUG + pmapdebug = opmapdebug; +#endif + format_bytes(pbuf, sizeof(pbuf), ptoa(uvmexp.free)); + printf("avail memory = %s\n", pbuf); +} + +void +cpu_reboot(int howto, char *bootstr) +{ + static int waittime = -1; + + /* Take a snapshot before clobbering any registers. */ + savectx(curpcb); + + /* If "always halt" was specified as a boot flag, obey. */ + if (boothowto & RB_HALT) + howto |= RB_HALT; + + boothowto = howto; + + /* If system is cold, just halt. */ + if (cold) { + boothowto |= RB_HALT; + goto haltsys; + } + + if ((boothowto & RB_NOSYNC) == 0 && waittime < 0) { + waittime = 0; + + /* + * Synchronize the disks.... + */ + vfs_shutdown(); + + /* + * If we've been adjusting the clock, the todr + * will be out of synch; adjust it now. + */ + resettodr(); + } + + /* Disable interrupts. */ + splhigh(); + + if (boothowto & RB_DUMP) + dumpsys(); + + haltsys: + /* Run any shutdown hooks. */ + doshutdownhooks(); + + pmf_system_shutdown(boothowto); + +#if 0 + if ((boothowto & RB_POWERDOWN) == RB_POWERDOWN) + if (board && board->ab_poweroff) + board->ab_poweroff(); +#endif + + /* + * Firmware may autoboot (depending on settings), and we cannot pass + * flags to it (at least I haven't figured out how to yet), so + * we "pseudo-halt" now. + */ + if (boothowto & RB_HALT) { + printf("\n"); + printf("The operating system has halted.\n"); + printf("Please press any key to reboot.\n\n"); + cnpollc(1); /* For proper keyboard command handling */ + cngetc(); + cnpollc(0); + } + + printf("reseting board...\n\n"); + mips_icache_sync_all(); + mips_dcache_wbinv_all(); + ingenic_reset(); + __asm volatile("jr %0" :: "r"(MIPS_RESET_EXC_VEC)); + printf("Oops, back from reset\n\nSpinning..."); + for (;;) + /* spin forever */ ; /* XXX */ + /*NOTREACHED*/ +} + +void +ingenic_reset(void) +{ + /* + * for now, provoke a watchdog reset in about a second, so UART buffers + * have a fighting chance to flush before we pull the plug + */ + writereg(JZ_WDOG_TCER, 0); /* disable watchdog */ + writereg(JZ_WDOG_TCNT, 0); /* reset counter */ + writereg(JZ_WDOG_TDR, 128); /* wait for ~1s */ + writereg(JZ_WDOG_TCSR, TCSR_RTC_EN | TCSR_DIV_256); + writereg(JZ_WDOG_TCER, TCER_ENABLE); /* fire! */ +} + +void +evbmips_intr_init(void) +{ +#if notyet + (*platformsw->apsw_intr_init)(); +#endif +} + +void +evbmips_iointr(int ipl, vaddr_t pc, uint32_t ipending) +{ +#if notyet + (*platformsw->apsw_intrsw->aisw_iointr)(ipl, pc, ipending); +#endif +} Index: src/sys/arch/evbmips/ingenic/mainbus.c diff -u /dev/null src/sys/arch/evbmips/ingenic/mainbus.c:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/evbmips/ingenic/mainbus.c Sat Nov 22 15:17:02 2014 @@ -0,0 +1,90 @@ +/* $NetBSD: mainbus.c,v 1.1 2014/11/22 15:17:02 macallan Exp $ */ + +/*- + * Copyright (c) 2014 Michael Lorenz + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.1 2014/11/22 15:17:02 macallan Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> + +#include <mips/cache.h> +#include <mips/cpuregs.h> + +#include "locators.h" + +static int mainbus_match(device_t, cfdata_t, void *); +static void mainbus_attach(device_t, device_t, void *); +static int mainbus_print(void *, const char *); + +CFATTACH_DECL_NEW(mainbus, 0, + mainbus_match, mainbus_attach, NULL, NULL); + +/* There can be only one. */ +int mainbus_found = 0; + +struct mainbusdev { + const char *md_name; +}; + +struct mainbusdev mainbusdevs[] = { + { "cpu", }, + { "com", }, + { NULL, } +}; + +static int +mainbus_match(device_t parent, cfdata_t match, void *aux) +{ + + if (mainbus_found) + return (0); + + return (1); +} + +static void +mainbus_attach(device_t parent, device_t self, void *aux) +{ + const struct mainbusdev *md; + + mainbus_found = 1; + printf("\n"); + + for (md = mainbusdevs; md->md_name != NULL; md++) { + struct mainbusdev ma = *md; + config_found_ia(self, "mainbus", &ma, mainbus_print); + } +} + +static int +mainbus_print(void *aux, const char *pnp) +{ + + return (QUIET); +} Index: src/sys/arch/mips/conf/files.ingenic diff -u /dev/null src/sys/arch/mips/conf/files.ingenic:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/mips/conf/files.ingenic Sat Nov 22 15:17:01 2014 @@ -0,0 +1,6 @@ +# $NetBSD: files.ingenic,v 1.1 2014/11/22 15:17:01 macallan Exp $ + +# On-chip UART device +attach com at mainbus with com_mainbus +file arch/mips/ingenic/ingenic_com.c com_mainbus + Index: src/sys/arch/mips/ingenic/ingenic_com.c diff -u /dev/null src/sys/arch/mips/ingenic/ingenic_com.c:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/mips/ingenic/ingenic_com.c Sat Nov 22 15:17:01 2014 @@ -0,0 +1,205 @@ +/* $NetBSD: ingenic_com.c,v 1.1 2014/11/22 15:17:01 macallan Exp $ */ + +/*- + * Copyright (c) 2014 Michael Lorenz + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <sys/cdefs.h> +__KERNEL_RCSID(0, "$NetBSD: ingenic_com.c,v 1.1 2014/11/22 15:17:01 macallan Exp $"); + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/device.h> +#include <sys/kernel.h> +#include <sys/termios.h> +#include <sys/ttydefaults.h> +#include <sys/types.h> + +#include <sys/bus.h> + +#include <dev/cons.h> +#include <dev/ic/comreg.h> +#include <dev/ic/comvar.h> + +#include <mips/cpuregs.h> + +#include <mips/ingenic/ingenic_regs.h> + +#include "opt_com.h" + +volatile int32_t *com0addr = (int32_t *)MIPS_PHYS_TO_KSEG1(JZ_UART0); + +void ingenic_putchar_init(void); +void ingenic_puts(const char *); +void ingenic_putchar(char); + +#ifndef CONMODE +# define CONMODE ((TTYDEF_CFLAG & ~(CSIZE | PARENB)) | CS8) +#endif + + +struct mips_bus_space ingenic_com_mbst; +int mbst_valid = 0; +static void ingenic_com_bus_mem_init(bus_space_tag_t, void *); +void ingenic_com_cnattach(void); + +static int ingenic_com_match(device_t, cfdata_t , void *); +static void ingenic_com_attach(device_t, device_t, void *); + +struct ingenic_com_softc { + struct com_softc sc_com; +}; + +CFATTACH_DECL_NEW(com_mainbus, sizeof(struct ingenic_com_softc), + ingenic_com_match, ingenic_com_attach, NULL, NULL); + +bus_space_handle_t regh = 0; + +void +ingenic_putchar_init(void) +{ + /* + * XXX don't screw with the UART's speed until we know what clock + * we're on + */ +#if 0 + int rate; +#endif + extern int comspeed(long, long, int); + + com0addr = (uint32_t *)MIPS_PHYS_TO_KSEG1(JZ_UART0); +#if 0 + if (comcnfreq != -1) { + rate = comspeed(comcnspeed, comcnfreq, COM_TYPE_INGENIC); + if (rate < 0) + return; /* XXX */ +#endif + com0addr[com_ier] = 0; + com0addr[com_lctl] = htole32(LCR_DLAB); +#if 0 + com0addr[com_dlbl] = htole32(rate & 0xff); + com0addr[com_dlbh] = htole32(rate >> 8); +#endif + com0addr[com_lctl] = htole32(LCR_8BITS); /* XXX */ + com0addr[com_mcr] = htole32(MCR_DTR|MCR_RTS); + com0addr[com_fifo] = htole32( + FIFO_ENABLE | FIFO_RCV_RST | FIFO_XMT_RST | + FIFO_TRIGGER_1 | FIFO_UART_ON); +#if 0 + } +#endif +} + + +void +ingenic_putchar(char c) +{ + int timo = 150000; + + while ((le32toh(com0addr[com_lsr]) & LSR_TXRDY) == 0) + if (--timo == 0) + break; + + com0addr[com_data] = htole32((uint32_t)c); + + while ((le32toh(com0addr[com_lsr]) & LSR_TSRE) == 0) + if (--timo == 0) + break; +} + +void +ingenic_puts(const char *restrict s) +{ + char c; + + while ((c = *s++) != 0) + ingenic_putchar(c); +} + +static void +ingenic_com_bus_init(void) +{ + if (mbst_valid) return; + ingenic_com_bus_mem_init(&ingenic_com_mbst, NULL); + mbst_valid = 1; +} + +void +ingenic_com_cnattach(void) +{ + struct com_regs regs; + + ingenic_com_bus_init(); + bus_space_map(&ingenic_com_mbst, 0, 0x1000, 0, ®h); + + memset(®s, 0, sizeof(regs)); + COM_INIT_REGS(regs, &ingenic_com_mbst, regh, 0); + + /* + * XXX + * UART clock is either 6MHz or 12MHz, the manual is rather unclear + * so we just leave alone whatever u-boot set up + * my uplcom is too tolerant to show any difference + */ + comcnattach1(®s, -1, 6000000, COM_TYPE_INGENIC, CONMODE); +} + +static int +ingenic_com_match(device_t parent, cfdata_t cfdata, void *args) +{ + struct mainbusdev { + const char *md_name; + } *aa = args; + if (strcmp(aa->md_name, "com") == 0) return 1; + return 0; +} + + +static void +ingenic_com_attach(device_t parent, device_t self, void *args) +{ + struct ingenic_com_softc *isc = device_private(self); + struct com_softc *sc = &isc->sc_com; + + sc->sc_dev = self; + sc->sc_frequency = 12000000; + sc->sc_type = COM_TYPE_INGENIC; + memset(&sc->sc_regs, 0, sizeof(sc->sc_regs)); + COM_INIT_REGS(sc->sc_regs, &ingenic_com_mbst, regh, 0); + com_attach_subr(sc); + printf("\n"); + /* interrupt */ +} + +#define CHIP ingenic_com +#define CHIP_MEM /* defined */ +#define CHIP_W1_BUS_START(v) 0x00000000UL +#define CHIP_W1_BUS_END(v) 0x00010000UL +#define CHIP_W1_SYS_START(v) 0x10030000UL +#define CHIP_W1_SYS_END(v) 0x10035000UL +#define CHIP_ACCESS_SIZE 1 +#define CHIP_ALIGN_STRIDE 2 + +#include <mips/mips/bus_space_alignstride_chipdep.c> Index: src/sys/arch/mips/ingenic/ingenic_regs.h diff -u /dev/null src/sys/arch/mips/ingenic/ingenic_regs.h:1.1 --- /dev/null Sat Nov 22 15:17:02 2014 +++ src/sys/arch/mips/ingenic/ingenic_regs.h Sat Nov 22 15:17:01 2014 @@ -0,0 +1,105 @@ +/* $NetBSD: ingenic_regs.h,v 1.1 2014/11/22 15:17:01 macallan Exp $ */ + +/*- + * Copyright (c) 2014 Michael Lorenz + * 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <mips/locore.h> + +#ifndef INGENIC_REGS_H +#define INGENIC_REGS_H + +/* UARTs, mostly 16550 compatible with 32bit spaced registers */ +#define JZ_UART0 0x10030000 +#define JZ_UART1 0x10031000 +#define JZ_UART2 0x10032000 +#define JZ_UART3 0x10033000 +#define JZ_UART4 0x10034000 + +/* watchdog */ +#define JZ_WDOG_TDR 0x10002000 /* compare */ +#define JZ_WDOG_TCER 0x10002004 + #define TCER_ENABLE 0x01 /* enable counter */ +#define JZ_WDOG_TCNT 0x10002008 /* 16bit up count */ +#define JZ_WDOG_TCSR 0x1000200c + #define TCSR_PCK_EN 0x01 /* PCLK */ + #define TCSR_RTC_EN 0x02 /* RTCCLK - 32.768kHz */ + #define TCSR_EXT_EN 0x04 /* EXTCLK - 12MHz? */ + #define TCSR_PRESCALE_M 0x38 + #define TCSR_DIV_1 0x00 + #define TCSR_DIV_4 0x08 + #define TCSR_DIV_16 0x10 + #define TCSR_DIV_64 0x18 + #define TCSR_DIV_256 0x20 + #define TCSR_DIV_1024 0x28 + +/* timers and PWMs */ +#define JZ_TC_TER 0x10002010 /* TC enable reg, ro */ +#define JZ_TC_TESR 0x10002014 /* TC enable set reg. */ + #define TESR_TCST0 0x0001 /* enable counter 0 */ + #define TESR_TCST1 0x0002 /* enable counter 1 */ + #define TESR_TCST2 0x0004 /* enable counter 2 */ + #define TESR_TCST3 0x0008 /* enable counter 3 */ + #define TESR_TCST4 0x0010 /* enable counter 4 */ + #define TESR_TCST5 0x0014 /* enable counter 5 */ + #define TESR_TCST6 0x0018 /* enable counter 6 */ + #define TESR_TCST7 0x001c /* enable counter 7 */ + #define TESR_OST 0x8000 /* enable OST */ +#define JZ_TC_TECR 0x10002018 /* TC enable clear reg. */ + +/* operating system timer */ +#define JZ_OST_DATA 0x100020e0 /* compare */ +#define JZ_OST_CNT_LO 0x100020e4 +#define JZ_OST_CNT_HI 0x100020e8 +#define JZ_OST_CTRL 0x100020ec + #define OSTC_PCK_EN 0x0001 /* use PCLK */ + #define OSTC_RTC_EN 0x0002 /* use RTCCLK */ + #define OSTC_EXT_EN 0x0004 /* use EXTCLK */ + #define OSTC_PRESCALE_M 0x0038 + #define OSTC_DIV_1 0x0000 + #define OSTC_DIV_4 0x0008 + #define OSTC_DIV_16 0x0010 + #define OSTC_DIV_64 0x0018 + #define OSTC_DIV_256 0x0020 + #define OSTC_DIV_1024 0x0028 + #define OSTC_SHUTDOWN 0x0200 + #define OSTC_MODE 0x8000 /* 0 - reset to 0 when = OST_DATA */ +#define JZ_OST_CNT_U32 0x100020fc /* copy of CNT_HI when reading CNT_LO */ + +static inline void +writereg(uint32_t reg, uint32_t val) +{ + *(int32_t *)MIPS_PHYS_TO_KSEG1(reg) = val; + wbflush(); +} + +static inline uint32_t +readreg(uint32_t reg) +{ + wbflush(); + return *(int32_t *)MIPS_PHYS_TO_KSEG1(reg); +} + +#endif /* INGENIC_REGS_H */ \ No newline at end of file