cps_drv_lpddr4.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /* SPDX-License-Identifier: BSD-3-Clause */
  2. /******************************************************************************
  3. *
  4. * Copyright (C) 2017-2018 Cadence Design Systems, Inc.
  5. * Copyright (C) 2019 Texas Instruments Incorporated - http://www.ti.com/
  6. *
  7. * cps_drv_lpddr4.h
  8. * Interface for the Register Accaess Layer of Cadence Platform Service (CPS)
  9. *****************************************************************************
  10. */
  11. #ifndef CPS_DRV_H_
  12. #define CPS_DRV_H_
  13. #include <stddef.h>
  14. #include <inttypes.h>
  15. #include <asm/io.h>
  16. /**
  17. * \brief Read a 32-bit value from memory.
  18. * \param reg address of the memory mapped hardware register
  19. * \return the value at the given address
  20. */
  21. #define CPS_REG_READ(reg) (readl((volatile uint32_t*)(reg)))
  22. /**
  23. * \brief Write a 32-bit address value to memory.
  24. * \param reg address of the memory mapped hardware register
  25. * \param value unsigned 32-bit value to write
  26. */
  27. #define CPS_REG_WRITE(reg, value) (writel((uint32_t)(value), (volatile uint32_t*)(reg)))
  28. /**
  29. * \brief Subtitue the value of fld macro and concatinate with required string
  30. * \param fld field name
  31. */
  32. #define CPS_FLD_MASK(fld) (fld ## _MASK)
  33. #define CPS_FLD_SHIFT(fld) (fld ## _SHIFT)
  34. #define CPS_FLD_WIDTH(fld) (fld ## _WIDTH)
  35. #define CPS_FLD_WOCLR(fld) (fld ## _WOCLR)
  36. #define CPS_FLD_WOSET(fld) (fld ## _WOSET)
  37. /**
  38. * \brief Read a value of bit-field from the register value.
  39. * \param reg register name
  40. * \param fld field name
  41. * \param reg_value register value
  42. * \return bit-field value
  43. */
  44. #define CPS_FLD_READ(fld, reg_value) (cps_fldread((uint32_t)(CPS_FLD_MASK(fld)), \
  45. (uint32_t)(CPS_FLD_SHIFT(fld)), \
  46. (uint32_t)(reg_value)))
  47. /**
  48. * \brief Write a value of the bit-field into the register value.
  49. * \param reg register name
  50. * \param fld field name
  51. * \param reg_value register value
  52. * \param value value to be written to bit-field
  53. * \return modified register value
  54. */
  55. #define CPS_FLD_WRITE(fld, reg_value, value) (cps_fldwrite((uint32_t)(CPS_FLD_MASK(fld)), \
  56. (uint32_t)(CPS_FLD_SHIFT(fld)), \
  57. (uint32_t)(reg_value), (uint32_t)(value)))
  58. /**
  59. * \brief Set bit within the register value.
  60. * \param reg register name
  61. * \param fld field name
  62. * \param reg_value register value
  63. * \return modified register value
  64. */
  65. #define CPS_FLD_SET(fld, reg_value) (cps_fldset((uint32_t)(CPS_FLD_WIDTH(fld)), \
  66. (uint32_t)(CPS_FLD_MASK(fld)), \
  67. (uint32_t)(CPS_FLD_WOCLR(fld)), \
  68. (uint32_t)(reg_value)))
  69. static inline uint32_t cps_fldread(uint32_t mask, uint32_t shift, uint32_t reg_value)
  70. {
  71. uint32_t result = (reg_value & mask) >> shift;
  72. return (result);
  73. }
  74. /**
  75. * \brief Write a value of the bit-field into the register value.
  76. * \param mask mask for the bit-field
  77. * \param shift bit-field shift from LSB
  78. * \param reg_value register value
  79. * \param value value to be written to bit-field
  80. * \return modified register value
  81. */
  82. static inline uint32_t cps_fldwrite(uint32_t mask, uint32_t shift, uint32_t reg_value, uint32_t value)
  83. {
  84. uint32_t new_value = (value << shift) & mask;
  85. new_value = (reg_value & ~mask) | new_value;
  86. return (new_value);
  87. }
  88. /**
  89. * \brief Set bit within the register value.
  90. * \param width width of the bit-field
  91. * \param mask mask for the bit-field
  92. * \param is_woclr is bit-field has 'write one to clear' flag set
  93. * \param reg_value register value
  94. * \return modified register value
  95. */
  96. static inline uint32_t cps_fldset(uint32_t width, uint32_t mask, uint32_t is_woclr, uint32_t reg_value)
  97. {
  98. uint32_t new_value = reg_value;
  99. /* Confirm the field to be bit and not write to clear type */
  100. if ((width == 1U) && (is_woclr == 0U)) {
  101. new_value |= mask;
  102. }
  103. return (new_value);
  104. }
  105. #endif /* CPS_DRV_H_ */