114e275efSMark Cave-Ayland /* 2*a1a62cedSMichael Tokarev * HP-PARISC Dino PCI chipset emulation, as in B160L and similar machines 314e275efSMark Cave-Ayland * 414e275efSMark Cave-Ayland * (C) 2017-2019 by Helge Deller <deller@gmx.de> 514e275efSMark Cave-Ayland * 614e275efSMark Cave-Ayland * This work is licensed under the GNU GPL license version 2 or later. 714e275efSMark Cave-Ayland * 814e275efSMark Cave-Ayland * Documentation available at: 914e275efSMark Cave-Ayland * https://parisc.wiki.kernel.org/images-parisc/9/91/Dino_ers.pdf 1014e275efSMark Cave-Ayland * https://parisc.wiki.kernel.org/images-parisc/7/70/Dino_3_1_Errata.pdf 1114e275efSMark Cave-Ayland */ 1214e275efSMark Cave-Ayland 1314e275efSMark Cave-Ayland #ifndef DINO_H 1414e275efSMark Cave-Ayland #define DINO_H 1514e275efSMark Cave-Ayland 1614e275efSMark Cave-Ayland #include "hw/pci/pci_host.h" 1714e275efSMark Cave-Ayland 1814e275efSMark Cave-Ayland #define TYPE_DINO_PCI_HOST_BRIDGE "dino-pcihost" 1914e275efSMark Cave-Ayland OBJECT_DECLARE_SIMPLE_TYPE(DinoState, DINO_PCI_HOST_BRIDGE) 2014e275efSMark Cave-Ayland 2114e275efSMark Cave-Ayland #define DINO_IAR0 0x004 2214e275efSMark Cave-Ayland #define DINO_IODC 0x008 2314e275efSMark Cave-Ayland #define DINO_IRR0 0x00C /* RO */ 2414e275efSMark Cave-Ayland #define DINO_IAR1 0x010 2514e275efSMark Cave-Ayland #define DINO_IRR1 0x014 /* RO */ 2614e275efSMark Cave-Ayland #define DINO_IMR 0x018 2714e275efSMark Cave-Ayland #define DINO_IPR 0x01C 2814e275efSMark Cave-Ayland #define DINO_TOC_ADDR 0x020 2914e275efSMark Cave-Ayland #define DINO_ICR 0x024 3014e275efSMark Cave-Ayland #define DINO_ILR 0x028 /* RO */ 3114e275efSMark Cave-Ayland #define DINO_IO_COMMAND 0x030 /* WO */ 3214e275efSMark Cave-Ayland #define DINO_IO_STATUS 0x034 /* RO */ 3314e275efSMark Cave-Ayland #define DINO_IO_CONTROL 0x038 3414e275efSMark Cave-Ayland #define DINO_IO_GSC_ERR_RESP 0x040 /* RO */ 3514e275efSMark Cave-Ayland #define DINO_IO_ERR_INFO 0x044 /* RO */ 3614e275efSMark Cave-Ayland #define DINO_IO_PCI_ERR_RESP 0x048 /* RO */ 3714e275efSMark Cave-Ayland #define DINO_IO_FBB_EN 0x05c 3814e275efSMark Cave-Ayland #define DINO_IO_ADDR_EN 0x060 3914e275efSMark Cave-Ayland #define DINO_PCI_CONFIG_ADDR 0x064 4014e275efSMark Cave-Ayland #define DINO_PCI_CONFIG_DATA 0x068 4114e275efSMark Cave-Ayland #define DINO_PCI_IO_DATA 0x06c 4214e275efSMark Cave-Ayland #define DINO_PCI_MEM_DATA 0x070 /* Dino 3.x only */ 4314e275efSMark Cave-Ayland #define DINO_GSC2X_CONFIG 0x7b4 /* RO */ 4414e275efSMark Cave-Ayland #define DINO_GMASK 0x800 4514e275efSMark Cave-Ayland #define DINO_PAMR 0x804 4614e275efSMark Cave-Ayland #define DINO_PAPR 0x808 4714e275efSMark Cave-Ayland #define DINO_DAMODE 0x80c 4814e275efSMark Cave-Ayland #define DINO_PCICMD 0x810 4914e275efSMark Cave-Ayland #define DINO_PCISTS 0x814 /* R/WC */ 5014e275efSMark Cave-Ayland #define DINO_MLTIM 0x81c 5114e275efSMark Cave-Ayland #define DINO_BRDG_FEAT 0x820 5214e275efSMark Cave-Ayland #define DINO_PCIROR 0x824 5314e275efSMark Cave-Ayland #define DINO_PCIWOR 0x828 5414e275efSMark Cave-Ayland #define DINO_TLTIM 0x830 5514e275efSMark Cave-Ayland 5614e275efSMark Cave-Ayland #define DINO_IRQS 11 /* bits 0-10 are architected */ 5714e275efSMark Cave-Ayland #define DINO_IRR_MASK 0x5ff /* only 10 bits are implemented */ 5814e275efSMark Cave-Ayland #define DINO_LOCAL_IRQS (DINO_IRQS + 1) 5914e275efSMark Cave-Ayland #define DINO_MASK_IRQ(x) (1 << (x)) 6014e275efSMark Cave-Ayland 6110c52641SMark Cave-Ayland #define DINO_IRQ_PCIINTA 0 6210c52641SMark Cave-Ayland #define DINO_IRQ_PCIINTB 1 6310c52641SMark Cave-Ayland #define DINO_IRQ_PCIINTC 2 6410c52641SMark Cave-Ayland #define DINO_IRQ_PCIINTD 3 6510c52641SMark Cave-Ayland #define DINO_IRQ_PCIINTE 4 6610c52641SMark Cave-Ayland #define DINO_IRQ_PCIINTF 5 6710c52641SMark Cave-Ayland #define DINO_IRQ_GSCEXTINT 6 6810c52641SMark Cave-Ayland #define DINO_IRQ_BUSERRINT 7 6910c52641SMark Cave-Ayland #define DINO_IRQ_PS2INT 8 7010c52641SMark Cave-Ayland #define DINO_IRQ_UNUSED 9 7110c52641SMark Cave-Ayland #define DINO_IRQ_RS232INT 10 7210c52641SMark Cave-Ayland 7314e275efSMark Cave-Ayland #define PCIINTA 0x001 7414e275efSMark Cave-Ayland #define PCIINTB 0x002 7514e275efSMark Cave-Ayland #define PCIINTC 0x004 7614e275efSMark Cave-Ayland #define PCIINTD 0x008 7714e275efSMark Cave-Ayland #define PCIINTE 0x010 7814e275efSMark Cave-Ayland #define PCIINTF 0x020 7914e275efSMark Cave-Ayland #define GSCEXTINT 0x040 8014e275efSMark Cave-Ayland /* #define xxx 0x080 - bit 7 is "default" */ 8114e275efSMark Cave-Ayland /* #define xxx 0x100 - bit 8 not used */ 8214e275efSMark Cave-Ayland /* #define xxx 0x200 - bit 9 not used */ 8314e275efSMark Cave-Ayland #define RS232INT 0x400 8414e275efSMark Cave-Ayland 8514e275efSMark Cave-Ayland #define DINO_MEM_CHUNK_SIZE (8 * MiB) 8614e275efSMark Cave-Ayland 8714e275efSMark Cave-Ayland #define DINO800_REGS (1 + (DINO_TLTIM - DINO_GMASK) / 4) 8814e275efSMark Cave-Ayland static const uint32_t reg800_keep_bits[DINO800_REGS] = { 8914e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 1), /* GMASK */ 9014e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 7), /* PAMR */ 9114e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 7), /* PAPR */ 9214e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 8), /* DAMODE */ 9314e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 7), /* PCICMD */ 9414e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 9), /* PCISTS */ 9514e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 32), /* Undefined */ 9614e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 8), /* MLTIM */ 9714e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 30), /* BRDG_FEAT */ 9814e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 24), /* PCIROR */ 9914e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 22), /* PCIWOR */ 10014e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 32), /* Undocumented */ 10114e275efSMark Cave-Ayland MAKE_64BIT_MASK(0, 9), /* TLTIM */ 10214e275efSMark Cave-Ayland }; 10314e275efSMark Cave-Ayland 104e111f288SMark Cave-Ayland /* offsets to DINO HPA: */ 105e111f288SMark Cave-Ayland #define DINO_PCI_ADDR 0x064 106e111f288SMark Cave-Ayland #define DINO_CONFIG_DATA 0x068 107e111f288SMark Cave-Ayland #define DINO_IO_DATA 0x06c 108e111f288SMark Cave-Ayland 10914e275efSMark Cave-Ayland struct DinoState { 11014e275efSMark Cave-Ayland PCIHostState parent_obj; 11114e275efSMark Cave-Ayland 11214e275efSMark Cave-Ayland uint32_t config_reg_dino; /* keep original copy, including 2 lowest bits */ 11314e275efSMark Cave-Ayland 11414e275efSMark Cave-Ayland uint32_t iar0; 11514e275efSMark Cave-Ayland uint32_t iar1; 11614e275efSMark Cave-Ayland uint32_t imr; 11714e275efSMark Cave-Ayland uint32_t ipr; 11814e275efSMark Cave-Ayland uint32_t icr; 11914e275efSMark Cave-Ayland uint32_t ilr; 12014e275efSMark Cave-Ayland uint32_t io_fbb_en; 12114e275efSMark Cave-Ayland uint32_t io_addr_en; 12214e275efSMark Cave-Ayland uint32_t io_control; 12314e275efSMark Cave-Ayland uint32_t toc_addr; 12414e275efSMark Cave-Ayland 12514e275efSMark Cave-Ayland uint32_t reg800[DINO800_REGS]; 12614e275efSMark Cave-Ayland 12714e275efSMark Cave-Ayland MemoryRegion this_mem; 12814e275efSMark Cave-Ayland MemoryRegion pci_mem; 12914e275efSMark Cave-Ayland MemoryRegion pci_mem_alias[32]; 13014e275efSMark Cave-Ayland 13114e275efSMark Cave-Ayland MemoryRegion *memory_as; 13214e275efSMark Cave-Ayland 13314e275efSMark Cave-Ayland AddressSpace bm_as; 13414e275efSMark Cave-Ayland MemoryRegion bm; 13514e275efSMark Cave-Ayland MemoryRegion bm_ram_alias; 13614e275efSMark Cave-Ayland MemoryRegion bm_pci_alias; 13714e275efSMark Cave-Ayland MemoryRegion bm_cpu_alias; 1384b5faaf9SMark Cave-Ayland 1394b5faaf9SMark Cave-Ayland qemu_irq irqs[DINO_IRQS]; 14014e275efSMark Cave-Ayland }; 14114e275efSMark Cave-Ayland 14214e275efSMark Cave-Ayland #endif 143