From: Matthew Brost Date: Thu, 12 Jan 2023 22:25:33 +0000 (-0500) Subject: drm/xe/guc: Add support GuC MMIO send / recv X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=5e37266307df08f981d929c267bab6bfae8c4d53;p=linux.git 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 --- diff --git a/drivers/gpu/drm/xe/xe_guc.c b/drivers/gpu/drm/xe/xe_guc.c index 2efa01dfff6d0..88a3a96da0845 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] = { diff --git a/drivers/gpu/drm/xe/xe_guc.h b/drivers/gpu/drm/xe/xe_guc.h index 923efee909915..7be33458eef62 100644 --- a/drivers/gpu/drm/xe/xe_guc.h +++ b/drivers/gpu/drm/xe/xe_guc.h @@ -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);