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 4182e48382SNiek Linnenbank /** @} */ 4282e48382SNiek Linnenbank 4382e48382SNiek Linnenbank /** 4482e48382SNiek Linnenbank * Object model macros 4582e48382SNiek Linnenbank * @{ 4682e48382SNiek Linnenbank */ 4782e48382SNiek Linnenbank 48a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(AwSdHostState, AwSdHostClass, AW_SDHOST) 4982e48382SNiek Linnenbank 5082e48382SNiek Linnenbank /** @} */ 5182e48382SNiek Linnenbank 5282e48382SNiek Linnenbank /** 5382e48382SNiek Linnenbank * Allwinner SD Host Controller object instance state. 5482e48382SNiek Linnenbank */ 55db1015e9SEduardo Habkost struct AwSdHostState { 5682e48382SNiek Linnenbank /*< private >*/ 5782e48382SNiek Linnenbank SysBusDevice busdev; 5882e48382SNiek Linnenbank /*< public >*/ 5982e48382SNiek Linnenbank 6082e48382SNiek Linnenbank /** Secure Digital (SD) bus, which connects to SD card (if present) */ 6182e48382SNiek Linnenbank SDBus sdbus; 6282e48382SNiek Linnenbank 6382e48382SNiek Linnenbank /** Maps I/O registers in physical memory */ 6482e48382SNiek Linnenbank MemoryRegion iomem; 6582e48382SNiek Linnenbank 6682e48382SNiek Linnenbank /** Interrupt output signal to notify CPU */ 6782e48382SNiek Linnenbank qemu_irq irq; 6882e48382SNiek Linnenbank 69b3aec952SPhilippe Mathieu-Daudé /** Memory region where DMA transfers are done */ 70b3aec952SPhilippe Mathieu-Daudé MemoryRegion *dma_mr; 71b3aec952SPhilippe Mathieu-Daudé 72b3aec952SPhilippe Mathieu-Daudé /** Address space used internally for DMA transfers */ 73b3aec952SPhilippe Mathieu-Daudé AddressSpace dma_as; 74b3aec952SPhilippe Mathieu-Daudé 7582e48382SNiek Linnenbank /** Number of bytes left in current DMA transfer */ 7682e48382SNiek Linnenbank uint32_t transfer_cnt; 7782e48382SNiek Linnenbank 7882e48382SNiek Linnenbank /** 7982e48382SNiek Linnenbank * @name Hardware Registers 8082e48382SNiek Linnenbank * @{ 8182e48382SNiek Linnenbank */ 8282e48382SNiek Linnenbank 8382e48382SNiek Linnenbank uint32_t global_ctl; /**< Global Control */ 8482e48382SNiek Linnenbank uint32_t clock_ctl; /**< Clock Control */ 8582e48382SNiek Linnenbank uint32_t timeout; /**< Timeout */ 8682e48382SNiek Linnenbank uint32_t bus_width; /**< Bus Width */ 8782e48382SNiek Linnenbank uint32_t block_size; /**< Block Size */ 8882e48382SNiek Linnenbank uint32_t byte_count; /**< Byte Count */ 8982e48382SNiek Linnenbank 9082e48382SNiek Linnenbank uint32_t command; /**< Command */ 9182e48382SNiek Linnenbank uint32_t command_arg; /**< Command Argument */ 9282e48382SNiek Linnenbank uint32_t response[4]; /**< Command Response */ 9382e48382SNiek Linnenbank 9482e48382SNiek Linnenbank uint32_t irq_mask; /**< Interrupt Mask */ 9582e48382SNiek Linnenbank uint32_t irq_status; /**< Raw Interrupt Status */ 9682e48382SNiek Linnenbank uint32_t status; /**< Status */ 9782e48382SNiek Linnenbank 9882e48382SNiek Linnenbank uint32_t fifo_wlevel; /**< FIFO Water Level */ 9982e48382SNiek Linnenbank uint32_t fifo_func_sel; /**< FIFO Function Select */ 10082e48382SNiek Linnenbank uint32_t debug_enable; /**< Debug Enable */ 10182e48382SNiek Linnenbank uint32_t auto12_arg; /**< Auto Command 12 Argument */ 10282e48382SNiek Linnenbank uint32_t newtiming_set; /**< SD New Timing Set */ 10382e48382SNiek Linnenbank uint32_t newtiming_debug; /**< SD New Timing Debug */ 10482e48382SNiek Linnenbank uint32_t hardware_rst; /**< Hardware Reset */ 10582e48382SNiek Linnenbank uint32_t dmac; /**< Internal DMA Controller Control */ 10682e48382SNiek Linnenbank uint32_t desc_base; /**< Descriptor List Base Address */ 10782e48382SNiek Linnenbank uint32_t dmac_status; /**< Internal DMA Controller Status */ 10882e48382SNiek Linnenbank uint32_t dmac_irq; /**< Internal DMA Controller IRQ Enable */ 10982e48382SNiek Linnenbank uint32_t card_threshold; /**< Card Threshold Control */ 11082e48382SNiek Linnenbank uint32_t startbit_detect; /**< eMMC DDR Start Bit Detection Control */ 11182e48382SNiek Linnenbank uint32_t response_crc; /**< Response CRC */ 11282e48382SNiek Linnenbank uint32_t data_crc[8]; /**< Data CRC */ 11382e48382SNiek Linnenbank uint32_t status_crc; /**< Status CRC */ 11482e48382SNiek Linnenbank 11582e48382SNiek Linnenbank /** @} */ 11682e48382SNiek Linnenbank 117db1015e9SEduardo Habkost }; 11882e48382SNiek Linnenbank 11982e48382SNiek Linnenbank /** 12082e48382SNiek Linnenbank * Allwinner SD Host Controller class-level struct. 12182e48382SNiek Linnenbank * 12282e48382SNiek Linnenbank * This struct is filled by each sunxi device specific code 12382e48382SNiek Linnenbank * such that the generic code can use this struct to support 12482e48382SNiek Linnenbank * all devices. 12582e48382SNiek Linnenbank */ 126db1015e9SEduardo Habkost struct AwSdHostClass { 12782e48382SNiek Linnenbank /*< private >*/ 12882e48382SNiek Linnenbank SysBusDeviceClass parent_class; 12982e48382SNiek Linnenbank /*< public >*/ 13082e48382SNiek Linnenbank 13182e48382SNiek Linnenbank /** Maximum buffer size in bytes per DMA descriptor */ 13282e48382SNiek Linnenbank size_t max_desc_size; 133*93e2da36SStrahinja Jankovic bool is_sun4i; 13482e48382SNiek Linnenbank 135db1015e9SEduardo Habkost }; 13682e48382SNiek Linnenbank 13782e48382SNiek Linnenbank #endif /* HW_SD_ALLWINNER_SDHOST_H */ 138