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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (C) 2001 Broadcom Corporation
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. /*
  19.  * BCM1250-specific PCI support
  20.  *
  21.  * This module provides the glue between Linux's PCI subsystem
  22.  * and the hardware.  We basically provide glue for accessing
  23.  * configuration space, and set up the translation for I/O
  24.  * space accesses.
  25.  *
  26.  * To access configuration space, we call some assembly-level
  27.  * stubs that flip the KX bit on and off in the status
  28.  * register, and do XKSEG addressed memory accesses there.
  29.  * It's slow (7 SSNOPs to guarantee that KX is set!) but
  30.  * fortunately, config space accesses are rare.
  31.  *
  32.  * We could use the ioremap functionality for the confguration
  33.  * space as well as I/O space, but I'm not sure of the
  34.  * implications of setting aside 16MB of KSEG2 for something
  35.  * that is used so rarely (how much space in the page tables?)
  36.  *
  37.  */
  38. #include <linux/types.h>
  39. #include <linux/pci.h>
  40. #include <linux/kernel.h>
  41. #include <linux/init.h>
  42. #include <linux/mm.h>
  43. #include <linux/console.h>
  44. #include <asm/sibyte/sb1250_defs.h>
  45. #include <asm/sibyte/sb1250_regs.h>
  46. #include <asm/sibyte/sb1250_scd.h>
  47. #include <asm/io.h>
  48. #include "lib_hssubr.h"
  49. /*
  50.  * This macro calculates the offset into config space where
  51.  * a given bus, device/function, and offset live on the sb1250
  52.  */
  53. #define CFGOFFSET(bus,devfn,where) (((bus)<<16)+((devfn)<<8)+(where))
  54. /*
  55.  * Using the above offset, this macro calcuates the physical address in the
  56.  * config space.
  57.  */
  58. #define CFGADDR(dev,where) (A_PHYS_LDTPCI_CFG_MATCH_BITS + 
  59.     CFGOFFSET(dev->bus->number,dev->devfn,where))
  60. /*
  61.  * Read/write 32-bit values in config space.
  62.  */
  63. static inline u32 READCFG32(u32 addr)
  64. {
  65. hs_read32(addr & ~3);
  66. }
  67. static inline void WRITECFG32(u32 addr, u32 data)
  68. {
  69. return hs_write32(addr & ~3,(data));
  70. }
  71. /*
  72.  * This variable is the KSEG2 (kernel virtual) mapping of the ISA/PCI I/O
  73.  * space area.  We map 64K here and the offsets from this address get treated
  74.  * with "match bytes" policy to make everything look little-endian.  So, you
  75.  * need to also set CONFIG_SWAP_IO_SPACE, but this is the combination that
  76.  * works correctly with most of Linux's drivers.
  77.  */
  78. #define PCI_BUS_ENABLED 1
  79. #define LDT_BUS_ENABLED 2
  80. static int sb1250_bus_status = 0;
  81. #define MATCH_BITS 0x20000000 /* really belongs in an include file */
  82. #define LDT_BRIDGE_START ((A_PCI_TYPE01_HEADER|MATCH_BITS)+0x00)
  83. #define LDT_BRIDGE_END   ((A_PCI_TYPE01_HEADER|MATCH_BITS)+0x20)
  84. /*
  85.  * Read/write access functions for various sizes of values
  86.  * in config space.
  87.  */
  88. static int
  89. sb1250_pci_read_config_byte(struct pci_dev *dev, int where, u8 * val)
  90. {
  91. u32 data = 0;
  92. u32 cfgaddr = CFGADDR(dev, where);
  93. data = READCFG32(cfgaddr);
  94. /*
  95.  * If the LDT was not configured, make it look like the bridge
  96.  * header is not there.
  97.  */
  98. if (!(sb1250_bus_status & LDT_BUS_ENABLED) &&
  99.     (cfgaddr >= LDT_BRIDGE_START) && (cfgaddr < LDT_BRIDGE_END)) {
  100. data = 0xFFFFFFFF;
  101. }
  102. *val = (data >> ((where & 3) << 3)) & 0xff;
  103. return PCIBIOS_SUCCESSFUL;
  104. }
  105. static int
  106. sb1250_pci_read_config_word(struct pci_dev *dev, int where, u16 * val)
  107. {
  108. u32 data = 0;
  109. u32 cfgaddr = CFGADDR(dev, where);
  110. if (where & 1)
  111. return PCIBIOS_BAD_REGISTER_NUMBER;
  112. data = READCFG32(cfgaddr);
  113. /*
  114.  * If the LDT was not configured, make it look like the bridge
  115.  * header is not there.
  116.  */
  117. if (!(sb1250_bus_status & LDT_BUS_ENABLED) &&
  118.     (cfgaddr >= LDT_BRIDGE_START) && (cfgaddr < LDT_BRIDGE_END)) {
  119. data = 0xFFFFFFFF;
  120. }
  121. *val = (data >> ((where & 3) << 3)) & 0xffff;
  122. return PCIBIOS_SUCCESSFUL;
  123. }
  124. static int
  125. sb1250_pci_read_config_dword(struct pci_dev *dev, int where, u32 * val)
  126. {
  127. u32 data = 0;
  128. u32 cfgaddr = CFGADDR(dev, where);
  129. if (where & 3)
  130. return PCIBIOS_BAD_REGISTER_NUMBER;
  131. data = READCFG32(cfgaddr);
  132. /*
  133.  * If the LDT was not configured, make it look like the bridge
  134.  * header is not there.
  135.  */
  136. if (!(sb1250_bus_status & LDT_BUS_ENABLED) &&
  137.     (cfgaddr >= LDT_BRIDGE_START) && (cfgaddr < LDT_BRIDGE_END)) {
  138. data = 0xFFFFFFFF;
  139. }
  140. *val = data;
  141. return PCIBIOS_SUCCESSFUL;
  142. }
  143. static int
  144. sb1250_pci_write_config_byte(struct pci_dev *dev, int where, u8 val)
  145. {
  146. u32 data = 0;
  147. u32 cfgaddr = CFGADDR(dev, where);
  148. data = READCFG32(cfgaddr);
  149. data = (data & ~(0xff << ((where & 3) << 3))) |
  150.     (val << ((where & 3) << 3));
  151. WRITECFG32(cfgaddr, data);
  152. return PCIBIOS_SUCCESSFUL;
  153. }
  154. static int
  155. sb1250_pci_write_config_word(struct pci_dev *dev, int where, u16 val)
  156. {
  157. u32 data = 0;
  158. u32 cfgaddr = CFGADDR(dev, where);
  159. if (where & 1)
  160. return PCIBIOS_BAD_REGISTER_NUMBER;
  161. data = READCFG32(cfgaddr);
  162. data = (data & ~(0xffff << ((where & 3) << 3))) |
  163.     (val << ((where & 3) << 3));
  164. WRITECFG32(cfgaddr, data);
  165. return PCIBIOS_SUCCESSFUL;
  166. }
  167. static int
  168. sb1250_pci_write_config_dword(struct pci_dev *dev, int where, u32 val)
  169. {
  170. u32 cfgaddr = CFGADDR(dev, where);
  171. if (where & 3)
  172. return PCIBIOS_BAD_REGISTER_NUMBER;
  173. WRITECFG32(cfgaddr, val);
  174. return PCIBIOS_SUCCESSFUL;
  175. }
  176. struct pci_ops sb1250_pci_ops = {
  177. sb1250_pci_read_config_byte,
  178. sb1250_pci_read_config_word,
  179. sb1250_pci_read_config_dword,
  180. sb1250_pci_write_config_byte,
  181. sb1250_pci_write_config_word,
  182. sb1250_pci_write_config_dword
  183. };
  184. void __init pcibios_init(void)
  185. {
  186. uint32_t cmdreg;
  187. uint64_t reg;
  188. /*
  189.  * See if the PCI bus has been configured by the firmware.
  190.  */
  191. cmdreg = READCFG32((A_PCI_TYPE00_HEADER | MATCH_BITS) +
  192.    PCI_COMMAND);
  193. if (!(cmdreg & PCI_COMMAND_MASTER)) {
  194. printk
  195.     ("PCI: Skipping PCI probe.  Bus is not initialized.n");
  196. return;
  197. }
  198. reg = *((volatile uint64_t *) KSEG1ADDR(A_SCD_SYSTEM_CFG));
  199. if (!(reg & M_SYS_PCI_HOST)) {
  200. printk("PCI: Skipping PCI probe.  Processor is in PCI device mode.n");
  201. return;
  202. }
  203. sb1250_bus_status |= PCI_BUS_ENABLED;
  204. /*
  205.  * Establish a mapping from KSEG2 (kernel virtual) to PCI I/O space
  206.  * Use "match bytes", even though this exposes endianness.
  207.  * big-endian Linuxes will have CONFIG_SWAP_IO_SPACE set.
  208.  */
  209. set_io_port_base(ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES, 65536));
  210. isa_slot_offset = (unsigned long)
  211. ioremap(A_PHYS_LDTPCI_IO_MATCH_BYTES_32, 1024*1024);
  212. /*
  213.  * Also check the LDT bridge's enable, just in case we didn't
  214.  * initialize that one.
  215.  */
  216. cmdreg = READCFG32((A_PCI_TYPE01_HEADER | MATCH_BITS) +
  217.    PCI_COMMAND);
  218. if (cmdreg & PCI_COMMAND_MASTER) {
  219. sb1250_bus_status |= LDT_BUS_ENABLED;
  220. }
  221. /* Probe for PCI hardware */
  222. printk("PCI: Probing PCI hardware on host bus 0.n");
  223. pci_scan_bus(0, &sb1250_pci_ops, NULL);
  224. #ifdef CONFIG_VGA_CONSOLE
  225. take_over_console(&vga_con,0,MAX_NR_CONSOLES-1,1);
  226. #endif
  227. }
  228. int pcibios_enable_device(struct pci_dev *dev)
  229. {
  230. /* Not needed, since we enable all devices at startup.  */
  231. return 0;
  232. }
  233. void pcibios_align_resource(void *data, struct resource *res,
  234.        unsigned long size, unsigned long align)
  235. {
  236. }
  237. char *__init pcibios_setup(char *str)
  238. {
  239. /* Nothing to do for now.  */
  240. return str;
  241. }
  242. struct pci_fixup pcibios_fixups[] = {
  243. {0}
  244. };
  245. void pcibios_update_resource(struct pci_dev *dev, struct resource *root,
  246. struct resource *res, int resource)
  247. {
  248. unsigned long where, size;
  249. u32 reg;
  250. where = PCI_BASE_ADDRESS_0 + (resource * 4);
  251. size = res->end - res->start;
  252. pci_read_config_dword(dev, where, &reg);
  253. reg = (reg & size) | (((u32) (res->start - root->start)) & ~size);
  254. pci_write_config_dword(dev, where, reg);
  255. }
  256. /*
  257.  *  Called after each bus is probed, but before its children
  258.  *  are examined.
  259.  */
  260. void __devinit pcibios_fixup_bus(struct pci_bus *b)
  261. {
  262. pci_read_bridge_bases(b);
  263. }
  264. unsigned int pcibios_assign_all_busses(void)
  265. {
  266. return 1;
  267. }