xref: /qemu/include/hw/misc/allwinner-r40-dramc.h (revision f5e6786de4815751b0a3d2235c760361f228ea48)
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