blob: d912e8e1b0984a714a873abcb1f2adfd7f8b42c4 [file]
/*
* Kendryte K230 DDR controller and PHY models
*
* Device state and type declarations for the K230 DDRC CFG and K230 DDR PHY
* registers.
*
* Copyright (c) 2026 Junze Cao <caojunze424@gmail.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#ifndef HW_MISC_K230_DDR_H
#define HW_MISC_K230_DDR_H
#include "hw/core/sysbus.h"
#define K230_DDRC_MMIO_SIZE 0x02000000
#define K230_DDR_PHY_MMIO_SIZE 0x00400000
#define K230_DDRC_REG_SIZE 0x328
#define K230_DDRC_REG_COUNT (K230_DDRC_REG_SIZE / sizeof(uint32_t))
#define K230_DDR_PHY_ANIB_COUNT 10
#define K230_DDR_PHY_DBYTE_COUNT 4
#define K230_DDR_PHY_NIBBLES_PER_DBYTE 2
#define TYPE_K230_DDR_CFG "riscv.k230.ddr-cfg"
OBJECT_DECLARE_SIMPLE_TYPE(K230DDRCfgState, K230_DDR_CFG)
#define TYPE_K230_DDR_PHY "riscv.k230.ddr-phy"
OBJECT_DECLARE_SIMPLE_TYPE(K230DDRPhyState, K230_DDR_PHY)
struct K230DDRCfgState {
SysBusDevice parent_obj;
MemoryRegion mmio;
K230DDRPhyState *phy;
uint32_t regs[K230_DDRC_REG_COUNT];
bool initialized;
};
struct K230DDRPhyState {
SysBusDevice parent_obj;
MemoryRegion mmio;
uint16_t atx_impedance[K230_DDR_PHY_ANIB_COUNT];
uint16_t tx_impedance_ctrl1[K230_DDR_PHY_DBYTE_COUNT]
[K230_DDR_PHY_NIBBLES_PER_DBYTE];
uint16_t tx_odt_drv_stren[K230_DDR_PHY_DBYTE_COUNT]
[K230_DDR_PHY_NIBBLES_PER_DBYTE];
uint16_t dfi_init_complete;
uint16_t vref_in_global;
uint16_t micro_cont_mux_sel;
bool training_trigger_seen;
bool training_complete;
bool mailbox_message_pending;
};
#endif