xref: /qemu/include/hw/pci-host/designware.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
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