16363235bSAlistair Francis /* 26363235bSAlistair Francis * Header file for the Xilinx Zynq SPI controller 36363235bSAlistair Francis * 46363235bSAlistair Francis * Copyright (C) 2015 Xilinx Inc 56363235bSAlistair Francis * 66363235bSAlistair Francis * Permission is hereby granted, free of charge, to any person obtaining a copy 76363235bSAlistair Francis * of this software and associated documentation files (the "Software"), to deal 86363235bSAlistair Francis * in the Software without restriction, including without limitation the rights 96363235bSAlistair Francis * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 106363235bSAlistair Francis * copies of the Software, and to permit persons to whom the Software is 116363235bSAlistair Francis * furnished to do so, subject to the following conditions: 126363235bSAlistair Francis * 136363235bSAlistair Francis * The above copyright notice and this permission notice shall be included in 146363235bSAlistair Francis * all copies or substantial portions of the Software. 156363235bSAlistair Francis * 166363235bSAlistair Francis * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 176363235bSAlistair Francis * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 186363235bSAlistair Francis * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 196363235bSAlistair Francis * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 206363235bSAlistair Francis * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 216363235bSAlistair Francis * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 226363235bSAlistair Francis * THE SOFTWARE. 236363235bSAlistair Francis */ 246363235bSAlistair Francis 25121d0712SMarkus Armbruster #ifndef XILINX_SPIPS_H 26121d0712SMarkus Armbruster #define XILINX_SPIPS_H 276363235bSAlistair Francis 286363235bSAlistair Francis #include "hw/ssi/ssi.h" 29c95997a3SFrancisco Iglesias #include "qemu/fifo32.h" 30c95997a3SFrancisco Iglesias #include "hw/stream.h" 31ec150c7eSMarkus Armbruster #include "hw/sysbus.h" 32db1015e9SEduardo Habkost #include "qom/object.h" 336363235bSAlistair Francis 346363235bSAlistair Francis typedef struct XilinxSPIPS XilinxSPIPS; 356363235bSAlistair Francis 36*90bb6d67SFrederic Konrad /* For SPIPS, QSPIPS. */ 376363235bSAlistair Francis #define XLNX_SPIPS_R_MAX (0x100 / 4) 38*90bb6d67SFrederic Konrad /* For ZYNQMP_QSPIPS. */ 39d6bafaf4SXuzhou Cheng #define XLNX_ZYNQMP_SPIPS_R_MAX (0x200 / 4) 406363235bSAlistair Francis 415394dbccSFrancisco Iglesias /* Bite off 4k chunks at a time */ 425394dbccSFrancisco Iglesias #define LQSPI_CACHE_SIZE 1024 435394dbccSFrancisco Iglesias 4421d887cdSSai Pavan Boddu #define QSPI_DMA_MAX_BURST_SIZE 2048 4521d887cdSSai Pavan Boddu 465394dbccSFrancisco Iglesias typedef enum { 475394dbccSFrancisco Iglesias READ = 0x3, READ_4 = 0x13, 485394dbccSFrancisco Iglesias FAST_READ = 0xb, FAST_READ_4 = 0x0c, 495394dbccSFrancisco Iglesias DOR = 0x3b, DOR_4 = 0x3c, 505394dbccSFrancisco Iglesias QOR = 0x6b, QOR_4 = 0x6c, 515394dbccSFrancisco Iglesias DIOR = 0xbb, DIOR_4 = 0xbc, 525394dbccSFrancisco Iglesias QIOR = 0xeb, QIOR_4 = 0xec, 535394dbccSFrancisco Iglesias 545394dbccSFrancisco Iglesias PP = 0x2, PP_4 = 0x12, 555394dbccSFrancisco Iglesias DPP = 0xa2, 565394dbccSFrancisco Iglesias QPP = 0x32, QPP_4 = 0x34, 575394dbccSFrancisco Iglesias } FlashCMD; 585394dbccSFrancisco Iglesias 596363235bSAlistair Francis struct XilinxSPIPS { 606363235bSAlistair Francis SysBusDevice parent_obj; 616363235bSAlistair Francis 626363235bSAlistair Francis MemoryRegion iomem; 636363235bSAlistair Francis MemoryRegion mmlqspi; 646363235bSAlistair Francis 656363235bSAlistair Francis qemu_irq irq; 666363235bSAlistair Francis int irqline; 676363235bSAlistair Francis 686363235bSAlistair Francis uint8_t num_cs; 696363235bSAlistair Francis uint8_t num_busses; 706363235bSAlistair Francis 716363235bSAlistair Francis uint8_t snoop_state; 72ef06ca39SFrancisco Iglesias int cmd_dummies; 73ef06ca39SFrancisco Iglesias uint8_t link_state; 74ef06ca39SFrancisco Iglesias uint8_t link_state_next; 75ef06ca39SFrancisco Iglesias uint8_t link_state_next_when; 766363235bSAlistair Francis qemu_irq *cs_lines; 77ef06ca39SFrancisco Iglesias bool *cs_lines_state; 786363235bSAlistair Francis SSIBus **spi; 796363235bSAlistair Francis 806363235bSAlistair Francis Fifo8 rx_fifo; 816363235bSAlistair Francis Fifo8 tx_fifo; 826363235bSAlistair Francis 836363235bSAlistair Francis uint8_t num_txrx_bytes; 84ef06ca39SFrancisco Iglesias uint32_t rx_discard; 856363235bSAlistair Francis 866363235bSAlistair Francis uint32_t regs[XLNX_SPIPS_R_MAX]; 87275e28ccSFrancisco Iglesias 88275e28ccSFrancisco Iglesias bool man_start_com; 896363235bSAlistair Francis }; 906363235bSAlistair Francis 91db1015e9SEduardo Habkost struct XilinxQSPIPS { 925394dbccSFrancisco Iglesias XilinxSPIPS parent_obj; 935394dbccSFrancisco Iglesias 945394dbccSFrancisco Iglesias uint8_t lqspi_buf[LQSPI_CACHE_SIZE]; 955394dbccSFrancisco Iglesias hwaddr lqspi_cached_addr; 965394dbccSFrancisco Iglesias Error *migration_blocker; 975394dbccSFrancisco Iglesias bool mmio_execution_enabled; 98db1015e9SEduardo Habkost }; 99db1015e9SEduardo Habkost typedef struct XilinxQSPIPS XilinxQSPIPS; 1005394dbccSFrancisco Iglesias 101db1015e9SEduardo Habkost struct XlnxZynqMPQSPIPS { 102c95997a3SFrancisco Iglesias XilinxQSPIPS parent_obj; 103c95997a3SFrancisco Iglesias 104cfbef3f4SPhilippe Mathieu-Daudé StreamSink *dma; 105c95997a3SFrancisco Iglesias int gqspi_irqline; 106c95997a3SFrancisco Iglesias 107c95997a3SFrancisco Iglesias uint32_t regs[XLNX_ZYNQMP_SPIPS_R_MAX]; 108c95997a3SFrancisco Iglesias 109a1a62cedSMichael Tokarev /* GQSPI has separate tx/rx fifos */ 110c95997a3SFrancisco Iglesias Fifo8 rx_fifo_g; 111c95997a3SFrancisco Iglesias Fifo8 tx_fifo_g; 112c95997a3SFrancisco Iglesias Fifo32 fifo_g; 113c95997a3SFrancisco Iglesias /* 114c95997a3SFrancisco Iglesias * At the end of each generic command, misaligned extra bytes are discard 115c95997a3SFrancisco Iglesias * or padded to tx and rx respectively to round it out (and avoid need for 116c95997a3SFrancisco Iglesias * individual byte access. Since we use byte fifos, keep track of the 117c95997a3SFrancisco Iglesias * alignment WRT to word access. 118c95997a3SFrancisco Iglesias */ 119c95997a3SFrancisco Iglesias uint8_t rx_fifo_g_align; 120c95997a3SFrancisco Iglesias uint8_t tx_fifo_g_align; 121c95997a3SFrancisco Iglesias bool man_start_com_g; 12221d887cdSSai Pavan Boddu uint32_t dma_burst_size; 12321d887cdSSai Pavan Boddu uint8_t dma_buf[QSPI_DMA_MAX_BURST_SIZE]; 124db1015e9SEduardo Habkost }; 125c95997a3SFrancisco Iglesias 126db1015e9SEduardo Habkost struct XilinxSPIPSClass { 1275394dbccSFrancisco Iglesias SysBusDeviceClass parent_class; 1285394dbccSFrancisco Iglesias 1295394dbccSFrancisco Iglesias const MemoryRegionOps *reg_ops; 130*90bb6d67SFrederic Konrad uint64_t reg_size; 1315394dbccSFrancisco Iglesias 1325394dbccSFrancisco Iglesias uint32_t rx_fifo_size; 1335394dbccSFrancisco Iglesias uint32_t tx_fifo_size; 134db1015e9SEduardo Habkost }; 1355394dbccSFrancisco Iglesias 1366363235bSAlistair Francis #define TYPE_XILINX_SPIPS "xlnx.ps7-spi" 1376363235bSAlistair Francis #define TYPE_XILINX_QSPIPS "xlnx.ps7-qspi" 138c95997a3SFrancisco Iglesias #define TYPE_XLNX_ZYNQMP_QSPIPS "xlnx.usmp-gqspi" 1396363235bSAlistair Francis 140a489d195SEduardo Habkost OBJECT_DECLARE_TYPE(XilinxSPIPS, XilinxSPIPSClass, XILINX_SPIPS) 1416363235bSAlistair Francis 1428063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(XilinxQSPIPS, XILINX_QSPIPS) 1436363235bSAlistair Francis 1448063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(XlnxZynqMPQSPIPS, XLNX_ZYNQMP_QSPIPS) 145c95997a3SFrancisco Iglesias 146121d0712SMarkus Armbruster #endif /* XILINX_SPIPS_H */ 147