From nobody Mon Mar 27 08:11:41 2023 X-Original-To: dev-commits-src-all@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 4PlQWd61n7z41wmF; Mon, 27 Mar 2023 08:11:41 +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 4PlQWd59MYz48kt; Mon, 27 Mar 2023 08:11:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1679904701; 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=RgvGEe1IG2g8XN7vFNscYUEPITZJ7uPKOkk+MclYOEs=; b=pQWjbI2NXXMJAPF2vNlKV/ibvnYYXMb9XuVSo8fDVH6AicZSIxlabDGs8h4gTjdaAR2T1N bLQr+N6xzAojPr5hHeARo3DvSoThRbSM/6qeZ55uTHhx/IVARtqNxsOA8Xo8K5HTk1lU7c Sfn5XNjuDrKsQNqin7ePIbJZyzSSw0cYSmcrqvd/GXEnDdNcJ7O0mjKl/8juF11WN6sTpt zMb3dQP92FYBf+AYDWT4neikA2f80ofaU5ePx3SSrr0JME95ZHpj+SwvFMAgVwcoMFvNn8 Hyb4s5S9VSVS8cGEulnOJWPwjJCGakOp8O08hTUG9kbPzDD2CwjRg8yonnYdrw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1679904701; 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=RgvGEe1IG2g8XN7vFNscYUEPITZJ7uPKOkk+MclYOEs=; b=fhLZ/MER4kJqxDNO166i7RGYAMzt8lSqw7VcpjzslYzEjJBo+uHMTl6kg+JFwU3l5p2N3n l65d6RPkBdUV603tADo2r+vz97tipF7GEIPtrYqx2vsD2LPbZgNFGpjCWvl6PxpyHHvWW0 iK87KtrYJqcWXJraygNTBfwFN+rgPsDnMNq8BO1M5zb3PtQhnIEZVPMzrMx2FbKfz48+GH 1GuTEKcfL1PKWqG5YqDEGuS5cG3Je7RnU/mDeiEGPVy50t/3VlwuvtmR45bpuO2cIZCTAV SfzXY7npw0Hns+mvDWsgE0Kv+ED/prWZQTQ7WU7JlDHJ8m35c+NOyISsjqrArw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1679904701; a=rsa-sha256; cv=none; b=fc71w2+vpD/NZ5F0BKY8Pk1C/CuzkEkhoNEeLtnbtEyxzka5rX0e3BTK8lUJ0qjXiffHK4 f5umEwSEQ+bKCq+xfXQ0a5Tzv8cda7OiUZClLCkykvybOr6AOG3EQ2jthHnDxFjGdUS3bV OLycgnYGcSHyOeckO1+Fus9sJYaMTNk6UgwcOkZFxg2kOyjFmi4iE2CojGkvLaiYYZMVMA l6SZwq09rJesgFH8zafX4UqFABm7h5a0jtjiSZONtuAdsJB1GA7PJ5blBJG0OurVjGdKs8 QDo475x1eE4oKggNZ+whxA35jGCIuf0WncKYqRNnopBZtVHDXssFX1FPbIc2kA== 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 4PlQWd4GjvzF2q; Mon, 27 Mar 2023 08:11:41 +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 32R8BfKI043770; Mon, 27 Mar 2023 08:11:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 32R8BfHW043769; Mon, 27 Mar 2023 08:11:41 GMT (envelope-from git) Date: Mon, 27 Mar 2023 08:11:41 GMT Message-Id: <202303270811.32R8BfHW043769@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: =?utf-8?Q?Corvin=20K=C3=B6hne?= Subject: git: f4ceaff56dda - main - bhyve: add config option to modify LPC IDs List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: corvink X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f4ceaff56ddaacc151df07d2d205a2d7fcb736a8 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=f4ceaff56ddaacc151df07d2d205a2d7fcb736a8 commit f4ceaff56ddaacc151df07d2d205a2d7fcb736a8 Author: Corvin Köhne AuthorDate: 2021-11-23 12:14:41 +0000 Commit: Corvin Köhne CommitDate: 2023-03-27 08:10:24 +0000 bhyve: add config option to modify LPC IDs The Intel GOP driver checks the LPC IDs to detect the platform it's running on. The GOP driver only works on the platforms it's written for. Maybe other Intel driver have the same behaviour. For that reason, we should use the LPC IDs of the FreeBSD host for GPU passthrough to work properly. We don't know if setting different LPC IDs have any side effect. Therefore, don't use the host LPC IDs by default on Intel system. Give the user the opportunity to modify the LPC IDs. Reviewed by: jhb MFC after: 1 week Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D28280 --- usr.sbin/bhyve/bhyve_config.5 | 14 +++++++++++++ usr.sbin/bhyve/pci_lpc.c | 46 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 57 insertions(+), 3 deletions(-) diff --git a/usr.sbin/bhyve/bhyve_config.5 b/usr.sbin/bhyve/bhyve_config.5 index ddfcae8c51d3..e9594d432563 100644 --- a/usr.sbin/bhyve/bhyve_config.5 +++ b/usr.sbin/bhyve/bhyve_config.5 @@ -542,6 +542,20 @@ for fwctl and for fwcfg. .It Va pc-testdev Ta bool Ta false Ta Enable the PC debug/test device. +.It Va pcir.* Ta integer Ta Ta +Values of PCI register. +It also accepts the value +.Ar host +to use the pci id of the host system. +This value is required for the Intel GOP driver to work properly. +.Bl -column "subvendor" "Default" +.It Sy Name Ta Sy Default +.It Va vendor Ta 0x8086 +.It Va device Ta 0x7000 +.It Va revid Ta 0 +.It Va subvendor Ta 0 +.It Va subdevice Ta 0 +.El .El .Ss NVMe Controller Settings Each NVMe controller supports a single storage device. diff --git a/usr.sbin/bhyve/pci_lpc.c b/usr.sbin/bhyve/pci_lpc.c index ad47230c005e..3b42947369a2 100644 --- a/usr.sbin/bhyve/pci_lpc.c +++ b/usr.sbin/bhyve/pci_lpc.c @@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$"); #include "pci_emul.h" #include "pci_irq.h" #include "pci_lpc.h" +#include "pci_passthru.h" #include "pctestdev.h" #include "uart_emul.h" @@ -448,10 +449,35 @@ pci_lpc_read(struct pci_devinst *pi __unused, int baridx __unused, #define LPC_DEV 0x7000 #define LPC_VENDOR 0x8086 +#define LPC_REVID 0x00 +#define LPC_SUBVEND_0 0x0000 +#define LPC_SUBDEV_0 0x0000 static int -pci_lpc_init(struct pci_devinst *pi, nvlist_t *nvl __unused) +pci_lpc_get_sel(struct pcisel *const sel) { + assert(sel != NULL); + + memset(sel, 0, sizeof(*sel)); + + for (uint8_t slot = 0; slot <= PCI_SLOTMAX; ++slot) { + sel->pc_dev = slot; + if ((read_config(sel, PCIR_CLASS, 1) == PCIC_BRIDGE) && + (read_config(sel, PCIR_SUBCLASS, 1) == PCIS_BRIDGE_ISA)) { + return (0); + } + } + + return (-1); +} + +static int +pci_lpc_init(struct pci_devinst *pi, nvlist_t *nvl) +{ + struct pcisel sel = { 0 }; + uint16_t device, subdevice, subvendor, vendor; + uint8_t revid; + /* * Do not allow more than one LPC bridge to be configured. */ @@ -473,11 +499,25 @@ pci_lpc_init(struct pci_devinst *pi, nvlist_t *nvl __unused) if (lpc_init(pi->pi_vmctx) != 0) return (-1); + if (pci_lpc_get_sel(&sel) != 0) + return (-1); + + vendor = pci_config_read_reg(&sel, nvl, PCIR_VENDOR, 2, LPC_VENDOR); + device = pci_config_read_reg(&sel, nvl, PCIR_DEVICE, 2, LPC_DEV); + revid = pci_config_read_reg(&sel, nvl, PCIR_REVID, 1, LPC_REVID); + subvendor = pci_config_read_reg(&sel, nvl, PCIR_SUBVEND_0, 2, + LPC_SUBVEND_0); + subdevice = pci_config_read_reg(&sel, nvl, PCIR_SUBDEV_0, 2, + LPC_SUBDEV_0); + /* initialize config space */ - pci_set_cfgdata16(pi, PCIR_DEVICE, LPC_DEV); - pci_set_cfgdata16(pi, PCIR_VENDOR, LPC_VENDOR); + pci_set_cfgdata16(pi, PCIR_VENDOR, vendor); + pci_set_cfgdata16(pi, PCIR_DEVICE, device); pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_BRIDGE); pci_set_cfgdata8(pi, PCIR_SUBCLASS, PCIS_BRIDGE_ISA); + pci_set_cfgdata8(pi, PCIR_REVID, revid); + pci_set_cfgdata16(pi, PCIR_SUBVEND_0, subvendor); + pci_set_cfgdata16(pi, PCIR_SUBDEV_0, subdevice); lpc_bridge = pi;