xref: /qemu/include/hw/sd/allwinner-sdhost.h (revision e3a6e0da)
1 /*
2  * Allwinner (sun4i and above) SD Host Controller emulation
3  *
4  * Copyright (C) 2019 Niek Linnenbank <nieklinnenbank@gmail.com>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef HW_SD_ALLWINNER_SDHOST_H
21 #define HW_SD_ALLWINNER_SDHOST_H
22 
23 #include "qom/object.h"
24 #include "hw/sysbus.h"
25 #include "hw/sd/sd.h"
26 
27 /**
28  * Object model types
29  * @{
30  */
31 
32 /** Generic Allwinner SD Host Controller (abstract) */
33 #define TYPE_AW_SDHOST "allwinner-sdhost"
34 
35 /** Allwinner sun4i family (A10, A12) */
36 #define TYPE_AW_SDHOST_SUN4I TYPE_AW_SDHOST "-sun4i"
37 
38 /** Allwinner sun5i family and newer (A13, H2+, H3, etc) */
39 #define TYPE_AW_SDHOST_SUN5I TYPE_AW_SDHOST "-sun5i"
40 
41 /** @} */
42 
43 /**
44  * Object model macros
45  * @{
46  */
47 
48 typedef struct AwSdHostClass AwSdHostClass;
49 typedef struct AwSdHostState AwSdHostState;
50 DECLARE_OBJ_CHECKERS(AwSdHostState, AwSdHostClass,
51                      AW_SDHOST, TYPE_AW_SDHOST)
52 
53 /** @} */
54 
55 /**
56  * Allwinner SD Host Controller object instance state.
57  */
58 struct AwSdHostState {
59     /*< private >*/
60     SysBusDevice busdev;
61     /*< public >*/
62 
63     /** Secure Digital (SD) bus, which connects to SD card (if present) */
64     SDBus sdbus;
65 
66     /** Maps I/O registers in physical memory */
67     MemoryRegion iomem;
68 
69     /** Interrupt output signal to notify CPU */
70     qemu_irq irq;
71 
72     /** Memory region where DMA transfers are done */
73     MemoryRegion *dma_mr;
74 
75     /** Address space used internally for DMA transfers */
76     AddressSpace dma_as;
77 
78     /** Number of bytes left in current DMA transfer */
79     uint32_t transfer_cnt;
80 
81     /**
82      * @name Hardware Registers
83      * @{
84      */
85 
86     uint32_t global_ctl;        /**< Global Control */
87     uint32_t clock_ctl;         /**< Clock Control */
88     uint32_t timeout;           /**< Timeout */
89     uint32_t bus_width;         /**< Bus Width */
90     uint32_t block_size;        /**< Block Size */
91     uint32_t byte_count;        /**< Byte Count */
92 
93     uint32_t command;           /**< Command */
94     uint32_t command_arg;       /**< Command Argument */
95     uint32_t response[4];       /**< Command Response */
96 
97     uint32_t irq_mask;          /**< Interrupt Mask */
98     uint32_t irq_status;        /**< Raw Interrupt Status */
99     uint32_t status;            /**< Status */
100 
101     uint32_t fifo_wlevel;       /**< FIFO Water Level */
102     uint32_t fifo_func_sel;     /**< FIFO Function Select */
103     uint32_t debug_enable;      /**< Debug Enable */
104     uint32_t auto12_arg;        /**< Auto Command 12 Argument */
105     uint32_t newtiming_set;     /**< SD New Timing Set */
106     uint32_t newtiming_debug;   /**< SD New Timing Debug */
107     uint32_t hardware_rst;      /**< Hardware Reset */
108     uint32_t dmac;              /**< Internal DMA Controller Control */
109     uint32_t desc_base;         /**< Descriptor List Base Address */
110     uint32_t dmac_status;       /**< Internal DMA Controller Status */
111     uint32_t dmac_irq;          /**< Internal DMA Controller IRQ Enable */
112     uint32_t card_threshold;    /**< Card Threshold Control */
113     uint32_t startbit_detect;   /**< eMMC DDR Start Bit Detection Control */
114     uint32_t response_crc;      /**< Response CRC */
115     uint32_t data_crc[8];       /**< Data CRC */
116     uint32_t status_crc;        /**< Status CRC */
117 
118     /** @} */
119 
120 };
121 
122 /**
123  * Allwinner SD Host Controller class-level struct.
124  *
125  * This struct is filled by each sunxi device specific code
126  * such that the generic code can use this struct to support
127  * all devices.
128  */
129 struct AwSdHostClass {
130     /*< private >*/
131     SysBusDeviceClass parent_class;
132     /*< public >*/
133 
134     /** Maximum buffer size in bytes per DMA descriptor */
135     size_t max_desc_size;
136 
137 };
138 
139 #endif /* HW_SD_ALLWINNER_SDHOST_H */
140