[PATCH 2/3] drm/vmwgfx: Print errors when running on broken/unsupported configs
Martin Krastev (VMware)
martinkrastev768 at gmail.com
Tue Mar 21 12:56:09 UTC 2023
From: Martin Krastev <krastevm at vmware.com>
LGTM!
Reviewed-by: Martin Krastev <krastevm at vmware.com>
Regards,
Martin
On 21.03.23 г. 4:09 ч., Zack Rusin wrote:
> From: Zack Rusin <zackr at vmware.com>
>
> virtualbox implemented an incomplete version of the svga device which
> they decided to drop soon after the initial release. The device was
> always broken in various ways and never supported by vmwgfx.
>
> vmwgfx should refuse to load on those configurations but currently
> drm has no way of reloading fbdev when the specific pci driver refuses
> to load, which would leave users without a usable fb. Instead of
> refusing to load print an error and disable a bunch of functionality
> that virtualbox never implemented to at least get fb to work on their
> setup.
>
> Signed-off-by: Zack Rusin <zackr at vmware.com>
> ---
> drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 29 +++++++++++++++++++++++++++++
> drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 2 ++
> drivers/gpu/drm/vmwgfx/vmwgfx_msg.c | 9 +++++++++
> 3 files changed, 40 insertions(+)
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> index 2588615a2a38..8b24ecf60e3e 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
> @@ -45,6 +45,9 @@
> #include <drm/ttm/ttm_placement.h>
> #include <generated/utsrelease.h>
>
> +#ifdef CONFIG_X86
> +#include <asm/hypervisor.h>
> +#endif
> #include <linux/cc_platform.h>
> #include <linux/dma-mapping.h>
> #include <linux/module.h>
> @@ -897,6 +900,16 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
> cap2_names, ARRAY_SIZE(cap2_names));
> }
>
> + if (!vmwgfx_supported(dev_priv)) {
> + vmw_disable_backdoor();
> + drm_err_once(&dev_priv->drm,
> + "vmwgfx seems to be running on an unsupported hypervisor.");
> + drm_err_once(&dev_priv->drm,
> + "This configuration is likely broken.");
> + drm_err_once(&dev_priv->drm,
> + "Please switch to a supported graphics device to avoid problems.");
> + }
> +
> ret = vmw_dma_select_mode(dev_priv);
> if (unlikely(ret != 0)) {
> drm_info(&dev_priv->drm,
> @@ -1320,6 +1333,22 @@ static void vmw_master_drop(struct drm_device *dev,
> vmw_kms_legacy_hotspot_clear(dev_priv);
> }
>
> +bool vmwgfx_supported(struct vmw_private *vmw)
> +{
> +#if defined(CONFIG_X86)
> + return hypervisor_is_type(X86_HYPER_VMWARE);
> +#elif defined(CONFIG_ARM64)
> + /*
> + * On aarch64 only svga3 is supported
> + */
> + return vmw->pci_id == VMWGFX_PCI_ID_SVGA3;
> +#else
> + drm_warn_once(&vmw->drm,
> + "vmwgfx is running on an unknown architecture.");
> + return false;
> +#endif
> +}
> +
> /**
> * __vmw_svga_enable - Enable SVGA mode, FIFO and use of VRAM.
> *
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> index fb8f0c0642c0..3810a9984a7f 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
> @@ -773,6 +773,7 @@ static inline u32 vmw_max_num_uavs(struct vmw_private *dev_priv)
>
> extern void vmw_svga_enable(struct vmw_private *dev_priv);
> extern void vmw_svga_disable(struct vmw_private *dev_priv);
> +bool vmwgfx_supported(struct vmw_private *vmw);
>
>
> /**
> @@ -1358,6 +1359,7 @@ int vmw_bo_cpu_blit(struct ttm_buffer_object *dst,
> struct vmw_diff_cpy *diff);
>
> /* Host messaging -vmwgfx_msg.c: */
> +void vmw_disable_backdoor(void);
> int vmw_host_get_guestinfo(const char *guest_info_param,
> char *buffer, size_t *length);
> __printf(1, 2) int vmw_host_printf(const char *fmt, ...);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
> index ca1a3fe44fa5..2651fe0ef518 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_msg.c
> @@ -1179,3 +1179,12 @@ int vmw_mksstat_remove_ioctl(struct drm_device *dev, void *data,
>
> return -EAGAIN;
> }
> +
> +/**
> + * vmw_disable_backdoor: Disables all backdoor communication
> + * with the hypervisor.
> + */
> +void vmw_disable_backdoor(void)
> +{
> + vmw_msg_enabled = 0;
> +}
More information about the dri-devel
mailing list