summaryrefslogtreecommitdiff
path: root/rtl/gfx/firmware/main.c
blob: f75a9cb671ec7ab874eca8c05094e599170e7da3 (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
77
78
struct hostif_ctrl
{
	unsigned arint   : 1;
	unsigned awint   : 1;
	unsigned rsvd2   : 6;
	unsigned arvalid : 1;
	unsigned awvalid : 1;
	unsigned rdone   : 1;
	unsigned wvalid  : 1;
	unsigned bdone   : 1;
	unsigned rsvd13  : 19;
};

struct hostif_ar
{
	unsigned valid : 1;
	unsigned rsvd1 : 1;
	unsigned addr  : 30;
};

struct hostif_aw
{
	unsigned valid : 1;
	unsigned rsvd1 : 1;
	unsigned addr  : 30;
};

struct hostif_r
{
	unsigned data : 32;
};

struct hostif_w
{
	unsigned data : 32;
};

struct hostif_b0
{
	unsigned valid : 1;
	unsigned rsvd1 : 31;
};

#define HOSTIF_BASE 0x00300000
#define HOSTIF_CTRL (*(volatile struct hostif_ctrl *)(HOSTIF_BASE + 0x00))
#define HOSTIF_AR   (*(volatile struct hostif_ar *)  (HOSTIF_BASE + 0x04))
#define HOSTIF_AW   (*(volatile struct hostif_aw *)  (HOSTIF_BASE + 0x08))
#define HOSTIF_R    (*(volatile struct hostif_r *)   (HOSTIF_BASE + 0x0c))
#define HOSTIF_W    (*(volatile struct hostif_w *)   (HOSTIF_BASE + 0x10))
#define HOSTIF_B    (*(volatile struct hostif_b *)   (HOSTIF_BASE + 0x14))

int main(unsigned magic, unsigned hw_rev)
{
	while (1) {
		struct hostif_ar ar;
		while (!(ar = HOSTIF_AR).valid);

		switch (ar.addr & 3) {
			case 0b00:
				HOSTIF_R.data = magic;
				break;

			case 0b01:
				HOSTIF_R.data = hw_rev;
				break;

			case 0b10:
				HOSTIF_R.data = hw_rev;
				break;

			case 0b11:
				HOSTIF_R.data = 1;
				break;
		}

		while (!HOSTIF_CTRL.rdone);
	}
}