1*4a52ef61Sqianfan Zhao /* 2*4a52ef61Sqianfan Zhao * Allwinner R40 SDRAM Controller emulation 3*4a52ef61Sqianfan Zhao * 4*4a52ef61Sqianfan Zhao * Copyright (C) 2023 qianfan Zhao <qianfanguijin@163.com> 5*4a52ef61Sqianfan Zhao * 6*4a52ef61Sqianfan Zhao * This program is free software: you can redistribute it and/or modify 7*4a52ef61Sqianfan Zhao * it under the terms of the GNU General Public License as published by 8*4a52ef61Sqianfan Zhao * the Free Software Foundation, either version 2 of the License, or 9*4a52ef61Sqianfan Zhao * (at your option) any later version. 10*4a52ef61Sqianfan Zhao * 11*4a52ef61Sqianfan Zhao * This program is distributed in the hope that it will be useful, 12*4a52ef61Sqianfan Zhao * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*4a52ef61Sqianfan Zhao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*4a52ef61Sqianfan Zhao * GNU General Public License for more details. 15*4a52ef61Sqianfan Zhao * 16*4a52ef61Sqianfan Zhao * You should have received a copy of the GNU General Public License 17*4a52ef61Sqianfan Zhao * along with this program. If not, see <http://www.gnu.org/licenses/>. 18*4a52ef61Sqianfan Zhao */ 19*4a52ef61Sqianfan Zhao 20*4a52ef61Sqianfan Zhao #ifndef HW_MISC_ALLWINNER_R40_DRAMC_H 21*4a52ef61Sqianfan Zhao #define HW_MISC_ALLWINNER_R40_DRAMC_H 22*4a52ef61Sqianfan Zhao 23*4a52ef61Sqianfan Zhao #include "qom/object.h" 24*4a52ef61Sqianfan Zhao #include "hw/sysbus.h" 25*4a52ef61Sqianfan Zhao #include "exec/hwaddr.h" 26*4a52ef61Sqianfan Zhao 27*4a52ef61Sqianfan Zhao /** 28*4a52ef61Sqianfan Zhao * Constants 29*4a52ef61Sqianfan Zhao * @{ 30*4a52ef61Sqianfan Zhao */ 31*4a52ef61Sqianfan Zhao 32*4a52ef61Sqianfan Zhao /** Highest register address used by DRAMCOM module */ 33*4a52ef61Sqianfan Zhao #define AW_R40_DRAMCOM_REGS_MAXADDR (0x804) 34*4a52ef61Sqianfan Zhao 35*4a52ef61Sqianfan Zhao /** Total number of known DRAMCOM registers */ 36*4a52ef61Sqianfan Zhao #define AW_R40_DRAMCOM_REGS_NUM (AW_R40_DRAMCOM_REGS_MAXADDR / \ 37*4a52ef61Sqianfan Zhao sizeof(uint32_t)) 38*4a52ef61Sqianfan Zhao 39*4a52ef61Sqianfan Zhao /** Highest register address used by DRAMCTL module */ 40*4a52ef61Sqianfan Zhao #define AW_R40_DRAMCTL_REGS_MAXADDR (0x88c) 41*4a52ef61Sqianfan Zhao 42*4a52ef61Sqianfan Zhao /** Total number of known DRAMCTL registers */ 43*4a52ef61Sqianfan Zhao #define AW_R40_DRAMCTL_REGS_NUM (AW_R40_DRAMCTL_REGS_MAXADDR / \ 44*4a52ef61Sqianfan Zhao sizeof(uint32_t)) 45*4a52ef61Sqianfan Zhao 46*4a52ef61Sqianfan Zhao /** Highest register address used by DRAMPHY module */ 47*4a52ef61Sqianfan Zhao #define AW_R40_DRAMPHY_REGS_MAXADDR (0x4) 48*4a52ef61Sqianfan Zhao 49*4a52ef61Sqianfan Zhao /** Total number of known DRAMPHY registers */ 50*4a52ef61Sqianfan Zhao #define AW_R40_DRAMPHY_REGS_NUM (AW_R40_DRAMPHY_REGS_MAXADDR / \ 51*4a52ef61Sqianfan Zhao sizeof(uint32_t)) 52*4a52ef61Sqianfan Zhao 53*4a52ef61Sqianfan Zhao /** @} */ 54*4a52ef61Sqianfan Zhao 55*4a52ef61Sqianfan Zhao /** 56*4a52ef61Sqianfan Zhao * Object model 57*4a52ef61Sqianfan Zhao * @{ 58*4a52ef61Sqianfan Zhao */ 59*4a52ef61Sqianfan Zhao 60*4a52ef61Sqianfan Zhao #define TYPE_AW_R40_DRAMC "allwinner-r40-dramc" 61*4a52ef61Sqianfan Zhao OBJECT_DECLARE_SIMPLE_TYPE(AwR40DramCtlState, AW_R40_DRAMC) 62*4a52ef61Sqianfan Zhao 63*4a52ef61Sqianfan Zhao /** @} */ 64*4a52ef61Sqianfan Zhao 65*4a52ef61Sqianfan Zhao /** 66*4a52ef61Sqianfan Zhao * Allwinner R40 SDRAM Controller object instance state. 67*4a52ef61Sqianfan Zhao */ 68*4a52ef61Sqianfan Zhao struct AwR40DramCtlState { 69*4a52ef61Sqianfan Zhao /*< private >*/ 70*4a52ef61Sqianfan Zhao SysBusDevice parent_obj; 71*4a52ef61Sqianfan Zhao /*< public >*/ 72*4a52ef61Sqianfan Zhao 73*4a52ef61Sqianfan Zhao /** Physical base address for start of RAM */ 74*4a52ef61Sqianfan Zhao hwaddr ram_addr; 75*4a52ef61Sqianfan Zhao 76*4a52ef61Sqianfan Zhao /** Total RAM size in megabytes */ 77*4a52ef61Sqianfan Zhao uint32_t ram_size; 78*4a52ef61Sqianfan Zhao 79*4a52ef61Sqianfan Zhao uint8_t set_row_bits; 80*4a52ef61Sqianfan Zhao uint8_t set_bank_bits; 81*4a52ef61Sqianfan Zhao uint8_t set_col_bits; 82*4a52ef61Sqianfan Zhao 83*4a52ef61Sqianfan Zhao /** 84*4a52ef61Sqianfan Zhao * @name Memory Regions 85*4a52ef61Sqianfan Zhao * @{ 86*4a52ef61Sqianfan Zhao */ 87*4a52ef61Sqianfan Zhao MemoryRegion dramcom_iomem; /**< DRAMCOM module I/O registers */ 88*4a52ef61Sqianfan Zhao MemoryRegion dramctl_iomem; /**< DRAMCTL module I/O registers */ 89*4a52ef61Sqianfan Zhao MemoryRegion dramphy_iomem; /**< DRAMPHY module I/O registers */ 90*4a52ef61Sqianfan Zhao MemoryRegion dram_high; /**< The high 1G dram for dualrank detect */ 91*4a52ef61Sqianfan Zhao MemoryRegion detect_cells; /**< DRAM memory cells for auto detect */ 92*4a52ef61Sqianfan Zhao 93*4a52ef61Sqianfan Zhao /** @} */ 94*4a52ef61Sqianfan Zhao 95*4a52ef61Sqianfan Zhao /** 96*4a52ef61Sqianfan Zhao * @name Hardware Registers 97*4a52ef61Sqianfan Zhao * @{ 98*4a52ef61Sqianfan Zhao */ 99*4a52ef61Sqianfan Zhao 100*4a52ef61Sqianfan Zhao uint32_t dramcom[AW_R40_DRAMCOM_REGS_NUM]; /**< DRAMCOM registers */ 101*4a52ef61Sqianfan Zhao uint32_t dramctl[AW_R40_DRAMCTL_REGS_NUM]; /**< DRAMCTL registers */ 102*4a52ef61Sqianfan Zhao uint32_t dramphy[AW_R40_DRAMPHY_REGS_NUM] ;/**< DRAMPHY registers */ 103*4a52ef61Sqianfan Zhao 104*4a52ef61Sqianfan Zhao /** @} */ 105*4a52ef61Sqianfan Zhao 106*4a52ef61Sqianfan Zhao }; 107*4a52ef61Sqianfan Zhao 108*4a52ef61Sqianfan Zhao #endif /* HW_MISC_ALLWINNER_R40_DRAMC_H */ 109