ofw-shark.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/arm/boot/compressed/ofw-shark.c
  3.  *
  4.  * by Alexander Schulz
  5.  *
  6.  * This file is used to get some basic information
  7.  * about the memory layout of the shark we are running
  8.  * on. Memory is usually divided in blocks a 8 MB.
  9.  * And bootargs are copied from OpenFirmware.
  10.  */
  11. #include <linux/kernel.h>
  12. #include <linux/types.h>
  13. #include <asm/setup.h>
  14. #include <asm/page.h>
  15. asmlinkage void
  16. create_params (unsigned long *buffer)
  17. {
  18. /* Is there a better address? Also change in mach-shark/arch.c */
  19. struct tag *tag = (struct tag *) 0x08003000;
  20. int j,i,m,k,nr_banks,size;
  21. unsigned char *c;
  22. /* Head of the taglist */
  23. tag->hdr.tag  = ATAG_CORE;
  24. tag->hdr.size = tag_size(tag_core);
  25. tag->u.core.flags = FLAG_READONLY;
  26. tag->u.core.pagesize = PAGE_SIZE;
  27. tag->u.core.rootdev = 0;
  28. /* Build up one tagged block for each memory region */
  29. size=0;
  30. nr_banks=(unsigned int) buffer[0];
  31. for (j=0;j<nr_banks;j++){
  32. /* search the lowest address and put it into the next entry   */
  33. /* not a fast sort algorithm, but there are at most 8 entries */
  34. /* and this is used only once anyway                          */
  35. m=0xffffffff;
  36. for (i=0;i<(unsigned int) buffer[0];i++){
  37. if (buffer[2*i+1]<m) {
  38. m=buffer[2*i+1];
  39. k=i;
  40. }
  41. }
  42.   
  43. tag = tag_next(tag);
  44. tag->hdr.tag = ATAG_MEM;
  45. tag->hdr.size = tag_size(tag_mem32);
  46. tag->u.mem.size = buffer[2*k+2];
  47. tag->u.mem.start = buffer[2*k+1];
  48. size += buffer[2*k+2];
  49. buffer[2*k+1]=0xffffffff;                    /* mark as copied */
  50. }
  51. /* The command line */
  52. tag = tag_next(tag);
  53. tag->hdr.tag = ATAG_CMDLINE;
  54. c=(unsigned char *)(&buffer[34]);
  55. j=0;
  56. while (*c) tag->u.cmdline.cmdline[j++]=*c++;
  57. tag->u.cmdline.cmdline[j]=0;
  58. tag->hdr.size = (j + 7 + sizeof(struct tag_header)) >> 2;
  59. /* Hardware revision */
  60. tag = tag_next(tag);
  61. tag->hdr.tag = ATAG_REVISION;
  62. tag->hdr.size = tag_size(tag_revision);
  63. tag->u.revision.rev = ((unsigned char) buffer[33])-'0';
  64. /* End of the taglist */
  65. tag = tag_next(tag);
  66. tag->hdr.tag = 0;
  67. tag->hdr.size = 0;
  68. }
  69. typedef int (*ofw_handle_t)(void *);
  70. /* Everything below is called with a wrong MMU setting.
  71.  * This means: no string constants, no initialization of
  72.  * arrays, no global variables! This is ugly but I didn't
  73.  * want to write this in assembler :-)
  74.  */
  75. int
  76. of_decode_int(const unsigned char *p)
  77. {
  78. unsigned int i = *p++ << 8;
  79. i = (i + *p++) << 8;
  80. i = (i + *p++) << 8;
  81. return (i + *p);
  82. }
  83.   
  84. int
  85. OF_finddevice(ofw_handle_t openfirmware, char *name)
  86. {
  87. unsigned int args[8];
  88. char service[12];
  89. service[0]='f';
  90. service[1]='i';
  91. service[2]='n';
  92. service[3]='d';
  93. service[4]='d';
  94. service[5]='e';
  95. service[6]='v';
  96. service[7]='i';
  97. service[8]='c';
  98. service[9]='e';
  99. service[10]='';
  100. args[0]=(unsigned int)service;
  101. args[1]=1;
  102. args[2]=1;
  103. args[3]=(unsigned int)name;
  104. if (openfirmware(args) == -1)
  105. return -1;
  106. return args[4];
  107. }
  108. int
  109. OF_getproplen(ofw_handle_t openfirmware, int handle, char *prop)
  110. {
  111. unsigned int args[8];
  112. char service[12];
  113. service[0]='g';
  114. service[1]='e';
  115. service[2]='t';
  116. service[3]='p';
  117. service[4]='r';
  118. service[5]='o';
  119. service[6]='p';
  120. service[7]='l';
  121. service[8]='e';
  122. service[9]='n';
  123. service[10]='';
  124. args[0] = (unsigned int)service;
  125. args[1] = 2;
  126. args[2] = 1;
  127. args[3] = (unsigned int)handle;
  128. args[4] = (unsigned int)prop;
  129. if (openfirmware(args) == -1)
  130. return -1;
  131. return args[5];
  132. }
  133.   
  134. int
  135. OF_getprop(ofw_handle_t openfirmware, int handle, char *prop, void *buf, unsigned int buflen)
  136. {
  137. unsigned int args[8];
  138. char service[8];
  139. service[0]='g';
  140. service[1]='e';
  141. service[2]='t';
  142. service[3]='p';
  143. service[4]='r';
  144. service[5]='o';
  145. service[6]='p';
  146. service[7]='';
  147. args[0] = (unsigned int)service;
  148. args[1] = 4;
  149. args[2] = 1;
  150. args[3] = (unsigned int)handle;
  151. args[4] = (unsigned int)prop;
  152. args[5] = (unsigned int)buf;
  153. args[6] = buflen;
  154. if (openfirmware(args) == -1)
  155. return -1;
  156. return args[7];
  157. }
  158.   
  159. asmlinkage void ofw_init(ofw_handle_t o, int *nomr, int *pointer)
  160. {
  161. int phandle,i,mem_len,buffer[32];
  162. char temp[15];
  163.   
  164. temp[0]='/';
  165. temp[1]='m';
  166. temp[2]='e';
  167. temp[3]='m';
  168. temp[4]='o';
  169. temp[5]='r';
  170. temp[6]='y';
  171. temp[7]='';
  172. phandle=OF_finddevice(o,temp);
  173. temp[0]='r';
  174. temp[1]='e';
  175. temp[2]='g';
  176. temp[3]='';
  177. mem_len = OF_getproplen(o,phandle, temp);
  178. OF_getprop(o,phandle, temp, buffer, mem_len);
  179. *nomr=mem_len >> 3;
  180. for (i=0; i<=mem_len/4; i++) pointer[i]=of_decode_int((const unsigned char *)&buffer[i]);
  181. temp[0]='/';
  182. temp[1]='c';
  183. temp[2]='h';
  184. temp[3]='o';
  185. temp[4]='s';
  186. temp[5]='e';
  187. temp[6]='n';
  188. temp[7]='';
  189. phandle=OF_finddevice(o,temp);
  190. temp[0]='b';
  191. temp[1]='o';
  192. temp[2]='o';
  193. temp[3]='t';
  194. temp[4]='a';
  195. temp[5]='r';
  196. temp[6]='g';
  197. temp[7]='s';
  198. temp[8]='';
  199. mem_len = OF_getproplen(o,phandle, temp);
  200. OF_getprop(o,phandle, temp, buffer, mem_len);
  201. if (mem_len > 128) mem_len=128;
  202. for (i=0; i<=mem_len/4; i++) pointer[i+33]=buffer[i];
  203. pointer[i+33]=0;
  204. temp[0]='/';
  205. temp[1]='';
  206. phandle=OF_finddevice(o,temp);
  207. temp[0]='b';
  208. temp[1]='a';
  209. temp[2]='n';
  210. temp[3]='n';
  211. temp[4]='e';
  212. temp[5]='r';
  213. temp[6]='-';
  214. temp[7]='n';
  215. temp[8]='a';
  216. temp[9]='m';
  217. temp[10]='e';
  218. temp[11]='';
  219. mem_len = OF_getproplen(o,phandle, temp);
  220. OF_getprop(o,phandle, temp, buffer, mem_len);
  221. (unsigned char) pointer[32] = ((unsigned char *) buffer)[mem_len-2];
  222. }