Commit 459a0ce8 authored by Lucas De Marchi's avatar Lucas De Marchi
Browse files

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: default avatarRaag Jadav <raag.jadav@intel.com>
Link: https://patch.msgid.link/20251110-pcode-errmap-v2-1-cb18c8f54238@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent 53361aa6
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -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,
+0 −6
Original line number Diff line number Diff line
@@ -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;
};