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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/arch/alpha/kernel/core_t2.c
  3.  *
  4.  * Written by Jay A Estabrook (jestabro@amt.tay1.dec.com).
  5.  * December 1996.
  6.  *
  7.  * based on CIA code by David A Rusling (david.rusling@reo.mts.dec.com)
  8.  *
  9.  * Code common to all T2 core logic chips.
  10.  */
  11. #include <linux/kernel.h>
  12. #include <linux/types.h>
  13. #include <linux/pci.h>
  14. #include <linux/sched.h>
  15. #include <linux/init.h>
  16. #include <asm/ptrace.h>
  17. #include <asm/system.h>
  18. #define __EXTERN_INLINE
  19. #include <asm/io.h>
  20. #include <asm/core_t2.h>
  21. #undef __EXTERN_INLINE
  22. #include "proto.h"
  23. #include "pci_impl.h"
  24. /*
  25.  * NOTE: Herein lie back-to-back mb instructions.  They are magic. 
  26.  * One plausible explanation is that the i/o controller does not properly
  27.  * handle the system transaction.  Another involves timing.  Ho hum.
  28.  */
  29. /*
  30.  * BIOS32-style PCI interface:
  31.  */
  32. #define DEBUG_CONFIG 0
  33. #if DEBUG_CONFIG
  34. # define DBG(args) printk args
  35. #else
  36. # define DBG(args)
  37. #endif
  38. /*
  39.  * Given a bus, device, and function number, compute resulting
  40.  * configuration space address and setup the T2_HAXR2 register
  41.  * accordingly.  It is therefore not safe to have concurrent
  42.  * invocations to configuration space access routines, but there
  43.  * really shouldn't be any need for this.
  44.  *
  45.  * Type 0:
  46.  *
  47.  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
  48.  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
  49.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  50.  * | | |D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|0|
  51.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  52.  *
  53.  * 31:11 Device select bit.
  54.  *  10:8 Function number
  55.  *   7:2 Register number
  56.  *
  57.  * Type 1:
  58.  *
  59.  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
  60.  *  3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
  61.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  62.  * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
  63.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  64.  *
  65.  * 31:24 reserved
  66.  * 23:16 bus number (8 bits = 128 possible buses)
  67.  * 15:11 Device number (5 bits)
  68.  * 10:8 function number
  69.  *  7:2 register number
  70.  *  
  71.  * Notes:
  72.  * The function number selects which function of a multi-function device 
  73.  * (e.g., SCSI and Ethernet).
  74.  * 
  75.  * The register selects a DWORD (32 bit) register offset.  Hence it
  76.  * doesn't get shifted by 2 bits as we want to "drop" the bottom two
  77.  * bits.
  78.  */
  79. static int
  80. mk_conf_addr(struct pci_dev *dev, int where, unsigned long *pci_addr,
  81.      unsigned char *type1)
  82. {
  83. unsigned long addr;
  84. u8 bus = dev->bus->number;
  85. u8 device_fn = dev->devfn;
  86. DBG(("mk_conf_addr(bus=%d, dfn=0x%x, where=0x%x,"
  87.      " addr=0x%lx, type1=0x%x)n",
  88.      bus, device_fn, where, pci_addr, type1));
  89. if (bus == 0) {
  90. int device = device_fn >> 3;
  91. /* Type 0 configuration cycle.  */
  92. if (device > 8) {
  93. DBG(("mk_conf_addr: device (%d)>20, returning -1n",
  94.      device));
  95. return -1;
  96. }
  97. *type1 = 0;
  98. addr = (0x0800L << device) | ((device_fn & 7) << 8) | (where);
  99. } else {
  100. /* Type 1 configuration cycle.  */
  101. *type1 = 1;
  102. addr = (bus << 16) | (device_fn << 8) | (where);
  103. }
  104. *pci_addr = addr;
  105. DBG(("mk_conf_addr: returning pci_addr 0x%lxn", addr));
  106. return 0;
  107. }
  108. static unsigned int
  109. conf_read(unsigned long addr, unsigned char type1)
  110. {
  111. unsigned long flags;
  112. unsigned int value, cpu;
  113. unsigned long t2_cfg = 0;
  114. cpu = smp_processor_id();
  115. __save_and_cli(flags); /* avoid getting hit by machine check */
  116. DBG(("conf_read(addr=0x%lx, type1=%d)n", addr, type1));
  117. #if 0
  118. {
  119.   unsigned long stat0;
  120.   /* Reset status register to avoid losing errors.  */
  121.   stat0 = *(vulp)T2_IOCSR;
  122.   *(vulp)T2_IOCSR = stat0;
  123.   mb();
  124.   DBG(("conf_read: T2 IOCSR was 0x%xn", stat0));
  125. }
  126. #endif
  127. /* If Type1 access, must set T2 CFG.  */
  128. if (type1) {
  129. t2_cfg = *(vulp)T2_HAE_3 & ~0xc0000000UL;
  130. *(vulp)T2_HAE_3 = 0x40000000UL | t2_cfg;
  131. mb();
  132. DBG(("conf_read: TYPE1 accessn"));
  133. }
  134. mb();
  135. draina();
  136. mcheck_expected(cpu) = 1;
  137. mcheck_taken(cpu) = 0;
  138. mb();
  139. /* Access configuration space. */
  140. value = *(vuip)addr;
  141. mb();
  142. mb();  /* magic */
  143. if (mcheck_taken(cpu)) {
  144. mcheck_taken(cpu) = 0;
  145. value = 0xffffffffU;
  146. mb();
  147. }
  148. mcheck_expected(cpu) = 0;
  149. mb();
  150. /* If Type1 access, must reset T2 CFG so normal IO space ops work.  */
  151. if (type1) {
  152. *(vulp)T2_HAE_3 = t2_cfg;
  153. mb();
  154. }
  155. DBG(("conf_read(): finishedn"));
  156. __restore_flags(flags);
  157. return value;
  158. }
  159. static void
  160. conf_write(unsigned long addr, unsigned int value, unsigned char type1)
  161. {
  162. unsigned long flags;
  163. unsigned int cpu;
  164. unsigned long t2_cfg = 0;
  165. cpu = smp_processor_id();
  166. __save_and_cli(flags); /* avoid getting hit by machine check */
  167. #if 0
  168. {
  169.   unsigned long stat0;
  170.   /* Reset status register to avoid losing errors.  */
  171.   stat0 = *(vulp)T2_IOCSR;
  172.   *(vulp)T2_IOCSR = stat0;
  173.   mb();
  174.   DBG(("conf_write: T2 ERR was 0x%xn", stat0));
  175. }
  176. #endif
  177. /* If Type1 access, must set T2 CFG.  */
  178. if (type1) {
  179. t2_cfg = *(vulp)T2_HAE_3 & ~0xc0000000UL;
  180. *(vulp)T2_HAE_3 = t2_cfg | 0x40000000UL;
  181. mb();
  182. DBG(("conf_write: TYPE1 accessn"));
  183. }
  184. mb();
  185. draina();
  186. mcheck_expected(cpu) = 1;
  187. mb();
  188. /* Access configuration space.  */
  189. *(vuip)addr = value;
  190. mb();
  191. mb();  /* magic */
  192. mcheck_expected(cpu) = 0;
  193. mb();
  194. /* If Type1 access, must reset T2 CFG so normal IO space ops work.  */
  195. if (type1) {
  196. *(vulp)T2_HAE_3 = t2_cfg;
  197. mb();
  198. }
  199. DBG(("conf_write(): finishedn"));
  200. __restore_flags(flags);
  201. }
  202. static int
  203. t2_read_config_byte(struct pci_dev *dev, int where, u8 *value)
  204. {
  205. unsigned long addr, pci_addr;
  206. unsigned char type1;
  207. if (mk_conf_addr(dev, where, &pci_addr, &type1))
  208. return PCIBIOS_DEVICE_NOT_FOUND;
  209. addr = (pci_addr << 5) + 0x00 + T2_CONF;
  210. *value = conf_read(addr, type1) >> ((where & 3) * 8);
  211. return PCIBIOS_SUCCESSFUL;
  212. }
  213. static int 
  214. t2_read_config_word(struct pci_dev *dev, int where, u16 *value)
  215. {
  216. unsigned long addr, pci_addr;
  217. unsigned char type1;
  218. if (mk_conf_addr(dev, where, &pci_addr, &type1))
  219. return PCIBIOS_DEVICE_NOT_FOUND;
  220. addr = (pci_addr << 5) + 0x08 + T2_CONF;
  221. *value = conf_read(addr, type1) >> ((where & 3) * 8);
  222. return PCIBIOS_SUCCESSFUL;
  223. }
  224. static int 
  225. t2_read_config_dword(struct pci_dev *dev, int where, u32 *value)
  226. {
  227. unsigned long addr, pci_addr;
  228. unsigned char type1;
  229. if (mk_conf_addr(dev, where, &pci_addr, &type1))
  230. return PCIBIOS_DEVICE_NOT_FOUND;
  231. addr = (pci_addr << 5) + 0x18 + T2_CONF;
  232. *value = conf_read(addr, type1);
  233. return PCIBIOS_SUCCESSFUL;
  234. }
  235. static int 
  236. t2_write_config(struct pci_dev *dev, int where, u32 value, long mask)
  237. {
  238. unsigned long addr, pci_addr;
  239. unsigned char type1;
  240. if (mk_conf_addr(dev, where, &pci_addr, &type1))
  241. return PCIBIOS_DEVICE_NOT_FOUND;
  242. addr = (pci_addr << 5) + mask + T2_CONF;
  243. conf_write(addr, value << ((where & 3) * 8), type1);
  244. return PCIBIOS_SUCCESSFUL;
  245. }
  246. static int 
  247. t2_write_config_byte(struct pci_dev *dev, int where, u8 value)
  248. {
  249. return t2_write_config(dev, where, value, 0x00);
  250. }
  251. static int 
  252. t2_write_config_word(struct pci_dev *dev, int where, u16 value)
  253. {
  254. return t2_write_config(dev, where, value, 0x08);
  255. }
  256. static int 
  257. t2_write_config_dword(struct pci_dev *dev, int where, u32 value)
  258. {
  259. return t2_write_config(dev, where, value, 0x18);
  260. }
  261. struct pci_ops t2_pci_ops = 
  262. {
  263. read_byte: t2_read_config_byte,
  264. read_word: t2_read_config_word,
  265. read_dword: t2_read_config_dword,
  266. write_byte: t2_write_config_byte,
  267. write_word: t2_write_config_word,
  268. write_dword: t2_write_config_dword
  269. };
  270. void __init
  271. t2_init_arch(void)
  272. {
  273. struct pci_controller *hose;
  274. unsigned int i;
  275. for (i = 0; i < NR_CPUS; i++) {
  276. mcheck_expected(i) = 0;
  277. mcheck_taken(i) = 0;
  278. }
  279. #if 0
  280. {
  281.   /* Set up error reporting.  */
  282.   unsigned long t2_err;
  283.   t2_err = *(vulp)T2_IOCSR;
  284.   t2_err |= (0x1 << 7);   /* master abort */
  285.   *(vulp)T2_IOCSR = t2_err;
  286.   mb();
  287. }
  288. #endif
  289. printk("t2_init: HBASE was 0x%lxn", *(vulp)T2_HBASE);
  290. #if 0
  291. printk("t2_init: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lxn",
  292.        *(vulp)T2_WBASE1,
  293.        *(vulp)T2_WMASK1,
  294.        *(vulp)T2_TBASE1);
  295. printk("t2_init: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lxn",
  296.        *(vulp)T2_WBASE2,
  297.        *(vulp)T2_WMASK2,
  298.        *(vulp)T2_TBASE2);
  299. #endif
  300. /*
  301.  * Set up the PCI->physical memory translation windows.
  302.  * For now, window 2 is  disabled.  In the future, we may
  303.  * want to use it to do scatter/gather DMA. 
  304.  *
  305.  * Window 1 goes at 1 GB and is 1 GB large.
  306.  */
  307. /* WARNING!! must correspond to the DMA_WIN params!!! */
  308. *(vulp)T2_WBASE1 = 0x400807ffU;
  309. *(vulp)T2_WMASK1 = 0x3ff00000U;
  310. *(vulp)T2_TBASE1 = 0;
  311. *(vulp)T2_WBASE2 = 0x0;
  312. *(vulp)T2_HBASE = 0x0;
  313. /* Zero HAE.  */
  314. *(vulp)T2_HAE_1 = 0; mb();
  315. *(vulp)T2_HAE_2 = 0; mb();
  316. *(vulp)T2_HAE_3 = 0; mb();
  317. #if 0
  318. *(vulp)T2_HAE_4 = 0; mb(); /* do not touch this */
  319. #endif
  320. /*
  321.  * Create our single hose.
  322.  */
  323. pci_isa_hose = hose = alloc_pci_controller();
  324. hose->io_space = &ioport_resource;
  325. hose->mem_space = &iomem_resource;
  326. hose->index = 0;
  327. hose->sparse_mem_base = T2_SPARSE_MEM - IDENT_ADDR;
  328. hose->dense_mem_base = T2_DENSE_MEM - IDENT_ADDR;
  329. hose->sparse_io_base = T2_IO - IDENT_ADDR;
  330. hose->dense_io_base = 0;
  331. hose->sg_isa = hose->sg_pci = NULL;
  332. __direct_map_base = 0x40000000;
  333. __direct_map_size = 0x40000000;
  334. }
  335. #define SIC_SEIC (1UL << 33)    /* System Event Clear */
  336. static void
  337. t2_clear_errors(int cpu)
  338. {
  339. struct sable_cpu_csr *cpu_regs;
  340. cpu_regs = (struct sable_cpu_csr *)T2_CPU0_BASE;
  341. if (cpu == 1)
  342. cpu_regs = (struct sable_cpu_csr *)T2_CPU1_BASE;
  343. if (cpu == 2)
  344. cpu_regs = (struct sable_cpu_csr *)T2_CPU2_BASE;
  345. if (cpu == 3)
  346. cpu_regs = (struct sable_cpu_csr *)T2_CPU3_BASE;
  347. cpu_regs->sic &= ~SIC_SEIC;
  348. /* Clear CPU errors.  */
  349. cpu_regs->bcce |= cpu_regs->bcce;
  350. cpu_regs->cbe  |= cpu_regs->cbe;
  351. cpu_regs->bcue |= cpu_regs->bcue;
  352. cpu_regs->dter |= cpu_regs->dter;
  353. *(vulp)T2_CERR1 |= *(vulp)T2_CERR1;
  354. *(vulp)T2_PERR1 |= *(vulp)T2_PERR1;
  355. mb();
  356. mb();  /* magic */
  357. }
  358. void
  359. t2_machine_check(unsigned long vector, unsigned long la_ptr,
  360.  struct pt_regs * regs)
  361. {
  362. int cpu = smp_processor_id();
  363. /* Clear the error before any reporting.  */
  364. mb();
  365. mb();  /* magic */
  366. draina();
  367. t2_clear_errors(cpu);
  368. wrmces(rdmces()|1); /* ??? */
  369. mb();
  370. process_mcheck_info(vector, la_ptr, regs, "T2", mcheck_expected(cpu));
  371. }