| // 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 |
| } |