register.h 4.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #ifndef _PCILIB_REGISTER_H
  2. #define _PCILIB_REGISTER_H
  3. #include <uthash.h>
  4. #include <pcilib.h>
  5. #include <pcilib/bank.h>
  6. #define PCILIB_REGISTER_NO_BITS 0
  7. #define PCILIB_REGISTER_ALL_BITS ((pcilib_register_value_t)-1)
  8. typedef enum {
  9. PCILIB_REGISTER_STANDARD = 0, /**< Standard register */
  10. PCILIB_REGISTER_FIFO, /**< FIFO register */
  11. PCILIB_REGISTER_BITS, /**< Besides a big standard register, the register bit-fields may be described by bit registers */
  12. PCILIB_REGISTER_PROPERTY /**< A special register bound to a property and gettings/setting it value through it */
  13. } pcilib_register_type_t;
  14. typedef struct {
  15. const char *name;
  16. const char *view;
  17. } pcilib_view_reference_t;
  18. typedef struct {
  19. pcilib_register_addr_t addr; /**< Register address in the bank */
  20. pcilib_register_size_t offset; /**< Register offset in the byte (in bits) */
  21. pcilib_register_size_t bits; /**< Register size in bits */
  22. pcilib_register_value_t defvalue; /**< Default register value (some protocols, i.e. software registers, may set it during the initialization) */
  23. pcilib_register_value_t rwmask; /**< Used to define how external bits of PCILIB_REGISTER_BITS registers are treated.
  24. To keep bit value unchanged, we need to observe the following behavior depending on status of corresponding bit in this field:
  25. 1 - standard bit (i.e. if we want to keep the bit value we need to read it, and, the write back),
  26. 0 - non-standard bit which behavior is defined by mode (only partially implemented.
  27. so far only 1C/1I modes (zero should be written to preserve the value) are supported */
  28. pcilib_register_mode_t mode; /**< Register access (ro/wo/rw) and how writting to register works (if value just set as specified or, for instance, the bits which
  29. are on in the value are cleared/inverted). For information only, no preprocessing on bits is performed. */
  30. pcilib_register_type_t type; /**< Defines type of register is it standard register, subregister for bit fields or view, fifo */
  31. pcilib_register_bank_addr_t bank; /**< Specified the address of the bank this register belongs to */
  32. const char *name; /**< The access name of the register */
  33. const char *description; /**< Brief description of the register */
  34. pcilib_view_reference_t *views; /**< List of supported views for this register */
  35. } pcilib_register_description_t;
  36. typedef struct {
  37. const char *name; /**< Register name */
  38. pcilib_register_t reg; /**< Register index */
  39. pcilib_register_bank_t bank; /**< Reference to bank containing the register */
  40. pcilib_register_value_range_t range; /**< Minimum & maximum allowed values */
  41. pcilib_xml_node_t *xml; /**< Additional XML properties */
  42. pcilib_view_reference_t *views; /**< For non-static list of views, this vairables holds a copy of a NULL-terminated list from model (if present, memory should be de-allocated) */
  43. UT_hash_handle hh;
  44. } pcilib_register_context_t;
  45. #ifdef __cplusplus
  46. extern "C" {
  47. #endif
  48. /**
  49. * Use this function to add new registers into the model. Currently, it is considered a error
  50. * to re-add already defined register. If it will turn out to be useful to redefine some registers
  51. * from the model, it may change in the future. However, we should think how to treat bit-registers
  52. * in this case. The function will copy the context of registers structure, but name,
  53. * description, and other strings in the structure are considered to have static duration
  54. * and will not be copied. On error no new registers are initalized.
  55. * @param[in,out] ctx - pcilib context
  56. * @param[in] flags - not used now, but in future may instruct if existing registers should be reported as error (default), overriden or ignored
  57. * @param[in] n - number of registers to initialize. It is OK to pass 0 if registers array is NULL terminated (last member of the array have all members set to 0)
  58. * @param[in] registers - register descriptions
  59. * @param[out] ids - if specified will contain the ids of the newly registered and overriden registers
  60. * @return - error or 0 on success
  61. */
  62. int pcilib_add_registers(pcilib_t *ctx, pcilib_model_modification_flags_t flags, size_t n, const pcilib_register_description_t *registers, pcilib_register_t *ids);
  63. /**
  64. * Destroys data associated with registers. This is an internal function and will
  65. * be called during clean-up.
  66. * @param[in,out] ctx - pcilib context
  67. * @param[in] start - specifies first register to clean (used to clean only part of the registers to keep the defined state if pcilib_add_registers has failed)
  68. */
  69. void pcilib_clean_registers(pcilib_t *ctx, pcilib_register_t start);
  70. #ifdef __cplusplus
  71. }
  72. #endif
  73. #endif /* _PCILIB_REGISTER_H */