Re: git: d11e9de955ea - stable/13 - Hyper-V: vPCI: Prepopulate device bars
- In reply to: Wei Hu : "git: d11e9de955ea - stable/13 - Hyper-V: vPCI: Prepopulate device bars"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 30 Nov 2021 10:36:36 UTC
On Tue, 30 Nov 2021 10:32:41 GMT
Wei Hu <whu@FreeBSD.org> wrote:
> The branch stable/13 has been updated by whu:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=d11e9de955ea01fe01dce58c7eb090fe0352bced
>
> commit d11e9de955ea01fe01dce58c7eb090fe0352bced
> Author: Wei Hu <whu@FreeBSD.org>
> AuthorDate: 2021-11-27 06:42:34 +0000
> Commit: Wei Hu <whu@FreeBSD.org>
> 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
Looks more 3 days to me.
Also kib@ asked you a question for this commit, it would be more
polite to answer him instead of mfc this 3 days after.
Cheers,
> 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");
--
Emmanuel Vadot <manu@bidouilliste.com> <manu@freebsd.org>