From nobody Thu Mar 10 11:31:51 2022 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id AE72B19FBC5C; Thu, 10 Mar 2022 11:31:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KDn2v4Vtlz4vWb; Thu, 10 Mar 2022 11:31:51 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646911911; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=XrMEmDGni22HhLRJZ+urQtp0AOs/pvAiN5a15sm7RlI=; b=N8db3Ki+BFUea1Ge9EnB4oyujwd7sHdYHbBnH9143DwHzNULxQH4cwk2sFRcoc6uun7KAu UzDwDIwFvdVuj9IsXM0mr0zn4Vw0XdGYA4wxnd68DyAZwYn46qMNSTkbzVkNS6dJoKIKVV XoOm/xUYuuyGh+0l5mWux/kOhJhwDJhljHclc6viCi8ZBv2kWw/3csrjivbJDaV2oxIiH2 wyVMuPJAQRNyZqAx3zuadqhewArkP+4jE2W/h83ByZk6DMOG+78PpV/Q4fBFDdkJl6ZMf5 PnQ1CYCzJpEtHvZ+bqoMnBrGuknprfi1RC54Gtp6a7ASEkOA6i7f5Nv8JdRaIQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 7B2002431F; Thu, 10 Mar 2022 11:31:51 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 22ABVpZX044559; Thu, 10 Mar 2022 11:31:51 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 22ABVpkP044558; Thu, 10 Mar 2022 11:31:51 GMT (envelope-from git) Date: Thu, 10 Mar 2022 11:31:51 GMT Message-Id: <202203101131.22ABVpkP044558@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Emmanuel Vadot Subject: git: 563fd2240e13 - main - bhyve: export funcs for read/write pci config List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-main@freebsd.org X-BeenThere: dev-commits-src-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: manu X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 563fd2240e13cfb53f6e5d50e9d1dc738b7c441e Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1646911911; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=XrMEmDGni22HhLRJZ+urQtp0AOs/pvAiN5a15sm7RlI=; b=gzSFKTWYQPHg1XA6sYhxZXa/ridMpWMqO9poxuj3HXZa+ZNssIByjvSjLzlKMEKUfxJg0z TTGwFKWjhbba6EaqucJqFVR0WUE17pEC6BsoAJkSx7K7w0krDXzsNh0a3b65T/5KioVEOF P7eeD/0/XnBscD0nSysFolhRexqE9aWKfANgLUiswUVND4fFdQHKhAQcIf5xu4bylbCdyu HA2eEk+P3InhBGUBpizoBMSzsDPrZRM1QG1q5ntGYb1RfimhNNIhlTcStUwzMOd8kC9Br2 CvzgmAV/y6spFBW+dVLsY2Hkt4d5y72TW3MBqISCEc3CCfajO9FQL1+ycluuWg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1646911911; a=rsa-sha256; cv=none; b=GsBzLF23oqoPgSUiew2/3xSD1ZW/dSG6esoizUGVBHZC2tqhF5O/GxIl2z6C95DstHw8kl TUXYuN9i3r9KW9UfKRK2lkURVfKAfZ0UCrfah8VUauWRrvk0OJlNprOj6bw3FlLfX7hG2H 7yox7TZCKJ5zDPn48IwsKVkKQ6egtngGOVijaIgVuH6D3MQzreOa9QGdCFQZc3eGb0l16c +iDwyQaccBc92CDfggmPLvtDAxEqDGMdRC3b51VnBNz4kymvqO/29OsSlROKMtmNW3I8gC EFgvlE2Fi3113Tq359UNlRpCy8+snNtvh/fEZ9dzA0/XefBqqLOiAojXkg9/jg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by manu: URL: https://cgit.FreeBSD.org/src/commit/?id=563fd2240e13cfb53f6e5d50e9d1dc738b7c441e commit 563fd2240e13cfb53f6e5d50e9d1dc738b7c441e Author: Corvin Köhne AuthorDate: 2022-03-10 10:26:19 +0000 Commit: Emmanuel Vadot CommitDate: 2022-03-10 11:30:02 +0000 bhyve: export funcs for read/write pci config Export functions for reading and writing the pci config space from passthru device to be used by other devices. This is required for lpc devices to set their vendor/device ids to their physical values. Otherwise, GPU passthrough for integrated Intel GPUs won't work properly. Differential Revision: https://reviews.freebsd.org/D33769 Reviewed by: markj Sponsored by: Beckhoff Automation GmbH & Co. KG MFC after: 1 month --- usr.sbin/bhyve/pci_passthru.c | 62 +++++++++++++++++++++++++------------------ usr.sbin/bhyve/pci_passthru.h | 15 +++++++++++ 2 files changed, 51 insertions(+), 26 deletions(-) diff --git a/usr.sbin/bhyve/pci_passthru.c b/usr.sbin/bhyve/pci_passthru.c index 725ae4fbdb91..fdc0c38ef0c7 100644 --- a/usr.sbin/bhyve/pci_passthru.c +++ b/usr.sbin/bhyve/pci_passthru.c @@ -61,12 +61,11 @@ __FBSDID("$FreeBSD$"); #include #include -#include #include "config.h" #include "debug.h" -#include "pci_emul.h" #include "mem.h" +#include "pci_passthru.h" #ifndef _PATH_DEVPCI #define _PATH_DEVPCI "/dev/pci" @@ -115,9 +114,36 @@ msi_caplen(int msgctrl) return (len); } -static uint32_t +static int +pcifd_init() { + pcifd = open(_PATH_DEVPCI, O_RDWR, 0); + if (pcifd < 0) { + warn("failed to open %s", _PATH_DEVPCI); + return (1); + } + +#ifndef WITHOUT_CAPSICUM + cap_rights_t pcifd_rights; + cap_rights_init(&pcifd_rights, CAP_IOCTL, CAP_READ, CAP_WRITE); + if (caph_rights_limit(pcifd, &pcifd_rights) == -1) + errx(EX_OSERR, "Unable to apply rights for sandbox"); + + const cap_ioctl_t pcifd_ioctls[] = { PCIOCREAD, PCIOCWRITE, PCIOCGETBAR, + PCIOCBARIO, PCIOCBARMMAP }; + if (caph_ioctls_limit(pcifd, pcifd_ioctls, nitems(pcifd_ioctls)) == -1) + errx(EX_OSERR, "Unable to apply rights for sandbox"); +#endif + + return (0); +} + +uint32_t read_config(const struct pcisel *sel, long reg, int width) { + if (pcifd < 0 && pcifd_init()) { + return (0); + } + struct pci_io pi; bzero(&pi, sizeof(pi)); @@ -131,9 +157,13 @@ read_config(const struct pcisel *sel, long reg, int width) return (pi.pi_data); } -static void +void write_config(const struct pcisel *sel, long reg, int width, uint32_t data) { + if (pcifd < 0 && pcifd_init()) { + return; + } + struct pci_io pi; bzero(&pi, sizeof(pi)); @@ -638,40 +668,20 @@ passthru_init(struct vmctx *ctx, struct pci_devinst *pi, nvlist_t *nvl) int bus, slot, func, error, memflags; struct passthru_softc *sc; const char *value; -#ifndef WITHOUT_CAPSICUM - cap_rights_t rights; - cap_ioctl_t pci_ioctls[] = - { PCIOCREAD, PCIOCWRITE, PCIOCGETBAR, PCIOCBARIO, PCIOCBARMMAP }; -#endif sc = NULL; error = 1; -#ifndef WITHOUT_CAPSICUM - cap_rights_init(&rights, CAP_IOCTL, CAP_READ, CAP_WRITE); -#endif - memflags = vm_get_memflags(ctx); if (!(memflags & VM_MEM_F_WIRED)) { warnx("passthru requires guest memory to be wired"); return (error); } - if (pcifd < 0) { - pcifd = open(_PATH_DEVPCI, O_RDWR, 0); - if (pcifd < 0) { - warn("failed to open %s", _PATH_DEVPCI); - return (error); - } + if (pcifd < 0 && pcifd_init()) { + return (error); } -#ifndef WITHOUT_CAPSICUM - if (caph_rights_limit(pcifd, &rights) == -1) - errx(EX_OSERR, "Unable to apply rights for sandbox"); - if (caph_ioctls_limit(pcifd, pci_ioctls, nitems(pci_ioctls)) == -1) - errx(EX_OSERR, "Unable to apply rights for sandbox"); -#endif - #define GET_INT_CONFIG(var, name) do { \ value = get_config_value_node(nvl, name); \ if (value == NULL) { \ diff --git a/usr.sbin/bhyve/pci_passthru.h b/usr.sbin/bhyve/pci_passthru.h new file mode 100644 index 000000000000..bdc8dc3cd0e2 --- /dev/null +++ b/usr.sbin/bhyve/pci_passthru.h @@ -0,0 +1,15 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2020 Beckhoff Automation GmbH & Co. KG + * Author: Corvin Köhne + */ + +#pragma once + +#include + +#include "pci_emul.h" + +uint32_t read_config(const struct pcisel *sel, long reg, int width); +void write_config(const struct pcisel *sel, long reg, int width, uint32_t data);