|
|
bde9c9 |
From a35645ca4985b8fdd4f4d8c4d87ae05001061c53 Mon Sep 17 00:00:00 2001
|
|
|
bde9c9 |
From: =?UTF-8?q?Volker=20R=C3=BCmelin?= <vr_qemu@t-online.de>
|
|
|
bde9c9 |
Date: Sat, 2 Apr 2022 20:28:38 +0200
|
|
|
bde9c9 |
Subject: [PATCH 2/3] pci: refactor the pci_config_*() functions
|
|
|
bde9c9 |
MIME-Version: 1.0
|
|
|
bde9c9 |
Content-Type: text/plain; charset=UTF-8
|
|
|
bde9c9 |
Content-Transfer-Encoding: 8bit
|
|
|
bde9c9 |
|
|
|
bde9c9 |
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
bde9c9 |
RH-MergeRequest: 7: pci: fix reset for q35 and tcg
|
|
|
bde9c9 |
RH-Commit: [1/2] 7607f8f3296435a2884902f650ce060c6be07bd1
|
|
|
bde9c9 |
RH-Bugzilla: 2083884
|
|
|
bde9c9 |
RH-Acked-by: Pawel Polawski <ppolawsk@redhat.com>
|
|
|
bde9c9 |
RH-Acked-by: Oliver Steffen <osteffen@redhat.com>
|
|
|
bde9c9 |
RH-Acked-by: Igor Mammedov <imammedo@redhat.com>
|
|
|
bde9c9 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
bde9c9 |
|
|
|
bde9c9 |
Split out the Standard PCI Configuration Access Mechanism
|
|
|
bde9c9 |
pci_ioconfig_*() functions from the pci_config_*() functions.
|
|
|
bde9c9 |
The standard PCI CAM functions will be used in the next patch.
|
|
|
bde9c9 |
|
|
|
bde9c9 |
Reviewed-by: Gerd Hoffmann <kraxel@redhat.com>
|
|
|
bde9c9 |
Signed-off-by: Volker RĂ¼melin <vr_qemu@t-online.de>
|
|
|
bde9c9 |
(cherry picked from commit d24f42b0d819ea473ae05b2f955b822d0126d901)
|
|
|
bde9c9 |
---
|
|
|
bde9c9 |
src/hw/pci.c | 54 ++++++++++++++++++++++++++++++++++++++++------------
|
|
|
bde9c9 |
src/hw/pci.h | 12 +++++++++++-
|
|
|
bde9c9 |
2 files changed, 53 insertions(+), 13 deletions(-)
|
|
|
bde9c9 |
|
|
|
bde9c9 |
diff --git a/src/hw/pci.c b/src/hw/pci.c
|
|
|
bde9c9 |
index 3df1dae4..f13cbdea 100644
|
|
|
bde9c9 |
--- a/src/hw/pci.c
|
|
|
bde9c9 |
+++ b/src/hw/pci.c
|
|
|
bde9c9 |
@@ -26,63 +26,93 @@ static u32 ioconfig_cmd(u16 bdf, u32 addr)
|
|
|
bde9c9 |
return 0x80000000 | (bdf << 8) | (addr & 0xfc);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+void pci_ioconfig_writel(u16 bdf, u32 addr, u32 val)
|
|
|
bde9c9 |
+{
|
|
|
bde9c9 |
+ outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
+ outl(val, PORT_PCI_DATA);
|
|
|
bde9c9 |
+}
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
void pci_config_writel(u16 bdf, u32 addr, u32 val)
|
|
|
bde9c9 |
{
|
|
|
bde9c9 |
if (!MODESEGMENT && mmconfig) {
|
|
|
bde9c9 |
writel(mmconfig_addr(bdf, addr), val);
|
|
|
bde9c9 |
} else {
|
|
|
bde9c9 |
- outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
- outl(val, PORT_PCI_DATA);
|
|
|
bde9c9 |
+ pci_ioconfig_writel(bdf, addr, val);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+void pci_ioconfig_writew(u16 bdf, u32 addr, u16 val)
|
|
|
bde9c9 |
+{
|
|
|
bde9c9 |
+ outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
+ outw(val, PORT_PCI_DATA + (addr & 2));
|
|
|
bde9c9 |
+}
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
void pci_config_writew(u16 bdf, u32 addr, u16 val)
|
|
|
bde9c9 |
{
|
|
|
bde9c9 |
if (!MODESEGMENT && mmconfig) {
|
|
|
bde9c9 |
writew(mmconfig_addr(bdf, addr), val);
|
|
|
bde9c9 |
} else {
|
|
|
bde9c9 |
- outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
- outw(val, PORT_PCI_DATA + (addr & 2));
|
|
|
bde9c9 |
+ pci_ioconfig_writew(bdf, addr, val);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+void pci_ioconfig_writeb(u16 bdf, u32 addr, u8 val)
|
|
|
bde9c9 |
+{
|
|
|
bde9c9 |
+ outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
+ outb(val, PORT_PCI_DATA + (addr & 3));
|
|
|
bde9c9 |
+}
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
void pci_config_writeb(u16 bdf, u32 addr, u8 val)
|
|
|
bde9c9 |
{
|
|
|
bde9c9 |
if (!MODESEGMENT && mmconfig) {
|
|
|
bde9c9 |
writeb(mmconfig_addr(bdf, addr), val);
|
|
|
bde9c9 |
} else {
|
|
|
bde9c9 |
- outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
- outb(val, PORT_PCI_DATA + (addr & 3));
|
|
|
bde9c9 |
+ pci_ioconfig_writeb(bdf, addr, val);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+u32 pci_ioconfig_readl(u16 bdf, u32 addr)
|
|
|
bde9c9 |
+{
|
|
|
bde9c9 |
+ outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
+ return inl(PORT_PCI_DATA);
|
|
|
bde9c9 |
+}
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
u32 pci_config_readl(u16 bdf, u32 addr)
|
|
|
bde9c9 |
{
|
|
|
bde9c9 |
if (!MODESEGMENT && mmconfig) {
|
|
|
bde9c9 |
return readl(mmconfig_addr(bdf, addr));
|
|
|
bde9c9 |
} else {
|
|
|
bde9c9 |
- outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
- return inl(PORT_PCI_DATA);
|
|
|
bde9c9 |
+ return pci_ioconfig_readl(bdf, addr);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+u16 pci_ioconfig_readw(u16 bdf, u32 addr)
|
|
|
bde9c9 |
+{
|
|
|
bde9c9 |
+ outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
+ return inw(PORT_PCI_DATA + (addr & 2));
|
|
|
bde9c9 |
+}
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
u16 pci_config_readw(u16 bdf, u32 addr)
|
|
|
bde9c9 |
{
|
|
|
bde9c9 |
if (!MODESEGMENT && mmconfig) {
|
|
|
bde9c9 |
return readw(mmconfig_addr(bdf, addr));
|
|
|
bde9c9 |
} else {
|
|
|
bde9c9 |
- outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
- return inw(PORT_PCI_DATA + (addr & 2));
|
|
|
bde9c9 |
+ return pci_ioconfig_readw(bdf, addr);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+u8 pci_ioconfig_readb(u16 bdf, u32 addr)
|
|
|
bde9c9 |
+{
|
|
|
bde9c9 |
+ outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
+ return inb(PORT_PCI_DATA + (addr & 3));
|
|
|
bde9c9 |
+}
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
u8 pci_config_readb(u16 bdf, u32 addr)
|
|
|
bde9c9 |
{
|
|
|
bde9c9 |
if (!MODESEGMENT && mmconfig) {
|
|
|
bde9c9 |
return readb(mmconfig_addr(bdf, addr));
|
|
|
bde9c9 |
} else {
|
|
|
bde9c9 |
- outl(ioconfig_cmd(bdf, addr), PORT_PCI_CMD);
|
|
|
bde9c9 |
- return inb(PORT_PCI_DATA + (addr & 3));
|
|
|
bde9c9 |
+ return pci_ioconfig_readb(bdf, addr);
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
}
|
|
|
bde9c9 |
|
|
|
bde9c9 |
diff --git a/src/hw/pci.h b/src/hw/pci.h
|
|
|
bde9c9 |
index 01c51f70..ee6acafc 100644
|
|
|
bde9c9 |
--- a/src/hw/pci.h
|
|
|
bde9c9 |
+++ b/src/hw/pci.h
|
|
|
bde9c9 |
@@ -32,6 +32,15 @@ static inline u16 pci_bus_devfn_to_bdf(int bus, u16 devfn) {
|
|
|
bde9c9 |
; BDF >= 0 \
|
|
|
bde9c9 |
; BDF=pci_next(BDF, (BUS)))
|
|
|
bde9c9 |
|
|
|
bde9c9 |
+// standard PCI configration access mechanism
|
|
|
bde9c9 |
+void pci_ioconfig_writel(u16 bdf, u32 addr, u32 val);
|
|
|
bde9c9 |
+void pci_ioconfig_writew(u16 bdf, u32 addr, u16 val);
|
|
|
bde9c9 |
+void pci_ioconfig_writeb(u16 bdf, u32 addr, u8 val);
|
|
|
bde9c9 |
+u32 pci_ioconfig_readl(u16 bdf, u32 addr);
|
|
|
bde9c9 |
+u16 pci_ioconfig_readw(u16 bdf, u32 addr);
|
|
|
bde9c9 |
+u8 pci_ioconfig_readb(u16 bdf, u32 addr);
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
+// PCI configuration access using either PCI CAM or PCIe ECAM
|
|
|
bde9c9 |
void pci_config_writel(u16 bdf, u32 addr, u32 val);
|
|
|
bde9c9 |
void pci_config_writew(u16 bdf, u32 addr, u16 val);
|
|
|
bde9c9 |
void pci_config_writeb(u16 bdf, u32 addr, u8 val);
|
|
|
bde9c9 |
@@ -39,9 +48,10 @@ u32 pci_config_readl(u16 bdf, u32 addr);
|
|
|
bde9c9 |
u16 pci_config_readw(u16 bdf, u32 addr);
|
|
|
bde9c9 |
u8 pci_config_readb(u16 bdf, u32 addr);
|
|
|
bde9c9 |
void pci_config_maskw(u16 bdf, u32 addr, u16 off, u16 on);
|
|
|
bde9c9 |
-void pci_enable_mmconfig(u64 addr, const char *name);
|
|
|
bde9c9 |
u8 pci_find_capability(u16 bdf, u8 cap_id, u8 cap);
|
|
|
bde9c9 |
int pci_next(int bdf, int bus);
|
|
|
bde9c9 |
+
|
|
|
bde9c9 |
+void pci_enable_mmconfig(u64 addr, const char *name);
|
|
|
bde9c9 |
int pci_probe_host(void);
|
|
|
bde9c9 |
void pci_reboot(void);
|
|
|
bde9c9 |
|
|
|
bde9c9 |
--
|
|
|
bde9c9 |
2.35.3
|
|
|
bde9c9 |
|