summaryrefslogtreecommitdiffstats
path: root/usr.sbin/bhyve/pci_emul.h
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2014-07-19 20:13:01 +0000
committerjhb <jhb@FreeBSD.org>2014-07-19 20:13:01 +0000
commitba55949ac368dc3605b73d26161b12730d968366 (patch)
tree14ce13f86ce1c95121b57eb76e4eff1c81e7c80e /usr.sbin/bhyve/pci_emul.h
parent86c94c699f2cd2707dc9074cbcd07956fe44394b (diff)
downloadFreeBSD-src-ba55949ac368dc3605b73d26161b12730d968366.zip
FreeBSD-src-ba55949ac368dc3605b73d26161b12730d968366.tar.gz
MFC 261904,261905,262143,262184,264921,265211,267169,267292,267294:
Various PCI fixes: - Allow PCI devices to be configured on all valid bus numbers from 0 to 255. - Tweak the handling of PCI capabilities in emulated devices to remove the non-standard zero capability list terminator. - Add a check to validate that memory BARs of passthru devices are 4KB aligned. - Respect and track the enable bit in the PCI configuration address word. - Handle quad-word access to 32-bit register pairs.
Diffstat (limited to 'usr.sbin/bhyve/pci_emul.h')
-rw-r--r--usr.sbin/bhyve/pci_emul.h18
1 files changed, 10 insertions, 8 deletions
diff --git a/usr.sbin/bhyve/pci_emul.h b/usr.sbin/bhyve/pci_emul.h
index 480b631..e1040a8 100644
--- a/usr.sbin/bhyve/pci_emul.h
+++ b/usr.sbin/bhyve/pci_emul.h
@@ -39,7 +39,6 @@
#include <assert.h>
#define PCI_BARMAX PCIR_MAX_BAR_0 /* BAR registers in a Type 0 header */
-#define PCIY_RESERVED 0x00
struct vmctx;
struct pci_devinst;
@@ -101,7 +100,7 @@ struct msix_table_entry {
*/
#define MSIX_TABLE_ENTRY_SIZE 16
#define MAX_MSIX_TABLE_ENTRIES 2048
-#define PBA_TABLE_ENTRY_SIZE 8
+#define PBA_SIZE(msgnum) (roundup2((msgnum), 64) / 8)
enum lintr_stat {
IDLE,
@@ -115,6 +114,8 @@ struct pci_devinst {
uint8_t pi_bus, pi_slot, pi_func;
char pi_name[PI_NAMESZ];
int pi_bar_getsize;
+ int pi_prevcap;
+ int pi_capend;
struct {
int8_t pin;
@@ -134,10 +135,10 @@ struct pci_devinst {
int enabled;
int table_bar;
int pba_bar;
- size_t table_offset;
+ uint32_t table_offset;
int table_count;
- size_t pba_offset;
- size_t pba_size;
+ uint32_t pba_offset;
+ int pba_size;
int function_mask;
struct msix_table_entry *table; /* allocated at runtime */
} pi_msix;
@@ -199,7 +200,7 @@ struct pciecap {
uint16_t slot_status2;
} __packed;
-typedef void (*pci_lintr_cb)(int slot, int pin, int ioapic_irq, void *arg);
+typedef void (*pci_lintr_cb)(int b, int s, int pin, int ioapic_irq, void *arg);
int init_pci(struct vmctx *ctx);
void msicap_cfgwrite(struct pci_devinst *pi, int capoff, int offset,
@@ -229,9 +230,10 @@ int pci_emul_add_msixcap(struct pci_devinst *pi, int msgnum, int barnum);
int pci_emul_msix_twrite(struct pci_devinst *pi, uint64_t offset, int size,
uint64_t value);
uint64_t pci_emul_msix_tread(struct pci_devinst *pi, uint64_t offset, int size);
-int pci_count_lintr(void);
-void pci_walk_lintr(pci_lintr_cb cb, void *arg);
+int pci_count_lintr(int bus);
+void pci_walk_lintr(int bus, pci_lintr_cb cb, void *arg);
void pci_write_dsdt(void);
+int pci_bus_configured(int bus);
static __inline void
pci_set_cfgdata8(struct pci_devinst *pi, int offset, uint8_t val)
OpenPOWER on IntegriCloud