Mercurial > flash_v2
annotate packages/io/pci/current/src/pci.c @ 1777:c16341b1bac6 default tip
* Added execute permissions to files missed in conversion from CVS
| author | alexs |
|---|---|
| date | Mon, 12 Oct 2009 02:26:09 +0100 |
| parents | 5dd2b854cc32 |
| children |
| 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) { |
|
1478
5dd2b854cc32
Restore 'found it' message - conditionally - from David Vrabel
gthomas
parents:
1467
diff
changeset
|
571 #ifdef CYGPKG_IO_PCI_DEBUG |
|
5dd2b854cc32
Restore 'found it' message - conditionally - from David Vrabel
gthomas
parents:
1467
diff
changeset
|
572 diag_printf("Found it!\n"); |
|
5dd2b854cc32
Restore 'found it' message - conditionally - from David Vrabel
gthomas
parents:
1467
diff
changeset
|
573 #endif |
|
138
289bf90c6a9b
Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents:
136
diff
changeset
|
574 *devid = new_devid; |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
575 return true; |
|
138
289bf90c6a9b
Merge from eCos master repository on 2000-11-24-06:43:05-GMT
jlarmour
parents:
136
diff
changeset
|
576 } |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
577 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
578 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
579 return false; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
580 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
581 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
582 cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
583 cyg_pci_find_class( cyg_uint32 dev_class, cyg_pci_device_id *devid ) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
584 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
585 // Scan entire bus, check for matches on valid devices. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
586 while (cyg_pci_find_next(*devid, devid)) { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
587 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(*devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
588 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(*devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
589 cyg_uint32 c; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
590 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
591 // Check that class code matches. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
592 cyg_pcihw_read_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
593 CYG_PCI_CFG_CLASS_REV, &c); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
594 c >>= 8; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
595 if (c == dev_class) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
596 return true; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
597 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
598 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
599 return false; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
600 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
601 |
|
147
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
602 cyg_bool |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
603 cyg_pci_find_matching( cyg_pci_match_func *matchp, |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
604 void * match_callback_data, |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
605 cyg_pci_device_id *devid ) |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
606 { |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
607 cyg_pci_device_id new_devid = *devid; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
608 |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
609 #ifdef CYGPKG_IO_PCI_DEBUG |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
610 diag_printf("cyg_pci_find_matching - func is at %x\n", (unsigned int)matchp); |
|
147
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
611 #endif |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
612 // Scan entire bus, check for matches on valid devices. |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
613 while (cyg_pci_find_next(new_devid, &new_devid)) { |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
614 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(new_devid); |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
615 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(new_devid); |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
616 cyg_uint16 v, d; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
617 cyg_uint32 c; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
618 |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
619 // Check that vendor, device and class match. |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
620 cyg_pcihw_read_config_uint16(bus, devfn, |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
621 CYG_PCI_CFG_VENDOR, &v); |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
622 cyg_pcihw_read_config_uint16(bus, devfn, |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
623 CYG_PCI_CFG_DEVICE, &d); |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
624 cyg_pcihw_read_config_uint32(bus, devfn, |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
625 CYG_PCI_CFG_CLASS_REV, &c); |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
626 c >>= 8; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
627 #ifdef CYGPKG_IO_PCI_DEBUG |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
628 diag_printf("... PCI vendor = %x, device = %x, class %x\n", v, d, c); |
|
147
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
629 #endif |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
630 // Check that device matches as the caller desires: |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
631 if ( (*matchp)(v, d, c, match_callback_data) ) { |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
632 *devid = new_devid; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
633 return true; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
634 } |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
635 } |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
636 |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
637 return false; |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
638 } |
|
d397fc472bcf
Merge from eCos master repository on 2001-01-05-06:43:02-GMT
jlarmour
parents:
143
diff
changeset
|
639 |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
640 //------------------------------------------------------------------------ |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
641 // Resource Allocation |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
642 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
643 void |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
644 cyg_pci_set_memory_base(CYG_PCI_ADDRESS64 base) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
645 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
646 cyg_pci_memory_base = base; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
647 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
648 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
649 void |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
650 cyg_pci_set_io_base(CYG_PCI_ADDRESS32 base) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
651 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
652 cyg_pci_io_base = base; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
653 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
654 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
655 cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
656 cyg_pci_configure_device( cyg_pci_device *dev_info ) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
657 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
658 int bar; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
659 cyg_uint32 flags; |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
660 cyg_bool ret = true; |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
661 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
662 // If device is already active, just return true as |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
663 // cyg_pci_get_device_info has presumably filled in |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
664 // the base_map already. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
665 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) != 0) |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
666 return true; |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
667 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
668 if (dev_info->num_bars > 0) { |
|
1366
97946fc092d5
* src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents:
1254
diff
changeset
|
669 for (bar = 0; bar < CYG_PCI_MAX_BAR; bar++) { |
|
97946fc092d5
* src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents:
1254
diff
changeset
|
670 if (!dev_info->base_address[bar]) { |
|
97946fc092d5
* src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents:
1254
diff
changeset
|
671 continue; |
|
97946fc092d5
* src/pci.c : Additional changes in cyg_pci_get_device_info,
asl
parents:
1254
diff
changeset
|
672 } |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
673 flags = dev_info->base_size[bar]; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
674 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
675 ret = false; |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
676 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
677 if ((flags & CYG_PCI_CFG_BAR_SPACE_MASK) == CYG_PCI_CFG_BAR_SPACE_MEM){ |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
678 ret |= cyg_pci_allocate_memory(dev_info, bar, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
679 &cyg_pci_memory_base); |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
680 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
681 // If this is a 64bit memory region, skip the next bar |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
682 // since it will contain the top 32 bits. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
683 if (flags & CYG_PRI_CFG_BAR_MEM_TYPE_64) |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
684 bar++; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
685 } else |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
686 ret |= cyg_pci_allocate_io(dev_info, bar, &cyg_pci_io_base); |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
687 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
688 if (!ret) |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
689 return ret; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
690 } |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
691 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
692 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
693 cyg_pci_translate_interrupt(dev_info, &dev_info->hal_vector); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
694 |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
695 return ret; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
696 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
697 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
698 // This is the function that handles resource allocation. It doesn't |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
699 // affect the device state. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
700 // Should not be called with top32bit-bar of a 64bit pair. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
701 inline cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
702 cyg_pci_allocate_memory_priv( cyg_pci_device *dev_info, cyg_uint32 bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
703 CYG_PCI_ADDRESS64 *base, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
704 CYG_PCI_ADDRESS64 *assigned_addr) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
705 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
706 cyg_uint32 mem_type, flags; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
707 CYG_PCI_ADDRESS64 size, aligned_addr; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
708 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
709 // Get the probed size and flags |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
710 flags = dev_info->base_size[bar]; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
711 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
712 // Decode size |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
713 size = (CYG_PCI_ADDRESS64) ((~(flags & CYG_PRI_CFG_BAR_MEM_MASK))+1); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
714 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
715 // Calculate address we will assign the device. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
716 // This can be made more clever, specifically: |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
717 // 1) The lowest 1MB should be reserved for devices with 1M memory type. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
718 // : Needs to be handled. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
719 // 2) The low 32bit space should be reserved for devices with 32bit type. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
720 // : With the usual handful of devices it is unlikely that the |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
721 // low 4GB space will become full. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
722 // 3) A bitmap can be used to avoid fragmentation. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
723 // : Again, unlikely to be necessary. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
724 // |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
725 // For now, simply align to required size. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
726 aligned_addr = (*base+size-1) & ~(size-1); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
727 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
728 // Is the request for memory space? |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
729 if (CYG_PCI_CFG_BAR_SPACE_MEM != (flags & CYG_PCI_CFG_BAR_SPACE_MASK)) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
730 return false; |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
731 |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
732 // Check type of memory requested... |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
733 mem_type = CYG_PRI_CFG_BAR_MEM_TYPE_MASK & flags; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
734 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
735 // We don't handle <1MB devices optimally yet. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
736 if (CYG_PRI_CFG_BAR_MEM_TYPE_1M == mem_type |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
737 && (aligned_addr + size) > 1024*1024) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
738 return false; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
739 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
740 // Update the resource pointer and return values. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
741 *base = aligned_addr+size; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
742 *assigned_addr = aligned_addr; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
743 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
744 dev_info->base_map[bar] = (cyg_uint32) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
745 (aligned_addr+HAL_PCI_PHYSICAL_MEMORY_BASE) & 0xffffffff; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
746 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
747 // If a 64bit region, store upper 32 bits in the next bar. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
748 // Note: The CPU is not necessarily able to access the region |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
749 // linearly - it may have to do it in segments. Driver must handle that. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
750 if (CYG_PRI_CFG_BAR_MEM_TYPE_64 == mem_type) { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
751 dev_info->base_map[bar+1] = (cyg_uint32) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
752 ((aligned_addr+HAL_PCI_PHYSICAL_MEMORY_BASE) >> 32) & 0xffffffff; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
753 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
754 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
755 return true; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
756 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
757 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
758 cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
759 cyg_pci_allocate_memory( cyg_pci_device *dev_info, cyg_uint32 bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
760 CYG_PCI_ADDRESS64 *base) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
761 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
762 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(dev_info->devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
763 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(dev_info->devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
764 CYG_PCI_ADDRESS64 assigned_addr; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
765 cyg_bool ret; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
766 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
767 // Check that device is inactive. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
768 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) != 0) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
769 return false; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
770 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
771 // Allocate memory space for the device. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
772 ret = cyg_pci_allocate_memory_priv(dev_info, bar, base, &assigned_addr); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
773 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
774 if (ret) { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
775 // Map the device and update the BAR in the dev_info structure. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
776 cyg_pcihw_write_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
777 CYG_PCI_CFG_BAR_BASE+4*bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
778 (cyg_uint32) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
779 (assigned_addr & 0xffffffff)); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
780 cyg_pcihw_read_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
781 CYG_PCI_CFG_BAR_BASE+4*bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
782 &dev_info->base_address[bar]); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
783 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
784 // Handle upper 32 bits if necessary. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
785 if (dev_info->base_size[bar] & CYG_PRI_CFG_BAR_MEM_TYPE_64) { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
786 cyg_pcihw_write_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
787 CYG_PCI_CFG_BAR_BASE+4*(bar+1), |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
788 (cyg_uint32) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
789 ((assigned_addr >> 32)& 0xffffffff)); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
790 cyg_pcihw_read_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
791 CYG_PCI_CFG_BAR_BASE+4*(bar+1), |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
792 &dev_info->base_address[bar+1]); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
793 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
794 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
795 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
796 return ret; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
797 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
798 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
799 cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
800 cyg_pci_allocate_io_priv( cyg_pci_device *dev_info, cyg_uint32 bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
801 CYG_PCI_ADDRESS32 *base, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
802 CYG_PCI_ADDRESS32 *assigned_addr) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
803 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
804 cyg_uint32 flags, size; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
805 CYG_PCI_ADDRESS32 aligned_addr; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
806 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
807 // Get the probed size and flags |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
808 flags = dev_info->base_size[bar]; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
809 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
810 // Decode size |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
811 size = (~(flags & CYG_PRI_CFG_BAR_IO_MASK))+1; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
812 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
813 // Calculate address we will assign the device. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
814 // This can be made more clever. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
815 // For now, simply align to required size. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
816 aligned_addr = (*base+size-1) & ~(size-1); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
817 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
818 // Is the request for IO space? |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
819 if (CYG_PCI_CFG_BAR_SPACE_IO != (flags & CYG_PCI_CFG_BAR_SPACE_MASK)) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
820 return false; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
821 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
822 // Update the resource pointer and return values. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
823 *base = aligned_addr+size; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
824 dev_info->base_map[bar] = aligned_addr+HAL_PCI_PHYSICAL_IO_BASE; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
825 *assigned_addr = aligned_addr; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
826 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
827 return true; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
828 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
829 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
830 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
831 cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
832 cyg_pci_allocate_io( cyg_pci_device *dev_info, cyg_uint32 bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
833 CYG_PCI_ADDRESS32 *base) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
834 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
835 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(dev_info->devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
836 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(dev_info->devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
837 CYG_PCI_ADDRESS32 assigned_addr; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
838 cyg_bool ret; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
839 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
840 // Check that device is inactive. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
841 if ((dev_info->command & CYG_PCI_CFG_COMMAND_ACTIVE) != 0) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
842 return false; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
843 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
844 // Allocate IO space for the device. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
845 ret = cyg_pci_allocate_io_priv(dev_info, bar, base, &assigned_addr); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
846 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
847 if (ret) { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
848 // Map the device and update the BAR in the dev_info structure. |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
849 cyg_pcihw_write_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
850 CYG_PCI_CFG_BAR_BASE+4*bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
851 assigned_addr); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
852 cyg_pcihw_read_config_uint32(bus, devfn, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
853 CYG_PCI_CFG_BAR_BASE+4*bar, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
854 &dev_info->base_address[bar]); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
855 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
856 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
857 return ret; |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
858 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
859 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
860 cyg_bool |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
861 cyg_pci_translate_interrupt( cyg_pci_device *dev_info, |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
862 CYG_ADDRWORD *vec ) |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
863 { |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
864 cyg_uint8 bus = CYG_PCI_DEV_GET_BUS(dev_info->devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
865 cyg_uint8 devfn = CYG_PCI_DEV_GET_DEVFN(dev_info->devid); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
866 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
867 return cyg_pcihw_translate_interrupt(bus, devfn, vec); |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
868 } |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
869 |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
870 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
871 // Initialize devices on a given bus and all subordinate busses. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
872 cyg_bool |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
873 cyg_pci_configure_bus( cyg_uint8 bus, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
874 cyg_uint8 *next_bus ) |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
875 { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
876 cyg_uint8 devfn, header_type; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
877 cyg_pci_device_id devid; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
878 cyg_pci_device dev_info; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
879 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
880 CYG_PCI_ADDRESS64 mem_start, mem_limit, mem_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
881 CYG_PCI_ADDRESS32 io_start, io_limit, io_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
882 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
883 // Scan only this bus for valid devices. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
884 devid = CYG_PCI_DEV_MAKE_ID(bus, 0) | CYG_PCI_NULL_DEVFN; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
885 |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
138
diff
changeset
|
886 #ifdef CYGPKG_IO_PCI_DEBUG |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
887 diag_printf("Configuring bus %d.\n", bus); |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
888 #endif |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
889 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
890 while (cyg_pci_find_next(devid, &devid) && bus == CYG_PCI_DEV_GET_BUS(devid)) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
891 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
892 devfn = CYG_PCI_DEV_GET_DEVFN(devid); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
893 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
894 // Get the device info |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
895 cyg_pci_get_device_info(devid, &dev_info); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
896 |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
138
diff
changeset
|
897 #ifdef CYGPKG_IO_PCI_DEBUG |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
898 diag_printf("\n"); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
899 diag_printf("Configuring PCI Bus : %d\n", bus); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
900 diag_printf(" PCI Device: %d\n", CYG_PCI_DEV_GET_DEV(devfn)); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
901 diag_printf(" PCI Func : %d\n", CYG_PCI_DEV_GET_FN(devfn)); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
902 diag_printf(" Vendor Id : 0x%08X\n", dev_info.vendor); |
|
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
903 diag_printf(" Device Id : 0x%08X\n", dev_info.device); |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
904 #endif |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
905 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
906 header_type = dev_info.header_type & CYG_PCI_CFG_HEADER_TYPE_MASK; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
907 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
908 // Check for supported header types. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
909 if (header_type != CYG_PCI_HEADER_NORMAL && |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
910 header_type != CYG_PCI_HEADER_BRIDGE) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
911 CYG_FAIL("Unsupported PCI header type"); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
912 continue; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
913 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
914 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
915 // Only PCI-to-PCI bridges |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
916 if (header_type == CYG_PCI_HEADER_BRIDGE && |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
917 (dev_info.class_rev >> 8) != CYG_PCI_CLASS_BRIDGE_PCI_PCI) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
918 CYG_FAIL("Unsupported PCI bridge class"); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
919 continue; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
920 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
921 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
922 // Configure the base registers |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
923 if (!cyg_pci_configure_device(&dev_info)) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
924 // Apparently out of resources. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
925 CYG_FAIL("cyg_pci_configure_device failed"); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
926 break; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
927 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
928 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
929 // Activate non-bridge devices. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
930 if (header_type != CYG_PCI_HEADER_BRIDGE) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
931 dev_info.command |= (CYG_PCI_CFG_COMMAND_IO // enable I/O space |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
932 | CYG_PCI_CFG_COMMAND_MEMORY // enable memory space |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
933 | CYG_PCI_CFG_COMMAND_MASTER); // enable bus master |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
934 cyg_pci_write_config_uint16(dev_info.devid, CYG_PCI_CFG_COMMAND, dev_info.command); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
935 } else { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
936 // Bridge Configuration |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
937 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
938 // Set up the bus numbers that define the bridge |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
939 dev_info.header.bridge.pri_bus = bus; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
940 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_PRI_BUS, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
941 dev_info.header.bridge.pri_bus); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
942 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
943 dev_info.header.bridge.sec_bus = *next_bus; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
944 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SEC_BUS, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
945 dev_info.header.bridge.sec_bus); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
946 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
947 // Temporarily set to maximum so config cycles get passed along. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
948 dev_info.header.bridge.sub_bus = CYG_PCI_MAX_BUS - 1; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
949 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SUB_BUS, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
950 dev_info.header.bridge.sub_bus); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
951 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
952 // increment bus counter |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
953 *next_bus += 1; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
954 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
955 // To figure the sizes of the memory and I/O windows, save the |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
956 // current base of memory and I/O before configuring the bus |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
957 // or busses on the secondary side of the bridge. After the |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
958 // secondary side is configured, the difference between the |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
959 // current values and saved values will tell the size. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
960 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
961 // For bridges, the memory window must start and end on a 1M |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
962 // boundary and the I/O window must start and end on a 4K |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
963 // boundary. We round up the mem and I/O allocation bases |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
964 // to appropriate boundaries before configuring the secondary |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
965 // bus. Save the pre-rounded values in case no mem or I/O |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
966 // is needed we can recover any space lost due to rounding. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
967 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
968 // round up start of PCI memory space to a 1M boundary |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
969 mem_base = cyg_pci_memory_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
970 cyg_pci_memory_base += 0xfffff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
971 cyg_pci_memory_base &= ~0xfffff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
972 mem_start = cyg_pci_memory_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
973 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
974 // round up start of PCI I/O space to a 4 Kbyte start address |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
975 io_base = cyg_pci_io_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
976 cyg_pci_io_base += 0xfff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
977 cyg_pci_io_base &= ~0xfff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
978 io_start = cyg_pci_io_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
979 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
980 // configure the subordinate PCI bus |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
981 cyg_pci_configure_bus (dev_info.header.bridge.sec_bus, next_bus); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
982 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
983 // set subordinate bus number to last assigned bus number |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
984 dev_info.header.bridge.sub_bus = *next_bus - 1; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
985 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_SUB_BUS, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
986 dev_info.header.bridge.sub_bus); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
987 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
988 // Did sub bus configuration use any I/O? |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
989 if (cyg_pci_io_base > io_start) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
990 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
991 // round up end of bridge's I/O space to a 4K boundary |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
992 cyg_pci_io_base += 0xfff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
993 cyg_pci_io_base &= ~0xfff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
994 io_limit = cyg_pci_io_base - 0x1000; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
995 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
996 // Enable I/O cycles across bridge |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
997 dev_info.command |= CYG_PCI_CFG_COMMAND_IO; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
998 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
999 // 32 Bit I/O? |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1000 if ((dev_info.header.bridge.io_base & 0x0f) == 0x01) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1001 // I/O Base Upper 16 Bits Register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1002 dev_info.header.bridge.io_base_upper16 = io_start >> 16; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1003 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_IO_BASE_UPPER16, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1004 dev_info.header.bridge.io_base_upper16); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1005 // I/O Limit Upper 16 Bits Register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1006 dev_info.header.bridge.io_limit_upper16 = io_limit >> 16; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1007 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_IO_LIMIT_UPPER16, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1008 dev_info.header.bridge.io_limit_upper16); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1009 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1010 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1011 // I/O Base Register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1012 dev_info.header.bridge.io_base = (io_start & 0xf000) >> 8; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1013 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_IO_BASE, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1014 dev_info.header.bridge.io_base); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1015 // I/O Limit Register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1016 dev_info.header.bridge.io_limit = (io_limit & 0xf000) >> 8; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1017 cyg_pcihw_write_config_uint8(bus, devfn, CYG_PCI_CFG_IO_LIMIT, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1018 dev_info.header.bridge.io_limit); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1019 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1020 } else { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1021 // No I/O space used on secondary bus. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1022 // Recover any space lost on unnecessary rounding |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1023 cyg_pci_io_base = io_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1024 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1025 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1026 // Did sub bus configuration use any memory? |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1027 if (cyg_pci_memory_base > mem_start) { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1028 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1029 // round up end of bridge's PCI memory space to a 1M boundary |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1030 cyg_pci_memory_base += 0xfffff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1031 cyg_pci_memory_base &= ~0xfffff; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1032 mem_limit = cyg_pci_memory_base - 0x100000; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1033 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1034 // Enable memory cycles across bridge |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1035 dev_info.command |= CYG_PCI_CFG_COMMAND_MEMORY; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1036 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1037 // Memory Base Register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1038 dev_info.header.bridge.mem_base = (mem_start >> 16) & 0xfff0; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1039 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_BASE, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1040 dev_info.header.bridge.mem_base); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1041 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1042 // Memory Limit Register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1043 dev_info.header.bridge.mem_limit = (mem_limit >> 16) & 0xfff0; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1044 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_MEM_LIMIT, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1045 dev_info.header.bridge.mem_limit); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1046 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1047 // Prefetchable memory not yet supported across bridges. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1048 // Disable by making limit < base |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1049 { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1050 cyg_uint16 tmp_word; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1051 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1052 tmp_word = 0; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1053 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_LIMIT, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1054 tmp_word); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1055 tmp_word = 0xfff0; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1056 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_PREFETCH_BASE, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1057 tmp_word); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1058 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1059 } else { |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1060 // No memory space used on secondary bus. |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1061 // Recover any space lost on unnecessary rounding |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1062 cyg_pci_memory_base = mem_base; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1063 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1064 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1065 // Setup the bridge command register |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1066 dev_info.command |= CYG_PCI_CFG_COMMAND_MASTER; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1067 dev_info.command |= CYG_PCI_CFG_COMMAND_SERR; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1068 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_COMMAND, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1069 dev_info.command); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1070 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1071 /* Setup the Bridge Control Register */ |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1072 dev_info.header.bridge.control |= CYG_PCI_CFG_BRIDGE_CTL_PARITY; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1073 dev_info.header.bridge.control |= CYG_PCI_CFG_BRIDGE_CTL_SERR; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1074 dev_info.header.bridge.control |= CYG_PCI_CFG_BRIDGE_CTL_MASTER; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1075 cyg_pcihw_write_config_uint16(bus, devfn, CYG_PCI_CFG_BRIDGE_CONTROL, |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1076 dev_info.header.bridge.control); |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1077 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1078 } |
|
143
6b5f480c6929
Merge from eCos master repository on 2000-12-08-02:09:36-GMT
jlarmour
parents:
138
diff
changeset
|
1079 #ifdef CYGPKG_IO_PCI_DEBUG |
|
182
f62680ef1804
Merge from eCos master repository on 2001-09-07-06:43:02-BST
jlarmour
parents:
148
diff
changeset
|
1080 diag_printf("Finished configuring bus %d.\n", bus); |
|
136
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1081 #endif |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1082 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1083 return true; |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1084 } |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1085 |
|
a9ac27ec7abc
Merge from eCos master repository on 2000-11-17-18:24:25-GMT
jlarmour
parents:
66
diff
changeset
|
1086 |
|
52
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
1087 #endif // ifdef CYG_PCI_PRESENT |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
1088 |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
1089 //----------------------------------------------------------------------------- |
|
7b011d1ab50f
Merge from eCos master repository on 1999-11-05-17:34:28-GMT
jlarmour
parents:
diff
changeset
|
1090 // end of pci.c |
