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) ...@@ -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(n) _MMIO(0x190310 + (n) * 4)
#define MEDIA_SOFT_SCRATCH_COUNT 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_device *xe = guc_to_xe(guc);
struct xe_gt *gt = guc_to_gt(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) ...@@ -640,6 +641,7 @@ int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len)
int ret; int ret;
int i; int i;
BUILD_BUG_ON(GEN11_SOFT_SCRATCH_COUNT != MEDIA_SOFT_SCRATCH_COUNT);
XE_BUG_ON(guc->ct.enabled); XE_BUG_ON(guc->ct.enabled);
XE_BUG_ON(!len); XE_BUG_ON(!len);
XE_BUG_ON(len > GEN11_SOFT_SCRATCH_COUNT); 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) ...@@ -723,10 +725,24 @@ int xe_guc_mmio_send(struct xe_guc *guc, const u32 *request, u32 len)
return -EPROTO; 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 */ /* Use data from the GuC response as our return value */
return FIELD_GET(GUC_HXG_RESPONSE_MSG_0_DATA0, header); 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) static int guc_self_cfg(struct xe_guc *guc, u16 key, u16 len, u64 val)
{ {
u32 request[HOST2GUC_SELF_CFG_REQUEST_MSG_LEN] = { u32 request[HOST2GUC_SELF_CFG_REQUEST_MSG_LEN] = {
......
...@@ -23,6 +23,8 @@ int xe_guc_suspend(struct xe_guc *guc); ...@@ -23,6 +23,8 @@ int xe_guc_suspend(struct xe_guc *guc);
void xe_guc_notify(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_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(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_cfg32(struct xe_guc *guc, u16 key, u32 val);
int xe_guc_self_cfg64(struct xe_guc *guc, u16 key, u64 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); 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