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