1d64e5eabSAndrey Smirnov /* 2d64e5eabSAndrey Smirnov * Copyright (c) 2017, Impinj, Inc. 3d64e5eabSAndrey Smirnov * 4d64e5eabSAndrey Smirnov * Designware PCIe IP block emulation 5d64e5eabSAndrey Smirnov * 6d64e5eabSAndrey Smirnov * This library is free software; you can redistribute it and/or 7d64e5eabSAndrey Smirnov * modify it under the terms of the GNU Lesser General Public 8d64e5eabSAndrey Smirnov * License as published by the Free Software Foundation; either 9d64e5eabSAndrey Smirnov * version 2 of the License, or (at your option) any later version. 10d64e5eabSAndrey Smirnov * 11d64e5eabSAndrey Smirnov * This library is distributed in the hope that it will be useful, 12d64e5eabSAndrey Smirnov * but WITHOUT ANY WARRANTY; without even the implied warranty of 13d64e5eabSAndrey Smirnov * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14d64e5eabSAndrey Smirnov * Lesser General Public License for more details. 15d64e5eabSAndrey Smirnov * 16d64e5eabSAndrey Smirnov * You should have received a copy of the GNU Lesser General Public 17d64e5eabSAndrey Smirnov * License along with this library; if not, see 18d64e5eabSAndrey Smirnov * <http://www.gnu.org/licenses/>. 19d64e5eabSAndrey Smirnov */ 20d64e5eabSAndrey Smirnov 21d64e5eabSAndrey Smirnov #ifndef DESIGNWARE_H 22d64e5eabSAndrey Smirnov #define DESIGNWARE_H 23d64e5eabSAndrey Smirnov 24d64e5eabSAndrey Smirnov #include "hw/sysbus.h" 25d64e5eabSAndrey Smirnov #include "hw/pci/pci.h" 26d64e5eabSAndrey Smirnov #include "hw/pci/pci_bus.h" 27d64e5eabSAndrey Smirnov #include "hw/pci/pcie_host.h" 28d64e5eabSAndrey Smirnov #include "hw/pci/pci_bridge.h" 29*db1015e9SEduardo Habkost #include "qom/object.h" 30d64e5eabSAndrey Smirnov 31d64e5eabSAndrey Smirnov #define TYPE_DESIGNWARE_PCIE_HOST "designware-pcie-host" 32*db1015e9SEduardo Habkost typedef struct DesignwarePCIEHost DesignwarePCIEHost; 33d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_HOST(obj) \ 34d64e5eabSAndrey Smirnov OBJECT_CHECK(DesignwarePCIEHost, (obj), TYPE_DESIGNWARE_PCIE_HOST) 35d64e5eabSAndrey Smirnov 36d64e5eabSAndrey Smirnov #define TYPE_DESIGNWARE_PCIE_ROOT "designware-pcie-root" 37*db1015e9SEduardo Habkost typedef struct DesignwarePCIERoot DesignwarePCIERoot; 38d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_ROOT(obj) \ 39d64e5eabSAndrey Smirnov OBJECT_CHECK(DesignwarePCIERoot, (obj), TYPE_DESIGNWARE_PCIE_ROOT) 40d64e5eabSAndrey Smirnov 41d64e5eabSAndrey Smirnov struct DesignwarePCIERoot; 42d64e5eabSAndrey Smirnov 43d64e5eabSAndrey Smirnov typedef struct DesignwarePCIEViewport { 44d64e5eabSAndrey Smirnov DesignwarePCIERoot *root; 45d64e5eabSAndrey Smirnov 46d64e5eabSAndrey Smirnov MemoryRegion cfg; 47d64e5eabSAndrey Smirnov MemoryRegion mem; 48d64e5eabSAndrey Smirnov 49d64e5eabSAndrey Smirnov uint64_t base; 50d64e5eabSAndrey Smirnov uint64_t target; 51d64e5eabSAndrey Smirnov uint32_t limit; 52d64e5eabSAndrey Smirnov uint32_t cr[2]; 53d64e5eabSAndrey Smirnov 54d64e5eabSAndrey Smirnov bool inbound; 55d64e5eabSAndrey Smirnov } DesignwarePCIEViewport; 56d64e5eabSAndrey Smirnov 57d64e5eabSAndrey Smirnov typedef struct DesignwarePCIEMSIBank { 58d64e5eabSAndrey Smirnov uint32_t enable; 59d64e5eabSAndrey Smirnov uint32_t mask; 60d64e5eabSAndrey Smirnov uint32_t status; 61d64e5eabSAndrey Smirnov } DesignwarePCIEMSIBank; 62d64e5eabSAndrey Smirnov 63d64e5eabSAndrey Smirnov typedef struct DesignwarePCIEMSI { 64d64e5eabSAndrey Smirnov uint64_t base; 65d64e5eabSAndrey Smirnov MemoryRegion iomem; 66d64e5eabSAndrey Smirnov 67d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_NUM_MSI_BANKS 1 68d64e5eabSAndrey Smirnov 69d64e5eabSAndrey Smirnov DesignwarePCIEMSIBank intr[DESIGNWARE_PCIE_NUM_MSI_BANKS]; 70d64e5eabSAndrey Smirnov } DesignwarePCIEMSI; 71d64e5eabSAndrey Smirnov 72d64e5eabSAndrey Smirnov struct DesignwarePCIERoot { 73d64e5eabSAndrey Smirnov PCIBridge parent_obj; 74d64e5eabSAndrey Smirnov 75d64e5eabSAndrey Smirnov uint32_t atu_viewport; 76d64e5eabSAndrey Smirnov 77d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_VIEWPORT_OUTBOUND 0 78d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_VIEWPORT_INBOUND 1 79d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_NUM_VIEWPORTS 4 80d64e5eabSAndrey Smirnov 81d64e5eabSAndrey Smirnov DesignwarePCIEViewport viewports[2][DESIGNWARE_PCIE_NUM_VIEWPORTS]; 82d64e5eabSAndrey Smirnov DesignwarePCIEMSI msi; 83d64e5eabSAndrey Smirnov }; 84d64e5eabSAndrey Smirnov 85*db1015e9SEduardo Habkost struct DesignwarePCIEHost { 86d64e5eabSAndrey Smirnov PCIHostState parent_obj; 87d64e5eabSAndrey Smirnov 88d64e5eabSAndrey Smirnov DesignwarePCIERoot root; 89d64e5eabSAndrey Smirnov 90d64e5eabSAndrey Smirnov struct { 91d64e5eabSAndrey Smirnov AddressSpace address_space; 92d64e5eabSAndrey Smirnov MemoryRegion address_space_root; 93d64e5eabSAndrey Smirnov 94d64e5eabSAndrey Smirnov MemoryRegion memory; 95d64e5eabSAndrey Smirnov MemoryRegion io; 96d64e5eabSAndrey Smirnov 97d64e5eabSAndrey Smirnov qemu_irq irqs[4]; 98d64e5eabSAndrey Smirnov } pci; 99d64e5eabSAndrey Smirnov 100d64e5eabSAndrey Smirnov MemoryRegion mmio; 101*db1015e9SEduardo Habkost }; 102d64e5eabSAndrey Smirnov 103d64e5eabSAndrey Smirnov #endif /* DESIGNWARE_H */ 104