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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright 2002 Momentum Computer
  3.  * Author: Matthew Dharm <mdharm@momenco.com>
  4.  *
  5.  *  This program is free software; you can redistribute  it and/or modify it
  6.  *  under  the terms of  the GNU General  Public License as published by the
  7.  *  Free Software Foundation;  either version 2 of the  License, or (at your
  8.  *  option) any later version.
  9.  *
  10.  *  THIS  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
  11.  *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
  12.  *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
  13.  *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
  14.  *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  15.  *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
  16.  *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  17.  *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
  18.  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  19.  *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  20.  *
  21.  *  You should have received a copy of the  GNU General Public License along
  22.  *  with this program; if not, write  to the Free Software Foundation, Inc.,
  23.  *  675 Mass Ave, Cambridge, MA 02139, USA.
  24.  */
  25. #include <linux/config.h>
  26. #include <linux/types.h>
  27. #include <linux/pci.h>
  28. #include <linux/kernel.h>
  29. #include <linux/slab.h>
  30. #include <linux/version.h>
  31. #include <asm/pci.h>
  32. #include <asm/io.h>
  33. #include "gt64240.h"
  34. #include <linux/init.h>
  35. #ifdef CONFIG_PCI
  36. #define SELF 0
  37. #define MASTER_ABORT_BIT 0x100
  38. /*
  39.  * These functions and structures provide the BIOS scan and mapping of the PCI
  40.  * devices.
  41.  */
  42. #define MAX_PCI_DEVS 10
  43. void gt64240_board_pcibios_fixup_bus(struct pci_bus* c);
  44. /*  Functions to implement "pci ops"  */
  45. static int galileo_pcibios_read_config_word(struct pci_dev *dev,
  46.     int offset, u16 * val);
  47. static int galileo_pcibios_read_config_byte(struct pci_dev *dev,
  48.     int offset, u8 * val);
  49. static int galileo_pcibios_read_config_dword(struct pci_dev *dev,
  50.      int offset, u32 * val);
  51. static int galileo_pcibios_write_config_byte(struct pci_dev *dev,
  52.      int offset, u8 val);
  53. static int galileo_pcibios_write_config_word(struct pci_dev *dev,
  54.      int offset, u16 val);
  55. static int galileo_pcibios_write_config_dword(struct pci_dev *dev,
  56.       int offset, u32 val);
  57. static void galileo_pcibios_set_master(struct pci_dev *dev);
  58. /*
  59.  *  General-purpose PCI functions.
  60.  */
  61. /*
  62.  * pci_range_ck -
  63.  *
  64.  * Check if the pci device that are trying to access does really exists
  65.  * on the evaluation board.
  66.  *
  67.  * Inputs :
  68.  * bus - bus number (0 for PCI 0 ; 1 for PCI 1)
  69.  * dev - number of device on the specific pci bus
  70.  *
  71.  * Outpus :
  72.  * 0 - if OK , 1 - if failure
  73.  */
  74. static __inline__ int pci_range_ck(unsigned char bus, unsigned char dev)
  75. {
  76. /* Accessing device 31 crashes the GT-64240. */
  77. if (dev < 5)
  78. return 0;
  79. return -1;
  80. }
  81. /*
  82.  * galileo_pcibios_(read/write)_config_(dword/word/byte) -
  83.  *
  84.  * reads/write a dword/word/byte register from the configuration space
  85.  * of a device.
  86.  *
  87.  * Note that bus 0 and bus 1 are local, and we assume all other busses are
  88.  * bridged from bus 1.  This is a safe assumption, since any other
  89.  * configuration will require major modifications to the CP7000G
  90.  *
  91.  * Inputs :
  92.  * bus - bus number
  93.  * dev - device number
  94.  * offset - register offset in the configuration space
  95.  * val - value to be written / read
  96.  *
  97.  * Outputs :
  98.  * PCIBIOS_SUCCESSFUL when operation was succesfull
  99.  * PCIBIOS_DEVICE_NOT_FOUND when the bus or dev is errorneous
  100.  * PCIBIOS_BAD_REGISTER_NUMBER when accessing non aligned
  101.  */
  102. static int galileo_pcibios_read_config_dword(struct pci_dev *device,
  103.       int offset, u32* val)
  104. {
  105. int dev, bus, func;
  106. uint32_t address_reg, data_reg;
  107. uint32_t address;
  108. bus = device->bus->number;
  109. dev = PCI_SLOT(device->devfn);
  110. func = PCI_FUNC(device->devfn);
  111. /* verify the range */
  112. if (pci_range_ck(bus, dev))
  113. return PCIBIOS_DEVICE_NOT_FOUND;
  114. /* select the GT-64240 registers to communicate with the PCI bus */
  115. if (bus == 0) {
  116. address_reg = PCI_0CONFIGURATION_ADDRESS;
  117. data_reg = PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER;
  118. GT_WRITE(PCI_0ERROR_CAUSE, ~MASTER_ABORT_BIT);
  119. } else {
  120. address_reg = PCI_1CONFIGURATION_ADDRESS;
  121. data_reg = PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER;
  122. GT_WRITE(PCI_1ERROR_CAUSE, ~MASTER_ABORT_BIT);
  123. if (bus == 1)
  124. bus = 0;
  125. }
  126. address = (bus << 16) | (dev << 11) | (func << 8) |
  127. (offset & 0xfc) | 0x80000000;
  128. /* start the configuration cycle */
  129. GT_WRITE(address_reg, address);
  130. /* read the data */
  131. GT_READ(data_reg, val);
  132. return PCIBIOS_SUCCESSFUL;
  133. }
  134. static int galileo_pcibios_read_config_word(struct pci_dev *device,
  135.      int offset, u16* val)
  136. {
  137. int dev, bus, func;
  138. uint32_t address_reg, data_reg;
  139. uint32_t address;
  140. bus = device->bus->number;
  141. dev = PCI_SLOT(device->devfn);
  142. func = PCI_FUNC(device->devfn);
  143. /* verify the range */
  144. if (pci_range_ck(bus, dev))
  145. return PCIBIOS_DEVICE_NOT_FOUND;
  146. /* select the GT-64240 registers to communicate with the PCI bus */
  147. if (bus == 0) {
  148. address_reg = PCI_0CONFIGURATION_ADDRESS;
  149. data_reg = PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER;
  150. GT_WRITE(PCI_0ERROR_CAUSE, ~MASTER_ABORT_BIT);
  151. } else {
  152. address_reg = PCI_1CONFIGURATION_ADDRESS;
  153. data_reg = PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER;
  154. GT_WRITE(PCI_1ERROR_CAUSE, ~MASTER_ABORT_BIT);
  155. if (bus == 1)
  156. bus = 0;
  157. }
  158. address = (bus << 16) | (dev << 11) | (func << 8) |
  159. (offset & 0xfc) | 0x80000000;
  160. /* start the configuration cycle */
  161. GT_WRITE(address_reg, address);
  162. /* read the data */
  163. GT_READ_16(data_reg + (offset & 0x3), val);
  164. return PCIBIOS_SUCCESSFUL;
  165. }
  166. static int galileo_pcibios_read_config_byte(struct pci_dev *device,
  167.      int offset, u8* val)
  168. {
  169. int dev, bus, func;
  170. uint32_t address_reg, data_reg;
  171. uint32_t address;
  172. bus = device->bus->number;
  173. dev = PCI_SLOT(device->devfn);
  174. func = PCI_FUNC(device->devfn);
  175. /* verify the range */
  176. if (pci_range_ck(bus, dev))
  177. return PCIBIOS_DEVICE_NOT_FOUND;
  178. /* select the GT-64240 registers to communicate with the PCI bus */
  179. if (bus == 0) {
  180. address_reg = PCI_0CONFIGURATION_ADDRESS;
  181. data_reg = PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER;
  182. } else {
  183. address_reg = PCI_1CONFIGURATION_ADDRESS;
  184. data_reg = PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER;
  185. if (bus == 1)
  186. bus = 0;
  187. }
  188. address = (bus << 16) | (dev << 11) | (func << 8) |
  189. (offset & 0xfc) | 0x80000000;
  190. /* start the configuration cycle */
  191. GT_WRITE(address_reg, address);
  192. /* write the data */
  193. GT_READ_8(data_reg + (offset & 0x3), val);
  194. return PCIBIOS_SUCCESSFUL;
  195. }
  196. static int galileo_pcibios_write_config_dword(struct pci_dev *device,
  197.       int offset, u32 val)
  198. {
  199. int dev, bus, func;
  200. uint32_t address_reg, data_reg;
  201. uint32_t address;
  202. bus = device->bus->number;
  203. dev = PCI_SLOT(device->devfn);
  204. func = PCI_FUNC(device->devfn);
  205. /* verify the range */
  206. if (pci_range_ck(bus, dev))
  207. return PCIBIOS_DEVICE_NOT_FOUND;
  208. /* select the GT-64240 registers to communicate with the PCI bus */
  209. if (bus == 0) {
  210. address_reg = PCI_0CONFIGURATION_ADDRESS;
  211. data_reg = PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER;
  212. } else {
  213. address_reg = PCI_1CONFIGURATION_ADDRESS;
  214. data_reg = PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER;
  215. if (bus == 1)
  216. bus = 0;
  217. }
  218. address = (bus << 16) | (dev << 11) | (func << 8) |
  219. (offset & 0xfc) | 0x80000000;
  220. /* start the configuration cycle */
  221. GT_WRITE(address_reg, address);
  222. /* write the data */
  223. GT_WRITE(data_reg, val);
  224. return PCIBIOS_SUCCESSFUL;
  225. }
  226. static int galileo_pcibios_write_config_word(struct pci_dev *device,
  227.      int offset, u16 val)
  228. {
  229. int dev, bus, func;
  230. uint32_t address_reg, data_reg;
  231. uint32_t address;
  232. bus = device->bus->number;
  233. dev = PCI_SLOT(device->devfn);
  234. func = PCI_FUNC(device->devfn);
  235. /* verify the range */
  236. if (pci_range_ck(bus, dev))
  237. return PCIBIOS_DEVICE_NOT_FOUND;
  238. /* select the GT-64240 registers to communicate with the PCI bus */
  239. if (bus == 0) {
  240. address_reg = PCI_0CONFIGURATION_ADDRESS;
  241. data_reg = PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER;
  242. } else {
  243. address_reg = PCI_1CONFIGURATION_ADDRESS;
  244. data_reg = PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER;
  245. if (bus == 1)
  246. bus = 0;
  247. }
  248. address = (bus << 16) | (dev << 11) | (func << 8) |
  249. (offset & 0xfc) | 0x80000000;
  250. /* start the configuration cycle */
  251. GT_WRITE(address_reg, address);
  252. /* write the data */
  253. GT_WRITE_16(data_reg + (offset & 0x3), val);
  254. return PCIBIOS_SUCCESSFUL;
  255. }
  256. static int galileo_pcibios_write_config_byte(struct pci_dev *device,
  257.      int offset, u8 val)
  258. {
  259. int dev, bus, func;
  260. uint32_t address_reg, data_reg;
  261. uint32_t address;
  262. bus = device->bus->number;
  263. dev = PCI_SLOT(device->devfn);
  264. func = PCI_FUNC(device->devfn);
  265. /* verify the range */
  266. if (pci_range_ck(bus, dev))
  267. return PCIBIOS_DEVICE_NOT_FOUND;
  268. /* select the GT-64240 registers to communicate with the PCI bus */
  269. if (bus == 0) {
  270. address_reg = PCI_0CONFIGURATION_ADDRESS;
  271. data_reg = PCI_0CONFIGURATION_DATA_VIRTUAL_REGISTER;
  272. } else {
  273. address_reg = PCI_1CONFIGURATION_ADDRESS;
  274. data_reg = PCI_1CONFIGURATION_DATA_VIRTUAL_REGISTER;
  275. if (bus == 1)
  276. bus = 0;
  277. }
  278. address = (bus << 16) | (dev << 11) | (func << 8) |
  279. (offset & 0xfc) | 0x80000000;
  280. /* start the configuration cycle */
  281. GT_WRITE(address_reg, address);
  282. /* write the data */
  283. GT_WRITE_8(data_reg + (offset & 0x3), val);
  284. return PCIBIOS_SUCCESSFUL;
  285. }
  286. static void galileo_pcibios_set_master(struct pci_dev *dev)
  287. {
  288. u16 cmd;
  289. galileo_pcibios_read_config_word(dev, PCI_COMMAND, &cmd);
  290. cmd |= PCI_COMMAND_MASTER;
  291. galileo_pcibios_write_config_word(dev, PCI_COMMAND, cmd);
  292. }
  293. /*  Externally-expected functions.  Do not change function names  */
  294. int pcibios_enable_resources(struct pci_dev *dev)
  295. {
  296. u16 cmd, old_cmd;
  297. u8 tmp1;
  298. int idx;
  299. struct resource *r;
  300. galileo_pcibios_read_config_word(dev, PCI_COMMAND, &cmd);
  301. old_cmd = cmd;
  302. for (idx = 0; idx < 6; idx++) {
  303. r = &dev->resource[idx];
  304. if (!r->start && r->end) {
  305. printk(KERN_ERR
  306.        "PCI: Device %s not available because of "
  307.        "resource collisionsn", dev->slot_name);
  308. return -EINVAL;
  309. }
  310. if (r->flags & IORESOURCE_IO)
  311. cmd |= PCI_COMMAND_IO;
  312. if (r->flags & IORESOURCE_MEM)
  313. cmd |= PCI_COMMAND_MEMORY;
  314. }
  315. if (cmd != old_cmd) {
  316. galileo_pcibios_write_config_word(dev, PCI_COMMAND, cmd);
  317. }
  318. /*
  319.  * Let's fix up the latency timer and cache line size here.  Cache
  320.  * line size = 32 bytes / sizeof dword (4) = 8.
  321.  * Latency timer must be > 8.  32 is random but appears to work.
  322.  */
  323. galileo_pcibios_read_config_byte(dev, PCI_CACHE_LINE_SIZE, &tmp1);
  324. if (tmp1 != 8) {
  325. printk(KERN_WARNING "PCI setting cache line size to 8 from "
  326.        "%dn", tmp1);
  327. galileo_pcibios_write_config_byte(dev, PCI_CACHE_LINE_SIZE,
  328.   8);
  329. }
  330. galileo_pcibios_read_config_byte(dev, PCI_LATENCY_TIMER, &tmp1);
  331. if (tmp1 < 32) {
  332. printk(KERN_WARNING "PCI setting latency timer to 32 from %dn",
  333.        tmp1);
  334. galileo_pcibios_write_config_byte(dev, PCI_LATENCY_TIMER,
  335.   32);
  336. }
  337. return 0;
  338. }
  339. int pcibios_enable_device(struct pci_dev *dev)
  340. {
  341. return pcibios_enable_resources(dev);
  342. }
  343. void pcibios_update_resource(struct pci_dev *dev, struct resource *root,
  344.      struct resource *res, int resource)
  345. {
  346. u32 new, check;
  347. int reg;
  348. return;
  349. #if 0
  350. new = res->start | (res->flags & PCI_REGION_FLAG_MASK);
  351. if (resource < 6) {
  352. reg = PCI_BASE_ADDRESS_0 + 4 * resource;
  353. } else if (resource == PCI_ROM_RESOURCE) {
  354. res->flags |= PCI_ROM_ADDRESS_ENABLE;
  355. reg = dev->rom_base_reg;
  356. } else {
  357. /*
  358.  * Somebody might have asked allocation of a non-standard
  359.  * resource
  360.  */
  361. return;
  362. }
  363. pci_write_config_dword(dev, reg, new);
  364. pci_read_config_dword(dev, reg, &check);
  365. if ((new ^ check) &
  366.     ((new & PCI_BASE_ADDRESS_SPACE_IO) ? PCI_BASE_ADDRESS_IO_MASK :
  367.      PCI_BASE_ADDRESS_MEM_MASK)) {
  368. printk(KERN_ERR "PCI: Error while updating region "
  369.        "%s/%d (%08x != %08x)n", dev->slot_name, resource,
  370.        new, check);
  371. }
  372. #endif
  373. }
  374. void pcibios_align_resource(void *data, struct resource *res,
  375.     unsigned long size, unsigned long align)
  376. {
  377. struct pci_dev *dev = data;
  378. if (res->flags & IORESOURCE_IO) {
  379. unsigned long start = res->start;
  380. /* We need to avoid collisions with `mirrored' VGA ports
  381.    and other strange ISA hardware, so we always want the
  382.    addresses kilobyte aligned.  */
  383. if (size > 0x100) {
  384. printk(KERN_ERR "PCI: I/O Region %s/%d too large"
  385.        " (%ld bytes)n", dev->slot_name,
  386.         dev->resource - res, size);
  387. }
  388. start = (start + 1024 - 1) & ~(1024 - 1);
  389. res->start = start;
  390. }
  391. }
  392. struct pci_ops galileo_pci_ops = {
  393. galileo_pcibios_read_config_byte,
  394. galileo_pcibios_read_config_word,
  395. galileo_pcibios_read_config_dword,
  396. galileo_pcibios_write_config_byte,
  397. galileo_pcibios_write_config_word,
  398. galileo_pcibios_write_config_dword
  399. };
  400. struct pci_fixup pcibios_fixups[] = {
  401. {0}
  402. };
  403. void __init pcibios_fixup_bus(struct pci_bus *c)
  404. {
  405. gt64240_board_pcibios_fixup_bus(c);
  406. }
  407. /********************************************************************
  408. * pci0P2PConfig - This function set the PCI_0 P2P configurate.
  409. *                 For more information on the P2P read PCI spec.
  410. *
  411. * Inputs:  unsigned int SecondBusLow - Secondery PCI interface Bus Range Lower
  412. *                                      Boundry.
  413. *          unsigned int SecondBusHigh - Secondry PCI interface Bus Range upper
  414. *                                      Boundry.
  415. *          unsigned int busNum - The CPI bus number to which the PCI interface
  416. *                                      is connected.
  417. *          unsigned int devNum - The PCI interface's device number.
  418. *
  419. * Returns:  true.
  420. */
  421. void pci0P2PConfig(unsigned int SecondBusLow,unsigned int SecondBusHigh,
  422.                    unsigned int busNum,unsigned int devNum)
  423. {
  424. uint32_t regData;
  425. regData = (SecondBusLow & 0xff) | ((SecondBusHigh & 0xff) << 8) |
  426. ((busNum & 0xff) << 16) | ((devNum & 0x1f) << 24);
  427. GT_WRITE(PCI_0P2P_CONFIGURATION, regData);
  428. }
  429. /********************************************************************
  430. * pci1P2PConfig - This function set the PCI_1 P2P configurate.
  431. *                 For more information on the P2P read PCI spec.
  432. *
  433. * Inputs:  unsigned int SecondBusLow - Secondery PCI interface Bus Range Lower
  434. *               Boundry.
  435. *          unsigned int SecondBusHigh - Secondry PCI interface Bus Range upper
  436. *               Boundry.
  437. *          unsigned int busNum - The CPI bus number to which the PCI interface
  438. *               is connected.
  439. *          unsigned int devNum - The PCI interface's device number.
  440. *
  441. * Returns:  true.
  442. */
  443. void pci1P2PConfig(unsigned int SecondBusLow,unsigned int SecondBusHigh,
  444.                    unsigned int busNum,unsigned int devNum)
  445. {
  446. uint32_t regData;
  447. regData = (SecondBusLow & 0xff) | ((SecondBusHigh & 0xff) << 8) |
  448. ((busNum & 0xff) << 16) | ((devNum & 0x1f) << 24);
  449. GT_WRITE(PCI_1P2P_CONFIGURATION, regData);
  450. }
  451. #define PCI0_STATUS_COMMAND_REG                 0x4
  452. #define PCI1_STATUS_COMMAND_REG                 0x84
  453. void __init pcibios_init(void)
  454. {
  455. /* Reset PCI I/O and PCI MEM values */
  456. ioport_resource.start = 0xe0000000;
  457. ioport_resource.end   = 0xe0000000 + 0x20000000 - 1;
  458. iomem_resource.start  = 0xc0000000;
  459. iomem_resource.end    = 0xc0000000 + 0x20000000 - 1;
  460. pci_scan_bus(0, &galileo_pci_ops, NULL);
  461. pci_scan_bus(1, &galileo_pci_ops, NULL);
  462. }
  463. /*
  464.  * for parsing "pci=" kernel boot arguments.
  465.  */
  466. char *pcibios_setup(char *str)
  467. {
  468.         printk(KERN_INFO "rr: pcibios_setupn");
  469.         /* Nothing to do for now.  */
  470.         return str;
  471. }
  472. unsigned __init int pcibios_assign_all_busses(void)
  473. {
  474. return 1;
  475. }
  476. #endif /* CONFIG_PCI */