On Mon, Aug 12, 2024 at 8:27 AM Peter Maydell <peter.mayd...@linaro.org> wrote: >
Hi Peter, Thanks for the review! > On Mon, 5 Aug 2024 at 21:17, Octavian Purdila <ta...@google.com> wrote: > > > > From: Stefan Stanacar <stefa...@google.com> > > > > From: Stefan Stanacar <stefa...@google.com> > > > > The CMSIS System View Description format(CMSIS-SVD) is an XML based > > description of Arm Cortex-M microcontrollers provided and maintained > > by sillicon vendors. It includes details such as peripherals registers > > (down to bitfields), peripheral register block addresses, reset > > values, etc. > > > > This script uses this information to create header files that makes it > > easier to emulate peripherals. > > > > The script can be used to create either peripheral specific headers or > > board / system specific information. The script generated headers are > > similar to the SVDConv utility. > > > > Peripheral specific headers contains information such as register > > layout, register names and reset values for registers: > > > > typedef struct { > > ... > > union { > > uint32_t PSELID; /* 0x00000FF8 Peripheral Select and > > * Flexcomm module ID */ > > struct { > > uint32_t PERSEL : 3; /* [2..0] Peripheral Select */ > > uint32_t LOCK : 1; /* [3..3] Lock the peripheral select */ > > uint32_t USARTPRESENT : 1; /* [4..4] USART present indicator */ > > uint32_t SPIPRESENT : 1; /* [5..5] SPI present indicator */ > > uint32_t I2CPRESENT : 1; /* [6..6] I2C present indicator */ > > uint32_t I2SPRESENT : 1; /* [7..7] I2S Present */ > > uint32_t : 4; > > uint32_t ID : 20; /* [31..12] Flexcomm ID */ > > } PSELID_b; > > }; > > Bitfield layout in C isn't portable, so don't generate this kind > of union-of-a-integer-and-some-bitfields, please. You can > generate FIELD() macro invocations (see include/hw/registerfields.h) > which define shift/mask/length macros that can be used with > FIELD_EX*/FIELD_DP* to do extract/deposit operations. > I see that C bitfields are already used in a few places in qemu. Could you please elaborate on the portability issue? > > ... > > } FLEXCOMM_Type; /* Size = 4096 (0x1000) */ > > > > #define FLEXCOMM_PSELID_PERSEL_Pos (0UL) > > #define FLEXCOMM_PSELID_PERSEL_Msk (0x7UL) > > #define FLEXCOMM_PSELID_LOCK_Pos (3UL) > > #define FLEXCOMM_PSELID_LOCK_Msk (0x8UL) > > ... > > > > typedef enum { /* FLEXCOMM_PSELID_LOCK */ > > /* Peripheral select can be changed by software. */ > > FLEXCOMM_PSELID_LOCK_UNLOCKED = 0, > > /* Peripheral select is locked and cannot be changed until this > > * Flexcomm module or the entire device is reset. */ > > FLEXCOMM_PSELID_LOCK_LOCKED = 1, > > } FLEXCOMM_PSELID_LOCK_Enum; > > ... > > > > #define FLEXCOMM_REGISTER_NAMES_ARRAY(_name) \ > > const char *_name[sizeof(FLEXCOMM_Type)] = { \ > > [4088 ... 4091] = "PSELID", \ > > [4092 ... 4095] = "PID", \ > > } > > > > Board specific headers contains information about peripheral base > > register addresses. > > thanks > -- PMM