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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/mach-integrator/pci_v3.c
  3.  *
  4.  *  PCI functions for V3 host PCI bridge
  5.  *
  6.  *  Copyright (C) 1999 ARM Limited
  7.  *  Copyright (C) 2000-2001 Deep Blue Solutions Ltd
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify
  10.  * it under the terms of the GNU General Public License as published by
  11.  * the Free Software Foundation; either version 2 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  22.  */
  23. #include <linux/config.h>
  24. #include <linux/sched.h>
  25. #include <linux/kernel.h>
  26. #include <linux/pci.h>
  27. #include <linux/ptrace.h>
  28. #include <linux/slab.h>
  29. #include <linux/ioport.h>
  30. #include <linux/interrupt.h>
  31. #include <linux/spinlock.h>
  32. #include <linux/init.h>
  33. #include <asm/hardware.h>
  34. #include <asm/irq.h>
  35. #include <asm/system.h>
  36. #include <asm/mach/pci.h>
  37. #include <asm/hardware/pci_v3.h>
  38. /*
  39.  * The V3 PCI interface chip in Integrator provides several windows from
  40.  * local bus memory into the PCI memory areas.   Unfortunately, there
  41.  * are not really enough windows for our usage, therefore we reuse 
  42.  * one of the windows for access to PCI configuration space.  The
  43.  * memory map is as follows:
  44.  * 
  45.  * Local Bus Memory         Usage
  46.  * 
  47.  * 40000000 - 4FFFFFFF      PCI memory.  256M non-prefetchable
  48.  * 50000000 - 5FFFFFFF      PCI memory.  256M prefetchable
  49.  * 60000000 - 60FFFFFF      PCI IO.  16M
  50.  * 68000000 - 68FFFFFF      PCI Configuration. 16M
  51.  * 
  52.  * There are three V3 windows, each described by a pair of V3 registers.
  53.  * These are LB_BASE0/LB_MAP0, LB_BASE1/LB_MAP1 and LB_BASE2/LB_MAP2.
  54.  * Base0 and Base1 can be used for any type of PCI memory access.   Base2
  55.  * can be used either for PCI I/O or for I20 accesses.  By default, uHAL
  56.  * uses this only for PCI IO space.
  57.  * 
  58.  * PCI Memory is mapped so that assigned addresses in PCI Memory match
  59.  * local bus memory addresses.  In other words, if a PCI device is assigned
  60.  * address 80200000 then that address is a valid local bus address as well
  61.  * as a valid PCI Memory address.  PCI IO addresses are mapped to start
  62.  * at zero.  This means that local bus address 60000000 maps to PCI IO address
  63.  * 00000000 and so on.   Device driver writers need to be aware of this 
  64.  * distinction.
  65.  * 
  66.  * Normally these spaces are mapped using the following base registers:
  67.  * 
  68.  * Usage Local Bus Memory         Base/Map registers used
  69.  * 
  70.  * Mem   40000000 - 4FFFFFFF      LB_BASE0/LB_MAP0
  71.  * Mem   50000000 - 5FFFFFFF      LB_BASE1/LB_MAP1
  72.  * IO    60000000 - 60FFFFFF      LB_BASE2/LB_MAP2
  73.  * Cfg   68000000 - 68FFFFFF      
  74.  * 
  75.  * This means that I20 and PCI configuration space accesses will fail.
  76.  * When PCI configuration accesses are needed (via the uHAL PCI 
  77.  * configuration space primitives) we must remap the spaces as follows:
  78.  * 
  79.  * Usage Local Bus Memory         Base/Map registers used
  80.  * 
  81.  * Mem   40000000 - 4FFFFFFF      LB_BASE0/LB_MAP0
  82.  * Mem   50000000 - 5FFFFFFF      LB_BASE0/LB_MAP0
  83.  * IO    60000000 - 60FFFFFF      LB_BASE2/LB_MAP2
  84.  * Cfg   68000000 - 68FFFFFF      LB_BASE1/LB_MAP1
  85.  * 
  86.  * To make this work, the code depends on overlapping windows working.
  87.  * The V3 chip translates an address by checking its range within 
  88.  * each of the BASE/MAP pairs in turn (in ascending register number
  89.  * order).  It will use the first matching pair.   So, for example,
  90.  * if the same address is mapped by both LB_BASE0/LB_MAP0 and
  91.  * LB_BASE1/LB_MAP1, the V3 will use the translation from 
  92.  * LB_BASE0/LB_MAP0.
  93.  * 
  94.  * To allow PCI Configuration space access, the code enlarges the
  95.  * window mapped by LB_BASE0/LB_MAP0 from 256M to 512M.  This occludes
  96.  * the windows currently mapped by LB_BASE1/LB_MAP1 so that it can
  97.  * be remapped for use by configuration cycles.
  98.  * 
  99.  * At the end of the PCI Configuration space accesses, 
  100.  * LB_BASE1/LB_MAP1 is reset to map PCI Memory.  Finally the window
  101.  * mapped by LB_BASE0/LB_MAP0 is reduced in size from 512M to 256M to
  102.  * reveal the now restored LB_BASE1/LB_MAP1 window.
  103.  * 
  104.  * NOTE: We do not set up I2O mapping.  I suspect that this is only
  105.  * for an intelligent (target) device.  Using I2O disables most of
  106.  * the mappings into PCI memory.
  107.  */
  108. // V3 access routines
  109. #define v3_writeb(o,v) __raw_writeb(v, PCI_V3_VADDR + (unsigned int)(o))
  110. #define v3_readb(o)    (__raw_readb(PCI_V3_VADDR + (unsigned int)(o)))
  111. #define v3_writew(o,v) __raw_writew(v, PCI_V3_VADDR + (unsigned int)(o))
  112. #define v3_readw(o)    (__raw_readw(PCI_V3_VADDR + (unsigned int)(o)))
  113. #define v3_writel(o,v) __raw_writel(v, PCI_V3_VADDR + (unsigned int)(o))
  114. #define v3_readl(o)    (__raw_readl(PCI_V3_VADDR + (unsigned int)(o)))
  115. /*============================================================================
  116.  *
  117.  * routine: uHALir_PCIMakeConfigAddress()
  118.  *
  119.  * parameters: bus = which bus
  120.  *              device = which device
  121.  *              function = which function
  122.  * offset = configuration space register we are interested in
  123.  *
  124.  * description: this routine will generate a platform dependant config
  125.  * address.
  126.  *
  127.  * calls: none
  128.  *
  129.  * returns: configuration address to play on the PCI bus
  130.  *
  131.  * To generate the appropriate PCI configuration cycles in the PCI 
  132.  * configuration address space, you present the V3 with the following pattern 
  133.  * (which is very nearly a type 1 (except that the lower two bits are 00 and
  134.  * not 01).   In order for this mapping to work you need to set up one of
  135.  * the local to PCI aperatures to 16Mbytes in length translating to
  136.  * PCI configuration space starting at 0x0000.0000.
  137.  *
  138.  * PCI configuration cycles look like this:
  139.  *
  140.  * Type 0:
  141.  *
  142.  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
  143.  *  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
  144.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  145.  * | | |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|
  146.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  147.  *
  148.  * 31:11 Device select bit.
  149.  *  10:8 Function number
  150.  *   7:2 Register number
  151.  *
  152.  * Type 1:
  153.  *
  154.  *  3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1 
  155.  *  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
  156.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  157.  * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
  158.  * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  159.  *
  160.  * 31:24 reserved
  161.  * 23:16 bus number (8 bits = 128 possible buses)
  162.  * 15:11 Device number (5 bits)
  163.  * 10:8 function number
  164.  *  7:2 register number
  165.  *  
  166.  */
  167. static spinlock_t v3_lock = SPIN_LOCK_UNLOCKED;
  168. #define PCI_BUS_NONMEM_START 0x00000000
  169. #define PCI_BUS_NONMEM_SIZE 0x10000000
  170. #define PCI_BUS_PREMEM_START 0x10000000
  171. #define PCI_BUS_PREMEM_SIZE 0x10000000
  172. #if PCI_BUS_NONMEM_START & 0x000fffff
  173. #error PCI_BUS_NONMEM_START must be megabyte aligned
  174. #endif
  175. #if PCI_BUS_PREMEM_START & 0x000fffff
  176. #error PCI_BUS_PREMEM_START must be megabyte aligned
  177. #endif
  178. #undef V3_LB_BASE_PREFETCH
  179. #define V3_LB_BASE_PREFETCH 0
  180. static unsigned long v3_open_config_window(struct pci_dev *dev, int offset)
  181. {
  182. unsigned int address, mapaddress, busnr;
  183. busnr = dev->bus->number;
  184. /*
  185.  * Trap out illegal values
  186.  */
  187. if (offset > 255)
  188. BUG();
  189. if (busnr > 255)
  190. BUG();
  191. if (dev->devfn > 255)
  192. BUG();
  193. if (busnr == 0) {
  194. int slot = PCI_SLOT(dev->devfn);
  195. /*
  196.  * local bus segment so need a type 0 config cycle
  197.  *
  198.  * build the PCI configuration "address" with one-hot in
  199.  * A31-A11
  200.  *
  201.  * mapaddress:
  202.  *  3:1 = config cycle (101)
  203.  *  0   = PCI A1 & A0 are 0 (0)
  204.  */
  205. address = PCI_FUNC(dev->devfn) << 8;
  206. mapaddress = V3_LB_MAP_TYPE_CONFIG;
  207. if (slot > 12)
  208. /*
  209.  * high order bits are handled by the MAP register
  210.  */
  211. mapaddress |= 1 << (slot - 5);
  212. else
  213. /*
  214.  * low order bits handled directly in the address
  215.  */
  216. address |= 1 << (slot + 11);
  217. } else {
  218.          /*
  219.  * not the local bus segment so need a type 1 config cycle
  220.  *
  221.  * address:
  222.  *  23:16 = bus number
  223.  *  15:11 = slot number (7:3 of devfn)
  224.  *  10:8  = func number (2:0 of devfn)
  225.  *
  226.  * mapaddress:
  227.  *  3:1 = config cycle (101)
  228.  *  0   = PCI A1 & A0 from host bus (1)
  229.  */
  230. mapaddress = V3_LB_MAP_TYPE_CONFIG | V3_LB_MAP_AD_LOW_EN;
  231. address = (busnr << 16) | (dev->devfn << 8);
  232. }
  233. /*
  234.  * Set up base0 to see all 512Mbytes of memory space (not
  235.  * prefetchable), this frees up base1 for re-use by
  236.  * configuration memory
  237.  */
  238. v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
  239. V3_LB_BASE_ADR_SIZE_512MB | V3_LB_BASE_ENABLE);
  240. /*
  241.  * Set up base1/map1 to point into configuration space.
  242.  */
  243. v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_CONFIG_BASE) |
  244. V3_LB_BASE_ADR_SIZE_16MB | V3_LB_BASE_ENABLE);
  245. v3_writew(V3_LB_MAP1, mapaddress);
  246. return PCI_CONFIG_VADDR + address + offset;
  247. }
  248. static void v3_close_config_window(void)
  249. {
  250. /*
  251.  * Reassign base1 for use by prefetchable PCI memory
  252.  */
  253. v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE + SZ_256M) |
  254. V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_PREFETCH |
  255. V3_LB_BASE_ENABLE);
  256. v3_writew(V3_LB_MAP1, v3_addr_to_lb_map(PCI_BUS_PREMEM_START) |
  257. V3_LB_MAP_TYPE_MEM_MULTIPLE);
  258. /*
  259.  * And shrink base0 back to a 256M window (NOTE: MAP0 already correct)
  260.  */
  261. v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
  262. V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_ENABLE);
  263. }
  264. static int v3_read_config_byte(struct pci_dev *dev, int where, u8 *val)
  265. {
  266. unsigned long addr;
  267. unsigned long flags;
  268. u8 v;
  269. spin_lock_irqsave(&v3_lock, flags);
  270. addr = v3_open_config_window(dev, where);
  271. v = __raw_readb(addr);
  272. v3_close_config_window();
  273. spin_unlock_irqrestore(&v3_lock, flags);
  274. *val = v;
  275. return PCIBIOS_SUCCESSFUL;
  276. }
  277. static int v3_read_config_word(struct pci_dev *dev, int where, u16 *val)
  278. {
  279. unsigned long addr;
  280. unsigned long flags;
  281. u16 v;
  282. spin_lock_irqsave(&v3_lock, flags);
  283. addr = v3_open_config_window(dev, where);
  284. v = __raw_readw(addr);
  285. v3_close_config_window();
  286. spin_unlock_irqrestore(&v3_lock, flags);
  287. *val = v;
  288. return PCIBIOS_SUCCESSFUL;
  289. }
  290. static int v3_read_config_dword(struct pci_dev *dev, int where, u32 *val)
  291. {
  292. unsigned long addr;
  293. unsigned long flags;
  294. u32 v;
  295. spin_lock_irqsave(&v3_lock, flags);
  296. addr = v3_open_config_window(dev, where);
  297. v = __raw_readl(addr);
  298. v3_close_config_window();
  299. spin_unlock_irqrestore(&v3_lock, flags);
  300. *val = v;
  301. return PCIBIOS_SUCCESSFUL;
  302. }
  303. static int v3_write_config_byte(struct pci_dev *dev, int where, u8 val)
  304. {
  305. unsigned long addr;
  306. unsigned long flags;
  307. spin_lock_irqsave(&v3_lock, flags);
  308. addr = v3_open_config_window(dev, where);
  309. __raw_writeb(val, addr);
  310. __raw_readb(addr);
  311. v3_close_config_window();
  312. spin_unlock_irqrestore(&v3_lock, flags);
  313. return PCIBIOS_SUCCESSFUL;
  314. }
  315. static int v3_write_config_word(struct pci_dev *dev, int where, u16 val)
  316. {
  317. unsigned long addr;
  318. unsigned long flags;
  319. spin_lock_irqsave(&v3_lock, flags);
  320. addr = v3_open_config_window(dev, where);
  321. __raw_writew(val, addr);
  322. __raw_readw(addr);
  323. v3_close_config_window();
  324. spin_unlock_irqrestore(&v3_lock, flags);
  325. return PCIBIOS_SUCCESSFUL;
  326. }
  327. static int v3_write_config_dword(struct pci_dev *dev, int where, u32 val)
  328. {
  329. unsigned long addr;
  330. unsigned long flags;
  331. spin_lock_irqsave(&v3_lock, flags);
  332. addr = v3_open_config_window(dev, where);
  333. __raw_writel(val, addr);
  334. __raw_readl(addr);
  335. v3_close_config_window();
  336. spin_unlock_irqrestore(&v3_lock, flags);
  337. return PCIBIOS_SUCCESSFUL;
  338. }
  339. static struct pci_ops pci_v3_ops = {
  340. read_byte: v3_read_config_byte,
  341. read_word: v3_read_config_word,
  342. read_dword: v3_read_config_dword,
  343. write_byte: v3_write_config_byte,
  344. write_word: v3_write_config_word,
  345. write_dword: v3_write_config_dword,
  346. };
  347. static struct resource non_mem = {
  348. name: "PCI non-prefetchable",
  349. start: 0x40000000 + PCI_BUS_NONMEM_START,
  350. end: 0x40000000 + PCI_BUS_NONMEM_START + PCI_BUS_NONMEM_SIZE - 1,
  351. flags: IORESOURCE_MEM,
  352. };
  353. static struct resource pre_mem = {
  354. name: "PCI prefetchable",
  355. start: 0x40000000 + PCI_BUS_PREMEM_START,
  356. end: 0x40000000 + PCI_BUS_PREMEM_START + PCI_BUS_PREMEM_SIZE - 1,
  357. flags: IORESOURCE_MEM | IORESOURCE_PREFETCH,
  358. };
  359. int __init pci_v3_setup_resources(struct resource **resource)
  360. {
  361. if (request_resource(&iomem_resource, &non_mem)) {
  362. printk(KERN_ERR "PCI: unable to allocate non-prefetchable "
  363.        "memory regionn");
  364. return -EBUSY;
  365. }
  366. if (request_resource(&iomem_resource, &pre_mem)) {
  367. release_resource(&non_mem);
  368. printk(KERN_ERR "PCI: unable to allocate prefetchable "
  369.        "memory regionn");
  370. return -EBUSY;
  371. }
  372. /*
  373.  * bus->resource[0] is the IO resource for this bus
  374.  * bus->resource[1] is the mem resource for this bus
  375.  * bus->resource[2] is the prefetch mem resource for this bus
  376.  */
  377. resource[0] = &ioport_resource;
  378. resource[1] = &non_mem;
  379. resource[2] = &pre_mem;
  380. return 1;
  381. }
  382. /*
  383.  * These don't seem to be implemented on the Integrator I have, which
  384.  * means I can't get additional information on the reason for the pm2fb
  385.  * problems.  I suppose I'll just have to mind-meld with the machine. ;)
  386.  */
  387. #define SC_PCI     (IO_ADDRESS(INTEGRATOR_SC_BASE) + INTEGRATOR_SC_PCIENABLE_OFFSET)
  388. #define SC_LBFADDR (IO_ADDRESS(INTEGRATOR_SC_BASE) + 0x20)
  389. #define SC_LBFCODE (IO_ADDRESS(INTEGRATOR_SC_BASE) + 0x24)
  390. static int v3_fault(unsigned long addr, struct pt_regs *regs)
  391. {
  392. unsigned long pc = instruction_pointer(regs);
  393. unsigned long instr = *(unsigned long *)pc;
  394. #if 0
  395. char buf[128];
  396. sprintf(buf, "V3 fault: address=0x%08lx, pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x ISTAT=%02xn",
  397. addr, pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
  398. v3_readb(V3_LB_ISTAT));
  399. printk(KERN_DEBUG "%s", buf);
  400. printascii(buf);
  401. #endif
  402. v3_writeb(V3_LB_ISTAT, 0);
  403. __raw_writel(3, SC_PCI);
  404. /*
  405.  * If the instruction being executed was a read,
  406.  * make it look like it read all-ones.
  407.  */
  408. if ((instr & 0x0c100000) == 0x04100000) {
  409. int reg = (instr >> 12) & 15;
  410. unsigned long val;
  411. if (instr & 0x00400000)
  412. val = 255;
  413. else
  414. val = -1;
  415. regs->uregs[reg] = val;
  416. regs->ARM_pc += 4;
  417. return 0;
  418. }
  419. if ((instr & 0x0e100090) == 0x00100090) {
  420. int reg = (instr >> 12) & 15;
  421. regs->uregs[reg] = -1;
  422. regs->ARM_pc += 4;
  423. return 0;
  424. }
  425. return 1;
  426. }
  427. static void v3_irq(int irq, void *devid, struct pt_regs *regs)
  428. {
  429. #ifdef CONFIG_DEBUG_LL
  430. unsigned long pc = instruction_pointer(regs);
  431. unsigned long instr = *(unsigned long *)pc;
  432. char buf[128];
  433. sprintf(buf, "V3 int %d: pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x ISTAT=%02xn", irq,
  434. pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
  435. v3_readb(V3_LB_ISTAT));
  436. printascii(buf);
  437. #endif
  438. v3_writew(V3_PCI_STAT, 0xf000);
  439. v3_writeb(V3_LB_ISTAT, 0);
  440. __raw_writel(3, SC_PCI);
  441. #ifdef CONFIG_DEBUG_LL
  442. /*
  443.  * If the instruction being executed was a read,
  444.  * make it look like it read all-ones.
  445.  */
  446. if ((instr & 0x0c100000) == 0x04100000) {
  447. int reg = (instr >> 16) & 15;
  448. sprintf(buf, "   reg%d = %08lxn", reg, regs->uregs[reg]);
  449. printascii(buf);
  450. }
  451. #endif
  452. }
  453. extern int (*external_fault)(unsigned long addr, struct pt_regs *regs);
  454. /*
  455.  * V3_LB_BASE? - local bus address
  456.  * V3_LB_MAP?  - pci bus address
  457.  */
  458. void __init pci_v3_init(void *sysdata)
  459. {
  460. unsigned int pci_cmd;
  461. unsigned long flags;
  462. unsigned int temp;
  463. int ret;
  464. /*
  465.  * Hook in our fault handler for PCI errors
  466.  */
  467. external_fault = v3_fault;
  468. spin_lock_irqsave(&v3_lock, flags);
  469. /*
  470.  * Unlock V3 registers, but only if they were previously locked.
  471.  */
  472. if (v3_readw(V3_SYSTEM) & V3_SYSTEM_M_LOCK)
  473. v3_writew(V3_SYSTEM, 0xa05f);
  474. /*
  475.  * Setup window 0 - PCI non-prefetchable memory
  476.  *  Local: 0x40000000 Bus: 0x00000000 Size: 256MB
  477.  */
  478. v3_writel(V3_LB_BASE0, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE) |
  479. V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_ENABLE);
  480. v3_writew(V3_LB_MAP0, v3_addr_to_lb_map(PCI_BUS_NONMEM_START) |
  481. V3_LB_MAP_TYPE_MEM);
  482. /*
  483.  * Setup window 1 - PCI prefetchable memory
  484.  *  Local: 0x50000000 Bus: 0x10000000 Size: 256MB
  485.  */
  486. v3_writel(V3_LB_BASE1, v3_addr_to_lb_base(PHYS_PCI_MEM_BASE + SZ_256M) |
  487. V3_LB_BASE_ADR_SIZE_256MB | V3_LB_BASE_PREFETCH |
  488. V3_LB_BASE_ENABLE);
  489. v3_writew(V3_LB_MAP1, v3_addr_to_lb_map(PCI_BUS_PREMEM_START) |
  490. V3_LB_MAP_TYPE_MEM_MULTIPLE);
  491. /*
  492.  * Setup window 2 - PCI IO
  493.  */
  494. v3_writel(V3_LB_BASE2, v3_addr_to_lb_base2(PHYS_PCI_IO_BASE) |
  495. V3_LB_BASE_ENABLE);
  496. v3_writew(V3_LB_MAP2, v3_addr_to_lb_map2(0));
  497. /*
  498.  * Disable PCI to host IO cycles
  499.  */
  500. temp = v3_readw(V3_PCI_CFG) & ~V3_PCI_CFG_M_I2O_EN;
  501. temp |= V3_PCI_CFG_M_IO_REG_DIS | V3_PCI_CFG_M_IO_DIS;
  502. v3_writew(V3_PCI_CFG, temp);
  503. printk(KERN_DEBUG "FIFO_CFG: %04x  FIFO_PRIO: %04xn",
  504. v3_readw(V3_FIFO_CFG), v3_readw(V3_FIFO_PRIORITY));
  505. /*
  506.  * Set the V3 FIFO such that writes have higher priority than
  507.  * reads, and local bus write causes local bus read fifo flush.
  508.  * Same for PCI.
  509.  */
  510. v3_writew(V3_FIFO_PRIORITY, 0x0a0a);
  511. /*
  512.  * Re-lock the system register.
  513.  */
  514. temp = v3_readw(V3_SYSTEM) | V3_SYSTEM_M_LOCK;
  515. v3_writew(V3_SYSTEM, temp);
  516. /*
  517.  * Clear any error conditions, and enable write errors.
  518.  */
  519. v3_writeb(V3_LB_ISTAT, 0);
  520. v3_writew(V3_LB_CFG, v3_readw(V3_LB_CFG) | (1 << 10));
  521. v3_writeb(V3_LB_IMASK, 0x28);
  522. __raw_writel(3, SC_PCI);
  523. /*
  524.  * Grab the PCI error interrupt.
  525.  */
  526. ret = request_irq(IRQ_V3INT, v3_irq, 0, "V3 error", NULL);
  527. if (ret)
  528. printk(KERN_ERR "PCI: unable to grab PCI error "
  529.        "interrupt: %dn", ret);
  530. spin_unlock_irqrestore(&v3_lock, flags);
  531. pci_scan_bus(0, &pci_v3_ops, sysdata);
  532. pci_cmd = PCI_COMMAND_MEMORY |
  533.   PCI_COMMAND_MASTER | PCI_COMMAND_INVALIDATE;
  534. v3_writew(V3_PCI_CMD, pci_cmd);
  535. v3_writeb(V3_LB_ISTAT, ~0x40);
  536. v3_writeb(V3_LB_IMASK, 0x68);
  537. #if 0
  538. ret = request_irq(IRQ_LBUSTIMEOUT, lb_timeout, 0, "bus timeout", NULL);
  539. if (ret)
  540. printk(KERN_ERR "PCI: unable to grab local bus timeout ".
  541.        "interrupt: %dn", ret);
  542. #endif
  543. }