summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/host_sw/init.c
blob: 3acc8f3b50b1e420897180d0ede91c8172a2577e (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
#define MOD_NAME "init"

#include <stdlib.h>

#include "gfx.h"
#include "init.h"
#include "log.h"

extern const unsigned char _binary_gfx_fw_bin_start[];
extern const unsigned char _binary_gfx_fw_bin_end;
extern const unsigned char _binary_gfx_fw_bin_size;

static void __attribute__((noreturn)) init_gfx_failed(void)
{
	log("fatal: probe of gfx device failed");
	abort();
}

static void init_gfx(int bootrom)
{
	switch (gfx_probe()) {
		case GFX_PROBE_FAILED:
			init_gfx_failed();
			break;

		case GFX_PROBE_BOOTROM:
			if (bootrom)
				log("gfx bootloader didn't handover to firmware");

			size_t fw_size = (size_t)&_binary_gfx_fw_bin_size;
			if (bootrom || gfx_fw_load(_binary_gfx_fw_bin_start, fw_size) < 0)
				init_gfx_failed();

			init_gfx(1);
			break;

		case GFX_PROBE_FIRMWARE:
			break;
	}
}

void init(void)
{
	log("host cpu is up");
	init_gfx(0);
}