1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright 2019 Joyent, Inc.
24 * Copyright 2019 Western Digital Corporation
25 * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
26 * Copyright 2024 Oxide Computer Company
27 */
28
29 /*
30 * PCI bus enumeration and device programming are done in several passes. The
31 * following is a high level overview of this process.
32 *
33 * pci_enumerate(reprogram=0)
34 * The main entry point to PCI bus enumeration is
35 * pci_enumerate(). This function is invoked
36 * twice, once to set up the PCI portion of the
37 * device tree, and then a second time to
38 * reprogram any devices which were not set up by
39 * the system firmware. On this first call, the
40 * reprogram parameter is set to 0.
41 * add_pci_fixes()
42 * enumerate_bus_devs(CONFIG_FIX)
43 * <foreach bus>
44 * process_devfunc(CONFIG_FIX)
45 * Some devices need a specific action taking in
46 * order for subsequent enumeration to be
47 * successful. add_pci_fixes() retrieves the
48 * vendor and device IDs for each item on the bus
49 * and applies fixes as required. It also creates
50 * a list which is used by undo_pci_fixes() to
51 * reverse the process later.
52 * pci_setup_tree()
53 * enumerate_bus_devs(CONFIG_INFO)
54 * <foreach bus>
55 * process_devfunc(CONFIG_INFO)
56 * <set up most device properties>
57 * The next stage is to enumerate the bus and set
58 * up the bulk of the properties for each device.
59 * This is where the generic properties such as
60 * 'device-id' are created.
61 * <if PPB device>
62 * add_ppb_props()
63 * For a PCI-to-PCI bridge (ppb) device, any
64 * memory ranges for IO, memory or pre-fetchable
65 * memory that have been programmed by the system
66 * firmware (BIOS/EFI) are retrieved and stored in
67 * bus-specific lists (pci_bus_res[bus].io_avail,
68 * mem_avail and pmem_avail). The contents of
69 * these lists are used to set the initial 'ranges'
70 * property on the ppb device. Later, as children
71 * are found for this bridge, resources will be
72 * removed from these avail lists as necessary.
73 *
74 * If the IO or memory ranges have not been
75 * programmed by this point, indicated by the
76 * appropriate bit in the control register being
77 * unset or, in the memory case only, by the base
78 * address being 0, then the range is explicitly
79 * disabled here by setting base > limit for
80 * the resource. Since a zero address is
81 * technically valid for the IO case, the base
82 * address is not checked for IO.
83 *
84 * This is an initial pass so the ppb devices can
85 * still be reprogrammed later in fix_ppb_res().
86 * <else>
87 * <add to list of non-PPB devices for the bus>
88 * Any non-PPB device on the bus is recorded in a
89 * bus-specific list, to be set up (and possibly
90 * reprogrammed) later.
91 * add_reg_props(CONFIG_INFO)
92 * The final step in this phase is to add the
93 * initial 'reg' and 'assigned-addresses'
94 * properties to all devices. At the same time,
95 * any IO or memory ranges which have been
96 * assigned to the bus are moved from the avail
97 * list to the corresponding used one. If no
98 * resources have been assigned to a device at
99 * this stage, then it is flagged for subsequent
100 * reprogramming.
101 * undo_pci_fixes()
102 * Any fixes which were applied in add_pci_fixes()
103 * are now undone before returning, using the
104 * undo list which was created earier.
105 *
106 * pci_enumerate(reprogram=1)
107 * The second bus enumeration pass is to take care
108 * of any devices that were not set up by the
109 * system firmware. These devices were flagged
110 * during the first pass. This pass is bracketed
111 * by the same pci fix application and removal as
112 * the first.
113 * add_pci_fixes()
114 * As for first pass.
115 * pci_reprogram()
116 * pci_prd_root_complex_iter()
117 * The platform is asked to tell us of all root
118 * complexes that it knows about (e.g. using the
119 * _BBN method via ACPI). This will include buses
120 * that we've already discovered and those that we
121 * potentially haven't. Anything that has not been
122 * previously discovered (or inferred to exist) is
123 * then added to the system.
124 * <foreach ROOT bus>
125 * populate_bus_res()
126 * Find resources associated with this root bus
127 * based on what the platform provides through the
128 * pci platform interfaces defined in
129 * sys/plat/pci_prd.h. On i86pc this is driven by
130 * ACPI and BIOS tables.
131 * <foreach bus>
132 * fix_ppb_res()
133 * Reprogram pci(e) bridges which have not already
134 * had resources assigned, or which are under a
135 * bus that has been flagged for reprogramming.
136 * If the parent bus has not been flagged, then IO
137 * space is reprogrammed only if there are no
138 * assigned IO resources. Memory space is
139 * reprogrammed only if there is both no assigned
140 * ordinary memory AND no assigned pre-fetchable
141 * memory. However, if memory reprogramming is
142 * necessary then both ordinary and prefetch are
143 * done together so that both memory ranges end up
144 * in the avail lists for add_reg_props() to find
145 * later.
146 * enumerate_bus_devs(CONFIG_NEW)
147 * <foreach non-PPB device on the bus>
148 * add_reg_props(CONFIG_NEW)
149 * Using the list of non-PPB devices on the bus
150 * which was assembled during the first pass, add
151 * or update the 'reg' and 'assigned-address'
152 * properties for these devices. For devices which
153 * have been flagged for reprogramming or have no
154 * assigned resources, this is where resources are
155 * finally assigned and programmed into the
156 * device. This can result in these properties
157 * changing from their previous values.
158 * <foreach bus>
159 * add_bus_available_prop()
160 * Finally, the 'available' properties is set on
161 * each device, representing that device's final
162 * unallocated (available) IO and memory ranges.
163 * undo_pci_fixes()
164 * As for first pass.
165 */
166
167 #include <sys/types.h>
168 #include <sys/stat.h>
169 #include <sys/sysmacros.h>
170 #include <sys/sunndi.h>
171 #include <sys/pci.h>
172 #include <sys/pci_impl.h>
173 #include <sys/pcie_impl.h>
174 #include <sys/pci_props.h>
175 #include <sys/memlist.h>
176 #include <sys/bootconf.h>
177 #include <sys/pci_cfgacc.h>
178 #include <sys/pci_cfgspace.h>
179 #include <sys/pci_cfgspace_impl.h>
180 #include <sys/psw.h>
181 #include "../../../../common/pci/pci_strings.h"
182 #include <sys/apic.h>
183 #include <io/pciex/pcie_nvidia.h>
184 #include <sys/hotplug/pci/pciehpc_acpi.h>
185 #include <sys/acpi/acpi.h>
186 #include <sys/acpica.h>
187 #include <sys/iommulib.h>
188 #include <sys/devcache.h>
189 #include <sys/pci_cfgacc_x86.h>
190 #include <sys/plat/pci_prd.h>
191
192 #define pci_getb (*pci_getb_func)
193 #define pci_getw (*pci_getw_func)
194 #define pci_getl (*pci_getl_func)
195 #define pci_putb (*pci_putb_func)
196 #define pci_putw (*pci_putw_func)
197 #define pci_putl (*pci_putl_func)
198 #define dcmn_err if (pci_boot_debug != 0) cmn_err
199 #define bus_debug(bus) (pci_boot_debug != 0 && pci_debug_bus_start != -1 && \
200 pci_debug_bus_end != -1 && (bus) >= pci_debug_bus_start && \
201 (bus) <= pci_debug_bus_end)
202 #define dump_memlists(tag, bus) \
203 if (bus_debug((bus))) dump_memlists_impl((tag), (bus))
204 #define MSGHDR "!%s[%02x/%02x/%x]: "
205
206 #define CONFIG_INFO 0
207 #define CONFIG_UPDATE 1
208 #define CONFIG_NEW 2
209 #define CONFIG_FIX 3
210 #define COMPAT_BUFSIZE 512
211
212 #define PPB_IO_ALIGNMENT 0x1000 /* 4K aligned */
213 #define PPB_MEM_ALIGNMENT 0x100000 /* 1M aligned */
214 /* round down to nearest power of two */
215 #define P2LE(align) \
216 { \
217 uint_t i = 0; \
218 while (align >>= 1) \
219 i++; \
220 align = 1 << i; \
221 } \
222
223 /*
224 * Determining the size of a PCI BAR is done by writing all 1s to the base
225 * register and then reading the value back. The retrieved value will either
226 * be zero, indicating that the BAR is unimplemented, or a mask in which
227 * the significant bits for the required memory space are 0.
228 * For example, a 32-bit BAR could return 0xfff00000 which equates to a
229 * length of 0x100000 (1MiB). The following macro does that conversion.
230 * The input value must have already had the lower encoding bits cleared.
231 */
232 #define BARMASKTOLEN(value) ((((value) ^ ((value) - 1)) + 1) >> 1)
233
234 typedef enum {
235 RES_IO,
236 RES_MEM,
237 RES_PMEM
238 } mem_res_t;
239
240 /*
241 * In order to disable an IO or memory range on a bridge, the range's base must
242 * be set to a value greater than its limit. The following values are used for
243 * this purpose.
244 */
245 #define PPB_DISABLE_IORANGE_BASE 0x9fff
246 #define PPB_DISABLE_IORANGE_LIMIT 0x1000
247 #define PPB_DISABLE_MEMRANGE_BASE 0x9ff00000
248 #define PPB_DISABLE_MEMRANGE_LIMIT 0x100fffff
249
250 /* See AMD-8111 Datasheet Rev 3.03, Page 149: */
251 #define LPC_IO_CONTROL_REG_1 0x40
252 #define AMD8111_ENABLENMI (uint8_t)0x80
253 #define DEVID_AMD8111_LPC 0x7468
254
255 struct pci_fixundo {
256 uint8_t bus;
257 uint8_t dev;
258 uint8_t fn;
259 void (*undofn)(uint8_t, uint8_t, uint8_t);
260 struct pci_fixundo *next;
261 };
262
263 struct pci_devfunc {
264 struct pci_devfunc *next;
265 dev_info_t *dip;
266 uchar_t dev;
267 uchar_t func;
268 boolean_t reprogram; /* this device needs to be reprogrammed */
269 };
270
271 extern int apic_nvidia_io_max;
272 static uchar_t max_dev_pci = 32; /* PCI standard */
273 int pci_boot_maxbus;
274
275 int pci_boot_debug = 0;
276 int pci_debug_bus_start = -1;
277 int pci_debug_bus_end = -1;
278
279 static struct pci_fixundo *undolist = NULL;
280 static int num_root_bus = 0; /* count of root buses */
281 extern void pci_cfgacc_add_workaround(uint16_t, uchar_t, uchar_t);
282 extern dev_info_t *pcie_get_rc_dip(dev_info_t *);
283
284 /*
285 * Module prototypes
286 */
287 static void enumerate_bus_devs(uchar_t bus, int config_op);
288 static void create_root_bus_dip(uchar_t bus);
289 static void process_devfunc(uchar_t, uchar_t, uchar_t, int);
290 static boolean_t add_reg_props(dev_info_t *, uchar_t, uchar_t, uchar_t, int,
291 boolean_t);
292 static void add_ppb_props(dev_info_t *, uchar_t, uchar_t, uchar_t, boolean_t,
293 boolean_t);
294 static void add_bus_range_prop(int);
295 static void add_ranges_prop(int, boolean_t);
296 static void add_bus_available_prop(int);
297 static int get_pci_cap(uchar_t bus, uchar_t dev, uchar_t func, uint8_t cap_id);
298 static void fix_ppb_res(uchar_t, boolean_t);
299 static void alloc_res_array(void);
300 static void create_ioapic_node(int bus, int dev, int fn, ushort_t vendorid,
301 ushort_t deviceid);
302 static void populate_bus_res(uchar_t bus);
303 static void pci_memlist_remove_list(struct memlist **list,
304 struct memlist *remove_list);
305 static void ck804_fix_aer_ptr(dev_info_t *, pcie_req_id_t);
306
307 static int pci_unitaddr_cache_valid(void);
308 static int pci_bus_unitaddr(int);
309 static void pci_unitaddr_cache_create(void);
310
311 static int pci_cache_unpack_nvlist(nvf_handle_t, nvlist_t *, char *);
312 static int pci_cache_pack_nvlist(nvf_handle_t, nvlist_t **);
313 static void pci_cache_free_list(nvf_handle_t);
314
315 /* set non-zero to force PCI peer-bus renumbering */
316 int pci_bus_always_renumber = 0;
317
318 /*
319 * used to register ISA resource usage which must not be made
320 * "available" from other PCI node' resource maps
321 */
322 static struct {
323 struct memlist *io_used;
324 struct memlist *mem_used;
325 } isa_res;
326
327 /*
328 * PCI unit-address cache management
329 */
330 static nvf_ops_t pci_unitaddr_cache_ops = {
331 "/etc/devices/pci_unitaddr_persistent", /* path to cache */
332 pci_cache_unpack_nvlist, /* read in nvlist form */
333 pci_cache_pack_nvlist, /* convert to nvlist form */
334 pci_cache_free_list, /* free data list */
335 NULL /* write complete callback */
336 };
337
338 typedef struct {
339 list_node_t pua_nodes;
340 int pua_index;
341 int pua_addr;
342 } pua_node_t;
343
344 nvf_handle_t puafd_handle;
345 int pua_cache_valid = 0;
346
347 dev_info_t *
pci_boot_bus_to_dip(uint32_t busno)348 pci_boot_bus_to_dip(uint32_t busno)
349 {
350 ASSERT3U(busno, <=, pci_boot_maxbus);
351 return (pci_bus_res[busno].dip);
352 }
353
354 static void
dump_memlists_impl(const char * tag,int bus)355 dump_memlists_impl(const char *tag, int bus)
356 {
357 printf("Memlist dump at %s - bus %x\n", tag, bus);
358 if (pci_bus_res[bus].io_used != NULL) {
359 printf(" io_used ");
360 pci_memlist_dump(pci_bus_res[bus].io_used);
361 }
362 if (pci_bus_res[bus].io_avail != NULL) {
363 printf(" io_avail ");
364 pci_memlist_dump(pci_bus_res[bus].io_avail);
365 }
366 if (pci_bus_res[bus].mem_used != NULL) {
367 printf(" mem_used ");
368 pci_memlist_dump(pci_bus_res[bus].mem_used);
369 }
370 if (pci_bus_res[bus].mem_avail != NULL) {
371 printf(" mem_avail ");
372 pci_memlist_dump(pci_bus_res[bus].mem_avail);
373 }
374 if (pci_bus_res[bus].pmem_used != NULL) {
375 printf(" pmem_used ");
376 pci_memlist_dump(pci_bus_res[bus].pmem_used);
377 }
378 if (pci_bus_res[bus].pmem_avail != NULL) {
379 printf(" pmem_avail ");
380 pci_memlist_dump(pci_bus_res[bus].pmem_avail);
381 }
382 }
383
384 static boolean_t
pci_rc_scan_cb(uint32_t busno,void * arg)385 pci_rc_scan_cb(uint32_t busno, void *arg)
386 {
387 if (busno > pci_boot_maxbus) {
388 dcmn_err(CE_NOTE, "platform root complex scan returned bus "
389 "with invalid bus id: 0x%x", busno);
390 return (B_TRUE);
391 }
392
393 if (pci_bus_res[busno].par_bus == (uchar_t)-1 &&
394 pci_bus_res[busno].dip == NULL) {
395 create_root_bus_dip((uchar_t)busno);
396 }
397
398 return (B_TRUE);
399 }
400
401 static void
pci_unitaddr_cache_init(void)402 pci_unitaddr_cache_init(void)
403 {
404
405 puafd_handle = nvf_register_file(&pci_unitaddr_cache_ops);
406 ASSERT(puafd_handle);
407
408 list_create(nvf_list(puafd_handle), sizeof (pua_node_t),
409 offsetof(pua_node_t, pua_nodes));
410
411 rw_enter(nvf_lock(puafd_handle), RW_WRITER);
412 (void) nvf_read_file(puafd_handle);
413 rw_exit(nvf_lock(puafd_handle));
414 }
415
416 /*
417 * Format of /etc/devices/pci_unitaddr_persistent:
418 *
419 * The persistent record of unit-address assignments contains
420 * a list of name/value pairs, where name is a string representation
421 * of the "index value" of the PCI root-bus and the value is
422 * the assigned unit-address.
423 *
424 * The "index value" is simply the zero-based index of the PCI
425 * root-buses ordered by physical bus number; first PCI bus is 0,
426 * second is 1, and so on.
427 */
428
429 static int
pci_cache_unpack_nvlist(nvf_handle_t hdl,nvlist_t * nvl,char * name)430 pci_cache_unpack_nvlist(nvf_handle_t hdl, nvlist_t *nvl, char *name)
431 {
432 long index;
433 int32_t value;
434 nvpair_t *np;
435 pua_node_t *node;
436
437 np = NULL;
438 while ((np = nvlist_next_nvpair(nvl, np)) != NULL) {
439 /* name of nvpair is index value */
440 if (ddi_strtol(nvpair_name(np), NULL, 10, &index) != 0)
441 continue;
442
443 if (nvpair_value_int32(np, &value) != 0)
444 continue;
445
446 node = kmem_zalloc(sizeof (pua_node_t), KM_SLEEP);
447 node->pua_index = index;
448 node->pua_addr = value;
449 list_insert_tail(nvf_list(hdl), node);
450 }
451
452 pua_cache_valid = 1;
453 return (DDI_SUCCESS);
454 }
455
456 static int
pci_cache_pack_nvlist(nvf_handle_t hdl,nvlist_t ** ret_nvl)457 pci_cache_pack_nvlist(nvf_handle_t hdl, nvlist_t **ret_nvl)
458 {
459 int rval;
460 nvlist_t *nvl, *sub_nvl;
461 list_t *listp;
462 pua_node_t *pua;
463 char buf[13];
464
465 ASSERT(RW_WRITE_HELD(nvf_lock(hdl)));
466
467 rval = nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP);
468 if (rval != DDI_SUCCESS) {
469 nvf_error("%s: nvlist alloc error %d\n",
470 nvf_cache_name(hdl), rval);
471 return (DDI_FAILURE);
472 }
473
474 sub_nvl = NULL;
475 rval = nvlist_alloc(&sub_nvl, NV_UNIQUE_NAME, KM_SLEEP);
476 if (rval != DDI_SUCCESS)
477 goto error;
478
479 listp = nvf_list(hdl);
480 for (pua = list_head(listp); pua != NULL;
481 pua = list_next(listp, pua)) {
482 (void) snprintf(buf, sizeof (buf), "%d", pua->pua_index);
483 rval = nvlist_add_int32(sub_nvl, buf, pua->pua_addr);
484 if (rval != DDI_SUCCESS)
485 goto error;
486 }
487
488 rval = nvlist_add_nvlist(nvl, "table", sub_nvl);
489 if (rval != DDI_SUCCESS)
490 goto error;
491 nvlist_free(sub_nvl);
492
493 *ret_nvl = nvl;
494 return (DDI_SUCCESS);
495
496 error:
497 nvlist_free(sub_nvl);
498 ASSERT(nvl);
499 nvlist_free(nvl);
500 *ret_nvl = NULL;
501 return (DDI_FAILURE);
502 }
503
504 static void
pci_cache_free_list(nvf_handle_t hdl)505 pci_cache_free_list(nvf_handle_t hdl)
506 {
507 list_t *listp;
508 pua_node_t *pua;
509
510 ASSERT(RW_WRITE_HELD(nvf_lock(hdl)));
511
512 listp = nvf_list(hdl);
513 for (pua = list_head(listp); pua != NULL;
514 pua = list_next(listp, pua)) {
515 list_remove(listp, pua);
516 kmem_free(pua, sizeof (pua_node_t));
517 }
518 }
519
520
521 static int
pci_unitaddr_cache_valid(void)522 pci_unitaddr_cache_valid(void)
523 {
524
525 /* read only, no need for rw lock */
526 return (pua_cache_valid);
527 }
528
529
530 static int
pci_bus_unitaddr(int index)531 pci_bus_unitaddr(int index)
532 {
533 pua_node_t *pua;
534 list_t *listp;
535 int addr;
536
537 rw_enter(nvf_lock(puafd_handle), RW_READER);
538
539 addr = -1; /* default return if no match */
540 listp = nvf_list(puafd_handle);
541 for (pua = list_head(listp); pua != NULL;
542 pua = list_next(listp, pua)) {
543 if (pua->pua_index == index) {
544 addr = pua->pua_addr;
545 break;
546 }
547 }
548
549 rw_exit(nvf_lock(puafd_handle));
550 return (addr);
551 }
552
553 static void
pci_unitaddr_cache_create(void)554 pci_unitaddr_cache_create(void)
555 {
556 int i, index;
557 pua_node_t *node;
558 list_t *listp;
559
560 rw_enter(nvf_lock(puafd_handle), RW_WRITER);
561
562 index = 0;
563 listp = nvf_list(puafd_handle);
564 for (i = 0; i <= pci_boot_maxbus; i++) {
565 /* skip non-root (peer) PCI busses */
566 if ((pci_bus_res[i].par_bus != (uchar_t)-1) ||
567 pci_bus_res[i].dip == NULL)
568 continue;
569 node = kmem_zalloc(sizeof (pua_node_t), KM_SLEEP);
570 node->pua_index = index++;
571 node->pua_addr = pci_bus_res[i].root_addr;
572 list_insert_tail(listp, node);
573 }
574
575 (void) nvf_mark_dirty(puafd_handle);
576 rw_exit(nvf_lock(puafd_handle));
577 nvf_wake_daemon();
578 }
579
580
581 /*
582 * Enumerate all PCI devices
583 */
584 void
pci_setup_tree(void)585 pci_setup_tree(void)
586 {
587 uint_t i, root_bus_addr = 0;
588
589 alloc_res_array();
590 for (i = 0; i <= pci_boot_maxbus; i++) {
591 pci_bus_res[i].par_bus = (uchar_t)-1;
592 pci_bus_res[i].root_addr = (uchar_t)-1;
593 pci_bus_res[i].sub_bus = i;
594 }
595
596 pci_bus_res[0].root_addr = root_bus_addr++;
597 create_root_bus_dip(0);
598 enumerate_bus_devs(0, CONFIG_INFO);
599
600 /*
601 * Now enumerate peer busses
602 *
603 * We loop till pci_boot_maxbus. On most systems, there is
604 * one more bus at the high end, which implements the ISA
605 * compatibility bus. We don't care about that.
606 *
607 * Note: In the old (bootconf) enumeration, the peer bus
608 * address did not use the bus number, and there were
609 * too many peer busses created. The root_bus_addr is
610 * used to maintain the old peer bus address assignment.
611 * However, we stop enumerating phantom peers with no
612 * device below.
613 */
614 for (i = 1; i <= pci_boot_maxbus; i++) {
615 if (pci_bus_res[i].dip == NULL) {
616 pci_bus_res[i].root_addr = root_bus_addr++;
617 }
618 enumerate_bus_devs(i, CONFIG_INFO);
619 }
620 }
621
622 void
pci_register_isa_resources(int type,uint32_t base,uint32_t size)623 pci_register_isa_resources(int type, uint32_t base, uint32_t size)
624 {
625 (void) pci_memlist_insert(
626 (type == 1) ? &isa_res.io_used : &isa_res.mem_used,
627 base, size);
628 }
629
630 /*
631 * Remove the resources which are already used by devices under a subtractive
632 * bridge from the bus's resources lists, because they're not available, and
633 * shouldn't be allocated to other buses. This is necessary because tracking
634 * resources for subtractive bridges is not complete. (Subtractive bridges only
635 * track some of their claimed resources, not "the rest of the address space" as
636 * they should, so that allocation to peer non-subtractive PPBs is easier. We
637 * need a fully-capable global resource allocator).
638 */
639 static void
remove_subtractive_res()640 remove_subtractive_res()
641 {
642 int i, j;
643 struct memlist *list;
644
645 for (i = 0; i <= pci_boot_maxbus; i++) {
646 if (pci_bus_res[i].subtractive) {
647 /* remove used io ports */
648 list = pci_bus_res[i].io_used;
649 while (list) {
650 for (j = 0; j <= pci_boot_maxbus; j++)
651 (void) pci_memlist_remove(
652 &pci_bus_res[j].io_avail,
653 list->ml_address, list->ml_size);
654 list = list->ml_next;
655 }
656 /* remove used mem resource */
657 list = pci_bus_res[i].mem_used;
658 while (list) {
659 for (j = 0; j <= pci_boot_maxbus; j++) {
660 (void) pci_memlist_remove(
661 &pci_bus_res[j].mem_avail,
662 list->ml_address, list->ml_size);
663 (void) pci_memlist_remove(
664 &pci_bus_res[j].pmem_avail,
665 list->ml_address, list->ml_size);
666 }
667 list = list->ml_next;
668 }
669 /* remove used prefetchable mem resource */
670 list = pci_bus_res[i].pmem_used;
671 while (list) {
672 for (j = 0; j <= pci_boot_maxbus; j++) {
673 (void) pci_memlist_remove(
674 &pci_bus_res[j].pmem_avail,
675 list->ml_address, list->ml_size);
676 (void) pci_memlist_remove(
677 &pci_bus_res[j].mem_avail,
678 list->ml_address, list->ml_size);
679 }
680 list = list->ml_next;
681 }
682 }
683 }
684 }
685
686 /*
687 * Set up (or complete the setup of) the bus_avail resource list
688 */
689 static void
setup_bus_res(int bus)690 setup_bus_res(int bus)
691 {
692 uchar_t par_bus;
693
694 if (pci_bus_res[bus].dip == NULL) /* unused bus */
695 return;
696
697 /*
698 * Set up bus_avail if not already filled in by populate_bus_res()
699 */
700 if (pci_bus_res[bus].bus_avail == NULL) {
701 ASSERT(pci_bus_res[bus].sub_bus >= bus);
702 pci_memlist_insert(&pci_bus_res[bus].bus_avail, bus,
703 pci_bus_res[bus].sub_bus - bus + 1);
704 }
705
706 ASSERT(pci_bus_res[bus].bus_avail != NULL);
707
708 /*
709 * Remove resources from parent bus node if this is not a
710 * root bus.
711 */
712 par_bus = pci_bus_res[bus].par_bus;
713 if (par_bus != (uchar_t)-1) {
714 ASSERT(pci_bus_res[par_bus].bus_avail != NULL);
715 pci_memlist_remove_list(&pci_bus_res[par_bus].bus_avail,
716 pci_bus_res[bus].bus_avail);
717 }
718
719 /* remove self from bus_avail */;
720 (void) pci_memlist_remove(&pci_bus_res[bus].bus_avail, bus, 1);
721 }
722
723 /*
724 * Return the bus from which resources should be allocated. A device under a
725 * subtractive PPB can allocate resources from its parent bus if there are no
726 * resources available on its own bus, so iterate up the chain until resources
727 * are found or the root is reached.
728 */
729 static uchar_t
resolve_alloc_bus(uchar_t bus,mem_res_t type)730 resolve_alloc_bus(uchar_t bus, mem_res_t type)
731 {
732 while (pci_bus_res[bus].subtractive) {
733 if (type == RES_IO && pci_bus_res[bus].io_avail != NULL)
734 break;
735 if (type == RES_MEM && pci_bus_res[bus].mem_avail != NULL)
736 break;
737 if (type == RES_PMEM && pci_bus_res[bus].pmem_avail != NULL)
738 break;
739 /* Has the root bus been reached? */
740 if (pci_bus_res[bus].par_bus == (uchar_t)-1)
741 break;
742 bus = pci_bus_res[bus].par_bus;
743 }
744
745 return (bus);
746 }
747
748 /*
749 * Each root port has a record of the number of PCIe bridges that is under it
750 * and the amount of memory that is has available which is not otherwise
751 * required for BARs.
752 *
753 * This function finds the root port for a given bus and returns the amount of
754 * spare memory that is available for allocation to any one of its bridges. In
755 * general, not all bridges end up being reprogrammed, so this is usually an
756 * underestimate. A smarter allocator could account for this by building up a
757 * better picture of the topology.
758 */
759 static uint64_t
get_per_bridge_avail(uchar_t bus)760 get_per_bridge_avail(uchar_t bus)
761 {
762 uchar_t par_bus;
763
764 par_bus = pci_bus_res[bus].par_bus;
765 while (par_bus != (uchar_t)-1) {
766 bus = par_bus;
767 par_bus = pci_bus_res[par_bus].par_bus;
768 }
769
770 if (pci_bus_res[bus].mem_buffer == 0 ||
771 pci_bus_res[bus].num_bridge == 0) {
772 return (0);
773 }
774
775 return (pci_bus_res[bus].mem_buffer / pci_bus_res[bus].num_bridge);
776 }
777
778 static uint64_t
lookup_parbus_res(uchar_t parbus,uint64_t size,uint64_t align,mem_res_t type)779 lookup_parbus_res(uchar_t parbus, uint64_t size, uint64_t align, mem_res_t type)
780 {
781 struct memlist **list;
782 uint64_t addr;
783
784 /*
785 * Skip root(peer) buses in multiple-root-bus systems when
786 * ACPI resource discovery was not successfully done; the
787 * initial resources set on each root bus might not be correctly
788 * accounted for in this case.
789 */
790 if (pci_bus_res[parbus].par_bus == (uchar_t)-1 &&
791 num_root_bus > 1 && !pci_prd_multi_root_ok()) {
792 return (0);
793 }
794
795 parbus = resolve_alloc_bus(parbus, type);
796
797 switch (type) {
798 case RES_IO:
799 list = &pci_bus_res[parbus].io_avail;
800 break;
801 case RES_MEM:
802 list = &pci_bus_res[parbus].mem_avail;
803 break;
804 case RES_PMEM:
805 list = &pci_bus_res[parbus].pmem_avail;
806 break;
807 default:
808 panic("Invalid resource type %d", type);
809 }
810
811 if (*list == NULL)
812 return (0);
813
814 addr = pci_memlist_find(list, size, align);
815
816 return (addr);
817 }
818
819 /*
820 * Allocate a resource from the parent bus
821 */
822 static uint64_t
get_parbus_res(uchar_t parbus,uchar_t bus,uint64_t size,uint64_t align,mem_res_t type)823 get_parbus_res(uchar_t parbus, uchar_t bus, uint64_t size, uint64_t align,
824 mem_res_t type)
825 {
826 struct memlist **par_avail, **par_used, **avail, **used;
827 uint64_t addr;
828
829 parbus = resolve_alloc_bus(parbus, type);
830
831 switch (type) {
832 case RES_IO:
833 par_avail = &pci_bus_res[parbus].io_avail;
834 par_used = &pci_bus_res[parbus].io_used;
835 avail = &pci_bus_res[bus].io_avail;
836 used = &pci_bus_res[bus].io_used;
837 break;
838 case RES_MEM:
839 par_avail = &pci_bus_res[parbus].mem_avail;
840 par_used = &pci_bus_res[parbus].mem_used;
841 avail = &pci_bus_res[bus].mem_avail;
842 used = &pci_bus_res[bus].mem_used;
843 break;
844 case RES_PMEM:
845 par_avail = &pci_bus_res[parbus].pmem_avail;
846 par_used = &pci_bus_res[parbus].pmem_used;
847 avail = &pci_bus_res[bus].pmem_avail;
848 used = &pci_bus_res[bus].pmem_used;
849 break;
850 default:
851 panic("Invalid resource type %d", type);
852 }
853
854 /* Return any existing resources to the parent bus */
855 pci_memlist_subsume(used, avail);
856 for (struct memlist *m = *avail; m != NULL; m = m->ml_next) {
857 (void) pci_memlist_remove(par_used, m->ml_address, m->ml_size);
858 pci_memlist_insert(par_avail, m->ml_address, m->ml_size);
859 }
860 pci_memlist_free_all(avail);
861
862 addr = lookup_parbus_res(parbus, size, align, type);
863
864 /*
865 * The system may have provided a 64-bit non-PF memory region to the
866 * parent bus, but we cannot use that for programming a bridge. Since
867 * the memlists are kept sorted by base address and searched in order,
868 * then if we received a 64-bit address here we know that the request
869 * is unsatisfiable from the available 32-bit ranges.
870 */
871 if (type == RES_MEM &&
872 (addr >= UINT32_MAX || addr >= UINT32_MAX - size)) {
873 return (0);
874 }
875
876 if (addr != 0) {
877 pci_memlist_insert(par_used, addr, size);
878 (void) pci_memlist_remove(par_avail, addr, size);
879 pci_memlist_insert(avail, addr, size);
880 }
881
882 return (addr);
883 }
884
885 /*
886 * given a cap_id, return its cap_id location in config space
887 */
888 static int
get_pci_cap(uchar_t bus,uchar_t dev,uchar_t func,uint8_t cap_id)889 get_pci_cap(uchar_t bus, uchar_t dev, uchar_t func, uint8_t cap_id)
890 {
891 uint8_t curcap, cap_id_loc;
892 uint16_t status;
893 int location = -1;
894
895 /*
896 * Need to check the Status register for ECP support first.
897 * Also please note that for type 1 devices, the
898 * offset could change. Should support type 1 next.
899 */
900 status = pci_getw(bus, dev, func, PCI_CONF_STAT);
901 if (!(status & PCI_STAT_CAP)) {
902 return (-1);
903 }
904 cap_id_loc = pci_getb(bus, dev, func, PCI_CONF_CAP_PTR);
905
906 /* Walk the list of capabilities */
907 while (cap_id_loc && cap_id_loc != (uint8_t)-1) {
908 curcap = pci_getb(bus, dev, func, cap_id_loc);
909
910 if (curcap == cap_id) {
911 location = cap_id_loc;
912 break;
913 }
914 cap_id_loc = pci_getb(bus, dev, func, cap_id_loc + 1);
915 }
916 return (location);
917 }
918
919 /*
920 * Does this resource element live in the legacy VGA range?
921 */
922
923 static boolean_t
is_vga(struct memlist * elem,mem_res_t type)924 is_vga(struct memlist *elem, mem_res_t type)
925 {
926 switch (type) {
927 case RES_IO:
928 if ((elem->ml_address == 0x3b0 && elem->ml_size == 0xc) ||
929 (elem->ml_address == 0x3c0 && elem->ml_size == 0x20)) {
930 return (B_TRUE);
931 }
932 break;
933 case RES_MEM:
934 if (elem->ml_address == 0xa0000 && elem->ml_size == 0x20000)
935 return (B_TRUE);
936 break;
937 case RES_PMEM:
938 break;
939 }
940 return (B_FALSE);
941 }
942
943 /*
944 * Does this entire resource list consist only of legacy VGA resources?
945 */
946
947 static boolean_t
list_is_vga_only(struct memlist * l,mem_res_t type)948 list_is_vga_only(struct memlist *l, mem_res_t type)
949 {
950 if (l == NULL) {
951 return (B_FALSE);
952 }
953
954 do {
955 if (!is_vga(l, type))
956 return (B_FALSE);
957 } while ((l = l->ml_next) != NULL);
958 return (B_TRUE);
959 }
960
961 /*
962 * Find the start and end addresses that cover the range for all list entries,
963 * excluding legacy VGA addresses. Relies on the list being sorted.
964 */
965 static void
pci_memlist_range(struct memlist * list,mem_res_t type,uint64_t * basep,uint64_t * limitp)966 pci_memlist_range(struct memlist *list, mem_res_t type, uint64_t *basep,
967 uint64_t *limitp)
968 {
969 *limitp = *basep = 0;
970
971 for (; list != NULL; list = list->ml_next) {
972 if (is_vga(list, type))
973 continue;
974
975 if (*basep == 0)
976 *basep = list->ml_address;
977
978 if (list->ml_address + list->ml_size >= *limitp)
979 *limitp = list->ml_address + list->ml_size - 1;
980 }
981 }
982
983 static void
set_ppb_res(uchar_t bus,uchar_t dev,uchar_t func,mem_res_t type,uint64_t base,uint64_t limit)984 set_ppb_res(uchar_t bus, uchar_t dev, uchar_t func, mem_res_t type,
985 uint64_t base, uint64_t limit)
986 {
987 char *tag;
988
989 switch (type) {
990 case RES_IO: {
991 VERIFY0(base >> 32);
992 VERIFY0(limit >> 32);
993
994 pci_putb(bus, dev, func, PCI_BCNF_IO_BASE_LOW,
995 (uint8_t)((base >> PCI_BCNF_IO_SHIFT) & PCI_BCNF_IO_MASK));
996 pci_putb(bus, dev, func, PCI_BCNF_IO_LIMIT_LOW,
997 (uint8_t)((limit >> PCI_BCNF_IO_SHIFT) & PCI_BCNF_IO_MASK));
998
999 uint8_t val = pci_getb(bus, dev, func, PCI_BCNF_IO_BASE_LOW);
1000 if ((val & PCI_BCNF_ADDR_MASK) == PCI_BCNF_IO_32BIT) {
1001 pci_putw(bus, dev, func, PCI_BCNF_IO_BASE_HI,
1002 base >> 16);
1003 pci_putw(bus, dev, func, PCI_BCNF_IO_LIMIT_HI,
1004 limit >> 16);
1005 } else {
1006 VERIFY0(base >> 16);
1007 VERIFY0(limit >> 16);
1008 }
1009
1010 tag = "I/O";
1011 break;
1012 }
1013
1014 case RES_MEM:
1015 VERIFY0(base >> 32);
1016 VERIFY0(limit >> 32);
1017
1018 pci_putw(bus, dev, func, PCI_BCNF_MEM_BASE,
1019 (uint16_t)((base >> PCI_BCNF_MEM_SHIFT) &
1020 PCI_BCNF_MEM_MASK));
1021 pci_putw(bus, dev, func, PCI_BCNF_MEM_LIMIT,
1022 (uint16_t)((limit >> PCI_BCNF_MEM_SHIFT) &
1023 PCI_BCNF_MEM_MASK));
1024
1025 tag = "MEM";
1026 break;
1027
1028 case RES_PMEM: {
1029 pci_putw(bus, dev, func, PCI_BCNF_PF_BASE_LOW,
1030 (uint16_t)((base >> PCI_BCNF_MEM_SHIFT) &
1031 PCI_BCNF_MEM_MASK));
1032 pci_putw(bus, dev, func, PCI_BCNF_PF_LIMIT_LOW,
1033 (uint16_t)((limit >> PCI_BCNF_MEM_SHIFT) &
1034 PCI_BCNF_MEM_MASK));
1035
1036 uint16_t val = pci_getw(bus, dev, func, PCI_BCNF_PF_BASE_LOW);
1037 if ((val & PCI_BCNF_ADDR_MASK) == PCI_BCNF_PF_MEM_64BIT) {
1038 pci_putl(bus, dev, func, PCI_BCNF_PF_BASE_HIGH,
1039 base >> 32);
1040 pci_putl(bus, dev, func, PCI_BCNF_PF_LIMIT_HIGH,
1041 limit >> 32);
1042 } else {
1043 VERIFY0(base >> 32);
1044 VERIFY0(limit >> 32);
1045 }
1046
1047 tag = "PMEM";
1048 break;
1049 }
1050
1051 default:
1052 panic("Invalid resource type %d", type);
1053 }
1054
1055 if (base > limit) {
1056 cmn_err(CE_NOTE, MSGHDR "DISABLE %4s range",
1057 "ppb", bus, dev, func, tag);
1058 } else {
1059 cmn_err(CE_NOTE,
1060 MSGHDR "PROGRAM %4s range 0x%lx ~ 0x%lx",
1061 "ppb", bus, dev, func, tag, base, limit);
1062 }
1063 }
1064
1065 static void
fetch_ppb_res(uchar_t bus,uchar_t dev,uchar_t func,mem_res_t type,uint64_t * basep,uint64_t * limitp)1066 fetch_ppb_res(uchar_t bus, uchar_t dev, uchar_t func, mem_res_t type,
1067 uint64_t *basep, uint64_t *limitp)
1068 {
1069 uint64_t val, base, limit;
1070
1071 switch (type) {
1072 case RES_IO:
1073 val = pci_getb(bus, dev, func, PCI_BCNF_IO_LIMIT_LOW);
1074 limit = ((val & PCI_BCNF_IO_MASK) << PCI_BCNF_IO_SHIFT) |
1075 PCI_BCNF_IO_LIMIT_BITS;
1076 val = pci_getb(bus, dev, func, PCI_BCNF_IO_BASE_LOW);
1077 base = ((val & PCI_BCNF_IO_MASK) << PCI_BCNF_IO_SHIFT);
1078
1079 if ((val & PCI_BCNF_ADDR_MASK) == PCI_BCNF_IO_32BIT) {
1080 val = pci_getw(bus, dev, func, PCI_BCNF_IO_BASE_HI);
1081 base |= val << 16;
1082 val = pci_getw(bus, dev, func, PCI_BCNF_IO_LIMIT_HI);
1083 limit |= val << 16;
1084 }
1085 VERIFY0(base >> 32);
1086 break;
1087
1088 case RES_MEM:
1089 val = pci_getw(bus, dev, func, PCI_BCNF_MEM_LIMIT);
1090 limit = ((val & PCI_BCNF_MEM_MASK) << PCI_BCNF_MEM_SHIFT) |
1091 PCI_BCNF_MEM_LIMIT_BITS;
1092 val = pci_getw(bus, dev, func, PCI_BCNF_MEM_BASE);
1093 base = ((val & PCI_BCNF_MEM_MASK) << PCI_BCNF_MEM_SHIFT);
1094 VERIFY0(base >> 32);
1095 break;
1096
1097 case RES_PMEM:
1098 val = pci_getw(bus, dev, func, PCI_BCNF_PF_LIMIT_LOW);
1099 limit = ((val & PCI_BCNF_MEM_MASK) << PCI_BCNF_MEM_SHIFT) |
1100 PCI_BCNF_MEM_LIMIT_BITS;
1101 val = pci_getw(bus, dev, func, PCI_BCNF_PF_BASE_LOW);
1102 base = ((val & PCI_BCNF_MEM_MASK) << PCI_BCNF_MEM_SHIFT);
1103
1104 if ((val & PCI_BCNF_ADDR_MASK) == PCI_BCNF_PF_MEM_64BIT) {
1105 val = pci_getl(bus, dev, func, PCI_BCNF_PF_BASE_HIGH);
1106 base |= val << 32;
1107 val = pci_getl(bus, dev, func, PCI_BCNF_PF_LIMIT_HIGH);
1108 limit |= val << 32;
1109 }
1110 break;
1111 default:
1112 panic("Invalid resource type %d", type);
1113 }
1114
1115 *basep = base;
1116 *limitp = limit;
1117 }
1118
1119 /*
1120 * Assign valid resources to unconfigured pci(e) bridges. We are trying
1121 * to reprogram the bridge when its
1122 * i) SECBUS == SUBBUS ||
1123 * ii) IOBASE > IOLIM ||
1124 * iii) MEMBASE > MEMLIM && PMEMBASE > PMEMLIM
1125 * This must be done after one full pass through the PCI tree to collect
1126 * all firmware-configured resources, so that we know what resources are
1127 * free and available to assign to the unconfigured PPBs.
1128 */
1129 static void
fix_ppb_res(uchar_t secbus,boolean_t prog_sub)1130 fix_ppb_res(uchar_t secbus, boolean_t prog_sub)
1131 {
1132 uchar_t bus, dev, func;
1133 uchar_t parbus, subbus;
1134 struct {
1135 uint64_t base;
1136 uint64_t limit;
1137 uint64_t size;
1138 uint64_t align;
1139 } io, mem, pmem;
1140 uint64_t addr = 0;
1141 int *regp = NULL;
1142 uint_t reglen, buscount;
1143 int rv, cap_ptr, physhi;
1144 dev_info_t *dip;
1145 uint16_t cmd_reg;
1146 struct memlist *scratch_list;
1147 boolean_t reprogram_io, reprogram_mem;
1148
1149 /* skip root (peer) PCI busses */
1150 if (pci_bus_res[secbus].par_bus == (uchar_t)-1)
1151 return;
1152
1153 /* skip subtractive PPB when prog_sub is not TRUE */
1154 if (pci_bus_res[secbus].subtractive && !prog_sub)
1155 return;
1156
1157 /* some entries may be empty due to discontiguous bus numbering */
1158 dip = pci_bus_res[secbus].dip;
1159 if (dip == NULL)
1160 return;
1161
1162 rv = ddi_prop_lookup_int_array(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
1163 "reg", ®p, ®len);
1164 if (rv != DDI_PROP_SUCCESS || reglen == 0)
1165 return;
1166 physhi = regp[0];
1167 ddi_prop_free(regp);
1168
1169 func = (uchar_t)PCI_REG_FUNC_G(physhi);
1170 dev = (uchar_t)PCI_REG_DEV_G(physhi);
1171 bus = (uchar_t)PCI_REG_BUS_G(physhi);
1172
1173 dump_memlists("fix_ppb_res start bus", bus);
1174 dump_memlists("fix_ppb_res start secbus", secbus);
1175
1176 /*
1177 * If pcie bridge, check to see if link is enabled
1178 */
1179 cap_ptr = get_pci_cap(bus, dev, func, PCI_CAP_ID_PCI_E);
1180 if (cap_ptr != -1) {
1181 uint16_t reg = pci_getw(bus, dev, func,
1182 (uint16_t)cap_ptr + PCIE_LINKCTL);
1183 if ((reg & PCIE_LINKCTL_LINK_DISABLE) != 0) {
1184 dcmn_err(CE_NOTE, MSGHDR "link is disabled",
1185 "ppb", bus, dev, func);
1186 return;
1187 }
1188 }
1189
1190 subbus = pci_getb(bus, dev, func, PCI_BCNF_SUBBUS);
1191 parbus = pci_bus_res[secbus].par_bus;
1192 ASSERT(parbus == bus);
1193 cmd_reg = pci_getw(bus, dev, func, PCI_CONF_COMM);
1194
1195 /*
1196 * If we have a Cardbus bridge, but no bus space
1197 */
1198 if (pci_bus_res[secbus].num_cbb != 0 &&
1199 pci_bus_res[secbus].bus_avail == NULL) {
1200 uchar_t range;
1201
1202 /* normally there are 2 buses under a cardbus bridge */
1203 range = pci_bus_res[secbus].num_cbb * 2;
1204
1205 /*
1206 * Try to find and allocate a bus-range starting at subbus+1
1207 * from the parent of the PPB.
1208 */
1209 for (; range != 0; range--) {
1210 if (pci_memlist_find_with_startaddr(
1211 &pci_bus_res[parbus].bus_avail,
1212 subbus + 1, range, 1) != 0) {
1213 break; /* find bus range resource at parent */
1214 }
1215 }
1216 if (range != 0) {
1217 pci_memlist_insert(&pci_bus_res[secbus].bus_avail,
1218 subbus + 1, range);
1219 subbus = subbus + range;
1220 pci_bus_res[secbus].sub_bus = subbus;
1221 pci_putb(bus, dev, func, PCI_BCNF_SUBBUS, subbus);
1222 add_bus_range_prop(secbus);
1223
1224 cmn_err(CE_NOTE,
1225 MSGHDR "PROGRAM cardbus buses 0x%x ~ 0x%x",
1226 "cbb", bus, dev, func, secbus, subbus);
1227 }
1228 }
1229
1230 buscount = subbus - secbus + 1;
1231
1232 dcmn_err(CE_NOTE, MSGHDR
1233 "secbus 0x%x existing sizes I/O 0x%x, MEM 0x%lx, PMEM 0x%lx",
1234 "ppb", bus, dev, func, secbus,
1235 pci_bus_res[secbus].io_size, pci_bus_res[secbus].mem_size,
1236 pci_bus_res[secbus].pmem_size);
1237
1238 /*
1239 * If the bridge's I/O range needs to be reprogrammed, then the
1240 * bridge is going to be allocated the greater of:
1241 * - 512 bytes per downstream bus;
1242 * - the amount required by its current children.
1243 * rounded up to the next 4K.
1244 */
1245 io.size = MAX(pci_bus_res[secbus].io_size, buscount * 0x200);
1246
1247 /*
1248 * Similarly if the memory ranges need to be reprogrammed, then we'd
1249 * like to assign some extra memory to the bridge in case there is
1250 * anything hotplugged underneath later.
1251 *
1252 * We use the information gathered earlier relating to the number of
1253 * bridges that must share the resource of this bus' root port, and how
1254 * much memory is available that isn't already accounted for to
1255 * determine how much to use.
1256 *
1257 * At least the existing `mem_size` must be allocated as that has been
1258 * gleaned from enumeration.
1259 */
1260 uint64_t avail = get_per_bridge_avail(bus);
1261
1262 mem.size = 0;
1263 if (avail > 0) {
1264 /* Try 32MiB first, then adjust down until it fits */
1265 for (uint_t i = 32; i > 0; i >>= 1) {
1266 if (avail >= buscount * PPB_MEM_ALIGNMENT * i) {
1267 mem.size = buscount * PPB_MEM_ALIGNMENT * i;
1268 dcmn_err(CE_NOTE, MSGHDR
1269 "Allocating %uMiB",
1270 "ppb", bus, dev, func, i);
1271 break;
1272 }
1273 }
1274 }
1275 mem.size = MAX(pci_bus_res[secbus].mem_size, mem.size);
1276
1277 /*
1278 * For the PF memory range, illumos has not historically handed out
1279 * any additional memory to bridges. However there are some
1280 * hotpluggable devices which need 64-bit PF space and so we now always
1281 * attempt to allocate at least 32 MiB. If there is enough space
1282 * available from a parent then we will increase this to 512MiB.
1283 * If we're later unable to find memory to satisfy this, we just move
1284 * on and are no worse off than before.
1285 */
1286 pmem.size = MAX(pci_bus_res[secbus].pmem_size,
1287 buscount * PPB_MEM_ALIGNMENT * 32);
1288
1289 /*
1290 * Check if the parent bus could allocate a 64-bit sized PF
1291 * range and bump the minimum pmem.size to 512MB if so.
1292 */
1293 if (lookup_parbus_res(parbus, 1ULL << 32, PPB_MEM_ALIGNMENT,
1294 RES_PMEM) > 0) {
1295 pmem.size = MAX(pci_bus_res[secbus].pmem_size,
1296 buscount * PPB_MEM_ALIGNMENT * 512);
1297 }
1298
1299 /*
1300 * I/O space needs to be 4KiB aligned, Memory space needs to be 1MiB
1301 * aligned.
1302 *
1303 * We calculate alignment as the largest power of two less than the
1304 * the sum of all children's size requirements, because this will
1305 * align to the size of the largest child request within that size
1306 * (which is always a power of two).
1307 */
1308 io.size = P2ROUNDUP(io.size, PPB_IO_ALIGNMENT);
1309 mem.size = P2ROUNDUP(mem.size, PPB_MEM_ALIGNMENT);
1310 pmem.size = P2ROUNDUP(pmem.size, PPB_MEM_ALIGNMENT);
1311
1312 io.align = io.size;
1313 P2LE(io.align);
1314 mem.align = mem.size;
1315 P2LE(mem.align);
1316 pmem.align = pmem.size;
1317 P2LE(pmem.align);
1318
1319 /* Subtractive bridge */
1320 if (pci_bus_res[secbus].subtractive && prog_sub) {
1321 /*
1322 * We program an arbitrary amount of I/O and memory resource
1323 * for the subtractive bridge so that child dynamic-resource-
1324 * allocating devices (such as Cardbus bridges) have a chance
1325 * of success. Until we have full-tree resource rebalancing,
1326 * dynamic resource allocation (thru busra) only looks at the
1327 * parent bridge, so all PPBs must have some allocatable
1328 * resource. For non-subtractive bridges, the resources come
1329 * from the base/limit register "windows", but subtractive
1330 * bridges often don't program those (since they don't need to).
1331 * If we put all the remaining resources on the subtractive
1332 * bridge, then peer non-subtractive bridges can't allocate
1333 * more space (even though this is probably most correct).
1334 * If we put the resources only on the parent, then allocations
1335 * from children of subtractive bridges will fail without
1336 * special-case code for bypassing the subtractive bridge.
1337 * This solution is the middle-ground temporary solution until
1338 * we have fully-capable resource allocation.
1339 */
1340
1341 /*
1342 * Add an arbitrary I/O resource to the subtractive PPB
1343 */
1344 if (pci_bus_res[secbus].io_avail == NULL) {
1345 addr = get_parbus_res(parbus, secbus, io.size,
1346 io.align, RES_IO);
1347 if (addr != 0) {
1348 add_ranges_prop(secbus, B_TRUE);
1349 pci_bus_res[secbus].io_reprogram =
1350 pci_bus_res[parbus].io_reprogram;
1351
1352 cmn_err(CE_NOTE,
1353 MSGHDR "PROGRAM I/O range 0x%lx ~ 0x%lx "
1354 "(subtractive bridge)",
1355 "ppb", bus, dev, func,
1356 addr, addr + io.size - 1);
1357 }
1358 }
1359 /*
1360 * Add an arbitrary memory resource to the subtractive PPB
1361 */
1362 if (pci_bus_res[secbus].mem_avail == NULL) {
1363 addr = get_parbus_res(parbus, secbus, mem.size,
1364 mem.align, RES_MEM);
1365 if (addr != 0) {
1366 add_ranges_prop(secbus, B_TRUE);
1367 pci_bus_res[secbus].mem_reprogram =
1368 pci_bus_res[parbus].mem_reprogram;
1369
1370 cmn_err(CE_NOTE,
1371 MSGHDR "PROGRAM MEM range 0x%lx ~ 0x%lx "
1372 "(subtractive bridge)",
1373 "ppb", bus, dev, func,
1374 addr, addr + mem.size - 1);
1375 }
1376 }
1377
1378 goto cmd_enable;
1379 }
1380
1381 /*
1382 * Retrieve the various configured ranges from the bridge.
1383 */
1384
1385 fetch_ppb_res(bus, dev, func, RES_IO, &io.base, &io.limit);
1386 fetch_ppb_res(bus, dev, func, RES_MEM, &mem.base, &mem.limit);
1387 fetch_ppb_res(bus, dev, func, RES_PMEM, &pmem.base, &pmem.limit);
1388
1389 /*
1390 * Reprogram IO if:
1391 *
1392 * - The list does not consist entirely of legacy VGA resources;
1393 *
1394 * and any of
1395 *
1396 * - The parent bus is flagged for reprogramming;
1397 * - IO space is currently disabled in the command register;
1398 * - IO space is disabled via base/limit.
1399 */
1400 scratch_list = pci_memlist_dup(pci_bus_res[secbus].io_avail);
1401 pci_memlist_merge(&pci_bus_res[secbus].io_used, &scratch_list);
1402
1403 reprogram_io = !list_is_vga_only(scratch_list, RES_IO) &&
1404 (pci_bus_res[parbus].io_reprogram ||
1405 (cmd_reg & PCI_COMM_IO) == 0 ||
1406 io.base > io.limit);
1407
1408 pci_memlist_free_all(&scratch_list);
1409
1410 if (reprogram_io) {
1411 if (pci_bus_res[secbus].io_used != NULL) {
1412 pci_memlist_subsume(&pci_bus_res[secbus].io_used,
1413 &pci_bus_res[secbus].io_avail);
1414 }
1415
1416 if (pci_bus_res[secbus].io_avail != NULL &&
1417 !pci_bus_res[parbus].io_reprogram &&
1418 !pci_bus_res[parbus].subtractive) {
1419 /* re-choose old io ports info */
1420
1421 uint64_t base, limit;
1422
1423 pci_memlist_range(pci_bus_res[secbus].io_avail,
1424 RES_IO, &base, &limit);
1425 io.base = (uint_t)base;
1426 io.limit = (uint_t)limit;
1427
1428 /* 4K aligned */
1429 io.base = P2ALIGN(base, PPB_IO_ALIGNMENT);
1430 io.limit = P2ROUNDUP(io.limit, PPB_IO_ALIGNMENT) - 1;
1431 io.size = io.limit - io.base + 1;
1432 ASSERT3U(io.base, <=, io.limit);
1433 pci_memlist_free_all(&pci_bus_res[secbus].io_avail);
1434 pci_memlist_insert(&pci_bus_res[secbus].io_avail,
1435 io.base, io.size);
1436 pci_memlist_insert(&pci_bus_res[parbus].io_used,
1437 io.base, io.size);
1438 (void) pci_memlist_remove(&pci_bus_res[parbus].io_avail,
1439 io.base, io.size);
1440 pci_bus_res[secbus].io_reprogram = B_TRUE;
1441 } else {
1442 /* get new io ports from parent bus */
1443 addr = get_parbus_res(parbus, secbus, io.size,
1444 io.align, RES_IO);
1445 if (addr != 0) {
1446 io.base = addr;
1447 io.limit = addr + io.size - 1;
1448 pci_bus_res[secbus].io_reprogram = B_TRUE;
1449 }
1450 }
1451
1452 if (pci_bus_res[secbus].io_reprogram) {
1453 /* reprogram PPB regs */
1454 set_ppb_res(bus, dev, func, RES_IO, io.base, io.limit);
1455 add_ranges_prop(secbus, B_TRUE);
1456 }
1457 }
1458
1459 /*
1460 * Reprogram memory if:
1461 *
1462 * - The list does not consist entirely of legacy VGA resources;
1463 *
1464 * and any of
1465 *
1466 * - The parent bus is flagged for reprogramming;
1467 * - Mem space is currently disabled in the command register;
1468 * - Both mem and pmem space are disabled via base/limit.
1469 *
1470 * Always reprogram both mem and pmem together since this leaves
1471 * resources in the 'avail' list for add_reg_props() to subsequently
1472 * find and assign.
1473 */
1474 scratch_list = pci_memlist_dup(pci_bus_res[secbus].mem_avail);
1475 pci_memlist_merge(&pci_bus_res[secbus].mem_used, &scratch_list);
1476
1477 reprogram_mem = !list_is_vga_only(scratch_list, RES_MEM) &&
1478 (pci_bus_res[parbus].mem_reprogram ||
1479 (cmd_reg & PCI_COMM_MAE) == 0 ||
1480 (mem.base > mem.limit && pmem.base > pmem.limit));
1481
1482 pci_memlist_free_all(&scratch_list);
1483
1484 if (reprogram_mem) {
1485 /* Mem range */
1486 if (pci_bus_res[secbus].mem_used != NULL) {
1487 pci_memlist_subsume(&pci_bus_res[secbus].mem_used,
1488 &pci_bus_res[secbus].mem_avail);
1489 }
1490
1491 /*
1492 * At this point, if the parent bus has not been
1493 * reprogrammed and there is memory in this bus' available
1494 * pool, then it can just be re-used. Otherwise a new range
1495 * is requested from the parent bus - note that
1496 * get_parbus_res() also takes care of constructing new
1497 * avail and used lists for the bus.
1498 *
1499 * For a subtractive parent bus, always request a fresh
1500 * memory range.
1501 */
1502 if (pci_bus_res[secbus].mem_avail != NULL &&
1503 !pci_bus_res[parbus].mem_reprogram &&
1504 !pci_bus_res[parbus].subtractive) {
1505 /* re-choose old mem resource */
1506 pci_memlist_range(pci_bus_res[secbus].mem_avail,
1507 RES_MEM, &mem.base, &mem.limit);
1508
1509 mem.base = P2ALIGN(mem.base, PPB_MEM_ALIGNMENT);
1510 mem.limit = P2ROUNDUP(mem.limit, PPB_MEM_ALIGNMENT) - 1;
1511 mem.size = mem.limit + 1 - mem.base;
1512 ASSERT3U(mem.base, <=, mem.limit);
1513 pci_memlist_free_all(&pci_bus_res[secbus].mem_avail);
1514 pci_memlist_insert(&pci_bus_res[secbus].mem_avail,
1515 mem.base, mem.size);
1516 pci_memlist_insert(&pci_bus_res[parbus].mem_used,
1517 mem.base, mem.size);
1518 (void) pci_memlist_remove(
1519 &pci_bus_res[parbus].mem_avail, mem.base,
1520 mem.size);
1521 pci_bus_res[secbus].mem_reprogram = B_TRUE;
1522 } else {
1523 /* get new mem resource from parent bus */
1524 addr = get_parbus_res(parbus, secbus, mem.size,
1525 mem.align, RES_MEM);
1526 if (addr != 0) {
1527 mem.base = addr;
1528 mem.limit = addr + mem.size - 1;
1529 pci_bus_res[secbus].mem_reprogram = B_TRUE;
1530 }
1531 }
1532
1533 /* Prefetch mem */
1534 if (pci_bus_res[secbus].pmem_used != NULL) {
1535 pci_memlist_subsume(&pci_bus_res[secbus].pmem_used,
1536 &pci_bus_res[secbus].pmem_avail);
1537 }
1538
1539 /* Same logic as for non-prefetch memory, see above */
1540 if (pci_bus_res[secbus].pmem_avail != NULL &&
1541 !pci_bus_res[parbus].mem_reprogram &&
1542 !pci_bus_res[parbus].subtractive) {
1543 /* re-choose old mem resource */
1544
1545 pci_memlist_range(pci_bus_res[secbus].pmem_avail,
1546 RES_PMEM, &pmem.base, &pmem.limit);
1547
1548 pmem.base = P2ALIGN(pmem.base, PPB_MEM_ALIGNMENT);
1549 pmem.limit = P2ROUNDUP(pmem.limit, PPB_MEM_ALIGNMENT)
1550 - 1;
1551 pmem.size = pmem.limit + 1 - pmem.base;
1552 ASSERT3U(pmem.base, <=, pmem.limit);
1553 pci_memlist_free_all(&pci_bus_res[secbus].pmem_avail);
1554 pci_memlist_insert(&pci_bus_res[secbus].pmem_avail,
1555 pmem.base, pmem.size);
1556 pci_memlist_insert(&pci_bus_res[parbus].pmem_used,
1557 pmem.base, pmem.size);
1558 (void) pci_memlist_remove(
1559 &pci_bus_res[parbus].pmem_avail, pmem.base,
1560 pmem.size);
1561 pci_bus_res[secbus].mem_reprogram = B_TRUE;
1562 } else {
1563 /* get new mem resource from parent bus */
1564 addr = get_parbus_res(parbus, secbus, pmem.size,
1565 pmem.align, RES_PMEM);
1566 if (addr != 0) {
1567 pmem.base = addr;
1568 pmem.limit = addr + pmem.size - 1;
1569 pci_bus_res[secbus].mem_reprogram = B_TRUE;
1570 }
1571 }
1572
1573 if (pci_bus_res[secbus].mem_reprogram) {
1574 set_ppb_res(bus, dev, func,
1575 RES_MEM, mem.base, mem.limit);
1576 set_ppb_res(bus, dev, func,
1577 RES_PMEM, pmem.base, pmem.limit);
1578 add_ranges_prop(secbus, B_TRUE);
1579 }
1580 }
1581
1582 cmd_enable:
1583 dump_memlists("fix_ppb_res end bus", bus);
1584 dump_memlists("fix_ppb_res end secbus", secbus);
1585
1586 if (pci_bus_res[secbus].io_avail != NULL)
1587 cmd_reg |= PCI_COMM_IO | PCI_COMM_ME;
1588 if (pci_bus_res[secbus].mem_avail != NULL ||
1589 pci_bus_res[secbus].pmem_avail != NULL) {
1590 cmd_reg |= PCI_COMM_MAE | PCI_COMM_ME;
1591 }
1592 pci_putw(bus, dev, func, PCI_CONF_COMM, cmd_reg);
1593 }
1594
1595 void
pci_reprogram(void)1596 pci_reprogram(void)
1597 {
1598 int i, pci_reconfig = 1;
1599 char *onoff;
1600 int bus;
1601
1602 /*
1603 * Ask platform code for all of the root complexes it knows about in
1604 * case we have missed anything in the scan. This is to ensure that we
1605 * have them show up in the devinfo tree. This scan should find any
1606 * existing entries as well. After this, go through each bus and
1607 * ask the platform if it wants to change the name of the slot.
1608 */
1609 pci_prd_root_complex_iter(pci_rc_scan_cb, NULL);
1610 for (bus = 0; bus <= pci_boot_maxbus; bus++) {
1611 pci_prd_slot_name(bus, pci_bus_res[bus].dip);
1612 }
1613 pci_unitaddr_cache_init();
1614
1615 /*
1616 * Fix-up unit-address assignments if cache is available
1617 */
1618 if (pci_unitaddr_cache_valid()) {
1619 int pci_regs[] = {0, 0, 0};
1620 int new_addr;
1621 int index = 0;
1622
1623 for (bus = 0; bus <= pci_boot_maxbus; bus++) {
1624 /* skip non-root (peer) PCI busses */
1625 if ((pci_bus_res[bus].par_bus != (uchar_t)-1) ||
1626 (pci_bus_res[bus].dip == NULL))
1627 continue;
1628
1629 new_addr = pci_bus_unitaddr(index);
1630 if (pci_bus_res[bus].root_addr != new_addr) {
1631 /* update reg property for node */
1632 pci_regs[0] = pci_bus_res[bus].root_addr =
1633 new_addr;
1634 (void) ndi_prop_update_int_array(
1635 DDI_DEV_T_NONE, pci_bus_res[bus].dip,
1636 "reg", (int *)pci_regs, 3);
1637 }
1638 index++;
1639 }
1640 } else {
1641 /* perform legacy processing */
1642 pci_unitaddr_cache_create();
1643 }
1644
1645 /*
1646 * Do root-bus resource discovery
1647 */
1648 for (bus = 0; bus <= pci_boot_maxbus; bus++) {
1649 /* skip non-root (peer) PCI busses */
1650 if (pci_bus_res[bus].par_bus != (uchar_t)-1)
1651 continue;
1652
1653 /*
1654 * 1. find resources associated with this root bus
1655 */
1656 populate_bus_res(bus);
1657
1658 /*
1659 * 2. Exclude <1M address range here in case below reserved
1660 * ranges for BIOS data area, ROM area etc are wrongly reported
1661 * in ACPI resource producer entries for PCI root bus.
1662 * 00000000 - 000003FF RAM
1663 * 00000400 - 000004FF BIOS data area
1664 * 00000500 - 0009FFFF RAM
1665 * 000A0000 - 000BFFFF VGA RAM
1666 * 000C0000 - 000FFFFF ROM area
1667 */
1668 (void) pci_memlist_remove(&pci_bus_res[bus].mem_avail,
1669 0, 0x100000);
1670 (void) pci_memlist_remove(&pci_bus_res[bus].pmem_avail,
1671 0, 0x100000);
1672
1673 /*
1674 * 3. Calculate the amount of "spare" 32-bit memory so that we
1675 * can use that later to determine how much additional memory
1676 * to allocate to bridges in order that they have a better
1677 * chance of supporting a device being hotplugged under them.
1678 *
1679 * This is a root bus and the previous CONFIG_INFO pass has
1680 * populated `mem_size` with the sum of all of the BAR sizes
1681 * for all devices underneath, possibly adjusted up to allow
1682 * for alignment when it is later allocated. This pass has also
1683 * recorded the number of child bridges found under this bus in
1684 * `num_bridge`. To calculate the memory which can be used for
1685 * additional bridge allocations we sum up the contents of the
1686 * `mem_avail` list and subtract `mem_size`.
1687 *
1688 * When programming child bridges later in fix_ppb_res(), the
1689 * bridge count and spare memory values cached against the
1690 * relevant root port are used to determine how much memory to
1691 * be allocated.
1692 */
1693 if (pci_bus_res[bus].num_bridge > 0) {
1694 uint64_t mem = 0;
1695
1696 for (struct memlist *ml = pci_bus_res[bus].mem_avail;
1697 ml != NULL; ml = ml->ml_next) {
1698 if (ml->ml_address < UINT32_MAX)
1699 mem += ml->ml_size;
1700 }
1701
1702 if (mem > pci_bus_res[bus].mem_size)
1703 mem -= pci_bus_res[bus].mem_size;
1704 else
1705 mem = 0;
1706
1707 pci_bus_res[bus].mem_buffer = mem;
1708
1709 dcmn_err(CE_NOTE,
1710 "Bus 0x%02x, bridges 0x%x, buffer mem 0x%lx",
1711 bus, pci_bus_res[bus].num_bridge, mem);
1712 }
1713
1714 /*
1715 * 4. Remove used PCI and ISA resources from bus resource map
1716 */
1717
1718 pci_memlist_remove_list(&pci_bus_res[bus].io_avail,
1719 pci_bus_res[bus].io_used);
1720 pci_memlist_remove_list(&pci_bus_res[bus].mem_avail,
1721 pci_bus_res[bus].mem_used);
1722 pci_memlist_remove_list(&pci_bus_res[bus].pmem_avail,
1723 pci_bus_res[bus].pmem_used);
1724 pci_memlist_remove_list(&pci_bus_res[bus].mem_avail,
1725 pci_bus_res[bus].pmem_used);
1726 pci_memlist_remove_list(&pci_bus_res[bus].pmem_avail,
1727 pci_bus_res[bus].mem_used);
1728
1729 pci_memlist_remove_list(&pci_bus_res[bus].io_avail,
1730 isa_res.io_used);
1731 pci_memlist_remove_list(&pci_bus_res[bus].mem_avail,
1732 isa_res.mem_used);
1733 }
1734
1735 pci_memlist_free_all(&isa_res.io_used);
1736 pci_memlist_free_all(&isa_res.mem_used);
1737
1738 /* add bus-range property for root/peer bus nodes */
1739 for (i = 0; i <= pci_boot_maxbus; i++) {
1740 /* create bus-range property on root/peer buses */
1741 if (pci_bus_res[i].par_bus == (uchar_t)-1)
1742 add_bus_range_prop(i);
1743
1744 /* setup bus range resource on each bus */
1745 setup_bus_res(i);
1746 }
1747
1748 if (ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(),
1749 DDI_PROP_DONTPASS, "pci-reprog", &onoff) == DDI_SUCCESS) {
1750 if (strcmp(onoff, "off") == 0) {
1751 pci_reconfig = 0;
1752 cmn_err(CE_NOTE, "pci device reprogramming disabled");
1753 }
1754 ddi_prop_free(onoff);
1755 }
1756
1757 remove_subtractive_res();
1758
1759 /* reprogram the non-subtractive PPB */
1760 if (pci_reconfig)
1761 for (i = 0; i <= pci_boot_maxbus; i++)
1762 fix_ppb_res(i, B_FALSE);
1763
1764 for (i = 0; i <= pci_boot_maxbus; i++) {
1765 /* configure devices not configured by firmware */
1766 if (pci_reconfig) {
1767 /*
1768 * Reprogram the subtractive PPB. At this time, all its
1769 * siblings should have got their resources already.
1770 */
1771 if (pci_bus_res[i].subtractive)
1772 fix_ppb_res(i, B_TRUE);
1773 enumerate_bus_devs(i, CONFIG_NEW);
1774 }
1775 }
1776
1777 /* All dev programmed, so we can create available prop */
1778 for (i = 0; i <= pci_boot_maxbus; i++)
1779 add_bus_available_prop(i);
1780 }
1781
1782 /*
1783 * populate bus resources
1784 */
1785 static void
populate_bus_res(uchar_t bus)1786 populate_bus_res(uchar_t bus)
1787 {
1788 pci_bus_res[bus].pmem_avail = pci_prd_find_resource(bus,
1789 PCI_PRD_R_PREFETCH);
1790 pci_bus_res[bus].mem_avail = pci_prd_find_resource(bus, PCI_PRD_R_MMIO);
1791 pci_bus_res[bus].io_avail = pci_prd_find_resource(bus, PCI_PRD_R_IO);
1792 pci_bus_res[bus].bus_avail = pci_prd_find_resource(bus, PCI_PRD_R_BUS);
1793
1794 dump_memlists("populate_bus_res", bus);
1795
1796 /*
1797 * attempt to initialize sub_bus from the largest range-end
1798 * in the bus_avail list
1799 */
1800 if (pci_bus_res[bus].bus_avail != NULL) {
1801 struct memlist *entry;
1802 int current;
1803
1804 entry = pci_bus_res[bus].bus_avail;
1805 while (entry != NULL) {
1806 current = entry->ml_address + entry->ml_size - 1;
1807 if (current > pci_bus_res[bus].sub_bus)
1808 pci_bus_res[bus].sub_bus = current;
1809 entry = entry->ml_next;
1810 }
1811 }
1812
1813 if (bus == 0) {
1814 /*
1815 * Special treatment of bus 0:
1816 * If no IO/MEM resource from ACPI/MPSPEC/HRT, copy
1817 * pcimem from boot and make I/O space the entire range
1818 * starting at 0x100.
1819 */
1820 if (pci_bus_res[0].mem_avail == NULL) {
1821 pci_bus_res[0].mem_avail =
1822 pci_memlist_dup(bootops->boot_mem->pcimem);
1823 }
1824 /* Exclude 0x00 to 0xff of the I/O space, used by all PCs */
1825 if (pci_bus_res[0].io_avail == NULL) {
1826 pci_memlist_insert(&pci_bus_res[0].io_avail, 0x100,
1827 0xffff);
1828 }
1829 }
1830
1831 /*
1832 * Create 'ranges' property here before any resources are
1833 * removed from the resource lists
1834 */
1835 add_ranges_prop(bus, B_FALSE);
1836 }
1837
1838 /*
1839 * Create top-level bus dips, i.e. /pci@0,0, /pci@1,0...
1840 */
1841 static void
create_root_bus_dip(uchar_t bus)1842 create_root_bus_dip(uchar_t bus)
1843 {
1844 int pci_regs[] = {0, 0, 0};
1845 dev_info_t *dip;
1846
1847 ASSERT(pci_bus_res[bus].par_bus == (uchar_t)-1);
1848
1849 num_root_bus++;
1850 ndi_devi_alloc_sleep(ddi_root_node(), "pci",
1851 (pnode_t)DEVI_SID_NODEID, &dip);
1852 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
1853 "#address-cells", 3);
1854 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
1855 "#size-cells", 2);
1856 pci_regs[0] = pci_bus_res[bus].root_addr;
1857 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
1858 "reg", (int *)pci_regs, 3);
1859
1860 /*
1861 * If system has PCIe bus, then create different properties
1862 */
1863 if (create_pcie_root_bus(bus, dip) == B_FALSE)
1864 (void) ndi_prop_update_string(DDI_DEV_T_NONE, dip,
1865 "device_type", "pci");
1866
1867 (void) ndi_devi_bind_driver(dip, 0);
1868 pci_bus_res[bus].dip = dip;
1869 }
1870
1871 /*
1872 * For any fixed configuration (often compatability) pci devices
1873 * and those with their own expansion rom, create device nodes
1874 * to hold the already configured device details.
1875 */
1876 void
enumerate_bus_devs(uchar_t bus,int config_op)1877 enumerate_bus_devs(uchar_t bus, int config_op)
1878 {
1879 uchar_t dev, func, nfunc, header;
1880 ushort_t venid;
1881 struct pci_devfunc *devlist = NULL, *entry;
1882
1883 if (bus_debug(bus)) {
1884 if (config_op == CONFIG_NEW) {
1885 dcmn_err(CE_NOTE, "configuring pci bus 0x%x", bus);
1886 } else if (config_op == CONFIG_FIX) {
1887 dcmn_err(CE_NOTE,
1888 "fixing devices on pci bus 0x%x", bus);
1889 } else {
1890 dcmn_err(CE_NOTE, "enumerating pci bus 0x%x", bus);
1891 }
1892 }
1893
1894 if (config_op == CONFIG_NEW) {
1895 devlist = (struct pci_devfunc *)pci_bus_res[bus].privdata;
1896 while (devlist) {
1897 entry = devlist;
1898 devlist = entry->next;
1899 if (entry->reprogram ||
1900 pci_bus_res[bus].io_reprogram ||
1901 pci_bus_res[bus].mem_reprogram) {
1902 /* reprogram device(s) */
1903 (void) add_reg_props(entry->dip, bus,
1904 entry->dev, entry->func, CONFIG_NEW, 0);
1905 }
1906 kmem_free(entry, sizeof (*entry));
1907 }
1908 pci_bus_res[bus].privdata = NULL;
1909 return;
1910 }
1911
1912 for (dev = 0; dev < max_dev_pci; dev++) {
1913 nfunc = 1;
1914 for (func = 0; func < nfunc; func++) {
1915
1916 venid = pci_getw(bus, dev, func, PCI_CONF_VENID);
1917
1918 if ((venid == 0xffff) || (venid == 0)) {
1919 /* no function at this address */
1920 continue;
1921 }
1922
1923 header = pci_getb(bus, dev, func, PCI_CONF_HEADER);
1924 if (header == 0xff) {
1925 continue; /* illegal value */
1926 }
1927
1928 /*
1929 * according to some mail from Microsoft posted
1930 * to the pci-drivers alias, their only requirement
1931 * for a multifunction device is for the 1st
1932 * function to have to PCI_HEADER_MULTI bit set.
1933 */
1934 if ((func == 0) && (header & PCI_HEADER_MULTI)) {
1935 nfunc = 8;
1936 }
1937
1938 if (config_op == CONFIG_FIX ||
1939 config_op == CONFIG_INFO) {
1940 /*
1941 * Create the node, unconditionally, on the
1942 * first pass only. It may still need
1943 * resource assignment, which will be
1944 * done on the second, CONFIG_NEW, pass.
1945 */
1946 process_devfunc(bus, dev, func, config_op);
1947
1948 }
1949 }
1950 }
1951
1952 /* percolate bus used resources up through parents to root */
1953 if (config_op == CONFIG_INFO) {
1954 int par_bus;
1955
1956 par_bus = pci_bus_res[bus].par_bus;
1957 while (par_bus != (uchar_t)-1) {
1958 pci_bus_res[par_bus].io_size +=
1959 pci_bus_res[bus].io_size;
1960 pci_bus_res[par_bus].mem_size +=
1961 pci_bus_res[bus].mem_size;
1962 pci_bus_res[par_bus].pmem_size +=
1963 pci_bus_res[bus].pmem_size;
1964
1965 if (pci_bus_res[bus].io_used != NULL) {
1966 pci_memlist_merge(&pci_bus_res[bus].io_used,
1967 &pci_bus_res[par_bus].io_used);
1968 }
1969
1970 if (pci_bus_res[bus].mem_used != NULL) {
1971 pci_memlist_merge(&pci_bus_res[bus].mem_used,
1972 &pci_bus_res[par_bus].mem_used);
1973 }
1974
1975 if (pci_bus_res[bus].pmem_used != NULL) {
1976 pci_memlist_merge(&pci_bus_res[bus].pmem_used,
1977 &pci_bus_res[par_bus].pmem_used);
1978 }
1979
1980 pci_bus_res[par_bus].num_bridge +=
1981 pci_bus_res[bus].num_bridge;
1982
1983 bus = par_bus;
1984 par_bus = pci_bus_res[par_bus].par_bus;
1985 }
1986 }
1987 }
1988
1989 /*
1990 * As a workaround for devices which is_pciide() (below, which see) would not
1991 * match due to device issues, check an undocumented device tree property
1992 * 'pci-ide', the value of which is a 1275 device identifier.
1993 *
1994 * Should a device matching this (in normal 'compatible' order) be found, and
1995 * the device not otherwise bound, it will be have its node name changed to
1996 * 'pci-ide' so the pci-ide driver will attach.
1997 *
1998 * This can be set via `eeprom pci-ide=pciXXXX,YYYY` (see eeprom(8)) or
1999 * otherwise added to bootenv.rc.
2000 */
2001 static boolean_t
check_pciide_prop(uchar_t revid,ushort_t venid,ushort_t devid,ushort_t subvenid,ushort_t subdevid)2002 check_pciide_prop(uchar_t revid, ushort_t venid, ushort_t devid,
2003 ushort_t subvenid, ushort_t subdevid)
2004 {
2005 static int prop_exist = -1;
2006 static char *pciide_str;
2007 char compat[32];
2008
2009 if (prop_exist == -1) {
2010 prop_exist = (ddi_prop_lookup_string(DDI_DEV_T_ANY,
2011 ddi_root_node(), DDI_PROP_DONTPASS, "pci-ide",
2012 &pciide_str) == DDI_SUCCESS);
2013 }
2014
2015 if (!prop_exist)
2016 return (B_FALSE);
2017
2018 /* compare property value against various forms of compatible */
2019 if (subvenid) {
2020 (void) snprintf(compat, sizeof (compat), "pci%x,%x.%x.%x.%x",
2021 venid, devid, subvenid, subdevid, revid);
2022 if (strcmp(pciide_str, compat) == 0)
2023 return (B_TRUE);
2024
2025 (void) snprintf(compat, sizeof (compat), "pci%x,%x.%x.%x",
2026 venid, devid, subvenid, subdevid);
2027 if (strcmp(pciide_str, compat) == 0)
2028 return (B_TRUE);
2029
2030 (void) snprintf(compat, sizeof (compat), "pci%x,%x",
2031 subvenid, subdevid);
2032 if (strcmp(pciide_str, compat) == 0)
2033 return (B_TRUE);
2034 }
2035 (void) snprintf(compat, sizeof (compat), "pci%x,%x.%x",
2036 venid, devid, revid);
2037 if (strcmp(pciide_str, compat) == 0)
2038 return (B_TRUE);
2039
2040 (void) snprintf(compat, sizeof (compat), "pci%x,%x", venid, devid);
2041 if (strcmp(pciide_str, compat) == 0)
2042 return (B_TRUE);
2043
2044 return (B_FALSE);
2045 }
2046
2047 static boolean_t
is_pciide(const pci_prop_data_t * prop)2048 is_pciide(const pci_prop_data_t *prop)
2049 {
2050 struct ide_table {
2051 ushort_t venid;
2052 ushort_t devid;
2053 };
2054
2055 /*
2056 * Devices which need to be matched specially as pci-ide because of
2057 * various device issues. Commonly their specification as being
2058 * PCI_MASS_OTHER or PCI_MASS_SATA despite our using them in ATA mode.
2059 */
2060 static struct ide_table ide_other[] = {
2061 {0x1095, 0x3112}, /* Silicon Image 3112 SATALink/SATARaid */
2062 {0x1095, 0x3114}, /* Silicon Image 3114 SATALink/SATARaid */
2063 {0x1095, 0x3512}, /* Silicon Image 3512 SATALink/SATARaid */
2064 {0x1095, 0x680}, /* Silicon Image PCI0680 Ultra ATA-133 */
2065 {0x1283, 0x8211} /* Integrated Technology Express 8211F */
2066 };
2067
2068 if (prop->ppd_class != PCI_CLASS_MASS)
2069 return (B_FALSE);
2070
2071 if (prop->ppd_subclass == PCI_MASS_IDE) {
2072 return (B_TRUE);
2073 }
2074
2075 if (check_pciide_prop(prop->ppd_rev, prop->ppd_vendid,
2076 prop->ppd_devid, prop->ppd_subvid, prop->ppd_subsys)) {
2077 return (B_TRUE);
2078 }
2079
2080 if (prop->ppd_subclass != PCI_MASS_OTHER &&
2081 prop->ppd_subclass != PCI_MASS_SATA) {
2082 return (B_FALSE);
2083 }
2084
2085 for (size_t i = 0; i < ARRAY_SIZE(ide_other); i++) {
2086 if (ide_other[i].venid == prop->ppd_vendid &&
2087 ide_other[i].devid == prop->ppd_devid)
2088 return (B_TRUE);
2089 }
2090 return (B_FALSE);
2091 }
2092
2093 static void
add_undofix_entry(uint8_t bus,uint8_t dev,uint8_t fn,void (* undofn)(uint8_t,uint8_t,uint8_t))2094 add_undofix_entry(uint8_t bus, uint8_t dev, uint8_t fn,
2095 void (*undofn)(uint8_t, uint8_t, uint8_t))
2096 {
2097 struct pci_fixundo *newundo;
2098
2099 newundo = kmem_alloc(sizeof (struct pci_fixundo), KM_SLEEP);
2100
2101 /*
2102 * Adding an item to this list means that we must turn its NMIENABLE
2103 * bit back on at a later time.
2104 */
2105 newundo->bus = bus;
2106 newundo->dev = dev;
2107 newundo->fn = fn;
2108 newundo->undofn = undofn;
2109 newundo->next = undolist;
2110
2111 /* add to the undo list in LIFO order */
2112 undolist = newundo;
2113 }
2114
2115 void
add_pci_fixes(void)2116 add_pci_fixes(void)
2117 {
2118 int i;
2119
2120 for (i = 0; i <= pci_boot_maxbus; i++) {
2121 /*
2122 * For each bus, apply needed fixes to the appropriate devices.
2123 * This must be done before the main enumeration loop because
2124 * some fixes must be applied to devices normally encountered
2125 * later in the pci scan (e.g. if a fix to device 7 must be
2126 * applied before scanning device 6, applying fixes in the
2127 * normal enumeration loop would obviously be too late).
2128 */
2129 enumerate_bus_devs(i, CONFIG_FIX);
2130 }
2131 }
2132
2133 void
undo_pci_fixes(void)2134 undo_pci_fixes(void)
2135 {
2136 struct pci_fixundo *nextundo;
2137 uint8_t bus, dev, fn;
2138
2139 /*
2140 * All fixes in the undo list are performed unconditionally. Future
2141 * fixes may require selective undo.
2142 */
2143 while (undolist != NULL) {
2144
2145 bus = undolist->bus;
2146 dev = undolist->dev;
2147 fn = undolist->fn;
2148
2149 (*(undolist->undofn))(bus, dev, fn);
2150
2151 nextundo = undolist->next;
2152 kmem_free(undolist, sizeof (struct pci_fixundo));
2153 undolist = nextundo;
2154 }
2155 }
2156
2157 static void
undo_amd8111_pci_fix(uint8_t bus,uint8_t dev,uint8_t fn)2158 undo_amd8111_pci_fix(uint8_t bus, uint8_t dev, uint8_t fn)
2159 {
2160 uint8_t val8;
2161
2162 val8 = pci_getb(bus, dev, fn, LPC_IO_CONTROL_REG_1);
2163 /*
2164 * The NMIONERR bit is turned back on to allow the SMM BIOS
2165 * to handle more critical PCI errors (e.g. PERR#).
2166 */
2167 val8 |= AMD8111_ENABLENMI;
2168 pci_putb(bus, dev, fn, LPC_IO_CONTROL_REG_1, val8);
2169 }
2170
2171 static void
pci_fix_amd8111(uint8_t bus,uint8_t dev,uint8_t fn)2172 pci_fix_amd8111(uint8_t bus, uint8_t dev, uint8_t fn)
2173 {
2174 uint8_t val8;
2175
2176 val8 = pci_getb(bus, dev, fn, LPC_IO_CONTROL_REG_1);
2177
2178 if ((val8 & AMD8111_ENABLENMI) == 0)
2179 return;
2180
2181 /*
2182 * We reset NMIONERR in the LPC because master-abort on the PCI
2183 * bridge side of the 8111 will cause NMI, which might cause SMI,
2184 * which sometimes prevents all devices from being enumerated.
2185 */
2186 val8 &= ~AMD8111_ENABLENMI;
2187
2188 pci_putb(bus, dev, fn, LPC_IO_CONTROL_REG_1, val8);
2189
2190 add_undofix_entry(bus, dev, fn, undo_amd8111_pci_fix);
2191 }
2192
2193 static void
set_devpm_d0(uchar_t bus,uchar_t dev,uchar_t func)2194 set_devpm_d0(uchar_t bus, uchar_t dev, uchar_t func)
2195 {
2196 uint16_t status;
2197 uint8_t header;
2198 uint8_t cap_ptr;
2199 uint8_t cap_id;
2200 uint16_t pmcsr;
2201
2202 status = pci_getw(bus, dev, func, PCI_CONF_STAT);
2203 if (!(status & PCI_STAT_CAP))
2204 return; /* No capabilities list */
2205
2206 header = pci_getb(bus, dev, func, PCI_CONF_HEADER) & PCI_HEADER_TYPE_M;
2207 if (header == PCI_HEADER_CARDBUS)
2208 cap_ptr = pci_getb(bus, dev, func, PCI_CBUS_CAP_PTR);
2209 else
2210 cap_ptr = pci_getb(bus, dev, func, PCI_CONF_CAP_PTR);
2211 /*
2212 * Walk the capabilities list searching for a PM entry.
2213 */
2214 while (cap_ptr != PCI_CAP_NEXT_PTR_NULL && cap_ptr >= PCI_CAP_PTR_OFF) {
2215 cap_ptr &= PCI_CAP_PTR_MASK;
2216 cap_id = pci_getb(bus, dev, func, cap_ptr + PCI_CAP_ID);
2217 if (cap_id == PCI_CAP_ID_PM) {
2218 pmcsr = pci_getw(bus, dev, func, cap_ptr + PCI_PMCSR);
2219 pmcsr &= ~(PCI_PMCSR_STATE_MASK);
2220 pmcsr |= PCI_PMCSR_D0; /* D0 state */
2221 pci_putw(bus, dev, func, cap_ptr + PCI_PMCSR, pmcsr);
2222 break;
2223 }
2224 cap_ptr = pci_getb(bus, dev, func, cap_ptr + PCI_CAP_NEXT_PTR);
2225 }
2226
2227 }
2228
2229 static void
process_devfunc(uchar_t bus,uchar_t dev,uchar_t func,int config_op)2230 process_devfunc(uchar_t bus, uchar_t dev, uchar_t func, int config_op)
2231 {
2232 pci_prop_data_t prop_data;
2233 pci_prop_failure_t prop_ret;
2234 dev_info_t *dip;
2235 boolean_t reprogram = B_FALSE;
2236 boolean_t pciide = B_FALSE;
2237 int power[2] = {1, 1};
2238 struct pci_devfunc *devlist = NULL, *entry = NULL;
2239 gfx_entry_t *gfxp;
2240 pcie_req_id_t bdf;
2241
2242 prop_ret = pci_prop_data_fill(NULL, bus, dev, func, &prop_data);
2243 if (prop_ret != PCI_PROP_OK) {
2244 cmn_err(CE_WARN, MSGHDR "failed to get basic PCI data: 0x%x",
2245 "pci", bus, dev, func, prop_ret);
2246 return;
2247 }
2248
2249 if (prop_data.ppd_header == PCI_HEADER_CARDBUS &&
2250 config_op == CONFIG_INFO) {
2251 /* Record the # of cardbus bridges found on the bus */
2252 pci_bus_res[bus].num_cbb++;
2253 }
2254
2255 if (config_op == CONFIG_FIX) {
2256 if (prop_data.ppd_vendid == VENID_AMD &&
2257 prop_data.ppd_devid == DEVID_AMD8111_LPC) {
2258 pci_fix_amd8111(bus, dev, func);
2259 }
2260 return;
2261 }
2262
2263 /* make sure parent bus dip has been created */
2264 if (pci_bus_res[bus].dip == NULL)
2265 create_root_bus_dip(bus);
2266
2267 ndi_devi_alloc_sleep(pci_bus_res[bus].dip, DEVI_PSEUDO_NEXNAME,
2268 DEVI_SID_NODEID, &dip);
2269 prop_ret = pci_prop_name_node(dip, &prop_data);
2270 if (prop_ret != PCI_PROP_OK) {
2271 cmn_err(CE_WARN, MSGHDR "failed to set node name: 0x%x; "
2272 "devinfo node not created", "pci", bus, dev, func,
2273 prop_ret);
2274 (void) ndi_devi_free(dip);
2275 return;
2276 }
2277
2278 bdf = PCI_GETBDF(bus, dev, func);
2279 /*
2280 * Record BAD AMD bridges which don't support MMIO config access.
2281 */
2282 if (IS_BAD_AMD_NTBRIDGE(prop_data.ppd_vendid, prop_data.ppd_devid) ||
2283 IS_AMD_8132_CHIP(prop_data.ppd_vendid, prop_data.ppd_devid)) {
2284 uchar_t secbus = 0;
2285 uchar_t subbus = 0;
2286
2287 if (pci_prop_class_is_pcibridge(&prop_data)) {
2288 secbus = pci_getb(bus, dev, func, PCI_BCNF_SECBUS);
2289 subbus = pci_getb(bus, dev, func, PCI_BCNF_SUBBUS);
2290 }
2291 pci_cfgacc_add_workaround(bdf, secbus, subbus);
2292 }
2293
2294 /*
2295 * Only populate bus_t if this device is sitting under a PCIE root
2296 * complex. Some particular machines have both a PCIE root complex and
2297 * a PCI hostbridge, in which case only devices under the PCIE root
2298 * complex will have their bus_t populated.
2299 */
2300 if (pcie_get_rc_dip(dip) != NULL) {
2301 ck804_fix_aer_ptr(dip, bdf);
2302 (void) pcie_init_bus(dip, bdf, PCIE_BUS_INITIAL);
2303 }
2304
2305 /*
2306 * Go through and set all of the devinfo proprties on this function.
2307 */
2308 prop_ret = pci_prop_set_common_props(dip, &prop_data);
2309 if (prop_ret != PCI_PROP_OK) {
2310 cmn_err(CE_WARN, MSGHDR "failed to set properties: 0x%x; "
2311 "devinfo node not created", "pci", bus, dev, func,
2312 prop_ret);
2313 if (pcie_get_rc_dip(dip) != NULL) {
2314 pcie_fini_bus(dip, PCIE_BUS_FINAL);
2315 }
2316 (void) ndi_devi_free(dip);
2317 return;
2318 }
2319
2320 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
2321 "power-consumption", power, 2);
2322
2323 /* Set the device PM state to D0 */
2324 set_devpm_d0(bus, dev, func);
2325
2326 if (pci_prop_class_is_pcibridge(&prop_data)) {
2327 boolean_t pciex = (prop_data.ppd_flags & PCI_PROP_F_PCIE) != 0;
2328 boolean_t is_pci_bridge = pciex &&
2329 prop_data.ppd_pcie_type == PCIE_PCIECAP_DEV_TYPE_PCIE2PCI;
2330 add_ppb_props(dip, bus, dev, func, pciex, is_pci_bridge);
2331 } else {
2332 /*
2333 * Record the non-PPB devices on the bus for possible
2334 * reprogramming at 2nd bus enumeration.
2335 * Note: PPB reprogramming is done in fix_ppb_res()
2336 */
2337 devlist = (struct pci_devfunc *)pci_bus_res[bus].privdata;
2338 entry = kmem_zalloc(sizeof (*entry), KM_SLEEP);
2339 entry->dip = dip;
2340 entry->dev = dev;
2341 entry->func = func;
2342 entry->next = devlist;
2343 pci_bus_res[bus].privdata = entry;
2344 }
2345
2346 if (pci_prop_class_is_ioapic(&prop_data)) {
2347 create_ioapic_node(bus, dev, func, prop_data.ppd_vendid,
2348 prop_data.ppd_devid);
2349 }
2350
2351 /* check for NVIDIA CK8-04/MCP55 based LPC bridge */
2352 if (NVIDIA_IS_LPC_BRIDGE(prop_data.ppd_vendid, prop_data.ppd_devid) &&
2353 dev == 1 && func == 0) {
2354 add_nvidia_isa_bridge_props(dip, bus, dev, func);
2355 /* each LPC bridge has an integrated IOAPIC */
2356 apic_nvidia_io_max++;
2357 }
2358
2359 prop_ret = pci_prop_set_compatible(dip, &prop_data);
2360 if (prop_ret != PCI_PROP_OK) {
2361 cmn_err(CE_WARN, MSGHDR "failed to set compatible property: "
2362 "0x%x; device may not bind to a driver", "pci", bus, dev,
2363 func, prop_ret);
2364 }
2365
2366 /*
2367 * See if this device is a controller that advertises
2368 * itself to be a standard ATA task file controller, or one that
2369 * has been hard coded.
2370 *
2371 * If it is, check if any other higher precedence driver listed in
2372 * driver_aliases will claim the node by calling
2373 * ddi_compatible_driver_major. If so, clear pciide and do not
2374 * create a pci-ide node or any other special handling.
2375 *
2376 * If another driver does not bind, set the node name to pci-ide
2377 * and then let the special pci-ide handling for registers and
2378 * child pci-ide nodes proceed below.
2379 */
2380 if (is_pciide(&prop_data)) {
2381 if (ddi_compatible_driver_major(dip, NULL) == (major_t)-1) {
2382 (void) ndi_devi_set_nodename(dip, "pci-ide", 0);
2383 pciide = B_TRUE;
2384 }
2385 }
2386
2387 DEVI_SET_PCI(dip);
2388 reprogram = add_reg_props(dip, bus, dev, func, config_op, pciide);
2389 (void) ndi_devi_bind_driver(dip, 0);
2390
2391 /* special handling for pci-ide */
2392 if (pciide) {
2393 dev_info_t *cdip;
2394
2395 /*
2396 * Create properties specified by P1275 Working Group
2397 * Proposal #414 Version 1
2398 */
2399 (void) ndi_prop_update_string(DDI_DEV_T_NONE, dip,
2400 "device_type", "pci-ide");
2401 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
2402 "#address-cells", 1);
2403 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
2404 "#size-cells", 0);
2405
2406 /* allocate two child nodes */
2407 ndi_devi_alloc_sleep(dip, "ide",
2408 (pnode_t)DEVI_SID_NODEID, &cdip);
2409 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cdip,
2410 "reg", 0);
2411 (void) ndi_devi_bind_driver(cdip, 0);
2412 ndi_devi_alloc_sleep(dip, "ide",
2413 (pnode_t)DEVI_SID_NODEID, &cdip);
2414 (void) ndi_prop_update_int(DDI_DEV_T_NONE, cdip,
2415 "reg", 1);
2416 (void) ndi_devi_bind_driver(cdip, 0);
2417
2418 reprogram = B_FALSE; /* don't reprogram pci-ide bridge */
2419 }
2420
2421 if (pci_prop_class_is_vga(&prop_data)) {
2422 gfxp = kmem_zalloc(sizeof (*gfxp), KM_SLEEP);
2423 gfxp->g_dip = dip;
2424 gfxp->g_prev = NULL;
2425 gfxp->g_next = gfx_devinfo_list;
2426 gfx_devinfo_list = gfxp;
2427 if (gfxp->g_next)
2428 gfxp->g_next->g_prev = gfxp;
2429 }
2430
2431 if (reprogram && (entry != NULL))
2432 entry->reprogram = B_TRUE;
2433 }
2434
2435 /*
2436 * Adjust the reg properties for a dual channel PCI-IDE device.
2437 *
2438 * NOTE: don't do anything that changes the order of the hard-decodes
2439 * and programmed BARs. The kernel driver depends on these values
2440 * being in this order regardless of whether they're for a 'native'
2441 * mode BAR or not.
2442 */
2443 /*
2444 * config info for pci-ide devices
2445 */
2446 static struct {
2447 uchar_t native_mask; /* 0 == 'compatibility' mode, 1 == native */
2448 uchar_t bar_offset; /* offset for alt status register */
2449 ushort_t addr; /* compatibility mode base address */
2450 ushort_t length; /* number of ports for this BAR */
2451 } pciide_bar[] = {
2452 { 0x01, 0, 0x1f0, 8 }, /* primary lower BAR */
2453 { 0x01, 2, 0x3f6, 1 }, /* primary upper BAR */
2454 { 0x04, 0, 0x170, 8 }, /* secondary lower BAR */
2455 { 0x04, 2, 0x376, 1 } /* secondary upper BAR */
2456 };
2457
2458 static boolean_t
pciide_adjust_bar(uchar_t progcl,uint_t bar,uint_t * basep,uint_t * lenp)2459 pciide_adjust_bar(uchar_t progcl, uint_t bar, uint_t *basep, uint_t *lenp)
2460 {
2461 boolean_t hard_decode = B_FALSE;
2462
2463 /*
2464 * Adjust the base and len for the BARs of the PCI-IDE
2465 * device's primary and secondary controllers. The first
2466 * two BARs are for the primary controller and the next
2467 * two BARs are for the secondary controller. The fifth
2468 * and sixth bars are never adjusted.
2469 */
2470 if (bar <= 3) {
2471 *lenp = pciide_bar[bar].length;
2472
2473 if (progcl & pciide_bar[bar].native_mask) {
2474 *basep += pciide_bar[bar].bar_offset;
2475 } else {
2476 *basep = pciide_bar[bar].addr;
2477 hard_decode = B_TRUE;
2478 }
2479 }
2480
2481 /*
2482 * if either base or len is zero make certain both are zero
2483 */
2484 if (*basep == 0 || *lenp == 0) {
2485 *basep = 0;
2486 *lenp = 0;
2487 hard_decode = B_FALSE;
2488 }
2489
2490 return (hard_decode);
2491 }
2492
2493 /*
2494 * Where op is one of:
2495 * CONFIG_INFO - first pass, gather what is there.
2496 * CONFIG_UPDATE - second pass, adjust/allocate regions.
2497 * CONFIG_NEW - third pass, allocate regions.
2498 *
2499 * Returns:
2500 * -1 Skip this BAR
2501 * 0 Properties have been assigned
2502 * 1 Properties have been assigned, reprogramming required
2503 */
2504 static int
add_bar_reg_props(int op,uchar_t bus,uchar_t dev,uchar_t func,uint_t bar,ushort_t offset,pci_regspec_t * regs,pci_regspec_t * assigned,ushort_t * bar_sz,boolean_t pciide)2505 add_bar_reg_props(int op, uchar_t bus, uchar_t dev, uchar_t func, uint_t bar,
2506 ushort_t offset, pci_regspec_t *regs, pci_regspec_t *assigned,
2507 ushort_t *bar_sz, boolean_t pciide)
2508 {
2509 uint8_t baseclass, subclass, progclass;
2510 uint32_t base, devloc;
2511 uint16_t command = 0;
2512 int reprogram = 0;
2513 uint64_t value;
2514
2515 devloc = PCI_REG_MAKE_BDFR(bus, dev, func, 0);
2516 baseclass = pci_getb(bus, dev, func, PCI_CONF_BASCLASS);
2517 subclass = pci_getb(bus, dev, func, PCI_CONF_SUBCLASS);
2518 progclass = pci_getb(bus, dev, func, PCI_CONF_PROGCLASS);
2519
2520 /*
2521 * Determine the size of the BAR by writing 0xffffffff to the base
2522 * register and reading the value back before restoring the original.
2523 *
2524 * For non-bridges, disable I/O and Memory access while doing this to
2525 * avoid difficulty with USB emulation (see OHCI spec1.0a appendix B
2526 * "Host Controller Mapping"). Doing this for bridges would have the
2527 * side-effect of making the bridge transparent to secondary-bus
2528 * activity (see sections 4.1-4.3 of the PCI-PCI Bridge Spec V1.2).
2529 */
2530 base = pci_getl(bus, dev, func, offset);
2531
2532 if (baseclass != PCI_CLASS_BRIDGE) {
2533 command = (uint_t)pci_getw(bus, dev, func, PCI_CONF_COMM);
2534 pci_putw(bus, dev, func, PCI_CONF_COMM,
2535 command & ~(PCI_COMM_MAE | PCI_COMM_IO));
2536 }
2537
2538 pci_putl(bus, dev, func, offset, 0xffffffff);
2539 value = pci_getl(bus, dev, func, offset);
2540 pci_putl(bus, dev, func, offset, base);
2541
2542 if (baseclass != PCI_CLASS_BRIDGE)
2543 pci_putw(bus, dev, func, PCI_CONF_COMM, command);
2544
2545 /* I/O Space */
2546 if ((pciide && bar < 4) || (base & PCI_BASE_SPACE_IO) != 0) {
2547 struct memlist **io_avail = &pci_bus_res[bus].io_avail;
2548 struct memlist **io_used = &pci_bus_res[bus].io_used;
2549 boolean_t hard_decode = B_FALSE;
2550 uint_t type, len;
2551
2552 *bar_sz = PCI_BAR_SZ_32;
2553 value &= PCI_BASE_IO_ADDR_M;
2554 len = BARMASKTOLEN(value);
2555
2556 /* XXX Adjust first 4 IDE registers */
2557 if (pciide) {
2558 if (subclass != PCI_MASS_IDE) {
2559 progclass = (PCI_IDE_IF_NATIVE_PRI |
2560 PCI_IDE_IF_NATIVE_SEC);
2561 }
2562 hard_decode = pciide_adjust_bar(progclass, bar,
2563 &base, &len);
2564 } else if (value == 0) {
2565 /* skip base regs with size of 0 */
2566 return (-1);
2567 }
2568
2569 regs->pci_phys_hi = PCI_ADDR_IO | devloc;
2570 if (hard_decode) {
2571 regs->pci_phys_hi |= PCI_RELOCAT_B;
2572 regs->pci_phys_low = base & PCI_BASE_IO_ADDR_M;
2573 } else {
2574 regs->pci_phys_hi |= offset;
2575 regs->pci_phys_low = 0;
2576 }
2577 assigned->pci_phys_hi = PCI_RELOCAT_B | regs->pci_phys_hi;
2578 regs->pci_size_low = assigned->pci_size_low = len;
2579
2580 /*
2581 * 'type' holds the non-address part of the base to be re-added
2582 * to any new address in the programming step below.
2583 */
2584 type = base & ~PCI_BASE_IO_ADDR_M;
2585 base &= PCI_BASE_IO_ADDR_M;
2586
2587 /*
2588 * A device under a subtractive PPB can allocate resources from
2589 * its parent bus if there is no resource available on its own
2590 * bus.
2591 */
2592 if (op == CONFIG_NEW && pci_bus_res[bus].subtractive &&
2593 *io_avail == NULL) {
2594 uchar_t res_bus;
2595
2596 res_bus = resolve_alloc_bus(bus, RES_IO);
2597 io_avail = &pci_bus_res[res_bus].io_avail;
2598 }
2599
2600 if (op == CONFIG_INFO) { /* first pass */
2601 /* take out of the resource map of the bus */
2602 if (base != 0) {
2603 (void) pci_memlist_remove(io_avail, base, len);
2604 pci_memlist_insert(io_used, base, len);
2605 } else {
2606 reprogram = 1;
2607 }
2608 dcmn_err(CE_NOTE,
2609 MSGHDR "BAR%u I/O FWINIT 0x%x ~ 0x%x",
2610 "pci", bus, dev, func, bar, base, len);
2611 pci_bus_res[bus].io_size += len;
2612 } else if ((*io_avail != NULL && base == 0) ||
2613 pci_bus_res[bus].io_reprogram) {
2614 base = pci_memlist_find(io_avail, len, len);
2615 if (base == 0) {
2616 cmn_err(CE_WARN, MSGHDR "BAR%u I/O "
2617 "failed to find length 0x%x",
2618 "pci", bus, dev, func, bar, len);
2619 } else {
2620 uint32_t nbase;
2621
2622 cmn_err(CE_NOTE, "!" MSGHDR "BAR%u "
2623 "I/O REPROG 0x%x ~ 0x%x",
2624 "pci", bus, dev, func,
2625 bar, base, len);
2626 pci_putl(bus, dev, func, offset, base | type);
2627 nbase = pci_getl(bus, dev, func, offset);
2628 nbase &= PCI_BASE_IO_ADDR_M;
2629
2630 if (base != nbase) {
2631 cmn_err(CE_NOTE, "!" MSGHDR "BAR%u "
2632 "I/O REPROG 0x%x ~ 0x%x "
2633 "FAILED READBACK 0x%x",
2634 "pci", bus, dev, func,
2635 bar, base, len, nbase);
2636 pci_putl(bus, dev, func, offset, 0);
2637 if (baseclass != PCI_CLASS_BRIDGE) {
2638 /* Disable PCI_COMM_IO bit */
2639 command = pci_getw(bus, dev,
2640 func, PCI_CONF_COMM);
2641 command &= ~PCI_COMM_IO;
2642 pci_putw(bus, dev, func,
2643 PCI_CONF_COMM, command);
2644 }
2645 pci_memlist_insert(io_avail, base, len);
2646 base = 0;
2647 } else {
2648 pci_memlist_insert(io_used, base, len);
2649 }
2650 }
2651 }
2652 assigned->pci_phys_low = base;
2653
2654 } else { /* Memory space */
2655 struct memlist **mem_avail = &pci_bus_res[bus].mem_avail;
2656 struct memlist **mem_used = &pci_bus_res[bus].mem_used;
2657 struct memlist **pmem_avail = &pci_bus_res[bus].pmem_avail;
2658 struct memlist **pmem_used = &pci_bus_res[bus].pmem_used;
2659 uint_t type, base_hi, phys_hi;
2660 uint64_t len, fbase;
2661
2662 if ((base & PCI_BASE_TYPE_M) == PCI_BASE_TYPE_ALL) {
2663 *bar_sz = PCI_BAR_SZ_64;
2664 base_hi = pci_getl(bus, dev, func, offset + 4);
2665 pci_putl(bus, dev, func, offset + 4,
2666 0xffffffff);
2667 value |= (uint64_t)pci_getl(bus, dev, func,
2668 offset + 4) << 32;
2669 pci_putl(bus, dev, func, offset + 4, base_hi);
2670 phys_hi = PCI_ADDR_MEM64;
2671 value &= PCI_BASE_M_ADDR64_M;
2672 } else {
2673 *bar_sz = PCI_BAR_SZ_32;
2674 base_hi = 0;
2675 phys_hi = PCI_ADDR_MEM32;
2676 value &= PCI_BASE_M_ADDR_M;
2677 }
2678
2679 /* skip base regs with size of 0 */
2680 if (value == 0)
2681 return (-1);
2682
2683 len = BARMASKTOLEN(value);
2684 regs->pci_size_low = assigned->pci_size_low = len & 0xffffffff;
2685 regs->pci_size_hi = assigned->pci_size_hi = len >> 32;
2686
2687 phys_hi |= devloc | offset;
2688 if (base & PCI_BASE_PREF_M)
2689 phys_hi |= PCI_PREFETCH_B;
2690
2691 /*
2692 * A device under a subtractive PPB can allocate resources from
2693 * its parent bus if there is no resource available on its own
2694 * bus.
2695 */
2696 if (op == CONFIG_NEW && pci_bus_res[bus].subtractive) {
2697 uchar_t res_bus = bus;
2698
2699 if ((phys_hi & PCI_PREFETCH_B) != 0 &&
2700 *pmem_avail == NULL) {
2701 res_bus = resolve_alloc_bus(bus, RES_PMEM);
2702 pmem_avail = &pci_bus_res[res_bus].pmem_avail;
2703 mem_avail = &pci_bus_res[res_bus].mem_avail;
2704 } else if (*mem_avail == NULL) {
2705 res_bus = resolve_alloc_bus(bus, RES_MEM);
2706 pmem_avail = &pci_bus_res[res_bus].pmem_avail;
2707 mem_avail = &pci_bus_res[res_bus].mem_avail;
2708 }
2709 }
2710
2711 regs->pci_phys_hi = assigned->pci_phys_hi = phys_hi;
2712 assigned->pci_phys_hi |= PCI_RELOCAT_B;
2713
2714 /*
2715 * 'type' holds the non-address part of the base to be re-added
2716 * to any new address in the programming step below.
2717 */
2718 type = base & ~PCI_BASE_M_ADDR_M;
2719 base &= PCI_BASE_M_ADDR_M;
2720
2721 fbase = (((uint64_t)base_hi) << 32) | base;
2722
2723 if (op == CONFIG_INFO) {
2724
2725 dcmn_err(CE_NOTE,
2726 MSGHDR "BAR%u %sMEM FWINIT 0x%lx ~ 0x%lx%s",
2727 "pci", bus, dev, func, bar,
2728 (phys_hi & PCI_PREFETCH_B) ? "P" : " ",
2729 fbase, len,
2730 *bar_sz == PCI_BAR_SZ_64 ? " (64-bit)" : "");
2731
2732 /* take out of the resource map of the bus */
2733 if (fbase != 0) {
2734 /* remove from PMEM and MEM space */
2735 (void) pci_memlist_remove(mem_avail, fbase,
2736 len);
2737 (void) pci_memlist_remove(pmem_avail, fbase,
2738 len);
2739 /* only note as used in correct map */
2740 if ((phys_hi & PCI_PREFETCH_B) != 0) {
2741 pci_memlist_insert(pmem_used, fbase,
2742 len);
2743 } else {
2744 pci_memlist_insert(mem_used, fbase,
2745 len);
2746 }
2747 } else {
2748 reprogram = 1;
2749 /*
2750 * If we need to reprogram this because we
2751 * don't have a BAR assigned, we need to
2752 * actually increase the amount of memory that
2753 * we request to take into account alignment.
2754 * This is a bit gross, but by doubling the
2755 * request size we are more likely to get the
2756 * size that we need. A more involved fix would
2757 * require a smarter and more involved
2758 * allocator (something we will need
2759 * eventually).
2760 */
2761 len *= 2;
2762 }
2763
2764 if (phys_hi & PCI_PREFETCH_B)
2765 pci_bus_res[bus].pmem_size += len;
2766 else
2767 pci_bus_res[bus].mem_size += len;
2768 } else if (pci_bus_res[bus].mem_reprogram || (fbase == 0 &&
2769 (*mem_avail != NULL || *pmem_avail != NULL))) {
2770 boolean_t pf = B_FALSE;
2771 fbase = 0;
2772
2773 /*
2774 * When desired, attempt a prefetchable allocation first
2775 */
2776 if ((phys_hi & PCI_PREFETCH_B) != 0 &&
2777 *pmem_avail != NULL) {
2778 fbase = pci_memlist_find(pmem_avail, len, len);
2779 if (fbase != 0)
2780 pf = B_TRUE;
2781 }
2782 /*
2783 * If prefetchable allocation was not desired, or
2784 * failed, attempt ordinary memory allocation.
2785 */
2786 if (fbase == 0 && *mem_avail != NULL)
2787 fbase = pci_memlist_find(mem_avail, len, len);
2788
2789 base_hi = fbase >> 32;
2790 base = fbase & 0xffffffff;
2791
2792 if (fbase == 0) {
2793 cmn_err(CE_WARN, MSGHDR "BAR%u MEM "
2794 "failed to find length 0x%lx",
2795 "pci", bus, dev, func, bar, len);
2796 } else {
2797 uint64_t nbase, nbase_hi = 0;
2798
2799 cmn_err(CE_NOTE, "!" MSGHDR "BAR%u "
2800 "%s%s REPROG 0x%lx ~ 0x%lx",
2801 "pci", bus, dev, func, bar,
2802 pf ? "PMEM" : "MEM",
2803 *bar_sz == PCI_BAR_SZ_64 ? "64" : "",
2804 fbase, len);
2805 pci_putl(bus, dev, func, offset, base | type);
2806 nbase = pci_getl(bus, dev, func, offset);
2807
2808 if (*bar_sz == PCI_BAR_SZ_64) {
2809 pci_putl(bus, dev, func,
2810 offset + 4, base_hi);
2811 nbase_hi = pci_getl(bus, dev, func,
2812 offset + 4);
2813 }
2814
2815 nbase &= PCI_BASE_M_ADDR_M;
2816
2817 if (base != nbase || base_hi != nbase_hi) {
2818 cmn_err(CE_NOTE, "!" MSGHDR "BAR%u "
2819 "%s%s REPROG 0x%lx ~ 0x%lx "
2820 "FAILED READBACK 0x%lx",
2821 "pci", bus, dev, func, bar,
2822 pf ? "PMEM" : "MEM",
2823 *bar_sz == PCI_BAR_SZ_64 ?
2824 "64" : "",
2825 fbase, len,
2826 nbase_hi << 32 | nbase);
2827
2828 pci_putl(bus, dev, func, offset, 0);
2829 if (*bar_sz == PCI_BAR_SZ_64) {
2830 pci_putl(bus, dev, func,
2831 offset + 4, 0);
2832 }
2833
2834 if (baseclass != PCI_CLASS_BRIDGE) {
2835 /* Disable PCI_COMM_MAE bit */
2836 command = pci_getw(bus, dev,
2837 func, PCI_CONF_COMM);
2838 command &= ~PCI_COMM_MAE;
2839 pci_putw(bus, dev, func,
2840 PCI_CONF_COMM, command);
2841 }
2842
2843 pci_memlist_insert(
2844 pf ? pmem_avail : mem_avail,
2845 base, len);
2846 base = base_hi = 0;
2847 } else {
2848 if (pf) {
2849 pci_memlist_insert(pmem_used,
2850 fbase, len);
2851 (void) pci_memlist_remove(
2852 pmem_avail, fbase, len);
2853 } else {
2854 pci_memlist_insert(mem_used,
2855 fbase, len);
2856 (void) pci_memlist_remove(
2857 mem_avail, fbase, len);
2858 }
2859 }
2860 }
2861 }
2862
2863 assigned->pci_phys_mid = base_hi;
2864 assigned->pci_phys_low = base;
2865 }
2866
2867 dcmn_err(CE_NOTE, MSGHDR "BAR%u ---- %08x.%x.%x.%x.%x",
2868 "pci", bus, dev, func, bar,
2869 assigned->pci_phys_hi,
2870 assigned->pci_phys_mid,
2871 assigned->pci_phys_low,
2872 assigned->pci_size_hi,
2873 assigned->pci_size_low);
2874
2875 return (reprogram);
2876 }
2877
2878 /*
2879 * Add the "reg" and "assigned-addresses" property
2880 */
2881 static boolean_t
add_reg_props(dev_info_t * dip,uchar_t bus,uchar_t dev,uchar_t func,int op,boolean_t pciide)2882 add_reg_props(dev_info_t *dip, uchar_t bus, uchar_t dev, uchar_t func,
2883 int op, boolean_t pciide)
2884 {
2885 uchar_t baseclass, subclass, progclass, header;
2886 uint_t bar, value, devloc, base;
2887 ushort_t bar_sz, offset, end;
2888 int max_basereg, reprogram = B_FALSE;
2889
2890 struct memlist **io_avail, **io_used;
2891 struct memlist **mem_avail, **mem_used;
2892 struct memlist **pmem_avail;
2893
2894 pci_regspec_t regs[16] = {{0}};
2895 pci_regspec_t assigned[15] = {{0}};
2896 int nreg, nasgn;
2897
2898 io_avail = &pci_bus_res[bus].io_avail;
2899 io_used = &pci_bus_res[bus].io_used;
2900 mem_avail = &pci_bus_res[bus].mem_avail;
2901 mem_used = &pci_bus_res[bus].mem_used;
2902 pmem_avail = &pci_bus_res[bus].pmem_avail;
2903
2904 dump_memlists("add_reg_props start", bus);
2905
2906 devloc = PCI_REG_MAKE_BDFR(bus, dev, func, 0);
2907 regs[0].pci_phys_hi = devloc;
2908 nreg = 1; /* rest of regs[0] is all zero */
2909 nasgn = 0;
2910
2911 baseclass = pci_getb(bus, dev, func, PCI_CONF_BASCLASS);
2912 subclass = pci_getb(bus, dev, func, PCI_CONF_SUBCLASS);
2913 progclass = pci_getb(bus, dev, func, PCI_CONF_PROGCLASS);
2914 header = pci_getb(bus, dev, func, PCI_CONF_HEADER) & PCI_HEADER_TYPE_M;
2915
2916 switch (header) {
2917 case PCI_HEADER_ZERO:
2918 max_basereg = PCI_BASE_NUM;
2919 break;
2920 case PCI_HEADER_PPB:
2921 max_basereg = PCI_BCNF_BASE_NUM;
2922 break;
2923 case PCI_HEADER_CARDBUS:
2924 max_basereg = PCI_CBUS_BASE_NUM;
2925 reprogram = B_TRUE;
2926 break;
2927 default:
2928 max_basereg = 0;
2929 break;
2930 }
2931
2932 end = PCI_CONF_BASE0 + max_basereg * sizeof (uint_t);
2933 for (bar = 0, offset = PCI_CONF_BASE0; offset < end;
2934 bar++, offset += bar_sz) {
2935 int ret;
2936
2937 ret = add_bar_reg_props(op, bus, dev, func, bar, offset,
2938 ®s[nreg], &assigned[nasgn], &bar_sz, pciide);
2939
2940 if (bar_sz == PCI_BAR_SZ_64)
2941 bar++;
2942
2943 if (ret == -1) /* Skip BAR */
2944 continue;
2945
2946 if (ret == 1)
2947 reprogram = B_TRUE;
2948
2949 nreg++;
2950 nasgn++;
2951 }
2952
2953 switch (header) {
2954 case PCI_HEADER_ZERO:
2955 offset = PCI_CONF_ROM;
2956 break;
2957 case PCI_HEADER_PPB:
2958 offset = PCI_BCNF_ROM;
2959 break;
2960 default: /* including PCI_HEADER_CARDBUS */
2961 goto done;
2962 }
2963
2964 /*
2965 * Add the expansion rom memory space
2966 * Determine the size of the ROM base reg; don't write reserved bits
2967 * ROM isn't in the PCI memory space.
2968 */
2969 base = pci_getl(bus, dev, func, offset);
2970 pci_putl(bus, dev, func, offset, PCI_BASE_ROM_ADDR_M);
2971 value = pci_getl(bus, dev, func, offset);
2972 pci_putl(bus, dev, func, offset, base);
2973 if (value & PCI_BASE_ROM_ENABLE)
2974 value &= PCI_BASE_ROM_ADDR_M;
2975 else
2976 value = 0;
2977
2978 if (value != 0) {
2979 uint_t len;
2980
2981 regs[nreg].pci_phys_hi = (PCI_ADDR_MEM32 | devloc) + offset;
2982 assigned[nasgn].pci_phys_hi = (PCI_RELOCAT_B |
2983 PCI_ADDR_MEM32 | devloc) + offset;
2984 base &= PCI_BASE_ROM_ADDR_M;
2985 assigned[nasgn].pci_phys_low = base;
2986 len = BARMASKTOLEN(value);
2987 regs[nreg].pci_size_low = assigned[nasgn].pci_size_low = len;
2988 nreg++, nasgn++;
2989 /* take it out of the memory resource */
2990 if (base != 0) {
2991 (void) pci_memlist_remove(mem_avail, base, len);
2992 pci_memlist_insert(mem_used, base, len);
2993 pci_bus_res[bus].mem_size += len;
2994 }
2995 }
2996
2997 /*
2998 * Account for "legacy" (alias) video adapter resources
2999 */
3000
3001 /* add the three hard-decode, aliased address spaces for VGA */
3002 if ((baseclass == PCI_CLASS_DISPLAY && subclass == PCI_DISPLAY_VGA) ||
3003 (baseclass == PCI_CLASS_NONE && subclass == PCI_NONE_VGA)) {
3004
3005 /* VGA hard decode 0x3b0-0x3bb */
3006 regs[nreg].pci_phys_hi = assigned[nasgn].pci_phys_hi =
3007 (PCI_RELOCAT_B | PCI_ALIAS_B | PCI_ADDR_IO | devloc);
3008 regs[nreg].pci_phys_low = assigned[nasgn].pci_phys_low = 0x3b0;
3009 regs[nreg].pci_size_low = assigned[nasgn].pci_size_low = 0xc;
3010 nreg++, nasgn++;
3011 (void) pci_memlist_remove(io_avail, 0x3b0, 0xc);
3012 pci_memlist_insert(io_used, 0x3b0, 0xc);
3013 pci_bus_res[bus].io_size += 0xc;
3014
3015 /* VGA hard decode 0x3c0-0x3df */
3016 regs[nreg].pci_phys_hi = assigned[nasgn].pci_phys_hi =
3017 (PCI_RELOCAT_B | PCI_ALIAS_B | PCI_ADDR_IO | devloc);
3018 regs[nreg].pci_phys_low = assigned[nasgn].pci_phys_low = 0x3c0;
3019 regs[nreg].pci_size_low = assigned[nasgn].pci_size_low = 0x20;
3020 nreg++, nasgn++;
3021 (void) pci_memlist_remove(io_avail, 0x3c0, 0x20);
3022 pci_memlist_insert(io_used, 0x3c0, 0x20);
3023 pci_bus_res[bus].io_size += 0x20;
3024
3025 /* Video memory */
3026 regs[nreg].pci_phys_hi = assigned[nasgn].pci_phys_hi =
3027 (PCI_RELOCAT_B | PCI_ALIAS_B | PCI_ADDR_MEM32 | devloc);
3028 regs[nreg].pci_phys_low =
3029 assigned[nasgn].pci_phys_low = 0xa0000;
3030 regs[nreg].pci_size_low =
3031 assigned[nasgn].pci_size_low = 0x20000;
3032 nreg++, nasgn++;
3033 /* remove from MEM and PMEM space */
3034 (void) pci_memlist_remove(mem_avail, 0xa0000, 0x20000);
3035 (void) pci_memlist_remove(pmem_avail, 0xa0000, 0x20000);
3036 pci_memlist_insert(mem_used, 0xa0000, 0x20000);
3037 pci_bus_res[bus].mem_size += 0x20000;
3038 }
3039
3040 /* add the hard-decode, aliased address spaces for 8514 */
3041 if ((baseclass == PCI_CLASS_DISPLAY) &&
3042 (subclass == PCI_DISPLAY_VGA) &&
3043 (progclass & PCI_DISPLAY_IF_8514)) {
3044
3045 /* hard decode 0x2e8 */
3046 regs[nreg].pci_phys_hi = assigned[nasgn].pci_phys_hi =
3047 (PCI_RELOCAT_B | PCI_ALIAS_B | PCI_ADDR_IO | devloc);
3048 regs[nreg].pci_phys_low = assigned[nasgn].pci_phys_low = 0x2e8;
3049 regs[nreg].pci_size_low = assigned[nasgn].pci_size_low = 0x1;
3050 nreg++, nasgn++;
3051 (void) pci_memlist_remove(io_avail, 0x2e8, 0x1);
3052 pci_memlist_insert(io_used, 0x2e8, 0x1);
3053 pci_bus_res[bus].io_size += 0x1;
3054
3055 /* hard decode 0x2ea-0x2ef */
3056 regs[nreg].pci_phys_hi = assigned[nasgn].pci_phys_hi =
3057 (PCI_RELOCAT_B | PCI_ALIAS_B | PCI_ADDR_IO | devloc);
3058 regs[nreg].pci_phys_low = assigned[nasgn].pci_phys_low = 0x2ea;
3059 regs[nreg].pci_size_low = assigned[nasgn].pci_size_low = 0x6;
3060 nreg++, nasgn++;
3061 (void) pci_memlist_remove(io_avail, 0x2ea, 0x6);
3062 pci_memlist_insert(io_used, 0x2ea, 0x6);
3063 pci_bus_res[bus].io_size += 0x6;
3064 }
3065
3066 done:
3067 dump_memlists("add_reg_props end", bus);
3068
3069 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip, "reg",
3070 (int *)regs, nreg * sizeof (pci_regspec_t) / sizeof (int));
3071 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
3072 "assigned-addresses",
3073 (int *)assigned, nasgn * sizeof (pci_regspec_t) / sizeof (int));
3074
3075 return (reprogram);
3076 }
3077
3078 static void
add_ppb_props(dev_info_t * dip,uchar_t bus,uchar_t dev,uchar_t func,boolean_t pciex,boolean_t is_pci_bridge)3079 add_ppb_props(dev_info_t *dip, uchar_t bus, uchar_t dev, uchar_t func,
3080 boolean_t pciex, boolean_t is_pci_bridge)
3081 {
3082 char *dev_type;
3083 int i;
3084 uint_t cmd_reg;
3085 struct {
3086 uint64_t base;
3087 uint64_t limit;
3088 } io, mem, pmem;
3089 uchar_t secbus, subbus;
3090 uchar_t progclass;
3091
3092 secbus = pci_getb(bus, dev, func, PCI_BCNF_SECBUS);
3093 subbus = pci_getb(bus, dev, func, PCI_BCNF_SUBBUS);
3094 ASSERT3U(secbus, <=, subbus);
3095
3096 dump_memlists("add_ppb_props start bus", bus);
3097 dump_memlists("add_ppb_props start secbus", secbus);
3098
3099 /*
3100 * Check if it's a subtractive PPB.
3101 */
3102 progclass = pci_getb(bus, dev, func, PCI_CONF_PROGCLASS);
3103 if (progclass == PCI_BRIDGE_PCI_IF_SUBDECODE)
3104 pci_bus_res[secbus].subtractive = B_TRUE;
3105
3106 /*
3107 * Some firmware lies about max pci busses, we allow for
3108 * such mistakes here
3109 */
3110 if (subbus > pci_boot_maxbus) {
3111 pci_boot_maxbus = subbus;
3112 alloc_res_array();
3113 }
3114
3115 ASSERT(pci_bus_res[secbus].dip == NULL);
3116 pci_bus_res[secbus].dip = dip;
3117 pci_bus_res[secbus].par_bus = bus;
3118
3119 dev_type = (pciex && !is_pci_bridge) ? "pciex" : "pci";
3120
3121 /* set up bus number hierarchy */
3122 pci_bus_res[secbus].sub_bus = subbus;
3123 /*
3124 * Keep track of the largest subordinate bus number (this is essential
3125 * for peer busses because there is no other way of determining its
3126 * subordinate bus number).
3127 */
3128 if (subbus > pci_bus_res[bus].sub_bus)
3129 pci_bus_res[bus].sub_bus = subbus;
3130 /*
3131 * Loop through subordinate busses, initializing their parent bus
3132 * field to this bridge's parent. The subordinate busses' parent
3133 * fields may very well be further refined later, as child bridges
3134 * are enumerated. (The value is to note that the subordinate busses
3135 * are not peer busses by changing their par_bus fields to anything
3136 * other than -1.)
3137 */
3138 for (i = secbus + 1; i <= subbus; i++)
3139 pci_bus_res[i].par_bus = bus;
3140
3141 /*
3142 * Update the number of bridges on the bus.
3143 */
3144 if (!is_pci_bridge)
3145 pci_bus_res[bus].num_bridge++;
3146
3147 (void) ndi_prop_update_string(DDI_DEV_T_NONE, dip,
3148 "device_type", dev_type);
3149 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3150 "#address-cells", 3);
3151 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3152 "#size-cells", 2);
3153
3154 /*
3155 * Collect bridge window specifications, and use them to populate
3156 * the "avail" resources for the bus. Not all of those resources will
3157 * end up being available; this is done top-down, and so the initial
3158 * collection of windows populates the 'ranges' property for the
3159 * bus node. Later, as children are found, resources are removed from
3160 * the 'avail' list, so that it becomes the freelist for
3161 * this point in the tree. ranges may be set again after bridge
3162 * reprogramming in fix_ppb_res(), in which case it's set from
3163 * used + avail.
3164 *
3165 * According to PPB spec, the base register should be programmed
3166 * with a value bigger than the limit register when there are
3167 * no resources available. This applies to io, memory, and
3168 * prefetchable memory.
3169 */
3170
3171 cmd_reg = (uint_t)pci_getw(bus, dev, func, PCI_CONF_COMM);
3172 fetch_ppb_res(bus, dev, func, RES_IO, &io.base, &io.limit);
3173 fetch_ppb_res(bus, dev, func, RES_MEM, &mem.base, &mem.limit);
3174 fetch_ppb_res(bus, dev, func, RES_PMEM, &pmem.base, &pmem.limit);
3175
3176 if (pci_boot_debug != 0) {
3177 dcmn_err(CE_NOTE, MSGHDR " I/O FWINIT 0x%lx ~ 0x%lx%s",
3178 "ppb", bus, dev, func, io.base, io.limit,
3179 io.base > io.limit ? " (disabled)" : "");
3180 dcmn_err(CE_NOTE, MSGHDR " MEM FWINIT 0x%lx ~ 0x%lx%s",
3181 "ppb", bus, dev, func, mem.base, mem.limit,
3182 mem.base > mem.limit ? " (disabled)" : "");
3183 dcmn_err(CE_NOTE, MSGHDR "PMEM FWINIT 0x%lx ~ 0x%lx%s",
3184 "ppb", bus, dev, func, pmem.base, pmem.limit,
3185 pmem.base > pmem.limit ? " (disabled)" : "");
3186 }
3187
3188 /*
3189 * I/O range
3190 *
3191 * If the command register I/O enable bit is not set then we assume
3192 * that the I/O windows have been left unconfigured by system firmware.
3193 * In that case we leave it disabled and additionally set base > limit
3194 * to indicate there are there are no initial resources available and
3195 * to trigger later reconfiguration.
3196 */
3197 if ((cmd_reg & PCI_COMM_IO) == 0) {
3198 io.base = PPB_DISABLE_IORANGE_BASE;
3199 io.limit = PPB_DISABLE_IORANGE_LIMIT;
3200 set_ppb_res(bus, dev, func, RES_IO, io.base, io.limit);
3201 } else if (io.base < io.limit) {
3202 uint64_t size = io.limit - io.base + 1;
3203
3204 pci_memlist_insert(&pci_bus_res[secbus].io_avail, io.base,
3205 size);
3206 pci_memlist_insert(&pci_bus_res[bus].io_used, io.base, size);
3207
3208 if (pci_bus_res[bus].io_avail != NULL) {
3209 (void) pci_memlist_remove(&pci_bus_res[bus].io_avail,
3210 io.base, size);
3211 }
3212 }
3213
3214 /*
3215 * Memory range
3216 *
3217 * It is possible that the mem range will also have been left
3218 * unconfigured by system firmware. As for the I/O range, we check for
3219 * this by looking at the relevant bit in the command register (Memory
3220 * Access Enable in this case) but we also check if the base address is
3221 * 0, indicating that it is still at PCIe defaults. While 0 technically
3222 * could be a valid base address, it is unlikely.
3223 */
3224 if ((cmd_reg & PCI_COMM_MAE) == 0 || mem.base == 0) {
3225 mem.base = PPB_DISABLE_MEMRANGE_BASE;
3226 mem.limit = PPB_DISABLE_MEMRANGE_LIMIT;
3227 set_ppb_res(bus, dev, func, RES_MEM, mem.base, mem.limit);
3228 } else if (mem.base < mem.limit) {
3229 uint64_t size = mem.limit - mem.base + 1;
3230
3231 pci_memlist_insert(&pci_bus_res[secbus].mem_avail, mem.base,
3232 size);
3233 pci_memlist_insert(&pci_bus_res[bus].mem_used, mem.base, size);
3234 /* remove from parent resource list */
3235 (void) pci_memlist_remove(&pci_bus_res[bus].mem_avail,
3236 mem.base, size);
3237 (void) pci_memlist_remove(&pci_bus_res[bus].pmem_avail,
3238 mem.base, size);
3239 }
3240
3241 /*
3242 * Prefetchable range - as per MEM range above.
3243 */
3244 if ((cmd_reg & PCI_COMM_MAE) == 0 || pmem.base == 0) {
3245 pmem.base = PPB_DISABLE_MEMRANGE_BASE;
3246 pmem.limit = PPB_DISABLE_MEMRANGE_LIMIT;
3247 set_ppb_res(bus, dev, func, RES_PMEM, pmem.base, pmem.limit);
3248 } else if (pmem.base < pmem.limit) {
3249 uint64_t size = pmem.limit - pmem.base + 1;
3250
3251 pci_memlist_insert(&pci_bus_res[secbus].pmem_avail,
3252 pmem.base, size);
3253 pci_memlist_insert(&pci_bus_res[bus].pmem_used, pmem.base,
3254 size);
3255 /* remove from parent resource list */
3256 (void) pci_memlist_remove(&pci_bus_res[bus].pmem_avail,
3257 pmem.base, size);
3258 (void) pci_memlist_remove(&pci_bus_res[bus].mem_avail,
3259 pmem.base, size);
3260 }
3261
3262 /*
3263 * Add VGA legacy resources to the bridge's pci_bus_res if it
3264 * has VGA_ENABLE set. Note that we put them in 'avail',
3265 * because that's used to populate the ranges prop; they'll be
3266 * removed from there by the VGA device once it's found. Also,
3267 * remove them from the parent's available list and note them as
3268 * used in the parent.
3269 */
3270
3271 if (pci_getw(bus, dev, func, PCI_BCNF_BCNTRL) &
3272 PCI_BCNF_BCNTRL_VGA_ENABLE) {
3273
3274 pci_memlist_insert(&pci_bus_res[secbus].io_avail, 0x3b0, 0xc);
3275
3276 pci_memlist_insert(&pci_bus_res[bus].io_used, 0x3b0, 0xc);
3277 if (pci_bus_res[bus].io_avail != NULL) {
3278 (void) pci_memlist_remove(&pci_bus_res[bus].io_avail,
3279 0x3b0, 0xc);
3280 }
3281
3282 pci_memlist_insert(&pci_bus_res[secbus].io_avail, 0x3c0, 0x20);
3283
3284 pci_memlist_insert(&pci_bus_res[bus].io_used, 0x3c0, 0x20);
3285 if (pci_bus_res[bus].io_avail != NULL) {
3286 (void) pci_memlist_remove(&pci_bus_res[bus].io_avail,
3287 0x3c0, 0x20);
3288 }
3289
3290 pci_memlist_insert(&pci_bus_res[secbus].mem_avail, 0xa0000,
3291 0x20000);
3292
3293 pci_memlist_insert(&pci_bus_res[bus].mem_used, 0xa0000,
3294 0x20000);
3295 if (pci_bus_res[bus].mem_avail != NULL) {
3296 (void) pci_memlist_remove(&pci_bus_res[bus].mem_avail,
3297 0xa0000, 0x20000);
3298 }
3299 }
3300 add_bus_range_prop(secbus);
3301 add_ranges_prop(secbus, B_TRUE);
3302
3303 dump_memlists("add_ppb_props end bus", bus);
3304 dump_memlists("add_ppb_props end secbus", secbus);
3305 }
3306
3307 static void
add_bus_range_prop(int bus)3308 add_bus_range_prop(int bus)
3309 {
3310 int bus_range[2];
3311
3312 if (pci_bus_res[bus].dip == NULL)
3313 return;
3314 bus_range[0] = bus;
3315 bus_range[1] = pci_bus_res[bus].sub_bus;
3316 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, pci_bus_res[bus].dip,
3317 "bus-range", (int *)bus_range, 2);
3318 }
3319
3320 /*
3321 * Handle both PCI root and PCI-PCI bridge range properties;
3322 * the 'ppb' argument selects PCI-PCI bridges versus root.
3323 */
3324 static void
memlist_to_ranges(void ** rp,struct memlist * list,const int bus,const uint32_t type,boolean_t ppb)3325 memlist_to_ranges(void **rp, struct memlist *list, const int bus,
3326 const uint32_t type, boolean_t ppb)
3327 {
3328 ppb_ranges_t *ppb_rp = *rp;
3329 pci_ranges_t *pci_rp = *rp;
3330
3331 while (list != NULL) {
3332 uint32_t newtype = type;
3333
3334 /*
3335 * If this is in fact a 64-bit address, adjust the address
3336 * type code to match.
3337 */
3338 if (list->ml_address + (list->ml_size - 1) > UINT32_MAX) {
3339 if ((type & PCI_ADDR_MASK) == PCI_ADDR_IO) {
3340 cmn_err(CE_WARN, "Found invalid 64-bit I/O "
3341 "space address 0x%lx+0x%lx on bus %x",
3342 list->ml_address, list->ml_size, bus);
3343 list = list->ml_next;
3344 continue;
3345 }
3346 newtype &= ~PCI_ADDR_MASK;
3347 newtype |= PCI_ADDR_MEM64;
3348 }
3349
3350 if (ppb) {
3351 ppb_rp->child_high = ppb_rp->parent_high = newtype;
3352 ppb_rp->child_mid = ppb_rp->parent_mid =
3353 (uint32_t)(list->ml_address >> 32);
3354 ppb_rp->child_low = ppb_rp->parent_low =
3355 (uint32_t)list->ml_address;
3356 ppb_rp->size_high = (uint32_t)(list->ml_size >> 32);
3357 ppb_rp->size_low = (uint32_t)list->ml_size;
3358 *rp = ++ppb_rp;
3359 } else {
3360 pci_rp->child_high = newtype;
3361 pci_rp->child_mid = pci_rp->parent_high =
3362 (uint32_t)(list->ml_address >> 32);
3363 pci_rp->child_low = pci_rp->parent_low =
3364 (uint32_t)list->ml_address;
3365 pci_rp->size_high = (uint32_t)(list->ml_size >> 32);
3366 pci_rp->size_low = (uint32_t)list->ml_size;
3367 *rp = ++pci_rp;
3368 }
3369 list = list->ml_next;
3370 }
3371 }
3372
3373 static void
add_ranges_prop(int bus,boolean_t ppb)3374 add_ranges_prop(int bus, boolean_t ppb)
3375 {
3376 int total, alloc_size;
3377 void *rp, *next_rp;
3378 struct memlist *iolist, *memlist, *pmemlist;
3379
3380 /* no devinfo node - unused bus, return */
3381 if (pci_bus_res[bus].dip == NULL)
3382 return;
3383
3384 dump_memlists("add_ranges_prop", bus);
3385
3386 iolist = memlist = pmemlist = (struct memlist *)NULL;
3387
3388 pci_memlist_merge(&pci_bus_res[bus].io_avail, &iolist);
3389 pci_memlist_merge(&pci_bus_res[bus].io_used, &iolist);
3390 pci_memlist_merge(&pci_bus_res[bus].mem_avail, &memlist);
3391 pci_memlist_merge(&pci_bus_res[bus].mem_used, &memlist);
3392 pci_memlist_merge(&pci_bus_res[bus].pmem_avail, &pmemlist);
3393 pci_memlist_merge(&pci_bus_res[bus].pmem_used, &pmemlist);
3394
3395 total = pci_memlist_count(iolist);
3396 total += pci_memlist_count(memlist);
3397 total += pci_memlist_count(pmemlist);
3398
3399 /* no property is created if no ranges are present */
3400 if (total == 0)
3401 return;
3402
3403 alloc_size = total *
3404 (ppb ? sizeof (ppb_ranges_t) : sizeof (pci_ranges_t));
3405
3406 next_rp = rp = kmem_alloc(alloc_size, KM_SLEEP);
3407
3408 memlist_to_ranges(&next_rp, iolist, bus,
3409 PCI_ADDR_IO | PCI_RELOCAT_B, ppb);
3410 memlist_to_ranges(&next_rp, memlist, bus,
3411 PCI_ADDR_MEM32 | PCI_RELOCAT_B, ppb);
3412 memlist_to_ranges(&next_rp, pmemlist, bus,
3413 PCI_ADDR_MEM32 | PCI_RELOCAT_B | PCI_PREFETCH_B, ppb);
3414
3415 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, pci_bus_res[bus].dip,
3416 "ranges", (int *)rp, alloc_size / sizeof (int));
3417
3418 kmem_free(rp, alloc_size);
3419 pci_memlist_free_all(&iolist);
3420 pci_memlist_free_all(&memlist);
3421 pci_memlist_free_all(&pmemlist);
3422 }
3423
3424 static void
pci_memlist_remove_list(struct memlist ** list,struct memlist * remove_list)3425 pci_memlist_remove_list(struct memlist **list, struct memlist *remove_list)
3426 {
3427 while (list && *list && remove_list) {
3428 (void) pci_memlist_remove(list, remove_list->ml_address,
3429 remove_list->ml_size);
3430 remove_list = remove_list->ml_next;
3431 }
3432 }
3433
3434 static int
memlist_to_spec(struct pci_phys_spec * sp,const int bus,struct memlist * list,const uint32_t type)3435 memlist_to_spec(struct pci_phys_spec *sp, const int bus, struct memlist *list,
3436 const uint32_t type)
3437 {
3438 uint_t i = 0;
3439
3440 while (list != NULL) {
3441 uint32_t newtype = type;
3442
3443 /*
3444 * If this is in fact a 64-bit address, adjust the address
3445 * type code to match.
3446 */
3447 if (list->ml_address + (list->ml_size - 1) > UINT32_MAX) {
3448 if ((type & PCI_ADDR_MASK) == PCI_ADDR_IO) {
3449 cmn_err(CE_WARN, "Found invalid 64-bit I/O "
3450 "space address 0x%lx+0x%lx on bus %x",
3451 list->ml_address, list->ml_size, bus);
3452 list = list->ml_next;
3453 continue;
3454 }
3455 newtype &= ~PCI_ADDR_MASK;
3456 newtype |= PCI_ADDR_MEM64;
3457 }
3458
3459 sp->pci_phys_hi = newtype;
3460 sp->pci_phys_mid = (uint32_t)(list->ml_address >> 32);
3461 sp->pci_phys_low = (uint32_t)list->ml_address;
3462 sp->pci_size_hi = (uint32_t)(list->ml_size >> 32);
3463 sp->pci_size_low = (uint32_t)list->ml_size;
3464
3465 list = list->ml_next;
3466 sp++, i++;
3467 }
3468 return (i);
3469 }
3470
3471 static void
add_bus_available_prop(int bus)3472 add_bus_available_prop(int bus)
3473 {
3474 int i, count;
3475 struct pci_phys_spec *sp;
3476
3477 /* no devinfo node - unused bus, return */
3478 if (pci_bus_res[bus].dip == NULL)
3479 return;
3480
3481 count = pci_memlist_count(pci_bus_res[bus].io_avail) +
3482 pci_memlist_count(pci_bus_res[bus].mem_avail) +
3483 pci_memlist_count(pci_bus_res[bus].pmem_avail);
3484
3485 if (count == 0) /* nothing available */
3486 return;
3487
3488 sp = kmem_alloc(count * sizeof (*sp), KM_SLEEP);
3489 i = memlist_to_spec(&sp[0], bus, pci_bus_res[bus].io_avail,
3490 PCI_ADDR_IO | PCI_RELOCAT_B);
3491 i += memlist_to_spec(&sp[i], bus, pci_bus_res[bus].mem_avail,
3492 PCI_ADDR_MEM32 | PCI_RELOCAT_B);
3493 i += memlist_to_spec(&sp[i], bus, pci_bus_res[bus].pmem_avail,
3494 PCI_ADDR_MEM32 | PCI_RELOCAT_B | PCI_PREFETCH_B);
3495 ASSERT(i == count);
3496
3497 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, pci_bus_res[bus].dip,
3498 "available", (int *)sp,
3499 i * sizeof (struct pci_phys_spec) / sizeof (int));
3500 kmem_free(sp, count * sizeof (*sp));
3501 }
3502
3503 static void
alloc_res_array(void)3504 alloc_res_array(void)
3505 {
3506 static uint_t array_size = 0;
3507 uint_t old_size;
3508 void *old_res;
3509
3510 if (array_size > pci_boot_maxbus + 1)
3511 return; /* array is big enough */
3512
3513 old_size = array_size;
3514 old_res = pci_bus_res;
3515
3516 if (array_size == 0)
3517 array_size = 16; /* start with a reasonable number */
3518
3519 while (array_size <= pci_boot_maxbus + 1)
3520 array_size <<= 1;
3521 pci_bus_res = (struct pci_bus_resource *)kmem_zalloc(
3522 array_size * sizeof (struct pci_bus_resource), KM_SLEEP);
3523
3524 if (old_res) { /* copy content and free old array */
3525 bcopy(old_res, pci_bus_res,
3526 old_size * sizeof (struct pci_bus_resource));
3527 kmem_free(old_res, old_size * sizeof (struct pci_bus_resource));
3528 }
3529 }
3530
3531 static void
create_ioapic_node(int bus,int dev,int fn,ushort_t vendorid,ushort_t deviceid)3532 create_ioapic_node(int bus, int dev, int fn, ushort_t vendorid,
3533 ushort_t deviceid)
3534 {
3535 static dev_info_t *ioapicsnode = NULL;
3536 static int numioapics = 0;
3537 dev_info_t *ioapic_node;
3538 uint64_t physaddr;
3539 uint32_t lobase, hibase = 0;
3540
3541 /* BAR 0 contains the IOAPIC's memory-mapped I/O address */
3542 lobase = (*pci_getl_func)(bus, dev, fn, PCI_CONF_BASE0);
3543
3544 /* We (and the rest of the world) only support memory-mapped IOAPICs */
3545 if ((lobase & PCI_BASE_SPACE_M) != PCI_BASE_SPACE_MEM)
3546 return;
3547
3548 if ((lobase & PCI_BASE_TYPE_M) == PCI_BASE_TYPE_ALL)
3549 hibase = (*pci_getl_func)(bus, dev, fn, PCI_CONF_BASE0 + 4);
3550
3551 lobase &= PCI_BASE_M_ADDR_M;
3552
3553 physaddr = (((uint64_t)hibase) << 32) | lobase;
3554
3555 /*
3556 * Create a nexus node for all IOAPICs under the root node.
3557 */
3558 if (ioapicsnode == NULL) {
3559 if (ndi_devi_alloc(ddi_root_node(), IOAPICS_NODE_NAME,
3560 (pnode_t)DEVI_SID_NODEID, &ioapicsnode) != NDI_SUCCESS) {
3561 return;
3562 }
3563 (void) ndi_devi_online(ioapicsnode, 0);
3564 }
3565
3566 /*
3567 * Create a child node for this IOAPIC
3568 */
3569 ioapic_node = ddi_add_child(ioapicsnode, IOAPICS_CHILD_NAME,
3570 DEVI_SID_NODEID, numioapics++);
3571 if (ioapic_node == NULL) {
3572 return;
3573 }
3574
3575 /* Vendor and Device ID */
3576 (void) ndi_prop_update_int(DDI_DEV_T_NONE, ioapic_node,
3577 IOAPICS_PROP_VENID, vendorid);
3578 (void) ndi_prop_update_int(DDI_DEV_T_NONE, ioapic_node,
3579 IOAPICS_PROP_DEVID, deviceid);
3580
3581 /* device_type */
3582 (void) ndi_prop_update_string(DDI_DEV_T_NONE, ioapic_node,
3583 "device_type", IOAPICS_DEV_TYPE);
3584
3585 /* reg */
3586 (void) ndi_prop_update_int64(DDI_DEV_T_NONE, ioapic_node,
3587 "reg", physaddr);
3588 }
3589
3590 /*
3591 * Enable reporting of AER capability next pointer.
3592 * This needs to be done only for CK8-04 devices
3593 * by setting NV_XVR_VEND_CYA1 (offset 0xf40) bit 13
3594 * NOTE: BIOS is disabling this, it needs to be enabled temporarily
3595 *
3596 * This function is adapted from npe_ck804_fix_aer_ptr(), and is
3597 * called from pci_boot.c.
3598 */
3599 static void
ck804_fix_aer_ptr(dev_info_t * dip,pcie_req_id_t bdf)3600 ck804_fix_aer_ptr(dev_info_t *dip, pcie_req_id_t bdf)
3601 {
3602 dev_info_t *rcdip;
3603 ushort_t cya1;
3604
3605 rcdip = pcie_get_rc_dip(dip);
3606 ASSERT(rcdip != NULL);
3607
3608 if ((pci_cfgacc_get16(rcdip, bdf, PCI_CONF_VENID) ==
3609 NVIDIA_VENDOR_ID) &&
3610 (pci_cfgacc_get16(rcdip, bdf, PCI_CONF_DEVID) ==
3611 NVIDIA_CK804_DEVICE_ID) &&
3612 (pci_cfgacc_get8(rcdip, bdf, PCI_CONF_REVID) >=
3613 NVIDIA_CK804_AER_VALID_REVID)) {
3614 cya1 = pci_cfgacc_get16(rcdip, bdf, NVIDIA_CK804_VEND_CYA1_OFF);
3615 if (!(cya1 & ~NVIDIA_CK804_VEND_CYA1_ERPT_MASK))
3616 (void) pci_cfgacc_put16(rcdip, bdf,
3617 NVIDIA_CK804_VEND_CYA1_OFF,
3618 cya1 | NVIDIA_CK804_VEND_CYA1_ERPT_VAL);
3619 }
3620 }
3621