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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) Eicon Technology Corporation, 2000.
  3.  *
  4.  * Eicon File Revision :    1.9  
  5.  *
  6.  * This software may be used and distributed according to the terms
  7.  * of the GNU General Public License, incorporated herein by reference.
  8.  *
  9.  */
  10. #include <linux/fs.h>
  11. #undef N_DATA   /* Because we have our own definition */
  12. #include <asm/segment.h>
  13. #include <asm/io.h>
  14. #include "sys.h"
  15. #include "idi.h"
  16. #include "constant.h"
  17. #include "divas.h"
  18. #undef ID_MASK
  19. #include "pc.h"
  20. #include "pr_pc.h"
  21. #include "adapter.h"
  22. #include "uxio.h"
  23. #include <linux/pci.h>
  24. #include <linux/kernel.h>
  25. #include <linux/ioport.h>
  26. struct file_operations Divas_fops;
  27. int Divas_major;
  28. extern int do_ioctl(struct inode *pDivasInode, struct file *pDivasFile, 
  29.  unsigned int command, unsigned long arg);
  30. extern unsigned int do_poll(struct file *pFile, struct poll_table_struct *pPollTable);
  31. extern ssize_t do_read(struct file *pFile, char *pUserBuffer, size_t BufferSize, loff_t *pOffset);
  32. extern int do_open(struct inode *, struct file *);
  33. extern int do_release(struct inode *, struct file *);
  34. int FPGA_Done=0;
  35. int DivasCardsDiscover(void)
  36. {
  37. word wNumCards = 0, wDeviceIndex = 0;
  38. byte byBus, byFunc;
  39. word wPCIConsultation, PCItmp;
  40. dword j, i;
  41. unsigned int PCIserial;
  42. dia_card_t Card;
  43. byte *b;
  44. while (wDeviceIndex < 10)
  45. {
  46. wPCIConsultation = pcibios_find_device(PCI_VENDOR_ID_EICON, 
  47. PCI_DEVICE_ID_EICON_MAESTRAQ, 
  48. wDeviceIndex, 
  49. &byBus, &byFunc);
  50. if (wPCIConsultation == PCIBIOS_SUCCESSFUL)
  51. {
  52. dword dwRAM, dwDivasIOBase, dwCFG, dwCTL; 
  53. byte byIRQ;
  54. printk(KERN_DEBUG "Divas: DIVA Server 4BRI Foundn");
  55. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_2,(unsigned int *) &dwRAM);
  56. dwRAM &= 0xFFC00000;
  57. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_1,(unsigned int *) &dwDivasIOBase);
  58. dwDivasIOBase &= 0xFFFFFF00;
  59. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_0,(unsigned int *) &dwCFG);
  60. dwCFG &= 0xFFFFFF00;
  61. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_3,(unsigned int *) &dwCTL);
  62. dwCTL &= 0xFFFFE000;
  63. pcibios_read_config_byte(byBus, byFunc, PCI_INTERRUPT_LINE, &byIRQ);
  64. /* Retrieve the serial number */
  65. pcibios_write_config_word(byBus,byFunc,0x4E,0x00FC);
  66. for (j=0, PCItmp=0; j<10000 && !PCItmp; j++)
  67. {
  68. pcibios_read_config_word(byBus,byFunc,0x4E, &PCItmp);
  69. PCItmp &= 0x8000;  // extract done flag
  70. }
  71. pcibios_read_config_dword(byBus,byFunc,0x50, &PCIserial);
  72. Card.memory[DIVAS_RAM_MEMORY] = ioremap(dwRAM, 0x400000);
  73. Card.memory[DIVAS_CTL_MEMORY] = ioremap(dwCTL, 0x2000);
  74. Card.memory[DIVAS_CFG_MEMORY] = ioremap(dwCFG, 0x100);
  75. Card.io_base=dwDivasIOBase;
  76. Card.irq = byIRQ;
  77. Card.card_type = DIA_CARD_TYPE_DIVA_SERVER_Q;
  78. Card.bus_type = DIA_BUS_TYPE_PCI;
  79. FPGA_Done = 0;
  80. /* Create four virtual card structures as we want to treat 
  81.    the 4Bri card as 4 Bri cards*/
  82. for(i=0;i<4;i++)
  83. {
  84. b=Card.memory[DIVAS_RAM_MEMORY];
  85. b+=(MQ_PROTCODE_OFFSET) * (i==0?0:1); 
  86. DPRINTF(("divas: offset = 0x%x", i* MQ_PROTCODE_OFFSET));
  87. Card.memory[DIVAS_RAM_MEMORY]=b;
  88.  
  89. b = Card.memory[DIVAS_RAM_MEMORY];
  90. b += MQ_SM_OFFSET;
  91. Card.memory[DIVAS_SHARED_MEMORY] = b;
  92. Card.bus_num = byBus;
  93. Card.func_num = byFunc;
  94. Card.slot = -1;
  95. /* Fill in Name */
  96. Card.name[0] = 'D';
  97. Card.name[1] = 'I';
  98. Card.name[2] = 'V';
  99. Card.name[3] = 'A';
  100. Card.name[4] = 'S';
  101. Card.name[5] = 'Q';
  102. Card.name[6] = '0' + i;
  103. Card.name[7] = '';
  104. Card.serial = PCIserial;
  105.   Card.card_id = wNumCards;
  106.   if (DivasCardNew(&Card) != 0)
  107. {
  108. // Force for loop to terminate
  109. i = 4;
  110. continue;
  111. }
  112. wNumCards++;
  113. }//for
  114. }
  115. wDeviceIndex++;
  116. }
  117. wDeviceIndex = 0;
  118. while (wDeviceIndex < 10)
  119. {
  120. wPCIConsultation = pcibios_find_device(PCI_VENDOR_ID_EICON, 
  121. PCI_DEVICE_ID_EICON_MAESTRA, 
  122. wDeviceIndex, 
  123. &byBus, &byFunc);
  124. if (wPCIConsultation == PCIBIOS_SUCCESSFUL)
  125. {
  126. dword dwPLXIOBase, dwDivasIOBase;
  127. byte byIRQ;
  128. printk(KERN_DEBUG "Divas: DIVA Server BRI (S/T) Foundn");
  129. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_1, (unsigned int *) &dwPLXIOBase);
  130. dwPLXIOBase &= 0xFFFFFF80;
  131. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_2, (unsigned int *) &dwDivasIOBase);
  132. dwDivasIOBase &= 0xFFFFFFFC;
  133. pcibios_read_config_byte(byBus, byFunc, PCI_INTERRUPT_LINE, &byIRQ);
  134. Card.card_id = wNumCards;
  135. Card.card_type = DIA_CARD_TYPE_DIVA_SERVER_B;
  136. Card.bus_type = DIA_BUS_TYPE_PCI;
  137. Card.irq = byIRQ;
  138. Card.reset_base = dwPLXIOBase;
  139. Card.io_base = dwDivasIOBase;
  140. Card.bus_num = byBus;
  141. Card.func_num = byFunc;
  142. Card.slot = -1;
  143. Card.name[0] = 'D';
  144. Card.name[1] = 'I';
  145. Card.name[2] = 'V';
  146. Card.name[3] = 'A';
  147. Card.name[4] = 'S';
  148. Card.name[5] = 'B';
  149. Card.name[6] = '';
  150. if (check_region(Card.io_base, 0x20))
  151. {
  152. printk(KERN_WARNING "Divas: DIVA I/O Base already in use 0x%x-0x%xn", Card.io_base, Card.io_base + 0x1F);
  153. wDeviceIndex++;
  154. continue;
  155. }
  156. if (check_region(Card.reset_base, 0x80))
  157. {
  158. printk(KERN_WARNING "Divas: PLX I/O Base already in use 0x%x-0x%xn", Card.reset_base, Card.reset_base + 0x7F);
  159. wDeviceIndex++;
  160. continue;
  161. }
  162. if (DivasCardNew(&Card) != 0)
  163. {
  164. wDeviceIndex++;
  165. continue;
  166. }
  167. wNumCards++;
  168. }
  169. wPCIConsultation = pcibios_find_device(PCI_VENDOR_ID_EICON, 
  170. PCI_DEVICE_ID_EICON_MAESTRAQ_U, 
  171. wDeviceIndex, 
  172. &byBus, &byFunc);
  173. if (wPCIConsultation == PCIBIOS_SUCCESSFUL)
  174. {
  175. dword dwPLXIOBase, dwDivasIOBase;
  176. byte byIRQ;
  177. printk(KERN_DEBUG "Divas: DIVA Server BRI (U) Foundn");
  178. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_1, (unsigned int *) &dwPLXIOBase);
  179. dwPLXIOBase &= 0xFFFFFF80;
  180. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_2, (unsigned int *) &dwDivasIOBase);
  181. dwDivasIOBase &= 0xFFFFFFFC;
  182. pcibios_read_config_byte(byBus, byFunc, PCI_INTERRUPT_LINE, &byIRQ);
  183. Card.card_id = wNumCards;
  184. Card.card_type = DIA_CARD_TYPE_DIVA_SERVER_B;
  185. Card.bus_type = DIA_BUS_TYPE_PCI;
  186. Card.irq = byIRQ;
  187. Card.reset_base = dwPLXIOBase;
  188. Card.io_base = dwDivasIOBase;
  189. Card.bus_num = byBus;
  190. Card.func_num = byFunc;
  191. Card.slot = -1;
  192. Card.name[0] = 'D';
  193. Card.name[1] = 'I';
  194. Card.name[2] = 'V';
  195. Card.name[3] = 'A';
  196. Card.name[4] = 'S';
  197. Card.name[5] = 'B';
  198. Card.name[6] = '';
  199. if (check_region(Card.io_base, 0x20))
  200. {
  201. printk(KERN_WARNING "Divas: DIVA I/O Base already in use 0x%x-0x%xn", Card.io_base, Card.io_base + 0x1F);
  202. wDeviceIndex++;
  203. continue;
  204. }
  205. if (check_region(Card.reset_base, 0x80))
  206. {
  207. printk(KERN_WARNING "Divas: PLX I/O Base already in use 0x%x-0x%xn", Card.reset_base, Card.reset_base + 0x7F);
  208. wDeviceIndex++;
  209. continue;
  210. }
  211. if (DivasCardNew(&Card) != 0)
  212. {
  213. wDeviceIndex++;
  214. continue;
  215. }
  216. wNumCards++;
  217. }
  218. wDeviceIndex++;
  219. }
  220. wDeviceIndex = 0;
  221. while (wDeviceIndex < 10)
  222. {
  223. wPCIConsultation = pcibios_find_device(PCI_VENDOR_ID_EICON, 
  224. PCI_DEVICE_ID_EICON_MAESTRAP, 
  225. wDeviceIndex, 
  226. &byBus, &byFunc);
  227. if (wPCIConsultation == PCIBIOS_SUCCESSFUL)
  228. {
  229. dword dwRAM, dwREG, dwCFG;
  230. byte byIRQ;
  231. printk(KERN_DEBUG "Divas: DIVA Server PRI Foundn");
  232. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_0, (unsigned int *) &dwRAM);
  233. dwRAM &= 0xFFFFF000;
  234. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_2, (unsigned int *) &dwREG);
  235. dwREG &= 0xFFFFF000;
  236. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_4, (unsigned int *) &dwCFG);
  237. dwCFG &= 0xFFFFF000;
  238. pcibios_read_config_byte(byBus, byFunc, PCI_INTERRUPT_LINE, &byIRQ);
  239. Card.memory[DIVAS_RAM_MEMORY] = ioremap(dwRAM, 0x10000);
  240. Card.memory[DIVAS_REG_MEMORY] = ioremap(dwREG, 0x4000);
  241. Card.memory[DIVAS_CFG_MEMORY] = ioremap(dwCFG, 0x1000);
  242. Card.memory[DIVAS_SHARED_MEMORY] = Card.memory[DIVAS_RAM_MEMORY] + DIVAS_SHARED_OFFSET;
  243. /* pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_1, (unsigned int *) &dwPLXIOBase);
  244. dwPLXIOBase &= 0xFFFFFFFc;
  245. pcibios_read_config_dword(byBus, byFunc, PCI_BASE_ADDRESS_2, (unsigned int *) &dwDivasIOBase);
  246. dwDivasIOBase &= 0xFFFFFF80;
  247. pcibios_read_config_byte(byBus, byFunc, PCI_INTERRUPT_LINE, &byIRQ);
  248. */
  249. Card.card_id = wNumCards;
  250. Card.card_type = DIA_CARD_TYPE_DIVA_SERVER;
  251. Card.bus_type = DIA_BUS_TYPE_PCI;
  252. Card.irq = byIRQ;
  253. /* Card.reset_base = dwPLXIOBase;
  254. Card.io_base = dwDivasIOBase;*/
  255. Card.bus_num = byBus;
  256. Card.func_num = byFunc;
  257. Card.slot = -1;
  258. Card.name[0] = 'D';
  259. Card.name[1] = 'I';
  260. Card.name[2] = 'V';
  261. Card.name[3] = 'A';
  262. Card.name[4] = 'S';
  263. Card.name[5] = 'P';
  264. Card.name[6] = '';
  265. if (DivasCardNew(&Card) != 0)
  266. {
  267. wDeviceIndex++;
  268. continue;
  269. }
  270. wNumCards++;
  271. }
  272. wDeviceIndex++;
  273. }
  274. printk(KERN_INFO "Divas: %d cards detectedn", wNumCards);
  275. if(wNumCards == 0)
  276. {
  277. return -1;
  278. }
  279. Divas_fops.ioctl = do_ioctl;
  280. Divas_fops.poll = do_poll;
  281. Divas_fops.read = do_read;
  282. Divas_fops.open = do_open;
  283. Divas_fops.release = do_release;
  284. Divas_major = register_chrdev(0, "Divas", &Divas_fops);
  285. if (Divas_major < 0)
  286. {
  287. printk(KERN_WARNING "Divas: Unable to register character drivern");
  288. return -1;
  289. }
  290. return 0;
  291. }
  292. /* Error return -1 */
  293. int DivasConfigGet(dia_card_t *card)
  294. {
  295. /* Retrieve Config from O/S? Not in Linux */
  296. return 0;
  297. }
  298. dia_config_t *DivasConfig(card_t *card, dia_config_t *config)
  299. {
  300. /* If config retrieved from OS then copy the data into a dia_config_t structure here
  301. and return the pointer here. If the config 'came from above' then just 
  302. return config;
  303. */
  304. return config;
  305. }