04 Oct, 2017

1 commit


11 Feb, 2017

1 commit


09 Sep, 2016

1 commit

  • 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: Jakub Kicinski
    Reviewed-by: Dinan Gunawardena
    Signed-off-by: Kalle Valo

    Jakub Kicinski