[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))