1 //==========================================================================
5 // Test PCI library's resource allocation.
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //==========================================================================
41 //#####DESCRIPTIONBEGIN####
44 // Contributors: jskov
46 // Description: Simple test that prints out information about found
47 // PCI devices. Entirely passive - no configuration happens.
49 //####DESCRIPTIONEND####
51 #include <pkgconf/system.h>
53 #include <cyg/infra/diag.h> // diag_printf
54 #include <cyg/infra/testcase.h> // test macros
55 #include <cyg/infra/cyg_ass.h> // assertion macros
57 // Package requirements
58 #if defined(CYGPKG_IO_PCI) && defined(CYGPKG_KERNEL)
60 #include <pkgconf/kernel.h>
61 #include <pkgconf/io_pci.h>
62 #include <cyg/io/pci.h>
63 #include <cyg/hal/hal_arch.h>
65 // Package option requirements
66 #if defined(CYGFUN_KERNEL_API_C) && defined(CYG_PCI_PRESENT)
68 #include <cyg/kernel/kapi.h>
70 unsigned char stack[CYGNUM_HAL_STACK_SIZE_TYPICAL];
71 cyg_thread thread_data;
72 cyg_handle_t thread_handle;
77 cyg_pci_device dev_info;
78 CYG_PCI_ADDRESS64 mem_base;
79 CYG_PCI_ADDRESS64 mem_assigned_addr;
80 CYG_PCI_ADDRESS32 io_base;
81 CYG_PCI_ADDRESS32 io_assigned_addr;
83 // Verify that space type requests are checked.
84 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO;
85 CYG_TEST_CHECK(!cyg_pci_allocate_memory_priv(&dev_info, 0, &mem_base,
87 "cyg_pci_allocate_memory_priv accepted IO request");
88 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_MEM;
89 CYG_TEST_CHECK(!cyg_pci_allocate_io_priv(&dev_info, 0, &io_base,
91 "cyg_pci_allocate_io_priv accepted MEM request");
93 // Check allocation and alignment of IO space
96 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xfffffffc;
97 CYG_TEST_CHECK(cyg_pci_allocate_io_priv(&dev_info, 0, &io_base,
99 "cyg_pci_allocate_io_priv(4) failed");
100 CYG_TEST_CHECK(0x0004 == io_base,
101 "cyg_pci_allocate_io_priv(4) size failed");
102 CYG_TEST_CHECK(0x0000 == io_assigned_addr,
103 "cyg_pci_allocate_io_priv(4) align failed");
104 // Size 8 (alignment required)
105 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xfffffff8;
106 CYG_TEST_CHECK(cyg_pci_allocate_io_priv(&dev_info, 0, &io_base,
108 "cyg_pci_allocate_io_priv(8) failed");
109 CYG_TEST_CHECK(0x0010 == io_base,
110 "cyg_pci_allocate_io_priv(8) size failed");
111 CYG_TEST_CHECK(0x0008 == io_assigned_addr,
112 "cyg_pci_allocate_io_priv(8) align failed");
113 // Size 16 (no alignment required)
114 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xfffffff0;
115 CYG_TEST_CHECK(cyg_pci_allocate_io_priv(&dev_info, 0, &io_base,
117 "cyg_pci_allocate_io_priv(16) failed");
118 CYG_TEST_CHECK(0x0020 == io_base,
119 "cyg_pci_allocate_io_priv(16) size failed");
120 CYG_TEST_CHECK(0x0010 == io_assigned_addr,
121 "cyg_pci_allocate_io_priv(16) align failed");
122 // Size 64 (alignment required)
123 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xffffffc0;
124 CYG_TEST_CHECK(cyg_pci_allocate_io_priv(&dev_info, 0, &io_base,
126 "cyg_pci_allocate_io_priv(64) failed");
127 CYG_TEST_CHECK(0x0080 == io_base,
128 "cyg_pci_allocate_io_priv(64) size failed");
129 CYG_TEST_CHECK(0x0040 == io_assigned_addr,
130 "cyg_pci_allocate_io_priv(64) align failed");
131 // Size 256 (alignment required)
132 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_IO | 0xffffff00;
133 CYG_TEST_CHECK(cyg_pci_allocate_io_priv(&dev_info, 0, &io_base,
135 "cyg_pci_allocate_io_priv(256) failed");
136 CYG_TEST_CHECK(0x0200 == io_base,
137 "cyg_pci_allocate_io_priv(256) size failed");
138 CYG_TEST_CHECK(0x0100 == io_assigned_addr,
139 "cyg_pci_allocate_io_priv(256) align failed");
141 // Check allocation and alignment of MEM space
142 mem_base = 0x00000000;
143 // Size 16 (no alignment required)
144 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_MEM | 0xfffffff0;
145 CYG_TEST_CHECK(cyg_pci_allocate_memory_priv(&dev_info, 0, &mem_base,
147 "cyg_pci_allocate_memory_priv(16) failed");
148 CYG_TEST_CHECK(0x00000010 == mem_base,
149 "cyg_pci_allocate_memory_priv(16) size failed");
150 CYG_TEST_CHECK(0x00000000 == mem_assigned_addr,
151 "cyg_pci_allocate_memory_priv(16) align failed");
152 // Size 64 (alignment required - <1MB)
153 dev_info.base_size[0] = (CYG_PCI_CFG_BAR_SPACE_MEM
154 | CYG_PRI_CFG_BAR_MEM_TYPE_1M
156 CYG_TEST_CHECK(cyg_pci_allocate_memory_priv(&dev_info, 0, &mem_base,
158 "cyg_pci_allocate_memory_priv(64/<1MB) failed");
159 CYG_TEST_CHECK(0x00000080 == mem_base,
160 "cyg_pci_allocate_memory_priv(64/<1MB) size failed");
161 CYG_TEST_CHECK(0x00000040 == mem_assigned_addr,
162 "cyg_pci_allocate_memory_priv(64/<1MB) align failed");
163 // Size 1MB (alignment required)
164 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_MEM | 0xfff00000;
165 CYG_TEST_CHECK(cyg_pci_allocate_memory_priv(&dev_info, 0, &mem_base,
167 "cyg_pci_allocate_memory_priv(1MB) failed");
168 CYG_TEST_CHECK(0x00200000 == mem_base,
169 "cyg_pci_allocate_memory_priv(1MB) size failed");
170 CYG_TEST_CHECK(0x00100000 == mem_assigned_addr,
171 "cyg_pci_allocate_memory_priv(1MB) align failed");
172 // Size 16MB (alignment required)
173 dev_info.base_size[0] = CYG_PCI_CFG_BAR_SPACE_MEM | 0xff000000;
174 CYG_TEST_CHECK(cyg_pci_allocate_memory_priv(&dev_info, 0, &mem_base,
176 "cyg_pci_allocate_memory_priv(16MB) failed");
177 CYG_TEST_CHECK(0x02000000 == mem_base,
178 "cyg_pci_allocate_memory_priv(16MB) size failed");
179 CYG_TEST_CHECK(0x01000000 == mem_assigned_addr,
180 "cyg_pci_allocate_memory_priv(16MB) align failed");
181 // Size 32 (no alignment required - <1MB - FAILS!)
182 // Note: When more clever allocation has been made for the bottom
183 // 1MB of PCI memory space, this test needs to be made more elaborate.
184 dev_info.base_size[0] = (CYG_PCI_CFG_BAR_SPACE_MEM
185 | CYG_PRI_CFG_BAR_MEM_TYPE_1M
187 CYG_TEST_CHECK(!cyg_pci_allocate_memory_priv(&dev_info, 0, &mem_base,
189 "cyg_pci_allocate_memory_priv(32/<1MB) unexpectedly worked!");
191 // TBD: Check 64bit MEM allocation.
193 CYG_TEST_PASS_FINISH("pci2 test OK");
200 cyg_thread_create(10, // Priority - just a number
201 (cyg_thread_entry_t*)pci_test, // entry
203 "pci_thread", // Name
205 CYGNUM_HAL_STACK_SIZE_TYPICAL, // Size
206 &thread_handle, // Handle
207 &thread_data // Thread data structure
209 cyg_thread_resume(thread_handle);
210 cyg_scheduler_start();
213 #else // CYGFUN_KERNEL_API_C && CYG_PCI_PRESENT
214 #define N_A_MSG "Needs kernel C API & PCI platform support"
217 #else // CYGPKG_IO_PCI && CYGPKG_KERNEL
218 #define N_A_MSG "Needs IO/PCI and Kernel"
226 CYG_TEST_NA( N_A_MSG);