diff options
| author | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2018-07-16 09:03:51 +0000 |
|---|---|---|
| committer | Patrick Mooney <pmooney@pfmooney.com> | 2020-05-22 14:27:14 +0000 |
| commit | eb9a1df2aeb866bf1de4494433b6d7e5fa07b3ae (patch) | |
| tree | f9cc894879d944a84aa3e16bfabc9e16a4fcaf6b /usr/src/lib/libvmmapi | |
| parent | 3c5f2a9de9c6554ce899ad4ebf7978ea7293994a (diff) | |
| download | illumos-joyent-eb9a1df2aeb866bf1de4494433b6d7e5fa07b3ae.tar.gz | |
12680 want PCI pass-thru in bhyve
Portions contributed by: Patrick Mooney <patrick.mooney@joyent.com>
Portions contributed by: John Levon <john.levon@joyent.com>
Portions contributed by: Andy Fiddaman <omnios@citrus-it.co.uk>
Reviewed by: Patrick Mooney <pmooney@oxide.computer>
Approved by: Dan McDonald <danmcd@joyent.com>
Diffstat (limited to 'usr/src/lib/libvmmapi')
| -rw-r--r-- | usr/src/lib/libvmmapi/common/mapfile-vers | 1 | ||||
| -rw-r--r-- | usr/src/lib/libvmmapi/common/vmmapi.c | 100 | ||||
| -rw-r--r-- | usr/src/lib/libvmmapi/common/vmmapi.h | 15 |
3 files changed, 115 insertions, 1 deletions
diff --git a/usr/src/lib/libvmmapi/common/mapfile-vers b/usr/src/lib/libvmmapi/common/mapfile-vers index a64231ad1c..397ebd7d59 100644 --- a/usr/src/lib/libvmmapi/common/mapfile-vers +++ b/usr/src/lib/libvmmapi/common/mapfile-vers @@ -61,6 +61,7 @@ SYMBOL_VERSION ILLUMOSprivate { vm_get_lowmem_size; vm_get_memflags; vm_get_memseg; + vm_get_pptdev_limits; vm_get_register; vm_get_register_set; vm_get_seg_desc; diff --git a/usr/src/lib/libvmmapi/common/vmmapi.c b/usr/src/lib/libvmmapi/common/vmmapi.c index 0b9b871081..ceac495746 100644 --- a/usr/src/lib/libvmmapi/common/vmmapi.c +++ b/usr/src/lib/libvmmapi/common/vmmapi.c @@ -995,6 +995,7 @@ vm_set_capability(struct vmctx *ctx, int vcpu, enum vm_cap_type cap, int val) return (ioctl(ctx->fd, VM_SET_CAPABILITY, &vmcap)); } +#ifdef __FreeBSD__ int vm_assign_pptdev(struct vmctx *ctx, int bus, int slot, int func) { @@ -1056,7 +1057,7 @@ vm_setup_pptdev_msi(struct vmctx *ctx, int vcpu, int bus, int slot, int func, return (ioctl(ctx->fd, VM_PPTDEV_MSI, &pptmsi)); } -int +int vm_setup_pptdev_msix(struct vmctx *ctx, int vcpu, int bus, int slot, int func, int idx, uint64_t addr, uint64_t msg, uint32_t vector_control) { @@ -1075,6 +1076,103 @@ vm_setup_pptdev_msix(struct vmctx *ctx, int vcpu, int bus, int slot, int func, return ioctl(ctx->fd, VM_PPTDEV_MSIX, &pptmsix); } +int +vm_get_pptdev_limits(struct vmctx *ctx, int bus, int slot, int func, + int *msi_limit, int *msix_limit) +{ + struct vm_pptdev_limits pptlimits; + int error; + + bzero(&pptlimits, sizeof (pptlimits)); + pptlimits.bus = bus; + pptlimits.slot = slot; + pptlimits.func = func; + + error = ioctl(ctx->fd, VM_GET_PPTDEV_LIMITS, &pptlimits); + + *msi_limit = pptlimits.msi_limit; + *msix_limit = pptlimits.msix_limit; + + return (error); +} +#else /* __FreeBSD__ */ +int +vm_assign_pptdev(struct vmctx *ctx, int pptfd) +{ + struct vm_pptdev pptdev; + + pptdev.pptfd = pptfd; + return (ioctl(ctx->fd, VM_BIND_PPTDEV, &pptdev)); +} + +int +vm_unassign_pptdev(struct vmctx *ctx, int pptfd) +{ + struct vm_pptdev pptdev; + + pptdev.pptfd = pptfd; + return (ioctl(ctx->fd, VM_UNBIND_PPTDEV, &pptdev)); +} + +int +vm_map_pptdev_mmio(struct vmctx *ctx, int pptfd, vm_paddr_t gpa, size_t len, + vm_paddr_t hpa) +{ + struct vm_pptdev_mmio pptmmio; + + pptmmio.pptfd = pptfd; + pptmmio.gpa = gpa; + pptmmio.len = len; + pptmmio.hpa = hpa; + return (ioctl(ctx->fd, VM_MAP_PPTDEV_MMIO, &pptmmio)); +} + +int +vm_setup_pptdev_msi(struct vmctx *ctx, int vcpu, int pptfd, uint64_t addr, + uint64_t msg, int numvec) +{ + struct vm_pptdev_msi pptmsi; + + pptmsi.vcpu = vcpu; + pptmsi.pptfd = pptfd; + pptmsi.msg = msg; + pptmsi.addr = addr; + pptmsi.numvec = numvec; + return (ioctl(ctx->fd, VM_PPTDEV_MSI, &pptmsi)); +} + +int +vm_setup_pptdev_msix(struct vmctx *ctx, int vcpu, int pptfd, int idx, + uint64_t addr, uint64_t msg, uint32_t vector_control) +{ + struct vm_pptdev_msix pptmsix; + + pptmsix.vcpu = vcpu; + pptmsix.pptfd = pptfd; + pptmsix.idx = idx; + pptmsix.msg = msg; + pptmsix.addr = addr; + pptmsix.vector_control = vector_control; + return ioctl(ctx->fd, VM_PPTDEV_MSIX, &pptmsix); +} + +int +vm_get_pptdev_limits(struct vmctx *ctx, int pptfd, int *msi_limit, + int *msix_limit) +{ + struct vm_pptdev_limits pptlimits; + int error; + + bzero(&pptlimits, sizeof (pptlimits)); + pptlimits.pptfd = pptfd; + error = ioctl(ctx->fd, VM_GET_PPTDEV_LIMITS, &pptlimits); + + *msi_limit = pptlimits.msi_limit; + *msix_limit = pptlimits.msix_limit; + return (error); +} +#endif /* __FreeBSD__ */ + uint64_t * vm_get_stats(struct vmctx *ctx, int vcpu, struct timeval *ret_tv, int *ret_entries) diff --git a/usr/src/lib/libvmmapi/common/vmmapi.h b/usr/src/lib/libvmmapi/common/vmmapi.h index a1507255cb..1b08a9cae5 100644 --- a/usr/src/lib/libvmmapi/common/vmmapi.h +++ b/usr/src/lib/libvmmapi/common/vmmapi.h @@ -177,6 +177,7 @@ int vm_get_capability(struct vmctx *ctx, int vcpu, enum vm_cap_type cap, int *retval); int vm_set_capability(struct vmctx *ctx, int vcpu, enum vm_cap_type cap, int val); +#ifdef __FreeBSD__ int vm_assign_pptdev(struct vmctx *ctx, int bus, int slot, int func); int vm_unassign_pptdev(struct vmctx *ctx, int bus, int slot, int func); int vm_map_pptdev_mmio(struct vmctx *ctx, int bus, int slot, int func, @@ -186,6 +187,20 @@ int vm_setup_pptdev_msi(struct vmctx *ctx, int vcpu, int bus, int slot, int vm_setup_pptdev_msix(struct vmctx *ctx, int vcpu, int bus, int slot, int func, int idx, uint64_t addr, uint64_t msg, uint32_t vector_control); +int vm_get_pptdev_limits(struct vmctx *ctx, int bus, int slot, int func, + int *msi_limit, int *msix_limit); +#else /* __FreeBSD__ */ +int vm_assign_pptdev(struct vmctx *ctx, int pptfd); +int vm_unassign_pptdev(struct vmctx *ctx, int pptfd); +int vm_map_pptdev_mmio(struct vmctx *ctx, int pptfd, vm_paddr_t gpa, + size_t len, vm_paddr_t hpa); +int vm_setup_pptdev_msi(struct vmctx *ctx, int vcpu, int pptfd, + uint64_t addr, uint64_t msg, int numvec); +int vm_setup_pptdev_msix(struct vmctx *ctx, int vcpu, int pptfd, + int idx, uint64_t addr, uint64_t msg, uint32_t vector_control); +int vm_get_pptdev_limits(struct vmctx *ctx, int pptfd, int *msi_limit, + int *msix_limit); +#endif /* __FreeBSD__ */ int vm_get_intinfo(struct vmctx *ctx, int vcpu, uint64_t *i1, uint64_t *i2); int vm_set_intinfo(struct vmctx *ctx, int vcpu, uint64_t exit_intinfo); |
