From nobody Tue Nov 30 10:32:41 2021 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 1CFAA18B1B5D; Tue, 30 Nov 2021 10:32:42 +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 4J3JSn5QcYz3PKG; Tue, 30 Nov 2021 10:32:41 +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 9793514D96; Tue, 30 Nov 2021 10:32: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 1AUAWfqL073107; Tue, 30 Nov 2021 10:32:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 1AUAWfal073106; Tue, 30 Nov 2021 10:32:41 GMT (envelope-from git) Date: Tue, 30 Nov 2021 10:32:41 GMT Message-Id: <202111301032.1AUAWfal073106@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Wei Hu Subject: git: d11e9de955ea - stable/13 - Hyper-V: vPCI: Prepopulate device bars 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: whu X-Git-Repository: src X-Git-Refname: refs/heads/stable/13 X-Git-Reftype: branch X-Git-Commit: d11e9de955ea01fe01dce58c7eb090fe0352bced Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1638268361; 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=juo8mqk6YsVgLmtI7I+t2FwamdscCRpki2Ol/WgzeG0=; b=kiAPWMCjSIzcs31yrz7VGXuaez/awppmVrBa2i5z1teMx3Qb4myDsI/XkzXQS5l1d70Z7B BZYWgjWIyBAvRhGdQJeVzEWXhU1+WK4BBKypu7F6yL9/XutLRPni0ENRzcOJDaL4PHuRFV ZuuVMmRUQoV4AjEFhREFAATc0xVBECguXceifwZQMw8FU3VWoxsx5Lbzky6835HsV+583v 3ton82s6M79Nv55mWCuE/1VpGq0FJ7n8IKsb5RDUlRVlfhhDOiipo/Y1XwzxgFmjeAcumV p4Fv6VT2S9eu8Heh8ETlZ82iSOpbobEENxrKcdmYTbnO7tplQE3EQaLtgxnGTg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1638268361; a=rsa-sha256; cv=none; b=WqyKTnvv+i5EIeYBRMYk/Son+8VXdxZ0brtK+8xg/Uz/DL5m/RPSMh+jfu83Y6UeJBZ8wH 60ZgR+BGqWOxGnMeqG/lf20ltheyMU+347DYX/o0tBmqCcl9vO/VapH7bCZK4BEOhYeCmZ 5m8k2Ab09TNIfh5AxJtVx5x7lUjZTv7OkoOWBlbTRBmz9rj4Lv1Vgx2H1orwxnqnKE/Zrv fRPi8ATWRmcy+A+qZzcma6tDF8gfy3cBq1nbOowfQTVU7gbxpsssHa3bV88i5aEAMtzawB L01CF1q3GBB1Jyy6UlpneOS7EQB57aTqfPsvNJWTFbz03EB+6NYhtbFulgu93w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by whu: URL: https://cgit.FreeBSD.org/src/commit/?id=d11e9de955ea01fe01dce58c7eb090fe0352bced commit d11e9de955ea01fe01dce58c7eb090fe0352bced Author: Wei Hu AuthorDate: 2021-11-27 06:42:34 +0000 Commit: Wei Hu CommitDate: 2021-11-30 07:43:32 +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) --- 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");