]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/xe/pcode: Rework error mapping
authorLucas De Marchi <lucas.demarchi@intel.com>
Mon, 10 Nov 2025 16:41:08 +0000 (08:41 -0800)
committerLucas De Marchi <lucas.demarchi@intel.com>
Wed, 12 Nov 2025 16:57:27 +0000 (08:57 -0800)
The sparse array used for error decoding from is unnecessarily big. It
should be better handled by a switch statement that will also allow us
to more easily improve this code.

Add a CASE_ERR() macro to keep the table compact and use it instead of
the 256-entries array, which saves some space:

$ bloat-o-meter xe_pcode.o.old xe_pcode.o
add/remove: 0/1 grow/shrink: 2/0 up/down: 190/-4096 (-3906)
Function                                     old     new   delta
__pcode_mailbox_rw                           363     465    +102
__pcode_mailbox_rw.cold                       58     146     +88
err_decode                                  4096       -   -4096
Total: Before=7890, After=3984, chg -49.51%

Reviewed-by: Raag Jadav <raag.jadav@intel.com>
Link: https://patch.msgid.link/20251110-pcode-errmap-v2-1-cb18c8f54238@intel.com
Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
drivers/gpu/drm/xe/xe_pcode.c
drivers/gpu/drm/xe/xe_pcode_api.h

index 6a7ddb9005f993a5e1369a0808605bb71efc4745..0d33c14ea0cf6016462a9a266d549381e056716e 100644 (file)
 
 static int pcode_mailbox_status(struct xe_tile *tile)
 {
+       const char *err_str;
+       int err_decode;
        u32 err;
-       static const struct pcode_err_decode err_decode[] = {
-               [PCODE_ILLEGAL_CMD] = {-ENXIO, "Illegal Command"},
-               [PCODE_TIMEOUT] = {-ETIMEDOUT, "Timed out"},
-               [PCODE_ILLEGAL_DATA] = {-EINVAL, "Illegal Data"},
-               [PCODE_ILLEGAL_SUBCOMMAND] = {-ENXIO, "Illegal Subcommand"},
-               [PCODE_LOCKED] = {-EBUSY, "PCODE Locked"},
-               [PCODE_GT_RATIO_OUT_OF_RANGE] = {-EOVERFLOW,
-                       "GT ratio out of range"},
-               [PCODE_REJECTED] = {-EACCES, "PCODE Rejected"},
-               [PCODE_ERROR_MASK] = {-EPROTO, "Unknown"},
-       };
+
+#define CASE_ERR(_err, _err_decode, _err_str)  \
+       case _err:                              \
+               err_decode = _err_decode;       \
+               err_str = _err_str;             \
+               break
 
        err = xe_mmio_read32(&tile->mmio, PCODE_MAILBOX) & PCODE_ERROR_MASK;
+       switch (err) {
+       CASE_ERR(PCODE_ILLEGAL_CMD,           -ENXIO,     "Illegal Command");
+       CASE_ERR(PCODE_TIMEOUT,               -ETIMEDOUT, "Timed out");
+       CASE_ERR(PCODE_ILLEGAL_DATA,          -EINVAL,    "Illegal Data");
+       CASE_ERR(PCODE_ILLEGAL_SUBCOMMAND,    -ENXIO,     "Illegal Subcommand");
+       CASE_ERR(PCODE_LOCKED,                -EBUSY,     "PCODE Locked");
+       CASE_ERR(PCODE_GT_RATIO_OUT_OF_RANGE, -EOVERFLOW, "GT ratio out of range");
+       CASE_ERR(PCODE_REJECTED,              -EACCES,    "PCODE Rejected");
+       default:
+               err_decode = -EPROTO;
+               err_str = "Unknown";
+       }
+
        if (err) {
-               drm_err(&tile_to_xe(tile)->drm, "PCODE Mailbox failed: %d %s", err,
-                       err_decode[err].str ?: "Unknown");
-               return err_decode[err].errno ?: -EPROTO;
+               drm_err(&tile_to_xe(tile)->drm, "PCODE Mailbox failed: %d %s",
+                       err_decode, err_str);
+
+               return err_decode;
        }
 
        return 0;
+#undef CASE_ERR
 }
 
 static int __pcode_mailbox_rw(struct xe_tile *tile, u32 mbox, u32 *data0, u32 *data1,
index 92bfcba51e199c06d24056896f7877e57b7cd69a..70dcd6625680c76a494879d162793d0c77f6387b 100644 (file)
@@ -92,9 +92,3 @@
 #define BMG_PCIE_CAP                   XE_REG(0x138340)
 #define   LINK_DOWNGRADE               REG_GENMASK(1, 0)
 #define     DOWNGRADE_CAPABLE          2
-
-struct pcode_err_decode {
-       int errno;
-       const char *str;
-};
-