create_fw.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <string.h>
  8. #include <errno.h>
  9. char blob_name[] = "isci_firmware.bin";
  10. char id[] = "#SCU MAGIC#";
  11. unsigned char version = 1;
  12. unsigned char sub_version = 0;
  13. /*
  14. * For all defined arrays:
  15. * elements 0-3 are for SCU0, ports 0-3
  16. * elements 4-7 are for SCU1, ports 0-3
  17. *
  18. * valid configurations for one SCU are:
  19. * P0 P1 P2 P3
  20. * ----------------
  21. * 0xF,0x0,0x0,0x0 # 1 x4 port
  22. * 0x3,0x0,0x4,0x8 # Phys 0 and 1 are a x2 port, phy 2 and phy 3 are each x1
  23. * # ports
  24. * 0x1,0x2,0xC,0x0 # Phys 0 and 1 are each x1 ports, phy 2 and phy 3 are a x2
  25. * # port
  26. * 0x3,0x0,0xC,0x0 # Phys 0 and 1 are a x2 port, phy 2 and phy 3 are a x2 port
  27. * 0x1,0x2,0x4,0x8 # Each phy is a x1 port (this is the default configuration)
  28. *
  29. * if there is a port/phy on which you do not wish to override the default
  30. * values, use the value assigned to UNINIT_PARAM (255).
  31. */
  32. unsigned int phy_mask[] = { 1, 2, 4, 8, 1, 2, 4, 8 };
  33. /* denotes SAS generation. i.e. 3: SAS Gen 3 6G */
  34. unsigned int phy_gen[] = { 3, 3, 3, 3, 3, 3, 3, 3 };
  35. /*
  36. * if there is a port/phy on which you do not wish to override the default
  37. * values, use the value "0000000000000000". SAS address of zero's is
  38. * considered invalid and will not be used.
  39. */
  40. unsigned long long sas_addr[] = { 0x5FCFFFFFF0000000ULL,
  41. 0x5FCFFFFFF1000000ULL,
  42. 0x5FCFFFFFF2000000ULL,
  43. 0x5FCFFFFFF3000000ULL,
  44. 0x5FCFFFFFF4000000ULL,
  45. 0x5FCFFFFFF5000000ULL,
  46. 0x5FCFFFFFF6000000ULL,
  47. 0x5FCFFFFFF7000000ULL };
  48. int write_blob(void)
  49. {
  50. FILE *fd;
  51. int err;
  52. fd = fopen(blob_name, "w+");
  53. if (!fd) {
  54. perror("Open file for write failed");
  55. return -EIO;
  56. }
  57. /* write id */
  58. err = fwrite((void *)id, sizeof(char), strlen(id)+1, fd);
  59. if (err == 0) {
  60. perror("write id failed");
  61. return err;
  62. }
  63. /* write version */
  64. err = fwrite((void *)&version, sizeof(version), 1, fd);
  65. if (err == 0) {
  66. perror("write version failed");
  67. return err;
  68. }
  69. /* write sub version */
  70. err = fwrite((void *)&sub_version, sizeof(sub_version), 1, fd);
  71. if (err == 0) {
  72. perror("write subversion failed");
  73. return err;
  74. }
  75. /* write phy mask header */
  76. err = fputc(0x1, fd);
  77. if (err == EOF) {
  78. perror("write phy mask header failed");
  79. return -EIO;
  80. }
  81. /* write size */
  82. err = fputc(8, fd);
  83. if (err == EOF) {
  84. perror("write phy mask size failed");
  85. return -EIO;
  86. }
  87. /* write phy masks */
  88. err = fwrite((void *)phy_mask, 1, sizeof(phy_mask), fd);
  89. if (err == 0) {
  90. perror("write phy_mask failed");
  91. return err;
  92. }
  93. /* write phy gen header */
  94. err = fputc(0x2, fd);
  95. if (err == EOF) {
  96. perror("write phy gen header failed");
  97. return -EIO;
  98. }
  99. /* write size */
  100. err = fputc(8, fd);
  101. if (err == EOF) {
  102. perror("write phy gen size failed");
  103. return -EIO;
  104. }
  105. /* write phy_gen */
  106. err = fwrite((void *)phy_gen,
  107. 1,
  108. sizeof(phy_gen),
  109. fd);
  110. if (err == 0) {
  111. perror("write phy_gen failed");
  112. return err;
  113. }
  114. /* write phy gen header */
  115. err = fputc(0x3, fd);
  116. if (err == EOF) {
  117. perror("write sas addr header failed");
  118. return -EIO;
  119. }
  120. /* write size */
  121. err = fputc(8, fd);
  122. if (err == EOF) {
  123. perror("write sas addr size failed");
  124. return -EIO;
  125. }
  126. /* write sas_addr */
  127. err = fwrite((void *)sas_addr,
  128. 1,
  129. sizeof(sas_addr),
  130. fd);
  131. if (err == 0) {
  132. perror("write sas_addr failed");
  133. return err;
  134. }
  135. /* write end header */
  136. err = fputc(0xff, fd);
  137. if (err == EOF) {
  138. perror("write end header failed");
  139. return -EIO;
  140. }
  141. fclose(fd);
  142. return 0;
  143. }
  144. int main(void)
  145. {
  146. int err;
  147. err = write_blob();
  148. if (err < 0)
  149. return err;
  150. return 0;
  151. }