[PATCH v2] drm/xe: Prefer BIT/GENMASK macros over shifts
Jani Nikula
jani.nikula at linux.intel.com
Wed Jan 24 09:45:24 UTC 2024
On Tue, 23 Jan 2024, Matthew Brost <matthew.brost at intel.com> wrote:
> Using BIT/GENMASK macros is a better convention than using manual shift
> and will also fix build errors [1].
One of the reasons i915 does not really use BIT and GENMASK directly is
that their type is unsigned long, and thus their size is different on 32
and 64 bit builds, while almost invariably you need one or the other to
describe hardware or firmware interfaces. Not something that depends on
the build.
Using %lu or %lx as format specifier should work, but people find it
weird to have to use that for essentially 32-bit things, and forget. And
there's confusion when you still have stuff like:
#define GUC_CTB_STATUS_NO_ERROR 0
instead of 0UL i.e. some of the macros end up being unsigned long with
variable size, and some, like this, not.
I'm sure the REG_BIT and REG_GENMASK macros feel off-putting for things
that aren't exactly registers (like the firmware interface), but let's
hope we get Lucas' fixed-size BIT and GENMASK macros merged [1], and can
use them.
BR,
Jani.
[1] https://lore.kernel.org/r/20240124050205.3646390-1-lucas.demarchi@intel.com
>
> [1] http://kisskb.ellerman.id.au/kisskb/buildresult/15112475/log/
>
> v2:
> - Include abi/*.h files (Jani / Michal)
>
> Fixes: dd08ebf6c352 ("drm/xe: Introduce a new DRM driver for Intel GPUs")
> Cc: Thomas Hellström <thomas.hellstrom at linux.intel.com>
> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
> Signed-off-by: Matthew Brost <matthew.brost at intel.com>
> ---
> drivers/gpu/drm/xe/abi/guc_actions_abi.h | 13 ++++----
> drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h | 4 +--
> .../drm/xe/abi/guc_communication_ctb_abi.h | 14 ++++-----
> drivers/gpu/drm/xe/abi/guc_klvs_abi.h | 6 ++--
> drivers/gpu/drm/xe/abi/guc_messages_abi.h | 31 +++++++++----------
> drivers/gpu/drm/xe/xe_guc_ct.c | 2 +-
> drivers/gpu/drm/xe/xe_guc_relay.c | 2 +-
> 7 files changed, 35 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/abi/guc_actions_abi.h b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
> index 3062e0e0d467..083bd966829b 100644
> --- a/drivers/gpu/drm/xe/abi/guc_actions_abi.h
> +++ b/drivers/gpu/drm/xe/abi/guc_actions_abi.h
> @@ -50,8 +50,8 @@
>
> #define HOST2GUC_SELF_CFG_REQUEST_MSG_LEN (GUC_HXG_REQUEST_MSG_MIN_LEN + 3u)
> #define HOST2GUC_SELF_CFG_REQUEST_MSG_0_MBZ GUC_HXG_REQUEST_MSG_0_DATA0
> -#define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_KEY (0xffff << 16)
> -#define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_LEN (0xffff << 0)
> +#define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_KEY GENMASK(31, 16)
> +#define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_LEN GENMASK(15, 0)
> #define HOST2GUC_SELF_CFG_REQUEST_MSG_2_VALUE32 GUC_HXG_REQUEST_MSG_n_DATAn
> #define HOST2GUC_SELF_CFG_REQUEST_MSG_3_VALUE64 GUC_HXG_REQUEST_MSG_n_DATAn
>
> @@ -177,15 +177,14 @@ enum xe_guc_sleep_state_status {
> #define XE_GUC_SLEEP_STATE_INVALID_MASK 0x80000000
> };
>
> -#define GUC_LOG_CONTROL_LOGGING_ENABLED (1 << 0)
> -#define GUC_LOG_CONTROL_VERBOSITY_SHIFT 4
> -#define GUC_LOG_CONTROL_VERBOSITY_MASK (0xF << GUC_LOG_CONTROL_VERBOSITY_SHIFT)
> -#define GUC_LOG_CONTROL_DEFAULT_LOGGING (1 << 8)
> +#define GUC_LOG_CONTROL_LOGGING_ENABLED BIT(0)
> +#define GUC_LOG_CONTROL_VERBOSITY_MASK GENMASK(7, 4)
> +#define GUC_LOG_CONTROL_DEFAULT_LOGGING BIT(8)
>
> #define XE_GUC_TLB_INVAL_TYPE_SHIFT 0
> #define XE_GUC_TLB_INVAL_MODE_SHIFT 8
> /* Flush PPC or SMRO caches along with TLB invalidation request */
> -#define XE_GUC_TLB_INVAL_FLUSH_CACHE (1 << 31)
> +#define XE_GUC_TLB_INVAL_FLUSH_CACHE BIT(31)
>
> enum xe_guc_tlb_invalidation_type {
> XE_GUC_TLB_INVAL_FULL = 0x0,
> diff --git a/drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h b/drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h
> index 811add10c30d..ff49f283f5c3 100644
> --- a/drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h
> +++ b/drivers/gpu/drm/xe/abi/guc_actions_slpc_abi.h
> @@ -242,8 +242,8 @@ struct slpc_shared_data {
> (HOST2GUC_PC_SLPC_REQUEST_REQUEST_MSG_MIN_LEN + \
> HOST2GUC_PC_SLPC_EVENT_MAX_INPUT_ARGS)
> #define HOST2GUC_PC_SLPC_REQUEST_MSG_0_MBZ GUC_HXG_REQUEST_MSG_0_DATA0
> -#define HOST2GUC_PC_SLPC_REQUEST_MSG_1_EVENT_ID (0xff << 8)
> -#define HOST2GUC_PC_SLPC_REQUEST_MSG_1_EVENT_ARGC (0xff << 0)
> +#define HOST2GUC_PC_SLPC_REQUEST_MSG_1_EVENT_ID GENMASK(15, 8)
> +#define HOST2GUC_PC_SLPC_REQUEST_MSG_1_EVENT_ARGC GENMASK(7, 0)
> #define HOST2GUC_PC_SLPC_REQUEST_MSG_N_EVENT_DATA_N GUC_HXG_REQUEST_MSG_n_DATAn
>
> #endif
> diff --git a/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h b/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h
> index 4aaed1cb4e12..d7e4dd92c313 100644
> --- a/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h
> +++ b/drivers/gpu/drm/xe/abi/guc_communication_ctb_abi.h
> @@ -49,9 +49,9 @@ struct guc_ct_buffer_desc {
> u32 tail;
> u32 status;
> #define GUC_CTB_STATUS_NO_ERROR 0
> -#define GUC_CTB_STATUS_OVERFLOW (1 << 0)
> -#define GUC_CTB_STATUS_UNDERFLOW (1 << 1)
> -#define GUC_CTB_STATUS_MISMATCH (1 << 2)
> +#define GUC_CTB_STATUS_OVERFLOW BIT(0)
> +#define GUC_CTB_STATUS_UNDERFLOW BIT(1)
> +#define GUC_CTB_STATUS_MISMATCH BIT(2)
> u32 reserved[13];
> } __packed;
> static_assert(sizeof(struct guc_ct_buffer_desc) == 64);
> @@ -82,11 +82,11 @@ static_assert(sizeof(struct guc_ct_buffer_desc) == 64);
> #define GUC_CTB_HDR_LEN 1u
> #define GUC_CTB_MSG_MIN_LEN GUC_CTB_HDR_LEN
> #define GUC_CTB_MSG_MAX_LEN (GUC_CTB_MSG_MIN_LEN + GUC_CTB_MAX_DWORDS)
> -#define GUC_CTB_MSG_0_FENCE (0xffff << 16)
> -#define GUC_CTB_MSG_0_FORMAT (0xf << 12)
> +#define GUC_CTB_MSG_0_FENCE GENMASK(31, 16)
> +#define GUC_CTB_MSG_0_FORMAT GENMASK(15, 12)
> #define GUC_CTB_FORMAT_HXG 0u
> -#define GUC_CTB_MSG_0_RESERVED (0xf << 8)
> -#define GUC_CTB_MSG_0_NUM_DWORDS (0xff << 0)
> +#define GUC_CTB_MSG_0_RESERVED GENMASK(11, 8)
> +#define GUC_CTB_MSG_0_NUM_DWORDS GENMASK(7, 0)
> #define GUC_CTB_MAX_DWORDS 255
>
> /**
> diff --git a/drivers/gpu/drm/xe/abi/guc_klvs_abi.h b/drivers/gpu/drm/xe/abi/guc_klvs_abi.h
> index 47094b9b044c..076d072cb8b3 100644
> --- a/drivers/gpu/drm/xe/abi/guc_klvs_abi.h
> +++ b/drivers/gpu/drm/xe/abi/guc_klvs_abi.h
> @@ -31,9 +31,9 @@
> */
>
> #define GUC_KLV_LEN_MIN 1u
> -#define GUC_KLV_0_KEY (0xffff << 16)
> -#define GUC_KLV_0_LEN (0xffff << 0)
> -#define GUC_KLV_n_VALUE (0xffffffff << 0)
> +#define GUC_KLV_0_KEY GENMASK(31, 16)
> +#define GUC_KLV_0_LEN GENMASK(15, 0)
> +#define GUC_KLV_n_VALUE GENMASK(31, 0)
>
> /**
> * DOC: GuC Self Config KLVs
> diff --git a/drivers/gpu/drm/xe/abi/guc_messages_abi.h b/drivers/gpu/drm/xe/abi/guc_messages_abi.h
> index ff888d16bd4f..7cc79c0ce3bb 100644
> --- a/drivers/gpu/drm/xe/abi/guc_messages_abi.h
> +++ b/drivers/gpu/drm/xe/abi/guc_messages_abi.h
> @@ -6,6 +6,8 @@
> #ifndef _ABI_GUC_MESSAGES_ABI_H
> #define _ABI_GUC_MESSAGES_ABI_H
>
> +#include <linux/bits.h>
> +
> /**
> * DOC: HXG Message
> *
> @@ -41,10 +43,10 @@
> */
>
> #define GUC_HXG_MSG_MIN_LEN 1u
> -#define GUC_HXG_MSG_0_ORIGIN (0x1 << 31)
> +#define GUC_HXG_MSG_0_ORIGIN BIT(31)
> #define GUC_HXG_ORIGIN_HOST 0u
> #define GUC_HXG_ORIGIN_GUC 1u
> -#define GUC_HXG_MSG_0_TYPE (0x7 << 28)
> +#define GUC_HXG_MSG_0_TYPE GENMASK(30, 28)
> #define GUC_HXG_TYPE_REQUEST 0u
> #define GUC_HXG_TYPE_EVENT 1u
> #define GUC_HXG_TYPE_FAST_REQUEST 2u
> @@ -52,8 +54,8 @@
> #define GUC_HXG_TYPE_NO_RESPONSE_RETRY 5u
> #define GUC_HXG_TYPE_RESPONSE_FAILURE 6u
> #define GUC_HXG_TYPE_RESPONSE_SUCCESS 7u
> -#define GUC_HXG_MSG_0_AUX (0xfffffff << 0)
> -#define GUC_HXG_MSG_n_PAYLOAD (0xffffffff << 0)
> +#define GUC_HXG_MSG_0_AUX GENMASK(27, 0)
> +#define GUC_HXG_MSG_n_PAYLOAD GENMASK(31, 0)
>
> /**
> * DOC: HXG Request
> @@ -87,8 +89,8 @@
> */
>
> #define GUC_HXG_REQUEST_MSG_MIN_LEN GUC_HXG_MSG_MIN_LEN
> -#define GUC_HXG_REQUEST_MSG_0_DATA0 (0xfff << 16)
> -#define GUC_HXG_REQUEST_MSG_0_ACTION (0xffff << 0)
> +#define GUC_HXG_REQUEST_MSG_0_DATA0 GENMASK(27, 16)
> +#define GUC_HXG_REQUEST_MSG_0_ACTION GENMASK(15, 0)
> #define GUC_HXG_REQUEST_MSG_n_DATAn GUC_HXG_MSG_n_PAYLOAD
>
> /**
> @@ -119,8 +121,8 @@
> */
>
> #define GUC_HXG_EVENT_MSG_MIN_LEN GUC_HXG_MSG_MIN_LEN
> -#define GUC_HXG_EVENT_MSG_0_DATA0 (0xfff << 16)
> -#define GUC_HXG_EVENT_MSG_0_ACTION (0xffff << 0)
> +#define GUC_HXG_EVENT_MSG_0_DATA0 GENMASK(27, 16)
> +#define GUC_HXG_EVENT_MSG_0_ACTION GENMASK(15, 0)
> #define GUC_HXG_EVENT_MSG_n_DATAn GUC_HXG_MSG_n_PAYLOAD
>
> /**
> @@ -190,8 +192,8 @@
> */
>
> #define GUC_HXG_FAILURE_MSG_LEN GUC_HXG_MSG_MIN_LEN
> -#define GUC_HXG_FAILURE_MSG_0_HINT (0xfff << 16)
> -#define GUC_HXG_FAILURE_MSG_0_ERROR (0xffff << 0)
> +#define GUC_HXG_FAILURE_MSG_0_HINT GENMASK(27, 16)
> +#define GUC_HXG_FAILURE_MSG_0_ERROR GENMASK(15, 0)
>
> /**
> * DOC: HXG Response
> @@ -221,12 +223,9 @@
> #define GUC_HXG_RESPONSE_MSG_n_DATAn GUC_HXG_MSG_n_PAYLOAD
>
> /* deprecated */
> -#define INTEL_GUC_MSG_TYPE_SHIFT 28
> -#define INTEL_GUC_MSG_TYPE_MASK (0xF << INTEL_GUC_MSG_TYPE_SHIFT)
> -#define INTEL_GUC_MSG_DATA_SHIFT 16
> -#define INTEL_GUC_MSG_DATA_MASK (0xFFF << INTEL_GUC_MSG_DATA_SHIFT)
> -#define INTEL_GUC_MSG_CODE_SHIFT 0
> -#define INTEL_GUC_MSG_CODE_MASK (0xFFFF << INTEL_GUC_MSG_CODE_SHIFT)
> +#define INTEL_GUC_MSG_TYPE_MASK GENMASK(31, 28)
> +#define INTEL_GUC_MSG_DATA_MASK GENMASK(27, 16)
> +#define INTEL_GUC_MSG_CODE_MASK GENMASK(15, 0)
>
> enum intel_guc_msg_type {
> INTEL_GUC_MSG_TYPE_REQUEST = 0x0,
> diff --git a/drivers/gpu/drm/xe/xe_guc_ct.c b/drivers/gpu/drm/xe/xe_guc_ct.c
> index ee5d99456aeb..fc5cc2b2bcc5 100644
> --- a/drivers/gpu/drm/xe/xe_guc_ct.c
> +++ b/drivers/gpu/drm/xe/xe_guc_ct.c
> @@ -866,7 +866,7 @@ static int parse_g2h_response(struct xe_guc_ct *ct, u32 *msg, u32 len)
> */
> if (fence & CT_SEQNO_UNTRACKED) {
> if (type == GUC_HXG_TYPE_RESPONSE_FAILURE)
> - xe_gt_err(gt, "FAST_REQ H2G fence 0x%x failed! e=0x%x, h=%u\n",
> + xe_gt_err(gt, "FAST_REQ H2G fence 0x%x failed! e=0x%lx, h=%lu\n",
> fence,
> FIELD_GET(GUC_HXG_FAILURE_MSG_0_ERROR, hxg[0]),
> FIELD_GET(GUC_HXG_FAILURE_MSG_0_HINT, hxg[0]));
> diff --git a/drivers/gpu/drm/xe/xe_guc_relay.c b/drivers/gpu/drm/xe/xe_guc_relay.c
> index c0a2d8d5d3b3..2d1f19270d9a 100644
> --- a/drivers/gpu/drm/xe/xe_guc_relay.c
> +++ b/drivers/gpu/drm/xe/xe_guc_relay.c
> @@ -300,7 +300,7 @@ static int relay_send_transaction(struct xe_guc_relay *relay, struct relay_trans
> ret = -EPROTO;
> }
> if (unlikely(ret < 0)) {
> - relay_notice(relay, "Failed to send %s.%x to GuC (%pe) %*ph ...\n",
> + relay_notice(relay, "Failed to send %s.%lx to GuC (%pe) %*ph ...\n",
> guc_hxg_type_to_string(FIELD_GET(GUC_HXG_MSG_0_TYPE, buf[0])),
> FIELD_GET(GUC_HXG_REQUEST_MSG_0_ACTION, buf[0]),
> ERR_PTR(ret), (int)sizeof(u32) * txn->offset, buf);
--
Jani Nikula, Intel
More information about the Intel-xe
mailing list