xref: /qemu/include/hw/sd/allwinner-sdhost.h (revision f5e6786de4815751b0a3d2235c760361f228ea48)
182e48382SNiek Linnenbank /*
282e48382SNiek Linnenbank  * Allwinner (sun4i and above) SD Host Controller emulation
382e48382SNiek Linnenbank  *
482e48382SNiek Linnenbank  * Copyright (C) 2019 Niek Linnenbank <nieklinnenbank@gmail.com>
582e48382SNiek Linnenbank  *
682e48382SNiek Linnenbank  * This program is free software: you can redistribute it and/or modify
782e48382SNiek Linnenbank  * it under the terms of the GNU General Public License as published by
882e48382SNiek Linnenbank  * the Free Software Foundation, either version 2 of the License, or
982e48382SNiek Linnenbank  * (at your option) any later version.
1082e48382SNiek Linnenbank  *
1182e48382SNiek Linnenbank  * This program is distributed in the hope that it will be useful,
1282e48382SNiek Linnenbank  * but WITHOUT ANY WARRANTY; without even the implied warranty of
1382e48382SNiek Linnenbank  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1482e48382SNiek Linnenbank  * GNU General Public License for more details.
1582e48382SNiek Linnenbank  *
1682e48382SNiek Linnenbank  * You should have received a copy of the GNU General Public License
1782e48382SNiek Linnenbank  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
1882e48382SNiek Linnenbank  */
1982e48382SNiek Linnenbank 
2082e48382SNiek Linnenbank #ifndef HW_SD_ALLWINNER_SDHOST_H
2182e48382SNiek Linnenbank #define HW_SD_ALLWINNER_SDHOST_H
2282e48382SNiek Linnenbank 
2382e48382SNiek Linnenbank #include "qom/object.h"
2482e48382SNiek Linnenbank #include "hw/sysbus.h"
2582e48382SNiek Linnenbank #include "hw/sd/sd.h"
2682e48382SNiek Linnenbank 
2782e48382SNiek Linnenbank /**
2882e48382SNiek Linnenbank  * Object model types
2982e48382SNiek Linnenbank  * @{
3082e48382SNiek Linnenbank  */
3182e48382SNiek Linnenbank 
3282e48382SNiek Linnenbank /** Generic Allwinner SD Host Controller (abstract) */
3382e48382SNiek Linnenbank #define TYPE_AW_SDHOST "allwinner-sdhost"
3482e48382SNiek Linnenbank 
3582e48382SNiek Linnenbank /** Allwinner sun4i family (A10, A12) */
3682e48382SNiek Linnenbank #define TYPE_AW_SDHOST_SUN4I TYPE_AW_SDHOST "-sun4i"
3782e48382SNiek Linnenbank 
3882e48382SNiek Linnenbank /** Allwinner sun5i family and newer (A13, H2+, H3, etc) */
3982e48382SNiek Linnenbank #define TYPE_AW_SDHOST_SUN5I TYPE_AW_SDHOST "-sun5i"
4082e48382SNiek Linnenbank 
41*2c992b88Sqianfan Zhao /** Allwinner sun50i-a64 */
42*2c992b88Sqianfan Zhao #define TYPE_AW_SDHOST_SUN50I_A64 TYPE_AW_SDHOST "-sun50i-a64"
43*2c992b88Sqianfan Zhao 
44*2c992b88Sqianfan Zhao /** Allwinner sun50i-a64 emmc */
45*2c992b88Sqianfan Zhao #define TYPE_AW_SDHOST_SUN50I_A64_EMMC  TYPE_AW_SDHOST "-sun50i-a64-emmc"
46*2c992b88Sqianfan Zhao 
4782e48382SNiek Linnenbank /** @} */
4882e48382SNiek Linnenbank 
4982e48382SNiek Linnenbank /**
5082e48382SNiek Linnenbank  * Object model macros
5182e48382SNiek Linnenbank  * @{
5282e48382SNiek Linnenbank  */
5382e48382SNiek Linnenbank 
54a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(AwSdHostState, AwSdHostClass, AW_SDHOST)
5582e48382SNiek Linnenbank 
5682e48382SNiek Linnenbank /** @} */
5782e48382SNiek Linnenbank 
5882e48382SNiek Linnenbank /**
5982e48382SNiek Linnenbank  * Allwinner SD Host Controller object instance state.
6082e48382SNiek Linnenbank  */
61db1015e9SEduardo Habkost struct AwSdHostState {
6282e48382SNiek Linnenbank     /*< private >*/
6382e48382SNiek Linnenbank     SysBusDevice busdev;
6482e48382SNiek Linnenbank     /*< public >*/
6582e48382SNiek Linnenbank 
6682e48382SNiek Linnenbank     /** Secure Digital (SD) bus, which connects to SD card (if present) */
6782e48382SNiek Linnenbank     SDBus sdbus;
6882e48382SNiek Linnenbank 
6982e48382SNiek Linnenbank     /** Maps I/O registers in physical memory */
7082e48382SNiek Linnenbank     MemoryRegion iomem;
7182e48382SNiek Linnenbank 
7282e48382SNiek Linnenbank     /** Interrupt output signal to notify CPU */
7382e48382SNiek Linnenbank     qemu_irq irq;
7482e48382SNiek Linnenbank 
75b3aec952SPhilippe Mathieu-Daudé     /** Memory region where DMA transfers are done */
76b3aec952SPhilippe Mathieu-Daudé     MemoryRegion *dma_mr;
77b3aec952SPhilippe Mathieu-Daudé 
78b3aec952SPhilippe Mathieu-Daudé     /** Address space used internally for DMA transfers */
79b3aec952SPhilippe Mathieu-Daudé     AddressSpace dma_as;
80b3aec952SPhilippe Mathieu-Daudé 
8182e48382SNiek Linnenbank     /** Number of bytes left in current DMA transfer */
8282e48382SNiek Linnenbank     uint32_t transfer_cnt;
8382e48382SNiek Linnenbank 
8482e48382SNiek Linnenbank     /**
8582e48382SNiek Linnenbank      * @name Hardware Registers
8682e48382SNiek Linnenbank      * @{
8782e48382SNiek Linnenbank      */
8882e48382SNiek Linnenbank 
8982e48382SNiek Linnenbank     uint32_t global_ctl;        /**< Global Control */
9082e48382SNiek Linnenbank     uint32_t clock_ctl;         /**< Clock Control */
9182e48382SNiek Linnenbank     uint32_t timeout;           /**< Timeout */
9282e48382SNiek Linnenbank     uint32_t bus_width;         /**< Bus Width */
9382e48382SNiek Linnenbank     uint32_t block_size;        /**< Block Size */
9482e48382SNiek Linnenbank     uint32_t byte_count;        /**< Byte Count */
9582e48382SNiek Linnenbank 
9682e48382SNiek Linnenbank     uint32_t command;           /**< Command */
9782e48382SNiek Linnenbank     uint32_t command_arg;       /**< Command Argument */
9882e48382SNiek Linnenbank     uint32_t response[4];       /**< Command Response */
9982e48382SNiek Linnenbank 
10082e48382SNiek Linnenbank     uint32_t irq_mask;          /**< Interrupt Mask */
10182e48382SNiek Linnenbank     uint32_t irq_status;        /**< Raw Interrupt Status */
10282e48382SNiek Linnenbank     uint32_t status;            /**< Status */
10382e48382SNiek Linnenbank 
10482e48382SNiek Linnenbank     uint32_t fifo_wlevel;       /**< FIFO Water Level */
10582e48382SNiek Linnenbank     uint32_t fifo_func_sel;     /**< FIFO Function Select */
10682e48382SNiek Linnenbank     uint32_t debug_enable;      /**< Debug Enable */
10782e48382SNiek Linnenbank     uint32_t auto12_arg;        /**< Auto Command 12 Argument */
10882e48382SNiek Linnenbank     uint32_t newtiming_set;     /**< SD New Timing Set */
10982e48382SNiek Linnenbank     uint32_t newtiming_debug;   /**< SD New Timing Debug */
11082e48382SNiek Linnenbank     uint32_t hardware_rst;      /**< Hardware Reset */
11182e48382SNiek Linnenbank     uint32_t dmac;              /**< Internal DMA Controller Control */
11282e48382SNiek Linnenbank     uint32_t desc_base;         /**< Descriptor List Base Address */
11382e48382SNiek Linnenbank     uint32_t dmac_status;       /**< Internal DMA Controller Status */
11482e48382SNiek Linnenbank     uint32_t dmac_irq;          /**< Internal DMA Controller IRQ Enable */
11582e48382SNiek Linnenbank     uint32_t card_threshold;    /**< Card Threshold Control */
11682e48382SNiek Linnenbank     uint32_t startbit_detect;   /**< eMMC DDR Start Bit Detection Control */
11782e48382SNiek Linnenbank     uint32_t response_crc;      /**< Response CRC */
11882e48382SNiek Linnenbank     uint32_t data_crc[8];       /**< Data CRC */
119*2c992b88Sqianfan Zhao     uint32_t sample_delay;      /**< Sample delay control */
12082e48382SNiek Linnenbank     uint32_t status_crc;        /**< Status CRC */
12182e48382SNiek Linnenbank 
12282e48382SNiek Linnenbank     /** @} */
12382e48382SNiek Linnenbank 
124db1015e9SEduardo Habkost };
12582e48382SNiek Linnenbank 
12682e48382SNiek Linnenbank /**
12782e48382SNiek Linnenbank  * Allwinner SD Host Controller class-level struct.
12882e48382SNiek Linnenbank  *
12982e48382SNiek Linnenbank  * This struct is filled by each sunxi device specific code
13082e48382SNiek Linnenbank  * such that the generic code can use this struct to support
13182e48382SNiek Linnenbank  * all devices.
13282e48382SNiek Linnenbank  */
133db1015e9SEduardo Habkost struct AwSdHostClass {
13482e48382SNiek Linnenbank     /*< private >*/
13582e48382SNiek Linnenbank     SysBusDeviceClass parent_class;
13682e48382SNiek Linnenbank     /*< public >*/
13782e48382SNiek Linnenbank 
13882e48382SNiek Linnenbank     /** Maximum buffer size in bytes per DMA descriptor */
13982e48382SNiek Linnenbank     size_t max_desc_size;
14093e2da36SStrahinja Jankovic     bool   is_sun4i;
14182e48382SNiek Linnenbank 
142*2c992b88Sqianfan Zhao     /** does the IP block support autocalibration? */
143*2c992b88Sqianfan Zhao     bool can_calibrate;
144db1015e9SEduardo Habkost };
14582e48382SNiek Linnenbank 
14682e48382SNiek Linnenbank #endif /* HW_SD_ALLWINNER_SDHOST_H */
147