1. 11 2月, 2017 1 次提交
  2. 09 9月, 2016 1 次提交
    • J
      add basic register-field manipulation macros · 3e9b3112
      Jakub Kicinski 提交于
      Common approach to accessing register fields is to define
      structures or sets of macros containing mask and shift pair.
      Operations on the register are then performed as follows:
      
       field = (reg >> shift) & mask;
      
       reg &= ~(mask << shift);
       reg |= (field & mask) << shift;
      
      Defining shift and mask separately is tedious.  Ivo van Doorn
      came up with an idea of computing them at compilation time
      based on a single shifted mask (later refined by Felix) which
      can be used like this:
      
       #define REG_FIELD 0x000ff000
      
       field = FIELD_GET(REG_FIELD, reg);
      
       reg &= ~REG_FIELD;
       reg |= FIELD_PREP(REG_FIELD, field);
      
      FIELD_{GET,PREP} macros take care of finding out what the
      appropriate shift is based on compilation time ffs operation.
      
      GENMASK can be used to define registers (which is usually
      less error-prone and easier to match with datasheets).
      
      This approach is the most convenient I've seen so to limit code
      multiplication let's move the macros to a global header file.
      Attempts to use static inlines instead of macros failed due
      to false positive triggering of BUILD_BUG_ON()s, especially with
      GCC < 6.0.
      Signed-off-by: NJakub Kicinski <jakub.kicinski@netronome.com>
      Reviewed-by: NDinan Gunawardena <dinan.gunawardena@netronome.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      3e9b3112