qts-filter.sh 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. #!/bin/sh
  2. #
  3. # helper function to convert from DOS to Unix, if necessary, and handle
  4. # lines ending in '\'.
  5. #
  6. fix_newlines_in_macros() {
  7. sed -n ':next;s/\r$//;/[^\\]\\$/ {N;s/\\\n//;b next};p' $1
  8. }
  9. #
  10. # Process iocsr_config_*.[ch]
  11. # $1: SoC type
  12. # $2: Input handoff directory
  13. # $3: Input BSP Generated directory
  14. # $4: Output directory
  15. #
  16. process_iocsr_config() {
  17. soc="$1"
  18. in_qts_dir="$2"
  19. in_bsp_dir="$3"
  20. out_dir="$4"
  21. (
  22. cat << EOF
  23. /*
  24. * Altera SoCFPGA IOCSR configuration
  25. *
  26. * SPDX-License-Identifier: BSD-3-Clause
  27. */
  28. #ifndef __SOCFPGA_IOCSR_CONFIG_H__
  29. #define __SOCFPGA_IOCSR_CONFIG_H__
  30. EOF
  31. # Retrieve the scan chain lengths
  32. fix_newlines_in_macros \
  33. ${in_bsp_dir}/generated/iocsr_config_${soc}.h |
  34. grep 'CONFIG_HPS_IOCSR_SCANCHAIN[0-9]\+_LENGTH' | tr -d "()"
  35. echo ""
  36. # Retrieve the scan chain config and zap the ad-hoc length encoding
  37. fix_newlines_in_macros \
  38. ${in_bsp_dir}/generated/iocsr_config_${soc}.c |
  39. sed -n '/^const/ !b; :next {/^const/ s/(.*)//;p;n;b next}'
  40. cat << EOF
  41. #endif /* __SOCFPGA_IOCSR_CONFIG_H__ */
  42. EOF
  43. ) > "${out_dir}/iocsr_config.h"
  44. }
  45. #
  46. # Process pinmux_config_*.c (and ignore pinmux_config.h)
  47. # $1: SoC type
  48. # $2: Input directory
  49. # $3: Output directory
  50. #
  51. process_pinmux_config() {
  52. soc="$1"
  53. in_qts_dir="$2"
  54. in_bsp_dir="$3"
  55. out_dir="$4"
  56. (
  57. cat << EOF
  58. /*
  59. * Altera SoCFPGA PinMux configuration
  60. *
  61. * SPDX-License-Identifier: BSD-3-Clause
  62. */
  63. #ifndef __SOCFPGA_PINMUX_CONFIG_H__
  64. #define __SOCFPGA_PINMUX_CONFIG_H__
  65. EOF
  66. # Retrieve the pinmux config and zap the ad-hoc length encoding
  67. fix_newlines_in_macros \
  68. ${in_bsp_dir}/generated/pinmux_config_${soc}.c |
  69. sed -n '/^unsigned/ !b; :next {/^unsigned/ {s/\[.*\]/[]/;s/unsigned long/const u8/};p;n;b next}'
  70. cat << EOF
  71. #endif /* __SOCFPGA_PINMUX_CONFIG_H__ */
  72. EOF
  73. ) > "${out_dir}/pinmux_config.h"
  74. }
  75. #
  76. # Process pll_config.h
  77. # $1: SoC type (not used)
  78. # $2: Input directory
  79. # $3: Output directory
  80. #
  81. process_pll_config() {
  82. soc="$1"
  83. in_qts_dir="$2"
  84. in_bsp_dir="$3"
  85. out_dir="$4"
  86. (
  87. cat << EOF
  88. /*
  89. * Altera SoCFPGA Clock and PLL configuration
  90. *
  91. * SPDX-License-Identifier: BSD-3-Clause
  92. */
  93. #ifndef __SOCFPGA_PLL_CONFIG_H__
  94. #define __SOCFPGA_PLL_CONFIG_H__
  95. EOF
  96. # Retrieve the pll config and zap parenthesis
  97. fix_newlines_in_macros \
  98. ${in_bsp_dir}/generated/pll_config.h |
  99. sed -n '/CONFIG_HPS/ !b; :next {/CONFIG_HPS/ s/[()]//g;/endif/ b;p;n;b next}'
  100. cat << EOF
  101. #endif /* __SOCFPGA_PLL_CONFIG_H__ */
  102. EOF
  103. ) > "${out_dir}/pll_config.h"
  104. }
  105. #
  106. # Filter out only the macros which are actually used by the code
  107. #
  108. grep_sdram_config() {
  109. egrep "#define (CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMTYPE|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_MEMBL|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ADDRORDER|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCEN|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_ECCCORREN|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_REORDEREN|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_STARVELIMIT|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_DQSTRKEN|CONFIG_HPS_SDR_CTRLCFG_CTRLCFG_NODMPINS|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCWL|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_AL|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TCL|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRRD|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TFAW|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING1_TRFC|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TREFI|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRCD|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TRP|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWR|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING2_IF_TWTR|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRTP|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRAS|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TRC|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TMRD|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING3_TCCD|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_SELFRFSHEXIT|CONFIG_HPS_SDR_CTRLCFG_DRAMTIMING4_PWRDOWNEXIT|CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_AUTOPDCYCLES|CONFIG_HPS_SDR_CTRLCFG_LOWPWRTIMING_CLKDISABLECYCLES|CONFIG_HPS_SDR_CTRLCFG_DRAMODT_READ|CONFIG_HPS_SDR_CTRLCFG_DRAMODT_WRITE|CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_COLBITS|CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_ROWBITS|CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_BANKBITS|CONFIG_HPS_SDR_CTRLCFG_DRAMADDRW_CSBITS|CONFIG_HPS_SDR_CTRLCFG_DRAMIFWIDTH_IFWIDTH|CONFIG_HPS_SDR_CTRLCFG_DRAMDEVWIDTH_DEVWIDTH|CONFIG_HPS_SDR_CTRLCFG_DRAMINTR_INTREN|CONFIG_HPS_SDR_CTRLCFG_LOWPWREQ_SELFRFSHMASK|CONFIG_HPS_SDR_CTRLCFG_STATICCFG_MEMBL|CONFIG_HPS_SDR_CTRLCFG_STATICCFG_USEECCASDATA|CONFIG_HPS_SDR_CTRLCFG_CTRLWIDTH_CTRLWIDTH|CONFIG_HPS_SDR_CTRLCFG_CPORTWIDTH_CPORTWIDTH|CONFIG_HPS_SDR_CTRLCFG_CPORTWMAP_CPORTWMAP|CONFIG_HPS_SDR_CTRLCFG_CPORTRMAP_CPORTRMAP|CONFIG_HPS_SDR_CTRLCFG_RFIFOCMAP_RFIFOCMAP|CONFIG_HPS_SDR_CTRLCFG_WFIFOCMAP_WFIFOCMAP|CONFIG_HPS_SDR_CTRLCFG_CPORTRDWR_CPORTRDWR|CONFIG_HPS_SDR_CTRLCFG_PORTCFG_AUTOPCHEN|CONFIG_HPS_SDR_CTRLCFG_FPGAPORTRST|CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_SYNCMODE|CONFIG_HPS_SDR_CTRLCFG_FIFOCFG_INCSYNC|CONFIG_HPS_SDR_CTRLCFG_MPPRIORITY_USERPRIORITY|CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_0_STATICWEIGHT_31_0|CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_STATICWEIGHT_49_32|CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_1_SUMOFWEIGHT_13_0|CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_2_SUMOFWEIGHT_45_14|CONFIG_HPS_SDR_CTRLCFG_MPWIEIGHT_3_SUMOFWEIGHT_63_46|CONFIG_HPS_SDR_CTRLCFG_PHYCTRL_PHYCTRL_0|CONFIG_HPS_SDR_CTRLCFG_MPPACING_0_THRESHOLD1_31_0|CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD1_59_32|CONFIG_HPS_SDR_CTRLCFG_MPPACING_1_THRESHOLD2_3_0|CONFIG_HPS_SDR_CTRLCFG_MPPACING_2_THRESHOLD2_35_4|CONFIG_HPS_SDR_CTRLCFG_MPPACING_3_THRESHOLD2_59_36|CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_0_THRESHOLDRSTCYCLES_31_0|CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_1_THRESHOLDRSTCYCLES_63_32|CONFIG_HPS_SDR_CTRLCFG_MPTHRESHOLDRST_2_THRESHOLDRSTCYCLES_79_64|RW_MGR_ACTIVATE_0_AND_1|RW_MGR_ACTIVATE_0_AND_1_WAIT1|RW_MGR_ACTIVATE_0_AND_1_WAIT2|RW_MGR_ACTIVATE_1|RW_MGR_CLEAR_DQS_ENABLE|RW_MGR_GUARANTEED_READ|RW_MGR_GUARANTEED_READ_CONT|RW_MGR_GUARANTEED_WRITE|RW_MGR_GUARANTEED_WRITE_WAIT0|RW_MGR_GUARANTEED_WRITE_WAIT1|RW_MGR_GUARANTEED_WRITE_WAIT2|RW_MGR_GUARANTEED_WRITE_WAIT3|RW_MGR_IDLE|RW_MGR_IDLE_LOOP1|RW_MGR_IDLE_LOOP2|RW_MGR_INIT_RESET_0_CKE_0|RW_MGR_INIT_RESET_1_CKE_0|RW_MGR_LFSR_WR_RD_BANK_0|RW_MGR_LFSR_WR_RD_BANK_0_DATA|RW_MGR_LFSR_WR_RD_BANK_0_DQS|RW_MGR_LFSR_WR_RD_BANK_0_NOP|RW_MGR_LFSR_WR_RD_BANK_0_WAIT|RW_MGR_LFSR_WR_RD_BANK_0_WL_1|RW_MGR_LFSR_WR_RD_DM_BANK_0|RW_MGR_LFSR_WR_RD_DM_BANK_0_DATA|RW_MGR_LFSR_WR_RD_DM_BANK_0_DQS|RW_MGR_LFSR_WR_RD_DM_BANK_0_NOP|RW_MGR_LFSR_WR_RD_DM_BANK_0_WAIT|RW_MGR_LFSR_WR_RD_DM_BANK_0_WL_1|RW_MGR_MRS0_DLL_RESET|RW_MGR_MRS0_DLL_RESET_MIRR|RW_MGR_MRS0_USER|RW_MGR_MRS0_USER_MIRR|RW_MGR_MRS1|RW_MGR_MRS1_MIRR|RW_MGR_MRS2|RW_MGR_MRS2_MIRR|RW_MGR_MRS3|RW_MGR_MRS3_MIRR|RW_MGR_PRECHARGE_ALL|RW_MGR_READ_B2B|RW_MGR_READ_B2B_WAIT1|RW_MGR_READ_B2B_WAIT2|RW_MGR_REFRESH_ALL|RW_MGR_RETURN|RW_MGR_SGLE_READ|RW_MGR_ZQCL|RW_MGR_TRUE_MEM_DATA_MASK_WIDTH|RW_MGR_MEM_ADDRESS_MIRRORING|RW_MGR_MEM_DATA_MASK_WIDTH|RW_MGR_MEM_DATA_WIDTH|RW_MGR_MEM_DQ_PER_READ_DQS|RW_MGR_MEM_DQ_PER_WRITE_DQS|RW_MGR_MEM_IF_READ_DQS_WIDTH|RW_MGR_MEM_IF_WRITE_DQS_WIDTH|RW_MGR_MEM_NUMBER_OF_CS_PER_DIMM|RW_MGR_MEM_NUMBER_OF_RANKS|RW_MGR_MEM_VIRTUAL_GROUPS_PER_READ_DQS|RW_MGR_MEM_VIRTUAL_GROUPS_PER_WRITE_DQS|IO_DELAY_PER_DCHAIN_TAP|IO_DELAY_PER_DQS_EN_DCHAIN_TAP|IO_DELAY_PER_OPA_TAP|IO_DLL_CHAIN_LENGTH|IO_DQDQS_OUT_PHASE_MAX|IO_DQS_EN_DELAY_MAX|IO_DQS_EN_DELAY_OFFSET|IO_DQS_EN_PHASE_MAX|IO_DQS_IN_DELAY_MAX|IO_DQS_IN_RESERVE|IO_DQS_OUT_RESERVE|IO_IO_IN_DELAY_MAX|IO_IO_OUT1_DELAY_MAX|IO_IO_OUT2_DELAY_MAX|IO_SHIFT_DQS_EN_WHEN_SHIFT_DQS|AFI_RATE_RATIO|CALIB_LFIFO_OFFSET|CALIB_VFIFO_OFFSET|ENABLE_SUPER_QUICK_CALIBRATION|MAX_LATENCY_COUNT_WIDTH|READ_VALID_FIFO_SIZE|REG_FILE_INIT_SEQ_SIGNATURE|TINIT_CNTR0_VAL|TINIT_CNTR1_VAL|TINIT_CNTR2_VAL|TRESET_CNTR0_VAL|TRESET_CNTR1_VAL|TRESET_CNTR2_VAL|CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR|CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_BC|CONFIG_HPS_SDR_CTRLCFG_EXTRATIME1_CFG_EXTRA_CTL_CLK_RD_TO_WR_DIFF_CHIP)[[:space:]]"
  110. }
  111. #
  112. # Process sdram_config.h, sequencer_auto*h and sequencer_defines.h
  113. # $1: SoC type (not used)
  114. # $2: Input directory
  115. # $3: Output directory
  116. #
  117. process_sdram_config() {
  118. soc="$1"
  119. in_qts_dir="$2"
  120. in_bsp_dir="$3"
  121. out_dir="$4"
  122. (
  123. cat << EOF
  124. /*
  125. * Altera SoCFPGA SDRAM configuration
  126. *
  127. * SPDX-License-Identifier: BSD-3-Clause
  128. */
  129. #ifndef __SOCFPGA_SDRAM_CONFIG_H__
  130. #define __SOCFPGA_SDRAM_CONFIG_H__
  131. EOF
  132. echo "/* SDRAM configuration */"
  133. # Retrieve the sdram config, zap broken lines and zap parenthesis
  134. fix_newlines_in_macros \
  135. ${in_bsp_dir}/generated/sdram/sdram_config.h |
  136. sed -n "/\\\\$/ {N;s/ \\\\\n/\t/};p" |
  137. sed -n '/CONFIG_HPS/ !b; :next {/CONFIG_HPS/ s/[()]//g;/endif/ b;p;n;b next}' |
  138. sort -u | grep_sdram_config
  139. echo ""
  140. echo "/* Sequencer auto configuration */"
  141. fix_newlines_in_macros \
  142. ${in_qts_dir}/hps_isw_handoff/*/sequencer_auto.h |
  143. sed -n "/__RW_MGR/ {s/__//;s/ \+\([^ ]\+\)$/\t\1/p}" |
  144. sort -u | grep_sdram_config
  145. echo ""
  146. echo "/* Sequencer defines configuration */"
  147. fix_newlines_in_macros \
  148. ${in_qts_dir}/hps_isw_handoff/*/sequencer_defines.h |
  149. sed -n "/^#define [^_]/ {s/__//;s/ \+\([^ ]\+\)$/\t\1/p}" |
  150. sort -u | grep_sdram_config
  151. echo ""
  152. echo "/* Sequencer ac_rom_init configuration */"
  153. fix_newlines_in_macros \
  154. ${in_qts_dir}/hps_isw_handoff/*/sequencer_auto_ac_init.c |
  155. sed -n '/^const.*\[/ !b; :next {/^const.*\[/ {N;s/\n//;s/alt_u32/u32/;s/\[.*\]/[]/};/endif/ b;p;n;b next}'
  156. echo ""
  157. echo "/* Sequencer inst_rom_init configuration */"
  158. fix_newlines_in_macros \
  159. ${in_qts_dir}/hps_isw_handoff/*/sequencer_auto_inst_init.c |
  160. sed -n '/^const.*\[/ !b; :next {/^const.*\[/ {N;s/\n//;s/alt_u32/u32/;s/\[.*\]/[]/};/endif/ b;p;n;b next}'
  161. cat << EOF
  162. #endif /* __SOCFPGA_SDRAM_CONFIG_H__ */
  163. EOF
  164. ) > "${out_dir}/sdram_config.h"
  165. }
  166. usage() {
  167. echo "$0 [soc_type] [input_qts_dir] [input_bsp_dir] [output_dir]"
  168. echo "Process QTS-generated headers into U-Boot compatible ones."
  169. echo ""
  170. echo " soc_type - Type of SoC, either 'cyclone5' or 'arria5'."
  171. echo " input_qts_dir - Directory with compiled Quartus project"
  172. echo " and containing the Quartus project file (QPF)."
  173. echo " input_bsp_dir - Directory with generated bsp containing"
  174. echo " the settings.bsp file."
  175. echo " output_dir - Directory to store the U-Boot compatible"
  176. echo " headers."
  177. echo ""
  178. }
  179. soc="$1"
  180. in_qts_dir="$2"
  181. in_bsp_dir="$3"
  182. out_dir="$4"
  183. if [ "$#" -ne 4 ] ; then
  184. usage
  185. exit 1
  186. fi
  187. if [ ! -d "${in_qts_dir}" -o ! -d "${in_bsp_dir}" -o \
  188. ! -d "${out_dir}" -o -z "${soc}" ] ; then
  189. usage
  190. exit 3
  191. fi
  192. process_iocsr_config "${soc}" "${in_qts_dir}" "${in_bsp_dir}" "${out_dir}"
  193. process_pinmux_config "${soc}" "${in_qts_dir}" "${in_bsp_dir}" "${out_dir}"
  194. process_pll_config "${soc}" "${in_qts_dir}" "${in_bsp_dir}" "${out_dir}"
  195. process_sdram_config "${soc}" "${in_qts_dir}" "${in_bsp_dir}" "${out_dir}"