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>
This commit is contained in:
Lucas De Marchi 2025-11-10 08:41:08 -08:00
parent 53361aa64f
commit 459a0ce8dc
2 changed files with 26 additions and 20 deletions

View File

@ -32,27 +32,39 @@
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,

View 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;
};