On Fri, Jun 7, 2019 at 9:57 AM Philippe Mathieu-Daudé <[email protected]> wrote: > > Some RX peripheral using 8bit and 16bit registers. > Added 8bit and 16bit APIs. > > Signed-off-by: Yoshinori Sato <[email protected]> > Reviewed-by: Richard Henderson <[email protected]> > Reviewed-by: Philippe Mathieu-Daudé <[email protected]> > Message-Id: <[email protected]> > Tested-by: Philippe Mathieu-Daudé <[email protected]> > Signed-off-by: Richard Henderson <[email protected]>
Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > include/hw/registerfields.h | 32 +++++++++++++++++++++++++++++++- > 1 file changed, 31 insertions(+), 1 deletion(-) > > diff --git a/include/hw/registerfields.h b/include/hw/registerfields.h > index 2659a58737..a0bb0654d6 100644 > --- a/include/hw/registerfields.h > +++ b/include/hw/registerfields.h > @@ -22,6 +22,14 @@ > enum { A_ ## reg = (addr) }; \ > enum { R_ ## reg = (addr) / 4 }; > > +#define REG8(reg, addr) \ > + enum { A_ ## reg = (addr) }; \ > + enum { R_ ## reg = (addr) }; > + > +#define REG16(reg, addr) \ > + enum { A_ ## reg = (addr) }; \ > + enum { R_ ## reg = (addr) / 2 }; > + > /* Define SHIFT, LENGTH and MASK constants for a field within a register */ > > /* This macro will define R_FOO_BAR_MASK, R_FOO_BAR_SHIFT and > R_FOO_BAR_LENGTH > @@ -34,6 +42,12 @@ > MAKE_64BIT_MASK(shift, length)}; > > /* Extract a field from a register */ > +#define FIELD_EX8(storage, reg, field) \ > + extract8((storage), R_ ## reg ## _ ## field ## _SHIFT, \ > + R_ ## reg ## _ ## field ## _LENGTH) > +#define FIELD_EX16(storage, reg, field) \ > + extract16((storage), R_ ## reg ## _ ## field ## _SHIFT, \ > + R_ ## reg ## _ ## field ## _LENGTH) > #define FIELD_EX32(storage, reg, field) \ > extract32((storage), R_ ## reg ## _ ## field ## _SHIFT, \ > R_ ## reg ## _ ## field ## _LENGTH) > @@ -49,6 +63,22 @@ > * Assigning values larger then the target field will result in > * compilation warnings. > */ > +#define FIELD_DP8(storage, reg, field, val) ({ \ > + struct { \ > + unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \ > + } v = { .v = val }; \ > + uint8_t d; \ > + d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \ > + R_ ## reg ## _ ## field ## _LENGTH, v.v); \ > + d; }) > +#define FIELD_DP16(storage, reg, field, val) ({ \ > + struct { \ > + unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \ > + } v = { .v = val }; \ > + uint16_t d; \ > + d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \ > + R_ ## reg ## _ ## field ## _LENGTH, v.v); \ > + d; }) > #define FIELD_DP32(storage, reg, field, val) ({ \ > struct { \ > unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \ > @@ -57,7 +87,7 @@ > d = deposit32((storage), R_ ## reg ## _ ## field ## _SHIFT, \ > R_ ## reg ## _ ## field ## _LENGTH, v.v); \ > d; }) > -#define FIELD_DP64(storage, reg, field, val) ({ \ > +#define FIELD_DP64(storage, reg, field, val) ({ \ > struct { \ > unsigned int v:R_ ## reg ## _ ## field ## _LENGTH; \ > } v = { .v = val }; \ > -- > 2.20.1 > >
