Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102553053
D40040.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D40040.diff
View Options
diff --git a/usr.sbin/bhyve/pci_gvt-d.c b/usr.sbin/bhyve/pci_gvt-d.c
--- a/usr.sbin/bhyve/pci_gvt-d.c
+++ b/usr.sbin/bhyve/pci_gvt-d.c
@@ -6,12 +6,16 @@
*/
#include <sys/types.h>
+#include <sys/mman.h>
#include <sys/sysctl.h>
#include <dev/pci/pcireg.h>
#include <err.h>
#include <errno.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
#include "e820.h"
#include "pci_gvt-d-opregion.h"
@@ -21,14 +25,20 @@
#define MB (1024 * KB)
#define GB (1024 * MB)
+#ifndef _PATH_MEM
+#define _PATH_MEM "/dev/mem"
+#endif
+
#define PCI_VENDOR_INTEL 0x8086
-#define PCIR_BDSM 0x5C /* Base of Data Stolen Memory register */
+#define PCIR_BDSM 0x5C /* Base of Data Stolen Memory register */
+#define PCIR_ASLS_CTL 0xFC /* Opregion start address register */
#define PCIM_BDSM_GSM_ALIGNMENT \
0x00100000 /* Graphics Stolen Memory is 1 MB aligned */
#define GVT_D_MAP_GSM 0
+#define GVT_D_MAP_OPREGION 1
static int
gvt_d_probe(struct pci_devinst *const pi)
@@ -167,6 +177,56 @@
passthru_cfgwrite_emulate));
}
+static int
+gvt_d_setup_opregion(struct pci_devinst *const pi)
+{
+ struct passthru_softc *sc;
+ struct passthru_mmio_mapping *opregion;
+ struct igd_opregion_header *header;
+ uint64_t asls;
+ int memfd;
+
+ sc = pi->pi_arg;
+
+ memfd = open(_PATH_MEM, O_RDONLY, 0);
+ if (memfd < 0) {
+ warn("%s: Failed to open %s", __func__, _PATH_MEM);
+ return (-1);
+ }
+
+ opregion = passthru_get_mmio(sc, GVT_D_MAP_OPREGION);
+ if (opregion == NULL) {
+ warnx("%s: Unable to access opregion", __func__);
+ close(memfd);
+ return (-1);
+ }
+
+ asls = read_config(passthru_get_sel(sc), PCIR_ASLS_CTL, 4);
+
+ header = mmap(NULL, sizeof(*header), PROT_READ, MAP_SHARED, memfd,
+ asls);
+ if (header == MAP_FAILED) {
+ warn("%s: Unable to map OpRegion header", __func__);
+ close(memfd);
+ return (-1);
+ }
+ if (memcmp(header->sign, IGD_OPREGION_HEADER_SIGN,
+ sizeof(header->sign)) != 0) {
+ warnx("%s: Invalid OpRegion signature", __func__);
+ munmap(header, sizeof(*header));
+ close(memfd);
+ return (-1);
+ }
+
+ opregion->hpa = asls;
+ opregion->len = header->size * KB;
+ munmap(header, sizeof(header));
+
+ close(memfd);
+
+ return (0);
+}
+
static int
gvt_d_init(struct pci_devinst *const pi, nvlist_t *const nvl __unused)
{
@@ -177,6 +237,11 @@
goto done;
}
+ if ((error = gvt_d_setup_opregion(pi)) != 0) {
+ warnx("%s: Unable to setup OpRegion", __func__);
+ goto done;
+ }
+
done:
return (error);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Nov 14, 11:25 PM (8 h, 58 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14635175
Default Alt Text
D40040.diff (2 KB)
Attached To
Mode
D40040: bhyve: read OpRegion address and size for GVT-d
Attached
Detach File
Event Timeline
Log In to Comment