1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/*
* detect_host_bridge.c
*
* This code is inspired by detect_grackle_bridge.c of SVGM BSP
* written by Till Straumann
* Copyright (C) 2001, 2003 Till Straumann <strauman@slac.stanford.edu>
*
* Copyright (C) 2004 S. Kate Feng, <feng1@bnl.gov>
* wrote it to support the MVME5500 board.
*
*/
#include <libcpu/io.h>
#include <rtems/bspIo.h> /* printk */
#include <bsp/pci.h>
#include <bsp/gtreg.h>
#include <bsp/gtpcireg.h>
#include <stdio.h>
#include <string.h>
#define PCI_DEBUG 0
#define PCI_INVALID_VENDORDEVICEID 0xffffffff
#define PCI_MULTI_FUNCTION 0x80
#define HOSTBRIDGET_ERROR 0xf0000000
unsigned long _BSP_clear_hostbridge_errors(int enableMCP, int quiet)
{
unsigned int pcidata, pcidata1;
int PciNumber;
/* On the mvme5500 board, the GT64260B system controller had the MCP
* signal pulled up high. Thus, the MCP signal is not used as it is
* on other boards such as mvme2307.
*/
if (enableMCP) return(-1);
for (PciNumber=0; PciNumber<1; PciNumber++) {
PCIx_read_config_dword(PciNumber, 0,
0,
0,
PCI0_COMMAND+(PciNumber * 0x80),
&pcidata);
if (!quiet)
printk("Before _BSP_clear_hostbridge_errors(): 0x%x, cause 0x%x\n",
pcidata, inl(0x1d58));
outl(0,0x1d58);
/* Clear the error on the host bridge */
pcidata1= pcidata;
pcidata1 |= PCI_STATUS_CLRERR_MASK;
pcidata1 |= 0x140;
PCIx_write_config_dword(PciNumber, 0,
0,
0,
PCI0_COMMAND+(PciNumber * 0x80),
pcidata1);
PCIx_read_config_dword(PciNumber, 0,
0,
0,
PCI0_COMMAND+(PciNumber * 0x80),
&pcidata1);
if (!quiet) printk("After _BSP_clear_hostbridge_errors(): sts 0x%x\n",
pcidata1);
if (pcidata1 & HOSTBRIDGET_ERROR) printk("BSP_clear_hostbridge_errors(): unable to clear pending hostbridge errors\n");
}
return(pcidata & HOSTBRIDGET_ERROR);
}
|