Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/xe/pcode: Rework error mapping

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>

+26 -20
+26 -14
drivers/gpu/drm/xe/xe_pcode.c
··· 32 32 33 33 static int pcode_mailbox_status(struct xe_tile *tile) 34 34 { 35 + const char *err_str; 36 + int err_decode; 35 37 u32 err; 36 - static const struct pcode_err_decode err_decode[] = { 37 - [PCODE_ILLEGAL_CMD] = {-ENXIO, "Illegal Command"}, 38 - [PCODE_TIMEOUT] = {-ETIMEDOUT, "Timed out"}, 39 - [PCODE_ILLEGAL_DATA] = {-EINVAL, "Illegal Data"}, 40 - [PCODE_ILLEGAL_SUBCOMMAND] = {-ENXIO, "Illegal Subcommand"}, 41 - [PCODE_LOCKED] = {-EBUSY, "PCODE Locked"}, 42 - [PCODE_GT_RATIO_OUT_OF_RANGE] = {-EOVERFLOW, 43 - "GT ratio out of range"}, 44 - [PCODE_REJECTED] = {-EACCES, "PCODE Rejected"}, 45 - [PCODE_ERROR_MASK] = {-EPROTO, "Unknown"}, 46 - }; 38 + 39 + #define CASE_ERR(_err, _err_decode, _err_str) \ 40 + case _err: \ 41 + err_decode = _err_decode; \ 42 + err_str = _err_str; \ 43 + break 47 44 48 45 err = xe_mmio_read32(&tile->mmio, PCODE_MAILBOX) & PCODE_ERROR_MASK; 46 + switch (err) { 47 + CASE_ERR(PCODE_ILLEGAL_CMD, -ENXIO, "Illegal Command"); 48 + CASE_ERR(PCODE_TIMEOUT, -ETIMEDOUT, "Timed out"); 49 + CASE_ERR(PCODE_ILLEGAL_DATA, -EINVAL, "Illegal Data"); 50 + CASE_ERR(PCODE_ILLEGAL_SUBCOMMAND, -ENXIO, "Illegal Subcommand"); 51 + CASE_ERR(PCODE_LOCKED, -EBUSY, "PCODE Locked"); 52 + CASE_ERR(PCODE_GT_RATIO_OUT_OF_RANGE, -EOVERFLOW, "GT ratio out of range"); 53 + CASE_ERR(PCODE_REJECTED, -EACCES, "PCODE Rejected"); 54 + default: 55 + err_decode = -EPROTO; 56 + err_str = "Unknown"; 57 + } 58 + 49 59 if (err) { 50 - drm_err(&tile_to_xe(tile)->drm, "PCODE Mailbox failed: %d %s", err, 51 - err_decode[err].str ?: "Unknown"); 52 - return err_decode[err].errno ?: -EPROTO; 60 + drm_err(&tile_to_xe(tile)->drm, "PCODE Mailbox failed: %d %s", 61 + err_decode, err_str); 62 + 63 + return err_decode; 53 64 } 54 65 55 66 return 0; 67 + #undef CASE_ERR 56 68 } 57 69 58 70 static int __pcode_mailbox_rw(struct xe_tile *tile, u32 mbox, u32 *data0, u32 *data1,
-6
drivers/gpu/drm/xe/xe_pcode_api.h
··· 92 92 #define BMG_PCIE_CAP XE_REG(0x138340) 93 93 #define LINK_DOWNGRADE REG_GENMASK(1, 0) 94 94 #define DOWNGRADE_CAPABLE 2 95 - 96 - struct pcode_err_decode { 97 - int errno; 98 - const char *str; 99 - }; 100 -