From nobody Tue Jan 11 18:14:59 2022 X-Original-To: dev-commits-src-branches@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 C573F193F05B; Tue, 11 Jan 2022 18:15:00 +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 4JYJkr286kz4RCr; Tue, 11 Jan 2022 18:15:00 +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 12EE71DE2B; Tue, 11 Jan 2022 18:15:00 +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 20BIExgH099944; Tue, 11 Jan 2022 18:14:59 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 20BIExnF099943; Tue, 11 Jan 2022 18:14:59 GMT (envelope-from git) Date: Tue, 11 Jan 2022 18:14:59 GMT Message-Id: <202201111814.20BIExnF099943@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Ed Maste Subject: git: dfca965af4e1 - releng/13.0 - Hyper-V: vPCI: Prepopulate device bars List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: emaste X-Git-Repository: src X-Git-Refname: refs/heads/releng/13.0 X-Git-Reftype: branch X-Git-Commit: dfca965af4e11523467f168f36dd0236260e5080 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1641924900; 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=Oem2/05CZgEy8mDoasCTR3jVH4Ru9oOxV2/jCMMixLU=; b=PF6WZ2cKdNPp+zxUepuWMmjNJYSQvgBuGfYe02cSLEbEFfd0XM3POrHoAQvDFQc8yAscgQ 61MU0qDqZ+U+LusL8y/mRDTXXeC6pVLQm8nZsgE7gVUvhv09phjEtyQJiT71AIPQTJlHXk PBkwvPvGECiOBFOjOk6mC9rAxnROC7dlpqMwlPMdsThRVYRjJ48zokxxlilxlxsJWyB2R9 uoQptsR8TBVfvcomh2qbWjdAoPfTHqvC0kq7jLJ1JOxun2dr+5yaAhdeJlRN255P8sK8qy hXEbfP3uBm4eeNVu2IZzkpnW4fsuXlYU/iUQWnt1Qytd8TsnCShBEX5uv01xjA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1641924900; a=rsa-sha256; cv=none; b=ECGPTJldIzK093kM8VcSc6f0zP7a23wELTtkEuopikYJ3MSrTXV9+eUP2psswB8yOvyxY7 mEONReuEHJPc2sGhoNUOqy4fEZ5p2xPULAUloTrmin5j3iglKoaXa4fTyYCrwFHJUFcVi/ 4HJ/35UZamMPsasavYDt0oNbO2ORrS53uiX6BMFrdZRG0hdrc/rGHw2RRXMCs+bqEv38hb kEER4odrbyk92V/R2awMXCp4LXRtyjaAian1e3Q2NP0Jr/LCCkDUym54B+b4jJJb2VWxkP ymmSV3uuPURFxkP2PI7gttKOSIYcel/eRfCWSLkBW7BLVQ7zDyWC7wMILCxiZw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch releng/13.0 has been updated by emaste: URL: https://cgit.FreeBSD.org/src/commit/?id=dfca965af4e11523467f168f36dd0236260e5080 commit dfca965af4e11523467f168f36dd0236260e5080 Author: Wei Hu AuthorDate: 2021-11-27 06:42:34 +0000 Commit: Ed Maste CommitDate: 2022-01-10 14:51:54 +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 (cherry picked from commit 75412a521f60d4b0393c730ffb284e7c6ff9d2de) (cherry picked from commit d11e9de955ea01fe01dce58c7eb090fe0352bced) Approved by: so Errata: FreeBSD-EN-22:03.hyperv --- 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");