xref: /openbmc/qemu/include/hw/pci/pcie_port.h (revision a3fb4e93a3a7cf2be355c41cd550bef856f5ffe4)
10d09e41aSPaolo Bonzini /*
20d09e41aSPaolo Bonzini  * pcie_port.h
30d09e41aSPaolo Bonzini  *
40d09e41aSPaolo Bonzini  * Copyright (c) 2010 Isaku Yamahata <yamahata at valinux co jp>
50d09e41aSPaolo Bonzini  *                    VA Linux Systems Japan K.K.
60d09e41aSPaolo Bonzini  *
70d09e41aSPaolo Bonzini  * This program is free software; you can redistribute it and/or modify
80d09e41aSPaolo Bonzini  * it under the terms of the GNU General Public License as published by
90d09e41aSPaolo Bonzini  * the Free Software Foundation; either version 2 of the License, or
100d09e41aSPaolo Bonzini  * (at your option) any later version.
110d09e41aSPaolo Bonzini  *
120d09e41aSPaolo Bonzini  * This program is distributed in the hope that it will be useful,
130d09e41aSPaolo Bonzini  * but WITHOUT ANY WARRANTY; without even the implied warranty of
140d09e41aSPaolo Bonzini  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
150d09e41aSPaolo Bonzini  * GNU General Public License for more details.
160d09e41aSPaolo Bonzini  *
170d09e41aSPaolo Bonzini  * You should have received a copy of the GNU General Public License along
180d09e41aSPaolo Bonzini  * with this program; if not, see <http://www.gnu.org/licenses/>.
190d09e41aSPaolo Bonzini  */
200d09e41aSPaolo Bonzini 
210d09e41aSPaolo Bonzini #ifndef QEMU_PCIE_PORT_H
220d09e41aSPaolo Bonzini #define QEMU_PCIE_PORT_H
230d09e41aSPaolo Bonzini 
240d09e41aSPaolo Bonzini #include "hw/pci/pci_bridge.h"
250d09e41aSPaolo Bonzini #include "hw/pci/pci_bus.h"
26edf5ca5dSMarkus Armbruster #include "hw/pci/pci_device.h"
27db1015e9SEduardo Habkost #include "qom/object.h"
280d09e41aSPaolo Bonzini 
29bcb75750SAndreas Färber #define TYPE_PCIE_PORT "pcie-port"
308063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(PCIEPort, PCIE_PORT)
31bcb75750SAndreas Färber 
320d09e41aSPaolo Bonzini struct PCIEPort {
33bcb75750SAndreas Färber     /*< private >*/
34bcb75750SAndreas Färber     PCIBridge   parent_obj;
35bcb75750SAndreas Färber     /*< public >*/
360d09e41aSPaolo Bonzini 
370d09e41aSPaolo Bonzini     /* pci express switch port */
380d09e41aSPaolo Bonzini     uint8_t     port;
390d09e41aSPaolo Bonzini };
400d09e41aSPaolo Bonzini 
410d09e41aSPaolo Bonzini void pcie_port_init_reg(PCIDevice *d);
420d09e41aSPaolo Bonzini 
43aa970ed5SJonathan Cameron PCIDevice *pcie_find_port_by_pn(PCIBus *bus, uint8_t pn);
44*84344ee2SJonathan Cameron PCIDevice *pcie_find_port_first(PCIBus *bus);
45*84344ee2SJonathan Cameron int pcie_count_ds_ports(PCIBus *bus);
46aa970ed5SJonathan Cameron 
47bcb75750SAndreas Färber #define TYPE_PCIE_SLOT "pcie-slot"
488063396bSEduardo Habkost OBJECT_DECLARE_SIMPLE_TYPE(PCIESlot, PCIE_SLOT)
49bcb75750SAndreas Färber 
500d09e41aSPaolo Bonzini struct PCIESlot {
51bcb75750SAndreas Färber     /*< private >*/
52bcb75750SAndreas Färber     PCIEPort    parent_obj;
53bcb75750SAndreas Färber     /*< public >*/
540d09e41aSPaolo Bonzini 
550d09e41aSPaolo Bonzini     /* pci express switch port with slot */
560d09e41aSPaolo Bonzini     uint8_t     chassis;
570d09e41aSPaolo Bonzini     uint16_t    slot;
58ea8cfdb5SAlex Williamson 
59ea8cfdb5SAlex Williamson     PCIExpLinkSpeed speed;
60ea8cfdb5SAlex Williamson     PCIExpLinkWidth width;
61ea8cfdb5SAlex Williamson 
62a58dfba2SDr. David Alan Gilbert     /* Disable ACS (really for a pcie_root_port) */
63a58dfba2SDr. David Alan Gilbert     bool        disable_acs;
64530a0963SJulia Suvorova 
653f3cbbb2SJulia Suvorova     /* Indicates whether any type of hot-plug is allowed on the slot */
66530a0963SJulia Suvorova     bool        hotplug;
673f3cbbb2SJulia Suvorova 
681d77e157SIgor Mammedov     /* broken ACPI hotplug compat knob to preserve 6.1 ABI intact */
691d77e157SIgor Mammedov     bool        hide_native_hotplug_cap;
703f3cbbb2SJulia Suvorova 
710d09e41aSPaolo Bonzini     QLIST_ENTRY(PCIESlot) next;
720d09e41aSPaolo Bonzini };
730d09e41aSPaolo Bonzini 
740d09e41aSPaolo Bonzini void pcie_chassis_create(uint8_t chassis_number);
750d09e41aSPaolo Bonzini int pcie_chassis_add_slot(struct PCIESlot *slot);
760d09e41aSPaolo Bonzini void pcie_chassis_del_slot(PCIESlot *s);
770d09e41aSPaolo Bonzini 
789d5154d7SMarcel Apfelbaum #define TYPE_PCIE_ROOT_PORT         "pcie-root-port-base"
79db1015e9SEduardo Habkost typedef struct PCIERootPortClass PCIERootPortClass;
808110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(PCIERootPortClass, PCIE_ROOT_PORT,
818110fa1dSEduardo Habkost                        TYPE_PCIE_ROOT_PORT)
829d5154d7SMarcel Apfelbaum 
83db1015e9SEduardo Habkost struct PCIERootPortClass {
849d5154d7SMarcel Apfelbaum     PCIDeviceClass parent_class;
85226263fbSAleksandr Bezzubikov     DeviceRealize parent_realize;
86f4c636b0SPeter Maydell     ResettablePhases parent_phases;
879d5154d7SMarcel Apfelbaum 
889d5154d7SMarcel Apfelbaum     uint8_t (*aer_vector)(const PCIDevice *dev);
899d5154d7SMarcel Apfelbaum     int (*interrupts_init)(PCIDevice *dev, Error **errp);
909d5154d7SMarcel Apfelbaum     void (*interrupts_uninit)(PCIDevice *dev);
919d5154d7SMarcel Apfelbaum 
929d5154d7SMarcel Apfelbaum     int exp_offset;
939d5154d7SMarcel Apfelbaum     int aer_offset;
949d5154d7SMarcel Apfelbaum     int ssvid_offset;
95e07fb4b5SKnut Omang     int acs_offset;    /* If nonzero, optional ACS capability offset */
969d5154d7SMarcel Apfelbaum     int ssid;
97db1015e9SEduardo Habkost };
989d5154d7SMarcel Apfelbaum 
990d09e41aSPaolo Bonzini #endif /* QEMU_PCIE_PORT_H */
100