xref: /qemu/include/hw/pci-host/designware.h (revision 61f3c91a67c4695dee6904d841b393ea21003969)
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
9*61f3c91aSChetan Pant  * version 2.1 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"
29db1015e9SEduardo Habkost #include "qom/object.h"
30d64e5eabSAndrey Smirnov 
31d64e5eabSAndrey Smirnov #define TYPE_DESIGNWARE_PCIE_HOST "designware-pcie-host"
328063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(DesignwarePCIEHost, DESIGNWARE_PCIE_HOST)
33d64e5eabSAndrey Smirnov 
34d64e5eabSAndrey Smirnov #define TYPE_DESIGNWARE_PCIE_ROOT "designware-pcie-root"
358063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(DesignwarePCIERoot, DESIGNWARE_PCIE_ROOT)
36d64e5eabSAndrey Smirnov 
37d64e5eabSAndrey Smirnov struct DesignwarePCIERoot;
38d64e5eabSAndrey Smirnov 
39d64e5eabSAndrey Smirnov typedef struct DesignwarePCIEViewport {
40d64e5eabSAndrey Smirnov     DesignwarePCIERoot *root;
41d64e5eabSAndrey Smirnov 
42d64e5eabSAndrey Smirnov     MemoryRegion cfg;
43d64e5eabSAndrey Smirnov     MemoryRegion mem;
44d64e5eabSAndrey Smirnov 
45d64e5eabSAndrey Smirnov     uint64_t base;
46d64e5eabSAndrey Smirnov     uint64_t target;
47d64e5eabSAndrey Smirnov     uint32_t limit;
48d64e5eabSAndrey Smirnov     uint32_t cr[2];
49d64e5eabSAndrey Smirnov 
50d64e5eabSAndrey Smirnov     bool inbound;
51d64e5eabSAndrey Smirnov } DesignwarePCIEViewport;
52d64e5eabSAndrey Smirnov 
53d64e5eabSAndrey Smirnov typedef struct DesignwarePCIEMSIBank {
54d64e5eabSAndrey Smirnov     uint32_t enable;
55d64e5eabSAndrey Smirnov     uint32_t mask;
56d64e5eabSAndrey Smirnov     uint32_t status;
57d64e5eabSAndrey Smirnov } DesignwarePCIEMSIBank;
58d64e5eabSAndrey Smirnov 
59d64e5eabSAndrey Smirnov typedef struct DesignwarePCIEMSI {
60d64e5eabSAndrey Smirnov     uint64_t     base;
61d64e5eabSAndrey Smirnov     MemoryRegion iomem;
62d64e5eabSAndrey Smirnov 
63d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_NUM_MSI_BANKS        1
64d64e5eabSAndrey Smirnov 
65d64e5eabSAndrey Smirnov     DesignwarePCIEMSIBank intr[DESIGNWARE_PCIE_NUM_MSI_BANKS];
66d64e5eabSAndrey Smirnov } DesignwarePCIEMSI;
67d64e5eabSAndrey Smirnov 
68d64e5eabSAndrey Smirnov struct DesignwarePCIERoot {
69d64e5eabSAndrey Smirnov     PCIBridge parent_obj;
70d64e5eabSAndrey Smirnov 
71d64e5eabSAndrey Smirnov     uint32_t atu_viewport;
72d64e5eabSAndrey Smirnov 
73d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_VIEWPORT_OUTBOUND    0
74d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_VIEWPORT_INBOUND     1
75d64e5eabSAndrey Smirnov #define DESIGNWARE_PCIE_NUM_VIEWPORTS        4
76d64e5eabSAndrey Smirnov 
77d64e5eabSAndrey Smirnov     DesignwarePCIEViewport viewports[2][DESIGNWARE_PCIE_NUM_VIEWPORTS];
78d64e5eabSAndrey Smirnov     DesignwarePCIEMSI msi;
79d64e5eabSAndrey Smirnov };
80d64e5eabSAndrey Smirnov 
81db1015e9SEduardo Habkost struct DesignwarePCIEHost {
82d64e5eabSAndrey Smirnov     PCIHostState parent_obj;
83d64e5eabSAndrey Smirnov 
84d64e5eabSAndrey Smirnov     DesignwarePCIERoot root;
85d64e5eabSAndrey Smirnov 
86d64e5eabSAndrey Smirnov     struct {
87d64e5eabSAndrey Smirnov         AddressSpace address_space;
88d64e5eabSAndrey Smirnov         MemoryRegion address_space_root;
89d64e5eabSAndrey Smirnov 
90d64e5eabSAndrey Smirnov         MemoryRegion memory;
91d64e5eabSAndrey Smirnov         MemoryRegion io;
92d64e5eabSAndrey Smirnov 
93d64e5eabSAndrey Smirnov         qemu_irq     irqs[4];
94d64e5eabSAndrey Smirnov     } pci;
95d64e5eabSAndrey Smirnov 
96d64e5eabSAndrey Smirnov     MemoryRegion mmio;
97db1015e9SEduardo Habkost };
98d64e5eabSAndrey Smirnov 
99d64e5eabSAndrey Smirnov #endif /* DESIGNWARE_H */
100