Home | History | Annotate | Line # | Download | only in mpcsa
mpcsa_machdep.c revision 1.9.28.1
      1  1.9.28.1  pgoyette /*	$Id: mpcsa_machdep.c,v 1.9.28.1 2018/07/28 04:37:32 pgoyette Exp $	*/
      2  1.9.28.1  pgoyette /*	$NetBSD: mpcsa_machdep.c,v 1.9.28.1 2018/07/28 04:37:32 pgoyette Exp $	*/
      3       1.2      matt 
      4       1.2      matt /*
      5       1.2      matt  * Copyright (c) 2007 Embedtronics Oy
      6       1.2      matt  * Based on tsarm_machdep.c
      7       1.2      matt  *
      8       1.2      matt  * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
      9       1.2      matt  * All rights reserved.
     10       1.2      matt  *
     11       1.2      matt  * Based on code written by Jason R. Thorpe and Steve C. Woodford for
     12       1.2      matt  * Wasabi Systems, Inc.
     13       1.2      matt  *
     14       1.2      matt  * Redistribution and use in source and binary forms, with or without
     15       1.2      matt  * modification, are permitted provided that the following conditions
     16       1.2      matt  * are met:
     17       1.2      matt  * 1. Redistributions of source code must retain the above copyright
     18       1.2      matt  *    notice, this list of conditions and the following disclaimer.
     19       1.2      matt  * 2. Redistributions in binary form must reproduce the above copyright
     20       1.2      matt  *    notice, this list of conditions and the following disclaimer in the
     21       1.2      matt  *    documentation and/or other materials provided with the distribution.
     22       1.2      matt  * 3. All advertising materials mentioning features or use of this software
     23       1.2      matt  *    must display the following acknowledgement:
     24       1.2      matt  *	This product includes software developed for the NetBSD Project by
     25       1.2      matt  *	Wasabi Systems, Inc.
     26       1.2      matt  * 4. The name of Wasabi Systems, Inc. may not be used to endorse
     27       1.2      matt  *    or promote products derived from this software without specific prior
     28       1.2      matt  *    written permission.
     29       1.2      matt  *
     30       1.2      matt  * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
     31       1.2      matt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     32       1.2      matt  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     33       1.2      matt  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
     34       1.2      matt  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     35       1.2      matt  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     36       1.2      matt  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     37       1.2      matt  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     38       1.2      matt  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     39       1.2      matt  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     40       1.2      matt  * POSSIBILITY OF SUCH DAMAGE.
     41       1.2      matt  */
     42       1.2      matt 
     43       1.2      matt /*
     44       1.2      matt  * Copyright (c) 1997,1998 Mark Brinicombe.
     45       1.2      matt  * Copyright (c) 1997,1998 Causality Limited.
     46       1.2      matt  * All rights reserved.
     47       1.2      matt  *
     48       1.2      matt  * Redistribution and use in source and binary forms, with or without
     49       1.2      matt  * modification, are permitted provided that the following conditions
     50       1.2      matt  * are met:
     51       1.2      matt  * 1. Redistributions of source code must retain the above copyright
     52       1.2      matt  *    notice, this list of conditions and the following disclaimer.
     53       1.2      matt  * 2. Redistributions in binary form must reproduce the above copyright
     54       1.2      matt  *    notice, this list of conditions and the following disclaimer in the
     55       1.2      matt  *    documentation and/or other materials provided with the distribution.
     56       1.2      matt  * 3. All advertising materials mentioning features or use of this software
     57       1.2      matt  *    must display the following acknowledgement:
     58       1.2      matt  *	This product includes software developed by Mark Brinicombe
     59       1.2      matt  *	for the NetBSD Project.
     60       1.2      matt  * 4. The name of the company nor the name of the author may be used to
     61       1.2      matt  *    endorse or promote products derived from this software without specific
     62       1.2      matt  *    prior written permission.
     63       1.2      matt  *
     64       1.2      matt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     65       1.2      matt  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     66       1.2      matt  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     67       1.2      matt  * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     68       1.2      matt  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     69       1.2      matt  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     70       1.2      matt  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     71       1.2      matt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     72       1.2      matt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     73       1.2      matt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     74       1.2      matt  * SUCH DAMAGE.
     75       1.2      matt  *
     76       1.5       wiz  * Machine dependent functions for kernel setup for Iyonix.
     77       1.2      matt  */
     78       1.2      matt 
     79       1.2      matt #include <sys/cdefs.h>
     80  1.9.28.1  pgoyette __KERNEL_RCSID(0, "$NetBSD: mpcsa_machdep.c,v 1.9.28.1 2018/07/28 04:37:32 pgoyette Exp $");
     81       1.2      matt 
     82       1.2      matt #include "opt_ddb.h"
     83       1.2      matt #include "opt_kgdb.h"
     84       1.2      matt #include "opt_pmap_debug.h"
     85       1.2      matt 
     86       1.2      matt #include <sys/param.h>
     87       1.2      matt #include <sys/device.h>
     88       1.2      matt #include <sys/systm.h>
     89       1.2      matt #include <sys/kernel.h>
     90       1.2      matt #include <sys/exec.h>
     91       1.2      matt #include <sys/proc.h>
     92       1.2      matt #include <sys/msgbuf.h>
     93       1.2      matt #include <sys/reboot.h>
     94       1.2      matt #include <sys/termios.h>
     95       1.2      matt #include <sys/ksyms.h>
     96       1.9      matt #include <sys/bus.h>
     97       1.9      matt #include <sys/cpu.h>
     98       1.2      matt 
     99       1.2      matt #include <uvm/uvm_extern.h>
    100       1.2      matt 
    101       1.2      matt #include <dev/cons.h>
    102       1.2      matt 
    103       1.9      matt #include <dev/ic/comreg.h>
    104       1.9      matt #include <dev/ic/comvar.h>
    105       1.9      matt 
    106       1.2      matt #include <machine/db_machdep.h>
    107       1.2      matt #include <ddb/db_sym.h>
    108       1.2      matt #include <ddb/db_extern.h>
    109       1.2      matt 
    110       1.9      matt #include <arm/locore.h>
    111       1.2      matt #include <arm/undefined.h>
    112       1.2      matt 
    113       1.2      matt #include <arm/arm32/machdep.h>
    114       1.2      matt 
    115       1.2      matt #include <arm/at91/at91reg.h>
    116       1.2      matt #include <arm/at91/at91var.h>
    117       1.2      matt 
    118       1.9      matt #define	DRAM_BLOCKS	1
    119       1.9      matt #include <machine/bootconfig.h>
    120       1.2      matt #include <machine/autoconf.h>
    121       1.2      matt 
    122       1.2      matt #include "seeprom.h"
    123       1.2      matt #if NSEEPROM > 0
    124       1.2      matt #include <net/if.h>
    125       1.2      matt #include <net/if_ether.h>
    126       1.2      matt #include <dev/i2c/i2cvar.h>
    127       1.2      matt #include <dev/i2c/at24cxxvar.h>
    128       1.2      matt #endif
    129       1.2      matt #include <arm/at91/at91twivar.h>
    130       1.2      matt 
    131       1.2      matt #if TODO
    132       1.2      matt #include "epcom.h"
    133       1.2      matt #if NEPCOM > 0
    134       1.2      matt #include <arm/ep93xx/epcomvar.h>
    135       1.2      matt #endif
    136       1.2      matt 
    137       1.2      matt #include "isa.h"
    138       1.2      matt #if NISA > 0
    139       1.2      matt #include <dev/isa/isareg.h>
    140       1.2      matt #include <dev/isa/isavar.h>
    141       1.2      matt #endif
    142       1.2      matt 
    143       1.2      matt #include <machine/isa_machdep.h>
    144       1.2      matt 
    145       1.2      matt #include <evbarm/mpcsa/mpcsareg.h>
    146       1.2      matt #endif	// TODO
    147       1.2      matt 
    148       1.2      matt #include <arm/at91/at91rm9200reg.h>
    149       1.2      matt #include <arm/at91/at91rm9200busvar.h>
    150       1.2      matt 
    151       1.2      matt #include "ksyms.h"
    152       1.2      matt 
    153       1.2      matt #include <arm/at91/at91busvar.h>
    154       1.2      matt #include <arm/at91/at91pdcreg.h>
    155       1.2      matt #include <arm/at91/at91dbgureg.h>
    156       1.2      matt #include <arm/at91/at91reg.h>
    157       1.2      matt #include <arm/at91/at91streg.h>
    158       1.2      matt 
    159       1.2      matt /* boot configuration: */
    160       1.2      matt BootConfig bootconfig;		/* Boot config storage */
    161       1.2      matt char *boot_args = NULL;
    162       1.2      matt char *boot_file = NULL;
    163       1.2      matt 
    164       1.2      matt /* hmmm */
    165       1.2      matt static struct arm32_dma_range mpcsa_dma_ranges[4];
    166       1.2      matt static struct at91bus_machdep mpcsabus;
    167       1.2      matt static at91bus_tag_t old_at91bus_tag;
    168       1.2      matt 
    169       1.2      matt /* Prototypes */
    170       1.2      matt static void mpcsa_device_register(device_t dev, void *aux);
    171       1.2      matt static void mpcsabus_init(struct at91bus_clocks *);
    172       1.2      matt static void mpcsabus_peripheral_clock(int pid, int enable);
    173       1.2      matt static uint32_t mpcsabus_gpio_mask(int pid);
    174       1.2      matt 
    175       1.2      matt 
    176       1.2      matt /*
    177       1.2      matt  * void cpu_reboot(int howto, char *bootstr)
    178       1.2      matt  *
    179       1.2      matt  * Reboots the system
    180       1.2      matt  *
    181       1.2      matt  * Deal with any syncing, unmounting, dumping and shutdown hooks,
    182       1.2      matt  * then reset the CPU.
    183       1.2      matt  */
    184       1.2      matt void
    185       1.2      matt cpu_reboot(int howto, char *bootstr)
    186       1.2      matt {
    187       1.2      matt 
    188       1.2      matt 	/*
    189       1.2      matt 	 * If we are still cold then hit the air brakes
    190       1.2      matt 	 * and crash to earth fast
    191       1.2      matt 	 */
    192       1.2      matt 	if (cold) {
    193       1.2      matt 		doshutdownhooks();
    194       1.3    dyoung 		pmf_system_shutdown(boothowto);
    195       1.2      matt 		printf("\r\n");
    196       1.2      matt 		printf("The operating system has halted.\r\n");
    197       1.2      matt 		printf("Please press any key to reboot.\r\n");
    198       1.2      matt 		cngetc();
    199       1.2      matt 		printf("\r\nrebooting...\r\n");
    200       1.2      matt 		goto reset;
    201       1.2      matt 	}
    202       1.2      matt 
    203       1.2      matt 	/* Disable console buffering */
    204       1.2      matt 
    205       1.2      matt 	/*
    206       1.2      matt 	 * If RB_NOSYNC was not specified sync the discs.
    207       1.2      matt 	 * Note: Unless cold is set to 1 here, syslogd will die during the
    208       1.2      matt 	 * unmount.  It looks like syslogd is getting woken up only to find
    209       1.2      matt 	 * that it cannot page part of the binary in as the filesystem has
    210       1.2      matt 	 * been unmounted.
    211       1.2      matt 	 */
    212       1.2      matt 	if (!(howto & RB_NOSYNC))
    213       1.2      matt 		bootsync();
    214       1.2      matt 
    215       1.2      matt 	/* Say NO to interrupts */
    216       1.2      matt 	splhigh();
    217       1.2      matt 
    218       1.2      matt 	/* Do a dump if requested. */
    219       1.2      matt 	if ((howto & (RB_DUMP | RB_HALT)) == RB_DUMP)
    220       1.2      matt 		dumpsys();
    221       1.2      matt 
    222       1.2      matt 	/* Run any shutdown hooks */
    223       1.2      matt 	doshutdownhooks();
    224       1.2      matt 
    225       1.3    dyoung 	pmf_system_shutdown(boothowto);
    226       1.3    dyoung 
    227       1.2      matt 	/* Make sure IRQ's are disabled */
    228       1.2      matt 	IRQdisable;
    229       1.2      matt 
    230       1.2      matt 	if (howto & RB_HALT) {
    231       1.2      matt 		printf("\r\n");
    232       1.2      matt 		printf("The operating system has halted.\r\n");
    233       1.2      matt 		printf("Please press any key to reboot.\r\n");
    234       1.2      matt 		cngetc();
    235       1.2      matt 	}
    236       1.2      matt 
    237       1.2      matt 	printf("\r\nrebooting...\r\n");
    238       1.2      matt  reset:
    239       1.2      matt 	/*
    240       1.2      matt 	 * Make really really sure that all interrupts are disabled,
    241       1.2      matt 	 * and poke the Internal Bus and Peripheral Bus reset lines.
    242       1.2      matt 	 */
    243       1.2      matt 	(void) disable_interrupts(I32_bit|F32_bit);
    244       1.2      matt 	STREG(ST_WDMR)	= ST_WDMR_EXTEN | ST_WDMR_RSTEN | 1;
    245       1.2      matt 	STREG(ST_CR)	= ST_CR_WDRST;
    246       1.2      matt 	for (;;);
    247       1.2      matt }
    248       1.2      matt 
    249       1.2      matt /*
    250       1.2      matt  * u_int initarm(...)
    251       1.2      matt  *
    252       1.2      matt  * Initial entry point on startup. This gets called before main() is
    253       1.2      matt  * entered.
    254       1.2      matt  * It should be responsible for setting up everything that must be
    255       1.2      matt  * in place when main is called.
    256       1.2      matt  * This includes
    257       1.2      matt  *   Taking a copy of the boot configuration structure.
    258       1.2      matt  *   Initialising the physical console so characters can be printed.
    259       1.2      matt  *   Setting up page tables for the kernel
    260       1.2      matt  *   Initialising interrupt controllers to a sane default state
    261       1.2      matt  */
    262       1.2      matt u_int
    263       1.2      matt initarm(void *arg)
    264       1.2      matt {
    265       1.2      matt 	u_int ret;
    266       1.2      matt 	/*
    267       1.2      matt 	 * basic AT91 initialization:
    268       1.2      matt 	 */
    269       1.2      matt 	if (at91bus_init())
    270       1.2      matt 		panic("%s: at91bus_init() failed", __FUNCTION__);
    271       1.2      matt 
    272       1.2      matt 	if (AT91_CHIP_ID() == AT91RM9200_CHIP_ID) {
    273       1.2      matt 		memcpy(&mpcsabus, at91bus_tag, sizeof(mpcsabus));
    274       1.2      matt 		mpcsabus.init = mpcsabus_init;
    275       1.2      matt 		mpcsabus.peripheral_clock = mpcsabus_peripheral_clock;
    276       1.2      matt 		mpcsabus.gpio_mask = mpcsabus_gpio_mask;
    277       1.2      matt 		old_at91bus_tag = at91bus_tag;
    278       1.2      matt 		at91bus_tag = &mpcsabus;
    279       1.2      matt 	}
    280       1.2      matt 
    281       1.2      matt  	/* Fake bootconfig structure for the benefit of pmap.c */
    282       1.2      matt  	/* XXX must make the memory description h/w independent */
    283       1.2      matt  	bootconfig.dramblocks = 1;
    284       1.2      matt  	bootconfig.dram[0].address = 0x20000000UL;
    285       1.2      matt  	bootconfig.dram[0].pages =   0x04000000UL / PAGE_SIZE;
    286       1.2      matt 	ret = at91bus_setup(&bootconfig);
    287       1.2      matt 
    288       1.2      matt 	if (AT91_CHIP_ID() != AT91RM9200_CHIP_ID)
    289       1.2      matt 		panic("%s: processor is not AT91RM9200", __FUNCTION__);
    290       1.2      matt 
    291       1.2      matt 	/* we've a specific device_register routine */
    292       1.2      matt 	evbarm_device_register = mpcsa_device_register;
    293       1.2      matt 
    294       1.2      matt 	/* We return the new stack pointer address */
    295       1.2      matt 	return ret;
    296       1.2      matt }
    297       1.2      matt 
    298       1.2      matt 
    299       1.2      matt bus_dma_tag_t
    300       1.2      matt at91_bus_dma_init(struct arm32_bus_dma_tag *dma_tag_template)
    301       1.2      matt {
    302       1.2      matt 	int i;
    303       1.2      matt 	struct arm32_bus_dma_tag *dmat;
    304       1.2      matt 
    305       1.2      matt 	for (i = 0; i < bootconfig.dramblocks; i++) {
    306       1.2      matt 		mpcsa_dma_ranges[i].dr_sysbase = bootconfig.dram[i].address;
    307       1.2      matt 		mpcsa_dma_ranges[i].dr_busbase = bootconfig.dram[i].address;
    308       1.2      matt 		mpcsa_dma_ranges[i].dr_len = bootconfig.dram[i].pages *
    309       1.2      matt 			PAGE_SIZE;
    310       1.2      matt 	}
    311       1.2      matt 
    312       1.2      matt 	dmat = dma_tag_template;
    313       1.2      matt 
    314       1.2      matt 	dmat->_ranges = mpcsa_dma_ranges;
    315       1.2      matt 	dmat->_nranges = bootconfig.dramblocks;
    316       1.2      matt 
    317       1.2      matt 	return dmat;
    318       1.2      matt }
    319       1.2      matt 
    320       1.2      matt void mpcsabus_init(struct at91bus_clocks *clocks)
    321       1.2      matt {
    322       1.2      matt 	(*old_at91bus_tag->init)(clocks);
    323       1.2      matt }
    324       1.2      matt 
    325       1.2      matt uint32_t mpcsabus_gpio_mask(int pid)
    326       1.2      matt {
    327       1.2      matt 	switch (pid) {
    328       1.2      matt 	case PID_PIOA:	return ~0x00000300U;
    329       1.2      matt 	case PID_PIOB:	return ~0x0000783FU;
    330       1.2      matt 	case PID_PIOC:	return ~0x00000000U;
    331       1.2      matt 	case PID_PIOD:	return ~0x0003F000U;
    332       1.2      matt 	default:	return ~0x00000000U;
    333       1.2      matt 	}
    334       1.2      matt }
    335       1.2      matt 
    336       1.2      matt void mpcsabus_peripheral_clock(int pid, int enable)
    337       1.2      matt {
    338       1.2      matt 	switch (pid) {
    339       1.2      matt 	case PID_TWI:
    340       1.2      matt 		if (enable) {
    341       1.2      matt 			PIOA_WRITE(PIO_ASR, 0x06000000);	// assign to peripheral A
    342       1.2      matt 			PIOA_WRITE(PIO_PDR, 0x06000000);	// assign to peripherals
    343       1.2      matt 			PIOA_WRITE(PIO_MDER, 0x06000000);	// I2C pins in open-drain mode
    344       1.2      matt 		}
    345       1.2      matt 		break;
    346       1.2      matt 
    347       1.2      matt 	case PID_SPI:
    348       1.2      matt 		if (enable) {
    349       1.2      matt 			PIOA_WRITE(PIO_ASR, 0x00000007);	// assign to peripheral A
    350       1.2      matt 			PIOA_WRITE(PIO_PDR, 0x00000007);	// assign to peripherals
    351       1.2      matt 		}
    352       1.2      matt 		break;
    353       1.2      matt 	}
    354       1.2      matt 	(*old_at91bus_tag->peripheral_clock)(pid, enable);
    355       1.2      matt }
    356       1.2      matt 
    357       1.2      matt 
    358       1.2      matt static void mpcsa_device_register(device_t dev, void *aux)
    359       1.2      matt {
    360       1.2      matt 	static uint8_t eth_addr[ETHER_ADDR_LEN];
    361       1.2      matt 
    362       1.2      matt 	if (device_is_a(dev, "at91emac")) {
    363       1.2      matt 		cfdriver_t cd = config_cfdriver_lookup("at91twi");
    364       1.2      matt 		device_t twi_dev = 0;
    365       1.2      matt 		i2c_tag_t i2c = 0;
    366       1.2      matt 		if (cd && (twi_dev = device_lookup(cd, 0)) != NULL) {
    367       1.8       chs 			struct at91twi_softc *sc = device_private(twi_dev);
    368       1.2      matt 			i2c = &sc->sc_i2c;
    369       1.2      matt 		}
    370       1.2      matt 		if (i2c && seeprom_bootstrap_read(i2c, 0x50, 0x00, 4096,
    371       1.2      matt 					   eth_addr, ETHER_ADDR_LEN) == 0) {
    372       1.2      matt 			prop_data_t pd = prop_data_create_data_nocopy(
    373       1.2      matt 				eth_addr, ETHER_ADDR_LEN);
    374       1.2      matt 			KASSERT(pd != NULL);
    375       1.2      matt 			if (prop_dictionary_set(device_properties(dev),
    376       1.4    martin 						"mac-address", pd) == FALSE) {
    377       1.2      matt 				printf("WARNING: unable to set mac-addr property "
    378       1.8       chs 				       "for %s\n", device_xname(dev));
    379       1.2      matt 			}
    380       1.2      matt 		} else {
    381       1.2      matt 			printf("%s: WARNING: unable to read MAC address from SEEPROM\n",
    382       1.8       chs 			       device_xname(dev));
    383       1.2      matt 		}
    384       1.2      matt 	}
    385       1.2      matt }
    386