[Decode] Add the implement to query drm version

In case of multiple drm device in system, umd needs to query drm version
firstly before init mos bufmgr
diff --git a/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c b/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c
index 78dbe6c..4b9d960 100644
--- a/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c
+++ b/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c
@@ -159,6 +159,8 @@
     // manage address for softpin buffer object
     mos_vma_heap vma_heap[MEMZONE_COUNT];
     bool use_softpin;
+
+    int device_type;
 } mos_bufmgr_gem;
 
 #define DRM_INTEL_RELOC_FENCE (1<<0)
@@ -4010,6 +4012,7 @@
      * Every 4 was too few for the blender benchmark.
      */
     bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2;
+    bufmgr_gem->device_type = DEVICE_TYPE_I915;
 
     DRMINITLISTHEAD(&bufmgr_gem->named);
     init_cache_buckets(bufmgr_gem);
diff --git a/media_driver/linux/ult/libdrm_mock/xf86drm_mock.c b/media_driver/linux/ult/libdrm_mock/xf86drm_mock.c
index eaf4856..49d68b7 100644
--- a/media_driver/linux/ult/libdrm_mock/xf86drm_mock.c
+++ b/media_driver/linux/ult/libdrm_mock/xf86drm_mock.c
@@ -382,6 +382,16 @@
             ret = 0;
         }
         break;
+        case DRM_IOCTL_VERSION:
+        {
+            drm_version_t *version = (drm_version_t *)arg;
+            if(version)
+            {
+                strcpy(version->name, "i915");
+            }
+            ret = 0;
+        }
+        break;
         default:
             printf("drmIoctl: with unsupport IOType\n");
             do {
diff --git a/media_softlet/linux/common/os/i915/include/mos_bufmgr.h b/media_softlet/linux/common/os/i915/include/mos_bufmgr.h
index 356cc8c..9c96dff 100644
--- a/media_softlet/linux/common/os/i915/include/mos_bufmgr.h
+++ b/media_softlet/linux/common/os/i915/include/mos_bufmgr.h
@@ -74,6 +74,12 @@
    MEMZONE_COUNT,
 };
 
+enum device_type {
+    DEVICE_TYPE_I915,
+    DEVICE_TYPE_XE,
+    DEVICE_TYPE_COUNT,
+};
+
 #define MEMZONE_SYS_START     (1ull << 16)
 #define MEMZONE_DEVICE_START  (1ull << 40)
 #define MEMZONE_SYS_SIZE      (MEMZONE_DEVICE_START - MEMZONE_SYS_START)
@@ -334,6 +340,38 @@
 #if defined(__cplusplus)
 extern "C" {
 #endif
+extern drm_export int drmIoctl(int fd, unsigned long request, void *arg);
+
+static inline int mos_query_device_type(int fd)
+{
+    int device_type = DEVICE_TYPE_COUNT;
+    drm_version_t version;
+    char name[5] = "";
+
+    memset(&version, 0, sizeof(version));
+    version.name_len = 4;
+    version.name = name;
+
+    if (drmIoctl(fd, DRM_IOCTL_VERSION, &version))
+    {
+        fprintf(stderr, "DRM_IOCTL_VERSION failed: %s\n", strerror(errno));
+        return device_type;
+    }
+
+    if(strcmp("i915", name) == 0)
+    {
+        device_type = DEVICE_TYPE_I915;
+    }
+    else if(strcmp("xe", name) == 0)
+    {
+        device_type = DEVICE_TYPE_XE;
+    }
+    else
+    {
+        fprintf(stderr, "DRM_IOCTL_VERSION, unsupported drm device by media driver: %s\n", name);
+    }
+    return device_type;
+}
 
 drm_export int mos_bo_map_wc(struct mos_linux_bo *bo);
 drm_export void mos_bo_clear_relocs(struct mos_linux_bo *bo, int start);
diff --git a/media_softlet/linux/common/os/i915/mos_bufmgr.c b/media_softlet/linux/common/os/i915/mos_bufmgr.c
index 5f1a2c7..a758d1c 100644
--- a/media_softlet/linux/common/os/i915/mos_bufmgr.c
+++ b/media_softlet/linux/common/os/i915/mos_bufmgr.c
@@ -174,6 +174,8 @@
     char mem_profiler_buffer[MEM_PROFILER_BUFFER_SIZE];
     char* mem_profiler_path;
     int mem_profiler_fd;
+
+    int device_type;
 } mos_bufmgr_gem;
 
 #define DRM_INTEL_RELOC_FENCE (1<<0)
@@ -4783,7 +4785,7 @@
  * \param fd File descriptor of the opened DRM device.
  */
 struct mos_bufmgr *
-mos_bufmgr_gem_init(int fd, int batch_size)
+mos_bufmgr_gem_init_i915(int fd, int batch_size)
 {
     struct mos_bufmgr_gem *bufmgr_gem;
     struct drm_i915_gem_get_aperture aperture;
@@ -5018,6 +5020,7 @@
         }
     }
 
+    bufmgr_gem->device_type = DEVICE_TYPE_I915;
     bufmgr_gem->has_lmem = mos_gem_has_lmem(bufmgr_gem->fd);
 
     bufmgr_gem->bufmgr.has_full_vd = true;
@@ -5045,6 +5048,17 @@
     return bufmgr_gem != nullptr ? &bufmgr_gem->bufmgr : nullptr;
 }
 
+struct mos_bufmgr *
+mos_bufmgr_gem_init(int fd, int batch_size)
+{
+    if(DEVICE_TYPE_I915 == mos_query_device_type(fd))
+    {
+        return mos_bufmgr_gem_init_i915(fd, batch_size);
+    }
+
+    return nullptr;
+}
+
 int mos_get_param(int fd, int32_t param, uint32_t *param_value)
 {
     if((fd < 0) || (param_value == nullptr))
diff --git a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
index 0706681..23394ff 100644
--- a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
+++ b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
@@ -177,6 +177,8 @@
     char mem_profiler_buffer[MEM_PROFILER_BUFFER_SIZE];
     char* mem_profiler_path;
     int mem_profiler_fd;
+
+    int device_type;
 } mos_bufmgr_gem;
 
 #define DRM_INTEL_RELOC_FENCE (1<<0)
@@ -4909,7 +4911,7 @@
  * \param fd File descriptor of the opened DRM device.
  */
 struct mos_bufmgr *
-mos_bufmgr_gem_init(int fd, int batch_size)
+mos_bufmgr_gem_init_i915(int fd, int batch_size)
 {
     struct mos_bufmgr_gem *bufmgr_gem;
     struct drm_i915_gem_get_aperture aperture;
@@ -5148,6 +5150,8 @@
 
     bufmgr_gem->has_lmem = mos_gem_has_lmem(bufmgr_gem);
 
+    bufmgr_gem->device_type = DEVICE_TYPE_I915;
+
     if (nullptr != bufmgr_gem->prelim) {
         bufmgr_gem->prelim->Init(bufmgr_gem->bufmgr, bufmgr_gem->has_lmem);
     }
@@ -5182,6 +5186,17 @@
     return bufmgr_gem != nullptr ? &bufmgr_gem->bufmgr : nullptr;
 }
 
+struct mos_bufmgr *
+mos_bufmgr_gem_init(int fd, int batch_size)
+{
+    if(DEVICE_TYPE_I915 == mos_query_device_type(fd))
+    {
+        return mos_bufmgr_gem_init_i915(fd, batch_size);
+    }
+
+    return nullptr;
+}
+
 int mos_get_param(int fd, int32_t param, uint32_t *param_value)
 {
     if((fd < 0) || (param_value == nullptr))