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