On Tue, 30 Nov 2021 10:32:41 GMT
Wei Hu <[email protected]> wrote:

> The branch stable/13 has been updated by whu:
> 
> URL: 
> https://cgit.FreeBSD.org/src/commit/?id=d11e9de955ea01fe01dce58c7eb090fe0352bced
> 
> commit d11e9de955ea01fe01dce58c7eb090fe0352bced
> Author:     Wei Hu <[email protected]>
> AuthorDate: 2021-11-27 06:42:34 +0000
> Commit:     Wei Hu <[email protected]>
> 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:    [email protected]
>     Tested by:      [email protected]
>     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 <[email protected]> <[email protected]>

Reply via email to