]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/xe/guc: Add support GuC MMIO send / recv
authorMatthew Brost <matthew.brost@intel.com>
Thu, 12 Jan 2023 22:25:33 +0000 (17:25 -0500)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 12 Dec 2023 19:06:00 +0000 (14:06 -0500)
SRIOV has a use case of GuC MMIO send / recv, add a function for it.

Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Reviewed-by: Philippe Lecluse <philippe.lecluse1@gmail.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_guc.c
drivers/gpu/drm/xe/xe_guc.h

index 2efa01dfff6d030e537f269cadb62200b5ad14ea..88a3a96da0845c78b79793905ed75582abbb9006 100644 (file)
@@ -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] = {
index 923efee9099156d257c235a1c02bc353e1a06bc0..7be33458eef62e17e7fd56b47152c5a8d8d2b5b8 100644 (file)
@@ -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);