* [PATCH v2 0/2] drm/imagination: GPU_ID-related cleanups
@ 2026-03-20 15:22 Matt Coster
2026-03-20 15:22 ` [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi Matt Coster
2026-03-20 15:22 ` [PATCH v2 2/2] drm/imagination: Add PVR_GPU_ID_FMT to format pvr_gpu_id Matt Coster
0 siblings, 2 replies; 4+ messages in thread
From: Matt Coster @ 2026-03-20 15:22 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann,
David Airlie, Simona Vetter
Cc: Frank Binns, Brajesh Gupta, Alessio Belle, Alexandru Dadu,
dri-devel, linux-kernel, Matt Coster
Just a couple quick QoL improvements around GPU_IDs.
The first patch touches the UAPI, but is not intended to introduce any
functional changes; it simply codifies the existing documented layout of
packed BVNC fields as a series of GENMASKed macros.
Signed-off-by: Matt Coster <matt.coster@imgtec.com>
---
Changes in v2:
- Add _CONST variant of PVR_PACKED_BVNC() for use in case statements.
This fixes the build issue reported by the test bot[1][2] (P1)
- Simplify the change made to pvr_fw_validate() (P2)
- Link to v1: https://patch.msgid.link/20260206-bvnc-cleanup-v1-0-f3c818541fbe@imgtec.com
[1]: https://lore.kernel.org/r/202602070204.PjaKNSpZ-lkp@intel.com/
[2]: https://lore.kernel.org/r/202602070500.zo0DrH6U-lkp@intel.com/
---
Matt Coster (2):
drm/imagination: Define packed BVNCs in the uapi
drm/imagination: Add PVR_GPU_ID_FMT to format pvr_gpu_id
drivers/gpu/drm/imagination/pvr_device.c | 10 +++----
drivers/gpu/drm/imagination/pvr_device.h | 49 +++++++++++++++-----------------
drivers/gpu/drm/imagination/pvr_fw.c | 9 ++----
include/uapi/drm/pvr_drm.h | 14 ++++-----
4 files changed, 38 insertions(+), 44 deletions(-)
---
base-commit: fbef867cf6614178bc6afd15ee15f85cddf19eab
change-id: 20260206-bvnc-cleanup-446e70666747
^ permalink raw reply [flat|nested] 4+ messages in thread* [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi 2026-03-20 15:22 [PATCH v2 0/2] drm/imagination: GPU_ID-related cleanups Matt Coster @ 2026-03-20 15:22 ` Matt Coster 2026-03-22 14:46 ` kernel test robot 2026-03-20 15:22 ` [PATCH v2 2/2] drm/imagination: Add PVR_GPU_ID_FMT to format pvr_gpu_id Matt Coster 1 sibling, 1 reply; 4+ messages in thread From: Matt Coster @ 2026-03-20 15:22 UTC (permalink / raw) To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter Cc: Frank Binns, Brajesh Gupta, Alessio Belle, Alexandru Dadu, dri-devel, linux-kernel, Matt Coster Using the uapi-safe __GENMASK_ULL(), we can stably define the layout of 64-bit packed BVNCs. These defs replace the replicated doc comment that appears all over the place. Signed-off-by: Matt Coster <matt.coster@imgtec.com> --- Changes in v2: - Add _CONST variant of PVR_PACKED_BVNC() for use in case statements. This fixes the build issue reported by the test bot[1][2] - Link to v1: https://patch.msgid.link/20260206-bvnc-cleanup-v1-1-f3c818541fbe@imgtec.com [1]: https://lore.kernel.org/r/202602070204.PjaKNSpZ-lkp@intel.com/ [2]: https://lore.kernel.org/r/202602070500.zo0DrH6U-lkp@intel.com/ --- drivers/gpu/drm/imagination/pvr_device.c | 6 ++--- drivers/gpu/drm/imagination/pvr_device.h | 43 +++++++++++++------------------- include/uapi/drm/pvr_drm.h | 14 +++++------ 3 files changed, 27 insertions(+), 36 deletions(-) diff --git a/drivers/gpu/drm/imagination/pvr_device.c b/drivers/gpu/drm/imagination/pvr_device.c index f58bb66a6327..9b26585a42bf 100644 --- a/drivers/gpu/drm/imagination/pvr_device.c +++ b/drivers/gpu/drm/imagination/pvr_device.c @@ -547,11 +547,11 @@ static enum pvr_gpu_support_level pvr_gpu_support_level(const struct pvr_gpu_id *gpu_id) { switch (pvr_gpu_id_to_packed_bvnc(gpu_id)) { - case PVR_PACKED_BVNC(33, 15, 11, 3): - case PVR_PACKED_BVNC(36, 53, 104, 796): + case PVR_PACKED_BVNC_CONST(33, 15, 11, 3): + case PVR_PACKED_BVNC_CONST(36, 53, 104, 796): return PVR_GPU_SUPPORTED; - case PVR_PACKED_BVNC(36, 52, 104, 182): + case PVR_PACKED_BVNC_CONST(36, 52, 104, 182): return PVR_GPU_EXPERIMENTAL; default: diff --git a/drivers/gpu/drm/imagination/pvr_device.h b/drivers/gpu/drm/imagination/pvr_device.h index d51c57cf9332..55d8ff11d507 100644 --- a/drivers/gpu/drm/imagination/pvr_device.h +++ b/drivers/gpu/drm/imagination/pvr_device.h @@ -14,7 +14,7 @@ #include <drm/drm_file.h> #include <drm/drm_mm.h> -#include <linux/bits.h> +#include <linux/bitfield.h> #include <linux/compiler_attributes.h> #include <linux/compiler_types.h> #include <linux/device.h> @@ -470,6 +470,12 @@ struct pvr_file { #define to_pvr_file(file) ((file)->driver_priv) +#define __PVR_PACKED_BVNC(prep, b, v, n, c) \ + (prep(DRM_PVR_BVNC_B, b) | \ + prep(DRM_PVR_BVNC_V, v) | \ + prep(DRM_PVR_BVNC_N, n) | \ + prep(DRM_PVR_BVNC_C, c)) + /** * PVR_PACKED_BVNC() - Packs B, V, N and C values into a 64-bit unsigned integer * @b: Branch ID. @@ -477,39 +483,24 @@ struct pvr_file { * @n: Number of scalable units. * @c: Config ID. * - * The packed layout is as follows: - * - * +--------+--------+--------+-------+ - * | 63..48 | 47..32 | 31..16 | 15..0 | - * +========+========+========+=======+ - * | B | V | N | C | - * +--------+--------+--------+-------+ + * The packed layout follows the bitfield defined by the DRM_PVR_BVNC_* macros. * * pvr_gpu_id_to_packed_bvnc() should be used instead of this macro when a * &struct pvr_gpu_id is available in order to ensure proper type checking. * * Return: Packed BVNC. */ -/* clang-format off */ -#define PVR_PACKED_BVNC(b, v, n, c) \ - ((((u64)(b) & GENMASK_ULL(15, 0)) << 48) | \ - (((u64)(v) & GENMASK_ULL(15, 0)) << 32) | \ - (((u64)(n) & GENMASK_ULL(15, 0)) << 16) | \ - (((u64)(c) & GENMASK_ULL(15, 0)) << 0)) -/* clang-format on */ +#define PVR_PACKED_BVNC(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP, b, v, n, c) + +/** PVR_PACKED_BVNC_CONST() - Compile-time equivalent of PVR_PACKED_BVNC(). */ +#define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) /** * pvr_gpu_id_to_packed_bvnc() - Packs B, V, N and C values into a 64-bit * unsigned integer * @gpu_id: GPU ID. * - * The packed layout is as follows: - * - * +--------+--------+--------+-------+ - * | 63..48 | 47..32 | 31..16 | 15..0 | - * +========+========+========+=======+ - * | B | V | N | C | - * +--------+--------+--------+-------+ + * The packed layout follows the bitfield defined by the DRM_PVR_BVNC_* macros. * * This should be used in preference to PVR_PACKED_BVNC() when a &struct * pvr_gpu_id is available in order to ensure proper type checking. @@ -525,10 +516,10 @@ pvr_gpu_id_to_packed_bvnc(const struct pvr_gpu_id *gpu_id) static __always_inline void packed_bvnc_to_pvr_gpu_id(u64 bvnc, struct pvr_gpu_id *gpu_id) { - gpu_id->b = (bvnc & GENMASK_ULL(63, 48)) >> 48; - gpu_id->v = (bvnc & GENMASK_ULL(47, 32)) >> 32; - gpu_id->n = (bvnc & GENMASK_ULL(31, 16)) >> 16; - gpu_id->c = bvnc & GENMASK_ULL(15, 0); + gpu_id->b = FIELD_GET(DRM_PVR_BVNC_B, bvnc); + gpu_id->v = FIELD_GET(DRM_PVR_BVNC_V, bvnc); + gpu_id->n = FIELD_GET(DRM_PVR_BVNC_N, bvnc); + gpu_id->c = FIELD_GET(DRM_PVR_BVNC_C, bvnc); } int pvr_device_init(struct pvr_device *pvr_dev); diff --git a/include/uapi/drm/pvr_drm.h b/include/uapi/drm/pvr_drm.h index ccf6c2112468..72f3f90560cf 100644 --- a/include/uapi/drm/pvr_drm.h +++ b/include/uapi/drm/pvr_drm.h @@ -6,6 +6,7 @@ #include "drm.h" +#include <linux/bits.h> #include <linux/const.h> #include <linux/types.h> @@ -113,6 +114,11 @@ struct drm_pvr_obj_array { * DOC: PowerVR IOCTL DEV_QUERY interface */ +#define DRM_PVR_BVNC_B __GENMASK_ULL(63, 48) +#define DRM_PVR_BVNC_V __GENMASK_ULL(47, 32) +#define DRM_PVR_BVNC_N __GENMASK_ULL(31, 16) +#define DRM_PVR_BVNC_C __GENMASK_ULL(15, 0) + /** * struct drm_pvr_dev_query_gpu_info - Container used to fetch information about * the graphics processor. @@ -125,13 +131,7 @@ struct drm_pvr_dev_query_gpu_info { * @gpu_id: GPU identifier. * * For all currently supported GPUs this is the BVNC encoded as a 64-bit - * value as follows: - * - * +--------+--------+--------+-------+ - * | 63..48 | 47..32 | 31..16 | 15..0 | - * +========+========+========+=======+ - * | B | V | N | C | - * +--------+--------+--------+-------+ + * value using the DRM_PVR_BVNC_* bitmasks. */ __u64 gpu_id; -- 2.53.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi 2026-03-20 15:22 ` [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi Matt Coster @ 2026-03-22 14:46 ` kernel test robot 0 siblings, 0 replies; 4+ messages in thread From: kernel test robot @ 2026-03-22 14:46 UTC (permalink / raw) To: Matt Coster, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter Cc: oe-kbuild-all, Frank Binns, Brajesh Gupta, Alessio Belle, Alexandru Dadu, dri-devel, linux-kernel, Matt Coster Hi Matt, kernel test robot noticed the following build errors: [auto build test ERROR on fbef867cf6614178bc6afd15ee15f85cddf19eab] url: https://github.com/intel-lab-lkp/linux/commits/Matt-Coster/drm-imagination-Define-packed-BVNCs-in-the-uapi/20260322-112647 base: fbef867cf6614178bc6afd15ee15f85cddf19eab patch link: https://lore.kernel.org/r/20260320-bvnc-cleanup-v2-1-49c3c1453289%40imgtec.com patch subject: [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi config: arm64-randconfig-002-20260322 (https://download.01.org/0day-ci/archive/20260322/202603222211.A2XiR1YU-lkp@intel.com/config) compiler: aarch64-linux-gcc (GCC) 11.5.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260322/202603222211.A2XiR1YU-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202603222211.A2XiR1YU-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from include/linux/build_bug.h:5, from include/linux/bits.h:30, from drivers/gpu/drm/imagination/pvr_rogue_fwif.h:7, from drivers/gpu/drm/imagination/pvr_ccb.h:7, from drivers/gpu/drm/imagination/pvr_device.h:7, from drivers/gpu/drm/imagination/pvr_device.c:4: drivers/gpu/drm/imagination/pvr_device.c: In function 'pvr_gpu_support_level': >> include/linux/compiler.h:203:82: error: expression in static assertion is not constant 203 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | ^~~~ include/linux/build_bug.h:17:9: note: in expansion of macro '__BUILD_BUG_ON_ZERO_MSG' 17 | __BUILD_BUG_ON_ZERO_MSG(e, ##__VA_ARGS__, #e " is true") | ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:160:17: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 160 | BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \ | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.h:474:10: note: in expansion of macro 'FIELD_PREP_CONST' 474 | (prep(DRM_PVR_BVNC_B, b) | \ | ^~~~ drivers/gpu/drm/imagination/pvr_device.h:496:43: note: in expansion of macro '__PVR_PACKED_BVNC' 496 | #define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.c:550:14: note: in expansion of macro 'PVR_PACKED_BVNC_CONST' 550 | case PVR_PACKED_BVNC_CONST(33, 15, 11, 3): | ^~~~~~~~~~~~~~~~~~~~~ >> include/linux/compiler.h:203:82: error: expression in static assertion is not constant 203 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | ^~~~ include/linux/build_bug.h:17:9: note: in expansion of macro '__BUILD_BUG_ON_ZERO_MSG' 17 | __BUILD_BUG_ON_ZERO_MSG(e, ##__VA_ARGS__, #e " is true") | ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:141:33: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 141 | #define __BF_CHECK_POW2(n) BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0) | ^~~~~~~~~~~~~~~~~ include/linux/bitfield.h:162:17: note: in expansion of macro '__BF_CHECK_POW2' 162 | __BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) + \ | ^~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.h:474:10: note: in expansion of macro 'FIELD_PREP_CONST' 474 | (prep(DRM_PVR_BVNC_B, b) | \ | ^~~~ drivers/gpu/drm/imagination/pvr_device.h:496:43: note: in expansion of macro '__PVR_PACKED_BVNC' 496 | #define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.c:550:14: note: in expansion of macro 'PVR_PACKED_BVNC_CONST' 550 | case PVR_PACKED_BVNC_CONST(33, 15, 11, 3): | ^~~~~~~~~~~~~~~~~~~~~ >> include/linux/compiler.h:203:82: error: expression in static assertion is not constant 203 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | ^~~~ include/linux/build_bug.h:17:9: note: in expansion of macro '__BUILD_BUG_ON_ZERO_MSG' 17 | __BUILD_BUG_ON_ZERO_MSG(e, ##__VA_ARGS__, #e " is true") | ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:160:17: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 160 | BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \ | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.h:474:10: note: in expansion of macro 'FIELD_PREP_CONST' 474 | (prep(DRM_PVR_BVNC_B, b) | \ | ^~~~ drivers/gpu/drm/imagination/pvr_device.h:496:43: note: in expansion of macro '__PVR_PACKED_BVNC' 496 | #define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.c:551:14: note: in expansion of macro 'PVR_PACKED_BVNC_CONST' 551 | case PVR_PACKED_BVNC_CONST(36, 53, 104, 796): | ^~~~~~~~~~~~~~~~~~~~~ >> include/linux/compiler.h:203:82: error: expression in static assertion is not constant 203 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | ^~~~ include/linux/build_bug.h:17:9: note: in expansion of macro '__BUILD_BUG_ON_ZERO_MSG' 17 | __BUILD_BUG_ON_ZERO_MSG(e, ##__VA_ARGS__, #e " is true") | ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:141:33: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 141 | #define __BF_CHECK_POW2(n) BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0) | ^~~~~~~~~~~~~~~~~ include/linux/bitfield.h:162:17: note: in expansion of macro '__BF_CHECK_POW2' 162 | __BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) + \ | ^~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.h:474:10: note: in expansion of macro 'FIELD_PREP_CONST' 474 | (prep(DRM_PVR_BVNC_B, b) | \ | ^~~~ drivers/gpu/drm/imagination/pvr_device.h:496:43: note: in expansion of macro '__PVR_PACKED_BVNC' 496 | #define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.c:551:14: note: in expansion of macro 'PVR_PACKED_BVNC_CONST' 551 | case PVR_PACKED_BVNC_CONST(36, 53, 104, 796): | ^~~~~~~~~~~~~~~~~~~~~ >> include/linux/compiler.h:203:82: error: expression in static assertion is not constant 203 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | ^~~~ include/linux/build_bug.h:17:9: note: in expansion of macro '__BUILD_BUG_ON_ZERO_MSG' 17 | __BUILD_BUG_ON_ZERO_MSG(e, ##__VA_ARGS__, #e " is true") | ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:160:17: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 160 | BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \ | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.h:474:10: note: in expansion of macro 'FIELD_PREP_CONST' 474 | (prep(DRM_PVR_BVNC_B, b) | \ | ^~~~ drivers/gpu/drm/imagination/pvr_device.h:496:43: note: in expansion of macro '__PVR_PACKED_BVNC' 496 | #define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.c:554:14: note: in expansion of macro 'PVR_PACKED_BVNC_CONST' 554 | case PVR_PACKED_BVNC_CONST(36, 52, 104, 182): | ^~~~~~~~~~~~~~~~~~~~~ >> include/linux/compiler.h:203:82: error: expression in static assertion is not constant 203 | #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) | ^~~~ include/linux/build_bug.h:17:9: note: in expansion of macro '__BUILD_BUG_ON_ZERO_MSG' 17 | __BUILD_BUG_ON_ZERO_MSG(e, ##__VA_ARGS__, #e " is true") | ^~~~~~~~~~~~~~~~~~~~~~~ include/linux/bitfield.h:141:33: note: in expansion of macro 'BUILD_BUG_ON_ZERO' 141 | #define __BF_CHECK_POW2(n) BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0) | ^~~~~~~~~~~~~~~~~ include/linux/bitfield.h:162:17: note: in expansion of macro '__BF_CHECK_POW2' 162 | __BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) + \ | ^~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.h:474:10: note: in expansion of macro 'FIELD_PREP_CONST' 474 | (prep(DRM_PVR_BVNC_B, b) | \ | ^~~~ drivers/gpu/drm/imagination/pvr_device.h:496:43: note: in expansion of macro '__PVR_PACKED_BVNC' 496 | #define PVR_PACKED_BVNC_CONST(b, v, n, c) __PVR_PACKED_BVNC(FIELD_PREP_CONST, b, v, n, c) | ^~~~~~~~~~~~~~~~~ drivers/gpu/drm/imagination/pvr_device.c:554:14: note: in expansion of macro 'PVR_PACKED_BVNC_CONST' 554 | case PVR_PACKED_BVNC_CONST(36, 52, 104, 182): | ^~~~~~~~~~~~~~~~~~~~~ vim +203 include/linux/compiler.h 230fa253df6352 Christian Borntraeger 2014-11-25 199 cb7380de9e4cbc Kees Cook 2025-02-05 200 #ifdef __CHECKER__ 243c90e917f5cf Vincent Mailhol 2025-03-29 201 #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) (0) cb7380de9e4cbc Kees Cook 2025-02-05 202 #else /* __CHECKER__ */ 243c90e917f5cf Vincent Mailhol 2025-03-29 @203 #define __BUILD_BUG_ON_ZERO_MSG(e, msg, ...) ((int)sizeof(struct {_Static_assert(!(e), msg);})) cb7380de9e4cbc Kees Cook 2025-02-05 204 #endif /* __CHECKER__ */ cb7380de9e4cbc Kees Cook 2025-02-05 205 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] drm/imagination: Add PVR_GPU_ID_FMT to format pvr_gpu_id 2026-03-20 15:22 [PATCH v2 0/2] drm/imagination: GPU_ID-related cleanups Matt Coster 2026-03-20 15:22 ` [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi Matt Coster @ 2026-03-20 15:22 ` Matt Coster 1 sibling, 0 replies; 4+ messages in thread From: Matt Coster @ 2026-03-20 15:22 UTC (permalink / raw) To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie, Simona Vetter Cc: Frank Binns, Brajesh Gupta, Alessio Belle, Alexandru Dadu, dri-devel, linux-kernel, Matt Coster There are currently two different combinations of format specifiers used to print a struct pvr_gpu_id, one using %i and one using %d. Both of these are technically incorrect since the components are stored as u16. Introduce macros to simplify and correct the formatting of these values: - PVR_GPU_ID_FMT: A pre-constructed format string fragment, in the style of PRIu32. - PVR_GPU_ID_FMT_ARGS(): Accepts a &struct pvr_gpu_id and expands the fields into appropriate format arguments to be used with PVR_GPU_ID_FMT. - PVR_GPU_ID_FMT_ARGS_PACKED(): Accepts a packed GPU ID as a u64 and extracts the components directly into appropriate format arguments to be used with PVR_GPU_ID_FMT. Signed-off-by: Matt Coster <matt.coster@imgtec.com> --- Changes in v2: - Simplify the change made to pvr_fw_validate() - Link to v1: https://patch.msgid.link/20260206-bvnc-cleanup-v1-2-f3c818541fbe@imgtec.com --- drivers/gpu/drm/imagination/pvr_device.c | 4 ++-- drivers/gpu/drm/imagination/pvr_device.h | 6 ++++++ drivers/gpu/drm/imagination/pvr_fw.c | 9 +++------ 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/imagination/pvr_device.c b/drivers/gpu/drm/imagination/pvr_device.c index 9b26585a42bf..263d1badacf3 100644 --- a/drivers/gpu/drm/imagination/pvr_device.c +++ b/drivers/gpu/drm/imagination/pvr_device.c @@ -362,8 +362,8 @@ pvr_build_firmware_filename(struct pvr_device *pvr_dev, const char *base, { struct pvr_gpu_id *gpu_id = &pvr_dev->gpu_id; - return kasprintf(GFP_KERNEL, "%s_%d.%d.%d.%d_v%d.fw", base, gpu_id->b, - gpu_id->v, gpu_id->n, gpu_id->c, major); + return kasprintf(GFP_KERNEL, "%s_" PVR_GPU_ID_FMT "_v%d.fw", base, + PVR_GPU_ID_FMT_ARGS(gpu_id), major); } static void diff --git a/drivers/gpu/drm/imagination/pvr_device.h b/drivers/gpu/drm/imagination/pvr_device.h index 55d8ff11d507..54e3e947e60e 100644 --- a/drivers/gpu/drm/imagination/pvr_device.h +++ b/drivers/gpu/drm/imagination/pvr_device.h @@ -53,6 +53,12 @@ struct pvr_gpu_id { u16 b, v, n, c; }; +#define PVR_GPU_ID_FMT "%u.%u.%u.%u" +#define PVR_GPU_ID_FMT_ARGS(gpu_id) (gpu_id)->b, (gpu_id)->v, (gpu_id)->n, (gpu_id)->c +#define PVR_GPU_ID_FMT_ARGS_PACKED(gpu_id) \ + (u32)FIELD_GET(DRM_PVR_BVNC_B, gpu_id), (u32)FIELD_GET(DRM_PVR_BVNC_V, gpu_id), \ + (u32)FIELD_GET(DRM_PVR_BVNC_N, gpu_id), (u32)FIELD_GET(DRM_PVR_BVNC_C, gpu_id) + /** * struct pvr_fw_version - Firmware version information * @major: Major version number. diff --git a/drivers/gpu/drm/imagination/pvr_fw.c b/drivers/gpu/drm/imagination/pvr_fw.c index 288516dc2560..0b1c2a0d950c 100644 --- a/drivers/gpu/drm/imagination/pvr_fw.c +++ b/drivers/gpu/drm/imagination/pvr_fw.c @@ -126,12 +126,9 @@ pvr_fw_validate(struct pvr_device *pvr_dev) } if (pvr_gpu_id_to_packed_bvnc(&pvr_dev->gpu_id) != header->bvnc) { - struct pvr_gpu_id fw_gpu_id; - - packed_bvnc_to_pvr_gpu_id(header->bvnc, &fw_gpu_id); - drm_err(drm_dev, "FW built for incorrect GPU ID %i.%i.%i.%i (expected %i.%i.%i.%i)\n", - fw_gpu_id.b, fw_gpu_id.v, fw_gpu_id.n, fw_gpu_id.c, - pvr_dev->gpu_id.b, pvr_dev->gpu_id.v, pvr_dev->gpu_id.n, pvr_dev->gpu_id.c); + drm_err(drm_dev, "FW built for incorrect GPU ID " PVR_GPU_ID_FMT " (expected " PVR_GPU_ID_FMT ")\n", + PVR_GPU_ID_FMT_ARGS_PACKED(header->bvnc), + PVR_GPU_ID_FMT_ARGS(&pvr_dev->gpu_id)); return -EINVAL; } -- 2.53.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-03-22 14:47 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2026-03-20 15:22 [PATCH v2 0/2] drm/imagination: GPU_ID-related cleanups Matt Coster 2026-03-20 15:22 ` [PATCH v2 1/2] drm/imagination: Define packed BVNCs in the uapi Matt Coster 2026-03-22 14:46 ` kernel test robot 2026-03-20 15:22 ` [PATCH v2 2/2] drm/imagination: Add PVR_GPU_ID_FMT to format pvr_gpu_id Matt Coster
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®