pci.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:45k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* PCI.c - PCI functions */
  2. /* Copyright - Galileo technology. */
  3. #ifdef __linux__
  4. #include <asm/galileo-boards/evb64120A/core.h>
  5. #include <asm/galileo-boards/evb64120A/pci.h>
  6. #ifndef PROM
  7. #include <linux/kernel.h>
  8. #endif
  9. #undef PCI_DEBUG
  10. #ifdef PCI_DEBUG
  11. #define DBG(x...) printk(x)
  12. #else
  13. #define DBG(x...)
  14. #endif
  15. #else
  16. #include "core.h"
  17. #include "pci.h"
  18. #include <string.h>
  19. #endif
  20. /********************************************************************
  21. * pci0ScanDevices   - This function scan PCI0 bus, if found any device on
  22. *                     this bus it interrogate the Device for the information
  23. *                     it can discover.
  24. *                     The fields with all information are the following:
  25. *    char            type[20];
  26. *    unsigned int    deviceNum;
  27. *    unsigned int    venID;
  28. *    unsigned int    deviceID;
  29. *    unsigned int    bar0Base;
  30. *    unsigned int    bar0Size;
  31. *    unsigned int    bar1Base;
  32. *    unsigned int    bar1Size;
  33. *    unsigned int    bar2Base;
  34. *    unsigned int    bar2Size;
  35. *    unsigned int    bar3Base;
  36. *    unsigned int    bar3Size;
  37. *    unsigned int    bar4Base;
  38. *    unsigned int    bar4Size;
  39. *    unsigned int    bar5Base;
  40. *    unsigned int    bar5Size;
  41. *
  42. * Inputs:   PCI0_DEVICE* pci0Detect - Pointer to an array of STRUCT PCI0_DEVICE.
  43. *           unsigned int numberOfElment - The PCI0_DEVICE Array length.
  44. * Output:   None.
  45. *********************************************************************/
  46. void pci0ScanDevices(PCI_DEVICE * pci0Detect, unsigned int numberOfElment)
  47. {
  48. PCI_DEVICE *pci0ArrayPointer = pci0Detect;
  49. unsigned int id; /* PCI Configuration register 0x0. */
  50. unsigned int device; /* device`s Counter. */
  51. unsigned int classCode; /* PCI Configuration register 0x8 */
  52. unsigned int arrayCounter = 0;
  53. unsigned int memBaseAddress;
  54. unsigned int memSize;
  55. unsigned int c18RegValue;
  56. PCI0_MASTER_ENABLE(SELF);
  57. /* According to PCI REV 2.1 MAX agents on the bus are -21- */
  58. for (device = 6; device < 8; device++) {
  59. id = pci0ReadConfigReg(PCI_0DEVICE_AND_VENDOR_ID, device);
  60. GT_REG_READ(INTERRUPT_CAUSE_REGISTER, &c18RegValue);
  61. /* Clearing bit 18 of in the Cause Register 0xc18 by writting 0. */
  62. GT_REG_WRITE(INTERRUPT_CAUSE_REGISTER,
  63.      c18RegValue & 0xfffbffff);
  64. if ((id != 0xffffffff) && !(c18RegValue & 0x40000)) {
  65. classCode =
  66.     pci0ReadConfigReg
  67.     (PCI_0CLASS_CODE_AND_REVISION_ID, device);
  68. pci0ArrayPointer->deviceNum = device;
  69. pci0ArrayPointer->venID = (id & 0xffff);
  70. pci0ArrayPointer->deviceID =
  71.     ((id & 0xffff0000) >> 16);
  72. DBG("nrr: venID %x devID %xn",
  73.     pci0ArrayPointer->venID,
  74.     pci0ArrayPointer->deviceID);
  75. DBG("rr: device found %xn",
  76.     pci0ArrayPointer->deviceNum);
  77. /* BAR0 parameters */
  78. memBaseAddress = pci0ReadConfigReg(BAR0, device);
  79. pci0ArrayPointer->bar0Type = memBaseAddress & 1;
  80. pci0ArrayPointer->bar0Base =
  81.     memBaseAddress & 0xfffff000;
  82. pci0WriteConfigReg(BAR0, device, 0xffffffff);
  83. memSize = pci0ReadConfigReg(BAR0, device);
  84. if (memSize == 0) { /* case of an empty BAR */
  85. pci0ArrayPointer->bar0Size = 0;
  86. } else {
  87. if (pci0ArrayPointer->bar0Type == 0) /* memory space */
  88. memSize =
  89.     ~(memSize & 0xfffffff0) + 1;
  90. else /* IO space */
  91. memSize =
  92.     ~(memSize & 0xfffffffc) + 1;
  93. pci0ArrayPointer->bar0Size = memSize;
  94. }
  95. DBG("rr: device BAR0 size %xn", memSize);
  96. DBG("rr: device BAR0 address %xn",
  97.     memBaseAddress);
  98. pci0WriteConfigReg(BAR0, device, memBaseAddress);
  99. /* BAR1 parameters */
  100. memBaseAddress = pci0ReadConfigReg(BAR1, device);
  101. pci0ArrayPointer->bar1Type = memBaseAddress & 1;
  102. pci0ArrayPointer->bar1Base =
  103.     memBaseAddress & 0xfffff000;
  104. pci0WriteConfigReg(BAR1, device, 0xffffffff);
  105. memSize = pci0ReadConfigReg(BAR1, device);
  106. if (memSize == 0) { /* case of an empty BAR */
  107. pci0ArrayPointer->bar1Size = 0;
  108. } else {
  109. if (pci0ArrayPointer->bar1Type == 0) /* memory space */
  110. memSize =
  111.     ~(memSize & 0xfffffff0) + 1;
  112. else /* IO space */
  113. memSize =
  114.     ~(memSize & 0xfffffffc) + 1;
  115. pci0ArrayPointer->bar1Size = memSize;
  116. }
  117. DBG("rr: device BAR1 size %xn", memSize);
  118. DBG("rr: device BAR1 address %xn",
  119.     memBaseAddress);
  120. pci0WriteConfigReg(BAR1, device, memBaseAddress);
  121. /* BAR2 parameters */
  122. memBaseAddress = pci0ReadConfigReg(BAR2, device);
  123. pci0ArrayPointer->bar2Type = memBaseAddress & 1;
  124. pci0ArrayPointer->bar2Base =
  125.     memBaseAddress & 0xfffff000;
  126. pci0WriteConfigReg(BAR2, device, 0xffffffff);
  127. memSize = pci0ReadConfigReg(BAR2, device);
  128. if (memSize == 0) { /* case of an empty BAR */
  129. pci0ArrayPointer->bar2Size = 0;
  130. } else {
  131. if (pci0ArrayPointer->bar2Type == 0) /* memory space */
  132. memSize =
  133.     ~(memSize & 0xfffffff0) + 1;
  134. else /* IO space */
  135. memSize =
  136.     ~(memSize & 0xfffffffc) + 1;
  137. pci0ArrayPointer->bar2Size = memSize;
  138. }
  139. DBG("rr: device BAR2 size %xn", memSize);
  140. DBG("rr: device BAR2 address %xn",
  141.     memBaseAddress);
  142. pci0WriteConfigReg(BAR2, device, memBaseAddress);
  143. /* BAR3 parameters */
  144. memBaseAddress = pci0ReadConfigReg(BAR3, device);
  145. pci0ArrayPointer->bar3Type = memBaseAddress & 1;
  146. pci0ArrayPointer->bar3Base =
  147.     memBaseAddress & 0xfffff000;
  148. pci0WriteConfigReg(BAR3, device, 0xffffffff);
  149. memSize = pci0ReadConfigReg(BAR3, device);
  150. if (memSize == 0) { /* case of an empty BAR */
  151. pci0ArrayPointer->bar3Size = 0;
  152. } else {
  153. if (pci0ArrayPointer->bar3Type == 0) /* memory space */
  154. memSize =
  155.     ~(memSize & 0xfffffff0) + 1;
  156. else /* IO space */
  157. memSize =
  158.     ~(memSize & 0xfffffffc) + 1;
  159. pci0ArrayPointer->bar3Size = memSize;
  160. }
  161. DBG("rr: device BAR3 size %xn", memSize);
  162. DBG("rr: device BAR3 address %xn",
  163.     memBaseAddress);
  164. pci0WriteConfigReg(BAR3, device, memBaseAddress);
  165. /* BAR4 parameters */
  166. memBaseAddress = pci0ReadConfigReg(BAR4, device);
  167. pci0ArrayPointer->bar4Type = memBaseAddress & 1;
  168. pci0ArrayPointer->bar4Base =
  169.     memBaseAddress & 0xfffff000;
  170. pci0WriteConfigReg(BAR4, device, 0xffffffff);
  171. memSize = pci0ReadConfigReg(BAR4, device);
  172. if (memSize == 0) { /* case of an empty BAR */
  173. pci0ArrayPointer->bar4Size = 0;
  174. } else {
  175. if (pci0ArrayPointer->bar4Type == 0) /* memory space */
  176. memSize =
  177.     ~(memSize & 0xfffffff0) + 1;
  178. else /* IO space */
  179. memSize =
  180.     ~(memSize & 0xfffffffc) + 1;
  181. pci0ArrayPointer->bar4Size = memSize;
  182. }
  183. DBG("rr: device BAR4 size %xn", memSize);
  184. DBG("rr: device BAR4 address %xn",
  185.     memBaseAddress);
  186. pci0WriteConfigReg(BAR4, device, memBaseAddress);
  187. /* BAR5 parameters */
  188. memBaseAddress = pci0ReadConfigReg(BAR5, device);
  189. pci0ArrayPointer->bar5Type = memBaseAddress & 1;
  190. pci0ArrayPointer->bar5Base =
  191.     memBaseAddress & 0xfffff000;
  192. pci0WriteConfigReg(BAR5, device, 0xffffffff);
  193. memSize = pci0ReadConfigReg(BAR5, device);
  194. if (memSize == 0) { /* case of an empty BAR */
  195. pci0ArrayPointer->bar5Size = 0;
  196. } else {
  197. if (pci0ArrayPointer->bar5Type == 1) /* memory space */
  198. memSize =
  199.     ~(memSize & 0xfffffff0) + 1;
  200. else /* IO space */
  201. memSize =
  202.     ~(memSize & 0xfffffffc) + 1;
  203. pci0ArrayPointer->bar5Size = memSize;
  204. }
  205. DBG("rr: device BAR5 size %xn", memSize);
  206. DBG("rr: device BAR5 address %xn",
  207.     memBaseAddress);
  208. pci0WriteConfigReg(BAR5, device, memBaseAddress);
  209. /* End of BARs Detection. */
  210. classCode = ((classCode & 0xff000000) >> 24);
  211. switch (classCode) {
  212. case 0x0:
  213. strcpy(pci0ArrayPointer->type,
  214.        "Old generation device");
  215. break;
  216. case 0x1:
  217. strcpy(pci0ArrayPointer->type,
  218.        "Mass storage controller");
  219. break;
  220. case 0x2:
  221. strcpy(pci0ArrayPointer->type,
  222.        "Network controller");
  223. break;
  224. case 0x3:
  225. strcpy(pci0ArrayPointer->type,
  226.        "Display controller");
  227. break;
  228. case 0x4:
  229. strcpy(pci0ArrayPointer->type,
  230.        "Multimedia device");
  231. break;
  232. case 0x5:
  233. strcpy(pci0ArrayPointer->type,
  234.        "Memory controller");
  235. break;
  236. case 0x6:
  237. strcpy(pci0ArrayPointer->type,
  238.        "Bridge Device");
  239. break;
  240. case 0x7:
  241. strcpy(pci0ArrayPointer->type,
  242.        "Simple Communication controllers");
  243. break;
  244. case 0x8:
  245. strcpy(pci0ArrayPointer->type,
  246.        "Base system peripherals");
  247. break;
  248. case 0x9:
  249. strcpy(pci0ArrayPointer->type,
  250.        "Input Devices");
  251. break;
  252. case 0xa:
  253. strcpy(pci0ArrayPointer->type,
  254.        "Docking stations");
  255. break;
  256. case 0xb:
  257. strcpy(pci0ArrayPointer->type,
  258.        "Processors");
  259. break;
  260. case 0xc:
  261. strcpy(pci0ArrayPointer->type,
  262.        "Serial bus controllers");
  263. break;
  264. case 0xd:
  265. strcpy(pci0ArrayPointer->type,
  266.        "Wireless controllers");
  267. break;
  268. case 0xe:
  269. strcpy(pci0ArrayPointer->type,
  270.        "Intelligent I/O controllers");
  271. break;
  272. case 0xf:
  273. strcpy(pci0ArrayPointer->type,
  274.        "Satellite communication controllers");
  275. break;
  276. case 0x10:
  277. strcpy(pci0ArrayPointer->type,
  278.        "Encryption/Decryption controllers");
  279. break;
  280. case 0x11:
  281. strcpy(pci0ArrayPointer->type,
  282.        "Data acquisition and signal processing controllers");
  283. break;
  284. default:
  285. break;
  286. }
  287. arrayCounter++; /* point to the next element in the Array. */
  288. if (arrayCounter == numberOfElment)
  289. return; /* When the Array is fully used, return. */
  290. /* Else, points to next free Element. */
  291. pci0ArrayPointer = &pci0Detect[arrayCounter];
  292. }
  293. }
  294. pci0ArrayPointer->deviceNum = 0; /* 0 => End of List */
  295. }
  296. /********************************************************************
  297. * pci1ScanDevices   - This function scan PCI1 bus, if found any device on
  298. *                     this bus it interrogate the Device for the information
  299. *                     it can discover.
  300. *                     The fields with all information are the following:
  301. *    char            type[20];
  302. *    unsigned int    deviceNum;
  303. *    unsigned int    venID;
  304. *    unsigned int    deviceID;
  305. *    unsigned int    bar0Base;
  306. *    unsigned int    bar0Size;
  307. *    unsigned int    bar1Base;
  308. *    unsigned int    bar1Size;
  309. *    unsigned int    bar2Base;
  310. *    unsigned int    bar2Size;
  311. *    unsigned int    bar3Base;
  312. *    unsigned int    bar3Size;
  313. *    unsigned int    bar4Base;
  314. *    unsigned int    bar4Size;
  315. *    unsigned int    bar5Base;
  316. *    unsigned int    bar5Size;
  317. *
  318. * Inputs:   Pointer to an array of STRUCT PCI1_DEVICE.
  319. * Output:   None.
  320. *********************************************************************/
  321. void pci1ScanDevices(PCI_DEVICE * pci1Detect, unsigned int numberOfElment)
  322. {
  323. PCI_DEVICE *pci1ArrayPointer = pci1Detect;
  324. unsigned int id; /* PCI Configuration register 0x0. */
  325. unsigned int device; /* device`s Counter. */
  326. unsigned int classCode; /* PCI Configuration register 0x8 */
  327. unsigned int arrayCounter = 0;
  328. unsigned int memBaseAddress;
  329. unsigned int memSize;
  330. unsigned int c98RegValue;
  331. PCI1_MASTER_ENABLE(SELF);
  332. /* According to PCI REV 2.1 MAX agents on the bus are -21- */
  333. for (device = 1; device < 22; device++) {
  334. id = pci1ReadConfigReg(PCI_0DEVICE_AND_VENDOR_ID, device);
  335. GT_REG_READ(HIGH_INTERRUPT_CAUSE_REGISTER, &c98RegValue);
  336. /* Clearing bit 18 of in the High Cause Register 0xc98 */
  337. GT_REG_WRITE(HIGH_INTERRUPT_CAUSE_REGISTER,
  338.      c98RegValue & 0xfffbffff);
  339. if ((id != 0xffffffff) && !(c98RegValue & 0x40000)) {
  340. classCode =
  341.     pci1ReadConfigReg
  342.     (PCI_0CLASS_CODE_AND_REVISION_ID, device);
  343. pci1ArrayPointer->deviceNum = device;
  344. pci1ArrayPointer->venID = (id & 0xffff);
  345. pci1ArrayPointer->deviceID =
  346.     ((id & 0xffff0000) >> 16);
  347. /* BAR0 parameters */
  348. memBaseAddress = pci1ReadConfigReg(BAR0, device);
  349. pci1ArrayPointer->bar0Type = memBaseAddress & 1;
  350. pci1ArrayPointer->bar0Base =
  351.     memBaseAddress & 0xfffff000;
  352. pci1WriteConfigReg(BAR0, device, 0xffffffff);
  353. memSize = pci1ReadConfigReg(BAR0, device);
  354. if (memSize == 0) { /* case of an empty BAR */
  355. pci1ArrayPointer->bar0Size = 0;
  356. } else {
  357. if (pci1ArrayPointer->bar0Type == 0) /* memory space */
  358. memSize =
  359.     ~(memSize & 0xfffffff0) + 1;
  360. else /* IO space */
  361. memSize =
  362.     ~(memSize & 0xfffffffc) + 1;
  363. pci1ArrayPointer->bar0Size = memSize;
  364. }
  365. pci1WriteConfigReg(BAR0, device, memBaseAddress);
  366. /* BAR1 parameters */
  367. memBaseAddress = pci1ReadConfigReg(BAR1, device);
  368. pci1ArrayPointer->bar1Type = memBaseAddress & 1;
  369. pci1ArrayPointer->bar1Base =
  370.     memBaseAddress & 0xfffff000;
  371. pci1WriteConfigReg(BAR1, device, 0xffffffff);
  372. memSize = pci1ReadConfigReg(BAR1, device);
  373. if (memSize == 0) { /* case of an empty BAR */
  374. pci1ArrayPointer->bar1Size = 0;
  375. } else {
  376. if (pci1ArrayPointer->bar1Type == 0) /* memory space */
  377. memSize =
  378.     ~(memSize & 0xfffffff0) + 1;
  379. else /* IO space */
  380. memSize =
  381.     ~(memSize & 0xfffffffc) + 1;
  382. pci1ArrayPointer->bar1Size = memSize;
  383. }
  384. pci1WriteConfigReg(BAR1, device, memBaseAddress);
  385. /* BAR2 parameters */
  386. memBaseAddress = pci1ReadConfigReg(BAR2, device);
  387. pci1ArrayPointer->bar2Type = memBaseAddress & 1;
  388. pci1ArrayPointer->bar2Base =
  389.     memBaseAddress & 0xfffff000;
  390. pci1WriteConfigReg(BAR2, device, 0xffffffff);
  391. memSize = pci1ReadConfigReg(BAR2, device);
  392. if (memSize == 0) { /* case of an empty BAR */
  393. pci1ArrayPointer->bar2Size = 0;
  394. } else {
  395. if (pci1ArrayPointer->bar2Type == 0) /* memory space */
  396. memSize =
  397.     ~(memSize & 0xfffffff0) + 1;
  398. else /* IO space */
  399. memSize =
  400.     ~(memSize & 0xfffffffc) + 1;
  401. pci1ArrayPointer->bar2Size = memSize;
  402. }
  403. pci1WriteConfigReg(BAR2, device, memBaseAddress);
  404. /* BAR3 parameters */
  405. memBaseAddress = pci1ReadConfigReg(BAR3, device);
  406. pci1ArrayPointer->bar3Type = memBaseAddress & 1;
  407. pci1ArrayPointer->bar3Base =
  408.     memBaseAddress & 0xfffff000;
  409. pci1WriteConfigReg(BAR3, device, 0xffffffff);
  410. memSize = pci1ReadConfigReg(BAR3, device);
  411. if (memSize == 0) { /* case of an empty BAR */
  412. pci1ArrayPointer->bar3Size = 0;
  413. } else {
  414. if (pci1ArrayPointer->bar3Type == 0) /* memory space */
  415. memSize =
  416.     ~(memSize & 0xfffffff0) + 1;
  417. else /* IO space */
  418. memSize =
  419.     ~(memSize & 0xfffffffc) + 1;
  420. pci1ArrayPointer->bar3Size = memSize;
  421. }
  422. pci1WriteConfigReg(BAR3, device, memBaseAddress);
  423. /* BAR4 parameters */
  424. memBaseAddress = pci1ReadConfigReg(BAR4, device);
  425. pci1ArrayPointer->bar4Type = memBaseAddress & 1;
  426. pci1ArrayPointer->bar4Base =
  427.     memBaseAddress & 0xfffff000;
  428. pci1WriteConfigReg(BAR4, device, 0xffffffff);
  429. memSize = pci1ReadConfigReg(BAR4, device);
  430. if (memSize == 0) { /* case of an empty BAR */
  431. pci1ArrayPointer->bar4Size = 0;
  432. } else {
  433. if (pci1ArrayPointer->bar4Type == 0) /* memory space */
  434. memSize =
  435.     ~(memSize & 0xfffffff0) + 1;
  436. else /* IO space */
  437. memSize =
  438.     ~(memSize & 0xfffffffc) + 1;
  439. pci1ArrayPointer->bar4Size = memSize;
  440. }
  441. pci1WriteConfigReg(BAR4, device, memBaseAddress);
  442. /* BAR5 parameters */
  443. memBaseAddress = pci1ReadConfigReg(BAR5, device);
  444. pci1ArrayPointer->bar5Type = memBaseAddress & 1;
  445. pci1ArrayPointer->bar5Base =
  446.     memBaseAddress & 0xfffff000;
  447. pci1WriteConfigReg(BAR5, device, 0xffffffff);
  448. memSize = pci1ReadConfigReg(BAR5, device);
  449. if (memSize == 0) { /* case of an empty BAR */
  450. pci1ArrayPointer->bar5Size = 0;
  451. } else {
  452. if (pci1ArrayPointer->bar5Type == 0) /* memory space */
  453. memSize =
  454.     ~(memSize & 0xfffffff0) + 1;
  455. else /* IO space */
  456. memSize =
  457.     ~(memSize & 0xfffffffc) + 1;
  458. pci1ArrayPointer->bar5Size = memSize;
  459. }
  460. pci1WriteConfigReg(BAR5, device, memBaseAddress);
  461. /* End of BARs Detection. */
  462. classCode = ((classCode & 0xff000000) >> 24);
  463. switch (classCode) {
  464. case 0x0:
  465. strcpy(pci1ArrayPointer->type,
  466.        "Old generation device");
  467. break;
  468. case 0x1:
  469. strcpy(pci1ArrayPointer->type,
  470.        "Mass storage controller");
  471. break;
  472. case 0x2:
  473. strcpy(pci1ArrayPointer->type,
  474.        "Network controller");
  475. break;
  476. case 0x3:
  477. strcpy(pci1ArrayPointer->type,
  478.        "Display controller");
  479. break;
  480. case 0x4:
  481. strcpy(pci1ArrayPointer->type,
  482.        "Multimedia device");
  483. break;
  484. case 0x5:
  485. strcpy(pci1ArrayPointer->type,
  486.        "Memory controller");
  487. break;
  488. case 0x6:
  489. strcpy(pci1ArrayPointer->type,
  490.        "Bridge Device");
  491. break;
  492. case 0x7:
  493. strcpy(pci1ArrayPointer->type,
  494.        "Simple Communication controllers");
  495. break;
  496. case 0x8:
  497. strcpy(pci1ArrayPointer->type,
  498.        "Base system peripherals");
  499. break;
  500. case 0x9:
  501. strcpy(pci1ArrayPointer->type,
  502.        "Input Devices");
  503. break;
  504. case 0xa:
  505. strcpy(pci1ArrayPointer->type,
  506.        "Docking stations");
  507. break;
  508. case 0xb:
  509. strcpy(pci1ArrayPointer->type,
  510.        "Processors");
  511. break;
  512. case 0xc:
  513. strcpy(pci1ArrayPointer->type,
  514.        "Serial bus controllers");
  515. break;
  516. case 0xd:
  517. strcpy(pci1ArrayPointer->type,
  518.        "Wireless controllers");
  519. break;
  520. case 0xe:
  521. strcpy(pci1ArrayPointer->type,
  522.        "Intelligent I/O controllers");
  523. break;
  524. case 0xf:
  525. strcpy(pci1ArrayPointer->type,
  526.        "Satellite communication controllers");
  527. break;
  528. case 0x10:
  529. strcpy(pci1ArrayPointer->type,
  530.        "Encryption/Decryption controllers");
  531. break;
  532. case 0x11:
  533. strcpy(pci1ArrayPointer->type,
  534.        "Data acquisition and signal processing controllers");
  535. break;
  536. }
  537. arrayCounter++; /* point to the next element in the Array. */
  538. if (arrayCounter == numberOfElment)
  539. return; /* When the Array is fully used, return. */
  540. /* Else, points to next free Element. */
  541. pci1ArrayPointer = &pci1Detect[arrayCounter];
  542. }
  543. }
  544. pci1ArrayPointer->deviceNum = 0; /* 0 => End of List */
  545. }
  546. /********************************************************************
  547. * pci0WriteConfigReg - Write to a PCI configuration register
  548. *                    - Make sure the GT is configured as a master before
  549. *                      writingto another device on the PCI.
  550. *                    - The function takes care of Big/Little endian conversion.
  551. * Inputs:   unsigned int regOffset: The register offset as it apears in the GT spec
  552. *                   (or any other PCI device spec)
  553. *           pciDevNum: The device number needs to be addressed.
  554. *
  555. *  Configuration Address 0xCF8:
  556. *
  557. *       31 30    24 23  16 15  11 10     8 7      2  0     <=bit Number
  558. *  |congif|Reserved|  Bus |Device|Function|Register|00|
  559. *  |Enable|        |Number|Number| Number | Number |  |    <=field Name
  560. *
  561. *********************************************************************/
  562. void pci0WriteConfigReg(unsigned int regOffset, unsigned int pciDevNum,
  563. unsigned int data)
  564. {
  565. unsigned int DataForRegCf8;
  566. unsigned int functionNum;
  567. functionNum = regOffset & 0x00000700;
  568. pciDevNum = pciDevNum << 11;
  569. regOffset = regOffset & 0x0fffffff;
  570. DataForRegCf8 = (regOffset | pciDevNum | functionNum) | BIT31;
  571. GT_REG_WRITE(PCI_0CONFIGURATION_ADDRESS, DataForRegCf8);
  572. if (pciDevNum == SELF) { /* This board */
  573. GT_REG_WRITE(PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
  574.      data);
  575. } else { /* configuration Transaction over the pci. */
  576. /* The PCI is working in LE Mode So it swap the Data. */
  577. GT_REG_WRITE(PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
  578.      WORDSWAP(data));
  579. }
  580. }
  581. /********************************************************************
  582. * pci1WriteConfigReg - Write to a PCI configuration register
  583. *                   - Make sure the GT is configured as a master before writing
  584. *                     to another device on the PCI.
  585. *                   - The function takes care of Big/Little endian conversion.
  586. * Inputs:   unsigned int regOffset: The register offset as it apears in the
  587. *           GT spec (or any other PCI device spec)
  588. *           pciDevNum: The device number needs to be addressed.
  589. *
  590. *  Configuration Address 0xCF8:
  591. *
  592. *       31 30    24 23  16 15  11 10     8 7      2  0     <=bit Number
  593. *  |congif|Reserved|  Bus |Device|Function|Register|00|
  594. *  |Enable|        |Number|Number| Number | Number |  |    <=field Name
  595. *
  596. *********************************************************************/
  597. void pci1WriteConfigReg(unsigned int regOffset, unsigned int pciDevNum,
  598. unsigned int data)
  599. {
  600. unsigned int DataForRegCf8;
  601. unsigned int functionNum;
  602. functionNum = regOffset & 0x00000700;
  603. pciDevNum = pciDevNum << 11;
  604. regOffset = regOffset & 0x0fffffff;
  605. if (pciDevNum == SELF) { /* This board */
  606. /* when configurating our own PCI 1 L-unit the access is through
  607.    the PCI 0 interface with reg number = reg number + 0x80 */
  608. DataForRegCf8 =
  609.     (regOffset | pciDevNum | functionNum | 0x80) | BIT31;
  610. GT_REG_WRITE(PCI_0CONFIGURATION_ADDRESS, DataForRegCf8);
  611. } else {
  612. DataForRegCf8 =
  613.     (regOffset | pciDevNum | functionNum) | BIT31;
  614. GT_REG_WRITE(PCI_1CONFIGURATION_ADDRESS, DataForRegCf8);
  615. }
  616. if (pciDevNum == SELF) { /* This board */
  617. GT_REG_WRITE(PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
  618.      data);
  619. } else {
  620. GT_REG_WRITE(PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER,
  621.      WORDSWAP(data));
  622. }
  623. }
  624. /********************************************************************
  625. * pci0ReadConfigReg  - Read from a PCI0 configuration register
  626. *                    - Make sure the GT is configured as a master before
  627. *                      reading from another device on the PCI.
  628. *                   - The function takes care of Big/Little endian conversion.
  629. * INPUTS:   regOffset: The register offset as it apears in the GT spec (or PCI
  630. *                        spec)
  631. *           pciDevNum: The device number needs to be addressed.
  632. * RETURNS: data , if the data == 0xffffffff check the master abort bit in the
  633. *                 cause register to make sure the data is valid
  634. *
  635. *  Configuration Address 0xCF8:
  636. *
  637. *       31 30    24 23  16 15  11 10     8 7      2  0     <=bit Number
  638. *  |congif|Reserved|  Bus |Device|Function|Register|00|
  639. *  |Enable|        |Number|Number| Number | Number |  |    <=field Name
  640. *
  641. *********************************************************************/
  642. unsigned int pci0ReadConfigReg(unsigned int regOffset,
  643.        unsigned int pciDevNum)
  644. {
  645. unsigned int DataForRegCf8;
  646. unsigned int data;
  647. unsigned int functionNum;
  648. functionNum = regOffset & 0x00000700;
  649. pciDevNum = pciDevNum << 11;
  650. regOffset = regOffset & 0x0fffffff;
  651. DataForRegCf8 = (regOffset | pciDevNum | functionNum) | BIT31;
  652. GT_REG_WRITE(PCI_0CONFIGURATION_ADDRESS, DataForRegCf8);
  653. if (pciDevNum == SELF) { /* This board */
  654. GT_REG_READ(PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
  655.     &data);
  656. return data;
  657. } else { /* The PCI is working in LE Mode So it swap the Data. */
  658. GT_REG_READ(PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
  659.     &data);
  660. return WORDSWAP(data);
  661. }
  662. }
  663. /********************************************************************
  664. * pci1ReadConfigReg  - Read from a PCI1 configuration register
  665. *                    - Make sure the GT is configured as a master before
  666. *                      reading from another device on the PCI.
  667. *                   - The function takes care of Big/Little endian conversion.
  668. * INPUTS:   regOffset: The register offset as it apears in the GT spec (or PCI
  669. *                        spec)
  670. *           pciDevNum: The device number needs to be addressed.
  671. * RETURNS: data , if the data == 0xffffffff check the master abort bit in the
  672. *                 cause register to make sure the data is valid
  673. *
  674. *  Configuration Address 0xCF8:
  675. *
  676. *       31 30    24 23  16 15  11 10     8 7      2  0     <=bit Number
  677. *  |congif|Reserved|  Bus |Device|Function|Register|00|
  678. *  |Enable|        |Number|Number| Number | Number |  |    <=field Name
  679. *
  680. *********************************************************************/
  681. unsigned int pci1ReadConfigReg(unsigned int regOffset,
  682.        unsigned int pciDevNum)
  683. {
  684. unsigned int DataForRegCf8;
  685. unsigned int data;
  686. unsigned int functionNum;
  687. functionNum = regOffset & 0x00000700;
  688. pciDevNum = pciDevNum << 11;
  689. regOffset = regOffset & 0x0fffffff;
  690. if (pciDevNum == SELF) { /* This board */
  691. /* when configurating our own PCI 1 L-unit the access is through
  692.    the PCI 0 interface with reg number = reg number + 0x80 */
  693. DataForRegCf8 =
  694.     (regOffset | pciDevNum | functionNum | 0x80) | BIT31;
  695. GT_REG_WRITE(PCI_0CONFIGURATION_ADDRESS, DataForRegCf8);
  696. } else {
  697. DataForRegCf8 =
  698.     (regOffset | pciDevNum | functionNum) | BIT31;
  699. GT_REG_WRITE(PCI_1CONFIGURATION_ADDRESS, DataForRegCf8);
  700. }
  701. if (pciDevNum == SELF) { /* This board */
  702. GT_REG_READ(PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER,
  703.     &data);
  704. return data;
  705. } else {
  706. GT_REG_READ(PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER,
  707.     &data);
  708. return WORDSWAP(data);
  709. }
  710. }
  711. /********************************************************************
  712. * pci0MapIOspace - Maps PCI0 IO space for the master.
  713. * Inputs: base and length of pci0Io
  714. *********************************************************************/
  715. void pci0MapIOspace(unsigned int pci0IoBase, unsigned int pci0IoLength)
  716. {
  717. unsigned int pci0IoTop =
  718.     (unsigned int) (pci0IoBase + pci0IoLength);
  719. if (pci0IoLength == 0)
  720. pci0IoTop++;
  721. pci0IoBase = (unsigned int) (pci0IoBase >> 21);
  722. pci0IoTop = (unsigned int) (((pci0IoTop - 1) & 0x0fffffff) >> 21);
  723. GT_REG_WRITE(PCI_0I_O_LOW_DECODE_ADDRESS, pci0IoBase);
  724. GT_REG_WRITE(PCI_0I_O_HIGH_DECODE_ADDRESS, pci0IoTop);
  725. }
  726. /********************************************************************
  727. * pci1MapIOspace - Maps PCI1 IO space for the master.
  728. * Inputs: base and length of pci1Io
  729. *********************************************************************/
  730. void pci1MapIOspace(unsigned int pci1IoBase, unsigned int pci1IoLength)
  731. {
  732. unsigned int pci1IoTop =
  733.     (unsigned int) (pci1IoBase + pci1IoLength);
  734. if (pci1IoLength == 0)
  735. pci1IoTop++;
  736. pci1IoBase = (unsigned int) (pci1IoBase >> 21);
  737. pci1IoTop = (unsigned int) (((pci1IoTop - 1) & 0x0fffffff) >> 21);
  738. GT_REG_WRITE(PCI_1I_O_LOW_DECODE_ADDRESS, pci1IoBase);
  739. GT_REG_WRITE(PCI_1I_O_HIGH_DECODE_ADDRESS, pci1IoTop);
  740. }
  741. /********************************************************************
  742. * pci0MapMemory0space - Maps PCI0 memory0 space for the master.
  743. * Inputs: base and length of pci0Mem0
  744. *********************************************************************/
  745. void pci0MapMemory0space(unsigned int pci0Mem0Base,
  746.  unsigned int pci0Mem0Length)
  747. {
  748. unsigned int pci0Mem0Top = pci0Mem0Base + pci0Mem0Length;
  749. if (pci0Mem0Length == 0)
  750. pci0Mem0Top++;
  751. pci0Mem0Base = pci0Mem0Base >> 21;
  752. pci0Mem0Top = ((pci0Mem0Top - 1) & 0x0fffffff) >> 21;
  753. GT_REG_WRITE(PCI_0MEMORY0_LOW_DECODE_ADDRESS, pci0Mem0Base);
  754. GT_REG_WRITE(PCI_0MEMORY0_HIGH_DECODE_ADDRESS, pci0Mem0Top);
  755. }
  756. /********************************************************************
  757. * pci1MapMemory0space - Maps PCI1 memory0 space for the master.
  758. * Inputs: base and length of pci1Mem0
  759. *********************************************************************/
  760. void pci1MapMemory0space(unsigned int pci1Mem0Base,
  761.  unsigned int pci1Mem0Length)
  762. {
  763. unsigned int pci1Mem0Top = pci1Mem0Base + pci1Mem0Length;
  764. if (pci1Mem0Length == 0)
  765. pci1Mem0Top++;
  766. pci1Mem0Base = pci1Mem0Base >> 21;
  767. pci1Mem0Top = ((pci1Mem0Top - 1) & 0x0fffffff) >> 21;
  768. GT_REG_WRITE(PCI_1MEMORY0_LOW_DECODE_ADDRESS, pci1Mem0Base);
  769. GT_REG_WRITE(PCI_1MEMORY0_HIGH_DECODE_ADDRESS, pci1Mem0Top);
  770. }
  771. /********************************************************************
  772. * pci0MapMemory1space - Maps PCI0 memory1 space for the master.
  773. * Inputs: base and length of pci0Mem1
  774. *********************************************************************/
  775. void pci0MapMemory1space(unsigned int pci0Mem1Base,
  776.  unsigned int pci0Mem1Length)
  777. {
  778. unsigned int pci0Mem1Top = pci0Mem1Base + pci0Mem1Length;
  779. if (pci0Mem1Length == 0)
  780. pci0Mem1Top++;
  781. pci0Mem1Base = pci0Mem1Base >> 21;
  782. pci0Mem1Top = ((pci0Mem1Top - 1) & 0x0fffffff) >> 21;
  783. GT_REG_WRITE(PCI_0MEMORY1_LOW_DECODE_ADDRESS, pci0Mem1Base);
  784. GT_REG_WRITE(PCI_0MEMORY1_HIGH_DECODE_ADDRESS, pci0Mem1Top);
  785. #ifndef PROM
  786. DBG(KERN_INFO "pci0Mem1Base %xn", pci0Mem1Base);
  787. DBG(KERN_INFO "pci0Mem1Top %xn", pci0Mem1Top);
  788. GT_REG_READ(PCI_0MEMORY0_ADDRESS_REMAP, &pci0Mem1Base);
  789. DBG(KERN_INFO "Mem 0/0 remap %xn", pci0Mem1Base);
  790. GT_REG_READ(PCI_0MEMORY1_ADDRESS_REMAP, &pci0Mem1Base);
  791. DBG(KERN_INFO "Mem 0/1 remap %xn", pci0Mem1Base);
  792. GT_REG_WRITE(PCI_0MEMORY1_ADDRESS_REMAP, 0x500);
  793. GT_REG_READ(PCI_0MEMORY1_ADDRESS_REMAP, &pci0Mem1Base);
  794. DBG(KERN_INFO "Mem 0/1 remapped %xn", pci0Mem1Base);
  795. #endif
  796. }
  797. /********************************************************************
  798. * pci1MapMemory1space - Maps PCI1 memory1 space for the master.
  799. * Inputs: base and length of pci1Mem1
  800. *********************************************************************/
  801. void pci1MapMemory1space(unsigned int pci1Mem1Base,
  802.  unsigned int pci1Mem1Length)
  803. {
  804. unsigned int pci1Mem1Top = pci1Mem1Base + pci1Mem1Length;
  805. if (pci1Mem1Length == 0)
  806. pci1Mem1Top++;
  807. pci1Mem1Base = pci1Mem1Base >> 21;
  808. pci1Mem1Top = ((pci1Mem1Top - 1) & 0x0fffffff) >> 21;
  809. GT_REG_WRITE(PCI_1MEMORY1_LOW_DECODE_ADDRESS, pci1Mem1Base);
  810. GT_REG_WRITE(PCI_1MEMORY1_HIGH_DECODE_ADDRESS, pci1Mem1Top);
  811. }
  812. /********************************************************************
  813. * pci0GetIOspaceBase - Return PCI0 IO Base Address.
  814. * Inputs: N/A
  815. * Returns: PCI0 IO Base Address.
  816. *********************************************************************/
  817. unsigned int pci0GetIOspaceBase()
  818. {
  819. unsigned int base;
  820. GT_REG_READ(PCI_0I_O_LOW_DECODE_ADDRESS, &base);
  821. base = base << 21;
  822. return base;
  823. }
  824. /********************************************************************
  825. * pci0GetIOspaceSize - Return PCI0 IO Bar Size.
  826. * Inputs: N/A
  827. * Returns: PCI0 IO Bar Size.
  828. *********************************************************************/
  829. unsigned int pci0GetIOspaceSize()
  830. {
  831. unsigned int top, base, size;
  832. GT_REG_READ(PCI_0I_O_LOW_DECODE_ADDRESS, &base);
  833. base = base << 21;
  834. GT_REG_READ(PCI_0I_O_HIGH_DECODE_ADDRESS, &top);
  835. top = (top << 21);
  836. size = ((top - base) & 0xfffffff);
  837. size = size | 0x1fffff;
  838. return (size + 1);
  839. }
  840. /********************************************************************
  841. * pci0GetMemory0Base - Return PCI0 Memory 0 Base Address.
  842. * Inputs: N/A
  843. * Returns: PCI0 Memory 0 Base Address.
  844. *********************************************************************/
  845. unsigned int pci0GetMemory0Base()
  846. {
  847. unsigned int base;
  848. GT_REG_READ(PCI_0MEMORY0_LOW_DECODE_ADDRESS, &base);
  849. base = base << 21;
  850. return base;
  851. }
  852. /********************************************************************
  853. * pci0GetMemory0Size - Return PCI0 Memory 0 Bar Size.
  854. * Inputs: N/A
  855. * Returns: PCI0 Memory 0 Bar Size.
  856. *********************************************************************/
  857. unsigned int pci0GetMemory0Size()
  858. {
  859. unsigned int top, base, size;
  860. GT_REG_READ(PCI_0MEMORY0_LOW_DECODE_ADDRESS, &base);
  861. base = base << 21;
  862. GT_REG_READ(PCI_0MEMORY0_HIGH_DECODE_ADDRESS, &top);
  863. top = (top << 21);
  864. size = ((top - base) & 0xfffffff);
  865. size = size | 0x1fffff;
  866. return (size + 1);
  867. }
  868. /********************************************************************
  869. * pci0GetMemory1Base - Return PCI0 Memory 1 Base Address.
  870. * Inputs: N/A
  871. * Returns: PCI0 Memory 1 Base Address.
  872. *********************************************************************/
  873. unsigned int pci0GetMemory1Base()
  874. {
  875. unsigned int base;
  876. GT_REG_READ(PCI_0MEMORY1_LOW_DECODE_ADDRESS, &base);
  877. base = base << 21;
  878. return base;
  879. }
  880. /********************************************************************
  881. * pci0GetMemory1Size - Return PCI0 Memory 1 Bar Size.
  882. * Inputs: N/A
  883. * Returns: PCI0 Memory 1 Bar Size.
  884. *********************************************************************/
  885. unsigned int pci0GetMemory1Size()
  886. {
  887. unsigned int top, base, size;
  888. GT_REG_READ(PCI_0MEMORY1_LOW_DECODE_ADDRESS, &base);
  889. base = base << 21;
  890. GT_REG_READ(PCI_0MEMORY1_HIGH_DECODE_ADDRESS, &top);
  891. top = (top << 21);
  892. size = ((top - base) & 0xfffffff);
  893. size = size | 0x1fffff;
  894. return (size + 1);
  895. }
  896. /********************************************************************
  897. * pci1GetIOspaceBase - Return PCI1 IO Base Address.
  898. * Inputs: N/A
  899. * Returns: PCI1 IO Base Address.
  900. *********************************************************************/
  901. unsigned int pci1GetIOspaceBase()
  902. {
  903. unsigned int base;
  904. GT_REG_READ(PCI_1I_O_LOW_DECODE_ADDRESS, &base);
  905. base = base << 21;
  906. return base;
  907. }
  908. /********************************************************************
  909. * pci1GetIOspaceSize - Return PCI1 IO Bar Size.
  910. * Inputs: N/A
  911. * Returns: PCI1 IO Bar Size.
  912. *********************************************************************/
  913. unsigned int pci1GetIOspaceSize()
  914. {
  915. unsigned int top, base, size;
  916. GT_REG_READ(PCI_1I_O_LOW_DECODE_ADDRESS, &base);
  917. base = base << 21;
  918. GT_REG_READ(PCI_1I_O_HIGH_DECODE_ADDRESS, &top);
  919. top = (top << 21);
  920. size = ((top - base) & 0xfffffff);
  921. size = size | 0x1fffff;
  922. return (size + 1);
  923. }
  924. /********************************************************************
  925. * pci1GetMemory0Base - Return PCI1 Memory 0 Base Address.
  926. * Inputs: N/A
  927. * Returns: PCI1 Memory 0 Base Address.
  928. *********************************************************************/
  929. unsigned int pci1GetMemory0Base()
  930. {
  931. unsigned int base;
  932. GT_REG_READ(PCI_1MEMORY0_LOW_DECODE_ADDRESS, &base);
  933. base = base << 21;
  934. return base;
  935. }
  936. /********************************************************************
  937. * pci1GetMemory0Size - Return PCI1 Memory 0 Bar Size.
  938. * Inputs: N/A
  939. * Returns: PCI1 Memory 0 Bar Size.
  940. *********************************************************************/
  941. unsigned int pci1GetMemory0Size()
  942. {
  943. unsigned int top, base, size;
  944. GT_REG_READ(PCI_1MEMORY1_LOW_DECODE_ADDRESS, &base);
  945. base = base << 21;
  946. GT_REG_READ(PCI_1MEMORY1_HIGH_DECODE_ADDRESS, &top);
  947. top = (top << 21);
  948. size = ((top - base) & 0xfffffff);
  949. size = size | 0x1fffff;
  950. return (size + 1);
  951. }
  952. /********************************************************************
  953. * pci1GetMemory1Base - Return PCI1 Memory 1 Base Address.
  954. * Inputs: N/A
  955. * Returns: PCI1 Memory 1 Base Address.
  956. *********************************************************************/
  957. unsigned int pci1GetMemory1Base()
  958. {
  959. unsigned int base;
  960. GT_REG_READ(PCI_1MEMORY1_LOW_DECODE_ADDRESS, &base);
  961. base = base << 21;
  962. return base;
  963. }
  964. /********************************************************************
  965. * pci1GetMemory1Size - Return PCI1 Memory 1 Bar Size.
  966. * Inputs: N/A
  967. * Returns: PCI1 Memory 1 Bar Size.
  968. *********************************************************************/
  969. unsigned int pci1GetMemory1Size()
  970. {
  971. unsigned int top, base, size;
  972. GT_REG_READ(PCI_1MEMORY1_LOW_DECODE_ADDRESS, &base);
  973. base = base << 21;
  974. GT_REG_READ(PCI_1MEMORY1_HIGH_DECODE_ADDRESS, &top);
  975. top = (top << 21);
  976. size = ((top - base) & 0xfffffff);
  977. size = size | 0x1fffff;
  978. return (size + 1);
  979. }
  980. /********************************************************************
  981. * pci0MapInternalRegSpace - Maps the internal registers memory space for the
  982. *                           slave.
  983. *                           Stays the same for all GT devices Disco include
  984. * Inputs: base of pci0 internal register
  985. *********************************************************************/
  986. void pci0MapInternalRegSpace(unsigned int pci0InternalBase)
  987. {
  988. pci0InternalBase = pci0InternalBase & 0xfffff000;
  989. pci0InternalBase =
  990.     pci0InternalBase |
  991.     (pci0ReadConfigReg
  992.      (PCI_0INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS,
  993.       SELF) & 0x00000fff);
  994. pci0WriteConfigReg
  995.     (PCI_0INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS, SELF,
  996.      pci0InternalBase);
  997. }
  998. /********************************************************************
  999. * pci1MapInternalRegSpace - Maps the internal registers memory space for the
  1000. *                           slave.
  1001. *                           Stays the same for all GT devices Disco include
  1002. * Inputs: base of pci1 internal register
  1003. *********************************************************************/
  1004. void pci1MapInternalRegSpace(unsigned int pci1InternalBase)
  1005. {
  1006. pci1InternalBase = pci1InternalBase & 0xfffff000;
  1007. pci1InternalBase =
  1008.     pci1InternalBase |
  1009.     (pci1ReadConfigReg
  1010.      (PCI_0INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS,
  1011.       SELF) & 0x00000fff);
  1012. pci1WriteConfigReg
  1013.     (PCI_0INTERNAL_REGISTERS_MEMORY_MAPPED_BASE_ADDRESS, SELF,
  1014.      pci1InternalBase);
  1015. }
  1016. /********************************************************************
  1017. * pci0MapInternalRegIOSpace - Maps the internal registers IO space for the
  1018. *                             slave.
  1019. *                             Stays the same for all GT devices Disco include
  1020. * Inputs: base of pci0 internal io register
  1021. *********************************************************************/
  1022. void pci0MapInternalRegIOSpace(unsigned int pci0InternalBase)
  1023. {
  1024. pci0InternalBase = pci0InternalBase & 0xfffff000;
  1025. pci0InternalBase =
  1026.     pci0InternalBase |
  1027.     (pci0ReadConfigReg
  1028.      (PCI_0INTERNAL_REGISTERS_I_OMAPPED_BASE_ADDRESS,
  1029.       0) & 0x00000fff);
  1030. pci0WriteConfigReg(PCI_0INTERNAL_REGISTERS_I_OMAPPED_BASE_ADDRESS,
  1031.    SELF, pci0InternalBase);
  1032. }
  1033. /********************************************************************
  1034. * pci0MapInternalRegIOSpace - Maps the internal registers IO space for the
  1035. *                             slave.
  1036. *                             Stays the same for all GT devices Disco include
  1037. * Inputs: base of pci1 internal io register
  1038. *********************************************************************/
  1039. void pci1MapInternalRegIOSpace(unsigned int pci1InternalBase)
  1040. {
  1041. pci1InternalBase = pci1InternalBase & 0xfffff000;
  1042. pci1InternalBase =
  1043.     pci1InternalBase |
  1044.     (pci1ReadConfigReg
  1045.      (PCI_0INTERNAL_REGISTERS_I_OMAPPED_BASE_ADDRESS,
  1046.       SELF) & 0x00000fff);
  1047. pci1WriteConfigReg(PCI_0INTERNAL_REGISTERS_I_OMAPPED_BASE_ADDRESS,
  1048.    SELF, pci1InternalBase);
  1049. }
  1050. /********************************************************************
  1051. * pci0MapMemoryBanks0_1 - Maps PCI0 memory banks 0 and 1 for the slave.
  1052. *                         for Discovery we need two function: SCS0 & SCS1
  1053. *                         (instead of SCS[1:0])
  1054. * Inputs: base and size of pci0 dram
  1055. *********************************************************************/
  1056. void pci0MapMemoryBanks0_1(unsigned int pci0Dram0_1Base,
  1057.    unsigned int pci0Dram0_1Size)
  1058. {
  1059. pci0Dram0_1Base = pci0Dram0_1Base & 0xfffff000;
  1060. pci0Dram0_1Base =
  1061.     pci0Dram0_1Base |
  1062.     (pci0ReadConfigReg(PCI_0SCS_1_0_BASE_ADDRESS, SELF) &
  1063.      0x00000fff);
  1064. pci0WriteConfigReg(PCI_0SCS_1_0_BASE_ADDRESS, SELF,
  1065.    pci0Dram0_1Base);
  1066. /* swapped Bar */
  1067. pci0WriteConfigReg(PCI_0SWAPPED_SCS_1_0_BASE_ADDRESS, SELF,
  1068.    pci0Dram0_1Base);
  1069. if (pci0Dram0_1Size == 0)
  1070. pci0Dram0_1Size++;
  1071. GT_REG_WRITE(PCI_0SCS_1_0_BANK_SIZE, pci0Dram0_1Size - 1);
  1072. }
  1073. /********************************************************************
  1074. * pci1MapMemoryBanks0_1 - Maps PCI1 memory banks 0 and 1 for the slave.
  1075. *                         for Discovery we need two function: SCS0 & SCS1
  1076. *                         (instead of SCS[1:0])
  1077. * Inputs: base and size of pci1 dram
  1078. *********************************************************************/
  1079. void pci1MapMemoryBanks0_1(unsigned int pci1Dram0_1Base,
  1080.    unsigned int pci1Dram0_1Size)
  1081. {
  1082. pci1Dram0_1Base = pci1Dram0_1Base & 0xfffff000;
  1083. pci1Dram0_1Base =
  1084.     pci1Dram0_1Base |
  1085.     (pci1ReadConfigReg(PCI_0SCS_1_0_BASE_ADDRESS, SELF) &
  1086.      0x00000fff);
  1087. pci1WriteConfigReg(PCI_0SCS_1_0_BASE_ADDRESS, SELF,
  1088.    pci1Dram0_1Base);
  1089. /* swapped Bar */
  1090. pci1WriteConfigReg(PCI_0SWAPPED_SCS_1_0_BASE_ADDRESS, SELF,
  1091.    pci1Dram0_1Base);
  1092. if (pci1Dram0_1Size == 0)
  1093. pci1Dram0_1Size++;
  1094. GT_REG_WRITE(PCI_1SCS_1_0_BANK_SIZE, pci1Dram0_1Size - 1);
  1095. }
  1096. /********************************************************************
  1097. * pci0MapMemoryBanks2_3 - Maps PCI0 memory banks 2 and 3 for the slave.
  1098. *                         for Discovery we need two function: SCS2 & SCS3
  1099. *                         (instead of SCS[3:2])
  1100. * Inputs: base and size of pci0 dram
  1101. *********************************************************************/
  1102. void pci0MapMemoryBanks2_3(unsigned int pci0Dram2_3Base,
  1103.    unsigned int pci0Dram2_3Size)
  1104. {
  1105. pci0Dram2_3Base = pci0Dram2_3Base & 0xfffff000;
  1106. pci0Dram2_3Base =
  1107.     pci0Dram2_3Base |
  1108.     (pci0ReadConfigReg(PCI_0SCS_3_2_BASE_ADDRESS, SELF) &
  1109.      0x00000fff);
  1110. pci0WriteConfigReg(PCI_0SCS_3_2_BASE_ADDRESS, SELF,
  1111.    pci0Dram2_3Base);
  1112. /* swapped Bar */
  1113. pci0WriteConfigReg(PCI_0SWAPPED_SCS_3_2_BASE_ADDRESS, SELF,
  1114.    pci0Dram2_3Base);
  1115. if (pci0Dram2_3Size == 0)
  1116. pci0Dram2_3Size++;
  1117. GT_REG_WRITE(PCI_0SCS_3_2_BANK_SIZE, pci0Dram2_3Size - 1);
  1118. }
  1119. /********************************************************************
  1120. * pci1MapMemoryBanks2_3 - Maps PCI1 memory banks 2 and 3 for the slave.
  1121. *                         for Discovery we need two function: SCS2 & SCS3
  1122. *                         (instead of SCS[3:2])
  1123. * Inputs: base and size of pci1 dram
  1124. *********************************************************************/
  1125. void pci1MapMemoryBanks2_3(unsigned int pci1Dram2_3Base,
  1126.    unsigned int pci1Dram2_3Size)
  1127. {
  1128. pci1Dram2_3Base = pci1Dram2_3Base & 0xfffff000;
  1129. pci1Dram2_3Base =
  1130.     pci1Dram2_3Base |
  1131.     (pci1ReadConfigReg(PCI_0SCS_3_2_BASE_ADDRESS, SELF) &
  1132.      0x00000fff);
  1133. pci1WriteConfigReg(PCI_0SCS_3_2_BASE_ADDRESS, SELF,
  1134.    pci1Dram2_3Base);
  1135. /* swapped Bar */
  1136. pci1WriteConfigReg(PCI_0SWAPPED_SCS_3_2_BASE_ADDRESS, SELF,
  1137.    pci1Dram2_3Base);
  1138. if (pci1Dram2_3Size == 0)
  1139. pci1Dram2_3Size++;
  1140. GT_REG_WRITE(PCI_1SCS_3_2_BANK_SIZE, pci1Dram2_3Size - 1);
  1141. }
  1142. /********************************************************************
  1143. * pci0MapDevices0_1and2MemorySpace - Maps PCI0 devices 0,1 and 2 memory spaces
  1144. *                                    for the slave.
  1145. *                                    For the Discovery there are 3 separate
  1146. *                                    fucnction's
  1147. * Inputs: base and lengthof pci0 devises012
  1148. *********************************************************************/
  1149. void pci0MapDevices0_1and2MemorySpace(unsigned int pci0Dev012Base,
  1150.       unsigned int pci0Dev012Length)
  1151. {
  1152. pci0Dev012Base = pci0Dev012Base & 0xfffff000;
  1153. pci0Dev012Base =
  1154.     pci0Dev012Base |
  1155.     (pci0ReadConfigReg(PCI_0CS_2_0_BASE_ADDRESS, SELF) &
  1156.      0x00000fff);
  1157. pci0WriteConfigReg(PCI_0CS_2_0_BASE_ADDRESS, SELF, pci0Dev012Base);
  1158. if (pci0Dev012Length == 0)
  1159. pci0Dev012Length++;
  1160. GT_REG_WRITE(PCI_0CS_2_0_BANK_SIZE, pci0Dev012Length - 1);
  1161. }
  1162. /********************************************************************
  1163. * pci1MapDevices0_1and2MemorySpace - Maps PCI1 devices 0,1 and 2 memory spaces
  1164. *                                    for the slave.
  1165. *                                    For the Discovery there are 3 separate
  1166. *                                    fucnction's
  1167. * Inputs: base and lengthof pci1 devises012
  1168. *********************************************************************/
  1169. void pci1MapDevices0_1and2MemorySpace(unsigned int pci1Dev012Base,
  1170.       unsigned int pci1Dev012Length)
  1171. {
  1172. pci1Dev012Base = pci1Dev012Base & 0xfffff000;
  1173. pci1Dev012Base =
  1174.     pci1Dev012Base |
  1175.     (pci1ReadConfigReg(PCI_0CS_2_0_BASE_ADDRESS, SELF) &
  1176.      0x00000fff);
  1177. pci1WriteConfigReg(PCI_0CS_2_0_BASE_ADDRESS, SELF, pci1Dev012Base);
  1178. if (pci1Dev012Length == 0)
  1179. pci1Dev012Length++;
  1180. GT_REG_WRITE(PCI_1CS_2_0_BANK_SIZE, pci1Dev012Length - 1);
  1181. }
  1182. /********************************************************************
  1183. * pci0MapDevices3andBootMemorySpace - Maps PCI0 devices 3 and boot memory
  1184. *                                     spaces for the slave.
  1185. *                                     For the Discovery there are 2 separate
  1186. *                                     fucnction's
  1187. * Inputs: base and length of pci0 device3/ boot
  1188. *********************************************************************/
  1189. void pci0MapDevices3andBootMemorySpace(unsigned int pci0Dev3andBootBase,
  1190.        unsigned int pci0Dev3andBootLength)
  1191. {
  1192. pci0Dev3andBootBase = pci0Dev3andBootBase & 0xfffff000;
  1193. pci0Dev3andBootBase =
  1194.     pci0Dev3andBootBase |
  1195.     (pci0ReadConfigReg(PCI_0CS_3_BOOTCS_BASE_ADDRESS, SELF) &
  1196.      0x00000fff);
  1197. pci0WriteConfigReg(PCI_0CS_3_BOOTCS_BASE_ADDRESS, SELF,
  1198.    pci0Dev3andBootBase);
  1199. /* swapped Bar */
  1200. pci0WriteConfigReg(PCI_0SWAPPED_CS_3_BOOTCS_BASE_ADDRESS, SELF,
  1201.    pci0Dev3andBootBase);
  1202. if (pci0Dev3andBootLength == 0)
  1203. pci0Dev3andBootLength++;
  1204. GT_REG_WRITE(PCI_0CS_3_BOOTCS_BANK_SIZE,
  1205.      pci0Dev3andBootLength - 1);
  1206. }
  1207. /********************************************************************
  1208. * pci1MapDevices3andBootMemorySpace - Maps PCI1 devices 3 and boot memory
  1209. *                                     spaces for the slave.
  1210. *                                     For the Discovery there are 2 separate
  1211. *                                     fucnction's
  1212. * Inputs: base and length of pci1 device3/ boot
  1213. *********************************************************************/
  1214. void pci1MapDevices3andBootMemorySpace(unsigned int pci1Dev3andBootBase,
  1215.        unsigned int pci1Dev3andBootLength)
  1216. {
  1217. pci1Dev3andBootBase = pci1Dev3andBootBase & 0xfffff000;
  1218. pci1Dev3andBootBase =
  1219.     pci1Dev3andBootBase |
  1220.     (pci1ReadConfigReg(PCI_0CS_3_BOOTCS_BASE_ADDRESS, SELF) &
  1221.      0x00000fff);
  1222. pci1WriteConfigReg(PCI_0CS_3_BOOTCS_BASE_ADDRESS, SELF,
  1223.    pci1Dev3andBootBase);
  1224. /* swapped Bar */
  1225. pci1WriteConfigReg(PCI_0SWAPPED_CS_3_BOOTCS_BASE_ADDRESS, SELF,
  1226.    pci1Dev3andBootBase);
  1227. if (pci1Dev3andBootLength == 0)
  1228. pci1Dev3andBootLength++;
  1229. GT_REG_WRITE(PCI_1CS_3_BOOTCS_BANK_SIZE,
  1230.      pci1Dev3andBootLength - 1);
  1231. }