]> git.hungrycats.org Git - linux/commitdiff
drm/xe/sysctrl: Read mailbox phase bit from hardware
authorAnoop Vijay <anoop.c.vijay@intel.com>
Tue, 25 Aug 2026 17:28:28 +0000 (10:28 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Thu, 27 Aug 2026 16:00:17 +0000 (12:00 -0400)
The mailbox PHASE bit in SYSCTRL_MB_CTRL is toggled per-message and
was tracked in software as sc->phase_bit, reset to 0 on error paths.
If the cached value ever drifts from what the hardware last saw, all
following messages carry the wrong phase and get silently misread by
firmware.

Drop the cache and read PHASE directly from SYSCTRL_MB_CTRL before
each frame instead, removing xe_sysctrl_mailbox_init() and its call
sites along with it.

Fixes: 1f95f618182b ("drm/xe/xe_sysctrl: Add System Controller mailbox communication support")
Signed-off-by: Anoop Vijay <anoop.c.vijay@intel.com>
Reviewed-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patch.msgid.link/20260825172827.3801591-2-anoop.c.vijay@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
(cherry picked from commit 04984fcdbf6876c940c01026a7404c1e9cc91ba7)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_sysctrl.c
drivers/gpu/drm/xe/xe_sysctrl_mailbox.c
drivers/gpu/drm/xe/xe_sysctrl_mailbox.h
drivers/gpu/drm/xe/xe_sysctrl_types.h

index 1db20be8158b56c19e2db656e570de7ac041e64b..62ccc9be71b45a6861c848be3dc8fd3755a3ad48 100644 (file)
@@ -85,7 +85,6 @@ int xe_sysctrl_init(struct xe_device *xe)
                return ret;
 
        xe->soc_remapper.set_sysctrl_region(xe, SYSCTRL_MAILBOX_INDEX);
-       xe_sysctrl_mailbox_init(sc);
        INIT_WORK(&sc->work, xe_sysctrl_work);
 
        return devm_add_action_or_reset(xe->drm.dev, sysctrl_fini, xe);
@@ -114,12 +113,10 @@ void xe_sysctrl_irq_handler(struct xe_device *xe, u32 master_ctl)
  * @xe: xe device instance
  *
  * Invoked during system resume (S3/S4 to S0) and runtime resume from D3cold.
- * Restores SoC remapper configuration and reinitializes mailbox interface.
+ * Restores SoC remapper configuration.
  */
 void xe_sysctrl_pm_resume(struct xe_device *xe)
 {
-       struct xe_sysctrl *sc = &xe->sc;
-
        if (!xe->info.has_soc_remapper_sysctrl)
                return;
 
@@ -127,6 +124,4 @@ void xe_sysctrl_pm_resume(struct xe_device *xe)
                return;
 
        xe->soc_remapper.set_sysctrl_region(xe, SYSCTRL_MAILBOX_INDEX);
-
-       xe_sysctrl_mailbox_init(sc);
 }
index e13eebaac1d006ce2dcb00f27703dc735ff008c7..72baf1aa4b3ad68b6af5f7be32e9f4e40c48d5be 100644 (file)
@@ -145,6 +145,7 @@ static int sysctrl_send_frames(struct xe_sysctrl *sc,
        struct xe_device *xe = sc_to_xe(sc);
        u32 ctrl_reg, total_frames, frame;
        size_t bytes_sent, frame_size;
+       bool phase;
 
        total_frames = DIV_ROUND_UP(cmd_size, XE_SYSCTRL_MB_FRAME_SIZE);
 
@@ -153,7 +154,8 @@ static int sysctrl_send_frames(struct xe_sysctrl *sc,
                return -EBUSY;
        }
 
-       sc->phase_bit ^= 1;
+       ctrl_reg = xe_mmio_read32(sc->mmio, SYSCTRL_MB_CTRL);
+       phase = !(ctrl_reg & SYSCTRL_FRAME_PHASE);
        bytes_sent = 0;
 
        for (frame = 0; frame < total_frames; frame++) {
@@ -161,7 +163,6 @@ static int sysctrl_send_frames(struct xe_sysctrl *sc,
 
                if (sysctrl_write_frame(sc, mbox_cmd + bytes_sent, frame_size)) {
                        xe_err(xe, "sysctrl: Failed to write frame %u\n", frame);
-                       sc->phase_bit = 0;
                        return -EIO;
                }
 
@@ -169,13 +170,12 @@ static int sysctrl_send_frames(struct xe_sysctrl *sc,
                           REG_FIELD_PREP(SYSCTRL_FRAME_CURRENT_MASK, frame) |
                           REG_FIELD_PREP(SYSCTRL_FRAME_TOTAL_MASK, total_frames - 1) |
                           SYSCTRL_MB_CTRL_CMD |
-                          (sc->phase_bit ? SYSCTRL_FRAME_PHASE : 0);
+                          (phase ? SYSCTRL_FRAME_PHASE : 0);
 
                xe_mmio_write32(sc->mmio, SYSCTRL_MB_CTRL, ctrl_reg);
 
                if (!sysctrl_wait_bit_clear(sc, SYSCTRL_MB_CTRL_RUN_BUSY, timeout_ms)) {
                        xe_err(xe, "sysctrl: Frame %u acknowledgment timeout\n", frame);
-                       sc->phase_bit = 0;
                        return -ETIMEDOUT;
                }
 
@@ -321,20 +321,6 @@ void xe_sysctrl_create_command(struct xe_sysctrl_mailbox_command *command, u8 gr
        command->data_out_len = response_len;
 }
 
-/**
- * xe_sysctrl_mailbox_init - Initialize System Controller mailbox interface
- * @sc: System controller structure
- *
- * Initialize system controller mailbox interface for communication.
- */
-void xe_sysctrl_mailbox_init(struct xe_sysctrl *sc)
-{
-       u32 ctrl_reg;
-
-       ctrl_reg = xe_mmio_read32(sc->mmio, SYSCTRL_MB_CTRL);
-       sc->phase_bit = (ctrl_reg & SYSCTRL_FRAME_PHASE) ? 1 : 0;
-}
-
 /**
  * xe_sysctrl_send_command() - Send mailbox command to System Controller
  * @sc: System Controller instance
index fb434cc165b2aab1fb76d4957e704ab2c450bdab..f0d5e3d7f5e31cf7e573203e295d0bb28e65e30d 100644 (file)
@@ -26,7 +26,6 @@ struct xe_sysctrl_mailbox_command;
 void xe_sysctrl_create_command(struct xe_sysctrl_mailbox_command *command, u8 group_id, u8 cmd_id,
                               void *request, size_t request_len, void *response,
                               size_t response_len);
-void xe_sysctrl_mailbox_init(struct xe_sysctrl *sc);
 int xe_sysctrl_send_command(struct xe_sysctrl *sc,
                            struct xe_sysctrl_mailbox_command *cmd,
                            size_t *rdata_len);
index 66ba24f43017d508781483239e904768190d5697..98c2f473f7c6a1247de17d55ded2ae142b7e1f33 100644 (file)
@@ -26,9 +26,6 @@ struct xe_sysctrl {
        /** @cmd_lock: Mutex protecting mailbox command operations */
        struct mutex cmd_lock;
 
-       /** @phase_bit: Message boundary phase toggle bit (0 or 1) */
-       bool phase_bit;
-
        /** @work: Pending events worker */
        struct work_struct work;