2010-10-20 12:18:52 +04:00
|
|
|
/*
|
|
|
|
* pcie_port.h
|
|
|
|
*
|
|
|
|
* Copyright (c) 2010 Isaku Yamahata <yamahata at valinux co jp>
|
|
|
|
* VA Linux Systems Japan K.K.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef QEMU_PCIE_PORT_H
|
|
|
|
#define QEMU_PCIE_PORT_H
|
|
|
|
|
2012-12-13 01:05:42 +04:00
|
|
|
#include "hw/pci/pci_bridge.h"
|
2012-12-12 17:00:45 +04:00
|
|
|
#include "hw/pci/pci_bus.h"
|
2020-09-03 23:43:22 +03:00
|
|
|
#include "qom/object.h"
|
2010-10-20 12:18:52 +04:00
|
|
|
|
2013-07-12 21:56:00 +04:00
|
|
|
#define TYPE_PCIE_PORT "pcie-port"
|
2020-09-16 21:25:19 +03:00
|
|
|
OBJECT_DECLARE_SIMPLE_TYPE(PCIEPort, PCIE_PORT)
|
2013-07-12 21:56:00 +04:00
|
|
|
|
2010-10-20 12:18:52 +04:00
|
|
|
struct PCIEPort {
|
2013-07-12 21:56:00 +04:00
|
|
|
/*< private >*/
|
|
|
|
PCIBridge parent_obj;
|
|
|
|
/*< public >*/
|
2010-10-20 12:18:52 +04:00
|
|
|
|
|
|
|
/* pci express switch port */
|
|
|
|
uint8_t port;
|
|
|
|
};
|
|
|
|
|
|
|
|
void pcie_port_init_reg(PCIDevice *d);
|
|
|
|
|
2013-07-12 21:56:00 +04:00
|
|
|
#define TYPE_PCIE_SLOT "pcie-slot"
|
2020-09-16 21:25:19 +03:00
|
|
|
OBJECT_DECLARE_SIMPLE_TYPE(PCIESlot, PCIE_SLOT)
|
2013-07-12 21:56:00 +04:00
|
|
|
|
2010-10-20 12:18:52 +04:00
|
|
|
struct PCIESlot {
|
2013-07-12 21:56:00 +04:00
|
|
|
/*< private >*/
|
|
|
|
PCIEPort parent_obj;
|
|
|
|
/*< public >*/
|
2010-10-20 12:18:52 +04:00
|
|
|
|
|
|
|
/* pci express switch port with slot */
|
|
|
|
uint8_t chassis;
|
|
|
|
uint16_t slot;
|
2018-12-12 22:39:16 +03:00
|
|
|
|
|
|
|
PCIExpLinkSpeed speed;
|
|
|
|
PCIExpLinkWidth width;
|
|
|
|
|
2019-07-30 12:37:18 +03:00
|
|
|
/* Disable ACS (really for a pcie_root_port) */
|
|
|
|
bool disable_acs;
|
2020-02-26 20:46:07 +03:00
|
|
|
|
2021-07-13 03:42:02 +03:00
|
|
|
/* Indicates whether any type of hot-plug is allowed on the slot */
|
2020-02-26 20:46:07 +03:00
|
|
|
bool hotplug;
|
2021-07-13 03:42:02 +03:00
|
|
|
|
|
|
|
bool native_hotplug;
|
|
|
|
|
2010-10-20 12:18:52 +04:00
|
|
|
QLIST_ENTRY(PCIESlot) next;
|
|
|
|
};
|
|
|
|
|
|
|
|
void pcie_chassis_create(uint8_t chassis_number);
|
|
|
|
PCIESlot *pcie_chassis_find_slot(uint8_t chassis, uint16_t slot);
|
|
|
|
int pcie_chassis_add_slot(struct PCIESlot *slot);
|
|
|
|
void pcie_chassis_del_slot(PCIESlot *s);
|
|
|
|
|
2017-01-23 22:20:18 +03:00
|
|
|
#define TYPE_PCIE_ROOT_PORT "pcie-root-port-base"
|
2020-09-03 23:43:22 +03:00
|
|
|
typedef struct PCIERootPortClass PCIERootPortClass;
|
2020-09-01 00:07:33 +03:00
|
|
|
DECLARE_CLASS_CHECKERS(PCIERootPortClass, PCIE_ROOT_PORT,
|
|
|
|
TYPE_PCIE_ROOT_PORT)
|
2017-01-23 22:20:18 +03:00
|
|
|
|
2020-09-03 23:43:22 +03:00
|
|
|
struct PCIERootPortClass {
|
2017-01-23 22:20:18 +03:00
|
|
|
PCIDeviceClass parent_class;
|
2017-08-18 02:36:49 +03:00
|
|
|
DeviceRealize parent_realize;
|
ppc/pnv: Add models for POWER9 PHB4 PCIe Host bridge
These changes introduces models for the PCIe Host Bridge (PHB4) of the
POWER9 processor. It includes the PowerBus logic interface (PBCQ),
IOMMU support, a single PCIe Gen.4 Root Complex, and support for MSI
and LSI interrupt sources as found on a POWER9 system using the XIVE
interrupt controller.
POWER9 processor comes with 3 PHB4 PEC (PCI Express Controller) and
each PEC can have several PHBs. By default,
* PEC0 provides 1 PHB (PHB0)
* PEC1 provides 2 PHBs (PHB1 and PHB2)
* PEC2 provides 3 PHBs (PHB3, PHB4 and PHB5)
Each PEC has a set "global" registers and some "per-stack" (per-PHB)
registers. Those are organized in two XSCOM ranges, the "Nest" range
and the "PCI" range, each range contains both some "PEC" registers and
some "per-stack" registers.
No default device layout is provided and PCI devices can be added on
any of the available PCIe Root Port (pcie.0 .. 2 of a Power9 chip)
with address 0x0 as the firwware (skiboot) only accepts a single
device per root port. To run a simple system with a network and a
storage adapters, use a command line options such as :
-device e1000e,netdev=net0,mac=C0:FF:EE:00:00:02,bus=pcie.0,addr=0x0
-netdev bridge,id=net0,helper=/usr/libexec/qemu-bridge-helper,br=virbr0,id=hostnet0
-device megasas,id=scsi0,bus=pcie.1,addr=0x0
-drive file=$disk,if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=none
-device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,id=scsi0-0-0-0,bootindex=2
If more are needed, include a bridge.
Multi chip is supported, each chip adding its set of PHB4 controllers
and its PCI busses. The model doesn't emulate the EEH error handling.
This model is not ready for hotplug yet.
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[ clg: - numerous cleanups
- commit log
- fix for broken LSI support
- PHB pic printinfo
- large QOM rework ]
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Message-Id: <20200127144506.11132-2-clg@kaod.org>
[dwg: Use device_class_set_props()]
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
2020-01-27 17:45:05 +03:00
|
|
|
DeviceReset parent_reset;
|
2017-01-23 22:20:18 +03:00
|
|
|
|
|
|
|
uint8_t (*aer_vector)(const PCIDevice *dev);
|
|
|
|
int (*interrupts_init)(PCIDevice *dev, Error **errp);
|
|
|
|
void (*interrupts_uninit)(PCIDevice *dev);
|
|
|
|
|
|
|
|
int exp_offset;
|
|
|
|
int aer_offset;
|
|
|
|
int ssvid_offset;
|
2019-02-21 21:13:23 +03:00
|
|
|
int acs_offset; /* If nonzero, optional ACS capability offset */
|
2017-01-23 22:20:18 +03:00
|
|
|
int ssid;
|
2020-09-03 23:43:22 +03:00
|
|
|
};
|
2017-01-23 22:20:18 +03:00
|
|
|
|
2010-10-20 12:18:52 +04:00
|
|
|
#endif /* QEMU_PCIE_PORT_H */
|