From: Lucas De Marchi <lucas.demarchi@intel.com> To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: Anusha Srivatsa <anusha.srivatsa@intel.com>, Lucas De Marchi <lucas.demarchi@intel.com> Subject: [PATCH v2.2] drm/i915: Add _PICK_EVEN_2RANGES() Date: Wed, 25 Jan 2023 10:24:03 -0800 [thread overview] Message-ID: <20230125182403.7526-1-lucas.demarchi@intel.com> (raw) In-Reply-To: <20230124074525.xqprvxdtvkodcgdj@ldmartin-desk2.lan> It's a constant pattern in the driver to need to use 2 ranges of MMIOs based on port, phy, pll, etc. When that happens, instead of using _PICK_EVEN(), _PICK() needs to be used. Using _PICK() is discouraged due to some reasons like: 1) It increases the code size since the array is declared in each call site 2) Developers need to be careful not to incur an out-of-bounds array access 3) Developers need to be careful that the indexes match the table. For that it may be that the table needs to contain holes, making (1) even worse. Add a variant of _PICK_EVEN() that works with 2 ranges and selects which one to use depending on the index value. v2: Fix the address expansion in the example (Anusha) v3: Also rename macro to _PICK_EVEN_2RANGES() in the documentation and reword it to clarify what ranges are chosen based on the index (Jani) Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> Reviewed-by: Anusha Srivatsa <anusha.srivatsa@intel.com> --- drivers/gpu/drm/i915/i915_reg_defs.h | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_reg_defs.h b/drivers/gpu/drm/i915/i915_reg_defs.h index be43580a6979..983c5aa3045b 100644 --- a/drivers/gpu/drm/i915/i915_reg_defs.h +++ b/drivers/gpu/drm/i915/i915_reg_defs.h @@ -119,6 +119,35 @@ */ #define _PICK_EVEN(__index, __a, __b) ((__a) + (__index) * ((__b) - (__a))) +/* + * Like _PICK_EVEN(), but supports 2 ranges of evenly spaced address offsets. + * @__c_index corresponds to the index in which the second range starts to be + * used. Using math interval notation, the first range is used for indexes [ 0, + * @__c_index), while the second range is used for [ @__c_index, ... ). Example: + * + * #define _FOO_A 0xf000 + * #define _FOO_B 0xf004 + * #define _FOO_C 0xf008 + * #define _SUPER_FOO_A 0xa000 + * #define _SUPER_FOO_B 0xa100 + * #define FOO(x) _MMIO(_PICK_EVEN_2RANGES(x, 3, \ + * _FOO_A, _FOO_B, \ + * _SUPER_FOO_A, _SUPER_FOO_B)) + * + * This expands to: + * 0: 0xf000, + * 1: 0xf004, + * 2: 0xf008, + * 3: 0xa000, + * 4: 0xa100, + * 5: 0xa200, + * ... + */ +#define _PICK_EVEN_2RANGES(__index, __c_index, __a, __b, __c, __d) \ + (BUILD_BUG_ON_ZERO(!__is_constexpr(__c_index)) + \ + ((__index) < (__c_index) ? _PICK_EVEN(__index, __a, __b) : \ + _PICK_EVEN((__index) - (__c_index), __c, __d))) + /* * Given the arbitrary numbers in varargs, pick the 0-based __index'th number. * -- 2.39.0
WARNING: multiple messages have this Message-ID (diff)
From: Lucas De Marchi <lucas.demarchi@intel.com> To: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org Cc: Lucas De Marchi <lucas.demarchi@intel.com> Subject: [Intel-gfx] [PATCH v2.2] drm/i915: Add _PICK_EVEN_2RANGES() Date: Wed, 25 Jan 2023 10:24:03 -0800 [thread overview] Message-ID: <20230125182403.7526-1-lucas.demarchi@intel.com> (raw) In-Reply-To: <20230124074525.xqprvxdtvkodcgdj@ldmartin-desk2.lan> It's a constant pattern in the driver to need to use 2 ranges of MMIOs based on port, phy, pll, etc. When that happens, instead of using _PICK_EVEN(), _PICK() needs to be used. Using _PICK() is discouraged due to some reasons like: 1) It increases the code size since the array is declared in each call site 2) Developers need to be careful not to incur an out-of-bounds array access 3) Developers need to be careful that the indexes match the table. For that it may be that the table needs to contain holes, making (1) even worse. Add a variant of _PICK_EVEN() that works with 2 ranges and selects which one to use depending on the index value. v2: Fix the address expansion in the example (Anusha) v3: Also rename macro to _PICK_EVEN_2RANGES() in the documentation and reword it to clarify what ranges are chosen based on the index (Jani) Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> Reviewed-by: Anusha Srivatsa <anusha.srivatsa@intel.com> --- drivers/gpu/drm/i915/i915_reg_defs.h | 29 ++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/drivers/gpu/drm/i915/i915_reg_defs.h b/drivers/gpu/drm/i915/i915_reg_defs.h index be43580a6979..983c5aa3045b 100644 --- a/drivers/gpu/drm/i915/i915_reg_defs.h +++ b/drivers/gpu/drm/i915/i915_reg_defs.h @@ -119,6 +119,35 @@ */ #define _PICK_EVEN(__index, __a, __b) ((__a) + (__index) * ((__b) - (__a))) +/* + * Like _PICK_EVEN(), but supports 2 ranges of evenly spaced address offsets. + * @__c_index corresponds to the index in which the second range starts to be + * used. Using math interval notation, the first range is used for indexes [ 0, + * @__c_index), while the second range is used for [ @__c_index, ... ). Example: + * + * #define _FOO_A 0xf000 + * #define _FOO_B 0xf004 + * #define _FOO_C 0xf008 + * #define _SUPER_FOO_A 0xa000 + * #define _SUPER_FOO_B 0xa100 + * #define FOO(x) _MMIO(_PICK_EVEN_2RANGES(x, 3, \ + * _FOO_A, _FOO_B, \ + * _SUPER_FOO_A, _SUPER_FOO_B)) + * + * This expands to: + * 0: 0xf000, + * 1: 0xf004, + * 2: 0xf008, + * 3: 0xa000, + * 4: 0xa100, + * 5: 0xa200, + * ... + */ +#define _PICK_EVEN_2RANGES(__index, __c_index, __a, __b, __c, __d) \ + (BUILD_BUG_ON_ZERO(!__is_constexpr(__c_index)) + \ + ((__index) < (__c_index) ? _PICK_EVEN(__index, __a, __b) : \ + _PICK_EVEN((__index) - (__c_index), __c, __d))) + /* * Given the arbitrary numbers in varargs, pick the 0-based __index'th number. * -- 2.39.0
next prev parent reply other threads:[~2023-01-25 18:25 UTC|newest] Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-01-20 19:34 [PATCH v2 0/8] Add _PICK_EVEN_2RANGES Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-20 19:34 ` [PATCH v2 1/8] drm/i915: Add _PICK_EVEN_2RANGES() Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-21 6:14 ` Srivatsa, Anusha 2023-01-21 6:14 ` Srivatsa, Anusha 2023-01-22 1:28 ` Lucas De Marchi 2023-01-23 11:00 ` Jani Nikula 2023-01-23 16:15 ` Srivatsa, Anusha 2023-01-23 16:15 ` Srivatsa, Anusha 2023-01-23 16:53 ` Lucas De Marchi 2023-01-23 10:38 ` Jani Nikula 2023-01-23 10:38 ` [Intel-gfx] " Jani Nikula 2023-01-24 7:45 ` Lucas De Marchi 2023-01-24 7:45 ` [Intel-gfx] " Lucas De Marchi 2023-01-25 18:24 ` Lucas De Marchi [this message] 2023-01-25 18:24 ` [Intel-gfx] [PATCH v2.2] " Lucas De Marchi 2023-01-23 17:15 ` [PATCH v2.1] " Lucas De Marchi 2023-01-23 17:15 ` [Intel-gfx] " Lucas De Marchi 2023-01-23 17:49 ` Srivatsa, Anusha 2023-01-23 17:49 ` [Intel-gfx] " Srivatsa, Anusha 2023-01-20 19:34 ` [PATCH v2 2/8] drm/i915: Fix coding style on DPLL*_ENABLE defines Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-20 20:14 ` Srivatsa, Anusha 2023-01-20 20:14 ` Srivatsa, Anusha 2023-01-20 19:34 ` [PATCH v2 3/8] drm/i915: Convert pll macros to _PICK_EVEN_2RANGES Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-23 19:12 ` Srivatsa, Anusha 2023-01-23 19:12 ` Srivatsa, Anusha 2023-01-20 19:34 ` [PATCH v2 4/8] drm/i915: Replace _MMIO_PHY3() with _PICK_EVEN_2RANGES() Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-21 5:58 ` Srivatsa, Anusha 2023-01-21 5:58 ` Srivatsa, Anusha 2023-01-20 19:34 ` [PATCH v2 5/8] drm/i915: Convert PIPE3/PORT3 to _PICK_EVEN_2RANGES() Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-21 6:00 ` Srivatsa, Anusha 2023-01-21 6:00 ` Srivatsa, Anusha 2023-01-20 19:34 ` [PATCH v2 6/8] drm/i915: Convert _FIA() " Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-21 6:01 ` Srivatsa, Anusha 2023-01-21 6:01 ` Srivatsa, Anusha 2023-01-20 19:34 ` [Intel-gfx] [PATCH v2 7/8] drm/i915: Convert MBUS_ABOX_CTL() " Lucas De Marchi 2023-01-20 19:34 ` Lucas De Marchi 2023-01-21 6:04 ` [Intel-gfx] " Srivatsa, Anusha 2023-01-21 6:04 ` Srivatsa, Anusha 2023-01-20 19:34 ` [PATCH v2 8/8] drm/i915: Convert PALETTE() " Lucas De Marchi 2023-01-20 19:34 ` [Intel-gfx] " Lucas De Marchi 2023-01-21 6:06 ` Srivatsa, Anusha 2023-01-21 6:06 ` Srivatsa, Anusha 2023-01-20 21:04 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Add _PICK_EVEN_2RANGES Patchwork 2023-01-20 21:17 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2023-01-21 20:55 ` [Intel-gfx] ✗ Fi.CI.IGT: failure " Patchwork 2023-01-23 10:39 ` [PATCH v2 0/8] " Jani Nikula 2023-01-23 10:39 ` [Intel-gfx] " Jani Nikula 2023-01-23 19:27 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for Add _PICK_EVEN_2RANGES (rev2) Patchwork 2023-01-23 19:44 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2023-01-24 4:48 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork 2023-01-26 1:33 ` [Intel-gfx] ✗ Fi.CI.SPARSE: warning for Add _PICK_EVEN_2RANGES (rev3) Patchwork 2023-01-26 1:52 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork 2023-01-26 12:13 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20230125182403.7526-1-lucas.demarchi@intel.com \ --to=lucas.demarchi@intel.com \ --cc=anusha.srivatsa@intel.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=intel-gfx@lists.freedesktop.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.