Software APIs
device_sim_qemu.c
Go to the documentation of this file.
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
5 #include <stdbool.h>
6 
7 #include "dt/dt_rv_core_ibex.h" // Generated
10 #include "sw/device/silicon_creator/lib/drivers/ibex.h"
11 #include "sw/device/silicon_creator/lib/drivers/uart.h"
12 
13 #include "rv_core_ibex_regs.h" // Generated
14 #include "uart_regs.h" // Generated
15 
16 // Use the first dt_rv_core_ibex_t enum, i.e. the first Ibex core instance.
17 static const dt_rv_core_ibex_t kRvCoreIbexDt = (dt_rv_core_ibex_t)0;
18 static_assert(kDtRvCoreIbexCount == 1, "Only single core tops are supported");
19 
20 static inline uintptr_t rv_core_ibex_base(void) {
21  return (uintptr_t)dt_rv_core_ibex_primary_reg_block(kRvCoreIbexDt);
22 }
23 
24 /**
25  * @file
26  * @brief Device-specific symbol definitions for the QEMU emulation.
27  */
28 
30 
31 const uint64_t kClockFreqCpuMhz = 24;
32 
33 const uint64_t kClockFreqCpuHz = kClockFreqCpuMhz * 1000 * 1000;
34 
35 uint64_t to_cpu_cycles(uint64_t usec) { return usec * kClockFreqCpuMhz; }
36 
37 const uint64_t kClockFreqHiSpeedPeripheralHz = 24 * 1000 * 1000; // 24MHz
38 
39 const uint64_t kClockFreqPeripheralHz = 6 * 1000 * 1000; // 6MHz
40 
41 const uint64_t kClockFreqUsbHz = 48 * 1000 * 1000; // 48MHz
42 
43 const uint64_t kClockFreqAonHz = 250 * 1000; // 250kHz
44 
45 const uint64_t kUartBaudrate = 115200;
46 
47 const uint32_t kUartNCOValue =
48  CALCULATE_UART_NCO(kUartBaudrate, kClockFreqPeripheralHz);
49 
50 const uint32_t kUartBaud115K =
51  CALCULATE_UART_NCO(115200, kClockFreqPeripheralHz);
52 const uint32_t kUartBaud230K =
53  CALCULATE_UART_NCO(115200 * 2, kClockFreqPeripheralHz);
54 const uint32_t kUartBaud460K =
55  CALCULATE_UART_NCO(115200 * 4, kClockFreqPeripheralHz);
56 const uint32_t kUartBaud921K =
57  CALCULATE_UART_NCO(115200 * 8, kClockFreqPeripheralHz);
58 const uint32_t kUartBaud1M33 =
59  CALCULATE_UART_NCO(1333333, kClockFreqPeripheralHz);
60 const uint32_t kUartBaud1M50 =
61  CALCULATE_UART_NCO(1500000, kClockFreqPeripheralHz);
62 
64  kUartBaudrate, kClockFreqCpuHz, UART_PARAM_TX_FIFO_DEPTH);
65 
66 const uint32_t kAstCheckPollCpuCycles =
68 
69 uintptr_t device_test_status_address(void) {
70  return rv_core_ibex_base() + RV_CORE_IBEX_DV_SIM_WINDOW_REG_OFFSET;
71 }
72 
73 uintptr_t device_log_bypass_uart_address(void) { return 0; }
74 
75 // Although QEMU isn't an FPGA, there's no harm in us printing the version here.
77  uint32_t version = ibex_fpga_version();
78  // : M O R
79  const uint32_t kRom = 0x3a4d4f52;
80  uart_write_imm(kRom);
81  // The cast to unsigned int stops GCC from complaining about uint32_t
82  // being a `long unsigned int` while the %x specifier takes `unsigned int`.
83  const uint32_t kNewline = 0x0a0d;
84  uart_write_hex(version, sizeof(version), kNewline);
85 }