Commit 5e372663 authored by Matthew Brost's avatar Matthew Brost Committed by Rodrigo Vivi

drm/xe/guc: Add support GuC MMIO send / recv

SRIOV has a use case of GuC MMIO send / recv, add a function for it.
Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarPhilippe Lecluse <philippe.lecluse1@gmail.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent f900725a
......@@ -630,7 +630,8 @@ int xe_guc_auth_huc(struct xe_guc *guc, u32 rsa_addr)
#define MEDIA_SOFT_SCRATCH(n) _MMIO(0x190310 + (n) * 4)
#define MEDIA_SOFT_SCRATCH_COUNT 4
int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len)
int xe_guc_mmio_send_recv(struct xe_guc *guc, const u32 *request,
u32 len, u32 *response_buf)
{
struct xe_device *xe = guc_to_xe(guc);
struct xe_gt *gt = guc_to_gt(guc);
......@@ -640,6 +641,7 @@ int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len)
int ret;
int i;
BUILD_BUG_ON(GEN11_SOFT_SCRATCH_COUNT != MEDIA_SOFT_SCRATCH_COUNT);
XE_BUG_ON(guc->ct.enabled);
XE_BUG_ON(!len);
XE_BUG_ON(len > GEN11_SOFT_SCRATCH_COUNT);
......@@ -723,10 +725,24 @@ int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len)
return -EPROTO;
}
/* Just copy entire possible message response */
if (response_buf) {
response_buf[0] = header;
for (i = 1; i < GEN11_SOFT_SCRATCH_COUNT; i++)
response_buf[i] =
xe_mmio_read32(gt, reply_reg + i * sizeof(u32));
}
/* Use data from the GuC response as our return value */
return FIELD_GET(GUC_HXG_RESPONSE_MSG_0_DATA0, header);
}
int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len)
{
return xe_guc_mmio_send_recv(guc, request, len, NULL);
}
static int guc_self_cfg(struct xe_guc *guc, u16 key, u16 len, u64 val)
{
u32 request[HOST2GUC_SELF_CFG_REQUEST_MSG_LEN] = {
......
......@@ -23,6 +23,8 @@ int xe_guc_suspend(struct xe_guc *guc);
void xe_guc_notify(struct xe_guc *guc);
int xe_guc_auth_huc(struct xe_guc *guc, u32 rsa_addr);
int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len);
int xe_guc_mmio_send_recv(struct xe_guc *guc, const u32 *request, u32 len,
u32 *response_buf);
int xe_guc_self_cfg32(struct xe_guc *guc, u16 key, u32 val);
int xe_guc_self_cfg64(struct xe_guc *guc, u16 key, u64 val);
void xe_guc_irq_handler(struct xe_guc *guc, const u16 iir);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment