blob: c693923ed6447525fa8e37a870574a5ac8ced6cc [file] [log] [blame]
// Copyright 2024 Google LLC
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
#include "hw/ip/ml_top/data/ml_top_regs.h" // Generated.
#include "hw/top_matcha/sw/autogen/top_matcha.h"
#include "sw/device/lib/dif/dif_ml_top.h"
#include "sw/device/lib/testing/test_framework/check.h"
void fix_kelvin(void) {
#if defined(MATCHA_SPARROW)
dif_ml_top_t ml_top;
mmio_region_t ml_dmem =
mmio_region_from_addr(TOP_MATCHA_ML_TOP_DMEM_BASE_ADDR);
int i = 0;
for (; i < 8; ++i) {
mmio_region_write32(ml_dmem, i * sizeof(uint32_t),
0x4000201fU); // vdup.v.x
}
for (; i < 16; ++i) {
mmio_region_write32(ml_dmem, i * sizeof(uint32_t),
0x42f02c05U); // aconv.vxv
}
for (; i < 24; ++i) {
mmio_region_write32(ml_dmem, i * sizeof(uint32_t), 0x50002c1fU); // vcget
}
for (; i < 32; ++i) {
mmio_region_write32(ml_dmem, i * sizeof(uint32_t), 0x00002000U); // vadd
}
for (; i < 40; ++i) {
mmio_region_write32(ml_dmem, i * sizeof(uint32_t), 0x48000c06U); // adwinit
}
for (; i < 48; ++i) {
mmio_region_write32(ml_dmem, i * sizeof(uint32_t), 0x00002083U); // lw
}
mmio_region_write32(ml_dmem, i * sizeof(uint32_t), 0x08000073U); // mpause
uint32_t ml_result;
do {
CHECK_DIF_OK(dif_ml_top_init(
mmio_region_from_addr(TOP_MATCHA_ML_TOP_CORE_BASE_ADDR), &ml_top));
dif_ml_top_reset_ctrl_en(&ml_top);
mmio_region_t base_addr =
mmio_region_from_addr(TOP_MATCHA_ML_TOP_CORE_BASE_ADDR);
mmio_region_write32(base_addr, ML_TOP_CTRL_REG_OFFSET, 0x0);
while ((ml_result =
mmio_region_read32(base_addr, ML_TOP_INTR_STATE_REG_OFFSET)) ==
ML_TOP_INTR_STATE_REG_RESVAL) {
}
mmio_region_write32(base_addr, ML_TOP_CTRL_REG_OFFSET,
ML_TOP_CTRL_REG_RESVAL);
mmio_region_write32(base_addr, ML_TOP_INTR_STATE_REG_OFFSET, ml_result);
} while (ml_result == ((1 << ML_TOP_INTR_ENABLE_FINISH_BIT) |
(1 << ML_TOP_INTR_ENABLE_FAULT_BIT)));
#endif // MATCHA_SPARROW
}