Mercurial > flash_v2
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 |
| 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 | 69 static CYG_PCI_ADDRESS64 cyg_pci_memory_base; |
| 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 | 126 // Clear out all address info (the code below stops short) |
| 127 for (i = 0; i < CYG_PCI_MAX_BAR; i++) { | |
| 128 dev_info->base_map[i] = 0xffffffff; | |
| 129 dev_info->base_address[i] = 0; | |
| 130 dev_info->base_size[i] = 0; | |
| 131 } | |
| 132 | |
| 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 | 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 | 204 bar &= CYG_PRI_CFG_BAR_IO_MASK; |
| 205 if ((bar < 0xFF000000) && (bar >= cyg_pci_io_base)) { | |
| 206 // Assume that this device owns 512 'registers' | |
| 207 cyg_pci_io_base = bar + 0x200; | |
| 208 #ifdef CYGPKG_IO_PCI_DEBUG | |
| 209 diag_printf("Update I/O base to %x from bar: %d\n", cyg_pci_io_base, i); | |
| 210 #endif | |
| 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 | 217 |
| 218 if ((tmp_addr < 0xFF000000) && (tmp_addr >= cyg_pci_memory_base)) { | |
| 219 // Assume that this device owns 1M | |
| 220 cyg_pci_memory_base = tmp_addr + 0x100000; | |
| 221 #ifdef CYGPKG_IO_PCI_DEBUG | |
| 222 diag_printf("Update memory base to %llx from bar: %d\n", cyg_pci_memory_base, i); | |
| 223 #endif | |
| 224 } | |
| 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 |
