annotate packages/io/pci/current/src/pci.c @ 1777:c16341b1bac6 default tip

* Added execute permissions to files missed in conversion from CVS
author alexs
date Mon, 12 Oct 2009 02:26:09 +0100
parents 5dd2b854cc32
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1 //=============================================================================
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
2 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
3 // pci.c
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
4 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
5 // PCI library
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
6 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
7 //=============================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
14 // the terms of the GNU General Public License as published by the Free
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later version.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
22 // You should have received a copy of the GNU General Public License along
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
26 // As a special exception, if other files instantiate templates or use macros
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
27 // or inline functions from this file, or you compile this file and link it
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
28 // with other works to produce a work based on this file, this file does not
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
29 // by itself cause the resulting work to be covered by the GNU General Public
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
30 // License. However the source code for this file must still be made available
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
31 // in accordance with section (3) of the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
33 // This exception does not invalidate any other reasons why a work based on
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
34 // this file might be covered by the GNU General Public License.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
210
d2c90368aeef Merge from eCos master repository on 2002-05-23-21:39:14-BST
jlarmour
parents: 208
diff changeset
37 // at http://sources.redhat.com/ecos/ecos-license/
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
40 //=============================================================================
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
42 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
43 // Author(s): jskov, from design by nickg
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
44 // Contributors: jskov
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
45 // Date: 1999-08-09
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
46 // Purpose: PCI configuration
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
47 // Description:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
48 // PCI bus support library.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
49 // Handles simple resource allocation for devices.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
50 // Can configure 64bit devices, but drivers may need special
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
51 // magic to access all of this memory space - this is platform
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
52 // specific and the driver must know how to handle it on its own.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
53 //####DESCRIPTIONEND####
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
54 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
55 //=============================================================================
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
56
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
57 #include <pkgconf/hal.h>
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
58 #include <pkgconf/io_pci.h>
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
59 #include <cyg/io/pci_hw.h>
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
60
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
61 // CYG_PCI_PRESENT only gets defined for targets that provide PCI HAL support.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
62 // See pci_hw.h for details.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
63 #ifdef CYG_PCI_PRESENT
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
64
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
65 #include <cyg/io/pci.h>
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
66 #include <cyg/infra/cyg_ass.h>
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
67
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
68 static cyg_bool cyg_pci_lib_initialized = false;
654
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
69 static CYG_PCI_ADDRESS64 cyg_pci_memory_base;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
70 static CYG_PCI_ADDRESS32 cyg_pci_io_base;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
71
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
72 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
73 cyg_pci_init( void )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
74 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
75 if (!cyg_pci_lib_initialized) {
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
76
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
77 cyg_pci_set_memory_base(HAL_PCI_ALLOC_BASE_MEMORY);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
78 cyg_pci_set_io_base(HAL_PCI_ALLOC_BASE_IO);
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
79
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
80 // Initialize the PCI bus, preparing it for general access.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
81 cyg_pcihw_init();
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
82
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
83 cyg_pci_lib_initialized = true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
84 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
85 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
86
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
87 //---------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
88 // Common device configuration access functions
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
89
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
90 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
91 cyg_pci_get_device_info ( cyg_pci_device_id devid, cyg_pci_device *dev_info )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
92 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
93 int i;
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
94 unsigned char bar_count;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
95 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
96 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(devid);
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 147
diff changeset
97 cyg_uint8 header_type;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
98
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
99 dev_info->devid = devid;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
100
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
101 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_VENDOR,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
102 &dev_info->vendor);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
103 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_DEVICE,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
104 &dev_info->device);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
105 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_COMMAND,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
106 &dev_info->command);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
107 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_STATUS,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
108 &dev_info->status);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
109 cyg_pcihw_read_config_uint32(bus, devfn, CYG_PCI_CFG_CLASS_REV,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
110 &dev_info->class_rev);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
111 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_CACHE_LINE_SIZE,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
112 &dev_info->cache_line_size);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
113 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_LATENCY_TIMER,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
114 &dev_info->latency_timer);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
115 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_HEADER_TYPE,
148
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 147
diff changeset
116 &header_type);
8f2f7615e727 Merge from eCos master repository on 2001-01-12-06:43:03-GMT
jlarmour
parents: 147
diff changeset
117 dev_info->header_type = (cyg_pci_header_type) header_type;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
118 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_BIST,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
119 &dev_info->bist);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
120
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
121 if ((dev_info->header_type & CYG_PCI_CFG_HEADER_TYPE_MASK) == CYG_PCI_HEADER_BRIDGE)
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
122 dev_info->num_bars = 2;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
123 else
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
124 dev_info->num_bars = 6;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
125
654
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
126 // Clear out all address info (the code below stops short)
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
127 for (i = 0; i < CYG_PCI_MAX_BAR; i++) {
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
128 dev_info->base_map[i] = 0xffffffff;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
129 dev_info->base_address[i] = 0;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
130 dev_info->base_size[i] = 0;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
131 }
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
132
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
133 for (i = 0; i < dev_info->num_bars; i++) {
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
134 cyg_pcihw_read_config_uint32(bus, devfn,
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
135 CYG_PCI_CFG_BAR_BASE + 4*i,
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
136 &dev_info->base_address[i]);
654
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
137 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
138
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
139 // If device is disabled, probe BARs for sizes.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
140 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) == 0) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
141
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
142 bar_count = 0;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
143 for (i = 0; i < dev_info->num_bars; i++){
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
144 cyg_uint32 size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
145
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
146 cyg_pcihw_write_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
147 CYG_PCI_CFG_BAR_BASE + 4*i,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
148 0xffffffff);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
149 cyg_pcihw_read_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
150 CYG_PCI_CFG_BAR_BASE + 4*i,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
151 &size);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
152 dev_info->base_size[i] = size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
153 dev_info->base_map[i] = 0xffffffff;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
154
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
155 // Increment BAR count only if it has valid entry. BARs may not
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
156 // be in contiguous locations.
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
157 if (size != 0) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
158 ++bar_count;
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
159 }
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
160
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
161 // Check for a 64bit memory region.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
162 if (CYG_PCI_CFG_BAR_SPACE_MEM ==
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
163 (size & CYG_PCI_CFG_BAR_SPACE_MASK)) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
164 if (size & CYG_PRI_CFG_BAR_MEM_TYPE_64) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
165 // Clear fields for next BAR - it's the upper 32 bits.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
166 i++;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
167 dev_info->base_size[i] = 0;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
168 dev_info->base_map[i] = 0xffffffff;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
169 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
170 }
1467
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
171
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
172 // Fix any IO devices that only implement the bottom 16
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
173 // bits of the the BAR. Just fill in these bits so it
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
174 // looks like a full 32 bit BAR.
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
175 if ((CYG_PCI_CFG_BAR_SPACE_IO ==
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
176 (size & CYG_PCI_CFG_BAR_SPACE_MASK)) &&
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
177 ((size & 0xFFFF0000) == 0)
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
178 )
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
179 {
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
180 dev_info->base_size[i] |= 0xFFFF0000;
8ad4d297cbf8 * src/pci.c (cyg_pci_get_device_info): Added fix for devices that
nickg
parents: 1465
diff changeset
181 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
182 }
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
183 dev_info->num_bars = bar_count;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
184 } else {
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
185 // If the device is already configured. Fill in the base_map.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
186 CYG_PCI_ADDRESS64 tmp_addr;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
187 cyg_uint32 bar;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
188
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
189 bar_count = 0;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
190 for (i = 0; i < dev_info->num_bars; i++){
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
191
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
192 dev_info->base_size[i] = 0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
193
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
194 bar = dev_info->base_address[i];
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
195
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
196 // Increment BAR count only if it has valid entry. BARs may not
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
197 // be in contiguous locations.
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
198 if (bar != 0) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
199 ++bar_count;
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
200 }
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
201
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
202 if ((bar & CYG_PCI_CFG_BAR_SPACE_MASK) == CYG_PCI_CFG_BAR_SPACE_IO) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
203 dev_info->base_map[i] = (bar & CYG_PRI_CFG_BAR_IO_MASK) + HAL_PCI_PHYSICAL_IO_BASE;
654
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
204 bar &= CYG_PRI_CFG_BAR_IO_MASK;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
205 if ((bar < 0xFF000000) && (bar >= cyg_pci_io_base)) {
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
206 // Assume that this device owns 512 'registers'
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
207 cyg_pci_io_base = bar + 0x200;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
208 #ifdef CYGPKG_IO_PCI_DEBUG
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
209 diag_printf("Update I/O base to %x from bar: %d\n", cyg_pci_io_base, i);
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
210 #endif
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
211 }
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
212 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
213 tmp_addr = bar & CYG_PRI_CFG_BAR_MEM_MASK;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
214
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
215 if ((bar & CYG_PRI_CFG_BAR_MEM_TYPE_MASK) == CYG_PRI_CFG_BAR_MEM_TYPE_64)
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
216 tmp_addr |= ((CYG_PCI_ADDRESS64)(dev_info->base_address[i+1] & CYG_PRI_CFG_BAR_MEM_MASK)) << 32;
654
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
217
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
218 if ((tmp_addr < 0xFF000000) && (tmp_addr >= cyg_pci_memory_base)) {
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
219 // Assume that this device owns 1M
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
220 cyg_pci_memory_base = tmp_addr + 0x100000;
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
221 #ifdef CYGPKG_IO_PCI_DEBUG
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
222 diag_printf("Update memory base to %llx from bar: %d\n", cyg_pci_memory_base, i);
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
223 #endif
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
224 }
89b77368d45c Improve resource management.
gthomas
parents: 210
diff changeset
225
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
226 tmp_addr += HAL_PCI_PHYSICAL_MEMORY_BASE;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
227
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
228 dev_info->base_map[i] = tmp_addr;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
229 if ((bar & CYG_PRI_CFG_BAR_MEM_TYPE_MASK) == CYG_PRI_CFG_BAR_MEM_TYPE_64)
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 184
diff changeset
230 dev_info->base_map[++i] = tmp_addr >> 32;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
231 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
232 }
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
233 dev_info->num_bars = bar_count;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
234 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
235
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
236
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
237 switch (dev_info->header_type & CYG_PCI_CFG_HEADER_TYPE_MASK) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
238 case CYG_PCI_HEADER_NORMAL:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
239 cyg_pcihw_read_config_uint32(bus, devfn, CYG_PCI_CFG_CARDBUS_CIS,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
240 &dev_info->header.normal.cardbus_cis);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
241 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_SUB_VENDOR,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
242 &dev_info->header.normal.sub_vendor);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
243 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_SUB_ID,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
244 &dev_info->header.normal.sub_id);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
245 cyg_pcihw_read_config_uint32(bus, devfn, CYG_PCI_CFG_ROM_ADDRESS,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
246 &dev_info->header.normal.rom_address);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
247 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_CAP_LIST,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
248 &dev_info->header.normal.cap_list);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
249
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
250 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_INT_LINE,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
251 &dev_info->header.normal.int_line);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
252 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_INT_PIN,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
253 &dev_info->header.normal.int_pin);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
254 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_MIN_GNT,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
255 &dev_info->header.normal.min_gnt);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
256 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_MAX_LAT,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
257 &dev_info->header.normal.max_lat);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
258 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
259 case CYG_PCI_HEADER_BRIDGE:
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
260 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_PRI_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
261 &dev_info->header.bridge.pri_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
262 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_SEC_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
263 &dev_info->header.bridge.sec_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
264 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_SUB_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
265 &dev_info->header.bridge.sub_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
266 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_SEC_LATENCY_TIMER,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
267 &dev_info->header.bridge.sec_latency_timer);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
268 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_IO_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
269 &dev_info->header.bridge.io_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
270 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_IO_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
271 &dev_info->header.bridge.io_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
272 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_SEC_STATUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
273 &dev_info->header.bridge.sec_status);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
274 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
275 &dev_info->header.bridge.mem_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
276 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
277 &dev_info->header.bridge.mem_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
278 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
279 &dev_info->header.bridge.prefetch_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
280 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
281 &dev_info->header.bridge.prefetch_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
282 cyg_pcihw_read_config_uint32(bus, devfn, CYG_PCI_CFG_PREFETCH_BASE_UPPER32,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
283 &dev_info->header.bridge.prefetch_base_upper32);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
284 cyg_pcihw_read_config_uint32(bus, devfn, CYG_PCI_CFG_PREFETCH_LIMIT_UPPER32,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
285 &dev_info->header.bridge.prefetch_limit_upper32);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
286 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_IO_BASE_UPPER16,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
287 &dev_info->header.bridge.io_base_upper16);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
288 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_IO_LIMIT_UPPER16,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
289 &dev_info->header.bridge.io_limit_upper16);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
290 cyg_pcihw_read_config_uint32(bus, devfn, CYG_PCI_CFG_BRIDGE_ROM_ADDRESS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
291 &dev_info->header.bridge.rom_address);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
292 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_INT_LINE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
293 &dev_info->header.bridge.int_line);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
294 cyg_pcihw_read_config_uint8(bus, devfn, CYG_PCI_CFG_INT_PIN,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
295 &dev_info->header.bridge.int_pin);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
296 cyg_pcihw_read_config_uint16(bus, devfn, CYG_PCI_CFG_BRIDGE_CONTROL,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
297 &dev_info->header.bridge.control);
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
298 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
299 case CYG_PCI_HEADER_CARDBUS_BRIDGE:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
300 CYG_FAIL("PCI device header 'cardbus bridge' support not implemented");
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
301 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
302 default:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
303 CYG_FAIL("Unknown PCI device header type");
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
304 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
305 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
306 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
307
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
308 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
309 cyg_pci_set_device_info ( cyg_pci_device_id devid, cyg_pci_device *dev_info )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
310 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
311 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
312 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(devid);
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
313 int i;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
314
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
315 // Only writable entries are updated.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
316 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_COMMAND,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
317 dev_info->command);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
318 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_STATUS,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
319 dev_info->status);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
320 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_CACHE_LINE_SIZE,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
321 dev_info->cache_line_size);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
322 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_LATENCY_TIMER,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
323 dev_info->latency_timer);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
324 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_BIST,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
325 dev_info->bist);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
326
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
327 // Check for all possible BARs because they may be non-contiguous
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
328 for (i = 0; i < CYG_PCI_MAX_BAR; i++) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
329 if (dev_info->base_address[i]) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
330 cyg_pcihw_write_config_uint32 (bus, devfn,
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
331 CYG_PCI_CFG_BAR_BASE+4*i,
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
332 dev_info->base_address[i]);
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
333 }
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
334 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
335
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
336 switch (dev_info->header_type & CYG_PCI_CFG_HEADER_TYPE_MASK) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
337 case CYG_PCI_HEADER_NORMAL:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
338 cyg_pcihw_write_config_uint32(bus, devfn, CYG_PCI_CFG_CARDBUS_CIS,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
339 dev_info->header.normal.cardbus_cis);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
340 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_SUB_VENDOR,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
341 dev_info->header.normal.sub_vendor);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
342 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_SUB_ID,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
343 dev_info->header.normal.sub_id);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
344 cyg_pcihw_write_config_uint32(bus, devfn, CYG_PCI_CFG_ROM_ADDRESS,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
345 dev_info->header.normal.rom_address);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
346
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
347 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_INT_LINE,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
348 dev_info->header.normal.int_line);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
349 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_INT_PIN,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
350 dev_info->header.normal.int_pin);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
351 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_MIN_GNT,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
352 dev_info->header.normal.min_gnt);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
353 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_MAX_LAT,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
354 dev_info->header.normal.max_lat);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
355 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
356 case CYG_PCI_HEADER_BRIDGE:
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
357 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_PRI_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
358 dev_info->header.bridge.pri_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
359 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SEC_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
360 dev_info->header.bridge.sec_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
361 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SUB_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
362 dev_info->header.bridge.sub_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
363 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SEC_LATENCY_TIMER,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
364 dev_info->header.bridge.sec_latency_timer);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
365 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_IO_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
366 dev_info->header.bridge.io_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
367 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_IO_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
368 dev_info->header.bridge.io_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
369 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_SEC_STATUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
370 dev_info->header.bridge.sec_status);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
371 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
372 dev_info->header.bridge.mem_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
373 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
374 dev_info->header.bridge.mem_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
375 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
376 dev_info->header.bridge.prefetch_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
377 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
378 dev_info->header.bridge.prefetch_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
379 cyg_pcihw_write_config_uint32(bus, devfn, CYG_PCI_CFG_PREFETCH_BASE_UPPER32,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
380 dev_info->header.bridge.prefetch_base_upper32);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
381 cyg_pcihw_write_config_uint32(bus, devfn, CYG_PCI_CFG_PREFETCH_LIMIT_UPPER32,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
382 dev_info->header.bridge.prefetch_limit_upper32);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
383 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_IO_BASE_UPPER16,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
384 dev_info->header.bridge.io_base_upper16);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
385 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_IO_LIMIT_UPPER16,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
386 dev_info->header.bridge.io_limit_upper16);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
387 cyg_pcihw_write_config_uint32(bus, devfn, CYG_PCI_CFG_BRIDGE_ROM_ADDRESS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
388 dev_info->header.bridge.rom_address);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
389 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_INT_LINE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
390 dev_info->header.bridge.int_line);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
391 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_BRIDGE_CONTROL,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
392 dev_info->header.bridge.control);
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
393 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
394 case CYG_PCI_HEADER_CARDBUS_BRIDGE:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
395 CYG_FAIL("PCI device header 'cardbus bridge' support not implemented");
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
396 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
397 default:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
398 CYG_FAIL("Unknown PCI device header type");
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
399 break;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
400 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
401
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
402 // Update values in dev_info.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
403 cyg_pci_get_device_info(devid, dev_info);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
404 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
405
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
406
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
407 //---------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
408 // Specific device configuration access functions
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
409 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
410 cyg_pci_read_config_uint8( cyg_pci_device_id devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
411 cyg_uint8 offset, cyg_uint8 *val)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
412 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
413 cyg_pcihw_read_config_uint8(CYG_PCI_DEV_GET_BUS(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
414 CYG_PCI_DEV_GET_DEVFN(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
415 offset, val);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
416 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
417
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
418 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
419 cyg_pci_read_config_uint16( cyg_pci_device_id devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
420 cyg_uint8 offset, cyg_uint16 *val)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
421 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
422 cyg_pcihw_read_config_uint16(CYG_PCI_DEV_GET_BUS(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
423 CYG_PCI_DEV_GET_DEVFN(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
424 offset, val);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
425 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
426
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
427 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
428 cyg_pci_read_config_uint32( cyg_pci_device_id devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
429 cyg_uint8 offset, cyg_uint32 *val)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
430 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
431 cyg_pcihw_read_config_uint32(CYG_PCI_DEV_GET_BUS(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
432 CYG_PCI_DEV_GET_DEVFN(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
433 offset, val);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
434 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
435
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
436
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
437 // Write functions
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
438 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
439 cyg_pci_write_config_uint8( cyg_pci_device_id devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
440 cyg_uint8 offset, cyg_uint8 val)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
441 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
442 cyg_pcihw_write_config_uint8(CYG_PCI_DEV_GET_BUS(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
443 CYG_PCI_DEV_GET_DEVFN(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
444 offset, val);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
445 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
446
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
447 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
448 cyg_pci_write_config_uint16( cyg_pci_device_id devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
449 cyg_uint8 offset, cyg_uint16 val)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
450 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
451 cyg_pcihw_write_config_uint16(CYG_PCI_DEV_GET_BUS(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
452 CYG_PCI_DEV_GET_DEVFN(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
453 offset, val);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
454 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
455
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
456 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
457 cyg_pci_write_config_uint32( cyg_pci_device_id devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
458 cyg_uint8 offset, cyg_uint32 val)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
459 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
460 cyg_pcihw_write_config_uint32(CYG_PCI_DEV_GET_BUS(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
461 CYG_PCI_DEV_GET_DEVFN(devid),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
462 offset, val);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
463 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
464
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
465 //------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
466 // Device find functions
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
467
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
468 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
469 cyg_pci_find_next( cyg_pci_device_id cur_devid,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
470 cyg_pci_device_id *next_devid )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
471 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
472 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(cur_devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
473 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(cur_devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
474 cyg_uint8 dev = CYG_PCI_DEV_GET_DEV(devfn);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
475 cyg_uint8 fn = CYG_PCI_DEV_GET_FN(devfn);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
476
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
477 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
478 diag_printf("cyg_pci_find_next: start[%x] ...\n",(unsigned)cur_devid);
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
479 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
480
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
481 // If this is the initializer, start with 0/0/0
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
482 if (CYG_PCI_NULL_DEVID == cur_devid) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
483 bus = dev = fn = 0;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
484 dev = CYG_PCI_MIN_DEV;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
485 } else if (CYG_PCI_NULL_DEVFN == (cur_devid & CYG_PCI_NULL_DEVFN)) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
486 dev = fn = 0;
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
487 dev = CYG_PCI_MIN_DEV;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
488 } else {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
489 // Otherwise, check multi-function bit of device's first function
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
490 cyg_uint8 header;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
491
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
492 devfn = CYG_PCI_DEV_MAKE_DEVFN(dev, 0);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
493 cyg_pcihw_read_config_uint8(bus, devfn,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
494 CYG_PCI_CFG_HEADER_TYPE, &header);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
495 if (header & CYG_PCI_CFG_HEADER_TYPE_MF) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
496 // Multi-function device. Increase fn.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
497 fn++;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
498 if (fn >= CYG_PCI_MAX_FN) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
499 fn = 0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
500 dev++;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
501 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
502 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
503 // Single-function device. Skip to next.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
504 dev++;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
505 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
506 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
507
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
508 // Note: Reset iterators in enclosing statement's "next" part.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
509 // Allows resuming scan with given input values.
184
022f1e506033 Merge from eCos master repository on 2001-10-02-17:59:22-BST
jlarmour
parents: 182
diff changeset
510 for (;bus < CYG_PCI_MAX_BUS; bus++, dev=CYG_PCI_MIN_DEV) {
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
511 for (;dev < CYG_PCI_MAX_DEV; dev++, fn=0) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
512 for (;fn < CYG_PCI_MAX_FN; fn++) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
513 cyg_uint16 vendor;
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
514
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
515 if (CYG_PCI_IGNORE_DEVICE(bus, dev, fn))
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
516 continue;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
517
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
518 devfn = CYG_PCI_DEV_MAKE_DEVFN(dev, fn);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
519 cyg_pcihw_read_config_uint16(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
520 CYG_PCI_CFG_VENDOR, &vendor);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
521 if (CYG_PCI_VENDOR_UNDEFINED != vendor) {
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
522 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
523 diag_printf(" Bus: %d, Dev: %d, Fn: %d, Vendor: %x\n", bus, dev, fn, vendor);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
524 #endif
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
525 *next_devid = CYG_PCI_DEV_MAKE_ID(bus, devfn);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
526 return true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
527 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
528 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
529 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
530 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
531
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
532 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
533 diag_printf("nothing.\n");
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
534 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
535
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
536 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
537 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
538
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
539 //
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
540 // Scan for a particular device, starting with 'devid'
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
541 // 'devid' is updated with the next device if found.
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
542 // is not changed if no suitable device is found.
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
543 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
544 cyg_pci_find_device( cyg_uint16 vendor, cyg_uint16 device,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
545 cyg_pci_device_id *devid )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
546 {
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
547 cyg_pci_device_id new_devid = *devid;
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
548
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
549 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
550 diag_printf("cyg_pci_find_device - vendor: %x, device: %x\n", vendor, device);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
551 #endif
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
552 // Scan entire bus, check for matches on valid devices.
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
553 while (cyg_pci_find_next(new_devid, &new_devid)) {
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
554 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(new_devid);
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
555 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(new_devid);
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
556 cyg_uint16 v, d;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
557
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
558 // Check that vendor matches.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
559 cyg_pcihw_read_config_uint16(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
560 CYG_PCI_CFG_VENDOR, &v);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
561 cyg_pcihw_read_config_uint16(bus, devfn,
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
562 CYG_PCI_CFG_DEVICE, &d);
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
563 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
564 diag_printf("... PCI vendor = %x, device = %x\n", v, d);
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
565 #endif
1404
165499195994 * src/pci.c (cyg_pci_find_device): Removed a debug print which should
asl
parents: 1397
diff changeset
566
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
567 if (v != vendor) continue;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
568
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
569 // Check that device matches.
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
570 if (d == device) {
1478
5dd2b854cc32 Restore 'found it' message - conditionally - from David Vrabel
gthomas
parents: 1467
diff changeset
571 #ifdef CYGPKG_IO_PCI_DEBUG
5dd2b854cc32 Restore 'found it' message - conditionally - from David Vrabel
gthomas
parents: 1467
diff changeset
572 diag_printf("Found it!\n");
5dd2b854cc32 Restore 'found it' message - conditionally - from David Vrabel
gthomas
parents: 1467
diff changeset
573 #endif
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
574 *devid = new_devid;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
575 return true;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
576 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
577 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
578
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
579 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
580 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
581
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
582 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
583 cyg_pci_find_class( cyg_uint32 dev_class, cyg_pci_device_id *devid )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
584 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
585 // Scan entire bus, check for matches on valid devices.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
586 while (cyg_pci_find_next(*devid, devid)) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
587 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(*devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
588 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(*devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
589 cyg_uint32 c;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
590
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
591 // Check that class code matches.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
592 cyg_pcihw_read_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
593 CYG_PCI_CFG_CLASS_REV, &c);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
594 c >>= 8;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
595 if (c == dev_class)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
596 return true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
597 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
598
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
599 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
600 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
601
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
602 cyg_bool
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
603 cyg_pci_find_matching( cyg_pci_match_func *matchp,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
604 void * match_callback_data,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
605 cyg_pci_device_id *devid )
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
606 {
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
607 cyg_pci_device_id new_devid = *devid;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
608
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
609 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
610 diag_printf("cyg_pci_find_matching - func is at %x\n", (unsigned int)matchp);
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
611 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
612 // Scan entire bus, check for matches on valid devices.
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
613 while (cyg_pci_find_next(new_devid, &new_devid)) {
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
614 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(new_devid);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
615 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(new_devid);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
616 cyg_uint16 v, d;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
617 cyg_uint32 c;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
618
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
619 // Check that vendor, device and class match.
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
620 cyg_pcihw_read_config_uint16(bus, devfn,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
621 CYG_PCI_CFG_VENDOR, &v);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
622 cyg_pcihw_read_config_uint16(bus, devfn,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
623 CYG_PCI_CFG_DEVICE, &d);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
624 cyg_pcihw_read_config_uint32(bus, devfn,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
625 CYG_PCI_CFG_CLASS_REV, &c);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
626 c >>= 8;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
627 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
628 diag_printf("... PCI vendor = %x, device = %x, class %x\n", v, d, c);
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
629 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
630 // Check that device matches as the caller desires:
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
631 if ( (*matchp)(v, d, c, match_callback_data) ) {
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
632 *devid = new_devid;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
633 return true;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
634 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
635 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
636
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
637 return false;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
638 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
639
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
640 //------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
641 // Resource Allocation
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
642
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
643 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
644 cyg_pci_set_memory_base(CYG_PCI_ADDRESS64 base)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
645 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
646 cyg_pci_memory_base = base;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
647 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
648
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
649 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
650 cyg_pci_set_io_base(CYG_PCI_ADDRESS32 base)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
651 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
652 cyg_pci_io_base = base;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
653 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
654
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
655 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
656 cyg_pci_configure_device( cyg_pci_device *dev_info )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
657 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
658 int bar;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
659 cyg_uint32 flags;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
660 cyg_bool ret = true;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
661
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
662 // If device is already active, just return true as
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
663 // cyg_pci_get_device_info has presumably filled in
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
664 // the base_map already.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
665 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) != 0)
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
666 return true;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
667
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
668 if (dev_info->num_bars > 0) {
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
669 for (bar = 0; bar < CYG_PCI_MAX_BAR; bar++) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
670 if (!dev_info->base_address[bar]) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
671 continue;
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
672 }
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
673 flags = dev_info->base_size[bar];
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
674
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
675 ret = false;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
676
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
677 if ((flags & CYG_PCI_CFG_BAR_SPACE_MASK) == CYG_PCI_CFG_BAR_SPACE_MEM){
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
678 ret |= cyg_pci_allocate_memory(dev_info, bar,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
679 &cyg_pci_memory_base);
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
680
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
681 // If this is a 64bit memory region, skip the next bar
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
682 // since it will contain the top 32 bits.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
683 if (flags & CYG_PRI_CFG_BAR_MEM_TYPE_64)
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
684 bar++;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
685 } else
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
686 ret |= cyg_pci_allocate_io(dev_info, bar, &cyg_pci_io_base);
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
687
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
688 if (!ret)
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
689 return ret;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
690 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
691 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
692
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
693 cyg_pci_translate_interrupt(dev_info, &dev_info->hal_vector);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
694
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
695 return ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
696 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
697
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
698 // This is the function that handles resource allocation. It doesn't
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
699 // affect the device state.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
700 // Should not be called with top32bit-bar of a 64bit pair.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
701 inline cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
702 cyg_pci_allocate_memory_priv( cyg_pci_device *dev_info, cyg_uint32 bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
703 CYG_PCI_ADDRESS64 *base,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
704 CYG_PCI_ADDRESS64 *assigned_addr)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
705 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
706 cyg_uint32 mem_type, flags;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
707 CYG_PCI_ADDRESS64 size, aligned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
708
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
709 // Get the probed size and flags
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
710 flags = dev_info->base_size[bar];
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
711
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
712 // Decode size
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
713 size = (CYG_PCI_ADDRESS64) ((~(flags & CYG_PRI_CFG_BAR_MEM_MASK))+1);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
714
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
715 // Calculate address we will assign the device.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
716 // This can be made more clever, specifically:
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
717 // 1) The lowest 1MB should be reserved for devices with 1M memory type.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
718 // : Needs to be handled.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
719 // 2) The low 32bit space should be reserved for devices with 32bit type.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
720 // : With the usual handful of devices it is unlikely that the
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
721 // low 4GB space will become full.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
722 // 3) A bitmap can be used to avoid fragmentation.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
723 // : Again, unlikely to be necessary.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
724 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
725 // For now, simply align to required size.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
726 aligned_addr = (*base+size-1) & ~(size-1);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
727
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
728 // Is the request for memory space?
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
729 if (CYG_PCI_CFG_BAR_SPACE_MEM != (flags & CYG_PCI_CFG_BAR_SPACE_MASK))
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
730 return false;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
731
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
732 // Check type of memory requested...
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
733 mem_type = CYG_PRI_CFG_BAR_MEM_TYPE_MASK & flags;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
734
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
735 // We don't handle <1MB devices optimally yet.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
736 if (CYG_PRI_CFG_BAR_MEM_TYPE_1M == mem_type
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
737 && (aligned_addr + size) > 1024*1024)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
738 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
739
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
740 // Update the resource pointer and return values.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
741 *base = aligned_addr+size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
742 *assigned_addr = aligned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
743
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
744 dev_info->base_map[bar] = (cyg_uint32)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
745 (aligned_addr+HAL_PCI_PHYSICAL_MEMORY_BASE) & 0xffffffff;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
746
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
747 // If a 64bit region, store upper 32 bits in the next bar.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
748 // Note: The CPU is not necessarily able to access the region
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
749 // linearly - it may have to do it in segments. Driver must handle that.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
750 if (CYG_PRI_CFG_BAR_MEM_TYPE_64 == mem_type) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
751 dev_info->base_map[bar+1] = (cyg_uint32)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
752 ((aligned_addr+HAL_PCI_PHYSICAL_MEMORY_BASE) >> 32) & 0xffffffff;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
753 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
754
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
755 return true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
756 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
757
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
758 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
759 cyg_pci_allocate_memory( cyg_pci_device *dev_info, cyg_uint32 bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
760 CYG_PCI_ADDRESS64 *base)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
761 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
762 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(dev_info->devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
763 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(dev_info->devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
764 CYG_PCI_ADDRESS64 assigned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
765 cyg_bool ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
766
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
767 // Check that device is inactive.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
768 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) != 0)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
769 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
770
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
771 // Allocate memory space for the device.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
772 ret = cyg_pci_allocate_memory_priv(dev_info, bar, base, &assigned_addr);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
773
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
774 if (ret) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
775 // Map the device and update the BAR in the dev_info structure.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
776 cyg_pcihw_write_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
777 CYG_PCI_CFG_BAR_BASE+4*bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
778 (cyg_uint32)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
779 (assigned_addr & 0xffffffff));
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
780 cyg_pcihw_read_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
781 CYG_PCI_CFG_BAR_BASE+4*bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
782 &dev_info->base_address[bar]);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
783
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
784 // Handle upper 32 bits if necessary.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
785 if (dev_info->base_size[bar] & CYG_PRI_CFG_BAR_MEM_TYPE_64) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
786 cyg_pcihw_write_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
787 CYG_PCI_CFG_BAR_BASE+4*(bar+1),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
788 (cyg_uint32)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
789 ((assigned_addr >> 32)& 0xffffffff));
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
790 cyg_pcihw_read_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
791 CYG_PCI_CFG_BAR_BASE+4*(bar+1),
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
792 &dev_info->base_address[bar+1]);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
793 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
794 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
795
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
796 return ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
797 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
798
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
799 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
800 cyg_pci_allocate_io_priv( cyg_pci_device *dev_info, cyg_uint32 bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
801 CYG_PCI_ADDRESS32 *base,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
802 CYG_PCI_ADDRESS32 *assigned_addr)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
803 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
804 cyg_uint32 flags, size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
805 CYG_PCI_ADDRESS32 aligned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
806
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
807 // Get the probed size and flags
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
808 flags = dev_info->base_size[bar];
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
809
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
810 // Decode size
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
811 size = (~(flags & CYG_PRI_CFG_BAR_IO_MASK))+1;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
812
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
813 // Calculate address we will assign the device.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
814 // This can be made more clever.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
815 // For now, simply align to required size.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
816 aligned_addr = (*base+size-1) & ~(size-1);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
817
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
818 // Is the request for IO space?
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
819 if (CYG_PCI_CFG_BAR_SPACE_IO != (flags & CYG_PCI_CFG_BAR_SPACE_MASK))
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
820 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
821
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
822 // Update the resource pointer and return values.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
823 *base = aligned_addr+size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
824 dev_info->base_map[bar] = aligned_addr+HAL_PCI_PHYSICAL_IO_BASE;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
825 *assigned_addr = aligned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
826
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
827 return true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
828 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
829
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
830
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
831 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
832 cyg_pci_allocate_io( cyg_pci_device *dev_info, cyg_uint32 bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
833 CYG_PCI_ADDRESS32 *base)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
834 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
835 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(dev_info->devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
836 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(dev_info->devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
837 CYG_PCI_ADDRESS32 assigned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
838 cyg_bool ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
839
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
840 // Check that device is inactive.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
841 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) != 0)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
842 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
843
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
844 // Allocate IO space for the device.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
845 ret = cyg_pci_allocate_io_priv(dev_info, bar, base, &assigned_addr);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
846
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
847 if (ret) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
848 // Map the device and update the BAR in the dev_info structure.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
849 cyg_pcihw_write_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
850 CYG_PCI_CFG_BAR_BASE+4*bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
851 assigned_addr);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
852 cyg_pcihw_read_config_uint32(bus, devfn,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
853 CYG_PCI_CFG_BAR_BASE+4*bar,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
854 &dev_info->base_address[bar]);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
855 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
856
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
857 return ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
858 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
859
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
860 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
861 cyg_pci_translate_interrupt( cyg_pci_device *dev_info,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
862 CYG_ADDRWORD *vec )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
863 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
864 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(dev_info->devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
865 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(dev_info->devid);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
866
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
867 return cyg_pcihw_translate_interrupt(bus, devfn, vec);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
868 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
869
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
870
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
871 // Initialize devices on a given bus and all subordinate busses.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
872 cyg_bool
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
873 cyg_pci_configure_bus( cyg_uint8 bus,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
874 cyg_uint8 *next_bus )
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
875 {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
876 cyg_uint8 devfn, header_type;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
877 cyg_pci_device_id devid;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
878 cyg_pci_device dev_info;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
879
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
880 CYG_PCI_ADDRESS64 mem_start, mem_limit, mem_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
881 CYG_PCI_ADDRESS32 io_start, io_limit, io_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
882
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
883 // Scan only this bus for valid devices.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
884 devid = CYG_PCI_DEV_MAKE_ID(bus, 0) | CYG_PCI_NULL_DEVFN;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
885
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
886 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
887 diag_printf("Configuring bus %d.\n", bus);
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
888 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
889
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
890 while (cyg_pci_find_next(devid, &devid) && bus == CYG_PCI_DEV_GET_BUS(devid)) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
891
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
892 devfn = CYG_PCI_DEV_GET_DEVFN(devid);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
893
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
894 // Get the device info
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
895 cyg_pci_get_device_info(devid, &dev_info);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
896
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
897 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
898 diag_printf("\n");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
899 diag_printf("Configuring PCI Bus : %d\n", bus);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
900 diag_printf(" PCI Device: %d\n", CYG_PCI_DEV_GET_DEV(devfn));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
901 diag_printf(" PCI Func : %d\n", CYG_PCI_DEV_GET_FN(devfn));
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
902 diag_printf(" Vendor Id : 0x%08X\n", dev_info.vendor);
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
903 diag_printf(" Device Id : 0x%08X\n", dev_info.device);
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
904 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
905
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
906 header_type = dev_info.header_type & CYG_PCI_CFG_HEADER_TYPE_MASK;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
907
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
908 // Check for supported header types.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
909 if (header_type != CYG_PCI_HEADER_NORMAL &&
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
910 header_type != CYG_PCI_HEADER_BRIDGE) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
911 CYG_FAIL("Unsupported PCI header type");
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
912 continue;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
913 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
914
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
915 // Only PCI-to-PCI bridges
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
916 if (header_type == CYG_PCI_HEADER_BRIDGE &&
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
917 (dev_info.class_rev >> 8) != CYG_PCI_CLASS_BRIDGE_PCI_PCI) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
918 CYG_FAIL("Unsupported PCI bridge class");
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
919 continue;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
920 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
921
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
922 // Configure the base registers
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
923 if (!cyg_pci_configure_device(&dev_info)) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
924 // Apparently out of resources.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
925 CYG_FAIL("cyg_pci_configure_device failed");
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
926 break;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
927 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
928
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
929 // Activate non-bridge devices.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
930 if (header_type != CYG_PCI_HEADER_BRIDGE) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
931 dev_info.command |= (CYG_PCI_CFG_COMMAND_IO // enable I/O space
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
932 | CYG_PCI_CFG_COMMAND_MEMORY // enable memory space
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
933 | CYG_PCI_CFG_COMMAND_MASTER); // enable bus master
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
934 cyg_pci_write_config_uint16(dev_info.devid, CYG_PCI_CFG_COMMAND, dev_info.command);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
935 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
936 // Bridge Configuration
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
937
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
938 // Set up the bus numbers that define the bridge
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
939 dev_info.header.bridge.pri_bus = bus;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
940 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_PRI_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
941 dev_info.header.bridge.pri_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
942
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
943 dev_info.header.bridge.sec_bus = *next_bus;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
944 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SEC_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
945 dev_info.header.bridge.sec_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
946
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
947 // Temporarily set to maximum so config cycles get passed along.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
948 dev_info.header.bridge.sub_bus = CYG_PCI_MAX_BUS - 1;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
949 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SUB_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
950 dev_info.header.bridge.sub_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
951
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
952 // increment bus counter
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
953 *next_bus += 1;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
954
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
955 // To figure the sizes of the memory and I/O windows, save the
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
956 // current base of memory and I/O before configuring the bus
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
957 // or busses on the secondary side of the bridge. After the
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
958 // secondary side is configured, the difference between the
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
959 // current values and saved values will tell the size.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
960
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
961 // For bridges, the memory window must start and end on a 1M
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
962 // boundary and the I/O window must start and end on a 4K
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
963 // boundary. We round up the mem and I/O allocation bases
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
964 // to appropriate boundaries before configuring the secondary
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
965 // bus. Save the pre-rounded values in case no mem or I/O
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
966 // is needed we can recover any space lost due to rounding.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
967
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
968 // round up start of PCI memory space to a 1M boundary
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
969 mem_base = cyg_pci_memory_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
970 cyg_pci_memory_base += 0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
971 cyg_pci_memory_base &= ~0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
972 mem_start = cyg_pci_memory_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
973
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
974 // round up start of PCI I/O space to a 4 Kbyte start address
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
975 io_base = cyg_pci_io_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
976 cyg_pci_io_base += 0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
977 cyg_pci_io_base &= ~0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
978 io_start = cyg_pci_io_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
979
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
980 // configure the subordinate PCI bus
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
981 cyg_pci_configure_bus (dev_info.header.bridge.sec_bus, next_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
982
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
983 // set subordinate bus number to last assigned bus number
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
984 dev_info.header.bridge.sub_bus = *next_bus - 1;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
985 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SUB_BUS,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
986 dev_info.header.bridge.sub_bus);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
987
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
988 // Did sub bus configuration use any I/O?
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
989 if (cyg_pci_io_base > io_start) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
990
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
991 // round up end of bridge's I/O space to a 4K boundary
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
992 cyg_pci_io_base += 0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
993 cyg_pci_io_base &= ~0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
994 io_limit = cyg_pci_io_base - 0x1000;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
995
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
996 // Enable I/O cycles across bridge
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
997 dev_info.command |= CYG_PCI_CFG_COMMAND_IO;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
998
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
999 // 32 Bit I/O?
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1000 if ((dev_info.header.bridge.io_base & 0x0f) == 0x01) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1001 // I/O Base Upper 16 Bits Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1002 dev_info.header.bridge.io_base_upper16 = io_start >> 16;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1003 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_IO_BASE_UPPER16,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1004 dev_info.header.bridge.io_base_upper16);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1005 // I/O Limit Upper 16 Bits Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1006 dev_info.header.bridge.io_limit_upper16 = io_limit >> 16;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1007 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_IO_LIMIT_UPPER16,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1008 dev_info.header.bridge.io_limit_upper16);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1009 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1010
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1011 // I/O Base Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1012 dev_info.header.bridge.io_base = (io_start & 0xf000) >> 8;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1013 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_IO_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1014 dev_info.header.bridge.io_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1015 // I/O Limit Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1016 dev_info.header.bridge.io_limit = (io_limit & 0xf000) >> 8;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1017 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_IO_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1018 dev_info.header.bridge.io_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1019
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1020 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1021 // No I/O space used on secondary bus.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1022 // Recover any space lost on unnecessary rounding
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1023 cyg_pci_io_base = io_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1024 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1025
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1026 // Did sub bus configuration use any memory?
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1027 if (cyg_pci_memory_base > mem_start) {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1028
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1029 // round up end of bridge's PCI memory space to a 1M boundary
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1030 cyg_pci_memory_base += 0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1031 cyg_pci_memory_base &= ~0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1032 mem_limit = cyg_pci_memory_base - 0x100000;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1033
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1034 // Enable memory cycles across bridge
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1035 dev_info.command |= CYG_PCI_CFG_COMMAND_MEMORY;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1036
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1037 // Memory Base Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1038 dev_info.header.bridge.mem_base = (mem_start >> 16) & 0xfff0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1039 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1040 dev_info.header.bridge.mem_base);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1041
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1042 // Memory Limit Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1043 dev_info.header.bridge.mem_limit = (mem_limit >> 16) & 0xfff0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1044 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1045 dev_info.header.bridge.mem_limit);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1046
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1047 // Prefetchable memory not yet supported across bridges.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1048 // Disable by making limit < base
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1049 {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1050 cyg_uint16 tmp_word;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1051
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1052 tmp_word = 0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1053 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_LIMIT,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1054 tmp_word);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1055 tmp_word = 0xfff0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1056 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_BASE,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1057 tmp_word);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1058 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1059 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1060 // No memory space used on secondary bus.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1061 // Recover any space lost on unnecessary rounding
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1062 cyg_pci_memory_base = mem_base;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1063 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1064
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1065 // Setup the bridge command register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1066 dev_info.command |= CYG_PCI_CFG_COMMAND_MASTER;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1067 dev_info.command |= CYG_PCI_CFG_COMMAND_SERR;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1068 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_COMMAND,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1069 dev_info.command);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1070
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1071 /* Setup the Bridge Control Register */
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1072 dev_info.header.bridge.control |= CYG_PCI_CFG_BRIDGE_CTL_PARITY;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1073 dev_info.header.bridge.control |= CYG_PCI_CFG_BRIDGE_CTL_SERR;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1074 dev_info.header.bridge.control |= CYG_PCI_CFG_BRIDGE_CTL_MASTER;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1075 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_BRIDGE_CONTROL,
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1076 dev_info.header.bridge.control);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1077 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1078 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1079 #ifdef CYGPKG_IO_PCI_DEBUG
182
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
1080 diag_printf("Finished configuring bus %d.\n", bus);
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1081 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1082
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1083 return true;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1084 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1085
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1086
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1087 #endif // ifdef CYG_PCI_PRESENT
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1088
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1089 //-----------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1090 // end of pci.c