mirror of
https://github.com/antonblanchard/microwatt.git
synced 2026-04-20 00:43:24 +00:00
This comes in two parts: - A generator script which uses LiteX to generate litedram cores along with their init files for various boards (currently Arty and Nexys-video). This comes with configs for arty and nexys_video. - A fusesoc "generator" which uses pre-generated litedram cores The generation process is manual on purpose. This include pre-generated cores for the two above boards. This is done so that one doesn't have to install LiteX to build microwatt. In addition, the generator script or wrapper vhdl tend to break when LiteX changes significantly which happens. This is still rather standalone and hasn't been plumbed into the SoC or the FPGA toplevel files yet. At this point LiteDRAM self-initializes using a built-in VexRiscv "Minimum" core obtained from LiteX and included in this commit. There is some plumbing to generate and cores that are initialized by Microwatt directly but this isn't working yet and so isn't enabled yet. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
103 lines
2.3 KiB
ArmAsm
103 lines
2.3 KiB
ArmAsm
/* Copyright 2013-2014 IBM Corp.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
* implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#define STACK_TOP 0xffff4000
|
|
|
|
#define FIXUP_ENDIAN \
|
|
tdi 0,0,0x48; /* Reverse endian of b . + 8 */ \
|
|
b 191f; /* Skip trampoline if endian is good */ \
|
|
.long 0xa600607d; /* mfmsr r11 */ \
|
|
.long 0x01006b69; /* xori r11,r11,1 */ \
|
|
.long 0x05009f42; /* bcl 20,31,$+4 */ \
|
|
.long 0xa602487d; /* mflr r10 */ \
|
|
.long 0x14004a39; /* addi r10,r10,20 */ \
|
|
.long 0xa64b5a7d; /* mthsrr0 r10 */ \
|
|
.long 0xa64b7b7d; /* mthsrr1 r11 */ \
|
|
.long 0x2402004c; /* hrfid */ \
|
|
191:
|
|
|
|
|
|
/* Load an immediate 64-bit value into a register */
|
|
#define LOAD_IMM64(r, e) \
|
|
lis r,(e)@highest; \
|
|
ori r,r,(e)@higher; \
|
|
rldicr r,r, 32, 31; \
|
|
oris r,r, (e)@h; \
|
|
ori r,r, (e)@l;
|
|
|
|
.section ".head","ax"
|
|
|
|
. = 0
|
|
.global start
|
|
start:
|
|
FIXUP_ENDIAN
|
|
|
|
/* setup stack */
|
|
LOAD_IMM64(%r1, STACK_TOP - 0x100)
|
|
LOAD_IMM64(%r12, main)
|
|
mtctr %r12,
|
|
bctrl
|
|
ba 0
|
|
|
|
/* XXX: litedram init should not take exceptions, maybe we could get
|
|
* rid of these to save space, along with a core tweak to suppress
|
|
* exceptions in case they happen (just terminate ?)
|
|
*/
|
|
|
|
#define EXCEPTION(nr) \
|
|
.= nr; \
|
|
b .
|
|
|
|
/* More exception stubs */
|
|
EXCEPTION(0x100)
|
|
EXCEPTION(0x200)
|
|
EXCEPTION(0x300)
|
|
EXCEPTION(0x380)
|
|
EXCEPTION(0x400)
|
|
EXCEPTION(0x480)
|
|
EXCEPTION(0x500)
|
|
EXCEPTION(0x600)
|
|
EXCEPTION(0x700)
|
|
EXCEPTION(0x800)
|
|
EXCEPTION(0x900)
|
|
EXCEPTION(0x980)
|
|
EXCEPTION(0xa00)
|
|
EXCEPTION(0xb00)
|
|
EXCEPTION(0xc00)
|
|
EXCEPTION(0xd00)
|
|
EXCEPTION(0xe00)
|
|
EXCEPTION(0xe20)
|
|
EXCEPTION(0xe40)
|
|
EXCEPTION(0xe60)
|
|
EXCEPTION(0xe80)
|
|
EXCEPTION(0xf00)
|
|
EXCEPTION(0xf20)
|
|
EXCEPTION(0xf40)
|
|
EXCEPTION(0xf60)
|
|
EXCEPTION(0xf80)
|
|
#if 0
|
|
EXCEPTION(0x1000)
|
|
EXCEPTION(0x1100)
|
|
EXCEPTION(0x1200)
|
|
EXCEPTION(0x1300)
|
|
EXCEPTION(0x1400)
|
|
EXCEPTION(0x1500)
|
|
EXCEPTION(0x1600)
|
|
#endif
|
|
|
|
.text
|
|
|