From 5e37266307df08f981d929c267bab6bfae8c4d53 Mon Sep 17 00:00:00 2001 From: Matthew Brost Date: Thu, 12 Jan 2023 17:25:33 -0500 Subject: 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: Matthew Brost Reviewed-by: Philippe Lecluse Signed-off-by: Rodrigo Vivi --- drivers/gpu/drm/xe/xe_guc.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'drivers/gpu/drm/xe/xe_guc.c') diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c index 2efa01dfff6d..88a3a96da084 100644 --- a/drivers/gpu/drm/xe/xe_guc.c +++ b/drivers/gpu/drm/xe/xe_guc.c @@ -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 @@ proto: 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] = { -- cgit v1.2.3