1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 218cb3fafSGreg Ungerer/* 318cb3fafSGreg Ungerer * head.S - Common startup code for 68000 core based CPU's 418cb3fafSGreg Ungerer * 518cb3fafSGreg Ungerer * 2012.10.21, Luis Alves <ljalvs@gmail.com>, Single head.S file for all 618cb3fafSGreg Ungerer * 68000 core based CPU's. Based on the sources from: 718cb3fafSGreg Ungerer * Coldfire by Greg Ungerer <gerg@snapgear.com> 818cb3fafSGreg Ungerer * 68328 by D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>, 918cb3fafSGreg Ungerer * Kenneth Albanowski <kjahds@kjahds.com>, 1018cb3fafSGreg Ungerer * The Silver Hammer Group, Ltd. 1118cb3fafSGreg Ungerer * 1218cb3fafSGreg Ungerer */ 1318cb3fafSGreg Ungerer 1418cb3fafSGreg Ungerer#include <linux/linkage.h> 1518cb3fafSGreg Ungerer#include <linux/init.h> 1618cb3fafSGreg Ungerer#include <asm/asm-offsets.h> 1718cb3fafSGreg Ungerer#include <asm/thread_info.h> 1818cb3fafSGreg Ungerer 1918cb3fafSGreg Ungerer 2018cb3fafSGreg Ungerer/***************************************************************************** 2118cb3fafSGreg Ungerer * UCSIMM and UCDIMM use CONFIG_MEMORY_RESERVE to reserve some RAM 2218cb3fafSGreg Ungerer *****************************************************************************/ 2318cb3fafSGreg Ungerer#ifdef CONFIG_MEMORY_RESERVE 2418cb3fafSGreg Ungerer#define RAMEND (CONFIG_RAMBASE+CONFIG_RAMSIZE)-(CONFIG_MEMORY_RESERVE*0x100000) 2518cb3fafSGreg Ungerer#else 2618cb3fafSGreg Ungerer#define RAMEND (CONFIG_RAMBASE+CONFIG_RAMSIZE) 2718cb3fafSGreg Ungerer#endif 2818cb3fafSGreg Ungerer/*****************************************************************************/ 2918cb3fafSGreg Ungerer 3018cb3fafSGreg Ungerer.global _start 3118cb3fafSGreg Ungerer.global _rambase 3218cb3fafSGreg Ungerer.global _ramvec 3318cb3fafSGreg Ungerer.global _ramstart 3418cb3fafSGreg Ungerer.global _ramend 3518cb3fafSGreg Ungerer 3618cb3fafSGreg Ungerer#if defined(CONFIG_PILOT) || defined(CONFIG_INIT_LCD) 3718cb3fafSGreg Ungerer.global bootlogo_bits 3818cb3fafSGreg Ungerer#endif 3918cb3fafSGreg Ungerer 4018cb3fafSGreg Ungerer/* Defining DEBUG_HEAD_CODE, serial port in 68x328 is inited */ 4118cb3fafSGreg Ungerer/* #define DEBUG_HEAD_CODE */ 4218cb3fafSGreg Ungerer#undef DEBUG_HEAD_CODE 4318cb3fafSGreg Ungerer 4418cb3fafSGreg Ungerer.data 4518cb3fafSGreg Ungerer 4618cb3fafSGreg Ungerer/***************************************************************************** 4718cb3fafSGreg Ungerer * RAM setup pointers. Used by the kernel to determine RAM location and size. 4818cb3fafSGreg Ungerer *****************************************************************************/ 4918cb3fafSGreg Ungerer 5018cb3fafSGreg Ungerer_rambase: 5118cb3fafSGreg Ungerer .long 0 5218cb3fafSGreg Ungerer_ramvec: 5318cb3fafSGreg Ungerer .long 0 5418cb3fafSGreg Ungerer_ramstart: 5518cb3fafSGreg Ungerer .long 0 5618cb3fafSGreg Ungerer_ramend: 5718cb3fafSGreg Ungerer .long 0 5818cb3fafSGreg Ungerer 5918cb3fafSGreg Ungerer__HEAD 6018cb3fafSGreg Ungerer 6118cb3fafSGreg Ungerer/***************************************************************************** 6218cb3fafSGreg Ungerer * Entry point, where all begins! 6318cb3fafSGreg Ungerer *****************************************************************************/ 6418cb3fafSGreg Ungerer 6518cb3fafSGreg Ungerer_start: 6618cb3fafSGreg Ungerer 6718cb3fafSGreg Ungerer/* Pilot need this specific signature at the start of ROM */ 6818cb3fafSGreg Ungerer#ifdef CONFIG_PILOT 6918cb3fafSGreg Ungerer .byte 0x4e, 0xfa, 0x00, 0x0a /* bra opcode (jmp 10 bytes) */ 7018cb3fafSGreg Ungerer .byte 'b', 'o', 'o', 't' 7118cb3fafSGreg Ungerer .word 10000 7218cb3fafSGreg Ungerer nop 7318cb3fafSGreg Ungerer moveq #0, %d0 7418cb3fafSGreg Ungerer movew %d0, 0xfffff618 /* Watchdog off */ 7518cb3fafSGreg Ungerer movel #0x00011f07, 0xfffff114 /* CS A1 Mask */ 7618cb3fafSGreg Ungerer#endif /* CONFIG_PILOT */ 7718cb3fafSGreg Ungerer 7818cb3fafSGreg Ungerer movew #0x2700, %sr /* disable all interrupts */ 7918cb3fafSGreg Ungerer 8018cb3fafSGreg Ungerer/***************************************************************************** 8118cb3fafSGreg Ungerer * Setup PLL and wait for it to settle (in 68x328 cpu's). 8218cb3fafSGreg Ungerer * Also, if enabled, init serial port. 8318cb3fafSGreg Ungerer *****************************************************************************/ 8418cb3fafSGreg Ungerer#if defined(CONFIG_M68328) || \ 8518cb3fafSGreg Ungerer defined(CONFIG_M68EZ328) || \ 8618cb3fafSGreg Ungerer defined(CONFIG_M68VZ328) 8718cb3fafSGreg Ungerer 8818cb3fafSGreg Ungerer/* Serial port setup. Should only be needed if debugging this startup code. */ 8918cb3fafSGreg Ungerer#ifdef DEBUG_HEAD_CODE 9018cb3fafSGreg Ungerer movew #0x0800, 0xfffff906 /* Ignore CTS */ 9118cb3fafSGreg Ungerer movew #0x010b, 0xfffff902 /* BAUD to 9600 */ 9218cb3fafSGreg Ungerer movew #0xe100, 0xfffff900 /* enable */ 9318cb3fafSGreg Ungerer#endif /* DEBUG_HEAD */ 9418cb3fafSGreg Ungerer 9518cb3fafSGreg Ungerer#ifdef CONFIG_PILOT 9618cb3fafSGreg Ungerer movew #0x2410, 0xfffff200 /* PLLCR */ 9718cb3fafSGreg Ungerer#else 9818cb3fafSGreg Ungerer movew #0x2400, 0xfffff200 /* PLLCR */ 9918cb3fafSGreg Ungerer#endif 10018cb3fafSGreg Ungerer movew #0x0123, 0xfffff202 /* PLLFSR */ 10118cb3fafSGreg Ungerer moveq #0, %d0 10218cb3fafSGreg Ungerer movew #16384, %d0 /* PLL settle wait loop */ 10318cb3fafSGreg Ungerer_pll_settle: 10418cb3fafSGreg Ungerer subw #1, %d0 10518cb3fafSGreg Ungerer bne _pll_settle 10618cb3fafSGreg Ungerer#endif /* CONFIG_M68x328 */ 10718cb3fafSGreg Ungerer 10818cb3fafSGreg Ungerer 10918cb3fafSGreg Ungerer/***************************************************************************** 11018cb3fafSGreg Ungerer * If running kernel from ROM some specific initialization has to be done. 11118cb3fafSGreg Ungerer * (Assuming that everything is already init'ed when running from RAM) 11218cb3fafSGreg Ungerer *****************************************************************************/ 11318cb3fafSGreg Ungerer#ifdef CONFIG_ROMKERNEL 11418cb3fafSGreg Ungerer 11518cb3fafSGreg Ungerer/***************************************************************************** 11618cb3fafSGreg Ungerer * Init chip registers (uCsimm specific) 11718cb3fafSGreg Ungerer *****************************************************************************/ 11818cb3fafSGreg Ungerer#ifdef CONFIG_UCSIMM 11918cb3fafSGreg Ungerer moveb #0x00, 0xfffffb0b /* Watchdog off */ 12018cb3fafSGreg Ungerer moveb #0x10, 0xfffff000 /* SCR */ 12118cb3fafSGreg Ungerer moveb #0x00, 0xfffff40b /* enable chip select */ 12218cb3fafSGreg Ungerer moveb #0x00, 0xfffff423 /* enable /DWE */ 12318cb3fafSGreg Ungerer moveb #0x08, 0xfffffd0d /* disable hardmap */ 12418cb3fafSGreg Ungerer moveb #0x07, 0xfffffd0e /* level 7 interrupt clear */ 12518cb3fafSGreg Ungerer movew #0x8600, 0xfffff100 /* FLASH at 0x10c00000 */ 12618cb3fafSGreg Ungerer movew #0x018b, 0xfffff110 /* 2Meg, enable, 0ws */ 12718cb3fafSGreg Ungerer movew #0x8f00, 0xfffffc00 /* DRAM configuration */ 12818cb3fafSGreg Ungerer movew #0x9667, 0xfffffc02 /* DRAM control */ 12918cb3fafSGreg Ungerer movew #0x0000, 0xfffff106 /* DRAM at 0x00000000 */ 13018cb3fafSGreg Ungerer movew #0x068f, 0xfffff116 /* 8Meg, enable, 0ws */ 13118cb3fafSGreg Ungerer moveb #0x40, 0xfffff300 /* IVR */ 13218cb3fafSGreg Ungerer movel #0x007FFFFF, %d0 /* IMR */ 13318cb3fafSGreg Ungerer movel %d0, 0xfffff304 13418cb3fafSGreg Ungerer moveb 0xfffff42b, %d0 13518cb3fafSGreg Ungerer andb #0xe0, %d0 13618cb3fafSGreg Ungerer moveb %d0, 0xfffff42b 13718cb3fafSGreg Ungerer#endif 13818cb3fafSGreg Ungerer 13918cb3fafSGreg Ungerer/***************************************************************************** 14018cb3fafSGreg Ungerer * Init LCD controller. 14118cb3fafSGreg Ungerer * (Assuming that LCD controller is already init'ed when running from RAM) 14218cb3fafSGreg Ungerer *****************************************************************************/ 14318cb3fafSGreg Ungerer#ifdef CONFIG_INIT_LCD 14418cb3fafSGreg Ungerer#ifdef CONFIG_PILOT 14518cb3fafSGreg Ungerer moveb #0, 0xfffffA27 /* LCKCON */ 14618cb3fafSGreg Ungerer movel #_start, 0xfffffA00 /* LSSA */ 14718cb3fafSGreg Ungerer moveb #0xa, 0xfffffA05 /* LVPW */ 14818cb3fafSGreg Ungerer movew #0x9f, 0xFFFFFa08 /* LXMAX */ 14918cb3fafSGreg Ungerer movew #0x9f, 0xFFFFFa0a /* LYMAX */ 15018cb3fafSGreg Ungerer moveb #9, 0xfffffa29 /* LBAR */ 15118cb3fafSGreg Ungerer moveb #0, 0xfffffa25 /* LPXCD */ 15218cb3fafSGreg Ungerer moveb #0x04, 0xFFFFFa20 /* LPICF */ 15318cb3fafSGreg Ungerer moveb #0x58, 0xfffffA27 /* LCKCON */ 15418cb3fafSGreg Ungerer moveb #0x85, 0xfffff429 /* PFDATA */ 15518cb3fafSGreg Ungerer moveb #0xd8, 0xfffffA27 /* LCKCON */ 15618cb3fafSGreg Ungerer moveb #0xc5, 0xfffff429 /* PFDATA */ 15718cb3fafSGreg Ungerer moveb #0xd5, 0xfffff429 /* PFDATA */ 15818cb3fafSGreg Ungerer movel #bootlogo_bits, 0xFFFFFA00 /* LSSA */ 15918cb3fafSGreg Ungerer moveb #10, 0xFFFFFA05 /* LVPW */ 16018cb3fafSGreg Ungerer movew #160, 0xFFFFFA08 /* LXMAX */ 16118cb3fafSGreg Ungerer movew #160, 0xFFFFFA0A /* LYMAX */ 16218cb3fafSGreg Ungerer#else /* CONFIG_PILOT */ 16318cb3fafSGreg Ungerer movel #bootlogo_bits, 0xfffffA00 /* LSSA */ 16418cb3fafSGreg Ungerer moveb #0x28, 0xfffffA05 /* LVPW */ 16518cb3fafSGreg Ungerer movew #0x280, 0xFFFFFa08 /* LXMAX */ 16618cb3fafSGreg Ungerer movew #0x1df, 0xFFFFFa0a /* LYMAX */ 16718cb3fafSGreg Ungerer moveb #0, 0xfffffa29 /* LBAR */ 16818cb3fafSGreg Ungerer moveb #0, 0xfffffa25 /* LPXCD */ 16918cb3fafSGreg Ungerer moveb #0x08, 0xFFFFFa20 /* LPICF */ 17018cb3fafSGreg Ungerer moveb #0x01, 0xFFFFFA21 /* -ve pol */ 17118cb3fafSGreg Ungerer moveb #0x81, 0xfffffA27 /* LCKCON */ 17218cb3fafSGreg Ungerer movew #0xff00, 0xfffff412 /* LCD pins */ 17318cb3fafSGreg Ungerer#endif /* CONFIG_PILOT */ 17418cb3fafSGreg Ungerer#endif /* CONFIG_INIT_LCD */ 17518cb3fafSGreg Ungerer 17618cb3fafSGreg Ungerer/***************************************************************************** 17718cb3fafSGreg Ungerer * Kernel is running from FLASH/ROM (XIP) 17818cb3fafSGreg Ungerer * Copy init text & data to RAM 17918cb3fafSGreg Ungerer *****************************************************************************/ 18018cb3fafSGreg Ungerer moveal #_etext, %a0 18118cb3fafSGreg Ungerer moveal #_sdata, %a1 18218cb3fafSGreg Ungerer moveal #__bss_start, %a2 18318cb3fafSGreg Ungerer_copy_initmem: 18418cb3fafSGreg Ungerer movel %a0@+, %a1@+ 18518cb3fafSGreg Ungerer cmpal %a1, %a2 18618cb3fafSGreg Ungerer bhi _copy_initmem 18718cb3fafSGreg Ungerer#endif /* CONFIG_ROMKERNEL */ 18818cb3fafSGreg Ungerer 18918cb3fafSGreg Ungerer/***************************************************************************** 19018cb3fafSGreg Ungerer * Setup basic memory information for kernel 19118cb3fafSGreg Ungerer *****************************************************************************/ 19218cb3fafSGreg Ungerer movel #CONFIG_VECTORBASE,_ramvec /* set vector base location */ 19318cb3fafSGreg Ungerer movel #CONFIG_RAMBASE,_rambase /* set the base of RAM */ 19418cb3fafSGreg Ungerer movel #RAMEND, _ramend /* set end ram addr */ 19518cb3fafSGreg Ungerer lea __bss_stop,%a1 19618cb3fafSGreg Ungerer movel %a1,_ramstart 19718cb3fafSGreg Ungerer 19818cb3fafSGreg Ungerer/***************************************************************************** 19918cb3fafSGreg Ungerer * If the kernel is in RAM, move romfs to right above bss and 20018cb3fafSGreg Ungerer * adjust _ramstart to where romfs ends. 20118cb3fafSGreg Ungerer * 20218cb3fafSGreg Ungerer * (Do this only if CONFIG_MTD_UCLINUX is true) 20318cb3fafSGreg Ungerer *****************************************************************************/ 20418cb3fafSGreg Ungerer 20518cb3fafSGreg Ungerer#if defined(CONFIG_ROMFS_FS) && defined(CONFIG_RAMKERNEL) && \ 20618cb3fafSGreg Ungerer defined(CONFIG_MTD_UCLINUX) 20718cb3fafSGreg Ungerer lea __bss_start, %a0 /* get start of bss */ 20818cb3fafSGreg Ungerer lea __bss_stop, %a1 /* set up destination */ 20918cb3fafSGreg Ungerer movel %a0, %a2 /* copy of bss start */ 21018cb3fafSGreg Ungerer 21118cb3fafSGreg Ungerer movel 8(%a0), %d0 /* get size of ROMFS */ 21218cb3fafSGreg Ungerer addql #8, %d0 /* allow for rounding */ 21318cb3fafSGreg Ungerer andl #0xfffffffc, %d0 /* whole words */ 21418cb3fafSGreg Ungerer 21518cb3fafSGreg Ungerer addl %d0, %a0 /* copy from end */ 21618cb3fafSGreg Ungerer addl %d0, %a1 /* copy from end */ 21718cb3fafSGreg Ungerer movel %a1, _ramstart /* set start of ram */ 21818cb3fafSGreg Ungerer_copy_romfs: 21918cb3fafSGreg Ungerer movel -(%a0), -(%a1) /* copy dword */ 22018cb3fafSGreg Ungerer cmpl %a0, %a2 /* check if at end */ 22118cb3fafSGreg Ungerer bne _copy_romfs 22218cb3fafSGreg Ungerer#endif /* CONFIG_ROMFS_FS && CONFIG_RAMKERNEL && CONFIG_MTD_UCLINUX */ 22318cb3fafSGreg Ungerer 22418cb3fafSGreg Ungerer/***************************************************************************** 22518cb3fafSGreg Ungerer * Clear bss region 22618cb3fafSGreg Ungerer *****************************************************************************/ 22718cb3fafSGreg Ungerer lea __bss_start, %a0 /* get start of bss */ 22818cb3fafSGreg Ungerer lea __bss_stop, %a1 /* get end of bss */ 22918cb3fafSGreg Ungerer_clear_bss: 23018cb3fafSGreg Ungerer movel #0, (%a0)+ /* clear each word */ 23118cb3fafSGreg Ungerer cmpl %a0, %a1 /* check if at end */ 23218cb3fafSGreg Ungerer bne _clear_bss 23318cb3fafSGreg Ungerer 23418cb3fafSGreg Ungerer/***************************************************************************** 23518cb3fafSGreg Ungerer * Load the current task pointer and stack. 23618cb3fafSGreg Ungerer *****************************************************************************/ 23718cb3fafSGreg Ungerer lea init_thread_union,%a0 23818cb3fafSGreg Ungerer lea THREAD_SIZE(%a0),%sp 23918cb3fafSGreg Ungerer jsr start_kernel /* start Linux kernel */ 24018cb3fafSGreg Ungerer_exit: 24118cb3fafSGreg Ungerer jmp _exit /* should never get here */ 242