summaryrefslogtreecommitdiff
path: root/platform/wavelet3d/host_sw/gfx_boot.c
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-05-23 20:24:51 -0600
committerAlejandro Soto <alejandro@34project.org>2024-05-24 05:58:44 -0600
commitc2d178577ae7d9272d7aff35895a36aefe626eca (patch)
tree1c8ef89df743f01db9e108dc10f559bae5a10ce6 /platform/wavelet3d/host_sw/gfx_boot.c
parenta148430ae145d99ba50a87b6147fa0e6e81cb258 (diff)
platform/wavelet3d/host_sw: implement firmware loading
Diffstat (limited to 'platform/wavelet3d/host_sw/gfx_boot.c')
-rw-r--r--platform/wavelet3d/host_sw/gfx_boot.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/platform/wavelet3d/host_sw/gfx_boot.c b/platform/wavelet3d/host_sw/gfx_boot.c
new file mode 100644
index 0000000..eadca68
--- /dev/null
+++ b/platform/wavelet3d/host_sw/gfx_boot.c
@@ -0,0 +1,65 @@
+#define MOD_NAME "gfx"
+
+#include <stdio.h>
+
+#include "gfx.h"
+#include "gfx_regmap.h"
+#include "log.h"
+#include "sgdma.h"
+
+enum gfx_probe_result gfx_probe(void)
+{
+ log("probing 0x%08x", GFX_CTRL_BASE);
+
+ unsigned magic = GFX_CTRL_MAGIC;
+ log("magic=0x%08x", magic);
+
+ if (magic != GFX_MAGIC_ID) {
+ log("bad magic");
+ return GFX_PROBE_FAILED;
+ }
+
+ log("magic ok");
+
+ struct gfx_hw_id hw_id = GFX_CTRL_HW_ID;
+ struct gfx_fw_id fw_id = GFX_CTRL_FW_ID;
+ unsigned hostif_rev = GFX_CTRL_HOSTIF_REV;
+
+ log
+ (
+ "3D graphics accelerator IP core v%u.%u.%u",
+ hw_id.major, hw_id.minor, hw_id.patch
+ );
+
+ log
+ (
+ "%s rev %u.%u.%02u #%02u",
+ hostif_rev ? "firmware" : "bootloader",
+ fw_id.year, fw_id.month, fw_id.day, fw_id.build
+ );
+
+ switch (hostif_rev) {
+ case 0:
+ log("scheduler is in bootloader rom");
+ return GFX_PROBE_BOOTROM;
+
+ case 1:
+ log("found regmap revision %u", hostif_rev);
+ return GFX_PROBE_FIRMWARE;
+
+ default:
+ log("unknown regmap revision %u", hostif_rev);
+ return GFX_PROBE_FAILED;
+ }
+}
+
+int gfx_fw_load(const void *image, size_t image_len)
+{
+ log("uploading fw image (len=%zu)", image_len);
+
+ sgdma_memcpy(GFX_VRAM_BASE, image, image_len);
+ sgdma_barrier();
+
+ *(void *volatile *)&GFX_CTRL_FW_ID = GFX_VRAM_BASE;
+ return 0;
+}