2 * Allwinner (sun4i and above) SD Host Controller emulation
4 * Copyright (C) 2019 Niek Linnenbank <nieklinnenbank@gmail.com>
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.
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.
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/>.
20 #ifndef HW_SD_ALLWINNER_SDHOST_H
21 #define HW_SD_ALLWINNER_SDHOST_H
23 #include "qom/object.h"
24 #include "hw/sysbus.h"
32 /** Generic Allwinner SD Host Controller (abstract) */
33 #define TYPE_AW_SDHOST "allwinner-sdhost"
35 /** Allwinner sun4i family (A10, A12) */
36 #define TYPE_AW_SDHOST_SUN4I TYPE_AW_SDHOST "-sun4i"
38 /** Allwinner sun5i family and newer (A13, H2+, H3, etc) */
39 #define TYPE_AW_SDHOST_SUN5I TYPE_AW_SDHOST "-sun5i"
41 /** Allwinner sun50i-a64 */
42 #define TYPE_AW_SDHOST_SUN50I_A64 TYPE_AW_SDHOST "-sun50i-a64"
44 /** Allwinner sun50i-a64 emmc */
45 #define TYPE_AW_SDHOST_SUN50I_A64_EMMC TYPE_AW_SDHOST "-sun50i-a64-emmc"
54 OBJECT_DECLARE_TYPE(AwSdHostState
, AwSdHostClass
, AW_SDHOST
)
59 * Allwinner SD Host Controller object instance state.
61 struct AwSdHostState
{
66 /** Secure Digital (SD) bus, which connects to SD card (if present) */
69 /** Maps I/O registers in physical memory */
72 /** Interrupt output signal to notify CPU */
75 /** Memory region where DMA transfers are done */
78 /** Address space used internally for DMA transfers */
81 /** Number of bytes left in current DMA transfer */
82 uint32_t transfer_cnt
;
85 * @name Hardware Registers
89 uint32_t global_ctl
; /**< Global Control */
90 uint32_t clock_ctl
; /**< Clock Control */
91 uint32_t timeout
; /**< Timeout */
92 uint32_t bus_width
; /**< Bus Width */
93 uint32_t block_size
; /**< Block Size */
94 uint32_t byte_count
; /**< Byte Count */
96 uint32_t command
; /**< Command */
97 uint32_t command_arg
; /**< Command Argument */
98 uint32_t response
[4]; /**< Command Response */
100 uint32_t irq_mask
; /**< Interrupt Mask */
101 uint32_t irq_status
; /**< Raw Interrupt Status */
102 uint32_t status
; /**< Status */
104 uint32_t fifo_wlevel
; /**< FIFO Water Level */
105 uint32_t fifo_func_sel
; /**< FIFO Function Select */
106 uint32_t debug_enable
; /**< Debug Enable */
107 uint32_t auto12_arg
; /**< Auto Command 12 Argument */
108 uint32_t newtiming_set
; /**< SD New Timing Set */
109 uint32_t newtiming_debug
; /**< SD New Timing Debug */
110 uint32_t hardware_rst
; /**< Hardware Reset */
111 uint32_t dmac
; /**< Internal DMA Controller Control */
112 uint32_t desc_base
; /**< Descriptor List Base Address */
113 uint32_t dmac_status
; /**< Internal DMA Controller Status */
114 uint32_t dmac_irq
; /**< Internal DMA Controller IRQ Enable */
115 uint32_t card_threshold
; /**< Card Threshold Control */
116 uint32_t startbit_detect
; /**< eMMC DDR Start Bit Detection Control */
117 uint32_t response_crc
; /**< Response CRC */
118 uint32_t data_crc
[8]; /**< Data CRC */
119 uint32_t sample_delay
; /**< Sample delay control */
120 uint32_t status_crc
; /**< Status CRC */
127 * Allwinner SD Host Controller class-level struct.
129 * This struct is filled by each sunxi device specific code
130 * such that the generic code can use this struct to support
133 struct AwSdHostClass
{
135 SysBusDeviceClass parent_class
;
138 /** Maximum buffer size in bytes per DMA descriptor */
139 size_t max_desc_size
;
142 /** does the IP block support autocalibration? */
146 #endif /* HW_SD_ALLWINNER_SDHOST_H */