Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Decode] Query uc version #1774

Merged
merged 1 commit into from
Mar 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading