summaryrefslogtreecommitdiff
path: root/rtl/gfx/firmware/bootrom.S
blob: 9079e31ea9db026244f0e026f62811d3eed5136a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "custom_ops.S"

.text

.global _start
_start:

	li   a0, 0x00300000       # HOST_CTRL_BASE
	li   a1, 1 << 1 | 1 << 0  # ARINT | AWINT
	li   a2, 1 << 0           # B.VALID = 1
	li   a3, 0x8              # Firmware handover word
	la   a4, .read_data
	li   a5, 1 << 11 | 1 << 9 # CTRL.WVALID | CTRL.AWVALID
	li   a6, 1 << 12          # CTRL.BDONE, doesn't fit in andi

	sw   a1, 0(a0)

.wait_axi:
	picorv32_waitirq_insn(zero)

	lw   t0, 0(a0)
	andi t1, t0, 1 << 8 # ARVALID
	bne  t1, zero, .read
	and  t0, t0, a5
	beq  t0, a5, .write
	j    .wait_axi

.read:
	lw   t0, 4(a0)
	andi t1, t0, 1 << 0 # AW.VALID
	beq  t1, zero, .wait_axi
	andi t0, t0, 0b11 << 2
	add  t0, a4, t0
	lw   t0, 0(t0)
	sw   t0, 12(a0) # R.DATA

.read_done:
	lw   t0, 0(a0)
	andi t0, t0, 1 << 10 # CTRL.RDONE
	beq  t0, zero, .read_done
	j    .wait_axi

.write:
	lw   t0, 8(a0)
	andi t1, t0, 1 << 0 # AW.VALID
	beq  t1, zero, .wait_axi
	lw   t1, 16(a0)
	sw   a2, 20(a0)

.write_done:
	lw   t2, 0(a0)
	and  t2, t2, a6
	beq  t2, zero, .write_done

	andi t0, t0, 0b111100 # Entendemos words 0-15
	bne  t0, a3, .wait_axi
	sw   zero, 0(a0)
	# Pass magic & hardware version
	lw   a0, 0(a4)
	lw   a1, 4(a4)
	jalr t1
	j    .

.balign 4

.read_data:
	# Magic
	.word 0x4a7a7b0c
	# Hardware major.minor.patch
	.word 1 << 16 | 0 << 8 | 0 << 0
	# Firmware yyyy.mm.dd.build
	.word 2024 << 19 | 5 << 15 | 12 << 10 | 1 << 0
	# Register map version, rev 0 means this is the bootrom firmware
	.word 0

.balign 4