Skip to content

Commit

Permalink
[Decode] update uapi header with querying uc version and Add support …
Browse files Browse the repository at this point in the history
…to query uc version

Signed-off-by: Xu, Zhengguo <zhengguo.xu@intel.com>
  • Loading branch information
Jexu committed Mar 1, 2024
1 parent 061a0c9 commit 11b0ab6
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 30 deletions.
10 changes: 10 additions & 0 deletions media_softlet/linux/common/os/i915/include/mos_bufmgr_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,16 @@ struct mos_drm_bo_alloc_tiled {
struct mos_drm_bo_alloc_ext ext;
};

struct mos_drm_uc_version {
#define UC_TYPE_GUC_SUBMISSION 0
#define UC_TYPE_HUC 1
#define UC_TYPE_MAX 2
#define UC_TYPE_INVALID (uint16_t)-1
uint16_t uc_type;
uint32_t major_version;
uint32_t minor_version;
};

struct mos_linux_bo *mos_bo_alloc(struct mos_bufmgr *bufmgr,
struct mos_drm_bo_alloc *alloc);
struct mos_linux_bo *mos_bo_alloc_userptr(struct mos_bufmgr *bufmgr,
Expand Down
23 changes: 14 additions & 9 deletions media_softlet/linux/common/os/xe/include/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,19 @@ $ make headers_install INSTALL_HDR_PATH=/path/to/install

The last update was done at the following kernel commit:

commit 8ea438d53bbde68d8b0aedd1690f4b1644a1eb5e (HEAD -> drm-xe-next, origin/drm-xe-next)
drm/xe/uapi: Remove DRM_XE_VM_BIND_FLAG_ASYNC comment left over
This is a comment left over of commit d3d76739
("drm/xe/uapi: Remove sync binds").
commit b2121f2bd2232cd0556b2182078d159d81497885 (HEAD -> drm-xe-next, origin/drm-xe-next)

Fixes: d3d76739
drm/xe: Extend uAPI to query HuC micro-controler firmware version

("drm/xe/uapi: Remove sync binds")
Reviewed-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
Cc: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
The infrastructure to query GuC firmware version is already in place. It
is extended with a new micro-controller type to query the HuC firmware
version. It can be used from user space to know if HuC is running.

Cc: John Harrison <John.C.Harrison@Intel.com>
Cc: Francois Dugast <francois.dugast@intel.com>
Cc: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Francois Dugast <francois.dugast@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240208183539.185095-2-jose.souza@intel.com
55 changes: 34 additions & 21 deletions media_softlet/linux/common/os/xe/include/xe_drm.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ extern "C" {
* redefine the interface more easily than an ever growing struct of
* increasing complexity, and for large parts of that interface to be
* entirely optional. The downside is more pointer chasing; chasing across
* the __user boundary with pointers encapsulated inside u64.
* the boundary with pointers encapsulated inside u64.
*
* Example chaining:
*
Expand Down Expand Up @@ -574,6 +574,37 @@ struct drm_xe_query_engine_cycles {
__u64 cpu_delta;
};

/**
* struct drm_xe_query_uc_fw_version - query a micro-controller firmware version
*
* Given a uc_type this will return the branch, major, minor and patch version
* of the micro-controller firmware.
*/
struct drm_xe_query_uc_fw_version {
/** @uc_type: The micro-controller type to query firmware version */
#define XE_QUERY_UC_TYPE_GUC_SUBMISSION 0
#define XE_QUERY_UC_TYPE_HUC 1
__u16 uc_type;

/** @pad: MBZ */
__u16 pad;

/** @branch_ver: branch uc fw version */
__u32 branch_ver;
/** @major_ver: major uc fw version */
__u32 major_ver;
/** @minor_ver: minor uc fw version */
__u32 minor_ver;
/** @patch_ver: patch uc fw version */
__u32 patch_ver;

/** @pad2: MBZ */
__u32 pad2;

/** @reserved: Reserved */
__u64 reserved;
};

/**
* struct drm_xe_device_query - Input of &DRM_IOCTL_XE_DEVICE_QUERY - main
* structure to query device information
Expand Down Expand Up @@ -643,6 +674,7 @@ struct drm_xe_device_query {
#define DRM_XE_DEVICE_QUERY_HWCONFIG 4
#define DRM_XE_DEVICE_QUERY_GT_TOPOLOGY 5
#define DRM_XE_DEVICE_QUERY_ENGINE_CYCLES 6
#define DRM_XE_DEVICE_QUERY_UC_FW_VERSION 7
/** @query: The type of data to query */
__u32 query;

Expand Down Expand Up @@ -831,10 +863,6 @@ struct drm_xe_vm_destroy {
* - %DRM_XE_VM_BIND_OP_PREFETCH
*
* and the @flags can be:
* - %DRM_XE_VM_BIND_FLAG_READONLY
* - %DRM_XE_VM_BIND_FLAG_IMMEDIATE - Valid on a faulting VM only, do the
* MAP operation immediately rather than deferring the MAP to the page
* fault handler.
* - %DRM_XE_VM_BIND_FLAG_NULL - When the NULL flag is set, the page
* tables are setup with a special bit which indicates writes are
* dropped and all reads return zero. In the future, the NULL flags
Expand Down Expand Up @@ -927,9 +955,8 @@ struct drm_xe_vm_bind_op {
/** @op: Bind operation to perform */
__u32 op;

#define DRM_XE_VM_BIND_FLAG_READONLY (1 << 0)
#define DRM_XE_VM_BIND_FLAG_IMMEDIATE (1 << 1)
#define DRM_XE_VM_BIND_FLAG_NULL (1 << 2)
#define DRM_XE_VM_BIND_FLAG_DUMPABLE (1 << 3)
/** @flags: Bind flags */
__u32 flags;

Expand Down Expand Up @@ -1044,20 +1071,6 @@ struct drm_xe_exec_queue_create {
#define DRM_XE_EXEC_QUEUE_EXTENSION_SET_PROPERTY 0
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PRIORITY 0
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_TIMESLICE 1
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PREEMPTION_TIMEOUT 2
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_PERSISTENCE 3
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_JOB_TIMEOUT 4
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_ACC_TRIGGER 5
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_ACC_NOTIFY 6
#define DRM_XE_EXEC_QUEUE_SET_PROPERTY_ACC_GRANULARITY 7
/* Monitor 128KB contiguous region with 4K sub-granularity */
#define DRM_XE_ACC_GRANULARITY_128K 0
/* Monitor 2MB contiguous region with 64KB sub-granularity */
#define DRM_XE_ACC_GRANULARITY_2M 1
/* Monitor 16MB contiguous region with 512KB sub-granularity */
#define DRM_XE_ACC_GRANULARITY_16M 2
/* Monitor 64MB contiguous region with 2M sub-granularity */
#define DRM_XE_ACC_GRANULARITY_64M 3

/** @extensions: Pointer to the first extension struct, if any */
__u64 extensions;
Expand Down
50 changes: 50 additions & 0 deletions media_softlet/linux/common/os/xe/mos_bufmgr_xe.c
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,11 @@ typedef struct mos_xe_bufmgr_gem {
struct drm_xe_query_engines *engines;
struct drm_xe_query_mem_regions *mem_regions;
struct drm_xe_query_gt_list *gt_list;

/**
* Note: we agree here that uc_versions[0] for guc version and uc_versions[1] for huc version
*/
struct drm_xe_query_uc_fw_version uc_versions[UC_TYPE_MAX];
/** bitmask of all memory regions */
uint64_t memory_regions;
/** @default_alignment: safe alignment regardless region location */
Expand Down Expand Up @@ -684,6 +689,48 @@ __mos_get_default_alignment_xe(struct mos_bufmgr *bufmgr, struct drm_xe_query_me
return 0;
}

/**
* Note: Need to add this func to bufmgr api later
*/
static int
mos_query_uc_version_xe(struct mos_bufmgr *bufmgr, struct mos_drm_uc_version *version)
{
int ret = 0;
struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;

if (bufmgr && version && version->uc_type < UC_TYPE_MAX)
{
/**
* Note: query uc version from kmd if no historic data in bufmgr, otherwise using historic data.
*/
if (bufmgr_gem->uc_versions[version->uc_type].uc_type != version->uc_type)
{
struct drm_xe_device_query query;
memclear(query);
query.size = sizeof(struct drm_xe_query_uc_fw_version);
query.query = DRM_XE_DEVICE_QUERY_UC_FW_VERSION;
memclear(bufmgr_gem->uc_versions[version->uc_type]);
bufmgr_gem->uc_versions[version->uc_type].uc_type = version->uc_type;
query.data = (uintptr_t)&bufmgr_gem->uc_versions[version->uc_type];

ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_XE_DEVICE_QUERY,
&query);
if (ret)
{
memclear(bufmgr_gem->uc_versions[version->uc_type]);
bufmgr_gem->uc_versions[version->uc_type].uc_type = UC_TYPE_INVALID;
MOS_DRM_ASSERTMESSAGE("Failed to query UC version, uc type: %d, errno: %d", version->uc_type, ret);
return ret;
}
}

version->major_version = bufmgr_gem->uc_versions[version->uc_type].major_ver;
version->minor_version = bufmgr_gem->uc_versions[version->uc_type].minor_ver;
}

return ret;
}

static uint64_t
mos_get_platform_information_xe(struct mos_bufmgr *bufmgr)
{
Expand Down Expand Up @@ -3677,6 +3724,9 @@ mos_bufmgr_gem_init_xe(int fd, int batch_size)
}
}

bufmgr_gem->uc_versions[UC_TYPE_GUC_SUBMISSION].uc_type = UC_TYPE_INVALID;
bufmgr_gem->uc_versions[UC_TYPE_HUC].uc_type = UC_TYPE_INVALID;

bufmgr_gem->vm_id = __mos_vm_create_xe(&bufmgr_gem->bufmgr);
bufmgr_gem->config = __mos_query_config_xe(fd);
bufmgr_gem->gt_list = __mos_query_gt_list_xe(fd);
Expand Down

0 comments on commit 11b0ab6

Please sign in to comment.