| // Copyright 2024 Google LLC | |
| // Licensed under the Apache License, Version 2.0, see LICENSE for details. | |
| // SPDX-License-Identifier: Apache-2.0 | |
| #include "hw/top_matcha/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 | |
| } |