annotate packages/io/pci/current/src/pci.c @ 1467:8ad4d297cbf8

* src/pci.c (cyg_pci_get_device_info): Added fix for devices that only implement the bottom 16 bits of an IO BAR. This is allowed by the standard but is very rare and mostly present in older devices only. Without this cyg_pci_allocate_io_priv() gets confused.
author nickg
date Wed, 14 Jan 2004 15:39:43 +0000
parents efdacf0f8122
children 5dd2b854cc32
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) {
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
571 *devid = new_devid;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
572 return true;
138
289bf90c6a9b Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents: 136
diff changeset
573 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
574 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
575
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
576 return false;
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 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
580 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
581 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
582 // 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
583 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
584 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
585 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
586 cyg_uint32 c;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
587
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
588 // Check that class code matches.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
589 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
590 CYG_PCI_CFG_CLASS_REV, &c);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
591 c >>= 8;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
592 if (c == dev_class)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
593 return true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
594 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
595
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
596 return false;
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
147
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
599 cyg_bool
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
600 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
601 void * match_callback_data,
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
602 cyg_pci_device_id *devid )
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
603 {
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
604 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
605
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
606 #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
607 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
608 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
609 // 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
610 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
611 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
612 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
613 cyg_uint16 v, d;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
614 cyg_uint32 c;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
615
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
616 // 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
617 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
618 CYG_PCI_CFG_VENDOR, &v);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
619 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
620 CYG_PCI_CFG_DEVICE, &d);
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
621 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
622 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
623 c >>= 8;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
624 #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
625 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
626 #endif
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
627 // 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
628 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
629 *devid = new_devid;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
630 return true;
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
631 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
632 }
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
633
d397fc472bcf Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents: 143
diff changeset
634 return false;
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
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
637 //------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
638 // Resource Allocation
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
639
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
640 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
641 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
642 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
643 cyg_pci_memory_base = base;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
644 }
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 void
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
647 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
648 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
649 cyg_pci_io_base = base;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
650 }
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_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
653 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
654 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
655 int bar;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
656 cyg_uint32 flags;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
657 cyg_bool ret = true;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
658
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
659 // 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
660 // 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
661 // the base_map already.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
662 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
663 return true;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
664
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
665 if (dev_info->num_bars > 0) {
1366
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
666 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
667 if (!dev_info->base_address[bar]) {
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
668 continue;
97946fc092d5 * src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents: 1254
diff changeset
669 }
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
670 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
671
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
672 ret = false;
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
673
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
674 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
675 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
676 &cyg_pci_memory_base);
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
677
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
678 // 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
679 // 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
680 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
681 bar++;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
682 } else
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
683 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
684
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
685 if (!ret)
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
686 return ret;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
687 }
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
688 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
689
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
690 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
691
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
692 return ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
693 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
694
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
695 // 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
696 // affect the device state.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
697 // 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
698 inline cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
699 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
700 CYG_PCI_ADDRESS64 *base,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
701 CYG_PCI_ADDRESS64 *assigned_addr)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
702 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
703 cyg_uint32 mem_type, flags;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
704 CYG_PCI_ADDRESS64 size, aligned_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 // Get the probed size and flags
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
707 flags = dev_info->base_size[bar];
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 // Decode size
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
710 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
711
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
712 // 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
713 // 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
714 // 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
715 // : Needs to be handled.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
716 // 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
717 // : 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
718 // low 4GB space will become full.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
719 // 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
720 // : Again, unlikely to be necessary.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
721 //
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
722 // 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
723 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
724
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
725 // Is the request for memory space?
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
726 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
727 return false;
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
728
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
729 // Check type of memory requested...
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
730 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
731
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
732 // 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
733 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
734 && (aligned_addr + size) > 1024*1024)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
735 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
736
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
737 // 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
738 *base = aligned_addr+size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
739 *assigned_addr = aligned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
740
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
741 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
742 (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
743
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
744 // 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
745 // 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
746 // 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
747 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
748 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
749 ((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
750 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
751
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
752 return true;
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 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
756 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
757 CYG_PCI_ADDRESS64 *base)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
758 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
759 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
760 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
761 CYG_PCI_ADDRESS64 assigned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
762 cyg_bool ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
763
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
764 // Check that device is inactive.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
765 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
766 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
767
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
768 // Allocate memory space for the device.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
769 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
770
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
771 if (ret) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
772 // 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
773 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
774 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
775 (cyg_uint32)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
776 (assigned_addr & 0xffffffff));
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
777 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
778 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
779 &dev_info->base_address[bar]);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
780
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
781 // Handle upper 32 bits if necessary.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
782 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
783 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
784 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
785 (cyg_uint32)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
786 ((assigned_addr >> 32)& 0xffffffff));
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
787 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
788 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
789 &dev_info->base_address[bar+1]);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
790 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
791 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
792
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
793 return ret;
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 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
797 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
798 CYG_PCI_ADDRESS32 *base,
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
799 CYG_PCI_ADDRESS32 *assigned_addr)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
800 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
801 cyg_uint32 flags, size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
802 CYG_PCI_ADDRESS32 aligned_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 // Get the probed size and flags
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
805 flags = dev_info->base_size[bar];
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 // Decode size
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
808 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
809
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
810 // 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
811 // This can be made more clever.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
812 // 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
813 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
814
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
815 // Is the request for IO space?
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
816 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
817 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
818
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
819 // 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
820 *base = aligned_addr+size;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
821 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
822 *assigned_addr = aligned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
823
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
824 return true;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
825 }
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
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
828 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
829 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
830 CYG_PCI_ADDRESS32 *base)
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
831 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
832 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
833 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
834 CYG_PCI_ADDRESS32 assigned_addr;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
835 cyg_bool ret;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
836
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
837 // Check that device is inactive.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
838 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
839 return false;
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
840
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
841 // Allocate IO space for the device.
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
842 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
843
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
844 if (ret) {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
845 // 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
846 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
847 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
848 assigned_addr);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
849 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
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 &dev_info->base_address[bar]);
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
852 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
853
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
854 return ret;
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 cyg_bool
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
858 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
859 CYG_ADDRWORD *vec )
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
860 {
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
861 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
862 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
863
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
864 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
865 }
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
866
136
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
867
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
868 // 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
869 cyg_bool
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
870 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
871 cyg_uint8 *next_bus )
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
872 {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
873 cyg_uint8 devfn, header_type;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
874 cyg_pci_device_id devid;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
875 cyg_pci_device dev_info;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
876
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
877 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
878 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
879
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
880 // 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
881 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
882
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
883 #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
884 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
885 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
886
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
887 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
888
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
889 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
890
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
891 // Get the device info
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
892 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
893
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
894 #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
895 diag_printf("\n");
f62680ef1804 Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents: 148
diff changeset
896 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
897 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
898 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
899 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
900 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
901 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
902
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
903 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
904
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
905 // Check for supported header types.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
906 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
907 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
908 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
909 continue;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
910 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
911
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
912 // Only PCI-to-PCI bridges
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
913 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
914 (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
915 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
916 continue;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
917 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
918
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
919 // Configure the base registers
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
920 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
921 // Apparently out of resources.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
922 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
923 break;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
924 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
925
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
926 // Activate non-bridge devices.
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
927 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
928 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
929 | 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
930 | 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
931 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
932 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
933 // Bridge Configuration
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
934
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
935 // 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
936 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
937 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
938 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
939
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
940 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
941 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
942 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
943
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
944 // 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
945 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
946 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
947 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
948
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
949 // increment bus counter
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
950 *next_bus += 1;
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 // 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
953 // 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
954 // 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
955 // 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
956 // 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
957
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
958 // 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
959 // 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
960 // 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
961 // 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
962 // 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
963 // 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
964
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
965 // 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
966 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
967 cyg_pci_memory_base += 0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
968 cyg_pci_memory_base &= ~0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
969 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
970
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
971 // 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
972 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
973 cyg_pci_io_base += 0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
974 cyg_pci_io_base &= ~0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
975 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
976
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
977 // configure the subordinate PCI bus
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
978 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
979
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
980 // 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
981 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
982 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
983 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
984
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
985 // 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
986 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
987
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
988 // 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
989 cyg_pci_io_base += 0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
990 cyg_pci_io_base &= ~0xfff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
991 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
992
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
993 // 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
994 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
995
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
996 // 32 Bit I/O?
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
997 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
998 // 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
999 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
1000 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
1001 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
1002 // 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
1003 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
1004 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
1005 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
1006 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1007
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1008 // I/O Base Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1009 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
1010 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
1011 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
1012 // I/O Limit Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1013 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
1014 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
1015 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
1016
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1017 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1018 // 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
1019 // 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
1020 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
1021 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1022
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1023 // 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
1024 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
1025
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1026 // 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
1027 cyg_pci_memory_base += 0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1028 cyg_pci_memory_base &= ~0xfffff;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1029 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
1030
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1031 // Enable memory cycles across bridge
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1032 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
1033
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1034 // Memory Base Register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1035 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
1036 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
1037 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
1038
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1039 // Memory Limit Register
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_limit = (mem_limit >> 16) & 0xfff0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1041 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
1042 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
1043
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1044 // 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
1045 // Disable by making limit < base
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 cyg_uint16 tmp_word;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1048
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1049 tmp_word = 0;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1050 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
1051 tmp_word);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1052 tmp_word = 0xfff0;
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_BASE,
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 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1056 } else {
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1057 // 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
1058 // 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
1059 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
1060 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1061
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1062 // Setup the bridge command register
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1063 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
1064 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
1065 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
1066 dev_info.command);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1067
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1068 /* Setup the Bridge Control Register */
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1069 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
1070 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
1071 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
1072 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
1073 dev_info.header.bridge.control);
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1074 }
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1075 }
143
6b5f480c6929 Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents: 138
diff changeset
1076 #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
1077 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
1078 #endif
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1079
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1080 return true;
a9ac27ec7abc Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents: 66
diff changeset
1081 }
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
52
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1084 #endif // ifdef CYG_PCI_PRESENT
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1085
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1086 //-----------------------------------------------------------------------------
7b011d1ab50f Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff changeset
1087 // end of pci.c