drm/vmwgfx: Write the driver id registers
authorZack Rusin <zackr@vmware.com>
Sat, 22 Oct 2022 04:02:20 +0000 (00:02 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 18 Jan 2023 10:58:28 +0000 (11:58 +0100)
[ Upstream commit 7f4c33778686cc2d34cb4ef65b4265eea874c159 ]

Driver id registers are a new mechanism in the svga device to hint to the
device which driver is running. This should not change device behavior
in any way, but might be convenient to work-around specific bugs
in guest drivers.

Signed-off-by: Zack Rusin <zackr@vmware.com>
Reviewed-by: Martin Krastev <krastevm@vmware.com>
Reviewed-by: Maaz Mombasawala <mombasawalam@vmware.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221022040236.616490-2-zack@kde.org
Stable-dep-of: a309c7194e8a ("drm/vmwgfx: Remove rcu locks from user resources")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c

index d7bd5eb..45028e2 100644 (file)
  *
  **************************************************************************/
 
-#include <linux/dma-mapping.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/cc_platform.h>
+
+#include "vmwgfx_drv.h"
+
+#include "vmwgfx_devcaps.h"
+#include "vmwgfx_mksstat.h"
+#include "vmwgfx_binding.h"
+#include "ttm_object.h"
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_drv.h>
 #include <drm/ttm/ttm_placement.h>
 #include <generated/utsrelease.h>
 
-#include "ttm_object.h"
-#include "vmwgfx_binding.h"
-#include "vmwgfx_devcaps.h"
-#include "vmwgfx_drv.h"
-#include "vmwgfx_mksstat.h"
+#include <linux/cc_platform.h>
+#include <linux/dma-mapping.h>
+#include <linux/module.h>
+#include <linux/pci.h>
+#include <linux/version.h>
 
 #define VMWGFX_DRIVER_DESC "Linux drm driver for VMware graphics devices"
 
@@ -806,6 +809,27 @@ static int vmw_detect_version(struct vmw_private *dev)
        return 0;
 }
 
+static void vmw_write_driver_id(struct vmw_private *dev)
+{
+       if ((dev->capabilities2 & SVGA_CAP2_DX2) != 0) {
+               vmw_write(dev,  SVGA_REG_GUEST_DRIVER_ID,
+                         SVGA_REG_GUEST_DRIVER_ID_LINUX);
+
+               vmw_write(dev, SVGA_REG_GUEST_DRIVER_VERSION1,
+                         LINUX_VERSION_MAJOR << 24 |
+                         LINUX_VERSION_PATCHLEVEL << 16 |
+                         LINUX_VERSION_SUBLEVEL);
+               vmw_write(dev, SVGA_REG_GUEST_DRIVER_VERSION2,
+                         VMWGFX_DRIVER_MAJOR << 24 |
+                         VMWGFX_DRIVER_MINOR << 16 |
+                         VMWGFX_DRIVER_PATCHLEVEL);
+               vmw_write(dev, SVGA_REG_GUEST_DRIVER_VERSION3, 0);
+
+               vmw_write(dev, SVGA_REG_GUEST_DRIVER_ID,
+                         SVGA_REG_GUEST_DRIVER_ID_SUBMIT);
+       }
+}
+
 static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
 {
        int ret;
@@ -1091,6 +1115,7 @@ static int vmw_driver_load(struct vmw_private *dev_priv, u32 pci_id)
        vmw_host_printf("vmwgfx: Module Version: %d.%d.%d (kernel: %s)",
                        VMWGFX_DRIVER_MAJOR, VMWGFX_DRIVER_MINOR,
                        VMWGFX_DRIVER_PATCHLEVEL, UTS_RELEASE);
+       vmw_write_driver_id(dev_priv);
 
        if (dev_priv->enable_fb) {
                vmw_fifo_resource_inc(dev_priv);