From nobody Sat Nov 27 06:55:54 2021 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 C361418A1B58; Sat, 27 Nov 2021 06:55:54 +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 4J1Mp23NRRz3LKf; Sat, 27 Nov 2021 06:55:54 +0000 (UTC) (envelope-from git@FreeBSD.org) 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 502B217AC2; Sat, 27 Nov 2021 06:55:54 +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 1AR6tsLf023869; Sat, 27 Nov 2021 06:55:54 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1AR6tslh023868; Sat, 27 Nov 2021 06:55:54 GMT (envelope-from git) Date: Sat, 27 Nov 2021 06:55:54 GMT Message-Id: <202111270655.1AR6tslh023868@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Wei Hu Subject: git: 75412a521f60 - main - Hyper-V: vPCI: Prepopulate device bars 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: whu X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 75412a521f60d4b0393c730ffb284e7c6ff9d2de Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1637996154; 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=0D4vEjO5Be7K3MHUUh+BdfzlBIMtYTyau3II2Rrcs4Q=; b=IOW5ro0kNEjk5VEbcF/+29dDPK/6gAaciRf3fmxqQXsJGge3YXjU1AGdoSWRreFzMja9ld 4l69ga0+Iva+6dJ1Wb0RenHJY3UytIqQNO6qWeUZ1GZzOnIBrTlIaX99HACRO1U6rpk8OI Q69hoTYkIItIT3Y/vLn5F7NBO+THs43B/EoArv49dRJoGxozT0CTVp520cRwFIhdbRtWY5 sZz6e28HMBfUjVERzsDpYWnE0X5mkm4bAjw54U/c0DLD6SwzVReg70l/7cfrCvvPofaosr gTtuECk9iSrMt6kj/ZmiycZRqgDlmmPWzZ88MZJRmDEfRc6kC5gLqV0hI+BujQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1637996154; a=rsa-sha256; cv=none; b=PmEqm/bBJt2PYuGnUX3dtG2N7+NEn2CUPGAuOmLqFeH4bOasoINb/B98uthaDJzwMs64C8 C1x6K9Smh5D66nc09KgW1swaViUyLBIH2MBHaF6jmUBTy54ssvrGQIPqAw8elyC2sccZCS a1LYO57WgU6EXlEI6dbf2qU/sJnVB5j0493J91R3SEYtUHAKoNP5JP0ouJQCZWQnUiwLYg rhUZw/TlnBqyXHNow1+px6T73v8S3FWROEy/oBdQLcBzRRbDKmWGk+Qnk4h1IPk/89zj1Z ifUHtSskfRc16upNjjMJL6p/OM+xuAS4pA99amIUUy55+hS3O3dYl2mKnMmGYg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by whu: URL: https://cgit.FreeBSD.org/src/commit/?id=75412a521f60d4b0393c730ffb284e7c6ff9d2de commit 75412a521f60d4b0393c730ffb284e7c6ff9d2de Author: Wei Hu AuthorDate: 2021-11-27 06:42:34 +0000 Commit: Wei Hu CommitDate: 2021-11-27 06:42:34 +0000 Hyper-V: vPCI: Prepopulate device bars In recent Hyper-V releases on Windows Server 2022, vPCI code does not initialize the last 4 bit of device bar registers. This behavior change could result weird problems cuasing PCI code failure when configuring bars. Just write all 1's to those bars whose probed values are not the same as current read ones. This seems to make Hyper-V vPCI and pci_write_bar() to cooperate correctly on these releases. Reported by: khng@freebsd.org Tested by: khng@freebsd.org MFC after: 2 weeks Sponsored by: Microsoft --- sys/dev/hyperv/pcib/vmbus_pcib.c | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/sys/dev/hyperv/pcib/vmbus_pcib.c b/sys/dev/hyperv/pcib/vmbus_pcib.c index 72e430c946db..c7df32044678 100644 --- a/sys/dev/hyperv/pcib/vmbus_pcib.c +++ b/sys/dev/hyperv/pcib/vmbus_pcib.c @@ -1356,6 +1356,47 @@ _hv_pcifront_write_config(struct hv_pci_dev *hpdev, int where, int size, } } +/* + * The vPCI in some Hyper-V releases do not initialize the last 4 + * bit of BAR registers. This could result weird problems causing PCI + * code fail to configure BAR correctly. + * + * Just write all 1's to those BARs whose probed values are not zero. + * This seems to make the Hyper-V vPCI and pci_write_bar() to cooperate + * correctly. + */ + +static void +vmbus_pcib_prepopulate_bars(struct hv_pcibus *hbus) +{ + struct hv_pci_dev *hpdev; + int i; + + mtx_lock(&hbus->device_list_lock); + TAILQ_FOREACH(hpdev, &hbus->children, link) { + for (i = 0; i < 6; i++) { + /* Ignore empty bar */ + if (hpdev->probed_bar[i] == 0) + continue; + + uint32_t bar_val = 0; + + _hv_pcifront_read_config(hpdev, PCIR_BAR(i), + 4, &bar_val); + + if (hpdev->probed_bar[i] != bar_val) { + if (bootverbose) + printf("vmbus_pcib: initialize bar %d " + "by writing all 1s\n", i); + + _hv_pcifront_write_config(hpdev, PCIR_BAR(i), + 4, 0xffffffff); + } + } + } + mtx_unlock(&hbus->device_list_lock); +} + static void vmbus_pcib_set_detaching(void *arg, int pending __unused) { @@ -1479,6 +1520,8 @@ vmbus_pcib_attach(device_t dev) if (ret) goto vmbus_close; + vmbus_pcib_prepopulate_bars(hbus); + hbus->pci_bus = device_add_child(dev, "pci", -1); if (!hbus->pci_bus) { device_printf(dev, "failed to create pci bus\n");