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 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25 /*
26 * Copyright (c) * Copyright (c) 2001 Tadpole Technology plc
27 * All rights reserved.
28 * From "@(#)pcicfg.c 1.31 99/06/18 SMI"
29 */
30
31 #pragma ident "%Z%%M% %I% %E% SMI"
32
33 /*
34 * Cardbus configurator
35 */
36
37 #include <sys/ddi.h>
38 #include <sys/sunndi.h>
39 #include <sys/ndi_impldefs.h>
40
41 #include <sys/pci.h>
42 #include <sys/ebus.h>
43 #include <sys/hotplug/hpctrl.h>
44 #include <sys/hotplug/pci/pcicfg.h>
45
46 #include <sys/pctypes.h>
47 #include <sys/pcmcia.h>
48 #include <sys/sservice.h>
49
50 #include <sys/isa_defs.h>
51
52 #include <sys/note.h>
53
54 #include <sys/ethernet.h>
55
56 #include "cardbus.h"
57 #include "cardbus_parse.h"
58 #include "cardbus_cfg.h"
59
60 /*
61 * ************************************************************************
62 * *** Implementation specific local data structures/definitions. ***
63 * ************************************************************************
64 */
65
66 #define PCICFG_MAX_DEVICE 32
67 #define PCICFG_MAX_FUNCTION 8
68
69 static uint32_t pcicfg_max_device = PCICFG_MAX_DEVICE;
70 static uint32_t pcicfg_max_function = PCICFG_MAX_FUNCTION;
71
72 #define PCICFG_NODEVICE 42
73 #define PCICFG_NOMEMORY 43
74 #define PCICFG_NOMULTI 44
75
76 #define PCICFG_HIADDR(n) ((uint32_t)(((uint64_t)(n) & 0xFFFFFFFF00000000)>> 32))
77 #define PCICFG_LOADDR(n) ((uint32_t)((uint64_t)(n) & 0x00000000FFFFFFFF))
78 #define PCICFG_LADDR(lo, hi) (((uint64_t)(hi) << 32) | (uint32_t)(lo))
79
80 #define PCICFG_HIWORD(n) ((uint16_t)(((uint32_t)(n) & 0xFFFF0000)>> 16))
81 #define PCICFG_LOWORD(n) ((uint16_t)((uint32_t)(n) & 0x0000FFFF))
82 #define PCICFG_HIBYTE(n) ((uint8_t)(((uint16_t)(n) & 0xFF00)>> 8))
83 #define PCICFG_LOBYTE(n) ((uint8_t)((uint16_t)(n) & 0x00FF))
84
85 #define PCICFG_ROUND_UP(addr, gran) ((uintptr_t)((gran+addr-1)&(~(gran-1))))
86 #define PCICFG_ROUND_DOWN(addr, gran) ((uintptr_t)((addr) & ~(gran-1)))
87
88 #define PCICFG_MEMGRAN 0x100000
89 #define PCICFG_IOGRAN 0x1000
90 #define PCICFG_4GIG_LIMIT 0xFFFFFFFFUL
91 #define CBCFG_MEMGRAN 0x1000
92 #define CBCFG_IOGRAN 0x4
93
94 #define PCICFG_MEM_MULT 4
95 #define PCICFG_IO_MULT 4
96 #define PCICFG_RANGE_LEN 2 /* Number of range entries */
97
98 /*
99 * ISA node declaration structure.
100 */
101 struct isa_node {
102 char *name;
103 char *compatible[5];
104 char *type;
105 char *model;
106 uint16_t reg;
107 uint16_t span;
108 };
109
110 struct cardbus_name_entry {
111 uint32_t class_code;
112 char *name;
113 int pil;
114 };
115
116 struct cardbus_find_ctrl {
117 uint_t bus;
118 uint_t device;
119 uint_t function;
120 dev_info_t *dip;
121 };
122
123 #define PCICFG_MAKE_REG_HIGH(busnum, devnum, funcnum, register)\
124 (\
125 ((ulong_t)(busnum & 0xff) << 16) |\
126 ((ulong_t)(devnum & 0x1f) << 11) |\
127 ((ulong_t)(funcnum & 0x7) << 8) |\
128 ((ulong_t)(register & 0x3f)))
129
130 typedef struct cardbus_phdl cardbus_phdl_t;
131
132 struct cardbus_phdl {
133
134 dev_info_t *dip; /* Associated with the attach point */
135 dev_info_t *res_dip; /* dip from which io/mem is allocated */
136 cardbus_phdl_t *next;
137
138 uint64_t memory_base; /* Memory base for this attach point */
139 uint64_t memory_last;
140 uint64_t memory_len;
141 uint32_t memory_gran;
142 uint32_t io_base; /* I/O base for this attach point */
143 uint32_t io_last;
144 uint32_t io_len;
145 uint32_t io_gran;
146
147 int error;
148 uint_t highest_bus; /* Highest bus seen on the probe */
149 ndi_ra_request_t mem_req; /* allocator request for memory */
150 ndi_ra_request_t io_req; /* allocator request for I/O */
151 };
152
153 typedef struct {
154 dev_info_t *dip; /* Associated with the attach point */
155 ddi_acc_handle_t handle; /* open handle on parent PCI config space */
156 uint32_t io_base; /* I/O base for this attach point */
157 int io_decode_reg;
158 } isa_phdl_t;
159
160
161 /*
162 * forward declarations for routines defined in this module (called here)
163 */
164 static cardbus_phdl_t *cardbus_find_phdl(dev_info_t *dip);
165 static cardbus_phdl_t *cardbus_create_phdl(dev_info_t *dip);
166 static int cardbus_destroy_phdl(dev_info_t *dip);
167 static int cardbus_program_ap(dev_info_t *);
168 static void cardbus_topbridge_assign(dev_info_t *, cardbus_phdl_t *);
169 static int cardbus_bridge_ranges(dev_info_t *, cardbus_phdl_t *,
170 ddi_acc_handle_t);
171 static int cardbus_bridge_assign(dev_info_t *, void *);
172 static int cardbus_isa_bridge_ranges(dev_info_t *dip, cardbus_phdl_t *entry,
173 ddi_acc_handle_t handle);
174 static int cardbus_add_isa_reg(dev_info_t *, void *);
175 static int cardbus_allocate_chunk(dev_info_t *, uint8_t, uint8_t);
176 static int cardbus_free_chunk(dev_info_t *);
177 static void cardbus_setup_bridge(dev_info_t *, cardbus_phdl_t *,
178 ddi_acc_handle_t);
179 static void cardbus_update_bridge(dev_info_t *, cardbus_phdl_t *,
180 ddi_acc_handle_t);
181 static void cardbus_get_mem(dev_info_t *, cardbus_phdl_t *, uint32_t,
182 uint64_t *);
183 static void cardbus_get_io(dev_info_t *, cardbus_phdl_t *, uint32_t,
184 uint32_t *);
185 static int cardbus_sum_resources(dev_info_t *, void *);
186 static int cardbus_free_bridge_resources(dev_info_t *);
187 static int cardbus_free_device_resources(dev_info_t *);
188 static int cardbus_free_resources(dev_info_t *);
189 static int cardbus_probe_bridge(cbus_t *, dev_info_t *, uint_t,
190 uint_t, uint_t);
191 static int cardbus_probe_children(cbus_t *, dev_info_t *, uint_t, uint_t,
192 uint_t, uint8_t *);
193 static int cardbus_add_config_reg(dev_info_t *, uint_t, uint_t, uint_t);
194 static int cardbus_add_isa_node(cbus_t *, dev_info_t *, struct isa_node *);
195 static int cardbus_config_setup(dev_info_t *, ddi_acc_handle_t *);
196 static void cardbus_config_teardown(ddi_acc_handle_t *);
197 static void cardbus_reparent_children(dev_info_t *, dev_info_t *);
198 static int cardbus_update_assigned_prop(dev_info_t *, pci_regspec_t *);
199 static int cardbus_update_available_prop(dev_info_t *, uint32_t,
200 uint64_t, uint64_t);
201 static int cardbus_update_ranges_prop(dev_info_t *, cardbus_range_t *);
202 static int cardbus_update_reg_prop(dev_info_t *dip, uint32_t regvalue,
203 uint_t reg_offset);
204 static int cardbus_set_standard_props(dev_info_t *parent, dev_info_t *dip,
205 ddi_acc_handle_t config_handle);
206 static int cardbus_set_isa_props(dev_info_t *parent, dev_info_t *dip,
207 char *name, char *compat[]);
208 static int cardbus_set_busnode_props(dev_info_t *);
209 static int cardbus_set_busnode_isaprops(dev_info_t *);
210 static int cardbus_set_childnode_props(dev_info_t *dip,
211 ddi_acc_handle_t config_handle);
212 static void cardbus_set_bus_numbers(ddi_acc_handle_t config_handle,
213 uint_t primary, uint_t secondary);
214 static void enable_pci_isa_bridge(dev_info_t *dip,
215 ddi_acc_handle_t config_handle);
216 static void enable_pci_pci_bridge(dev_info_t *dip,
217 ddi_acc_handle_t config_handle);
218 static void enable_cardbus_bridge(dev_info_t *dip,
219 ddi_acc_handle_t config_handle);
220 static void disable_pci_pci_bridge(dev_info_t *dip,
221 ddi_acc_handle_t config_handle);
222 static void disable_cardbus_bridge(dev_info_t *dip,
223 ddi_acc_handle_t config_handle);
224 static void enable_cardbus_device(dev_info_t *, ddi_acc_handle_t);
225 static void disable_cardbus_device(ddi_acc_handle_t config_handle);
226 static void cardbus_force_boolprop(dev_info_t *dip, char *pname);
227 static void cardbus_force_intprop(dev_info_t *dip, char *pname,
228 int *pval, int len);
229 static void cardbus_force_stringprop(dev_info_t *dip, char *pname,
230 char *pval);
231 static void split_addr(char *, int *, int *);
232 #ifdef DEBUG
233 static void cardbus_dump_common_config(ddi_acc_handle_t config_handle);
234 static void cardbus_dump_device_config(ddi_acc_handle_t config_handle);
235 static void cardbus_dump_bridge_config(ddi_acc_handle_t config_handle,
236 uint8_t header_type);
237 static void cardbus_dump_config(ddi_acc_handle_t config_handle);
238 static void cardbus_dump_reg(dev_info_t *dip, const pci_regspec_t *regspec,
239 int nelems);
240 #endif
241
242 static cardbus_phdl_t *cardbus_phdl_list = NULL;
243
244 static struct cardbus_name_entry cardbus_class_lookup [] = {
245 { 0x001, "display", 9 },
246 { 0x100, "scsi", 4 },
247 { 0x101, "ide", 4 },
248 { 0x102, "fdc", 4 },
249 { 0x103, "ipi", 4 },
250 { 0x104, "raid", 4 },
251 { 0x200, "ethernet", 6 },
252 { 0x201, "token-ring", 6 },
253 { 0x202, "fddi", 6 },
254 { 0x203, "atm", 6 },
255 { 0x300, "display", 9 }, /* VGA card */
256 { 0x380, "display", 9 }, /* other - for the Raptor Card */
257 { 0x400, "video", 11 },
258 { 0x401, "sound", 11 },
259 { 0x500, "memory", 11 },
260 { 0x501, "flash", 11 },
261 { 0x600, "host", 11 },
262 { 0x601, "isa", 11 },
263 { 0x602, "eisa", 11 },
264 { 0x603, "mca", 11 },
265 { 0x604, "pci", 11 },
266 { 0x605, "pcmcia", 11 },
267 { 0x606, "nubus", 11 },
268 { 0x607, "cardbus", 11 },
269 { 0x680, NULL, 8 },
270 { 0x700, "serial", 11 },
271 { 0x701, "parallel", 6 },
272 { 0x800, "interrupt-controller", 3 },
273 { 0x801, "dma-controller", 3 },
274 { 0x802, "timer", 3 },
275 { 0x803, "rtc", 3 },
276 { 0x900, "keyboard", 8 },
277 { 0x901, "pen", 8 },
278 { 0x902, "mouse", 8 },
279 { 0xa00, "dock", 1 },
280 { 0xb00, "cpu", 1 },
281 { 0xc00, "firewire", 9 },
282 { 0xc01, "access-bus", 4 },
283 { 0xc02, "ssa", 4 },
284 { 0xc03, "usb", 9 },
285 { 0xc04, "fibre-channel", 6 },
286 { 0, 0 }
287 };
288
289 #ifndef _DONT_USE_1275_GENERIC_NAMES
290 static char *cardbus_get_class_name(uint32_t classcode);
291 #endif /* _DONT_USE_1275_GENERIC_NAMES */
292
293 /*
294 * Reprogram ILINE with default value only if BIOS doesn't program it
295 */
296 int
cardbus_validate_iline(dev_info_t * dip,ddi_acc_handle_t handle)297 cardbus_validate_iline(dev_info_t *dip, ddi_acc_handle_t handle)
298 {
299 uint8_t intline = 0xff;
300
301 if (pci_config_get8(handle, PCI_CONF_IPIN)) {
302 intline = pci_config_get8(handle, PCI_CONF_ILINE);
303 if ((intline == 0) || (intline == 0xff)) {
304 intline = ddi_getprop(DDI_DEV_T_ANY, dip,
305 DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS,
306 "interrupt-line", 0xff);
307 if (intline == (uint8_t)0xff) {
308 intline = ddi_getprop(DDI_DEV_T_ANY,
309 ddi_get_parent(dip),
310 DDI_PROP_CANSLEEP /* |DDI_PROP_DONTPASS */,
311 "interrupt-line", 0xb);
312 }
313
314 pci_config_put8(handle, PCI_CONF_ILINE, intline);
315 }
316 (void) ndi_prop_update_int(DDI_DEV_T_NONE, dip,
317 "interrupt-line", intline);
318 }
319 return (intline);
320 }
321
322 /*
323 * This entry point is called to configure a device (and
324 * all its children) on the given bus. It is called when
325 * a new device is added to the PCI domain. This routine
326 * will create the device tree and program the devices
327 * registers.
328 */
329 int
cardbus_configure(cbus_t * cbp)330 cardbus_configure(cbus_t *cbp)
331 {
332 uint_t bus;
333 int cardbus_dev, func;
334 dev_info_t *attach_point;
335
336 cardbus_err(cbp->cb_dip, 6, "cardbus_configure ()\n");
337
338 bus = cardbus_primary_busno(cbp->cb_dip);
339
340 if (ndi_devi_alloc(cbp->cb_dip, DEVI_PSEUDO_NEXNAME,
341 (pnode_t)DEVI_SID_NODEID,
342 &attach_point) != NDI_SUCCESS) {
343 cardbus_err(cbp->cb_dip, 1,
344 "cardbus_configure(): Failed to alloc probe node\n");
345 return (PCICFG_FAILURE);
346 }
347
348 /*
349 * Node name marks this node as the "attachment point".
350 */
351 if (ndi_devi_set_nodename(attach_point,
352 "hp_attachment", 0) != NDI_SUCCESS) {
353 cardbus_err(cbp->cb_dip, 1,
354 "Failed to set nodename for attachment node\n");
355 (void) ndi_devi_free(attach_point);
356 return (PCICFG_FAILURE);
357 }
358
359 cardbus_err(ddi_get_parent(attach_point), 8,
360 "Set bus type to cardbus\n");
361 (void) ddi_prop_update_string(DDI_DEV_T_NONE,
362 ddi_get_parent(attach_point), PCM_DEVICETYPE,
363 "cardbus");
364
365 split_addr(ddi_get_name_addr(cbp->cb_dip), &cardbus_dev, &func);
366
367 cardbus_err(attach_point, 8,
368 "Configuring [0x%x][0x%x][0x%x]\n", bus, cardbus_dev, func);
369
370 switch (cardbus_probe_bridge(cbp, attach_point,
371 bus, cardbus_dev, func)) {
372 case PCICFG_FAILURE:
373 cardbus_err(cbp->cb_dip, 4,
374 "configure failed: bus [0x%x] slot [0x%x] func [0x%x]\n",
375 bus, cardbus_dev, func);
376 goto cleanup;
377 case PCICFG_NODEVICE:
378 cardbus_err(cbp->cb_dip, 4,
379 "no device: bus [0x%x] slot [0x%x] func [0x%x]\n",
380 bus, cardbus_dev, func);
381 goto cleanup;
382 default:
383 cardbus_err(cbp->cb_dip, 9,
384 "configure: bus => [%d] slot => [%d] func => [%d]\n",
385 bus, cardbus_dev, func);
386 break;
387 }
388
389 if (cardbus_program_ap(cbp->cb_dip) == PCICFG_SUCCESS) {
390 (void) cardbus_reparent_children(attach_point, cbp->cb_dip);
391 (void) ndi_devi_free(attach_point);
392 cbp->cb_nex_ops->enable_intr(cbp->cb_dip);
393 return (PCICFG_SUCCESS);
394 }
395
396 cardbus_err(cbp->cb_dip, 1, "Failed to program devices\n");
397
398 cleanup:
399 /*
400 * Clean up a partially created "probe state" tree.
401 * There are no resources allocated to the in the
402 * probe state.
403 */
404
405 cardbus_err(cbp->cb_dip, 6,
406 "Look up device [0x%x] function [0x%x] to clean up\n",
407 cardbus_dev, func);
408
409 cardbus_err(cbp->cb_dip, 6,
410 "Cleaning up device [0x%x] function [0x%x]\n",
411 cardbus_dev, func);
412
413 /*
414 * If this was a bridge device it will have a
415 * probe handle - if not, no harm in calling this.
416 */
417 (void) cardbus_destroy_phdl(cbp->cb_dip);
418
419 if (ddi_get_child(attach_point)) {
420 /*
421 * This will free up the node
422 */
423 (void) ndi_devi_offline(ddi_get_child(attach_point),
424 NDI_UNCONFIG|NDI_DEVI_REMOVE);
425 }
426 (void) ndi_devi_free(attach_point);
427
428 return (PCICFG_FAILURE);
429 }
430
431 int
cardbus_unconfigure(cbus_t * cbp)432 cardbus_unconfigure(cbus_t *cbp)
433 {
434 ddi_acc_handle_t config_handle;
435 dev_info_t *dip = cbp->cb_dip;
436
437 cbp->cb_nex_ops->disable_intr(dip);
438 if (pci_config_setup(dip, &config_handle) == DDI_SUCCESS) {
439 disable_cardbus_bridge(dip, config_handle);
440 (void) pci_config_teardown(&config_handle);
441 } else {
442 cardbus_err(dip, 1,
443 "cardbus_unconfigure(): Failed to setup config space\n");
444 }
445
446 (void) cardbus_free_chunk(dip);
447 cardbus_err(dip, 6,
448 "cardbus_unconfigure: calling cardbus_free_bridge_resources\n");
449 (void) cardbus_free_bridge_resources(dip);
450
451 return (PCICFG_SUCCESS);
452 }
453
454 int
cardbus_teardown_device(dev_info_t * dip)455 cardbus_teardown_device(dev_info_t *dip)
456 {
457 /*
458 * Free up resources associated with 'dip'
459 */
460
461 if (cardbus_free_resources(dip) != PCICFG_SUCCESS) {
462 cardbus_err(dip, 1,
463 "cardbus_teardown_device: Failed to free resources\n");
464 return (PCICFG_FAILURE);
465 }
466
467 if (ndi_devi_offline(dip, NDI_DEVI_REMOVE) != NDI_SUCCESS) {
468 cardbus_err(dip, 1,
469 "cardbus_teardown_device: "
470 "Failed to offline and remove node\n");
471 return (PCICFG_FAILURE);
472 }
473
474 return (PCICFG_SUCCESS);
475 }
476
477 /*
478 * Get the primary pci bus number. This should be the lowest number
479 * in the bus-range property of our parent.
480 */
481 int
cardbus_primary_busno(dev_info_t * dip)482 cardbus_primary_busno(dev_info_t *dip)
483 {
484 int len, rval;
485 char bus_type[16] = "(unknown)";
486 dev_info_t *par = ddi_get_parent(dip);
487 cardbus_bus_range_t *bus_range;
488
489 ASSERT(strcmp(ddi_driver_name(dip), "pcic") == 0);
490 len = sizeof (bus_type);
491 if ((ddi_prop_op(DDI_DEV_T_ANY, par, PROP_LEN_AND_VAL_BUF,
492 DDI_PROP_CANSLEEP | DDI_PROP_DONTPASS,
493 "device_type",
494 (caddr_t)&bus_type, &len) == DDI_SUCCESS)) {
495 ASSERT((strcmp(bus_type, "pci") == 0) ||
496 (strcmp(bus_type, "cardbus") == 0));
497 if (ddi_getlongprop(DDI_DEV_T_ANY, par, 0, "bus-range",
498 (caddr_t)&bus_range, &len) == DDI_PROP_SUCCESS) {
499 cardbus_err(dip, 9,
500 "cardbus_primary_busno: bus range is %d to %d\n",
501 bus_range->lo, bus_range->hi);
502 rval = (int)bus_range->lo;
503 kmem_free((caddr_t)bus_range, len);
504 return (rval);
505 }
506 }
507
508 cardbus_err(dip, 2,
509 "cardbus_primary_busno: Not a pci device or no bus-range\n");
510 return (-1);
511 }
512
513 static cardbus_phdl_t *
cardbus_find_phdl(dev_info_t * dip)514 cardbus_find_phdl(dev_info_t *dip)
515 {
516 cardbus_phdl_t *entry;
517
518 mutex_enter(&cardbus_list_mutex);
519 for (entry = cardbus_phdl_list; entry != NULL; entry = entry->next) {
520 if (entry->dip == dip) {
521 mutex_exit(&cardbus_list_mutex);
522 return (entry);
523 }
524 }
525 mutex_exit(&cardbus_list_mutex);
526
527 /*
528 * Did'nt find entry - create one
529 */
530 return (cardbus_create_phdl(dip));
531 }
532
533 static cardbus_phdl_t *
cardbus_create_phdl(dev_info_t * dip)534 cardbus_create_phdl(dev_info_t *dip)
535 {
536 cardbus_phdl_t *new;
537
538 new = (cardbus_phdl_t *)kmem_zalloc(sizeof (cardbus_phdl_t), KM_SLEEP);
539
540 new->dip = dip;
541 new->io_gran = CBCFG_IOGRAN;
542 new->memory_gran = CBCFG_MEMGRAN;
543 mutex_enter(&cardbus_list_mutex);
544 new->next = cardbus_phdl_list;
545 cardbus_phdl_list = new;
546 mutex_exit(&cardbus_list_mutex);
547
548 return (new);
549 }
550
551 static int
cardbus_destroy_phdl(dev_info_t * dip)552 cardbus_destroy_phdl(dev_info_t *dip)
553 {
554 cardbus_phdl_t *entry;
555 cardbus_phdl_t *follow = NULL;
556 ra_return_t res;
557
558 mutex_enter(&cardbus_list_mutex);
559 for (entry = cardbus_phdl_list; entry != NULL; follow = entry,
560 entry = entry->next) {
561 if (entry->dip == dip) {
562 if (entry == cardbus_phdl_list) {
563 cardbus_phdl_list = entry->next;
564 } else {
565 follow->next = entry->next;
566 }
567 /*
568 * If this entry has any allocated memory
569 * or IO space associated with it, that
570 * must be freed up.
571 */
572 if (entry->memory_len > 0) {
573 res.ra_addr_lo = entry->memory_base;
574 res.ra_len = entry->memory_len;
575 (void) pcmcia_free_mem(entry->res_dip, &res);
576 #ifdef _LP64
577 cardbus_err(dip, 8,
578 "cardbus_destroy_phdl: "
579 "MEMORY BASE = [0x%lx] length [0x%lx]\n",
580 entry->memory_base, entry->memory_len);
581 #else
582 cardbus_err(dip, 8,
583 "cardbus_destroy_phdl: "
584 "MEMORY BASE = [0x%llx] length [0x%llx]\n",
585 entry->memory_base, entry->memory_len);
586 #endif
587 }
588 if (entry->io_len > 0) {
589 res.ra_addr_lo = entry->io_base;
590 res.ra_len = entry->io_len;
591 (void) pcmcia_free_io(entry->res_dip, &res);
592 cardbus_err(dip, 8,
593 "cardbus_destroy_phdl: "
594 "IO BASE = [0x%x] length [0x%x]\n",
595 entry->io_base, entry->io_len);
596 }
597 /*
598 * Destroy this entry
599 */
600 kmem_free((caddr_t)entry, sizeof (cardbus_phdl_t));
601 mutex_exit(&cardbus_list_mutex);
602 return (PCICFG_SUCCESS);
603 }
604 }
605
606 mutex_exit(&cardbus_list_mutex);
607
608 /*
609 * Didn't find the entry
610 */
611 return (PCICFG_FAILURE);
612 }
613
614 static int
cardbus_program_ap(dev_info_t * dip)615 cardbus_program_ap(dev_info_t *dip)
616 {
617 cardbus_phdl_t *phdl;
618 uint8_t header_type, sec_bus;
619 ddi_acc_handle_t handle;
620
621 if (pci_config_setup(dip, &handle) != DDI_SUCCESS) {
622 cardbus_err(dip, 1,
623 "cardbus_program_ap: Failed to map config space!\n");
624 return (PCICFG_FAILURE);
625 }
626
627 header_type = pci_config_get8(handle, PCI_CONF_HEADER);
628 sec_bus = pci_config_get8(handle, PCI_BCNF_SECBUS);
629
630 cardbus_err(dip, 6,
631 "cardbus_program_ap (header_type=0x%x)\n", header_type);
632 (void) pci_config_teardown(&handle);
633
634 /*
635 * Header type two is PCI to Cardbus bridge, see page 43 of the
636 * CL-PD6832 data sheet
637 */
638 switch (header_type & PCI_HEADER_TYPE_M) {
639 case PCI_HEADER_CARDBUS:
640 cardbus_err(dip, 8,
641 "cardbus_program_ap calling cardbus_allocate_chunk\n");
642 if (cardbus_allocate_chunk(dip,
643 header_type & PCI_HEADER_TYPE_M,
644 sec_bus) != PCICFG_SUCCESS) {
645 cardbus_err(dip, 1,
646 "cardbus_program_ap: "
647 "Not enough memory to hotplug\n");
648 (void) cardbus_destroy_phdl(dip);
649 return (PCICFG_FAILURE);
650 }
651
652 cardbus_err(dip, 8,
653 "cardbus_program_ap calling cardbus_find_phdl\n");
654 phdl = cardbus_find_phdl(dip);
655 ASSERT(phdl);
656
657 if (phdl == NULL) {
658 cardbus_err(dip, 1, "cardbus_find_phdl failed\n");
659 return (PCICFG_FAILURE);
660 }
661 phdl->error = PCICFG_SUCCESS;
662 cardbus_err(dip, 8,
663 "cardbus_program_ap calling cardbus_topbridge_assign\n");
664 cardbus_topbridge_assign(dip, phdl);
665
666 if (phdl->error != PCICFG_SUCCESS) {
667 cardbus_err(dip, 1, "Problem assigning bridge\n");
668 (void) cardbus_destroy_phdl(dip);
669 return (phdl->error);
670 }
671 break;
672
673 default:
674 return (PCICFG_FAILURE);
675 }
676
677 return (PCICFG_SUCCESS);
678 }
679
680 static void
cardbus_topbridge_assign(dev_info_t * dip,cardbus_phdl_t * entry)681 cardbus_topbridge_assign(dev_info_t *dip, cardbus_phdl_t *entry)
682 {
683 ddi_acc_handle_t handle;
684 uint8_t header_type;
685
686 cardbus_err(dip, 6, "cardbus_topbridge_assign\n");
687
688 if (pci_config_setup(dip, &handle) != DDI_SUCCESS) {
689 cardbus_err(dip, 1,
690 "cardbus_topbridge_bridge_assign: "
691 "Failed to map config space!\n");
692 return;
693 }
694
695 header_type = pci_config_get8(handle,
696 PCI_CONF_HEADER) & PCI_HEADER_TYPE_M;
697
698 /* cardbus bridge is the same as PCI-PCI bridge */
699 ASSERT((header_type == PCI_HEADER_PPB) ||
700 (header_type == PCI_HEADER_CARDBUS));
701
702 (void) cardbus_bridge_ranges(dip, entry, handle);
703
704 (void) pci_config_teardown(&handle);
705 }
706
707 static int
cardbus_bridge_ranges(dev_info_t * dip,cardbus_phdl_t * entry,ddi_acc_handle_t handle)708 cardbus_bridge_ranges(dev_info_t *dip, cardbus_phdl_t *entry,
709 ddi_acc_handle_t handle)
710 {
711 cardbus_range_t range[PCICFG_RANGE_LEN];
712 int bus_range[2];
713 int count;
714 int i;
715
716 cardbus_err(dip, 8, "cardbus_bridge_ranges\n");
717
718 bzero((caddr_t)range, sizeof (cardbus_range_t) * PCICFG_RANGE_LEN);
719
720 (void) cardbus_setup_bridge(dip, entry, handle);
721
722 range[0].child_hi = range[0].parent_hi |= (PCI_REG_REL_M | PCI_ADDR_IO);
723 range[0].child_lo = range[0].parent_lo = entry->io_last;
724 range[1].child_hi = range[1].parent_hi |= (PCI_REG_REL_M |
725 PCI_ADDR_MEM32);
726 range[1].child_lo = range[1].parent_lo = entry->memory_last;
727
728 ndi_devi_enter(dip, &count);
729 ddi_walk_devs(ddi_get_child(dip), cardbus_bridge_assign, (void *)entry);
730 ndi_devi_exit(dip, count);
731
732 (void) cardbus_update_bridge(dip, entry, handle);
733
734 bus_range[0] = pci_config_get8(handle, PCI_BCNF_SECBUS);
735 bus_range[1] = pci_config_get8(handle, PCI_BCNF_SUBBUS);
736
737 cardbus_err(dip, 8,
738 "Set up bus-range property to %u->%u\n",
739 bus_range[0], bus_range[1]);
740
741 if ((i = ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
742 "bus-range",
743 bus_range, 2)) != DDI_SUCCESS) {
744
745 if (i == DDI_PROP_NOT_FOUND) {
746 cardbus_err(dip, 8,
747 "Create bus-range property, %u->%u\n",
748 bus_range[0], bus_range[1]);
749 i = ddi_prop_create(DDI_DEV_T_NONE, dip,
750 DDI_PROP_CANSLEEP,
751 "bus-range", (caddr_t)bus_range,
752 sizeof (bus_range));
753 }
754
755 if (i != DDI_PROP_SUCCESS) {
756 cardbus_err(dip, 1,
757 "Failed to set bus-range property, %u->%u (%d)\n",
758 bus_range[0], bus_range[1], i);
759 entry->error = PCICFG_FAILURE;
760 return (DDI_WALK_TERMINATE);
761 }
762 }
763
764 if (entry->io_len > 0) {
765 range[0].size_lo = entry->io_last - entry->io_base;
766 if (cardbus_update_ranges_prop(dip, &range[0])) {
767 cardbus_err(dip, 1, "Failed to update ranges (i/o)\n");
768 entry->error = PCICFG_FAILURE;
769 return (DDI_WALK_TERMINATE);
770 }
771 }
772 if (entry->memory_len > 0) {
773 range[1].size_lo = entry->memory_last - entry->memory_base;
774 if (cardbus_update_ranges_prop(dip, &range[1])) {
775 cardbus_err(dip, 1,
776 "Failed to update ranges (memory)\n");
777 entry->error = PCICFG_FAILURE;
778 return (DDI_WALK_TERMINATE);
779 }
780 }
781
782 return (DDI_WALK_PRUNECHILD);
783 }
784 static int
cardbus_bridge_assign(dev_info_t * dip,void * hdl)785 cardbus_bridge_assign(dev_info_t *dip, void *hdl)
786 {
787 ddi_acc_handle_t handle;
788 pci_regspec_t *reg;
789 int length;
790 int rcount;
791 int i;
792 int offset;
793 uint64_t mem_answer;
794 uint32_t io_answer, request;
795 uint8_t header_type, base_class;
796 cardbus_phdl_t *entry = (cardbus_phdl_t *)hdl;
797
798 /*
799 * Ignore the attachment point and pcs.
800 */
801 if (strcmp(ddi_binding_name(dip), "hp_attachment") == 0 ||
802 strcmp(ddi_binding_name(dip), "pcs") == 0) {
803 cardbus_err(dip, 8, "cardbus_bridge_assign: Ignoring\n");
804 return (DDI_WALK_CONTINUE);
805 }
806
807
808 cardbus_err(dip, 6, "cardbus_bridge_assign\n");
809
810 if (entry == NULL) {
811 cardbus_err(dip, 1, "Failed to get entry\n");
812 return (DDI_WALK_TERMINATE);
813 }
814 if (cardbus_config_setup(dip, &handle) != DDI_SUCCESS) {
815 cardbus_err(dip, 1,
816 "cardbus_bridge_assign: Failed to map config space!\n");
817 entry->error = PCICFG_FAILURE;
818 return (DDI_WALK_TERMINATE);
819 }
820
821 header_type = pci_config_get8(handle, PCI_CONF_HEADER) &
822 PCI_HEADER_TYPE_M;
823 base_class = pci_config_get8(handle, PCI_CONF_BASCLASS);
824
825 /*
826 * This function is not called for the top bridge and we are
827 * not enumerating down a further cardbus interface yet!
828 */
829 if (base_class == PCI_CLASS_BRIDGE) {
830 uint8_t sub_class;
831
832 sub_class = pci_config_get8(handle, PCI_CONF_SUBCLASS);
833
834 switch (sub_class) {
835 case PCI_BRIDGE_PCI:
836 if (header_type == PCI_HEADER_PPB) {
837 i = cardbus_bridge_ranges(dip, entry, handle);
838 (void) cardbus_config_teardown(&handle);
839 return (i);
840 }
841 goto bad_device;
842
843 case PCI_BRIDGE_ISA:
844 i = cardbus_isa_bridge_ranges(dip, entry, handle);
845 (void) cardbus_config_teardown(&handle);
846 return (i);
847
848 case PCI_BRIDGE_CARDBUS:
849 /*
850 * Fall through, there should be at least one register
851 * set for this.
852 */
853 break;
854
855 case PCI_BRIDGE_OTHER:
856 default:
857 break;
858 }
859 }
860
861 #ifdef sparc
862 /*
863 * If there is an interrupt pin set program
864 * interrupt line with default values.
865 */
866 if (pci_config_get8(handle, PCI_CONF_IPIN)) {
867 pci_config_put8(handle, PCI_CONF_ILINE, 0xf);
868 }
869 #else
870 (void) cardbus_validate_iline(dip, handle);
871 #endif
872
873 /*
874 * A single device (under a bridge).
875 * For each "reg" property with a length, allocate memory
876 * and program the base registers.
877 */
878 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
879 DDI_PROP_DONTPASS, "reg", (caddr_t)®,
880 &length) != DDI_PROP_SUCCESS) {
881 cardbus_err(dip, 1, "Failed to read reg property\n");
882 entry->error = PCICFG_FAILURE;
883 (void) cardbus_config_teardown(&handle);
884 return (DDI_WALK_TERMINATE);
885 }
886
887 rcount = length / sizeof (pci_regspec_t);
888 cardbus_err(dip, 9, "rcount = %d\n", rcount);
889
890 for (i = 0; i < rcount; i++) {
891 if ((reg[i].pci_size_low != 0) || (reg[i].pci_size_hi != 0)) {
892 offset = PCI_REG_REG_G(reg[i].pci_phys_hi);
893 switch (PCI_REG_ADDR_G(reg[i].pci_phys_hi)) {
894 case PCI_REG_ADDR_G(PCI_ADDR_MEM64):
895
896 (void) cardbus_get_mem(ddi_get_parent(dip),
897 entry, reg[i].pci_size_low, &mem_answer);
898 ASSERT(!PCICFG_HIADDR(mem_answer));
899 pci_config_put32(handle, offset,
900 PCICFG_LOADDR(mem_answer));
901 pci_config_put32(handle, offset + 4,
902 PCICFG_HIADDR(mem_answer));
903 cardbus_err(dip, 8,
904 "REGISTER (64)LO [0x%x] ----> [0x%02x]\n",
905 pci_config_get32(handle, offset), offset);
906 cardbus_err(dip, 8,
907 "REGISTER (64)HI [0x%x] ----> [0x%02x]\n",
908 pci_config_get32(handle, offset+4),
909 offset+4);
910 reg[i].pci_phys_low = PCICFG_HIADDR(mem_answer);
911 reg[i].pci_phys_mid = PCICFG_LOADDR(mem_answer);
912 break;
913
914 case PCI_REG_ADDR_G(PCI_ADDR_MEM32):
915 /* allocate memory space from the allocator */
916
917 (void) cardbus_get_mem(ddi_get_parent(dip),
918 entry, reg[i].pci_size_low, &mem_answer);
919 pci_config_put32(handle, offset, 0xffffffff);
920 request = pci_config_get32(handle, offset);
921
922 pci_config_put32(handle, offset,
923 (uint32_t)mem_answer);
924 reg[i].pci_phys_low = (uint32_t)mem_answer;
925 reg[i].pci_phys_mid = 0;
926 if (((PCI_BASE_TYPE_M & request) ==
927 PCI_BASE_TYPE_ALL) &&
928 ((PCI_BASE_SPACE_M & request) ==
929 PCI_BASE_SPACE_MEM)) {
930 cardbus_err(dip, 8,
931 "REGISTER (64)LO [0x%x] ----> "
932 "[0x%02x]\n",
933 pci_config_get32(handle, offset),
934 offset);
935 pci_config_put32(handle,
936 offset + 4, 0);
937 cardbus_err(dip, 8,
938 "REGISTER (64)HI [0x%x] ----> "
939 "[0x%02x]\n",
940 pci_config_get32(handle, offset+4),
941 offset+4);
942 } else {
943 cardbus_err(dip, 8,
944 "REGISTER (32)LO [0x%x] ----> "
945 "[0x%02x]\n",
946 pci_config_get32(handle, offset),
947 offset);
948 }
949 break;
950
951 case PCI_REG_ADDR_G(PCI_ADDR_IO):
952 /* allocate I/O space from the allocator */
953
954 (void) cardbus_get_io(ddi_get_parent(dip),
955 entry, reg[i].pci_size_low, &io_answer);
956 pci_config_put32(handle, offset, io_answer);
957 cardbus_err(dip, 8,
958 "REGISTER (I/O)LO [0x%x] ----> [0x%02x]\n",
959 pci_config_get32(handle, offset), offset);
960 reg[i].pci_phys_low = io_answer;
961 break;
962
963 default:
964 cardbus_err(dip, 1, "Unknown register type\n");
965 kmem_free(reg, length);
966 (void) cardbus_config_teardown(&handle);
967 entry->error = PCICFG_FAILURE;
968 return (DDI_WALK_TERMINATE);
969 } /* switch */
970
971 /*
972 * Now that memory locations are assigned,
973 * update the assigned address property.
974 */
975 if (cardbus_update_assigned_prop(dip,
976 ®[i]) != PCICFG_SUCCESS) {
977 kmem_free(reg, length);
978 (void) cardbus_config_teardown(&handle);
979 entry->error = PCICFG_FAILURE;
980 return (DDI_WALK_TERMINATE);
981 }
982 }
983 }
984 kmem_free(reg, length);
985 enable_cardbus_device(dip, handle);
986 #ifdef CARDBUS_DEBUG
987 if (cardbus_debug >= 9) {
988 cardbus_dump_config(handle);
989 }
990 #endif
991 bad_device:
992 (void) cardbus_config_teardown(&handle);
993 return (DDI_WALK_CONTINUE);
994 }
995
996 static int
cardbus_isa_bridge_ranges(dev_info_t * dip,cardbus_phdl_t * entry,ddi_acc_handle_t handle)997 cardbus_isa_bridge_ranges(dev_info_t *dip, cardbus_phdl_t *entry,
998 ddi_acc_handle_t handle)
999 {
1000 struct ebus_pci_rangespec range;
1001 int count;
1002 pci_regspec_t *reg;
1003 int length;
1004 int rcount;
1005 uint32_t io_answer = 0xffffffff;
1006 isa_phdl_t isa_phdl;
1007 int i;
1008
1009 cardbus_err(dip, 8, "cardbus_isa_bridge_ranges\n");
1010
1011 bzero((caddr_t)&range, sizeof (range));
1012
1013 #ifdef sparc
1014 /*
1015 * If there is an interrupt pin set program
1016 * interrupt line with default values.
1017 */
1018 if (pci_config_get8(handle, PCI_CONF_IPIN)) {
1019 pci_config_put8(handle, PCI_CONF_ILINE, 0xf);
1020 }
1021 #else
1022 (void) cardbus_validate_iline(dip, handle);
1023 #endif
1024
1025 /*
1026 * For each "reg" property with a length, allocate memory.
1027 */
1028 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
1029 DDI_PROP_DONTPASS, "reg", (caddr_t)®,
1030 &length) != DDI_PROP_SUCCESS) {
1031 cardbus_err(dip, 1, "Failed to read reg property\n");
1032 entry->error = PCICFG_FAILURE;
1033 return (DDI_WALK_TERMINATE);
1034 }
1035
1036 rcount = length / sizeof (pci_regspec_t);
1037
1038 for (i = 0; i < rcount; i++) {
1039 if ((reg[i].pci_size_low != 0) || (reg[i].pci_size_hi != 0)) {
1040 switch (PCI_REG_ADDR_G(reg[i].pci_phys_hi)) {
1041 case PCI_REG_ADDR_G(PCI_ADDR_IO):
1042 /* allocate I/O space from the allocator */
1043
1044 (void) cardbus_get_io(ddi_get_parent(dip),
1045 entry, reg[i].pci_size_low, &io_answer);
1046 cardbus_err(dip, 8,
1047 "ISA (I/O)LO ----> [0x%x]\n", io_answer);
1048 reg[i].pci_phys_low = io_answer;
1049 range.phys_hi = 0;
1050 range.phys_low = io_answer;
1051 range.par_phys_hi = reg[i].pci_phys_hi |
1052 PCI_REG_REL_M;
1053 range.par_phys_low = reg[i].pci_phys_low;
1054 range.par_phys_mid = reg[i].pci_phys_mid;
1055 range.rng_size = reg[i].pci_size_low;
1056 i = rcount;
1057 break;
1058
1059 default:
1060 cardbus_err(dip, 1, "Unknown register type\n");
1061 kmem_free(reg, length);
1062 (void) cardbus_config_teardown(&handle);
1063 entry->error = PCICFG_FAILURE;
1064 return (DDI_WALK_TERMINATE);
1065 } /* switch */
1066 }
1067 }
1068 kmem_free(reg, length);
1069
1070 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE,
1071 dip, "ranges", (int *)&range,
1072 sizeof (range)/sizeof (int));
1073 if (io_answer != 0xffffffff) {
1074 isa_phdl.dip = dip;
1075 isa_phdl.handle = handle;
1076 isa_phdl.io_base = io_answer;
1077 isa_phdl.io_decode_reg = 0x58; /* Pos decoded IO space 0 reg */
1078 /* i_ndi_block_device_tree_changes(&count); */
1079 ndi_devi_enter(dip, &count);
1080 ddi_walk_devs(ddi_get_child(dip),
1081 cardbus_add_isa_reg, (void *)&isa_phdl);
1082 /* i_ndi_allow_device_tree_changes(count); */
1083 ndi_devi_exit(dip, count);
1084 }
1085 return (DDI_WALK_PRUNECHILD);
1086 }
1087
1088 /*
1089 * This is specific to ITE8888 chip.
1090 */
1091 static int
cardbus_add_isa_reg(dev_info_t * dip,void * arg)1092 cardbus_add_isa_reg(dev_info_t *dip, void *arg)
1093 {
1094 uint32_t io_reg = 0;
1095 int length;
1096 uint32_t reg[3], *breg;
1097 isa_phdl_t *phdl;
1098 uint8_t sz;
1099
1100 phdl = (isa_phdl_t *)arg;
1101 cardbus_err(dip, 6,
1102 "cardbus_add_isa_reg, base 0x%x\n", phdl->io_base);
1103
1104 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
1105 DDI_PROP_DONTPASS, "basereg", (caddr_t)&breg,
1106 &length) != DDI_PROP_SUCCESS) {
1107 return (DDI_WALK_CONTINUE);
1108 }
1109
1110 if ((length / sizeof (reg)) < 1) {
1111 kmem_free(breg, length);
1112 return (DDI_WALK_CONTINUE);
1113 }
1114
1115 /*
1116 * Add the "reg" property.
1117 */
1118 reg[0] = 0;
1119 reg[1] = breg[1] + phdl->io_base;
1120 reg[2] = breg[2];
1121
1122 /*
1123 * Generate the postive IO decode register setting.
1124 */
1125 for (sz = 0; sz < 8; sz++)
1126 if ((1<<sz) >= breg[2]) {
1127 io_reg = breg[1]
1128 | (1uL <<31) /* Enable */
1129 | (2uL <<29) /* Medium speed */
1130 | (1uL <<28) /* Aliase enable, */
1131 /* Don't care A[15:10] */
1132 | (sz<<24); /* Size code */
1133 break;
1134 }
1135
1136 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
1137 "reg", (int *)reg, 3);
1138 (void) ndi_prop_remove(DDI_DEV_T_NONE, dip, "basereg");
1139
1140 if (io_reg) {
1141 pci_config_put32(phdl->handle, phdl->io_decode_reg, io_reg);
1142 cardbus_err(dip, 6,
1143 "cardbus_add_isa_reg: I/O decode reg (0x%x) set to 0x%x\n",
1144 phdl->io_decode_reg,
1145 pci_config_get32(phdl->handle, phdl->io_decode_reg));
1146 phdl->io_decode_reg += sizeof (io_reg);
1147 } else
1148 cardbus_err(dip, 1,
1149 "cardbus_add_isa_reg: register size (0x%x) too large\n",
1150 breg[2]);
1151 kmem_free(breg, length);
1152 return (DDI_WALK_CONTINUE);
1153 }
1154
1155 /*
1156 * In case we want to ensure that some space is allocated to the
1157 * device tree below the cardbus bridge.
1158 * This is only necessary if there is a device that needs to allocate
1159 * resource below us. This can happen if there is another cardbus/PCMCIA
1160 * bridge downstream.
1161 */
1162 static uint32_t cardbus_min_spare_mem = 0;
1163 static uint32_t cardbus_min_spare_io = 0;
1164
1165 /*
1166 * The "dip" passed to this routine is assumed to be
1167 * the device at the attachment point. Currently it is
1168 * assumed to be a bridge.
1169 */
1170 static int
cardbus_allocate_chunk(dev_info_t * dip,uint8_t type,uint8_t sec_bus)1171 cardbus_allocate_chunk(dev_info_t *dip, uint8_t type, uint8_t sec_bus)
1172 {
1173 cardbus_phdl_t *phdl;
1174 ndi_ra_request_t *mem_request;
1175 ndi_ra_request_t *io_request;
1176 ra_return_t res;
1177 int count;
1178
1179 /*
1180 * This should not find an existing entry - so
1181 * it will create a new one.
1182 */
1183 phdl = cardbus_find_phdl(dip);
1184 ASSERT(phdl);
1185
1186 mem_request = &phdl->mem_req;
1187 io_request = &phdl->io_req;
1188
1189 /*
1190 * Set highest_bus here.
1191 * Otherwise if we don't find another bridge
1192 * this never gets set.
1193 */
1194 phdl->highest_bus = sec_bus;
1195
1196 /*
1197 * From this point in the tree - walk the devices,
1198 * The function passed in will read and "sum" up
1199 * the memory and I/O requirements and put them in
1200 * structure "phdl".
1201 */
1202 phdl->error = PCICFG_SUCCESS;
1203 ndi_devi_enter(dip, &count);
1204 ddi_walk_devs(ddi_get_child(dip), cardbus_sum_resources, (void *)phdl);
1205 ndi_devi_exit(dip, count);
1206
1207 if (phdl->error != PCICFG_SUCCESS) {
1208 cmn_err(CE_WARN, "Failure summing resources\n");
1209 return (phdl->error);
1210 }
1211
1212 /*
1213 * Call into the memory allocator with the request.
1214 * Record the addresses returned in the phdl
1215 */
1216 #ifdef _LP64
1217 cardbus_err(dip, 8,
1218 "AP requires [0x%lx] bytes of memory space, alligned 0x%x\n",
1219 mem_request->ra_len, phdl->memory_gran);
1220 cardbus_err(dip, 8,
1221 "AP requires [0x%lx] bytes of I/O space, alligned 0x%x\n",
1222 io_request->ra_len, phdl->io_gran);
1223 #else
1224 cardbus_err(dip, 8,
1225 "AP requires [0x%llx] bytes of memory space, alligned 0x%x\n",
1226 mem_request->ra_len, phdl->memory_gran);
1227 cardbus_err(dip, 8,
1228 "AP requires [0x%llx] bytes of I/O space, alligned 0x%x\n",
1229 io_request->ra_len, phdl->io_gran);
1230 #endif
1231
1232 ASSERT(type == PCI_HEADER_CARDBUS);
1233
1234 mem_request->ra_align_mask = phdl->memory_gran - 1;
1235 io_request->ra_align_mask = phdl->io_gran - 1;
1236 phdl->res_dip = (dev_info_t *)-1;
1237
1238 mem_request->ra_len += cardbus_min_spare_mem;
1239 if (mem_request->ra_len) {
1240 mem_request->ra_len = PCICFG_ROUND_UP(
1241 mem_request->ra_len,
1242 phdl->memory_gran);
1243 #ifdef _LP64
1244 cardbus_err(dip, 8,
1245 "cardbus_allocate_chunk: ndi_ra_alloc 0x%lx bytes\n",
1246 mem_request->ra_len);
1247 #else
1248 cardbus_err(dip, 8,
1249 "cardbus_allocate_chunk: ndi_ra_alloc 0x%llx bytes\n",
1250 mem_request->ra_len);
1251 #endif
1252
1253 if (pcmcia_alloc_mem(dip, mem_request, &res,
1254 &phdl->res_dip) != NDI_SUCCESS) {
1255 cmn_err(CE_WARN, "Failed to allocate memory for %s\n",
1256 ddi_driver_name(dip));
1257 return (PCICFG_FAILURE);
1258 }
1259
1260 phdl->memory_base = phdl->memory_last = res.ra_addr_lo;
1261 phdl->memory_len = res.ra_len;
1262 }
1263
1264 io_request->ra_len += cardbus_min_spare_io;
1265 if (io_request->ra_len) {
1266
1267 #if defined(__x86) || defined(__amd64)
1268 io_request->ra_boundbase = 0x1000;
1269 io_request->ra_boundlen = 0xefff;
1270 #else
1271 io_request->ra_boundbase = 0;
1272 io_request->ra_boundlen = PCICFG_4GIG_LIMIT;
1273 #endif
1274 io_request->ra_flags |= NDI_RA_ALLOC_BOUNDED;
1275 io_request->ra_len = PCICFG_ROUND_UP(io_request->ra_len,
1276 phdl->io_gran);
1277 io_request->ra_align_mask = max(PCICFG_IOGRAN,
1278 phdl->io_gran) - 1;
1279
1280 if (pcmcia_alloc_io(dip, io_request, &res,
1281 &phdl->res_dip) != NDI_SUCCESS) {
1282 cmn_err(CE_WARN, "Failed to allocate I/O space "
1283 "for %s\n", ddi_driver_name(dip));
1284 if (mem_request->ra_len) {
1285 res.ra_addr_lo = phdl->memory_base;
1286 res.ra_len = phdl->memory_len;
1287 (void) pcmcia_free_mem(phdl->res_dip, &res);
1288 phdl->memory_len = phdl->io_len = 0;
1289 }
1290 return (PCICFG_FAILURE);
1291 }
1292
1293 phdl->io_base = phdl->io_last = (uint32_t)res.ra_addr_lo;
1294 phdl->io_len = (uint32_t)res.ra_len;
1295 }
1296
1297 #ifdef _LP64
1298 cardbus_err(dip, 6,
1299 "MEMORY BASE = [0x%lx] length [0x%lx]\n",
1300 phdl->memory_base, phdl->memory_len);
1301 #else
1302 cardbus_err(dip, 6,
1303 "MEMORY BASE = [0x%llx] length [0x%llx]\n",
1304 phdl->memory_base, phdl->memory_len);
1305 #endif
1306 cardbus_err(dip, 6,
1307 "IO BASE = [0x%x] length [0x%x]\n",
1308 phdl->io_base, phdl->io_len);
1309
1310 return (PCICFG_SUCCESS);
1311 }
1312
1313 static int
cardbus_free_chunk(dev_info_t * dip)1314 cardbus_free_chunk(dev_info_t *dip)
1315 {
1316 uint_t *bus;
1317 int k;
1318
1319 cardbus_err(dip, 6, "cardbus_free_chunk\n");
1320
1321 (void) cardbus_destroy_phdl(dip);
1322
1323 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
1324 DDI_PROP_DONTPASS, "bus-range", (caddr_t)&bus,
1325 &k) != DDI_PROP_SUCCESS) {
1326 cardbus_err(dip, 1,
1327 "cardbus_free_chunk: Failed to read bus-range property\n");
1328 return (PCICFG_FAILURE);
1329 }
1330
1331 cardbus_err(dip, 6,
1332 "cardbus_free_chunk: Freeing bus [%d] range [%d]\n",
1333 bus[0], bus[1] - bus[0] + 1);
1334
1335 if (ndi_ra_free(dip,
1336 (uint64_t)bus[0], (uint64_t)(bus[1] - bus[0] + 1),
1337 NDI_RA_TYPE_PCI_BUSNUM, NDI_RA_PASS) != NDI_SUCCESS) {
1338 cardbus_err(dip, 1,
1339 "cardbus_free_chunk: Failed to free bus numbers\n");
1340
1341 kmem_free(bus, k);
1342 return (PCICFG_FAILURE);
1343 }
1344
1345 kmem_free(bus, k);
1346 return (PCICFG_SUCCESS);
1347 }
1348
1349 /*
1350 * Put bridge registers into initial state
1351 */
1352 static void
cardbus_setup_bridge(dev_info_t * dip,cardbus_phdl_t * entry,ddi_acc_handle_t handle)1353 cardbus_setup_bridge(dev_info_t *dip, cardbus_phdl_t *entry,
1354 ddi_acc_handle_t handle)
1355 {
1356 uint8_t header_type = pci_config_get8(handle, PCI_CONF_HEADER);
1357
1358 #ifdef _LP64
1359 cardbus_err(NULL, 6,
1360 "cardbus_setup_bridge: "
1361 "highest bus %d, mem_last 0x%lx, io_last 0x%x\n",
1362 entry->highest_bus, entry->memory_last, entry->io_last);
1363 #else
1364 cardbus_err(NULL, 6,
1365 "cardbus_setup_bridge: "
1366 "highest bus %d, mem_last 0x%llx, io_last 0x%x\n",
1367 entry->highest_bus, entry->memory_last, entry->io_last);
1368 #endif
1369
1370 if ((header_type & PCI_HEADER_TYPE_M) == PCI_HEADER_PPB) {
1371 uint32_t uval;
1372
1373 /*
1374 * The highest bus seen during probing is
1375 * the max-subordinate bus
1376 */
1377 pci_config_put8(handle, PCI_BCNF_SUBBUS, entry->highest_bus);
1378
1379 uval = PCICFG_ROUND_UP(entry->memory_last, PCICFG_MEMGRAN);
1380 if (uval != entry->memory_last) {
1381 #ifdef _LP64
1382 cardbus_err(dip, 8,
1383 "Adding [0x%lx] before bridge (mem)\n",
1384 uval - entry->memory_last);
1385 #else
1386 cardbus_err(dip, 8,
1387 "Adding [0x%llx] before bridge (mem)\n",
1388 uval - entry->memory_last);
1389 #endif
1390 (void) cardbus_get_mem(ddi_get_parent(dip), entry,
1391 uval - entry->memory_last, NULL);
1392 }
1393
1394 /*
1395 * Program the memory base register with the
1396 * start of the memory range
1397 */
1398 #ifdef _LP64
1399 cardbus_err(NULL, 8,
1400 "store 0x%x(0x%lx) in pci bridge memory base register\n",
1401 PCICFG_HIWORD(PCICFG_LOADDR(uval)),
1402 entry->memory_last);
1403 #else
1404 cardbus_err(NULL, 8,
1405 "store 0x%x(0x%llx) in pci bridge memory base register\n",
1406 PCICFG_HIWORD(PCICFG_LOADDR(uval)),
1407 entry->memory_last);
1408 #endif
1409 pci_config_put16(handle, PCI_BCNF_MEM_BASE,
1410 PCICFG_HIWORD(PCICFG_LOADDR(uval)));
1411
1412 uval = PCICFG_ROUND_UP(entry->io_last, PCICFG_IOGRAN);
1413 if (uval != entry->io_last) {
1414 cardbus_err(dip, 8,
1415 "Adding [0x%x] before bridge (I/O)\n",
1416 uval - entry->io_last);
1417 (void) cardbus_get_io(ddi_get_parent(dip), entry,
1418 uval - entry->io_last, NULL);
1419 }
1420 cardbus_err(NULL, 8,
1421 "store 0x%02x/0x%04x(0x%x) in "
1422 "pci bridge I/O hi/low base register\n",
1423 PCICFG_HIWORD(PCICFG_LOADDR(uval)),
1424 PCICFG_HIBYTE(PCICFG_LOWORD(PCICFG_LOADDR(uval))),
1425 entry->io_last);
1426 /*
1427 * Program the I/O base register with the start of the I/O range
1428 */
1429 pci_config_put8(handle, PCI_BCNF_IO_BASE_LOW,
1430 PCICFG_HIBYTE(PCICFG_LOWORD(PCICFG_LOADDR(uval))));
1431
1432 pci_config_put16(handle, PCI_BCNF_IO_BASE_HI,
1433 PCICFG_HIWORD(PCICFG_LOADDR(uval)));
1434
1435 /*
1436 * Clear status bits
1437 */
1438 pci_config_put16(handle, PCI_BCNF_SEC_STATUS, 0xffff);
1439
1440 /*
1441 * Turn off prefetchable range
1442 */
1443 pci_config_put32(handle, PCI_BCNF_PF_BASE_LOW, 0x0000ffff);
1444 pci_config_put32(handle, PCI_BCNF_PF_BASE_HIGH, 0xffffffff);
1445
1446 pci_config_put32(handle, PCI_BCNF_PF_LIMIT_HIGH, 0x0);
1447
1448 #ifdef sparc
1449 /*
1450 * If there is an interrupt pin set program
1451 * interrupt line with default values.
1452 */
1453 if (pci_config_get8(handle, PCI_CONF_IPIN)) {
1454 pci_config_put8(handle, PCI_CONF_ILINE, 0xf);
1455 }
1456 #else
1457 (void) cardbus_validate_iline(dip, handle);
1458 #endif
1459
1460
1461 } else if ((header_type & PCI_HEADER_TYPE_M) == PCI_HEADER_CARDBUS) {
1462
1463 /*
1464 * The highest bus seen during probing is
1465 * the max-subordinate bus
1466 */
1467 pci_config_put8(handle, PCI_CBUS_SUB_BUS_NO,
1468 entry->highest_bus);
1469
1470 /*
1471 * Program the memory base register with the
1472 * start of the memory range
1473 */
1474 #ifdef _LP64
1475 cardbus_err(NULL, 8,
1476 "store 0x%x(0x%lx) in "
1477 "cardbus memory base register 0, len 0x%lx\n",
1478 PCICFG_LOADDR(entry->memory_last), entry->memory_last,
1479 entry->memory_len);
1480 #else
1481 cardbus_err(NULL, 8,
1482 "store 0x%x(0x%llx) in "
1483 "cardbus memory base register 0, len 0x%llx\n",
1484 PCICFG_LOADDR(entry->memory_last), entry->memory_last,
1485 entry->memory_len);
1486 #endif
1487
1488 pci_config_put32(handle, PCI_CBUS_MEM_BASE0,
1489 PCICFG_LOADDR(entry->memory_last));
1490
1491 /*
1492 * Program the I/O base register with the start of the I/O range
1493 */
1494 cardbus_err(NULL, 8,
1495 "store 0x%x in cb IO base register 0 len 0x%x\n",
1496 PCICFG_LOADDR(entry->io_last),
1497 entry->io_len);
1498
1499 pci_config_put32(handle, PCI_CBUS_IO_BASE0,
1500 PCICFG_LOADDR(entry->io_last));
1501
1502 /*
1503 * Clear status bits
1504 */
1505 pci_config_put16(handle, PCI_CBUS_SEC_STATUS, 0xffff);
1506
1507 #ifdef sparc
1508 /*
1509 * If there is an interrupt pin set program
1510 * interrupt line with default values.
1511 */
1512 if (pci_config_get8(handle, PCI_CONF_IPIN)) {
1513 pci_config_put8(handle, PCI_CONF_ILINE, 0xf);
1514 }
1515 #else
1516 (void) cardbus_validate_iline(dip, handle);
1517 #endif
1518
1519
1520 /*
1521 * LATER: use these registers
1522 */
1523 pci_config_put32(handle, PCI_CBUS_MEM_BASE1, 0);
1524 pci_config_put32(handle, PCI_CBUS_MEM_LIMIT1, 0);
1525 pci_config_put32(handle, PCI_CBUS_IO_BASE1, 0);
1526 pci_config_put32(handle, PCI_CBUS_IO_LIMIT1, 0);
1527 } else {
1528 cmn_err(CE_WARN, "header type 0x%x, probably unknown bridge\n",
1529 header_type & PCI_HEADER_TYPE_M);
1530 }
1531
1532 cardbus_err(NULL, 7, "cardbus_setup_bridge complete\n");
1533 }
1534
1535 static void
cardbus_update_bridge(dev_info_t * dip,cardbus_phdl_t * entry,ddi_acc_handle_t handle)1536 cardbus_update_bridge(dev_info_t *dip, cardbus_phdl_t *entry,
1537 ddi_acc_handle_t handle)
1538 {
1539 uint_t length;
1540 uint16_t word16 = pci_config_get16(handle, PCI_CONF_COMM);
1541 const uint8_t header_type = pci_config_get8(handle, PCI_CONF_HEADER)
1542 & PCI_HEADER_TYPE_M;
1543 uint32_t bridge_gran;
1544 uint64_t rlval;
1545
1546 if (header_type == PCI_HEADER_CARDBUS)
1547 bridge_gran = CBCFG_MEMGRAN;
1548 else
1549 bridge_gran = PCICFG_MEMGRAN;
1550
1551 /*
1552 * Program the memory limit register with the end of the memory range
1553 */
1554 #ifdef _LP64
1555 cardbus_err(dip, 6,
1556 "cardbus_update_bridge: Mem base 0x%lx len 0x%lx "
1557 "last 0x%lx gran 0x%x gran end 0x%lx\n",
1558 entry->memory_base, entry->memory_len,
1559 entry->memory_last, entry->memory_gran,
1560 PCICFG_ROUND_UP(entry->memory_last, entry->memory_gran));
1561 #else
1562 cardbus_err(dip, 6,
1563 "cardbus_update_bridge: Mem base 0x%llx len 0x%llx "
1564 "last 0x%llx gran 0x%x gran end 0x%lx\n",
1565 entry->memory_base, entry->memory_len,
1566 entry->memory_last, entry->memory_gran,
1567 PCICFG_ROUND_UP(entry->memory_last, entry->memory_gran));
1568 #endif
1569 /*
1570 * Since this is a bridge, the rest of this range will
1571 * be responded to by the bridge. We have to round up
1572 * so no other device claims it.
1573 */
1574 length = PCICFG_ROUND_UP(entry->memory_last + cardbus_min_spare_mem,
1575 bridge_gran) - entry->memory_last;
1576
1577 if (length > 0) {
1578 /*
1579 * This is to allow space that isn't actually being used by
1580 * anything to be allocated by devices such as a downstream
1581 * PCMCIA controller.
1582 */
1583 (void) cardbus_get_mem(dip, entry, length, NULL);
1584 cardbus_err(dip, 8,
1585 "Added [0x%x] at the top of the bridge (mem)\n", length);
1586 }
1587
1588 if (entry->memory_len) {
1589 if (header_type == PCI_HEADER_CARDBUS) {
1590 rlval = PCICFG_ROUND_DOWN(entry->memory_last - 1,
1591 CBCFG_MEMGRAN);
1592 #ifdef _LP64
1593 cardbus_err(dip, 8,
1594 "store 0x%x(0x%lx) in memory limit register 0\n",
1595 PCICFG_LOADDR(rlval), rlval);
1596 #else
1597 cardbus_err(dip, 8,
1598 "store 0x%x(0x%llx) in memory limit register 0\n",
1599 PCICFG_LOADDR(rlval), rlval);
1600 #endif
1601 pci_config_put32(handle, PCI_CBUS_MEM_LIMIT0,
1602 PCICFG_LOADDR(rlval));
1603 } else {
1604 rlval = PCICFG_ROUND_DOWN(entry->memory_last - 1,
1605 PCICFG_MEMGRAN);
1606 #ifdef _LP64
1607 cardbus_err(dip, 8,
1608 "store 0x%x(0x%lx) in memory limit register\n",
1609 PCICFG_HIWORD(PCICFG_LOADDR(rlval)),
1610 rlval);
1611 #else
1612 cardbus_err(dip, 8,
1613 "store 0x%x(0x%llx) in memory limit register\n",
1614 PCICFG_HIWORD(PCICFG_LOADDR(rlval)),
1615 rlval);
1616 #endif
1617 pci_config_put16(handle, PCI_BCNF_MEM_LIMIT,
1618 PCICFG_HIWORD(PCICFG_LOADDR(rlval)));
1619 }
1620 word16 |= PCI_COMM_MAE;
1621 }
1622
1623 cardbus_err(dip, 6,
1624 "cardbus_update_bridge: I/O base 0x%x len 0x%x last 0x%x "
1625 "gran 0x%x gran_end 0x%lx\n",
1626 entry->io_base, entry->io_len, entry->io_last, entry->io_gran,
1627 PCICFG_ROUND_UP(entry->io_last, entry->io_gran));
1628
1629 if (header_type == PCI_HEADER_CARDBUS)
1630 bridge_gran = CBCFG_IOGRAN;
1631 else
1632 bridge_gran = PCICFG_IOGRAN;
1633
1634 /*
1635 * Same as above for I/O space. Since this is a
1636 * bridge, the rest of this range will be responded
1637 * to by the bridge. We have to round up so no
1638 * other device claims it.
1639 */
1640 length = PCICFG_ROUND_UP(entry->io_last + cardbus_min_spare_io,
1641 bridge_gran) - entry->io_last;
1642 if (length > 0) {
1643 (void) cardbus_get_io(dip, entry, length, NULL);
1644 cardbus_err(dip, 8,
1645 "Added [0x%x] at the top of the bridge (I/O)\n", length);
1646 }
1647
1648 /*
1649 * Program the I/O limit register with the end of the I/O range
1650 */
1651 if (entry->io_len) {
1652 if (header_type == PCI_HEADER_CARDBUS) {
1653 rlval = PCICFG_ROUND_DOWN(entry->io_last - 1,
1654 CBCFG_IOGRAN);
1655 #ifdef _LP64
1656 cardbus_err(dip, 8,
1657 "store 0x%lx in IO limit register 0\n", rlval);
1658 #else
1659 cardbus_err(dip, 8,
1660 "store 0x%llx in IO limit register 0\n", rlval);
1661 #endif
1662 pci_config_put32(handle, PCI_CBUS_IO_LIMIT0, rlval);
1663 } else {
1664 rlval = PCICFG_ROUND_DOWN(entry->io_last - 1,
1665 PCICFG_IOGRAN);
1666 #ifdef _LP64
1667 cardbus_err(dip, 8,
1668 "store 0x%x/0x%x(0x%lx) in "
1669 "IO limit low/hi register\n",
1670 PCICFG_HIBYTE(PCICFG_LOWORD(PCICFG_LOADDR(rlval))),
1671 PCICFG_HIWORD(PCICFG_LOADDR(rlval)),
1672 rlval);
1673 #else
1674 cardbus_err(dip, 8,
1675 "store 0x%x/0x%x(0x%llx) in "
1676 "IO limit low/hi register\n",
1677 PCICFG_HIBYTE(PCICFG_LOWORD(PCICFG_LOADDR(rlval))),
1678 PCICFG_HIWORD(PCICFG_LOADDR(rlval)),
1679 rlval);
1680 #endif
1681
1682 pci_config_put8(handle, PCI_BCNF_IO_LIMIT_LOW,
1683 PCICFG_HIBYTE(PCICFG_LOWORD(PCICFG_LOADDR(rlval))));
1684 pci_config_put16(handle, PCI_BCNF_IO_LIMIT_HI,
1685 PCICFG_HIWORD(PCICFG_LOADDR(rlval)));
1686 }
1687 word16 |= PCI_COMM_IO;
1688 }
1689
1690 pci_config_put16(handle, PCI_CONF_COMM, word16);
1691 }
1692
1693 static void
cardbus_get_mem(dev_info_t * dip,cardbus_phdl_t * entry,uint32_t length,uint64_t * ans)1694 cardbus_get_mem(dev_info_t *dip, cardbus_phdl_t *entry,
1695 uint32_t length, uint64_t *ans)
1696 {
1697 uint32_t hole;
1698
1699 #ifdef _LP64
1700 cardbus_err(NULL, 6,
1701 "cardbus_get_mem: memory_last 0x%lx, length 0x%x, "
1702 "memory_base 0x%lx, memory_len 0x%lx ans=0x%p\n",
1703 entry->memory_last, length,
1704 entry->memory_base, entry->memory_len, (void *) ans);
1705 #else
1706 cardbus_err(NULL, 6,
1707 "cardbus_get_mem: memory_last 0x%llx, length 0x%x, "
1708 "memory_base 0x%llx, memory_len 0x%llx ans=0x%p\n",
1709 entry->memory_last, length,
1710 entry->memory_base, entry->memory_len, (void *) ans);
1711 #endif
1712
1713 if (ans) {
1714 /*
1715 * Round up the request to the "size" boundary
1716 */
1717 hole = PCICFG_ROUND_UP(entry->memory_last, length)
1718 - entry->memory_last;
1719 if (hole != 0) {
1720 (void) cardbus_update_available_prop(dip,
1721 PCI_ADDR_MEM32,
1722 entry->memory_last,
1723 (uint64_t)hole);
1724 entry->memory_last += hole;
1725
1726 #ifdef _LP64
1727 cardbus_err(NULL, 6,
1728 "cardbus_get_mem: "
1729 "rounded memory_last up by 0x%x to 0x%lx, ",
1730 hole, entry->memory_last);
1731 #else
1732 cardbus_err(NULL, 6,
1733 "cardbus_get_mem: "
1734 "rounded memory_last up by 0x%x to 0x%llx, ",
1735 hole, entry->memory_last);
1736 #endif
1737 }
1738 } else
1739 (void) cardbus_update_available_prop(dip, PCI_ADDR_MEM32,
1740 entry->memory_last,
1741 (uint64_t)length);
1742
1743 /*
1744 * These routines should parcel out the memory
1745 * completely. There should never be a case of
1746 * over running the bounds.
1747 */
1748 if ((entry->memory_last + length) >
1749 (entry->memory_base + entry->memory_len))
1750 #ifdef _LP64
1751 cardbus_err(NULL, 1,
1752 "cardbus_get_mem: assert will fail %ld <= %ld,"
1753 "(0x%lx + 0x%x) <= (0x%lx + 0x%lx)\n",
1754 #else
1755 cardbus_err(NULL, 1,
1756 "cardbus_get_mem: assert will fail %lld <= %lld, "
1757 "(0x%llx + 0x%x) <= (0x%llx + 0x%llx)\n",
1758 #endif
1759 entry->memory_last + length,
1760 entry->memory_base + entry->memory_len,
1761 entry->memory_last,
1762 length,
1763 entry->memory_base,
1764 entry->memory_len);
1765
1766 ASSERT((entry->memory_last + length) <=
1767 (entry->memory_base + entry->memory_len));
1768 /*
1769 * If ans is NULL don't return anything,
1770 * they are just asking to reserve the memory.
1771 */
1772 if (ans != NULL)
1773 *ans = entry->memory_last;
1774
1775 /*
1776 * Increment to the next location
1777 */
1778 entry->memory_last += length;
1779 }
1780
1781 static void
cardbus_get_io(dev_info_t * dip,cardbus_phdl_t * entry,uint32_t length,uint32_t * ans)1782 cardbus_get_io(dev_info_t *dip, cardbus_phdl_t *entry,
1783 uint32_t length, uint32_t *ans)
1784 {
1785 uint32_t hole;
1786
1787 cardbus_err(NULL, 6,
1788 "cardbus_get_io: io_last 0x%x, length 0x%x, "
1789 "io_base 0x%x, io_len 0x%x ans=0x%p\n",
1790 entry->io_last, length,
1791 entry->io_base, entry->io_len, (void *) ans);
1792
1793 if (ans) {
1794 /*
1795 * Round up the request to the "size" boundary
1796 */
1797 hole = PCICFG_ROUND_UP(entry->io_last, length) - entry->io_last;
1798 if (hole != 0) {
1799 (void) cardbus_update_available_prop(dip, PCI_ADDR_IO,
1800 (uint64_t)entry->io_last,
1801 (uint64_t)hole);
1802 entry->io_last += hole;
1803
1804 cardbus_err(NULL, 6,
1805 "cardbus_get_io: "
1806 "rounded io_last up by 0x%x to 0x%x, ",
1807 hole, entry->io_last);
1808 }
1809 } else
1810 (void) cardbus_update_available_prop(dip, PCI_ADDR_IO,
1811 (uint64_t)entry->io_last,
1812 (uint64_t)length);
1813 /*
1814 * These routines should parcel out the memory
1815 * completely. There should never be a case of
1816 * over running the bounds.
1817 */
1818 ASSERT((entry->io_last + length) <=
1819 (entry->io_base + entry->io_len));
1820
1821 /*
1822 * If ans is NULL don't return anything,
1823 * they are just asking to reserve the memory.
1824 */
1825 if (ans != NULL)
1826 *ans = entry->io_last;
1827
1828 /*
1829 * Increment to the next location
1830 */
1831 entry->io_last += length;
1832 }
1833
1834 static int
cardbus_sum_resources(dev_info_t * dip,void * hdl)1835 cardbus_sum_resources(dev_info_t *dip, void *hdl)
1836 {
1837 cardbus_phdl_t *entry = (cardbus_phdl_t *)hdl;
1838 pci_regspec_t *pci_rp;
1839 int length;
1840 int rcount;
1841 int i, ret;
1842 ndi_ra_request_t *mem_request;
1843 ndi_ra_request_t *io_request;
1844 uint8_t header_type, base_class;
1845 ddi_acc_handle_t handle;
1846
1847 /*
1848 * Ignore the attachment point and pcs.
1849 */
1850 if (strcmp(ddi_binding_name(dip), "hp_attachment") == 0 ||
1851 strcmp(ddi_binding_name(dip), "pcs") == 0) {
1852 cardbus_err(dip, 8, "cardbus_sum_resources: Ignoring\n");
1853 return (DDI_WALK_CONTINUE);
1854 }
1855
1856 mem_request = &entry->mem_req;
1857 io_request = &entry->io_req;
1858
1859 if (cardbus_config_setup(dip, &handle) != DDI_SUCCESS) {
1860 cardbus_err(dip, 1,
1861 "cardbus_sum_resources: Failed to map config space!\n");
1862 entry->error = PCICFG_FAILURE;
1863 return (DDI_WALK_TERMINATE);
1864 }
1865
1866 ret = DDI_WALK_CONTINUE;
1867 header_type = pci_config_get8(handle, PCI_CONF_HEADER);
1868 base_class = pci_config_get8(handle, PCI_CONF_BASCLASS);
1869
1870 /*
1871 * If its a bridge - just record the highest bus seen
1872 */
1873 if (base_class == PCI_CLASS_BRIDGE) {
1874 uint8_t sub_class;
1875
1876 sub_class = pci_config_get8(handle, PCI_CONF_SUBCLASS);
1877
1878 switch (sub_class) {
1879 case PCI_BRIDGE_PCI:
1880 if ((header_type & PCI_HEADER_TYPE_M)
1881 == PCI_HEADER_PPB) {
1882
1883 if (entry->highest_bus < pci_config_get8(handle,
1884 PCI_BCNF_SECBUS)) {
1885 entry->highest_bus = pci_config_get8(
1886 handle, PCI_BCNF_SECBUS);
1887 }
1888
1889 (void) cardbus_config_teardown(&handle);
1890 #if defined(CARDBUS_DEBUG)
1891 if (mem_request->ra_len !=
1892 PCICFG_ROUND_UP(mem_request->ra_len,
1893 PCICFG_MEMGRAN)) {
1894
1895 #ifdef _LP64
1896 cardbus_err(dip, 8,
1897 "Pre-align [0x%lx] to PCI bridge "
1898 "memory gran "
1899 "[0x%lx] -> [0x%lx]\n",
1900 PCICFG_ROUND_UP(mem_request->ra_len,
1901 PCICFG_MEMGRAN) -
1902 mem_request->ra_len,
1903 mem_request->ra_len,
1904 PCICFG_ROUND_UP(mem_request->ra_len,
1905 PCICFG_MEMGRAN));
1906 #else
1907 cardbus_err(dip, 8,
1908 "Pre-align [0x%llx] to PCI bridge "
1909 "memory gran "
1910 "[0x%llx] -> [0x%lx]\n",
1911 PCICFG_ROUND_UP(mem_request->ra_len,
1912 PCICFG_MEMGRAN) -
1913 mem_request->ra_len,
1914 mem_request->ra_len,
1915 PCICFG_ROUND_UP(mem_request->ra_len,
1916 PCICFG_MEMGRAN));
1917 #endif
1918 }
1919
1920 if (io_request->ra_len !=
1921 PCICFG_ROUND_UP(io_request->ra_len,
1922 PCICFG_IOGRAN)) {
1923
1924 #ifdef _LP64
1925 cardbus_err(dip, 8,
1926 "Pre-align [0x%lx] to PCI bridge "
1927 "I/O gran "
1928 "[0x%lx] -> [0x%lx]\n",
1929 PCICFG_ROUND_UP(io_request->ra_len,
1930 PCICFG_IOGRAN) -
1931 io_request->ra_len,
1932 io_request->ra_len,
1933 PCICFG_ROUND_UP(io_request->ra_len,
1934 PCICFG_IOGRAN));
1935 #else
1936 cardbus_err(dip, 8,
1937 "Pre-align [0x%llx] to PCI bridge "
1938 "I/O gran "
1939 "[0x%llx] -> [0x%lx]\n",
1940 PCICFG_ROUND_UP(io_request->ra_len,
1941 PCICFG_IOGRAN) -
1942 io_request->ra_len,
1943 io_request->ra_len,
1944 PCICFG_ROUND_UP(io_request->ra_len,
1945 PCICFG_IOGRAN));
1946 #endif
1947 }
1948
1949 #endif
1950 mem_request->ra_len = PCICFG_ROUND_UP(
1951 mem_request->ra_len,
1952 PCICFG_MEMGRAN);
1953 io_request->ra_len = PCICFG_ROUND_UP(
1954 io_request->ra_len,
1955 PCICFG_IOGRAN);
1956 if (entry->memory_gran < PCICFG_MEMGRAN)
1957 entry->memory_gran = PCICFG_MEMGRAN;
1958 if (entry->io_gran < PCICFG_IOGRAN)
1959 entry->io_gran = PCICFG_IOGRAN;
1960 ddi_walk_devs(ddi_get_child(dip),
1961 cardbus_sum_resources,
1962 (void *)entry);
1963 #if defined(CARDBUS_DEBUG)
1964 if (mem_request->ra_len !=
1965 PCICFG_ROUND_UP(mem_request->ra_len +
1966 cardbus_min_spare_mem, PCICFG_MEMGRAN)) {
1967
1968 #ifdef _LP64
1969 cardbus_err(dip, 8,
1970 "Post-align [0x%lx] to PCI bridge "
1971 "memory gran "
1972 "[0x%lx] -> [0x%lx]\n",
1973 PCICFG_ROUND_UP(
1974 mem_request->ra_len +
1975 cardbus_min_spare_mem,
1976 PCICFG_MEMGRAN) -
1977 mem_request->ra_len,
1978 mem_request->ra_len,
1979 PCICFG_ROUND_UP(mem_request->ra_len
1980 + cardbus_min_spare_mem,
1981 PCICFG_MEMGRAN));
1982 #else
1983 cardbus_err(dip, 8,
1984 "Post-align [0x%llx] to PCI bridge "
1985 "memory gran "
1986 "[0x%llx] -> [0x%lx]\n",
1987 PCICFG_ROUND_UP(
1988 mem_request->ra_len +
1989 cardbus_min_spare_mem,
1990 PCICFG_MEMGRAN) -
1991 mem_request->ra_len,
1992 mem_request->ra_len,
1993 PCICFG_ROUND_UP(mem_request->ra_len
1994 + cardbus_min_spare_mem,
1995 PCICFG_MEMGRAN));
1996 #endif
1997 }
1998
1999 if (io_request->ra_len !=
2000 PCICFG_ROUND_UP(io_request->ra_len +
2001 cardbus_min_spare_io,
2002 PCICFG_IOGRAN)) {
2003
2004 #ifdef _LP64
2005 cardbus_err(dip, 8,
2006 "Post-align [0x%lx] to PCI bridge "
2007 "I/O gran "
2008 "[0x%lx] -> [0x%lx]\n",
2009 PCICFG_ROUND_UP(io_request->ra_len +
2010 cardbus_min_spare_io,
2011 PCICFG_IOGRAN) -
2012 io_request->ra_len,
2013 io_request->ra_len,
2014 PCICFG_ROUND_UP(io_request->ra_len +
2015 cardbus_min_spare_io,
2016 PCICFG_IOGRAN));
2017 #else
2018 cardbus_err(dip, 8,
2019 "Post-align [0x%llx] to PCI bridge "
2020 "I/O gran "
2021 "[0x%llx] -> [0x%lx]\n",
2022 PCICFG_ROUND_UP(io_request->ra_len +
2023 cardbus_min_spare_io,
2024 PCICFG_IOGRAN) -
2025 io_request->ra_len,
2026 io_request->ra_len,
2027 PCICFG_ROUND_UP(io_request->ra_len +
2028 cardbus_min_spare_io,
2029 PCICFG_IOGRAN));
2030 #endif
2031 }
2032 #endif
2033 mem_request->ra_len = PCICFG_ROUND_UP(
2034 mem_request->ra_len +
2035 cardbus_min_spare_mem,
2036 PCICFG_MEMGRAN);
2037 io_request->ra_len = PCICFG_ROUND_UP(
2038 io_request->ra_len +
2039 cardbus_min_spare_io,
2040 PCICFG_IOGRAN);
2041 }
2042 return (DDI_WALK_PRUNECHILD);
2043
2044 case PCI_BRIDGE_CARDBUS:
2045 /*
2046 * Cardbus has I/O registers.
2047 */
2048 break;
2049
2050 case PCI_BRIDGE_ISA:
2051 /*
2052 * All the registers requirements for ISA
2053 * are stored in the reg structure of the bridge.
2054 * Children of ISA are not of type PCI
2055 * so must not come through here because
2056 * cardbus_config_setup() will fail.
2057 */
2058 ret = DDI_WALK_PRUNECHILD;
2059 break;
2060
2061 default:
2062 /*
2063 * Treat other bridges as leaf nodes.
2064 */
2065 break;
2066 }
2067 }
2068
2069 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
2070 DDI_PROP_DONTPASS, "reg", (caddr_t)&pci_rp,
2071 &length) != DDI_PROP_SUCCESS) {
2072 /*
2073 * If one node in (the subtree of nodes)
2074 * does'nt have a "reg" property fail the
2075 * allocation.
2076 */
2077 entry->memory_len = 0;
2078 entry->io_len = 0;
2079 entry->error = PCICFG_FAILURE;
2080 (void) cardbus_config_teardown(&handle);
2081 return (DDI_WALK_TERMINATE);
2082 }
2083
2084 /*
2085 * For each "reg" property with a length, add that to the
2086 * total memory (or I/O) to allocate.
2087 */
2088 rcount = length / sizeof (pci_regspec_t);
2089
2090 for (i = 0; i < rcount; i++) {
2091
2092 switch (PCI_REG_ADDR_G(pci_rp[i].pci_phys_hi)) {
2093
2094 case PCI_REG_ADDR_G(PCI_ADDR_MEM32):
2095 mem_request->ra_len =
2096 pci_rp[i].pci_size_low +
2097 PCICFG_ROUND_UP(mem_request->ra_len,
2098 pci_rp[i].pci_size_low);
2099
2100 cardbus_err(dip, 8,
2101 "ADDING 32 --->0x%x for BAR@0x%x\n",
2102 pci_rp[i].pci_size_low,
2103 PCI_REG_REG_G(pci_rp[i].pci_phys_hi));
2104 /*
2105 * the granualarity needs to be the larger of
2106 * the maximum amount of memory that we're going to
2107 * ask for, and the PCI-PCI bridge granularity (1M)
2108 */
2109 if (pci_rp[i].pci_size_low > entry->memory_gran)
2110 entry->memory_gran = pci_rp[i].pci_size_low;
2111 break;
2112
2113 case PCI_REG_ADDR_G(PCI_ADDR_MEM64):
2114 mem_request->ra_len =
2115 pci_rp[i].pci_size_low +
2116 PCICFG_ROUND_UP(mem_request->ra_len,
2117 pci_rp[i].pci_size_low);
2118 cardbus_err(dip, 8,
2119 "ADDING 64 --->0x%x for BAR@0x%x\n",
2120 pci_rp[i].pci_size_low,
2121 PCI_REG_REG_G(pci_rp[i].pci_phys_hi));
2122
2123 if (pci_rp[i].pci_size_low > entry->memory_gran)
2124 entry->memory_gran = pci_rp[i].pci_size_low;
2125 break;
2126
2127 case PCI_REG_ADDR_G(PCI_ADDR_IO):
2128 io_request->ra_len =
2129 pci_rp[i].pci_size_low +
2130 PCICFG_ROUND_UP(io_request->ra_len,
2131 pci_rp[i].pci_size_low);
2132 cardbus_err(dip, 8,
2133 "ADDING I/O --->0x%x for BAR@0x%x\n",
2134 pci_rp[i].pci_size_low,
2135 PCI_REG_REG_G(pci_rp[i].pci_phys_hi));
2136
2137 if (pci_rp[i].pci_size_low > entry->io_gran)
2138 entry->io_gran = pci_rp[i].pci_size_low;
2139 break;
2140
2141 default:
2142 /* Config space register - not included */
2143 break;
2144 }
2145 }
2146
2147 /*
2148 * free the memory allocated by ddi_getlongprop
2149 */
2150 kmem_free(pci_rp, length);
2151
2152 /*
2153 * continue the walk to the next sibling to sum memory
2154 */
2155
2156 (void) cardbus_config_teardown(&handle);
2157
2158 #ifdef _LP64
2159 cardbus_err(dip, 8,
2160 "Memory 0x%lx bytes, I/O 0x%lx bytes, "
2161 "Memgran 0x%x, IOgran 0x%x\n",
2162 mem_request->ra_len, io_request->ra_len,
2163 entry->memory_gran, entry->io_gran);
2164 #else
2165 cardbus_err(dip, 8,
2166 "Memory 0x%llx bytes, I/O 0x%llx bytes, "
2167 "Memgran 0x%x, IOgran 0x%x\n",
2168 mem_request->ra_len, io_request->ra_len,
2169 entry->memory_gran, entry->io_gran);
2170 #endif
2171
2172 return (ret);
2173 }
2174
2175 /*
2176 * Free resources allocated to a bridge.
2177 * Note that this routine does not call ndi_ra_free() to actually
2178 * free memory/IO/Bus. This is done as a single chunk for the entire
2179 * device tree in cardbus_free_chunk().
2180 */
2181 static int
cardbus_free_bridge_resources(dev_info_t * dip)2182 cardbus_free_bridge_resources(dev_info_t *dip)
2183 {
2184 cardbus_range_t *ranges;
2185 uint_t *bus;
2186 int k;
2187 int length;
2188 int i;
2189
2190 cardbus_err(dip, 6, "cardbus_free_bridge_resources\n");
2191
2192 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
2193 DDI_PROP_DONTPASS, "ranges", (caddr_t)&ranges,
2194 &length) == DDI_PROP_SUCCESS) {
2195 for (i = 0; i < length / sizeof (cardbus_range_t); i++) {
2196 if (ranges[i].size_lo != 0 || ranges[i].size_hi != 0) {
2197 switch (ranges[i].parent_hi & PCI_REG_ADDR_M) {
2198 case PCI_ADDR_IO:
2199 cardbus_err(dip, 6,
2200 "Need to Free I/O "
2201 "base/length = [0x%x]/[0x%x]\n",
2202 ranges[i].child_lo,
2203 ranges[i].size_lo);
2204 break;
2205
2206 case PCI_ADDR_MEM32:
2207 case PCI_ADDR_MEM64:
2208 cardbus_err(dip, 6,
2209 "Need to Free Memory base/length = "
2210 "[0x%x.%x]/[0x%x]\n",
2211 ranges[i].child_mid,
2212 ranges[i].child_lo,
2213 ranges[i].size_lo);
2214 break;
2215
2216 default:
2217 cardbus_err(dip, 6,
2218 "Unknown memory space\n");
2219 break;
2220 }
2221 }
2222 }
2223
2224 kmem_free(ranges, length);
2225 (void) ndi_prop_remove(DDI_DEV_T_NONE, dip, "ranges");
2226 } else {
2227 cardbus_err(dip, 8,
2228 "cardbus_free_bridge_resources: Failed"
2229 "to read ranges property\n");
2230 }
2231
2232 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
2233 DDI_PROP_DONTPASS, "bus-range", (caddr_t)&bus,
2234 &k) != DDI_PROP_SUCCESS) {
2235 cardbus_err(dip, 6, "Failed to read bus-range property\n");
2236 return (PCICFG_FAILURE);
2237 }
2238
2239 cardbus_err(dip, 6,
2240 "Need to free bus [%d] range [%d]\n",
2241 bus[0], bus[1] - bus[0] + 1);
2242 kmem_free(bus, k);
2243 (void) ndi_prop_remove(DDI_DEV_T_NONE, dip, "available");
2244 (void) ndi_prop_remove(DDI_DEV_T_NONE, dip, "bus-range");
2245
2246 return (PCICFG_SUCCESS);
2247 }
2248
2249 static int
cardbus_free_device_resources(dev_info_t * dip)2250 cardbus_free_device_resources(dev_info_t *dip)
2251 {
2252 pci_regspec_t *assigned;
2253
2254 int length;
2255 int acount;
2256 int i;
2257
2258 if (ddi_getlongprop(DDI_DEV_T_ANY, dip,
2259 DDI_PROP_DONTPASS, "assigned-addresses",
2260 (caddr_t)&assigned,
2261 &length) != DDI_PROP_SUCCESS) {
2262 cardbus_err(dip, 1,
2263 "Failed to read assigned-addresses property\n");
2264 return (PCICFG_FAILURE);
2265 }
2266
2267 /*
2268 * For each "assigned-addresses" property entry with a length,
2269 * call the memory allocation routines to return the
2270 * resource.
2271 */
2272 acount = length / sizeof (pci_regspec_t);
2273 for (i = 0; i < acount; i++) {
2274
2275 /*
2276 * Free the resource if the size of it is not zero.
2277 */
2278 if ((assigned[i].pci_size_low != 0)||
2279 (assigned[i].pci_size_hi != 0)) {
2280 switch (PCI_REG_ADDR_G(assigned[i].pci_phys_hi)) {
2281 case PCI_REG_ADDR_G(PCI_ADDR_MEM32):
2282 cardbus_err(dip, 6,
2283 "Need to return 0x%x of 32 bit MEM space"
2284 " @ 0x%x from register 0x%x\n",
2285 assigned[i].pci_size_low,
2286 assigned[i].pci_phys_low,
2287 PCI_REG_REG_G(assigned[i].pci_phys_hi));
2288
2289 break;
2290
2291 case PCI_REG_ADDR_G(PCI_ADDR_MEM64):
2292 cardbus_err(dip, 6,
2293 "Need to return 0x%x of 64 bit MEM space"
2294 " @ 0x%x.%x from register 0x%x\n",
2295 assigned[i].pci_size_low,
2296 assigned[i].pci_phys_mid,
2297 assigned[i].pci_phys_low,
2298 PCI_REG_REG_G(assigned[i].pci_phys_hi));
2299
2300 break;
2301
2302 case PCI_REG_ADDR_G(PCI_ADDR_IO):
2303 cardbus_err(dip, 6,
2304 "Need to return 0x%x of IO space @ 0x%x"
2305 " from register 0x%x\n",
2306 assigned[i].pci_size_low,
2307 assigned[i].pci_phys_low,
2308 PCI_REG_REG_G(assigned[i].pci_phys_hi));
2309 break;
2310
2311 default:
2312 cardbus_err(dip, 1, "Unknown register type\n");
2313 kmem_free(assigned, length);
2314 return (PCICFG_FAILURE);
2315 } /* switch */
2316 }
2317 }
2318 kmem_free(assigned, length);
2319 return (PCICFG_SUCCESS);
2320 }
2321
2322 static int
cardbus_free_resources(dev_info_t * dip)2323 cardbus_free_resources(dev_info_t *dip)
2324 {
2325 uint32_t classcode;
2326
2327 classcode = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
2328 "class-code", -1);
2329 /*
2330 * A different algorithim is used for bridges and leaf devices.
2331 */
2332 if (classcode != -1) {
2333 classcode = ((uint_t)classcode & 0xffff00) >> 8;
2334 if (classcode == 0x604 || classcode == 0x607) {
2335 if (cardbus_free_bridge_resources(dip)
2336 != PCICFG_SUCCESS) {
2337 cardbus_err(dip, 1,
2338 "Failed freeing up bridge resources\n");
2339 return (PCICFG_FAILURE);
2340 }
2341 return (PCICFG_SUCCESS);
2342 }
2343 }
2344
2345 if (cardbus_free_device_resources(dip) != PCICFG_SUCCESS) {
2346 cardbus_err(dip, 1, "Failed freeing up device resources\n");
2347 return (PCICFG_FAILURE);
2348 }
2349 return (PCICFG_SUCCESS);
2350 }
2351
2352 static int
cardbus_probe_bridge(cbus_t * cbp,dev_info_t * attpt,uint_t bus,uint_t device,uint_t func)2353 cardbus_probe_bridge(cbus_t *cbp, dev_info_t *attpt, uint_t bus,
2354 uint_t device, uint_t func)
2355 {
2356 /* Declairations */
2357 cardbus_bus_range_t *bus_range;
2358 int i, j;
2359 uint8_t header_type;
2360 ddi_acc_handle_t config_handle;
2361 ndi_ra_request_t req;
2362 uint_t new_bus;
2363 uint64_t blen;
2364 uint64_t next_bus;
2365 int circ;
2366
2367 cardbus_err(cbp->cb_dip, 6,
2368 "cardbus_probe_bridge bus %d device %d func %d\n",
2369 bus, device, func);
2370
2371 ndi_devi_enter(cbp->cb_dip, &circ);
2372 if (pci_config_setup(cbp->cb_dip, &config_handle) != DDI_SUCCESS) {
2373
2374 cardbus_err(cbp->cb_dip, 1,
2375 "cardbus_probe_bridge(): Failed to setup config space\n");
2376
2377 ndi_devi_exit(cbp->cb_dip, circ);
2378 return (PCICFG_FAILURE);
2379 }
2380
2381 header_type = pci_config_get8(config_handle, PCI_CONF_HEADER);
2382
2383 /*
2384 * As soon as we have access to config space, check device
2385 * is a bridge.
2386 */
2387 if ((header_type & PCI_HEADER_TYPE_M) != PCI_HEADER_CARDBUS)
2388 goto failed;
2389
2390 cardbus_err(cbp->cb_dip, 8,
2391 "---Vendor ID = [0x%04x]\n",
2392 pci_config_get16(config_handle, PCI_CONF_VENID));
2393 cardbus_err(cbp->cb_dip, 8,
2394 "---Device ID = [0x%04x]\n",
2395 pci_config_get16(config_handle, PCI_CONF_DEVID));
2396
2397 /* say what type of header */
2398 cardbus_err(cbp->cb_dip, 8,
2399 "--%s bridge found root bus [0x%x] device [0x%x] func [0x%x]\n",
2400 ((header_type & PCI_HEADER_TYPE_M) == PCI_HEADER_PPB) ?
2401 "PCI-PCI" : "Cardbus",
2402 bus, device, func);
2403
2404 if (ddi_getlongprop(DDI_DEV_T_ANY, cbp->cb_dip, 0, "bus-range",
2405 (caddr_t)&bus_range, &i) != DDI_PROP_SUCCESS)
2406 cardbus_err(cbp->cb_dip, 1,
2407 "No bus-range property seems to have been set up\n");
2408 else {
2409 cardbus_err(cbp->cb_dip, 8,
2410 "allowable bus range is %u->%u\n",
2411 bus_range->lo, bus_range->hi);
2412 kmem_free((caddr_t)bus_range, i);
2413 }
2414
2415 /*
2416 * Get next bus in sequence and program device.
2417 */
2418 bzero((caddr_t)&req, sizeof (ndi_ra_request_t));
2419 req.ra_len = 1;
2420
2421 if (ndi_ra_alloc(cbp->cb_dip, &req,
2422 &next_bus, &blen, NDI_RA_TYPE_PCI_BUSNUM,
2423 NDI_RA_PASS) != NDI_SUCCESS) {
2424 cmn_err(CE_WARN, "Failed to get a bus number\n");
2425 goto failed;
2426 }
2427
2428 new_bus = next_bus;
2429 cardbus_err(cbp->cb_dip, 8,
2430 "NEW bus found [%u]->[%u]\n", bus, new_bus);
2431
2432 (void) cardbus_set_bus_numbers(config_handle, bus, new_bus);
2433
2434 /* Enable it all */
2435 enable_cardbus_bridge(cbp->cb_dip, config_handle);
2436
2437 /*
2438 * Probe all children devices
2439 */
2440 for (i = 0; i < pcicfg_max_device; i++)
2441 for (j = 0; j < pcicfg_max_function; j++)
2442 switch (cardbus_probe_children(cbp, attpt, new_bus, i,
2443 j, &header_type)) {
2444
2445 case PCICFG_FAILURE:
2446 cardbus_err(cbp->cb_dip, 1,
2447 "Failed to configure bus "
2448 "[0x%x] device [0x%x] func [0x%x]\n",
2449 new_bus, i, j);
2450 disable_cardbus_bridge(cbp->cb_dip,
2451 config_handle);
2452 goto failed;
2453
2454 case PCICFG_NODEVICE:
2455 /*
2456 * if there's no function 0
2457 * there's no point in probing other
2458 * functions
2459 */
2460 if (j != 0)
2461 break;
2462 /* FALLTHROUGH */
2463 case PCICFG_NOMULTI:
2464 j = pcicfg_max_function;
2465 break;
2466
2467 default:
2468 break;
2469 }
2470
2471 (void) pci_config_teardown(&config_handle);
2472 (void) i_ndi_config_node(attpt, DS_LINKED, 0);
2473 ndi_devi_exit(cbp->cb_dip, circ);
2474
2475 return (PCICFG_SUCCESS);
2476
2477 failed:
2478 (void) pci_config_teardown(&config_handle);
2479 ndi_devi_exit(cbp->cb_dip, circ);
2480
2481 return (PCICFG_FAILURE);
2482 }
2483
2484 static struct isa_node isa_nodes[] = {
2485 {"dummy", {NULL, NULL, NULL, NULL, NULL}, "serial", "", 0x4e, 0x2}
2486 };
2487
2488 static int
cardbus_probe_children(cbus_t * cbp,dev_info_t * parent,uint_t bus,uint_t device,uint_t func,uint8_t * header_type)2489 cardbus_probe_children(cbus_t *cbp, dev_info_t *parent, uint_t bus,
2490 uint_t device, uint_t func, uint8_t *header_type)
2491 {
2492 dev_info_t *new_child;
2493 ddi_acc_handle_t config_handle;
2494 int i, j;
2495 ndi_ra_request_t req;
2496 uint64_t next_bus;
2497 uint64_t blen;
2498 uint32_t request;
2499 uint8_t base_class;
2500 uint_t new_bus;
2501 int ret;
2502 int circ;
2503
2504 cardbus_err(parent, 6,
2505 "cardbus_probe_children bus %d device %d func %d\n",
2506 bus, device, func);
2507
2508 /*
2509 * This node will be put immediately below
2510 * "parent". Allocate a blank device node. It will either
2511 * be filled in or freed up based on further probing.
2512 */
2513
2514 ndi_devi_enter(parent, &circ);
2515
2516 if (ndi_devi_alloc(parent, DEVI_PSEUDO_NEXNAME,
2517 (pnode_t)DEVI_SID_NODEID,
2518 &new_child) != NDI_SUCCESS) {
2519 cardbus_err(parent, 1,
2520 "cardbus_probe_children(): Failed to alloc child node\n");
2521 ndi_devi_exit(parent, circ);
2522 return (PCICFG_FAILURE);
2523 }
2524
2525 if (cardbus_add_config_reg(new_child, bus,
2526 device, func) != DDI_SUCCESS) {
2527 cardbus_err(parent, 1,
2528 "cardbus_probe_children(): Failed to add candidate REG\n");
2529 goto failedconfig;
2530 }
2531
2532 if ((ret = cardbus_config_setup(new_child, &config_handle))
2533 != PCICFG_SUCCESS) {
2534
2535 if (ret == PCICFG_NODEVICE) {
2536 (void) ndi_devi_free(new_child);
2537 return (ret);
2538 }
2539 cardbus_err(parent, 1,
2540 "cardbus_probe_children(): Failed to setup config space\n");
2541
2542 goto failedconfig;
2543 }
2544
2545 base_class = pci_config_get8(config_handle, PCI_CONF_BASCLASS);
2546
2547 if (func == 0) {
2548 /*
2549 * Preserve the header type from function 0.
2550 * Additional functions may not preserve the PCI_HEADER_MULTI
2551 * bit.
2552 */
2553 *header_type = pci_config_get8(config_handle, PCI_CONF_HEADER);
2554 } else if (!(*header_type & PCI_HEADER_MULTI) ||
2555 ((*header_type & PCI_HEADER_TYPE_M) == PCI_HEADER_PPB) ||
2556 (base_class == PCI_CLASS_BRIDGE)) {
2557
2558 (void) cardbus_config_teardown(&config_handle);
2559 (void) ndi_devi_free(new_child);
2560 return (PCICFG_NOMULTI);
2561 }
2562
2563 /*
2564 * As soon as we have access to config space,
2565 * turn off device. It will get turned on
2566 * later (after memory is assigned).
2567 * not if it's a cardbus device. It may be OK to leave
2568 * it on - try LATER
2569 */
2570 disable_cardbus_device(config_handle);
2571
2572 /*
2573 * Set 1275 properties common to all devices
2574 */
2575 if (cardbus_set_standard_props(parent, new_child,
2576 config_handle) != PCICFG_SUCCESS) {
2577 cardbus_err(parent, 1, "Failed to set standard properties\n");
2578 goto failedchild;
2579 }
2580
2581 /*
2582 * Child node properties NOTE: Both for PCI-PCI bridge and child node
2583 */
2584 if (cardbus_set_childnode_props(new_child,
2585 config_handle) != PCICFG_SUCCESS) {
2586 goto failedchild;
2587 }
2588
2589 cardbus_err(parent, 8,
2590 "---Vendor ID = [0x%04x]\n",
2591 pci_config_get16(config_handle, PCI_CONF_VENID));
2592 cardbus_err(parent, 8,
2593 "---Device ID = [0x%04x]\n",
2594 pci_config_get16(config_handle, PCI_CONF_DEVID));
2595
2596 if (base_class == PCI_CLASS_BRIDGE) {
2597 uint8_t sub_class;
2598
2599 sub_class = pci_config_get8(config_handle, PCI_CONF_SUBCLASS);
2600
2601 switch (sub_class) {
2602 case PCI_BRIDGE_PCI:
2603 if ((*header_type & PCI_HEADER_TYPE_M)
2604 == PCI_HEADER_PPB) {
2605 cardbus_bus_range_t *bus_range;
2606 int k;
2607
2608 /* say what type of header */
2609 cardbus_err(parent, 8,
2610 "-- Found PCI-PCI bridge @ "
2611 " bus [0x%x] device [0x%x] func [0x%x]\n",
2612 bus, device, func);
2613
2614 if (ddi_getlongprop(DDI_DEV_T_ANY,
2615 new_child, 0, "bus-range",
2616 (caddr_t)&bus_range,
2617 &k) != DDI_PROP_SUCCESS)
2618 cardbus_err(new_child, 1,
2619 "No bus-range property"
2620 " seems to have been set up\n");
2621 else {
2622 cardbus_err(new_child, 8,
2623 "allowable bus range is %u->%u\n",
2624 bus_range->lo, bus_range->hi);
2625 kmem_free((caddr_t)bus_range, k);
2626 }
2627
2628 /*
2629 * Get next bus in sequence and program device.
2630 */
2631 bzero((caddr_t)&req, sizeof (ndi_ra_request_t));
2632 req.ra_len = 1;
2633
2634 if (ndi_ra_alloc(new_child, &req,
2635 &next_bus, &blen,
2636 NDI_RA_TYPE_PCI_BUSNUM,
2637 NDI_RA_PASS) != NDI_SUCCESS) {
2638 cmn_err(CE_WARN,
2639 "Failed to get a bus number\n");
2640 goto failedchild;
2641 }
2642
2643 new_bus = next_bus;
2644
2645 cardbus_err(new_child, 8,
2646 "NEW bus found [%u]->[%u]\n", bus, new_bus);
2647
2648 /* Enable it all */
2649 enable_pci_pci_bridge(new_child, config_handle);
2650 (void) cardbus_set_bus_numbers(config_handle,
2651 bus, new_bus);
2652
2653 #if defined(CARDBUS_DEBUG)
2654 if (cardbus_debug >= 9) {
2655 cardbus_dump_config(config_handle);
2656 }
2657 #endif
2658
2659 /*
2660 * Set bus properties
2661 */
2662 if (cardbus_set_busnode_props(new_child)
2663 != PCICFG_SUCCESS) {
2664 cardbus_err(new_child, 1,
2665 "Failed to set busnode props\n");
2666 disable_pci_pci_bridge(new_child,
2667 config_handle);
2668 goto failedchild;
2669 }
2670
2671 /*
2672 * Probe all children devices
2673 */
2674 for (i = 0; i < pcicfg_max_device; i++)
2675 for (j = 0; j < pcicfg_max_function;
2676 j++)
2677 switch (cardbus_probe_children(
2678 cbp,
2679 new_child,
2680 new_bus, i,
2681 j, header_type)) {
2682 case PCICFG_FAILURE:
2683 cardbus_err(parent, 1,
2684 "Failed to "
2685 "configure "
2686 "bus [0x%x] "
2687 "device [0x%x] "
2688 "func [0x%x]\n",
2689 new_bus, i, j);
2690 disable_pci_pci_bridge(
2691 new_child,
2692 config_handle);
2693 goto failedchild;
2694
2695 case PCICFG_NODEVICE:
2696 /*
2697 * if there's no
2698 * function 0
2699 * there's no point in
2700 * probing other
2701 * functions
2702 */
2703 if (j != 0)
2704 break;
2705 /* FALLTHROUGH */
2706 case PCICFG_NOMULTI:
2707 j = pcicfg_max_function;
2708 break;
2709
2710 default:
2711 break;
2712 }
2713 }
2714 break;
2715
2716 case PCI_BRIDGE_CARDBUS:
2717 cardbus_err(parent, 8,
2718 "--Found Cardbus bridge @ "
2719 "bus [0x%x] device [0x%x] func [0x%x]\n",
2720 bus, device, func);
2721 pci_config_put32(config_handle,
2722 PCI_CONF_BASE0, 0xffffffff);
2723
2724 request = pci_config_get32(config_handle,
2725 PCI_CONF_BASE0);
2726
2727 /*
2728 * If its a zero length, don't do
2729 * any programming.
2730 */
2731 if (request != 0) {
2732 if (request == (uint32_t)0xffffffff) {
2733 cmn_err(CE_WARN,
2734 "cardbus_probe_children: "
2735 "can't access device");
2736 goto failedchild;
2737 }
2738 /*
2739 * Add to the "reg" property
2740 */
2741 if (cardbus_update_reg_prop(new_child,
2742 request,
2743 PCI_CONF_BASE0) != PCICFG_SUCCESS) {
2744 goto failedchild;
2745 }
2746 cardbus_err(parent, 8,
2747 "BASE register [0x%x] asks for "
2748 "[0x%x]=[0x%x](32)\n",
2749 PCI_CONF_BASE0, request,
2750 (~(PCI_BASE_M_ADDR_M & request))+1);
2751 }
2752 break;
2753
2754 case PCI_BRIDGE_ISA:
2755 cardbus_err(parent, 8,
2756 "--Found ISA bridge @ "
2757 "bus [0x%x] device [0x%x] func [0x%x]\n",
2758 bus, device, func);
2759 enable_pci_isa_bridge(new_child, config_handle);
2760
2761 #if defined(CARDBUS_DEBUG)
2762 if (cardbus_debug >= 4) {
2763 cardbus_dump_common_config(config_handle);
2764 cardbus_err(NULL, 1,
2765 " DDMA SlvCh0 = [0x%04x] "
2766 "DDMA SlvCh1 = [0x%04x]\n",
2767 pci_config_get16(config_handle, 0x40),
2768 pci_config_get16(config_handle, 0x42));
2769 cardbus_err(NULL, 1,
2770 " DDMA SlvCh2 = [0x%04x] "
2771 "DDMA SlvCh3 = [0x%04x]\n",
2772 pci_config_get16(config_handle, 0x44),
2773 pci_config_get16(config_handle, 0x46));
2774 cardbus_err(NULL, 1,
2775 " DDMA SlvCh5 = [0x%04x] "
2776 "DDMA SlvCh6 = [0x%04x]\n",
2777 pci_config_get16(config_handle, 0x4a),
2778 pci_config_get16(config_handle, 0x4c));
2779 cardbus_err(NULL, 1,
2780 " DDMA SlvCh7 = [0x%04x] "
2781 "Misc Cntrl = [0x%02x]\n",
2782 pci_config_get16(config_handle, 0x4e),
2783 pci_config_get8(config_handle, 0x57));
2784 cardbus_err(NULL, 1,
2785 " DMA Cntl = [0x%02x] "
2786 "DMA TyF Tim = [0x%02x]\n",
2787 pci_config_get8(config_handle, 0x48),
2788 pci_config_get8(config_handle, 0x49));
2789 cardbus_err(NULL, 1,
2790 " TimCntrl = [0x%02x] "
2791 "MTOP = [0x%02x]\n",
2792 pci_config_get8(config_handle, 0x50),
2793 pci_config_get8(config_handle, 0x51));
2794 cardbus_err(NULL, 1,
2795 " MDMA Access = [0x%02x] "
2796 "ROMCS = [0x%02x]\n",
2797 pci_config_get8(config_handle, 0x52),
2798 pci_config_get8(config_handle, 0x53));
2799 cardbus_err(NULL, 1,
2800 " Dscrd Tmr = [0x%02x] "
2801 "Retry Tmr = [0x%02x]\n",
2802 pci_config_get8(config_handle, 0x55),
2803 pci_config_get8(config_handle, 0x54));
2804 cardbus_err(NULL, 1,
2805 " I/O Spc 0 = [0x%08x] "
2806 "I/O Spc 1 = [0x%08x]\n",
2807 pci_config_get32(config_handle, 0x58),
2808 pci_config_get32(config_handle, 0x5c));
2809 cardbus_err(NULL, 1,
2810 " I/O Spc 2 = [0x%08x] "
2811 "I/O Spc 3 = [0x%08x]\n",
2812 pci_config_get32(config_handle, 0x60),
2813 pci_config_get32(config_handle, 0x64));
2814 cardbus_err(NULL, 1,
2815 " I/O Spc 4 = [0x%08x] "
2816 "I/O Spc 5 = [0x%08x]\n",
2817 pci_config_get32(config_handle, 0x68),
2818 pci_config_get32(config_handle, 0x6c));
2819 cardbus_err(NULL, 1,
2820 " Mem Spc 0 = [0x%08x] "
2821 "Mem Spc 1 = [0x%08x]\n",
2822 pci_config_get32(config_handle, 0x70),
2823 pci_config_get32(config_handle, 0x74));
2824 cardbus_err(NULL, 1,
2825 " Mem Spc 2 = [0x%08x] "
2826 "Mem Spc 3 = [0x%08x]\n",
2827 pci_config_get32(config_handle, 0x78),
2828 pci_config_get32(config_handle, 0x7c));
2829 }
2830 #endif
2831 /*
2832 * Set bus properties
2833 */
2834 if (cardbus_set_busnode_isaprops(new_child)
2835 != PCICFG_SUCCESS) {
2836 cardbus_err(new_child, 1,
2837 "Failed to set busnode props\n");
2838 disable_cardbus_device(config_handle);
2839 goto failedchild;
2840 }
2841
2842 /*
2843 * Add to the "reg" property.
2844 * Simply grab 1K of I/O space.
2845 */
2846 if (cardbus_update_reg_prop(new_child,
2847 0xfffffc00 | PCI_BASE_SPACE_IO,
2848 PCI_CONF_BASE0) != PCICFG_SUCCESS) {
2849 goto failedchild;
2850 }
2851
2852 /*
2853 * Probe all potential children devices.
2854 */
2855 for (i = 0;
2856 i < sizeof (isa_nodes) / sizeof (isa_nodes[0]);
2857 i++)
2858 switch (cardbus_add_isa_node(cbp, new_child,
2859 &isa_nodes[i])) {
2860 case PCICFG_FAILURE:
2861 cardbus_err(parent, 1,
2862 "Failed to configure isa bus\n");
2863 disable_cardbus_device(config_handle);
2864 goto failedchild;
2865
2866 case PCICFG_NODEVICE:
2867 continue;
2868 }
2869
2870 break;
2871
2872 case PCI_BRIDGE_OTHER:
2873 default:
2874 cardbus_err(parent, 8,
2875 "--Found unknown bridge, subclass 0x%x @ "
2876 "bus [0x%x] device [0x%x] func [0x%x]\n",
2877 sub_class, bus, device, func);
2878 goto leaf_node;
2879 }
2880 } else {
2881 cardbus_err(parent, 8,
2882 "--Leaf device found "
2883 "bus [0x%x] device [0x%x] func [0x%x]\n",
2884 bus, device, func);
2885 /*
2886 * Ethernet devices.
2887 */
2888 if (strcmp(ddi_binding_name(new_child), "ethernet") == 0) {
2889 extern int localetheraddr(struct ether_addr *,
2890 struct ether_addr *);
2891 uchar_t mac[6];
2892
2893 cardbus_force_stringprop(new_child,
2894 "device_type", "network");
2895
2896 if (localetheraddr(NULL, (struct ether_addr *)mac)) {
2897 (void) ddi_prop_create(DDI_DEV_T_NONE,
2898 new_child,
2899 DDI_PROP_CANSLEEP, "local-mac-address",
2900 (caddr_t)mac, 6);
2901 }
2902 }
2903 leaf_node:
2904 if (cbp->cb_dsp) {
2905 struct cb_deviceset_props *cdsp = cbp->cb_dsp;
2906 uint16_t venid = pci_config_get16(config_handle,
2907 PCI_CONF_VENID);
2908 uint16_t devid = pci_config_get16(config_handle,
2909 PCI_CONF_DEVID);
2910 ddi_prop_t *propp;
2911
2912 for (cdsp = cbp->cb_dsp; cdsp; cdsp = cdsp->next) {
2913 if (cdsp->binding_name &&
2914 strcmp(ddi_binding_name(new_child),
2915 cdsp->binding_name))
2916 continue;
2917 if (cdsp->venid && (cdsp->venid != venid))
2918 continue;
2919 if (cdsp->devid && (cdsp->devid != devid))
2920 continue;
2921 if (cdsp->nodename) {
2922 if (ndi_devi_set_nodename(new_child,
2923 cdsp->nodename,
2924 0) != NDI_SUCCESS)
2925 cardbus_err(new_child, 1,
2926 "Failed to set nodename\n");
2927 }
2928 for (propp = cdsp->prop_list; propp;
2929 propp = propp->prop_next) {
2930 switch (propp->prop_flags) {
2931 case DDI_PROP_TYPE_INT:
2932 cardbus_force_intprop(
2933 new_child,
2934 propp->prop_name,
2935 (int *)propp->prop_val,
2936 propp->prop_len);
2937 break;
2938 case DDI_PROP_TYPE_STRING:
2939 cardbus_force_stringprop(
2940 new_child,
2941 propp->prop_name,
2942 (char *)propp->prop_val);
2943 break;
2944 case DDI_PROP_TYPE_ANY:
2945 cardbus_force_boolprop(
2946 new_child,
2947 propp->prop_name);
2948 break;
2949 }
2950 }
2951 }
2952 }
2953
2954 #if defined(CARDBUS_DEBUG)
2955 if (cardbus_debug >= 9) {
2956 cardbus_dump_config(config_handle);
2957 }
2958 #endif
2959
2960 i = PCI_CONF_BASE0;
2961
2962 while (i <= PCI_CONF_BASE5) {
2963 pci_config_put32(config_handle, i, 0xffffffff);
2964
2965 request = pci_config_get32(config_handle, i);
2966
2967 /*
2968 * If its a zero length, don't do
2969 * any programming.
2970 */
2971 if (request != 0) {
2972 if (request == (uint32_t)0xffffffff) {
2973 cmn_err(CE_WARN,
2974 "cardbus_probe_children: "
2975 "can't access device");
2976 goto failedchild;
2977 }
2978 /*
2979 * Add to the "reg" property
2980 */
2981 if (cardbus_update_reg_prop(new_child,
2982 request, i) != PCICFG_SUCCESS) {
2983 goto failedchild;
2984 }
2985 } else {
2986 cardbus_err(parent, 8, "All memory found\n");
2987 break;
2988 }
2989
2990 /*
2991 * Increment by eight if it is 64 bit address space
2992 * only if memory space
2993 */
2994 if (((PCI_BASE_TYPE_M & request)
2995 == PCI_BASE_TYPE_ALL) &&
2996 ((PCI_BASE_SPACE_M & request)
2997 == PCI_BASE_SPACE_MEM)) {
2998 cardbus_err(parent, 8,
2999 "BASE register [0x%x] asks for "
3000 "[0x%x]=[0x%x] (64)\n",
3001 i, request,
3002 (~(PCI_BASE_M_ADDR_M & request))+1);
3003 i += 8;
3004 } else {
3005 cardbus_err(parent, 8,
3006 "BASE register [0x%x] asks for "
3007 "[0x%x]=[0x%x](32)\n",
3008 i, request,
3009 (~(PCI_BASE_M_ADDR_M & request))+1);
3010 i += 4;
3011 }
3012 }
3013
3014 /*
3015 * Get the ROM size and create register for it
3016 */
3017 pci_config_put32(config_handle, PCI_CONF_ROM, 0xffffffff);
3018
3019 request = pci_config_get32(config_handle, PCI_CONF_ROM);
3020 /*
3021 * If its a zero length, don't do
3022 * any programming.
3023 */
3024
3025 if (request != 0) {
3026 cardbus_err(parent, 9,
3027 "BASE register [0x%x] asks for "
3028 "[0x%x]=[0x%x] (ROM)\n",
3029 PCI_CONF_ROM, request,
3030 (~(PCI_BASE_ROM_ADDR_M & request))+1);
3031 /*
3032 * Add to the "reg" property
3033 */
3034 if (cardbus_update_reg_prop(new_child,
3035 request,
3036 PCI_CONF_ROM) != PCICFG_SUCCESS) {
3037 goto failedchild;
3038 }
3039 }
3040 }
3041
3042 (void) cardbus_config_teardown(&config_handle);
3043
3044 /*
3045 * Attach the child to its parent
3046 */
3047 (void) i_ndi_config_node(new_child, DS_LINKED, 0);
3048 ndi_devi_exit(parent, circ);
3049
3050 return (PCICFG_SUCCESS);
3051 failedchild:
3052 /*
3053 * check if it should be taken offline (if online)
3054 */
3055 (void) cardbus_config_teardown(&config_handle);
3056
3057 failedconfig:
3058
3059 (void) ndi_devi_free(new_child);
3060 ndi_devi_exit(parent, circ);
3061
3062 return (PCICFG_FAILURE);
3063 }
3064
3065 static int
cardbus_add_config_reg(dev_info_t * dip,uint_t bus,uint_t device,uint_t func)3066 cardbus_add_config_reg(dev_info_t *dip,
3067 uint_t bus, uint_t device, uint_t func)
3068 {
3069 int reg[10] = { PCI_ADDR_CONFIG, 0, 0, 0, 0};
3070
3071 reg[0] = PCICFG_MAKE_REG_HIGH(bus, device, func, 0);
3072
3073 return (ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
3074 "reg", reg, 5));
3075 }
3076
3077 static int
cardbus_add_isa_node(cbus_t * cbp,dev_info_t * parent,struct isa_node * node)3078 cardbus_add_isa_node(cbus_t *cbp, dev_info_t *parent, struct isa_node *node)
3079 {
3080 dev_info_t *new_child;
3081 int ret;
3082 uint32_t reg[3];
3083
3084 _NOTE(ARGUNUSED(cbp))
3085
3086 cardbus_err(parent, 6, "cardbus_add_isa_node\n");
3087
3088 /*
3089 * This node will be put immediately below
3090 * "parent". Allocate a blank device node.
3091 */
3092 if (ndi_devi_alloc(parent, DEVI_PSEUDO_NEXNAME,
3093 (pnode_t)DEVI_SID_NODEID,
3094 &new_child) != NDI_SUCCESS) {
3095 cardbus_err(parent, 1,
3096 "cardbus_add_isa_child(): Failed to alloc child node\n");
3097 return (PCICFG_FAILURE);
3098 }
3099
3100 /*
3101 * Set properties common to ISA devices
3102 */
3103 if (cardbus_set_isa_props(parent, new_child, node->name,
3104 node->compatible) != PCICFG_SUCCESS) {
3105 cardbus_err(parent, 1, "Failed to set ISA properties\n");
3106 goto failed;
3107 }
3108
3109 cardbus_err(new_child, 8, "--Leaf ISA device\n");
3110
3111 /*
3112 * Add the "reg" property.
3113 */
3114 reg[0] = 0;
3115 reg[1] = node->reg;
3116 reg[2] = node->span;
3117
3118 ret = ndi_prop_update_int_array(DDI_DEV_T_NONE, new_child,
3119 "basereg", (int *)reg, 3);
3120 if (ret != DDI_SUCCESS)
3121 goto failed;
3122
3123 (void) i_ndi_config_node(new_child, DS_LINKED, 0);
3124
3125 return (PCICFG_SUCCESS);
3126
3127 failed:
3128 (void) ndi_devi_free(new_child);
3129
3130 return (PCICFG_FAILURE);
3131 }
3132
3133 static int
cardbus_config_setup(dev_info_t * dip,ddi_acc_handle_t * handle)3134 cardbus_config_setup(dev_info_t *dip, ddi_acc_handle_t *handle)
3135 {
3136 caddr_t cfgaddr;
3137 ddi_device_acc_attr_t attr;
3138 dev_info_t *anode;
3139 int status;
3140 int rlen;
3141 pci_regspec_t *reg;
3142 int ret;
3143 #ifdef sparc
3144 int16_t val;
3145 #endif
3146
3147 cardbus_err(dip, 10,
3148 "cardbus_config_setup(dip=0x%p)\n", (void *) dip);
3149
3150 /*
3151 * Get the pci register spec from the node
3152 */
3153 status = ddi_getlongprop(DDI_DEV_T_NONE,
3154 dip, DDI_PROP_DONTPASS, "reg",
3155 (caddr_t)®, &rlen);
3156
3157 cardbus_err(dip, 10,
3158 "cardbus_config_setup, reg = 0x%p\n", (void *) reg);
3159
3160 switch (status) {
3161 case DDI_PROP_SUCCESS:
3162 break;
3163 case DDI_PROP_NO_MEMORY:
3164 cardbus_err(dip, 1, "reg present, but unable to get memory\n");
3165 return (PCICFG_FAILURE);
3166 default:
3167 cardbus_err(dip, 1, "no reg property\n");
3168 return (PCICFG_FAILURE);
3169 }
3170
3171 anode = dip;
3172
3173 /*
3174 * Find the attachment point node
3175 */
3176 while ((anode != NULL) && (strcmp(ddi_binding_name(anode),
3177 "hp_attachment") != 0)) {
3178 anode = ddi_get_parent(anode);
3179 }
3180
3181 if (anode == NULL) {
3182 cardbus_err(dip, 1, "Tree not in PROBE state\n");
3183 kmem_free((caddr_t)reg, rlen);
3184 return (PCICFG_FAILURE);
3185 }
3186
3187 if ((ret = ndi_prop_update_int_array(DDI_DEV_T_NONE, anode,
3188 "reg", (int *)reg, 5)) != 0) {
3189 cardbus_err(dip, 1,
3190 "Failed to update reg property, error code %d\n", ret);
3191 kmem_free((caddr_t)reg, rlen);
3192 return (PCICFG_FAILURE);
3193 }
3194
3195 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0;
3196 attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC;
3197 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC;
3198
3199 if (ddi_regs_map_setup(anode, 0, &cfgaddr,
3200 0, /* PCI_CONF_HDR_SIZE */
3201 0,
3202 &attr, handle) != DDI_SUCCESS) {
3203 cardbus_err(dip, 1,
3204 "Failed to setup registers for [0x%x][0x%x][0x%x]\n",
3205 PCI_REG_BUS_G(reg->pci_phys_hi),
3206 PCI_REG_DEV_G(reg->pci_phys_hi),
3207 PCI_REG_FUNC_G(reg->pci_phys_hi));
3208 kmem_free((caddr_t)reg, rlen);
3209 return (PCICFG_FAILURE);
3210 }
3211
3212 cardbus_err(dip, 9,
3213 "PROBING =>->->->->->-> [0x%x][0x%x][0x%x] 0x%x 0x%p\n",
3214 PCI_REG_BUS_G(reg->pci_phys_hi),
3215 PCI_REG_DEV_G(reg->pci_phys_hi),
3216 PCI_REG_FUNC_G(reg->pci_phys_hi),
3217 reg->pci_phys_hi, (void *) cfgaddr);
3218
3219 /*
3220 * must do peek16 otherwise the system crashes when probing
3221 * a non zero function on a non-multi-function card.
3222 */
3223 #ifdef sparc
3224 if (ddi_peek16(anode, (int16_t *)cfgaddr, &val) != DDI_SUCCESS) {
3225 cardbus_err(dip, 8,
3226 "cardbus_config_setup peek failed\n");
3227 ret = PCICFG_NODEVICE;
3228 } else if (ddi_get16(*handle, (uint16_t *)cfgaddr) == 0xffff) {
3229 cardbus_err(dip, 8,
3230 "cardbus_config_setup PCICFG_NODEVICE\n");
3231 ret = PCICFG_NODEVICE;
3232 #elif defined(__x86) || defined(__amd64)
3233 if (ddi_get16(*handle, (uint16_t *)cfgaddr) == 0xffff) {
3234 cardbus_err(dip, 8,
3235 "cardbus_config_setup PCICFG_NODEVICE\n");
3236 ret = PCICFG_NODEVICE;
3237 #endif
3238 } else {
3239 cardbus_err(dip, 1,
3240 "cardbus_config_setup found device at:[0x%x][0x%x][0x%x]\n",
3241 PCI_REG_BUS_G(reg->pci_phys_hi),
3242 PCI_REG_DEV_G(reg->pci_phys_hi),
3243 PCI_REG_FUNC_G(reg->pci_phys_hi));
3244
3245 ret = PCICFG_SUCCESS;
3246 }
3247
3248 kmem_free((caddr_t)reg, rlen);
3249 if (ret != PCICFG_SUCCESS) {
3250 cardbus_config_teardown(handle);
3251 }
3252
3253 cardbus_err(dip, 7,
3254 "cardbus_config_setup returning %d\n", ret);
3255
3256 return (ret);
3257 }
3258
3259 static void
3260 cardbus_config_teardown(ddi_acc_handle_t *handle)
3261 {
3262 (void) ddi_regs_map_free(handle);
3263 }
3264
3265 static void
3266 cardbus_reparent_children(dev_info_t *dip, dev_info_t *parent)
3267 {
3268 dev_info_t *child;
3269 int circ;
3270
3271 while (child = ddi_get_child(dip)) {
3272 ASSERT(i_ddi_node_state(child) <= DS_LINKED);
3273 /*
3274 * Unlink node from tree before reparenting
3275 */
3276 ndi_devi_enter(dip, &circ);
3277 (void) i_ndi_unconfig_node(child, DS_PROTO, 0);
3278 ndi_devi_exit(dip, circ);
3279 DEVI(child)->devi_parent = DEVI(parent);
3280 DEVI(child)->devi_bus_ctl = DEVI(parent);
3281 ndi_devi_enter(parent, &circ);
3282 (void) i_ndi_config_node(child, DS_LINKED, 0);
3283 ndi_devi_exit(parent, circ);
3284 }
3285 }
3286
3287 static int
3288 cardbus_update_assigned_prop(dev_info_t *dip, pci_regspec_t *newone)
3289 {
3290 int alen;
3291 pci_regspec_t *assigned;
3292 caddr_t newreg;
3293 uint_t status;
3294
3295 status = ddi_getlongprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS,
3296 "assigned-addresses", (caddr_t)&assigned, &alen);
3297 switch (status) {
3298 case DDI_PROP_SUCCESS:
3299 cardbus_err(dip, 5,
3300 "cardbus_update_assigned_prop: found prop len %d\n",
3301 alen);
3302 /*
3303 * Allocate memory for the existing
3304 * assigned-addresses(s) plus one and then
3305 * build it.
3306 */
3307 newreg = kmem_zalloc(alen+sizeof (*newone), KM_SLEEP);
3308
3309 bcopy(assigned, newreg, alen);
3310 bcopy(newone, newreg + alen, sizeof (*newone));
3311 break;
3312
3313 case DDI_PROP_NO_MEMORY:
3314 cardbus_err(dip, 1,
3315 "no memory for assigned-addresses property\n");
3316 return (PCICFG_FAILURE);
3317
3318 default:
3319 cardbus_err(dip, 5,
3320 "cardbus_update_assigned_prop: creating prop\n");
3321 alen = 0;
3322 newreg = (caddr_t)newone;
3323 break;
3324 }
3325
3326 /*
3327 * Write out the new "assigned-addresses" spec
3328 */
3329 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
3330 "assigned-addresses", (int *)newreg,
3331 (alen + sizeof (*newone))/sizeof (int));
3332
3333 if (status == DDI_PROP_SUCCESS)
3334 kmem_free((caddr_t)newreg, alen+sizeof (*newone));
3335
3336 if (alen)
3337 kmem_free(assigned, alen);
3338
3339 return (PCICFG_SUCCESS);
3340 }
3341
3342 static int
3343 cardbus_update_available_prop(dev_info_t *dip, uint32_t hi_type,
3344 uint64_t base, uint64_t size)
3345 {
3346 int alen, rlen;
3347 pci_regspec_t *available, *reg;
3348 pci_regspec_t addition;
3349 caddr_t newreg;
3350 uint_t status;
3351
3352 cardbus_err(dip, 6, "cardbus_update_available_prop\n");
3353
3354 status = ddi_getlongprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS,
3355 "reg", (caddr_t)®, &rlen);
3356
3357 switch (status) {
3358 case DDI_PROP_SUCCESS:
3359 break;
3360 case DDI_PROP_NO_MEMORY:
3361 cardbus_err(dip, 1, "reg present, but unable to get memory\n");
3362 return (PCICFG_FAILURE);
3363 default:
3364 cardbus_err(dip, 1, "no reg property\n");
3365 return (PCICFG_FAILURE);
3366 }
3367
3368 status = ddi_getlongprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS,
3369 "available", (caddr_t)&available, &alen);
3370 switch (status) {
3371 case DDI_PROP_SUCCESS:
3372 break;
3373 case DDI_PROP_NO_MEMORY:
3374 cardbus_err(dip, 1, "no memory for available property\n");
3375 kmem_free((caddr_t)reg, rlen);
3376 return (PCICFG_FAILURE);
3377 default:
3378 alen = 0;
3379 }
3380
3381 /*
3382 * Allocate memory for the existing
3383 * available(s) plus one and then
3384 * build it.
3385 */
3386 newreg = kmem_zalloc(alen + sizeof (pci_regspec_t), KM_SLEEP);
3387
3388 /*
3389 * Build the regspec, then add it to the existing one(s)
3390 */
3391 addition.pci_phys_hi = hi_type |
3392 PCICFG_MAKE_REG_HIGH(PCI_REG_BUS_G(reg->pci_phys_hi),
3393 PCI_REG_DEV_G(reg->pci_phys_hi),
3394 PCI_REG_FUNC_G(reg->pci_phys_hi), 0);
3395
3396 addition.pci_phys_mid = (uint32_t)((base>>32) & 0xffffffff);
3397 addition.pci_phys_low = (uint32_t)(base & 0xffffffff);
3398 addition.pci_size_hi = (uint32_t)((size>>32) & 0xffffffff);
3399 addition.pci_size_low = (uint32_t)(size & 0xffffffff);
3400
3401 #ifdef DEBUG
3402 cardbus_dump_reg(dip, &addition, 1);
3403 #endif
3404
3405 if (alen)
3406 bcopy(available, newreg, alen);
3407 bcopy(&addition, newreg + alen, sizeof (pci_regspec_t));
3408
3409 /*
3410 * Write out the new "available" spec
3411 */
3412 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
3413 "available", (int *)newreg,
3414 (alen + sizeof (pci_regspec_t))/sizeof (int));
3415
3416 if (alen)
3417 kmem_free((caddr_t)available, alen);
3418 kmem_free((caddr_t)reg, rlen);
3419 kmem_free((caddr_t)newreg, alen + sizeof (pci_regspec_t));
3420
3421 return (PCICFG_SUCCESS);
3422 }
3423
3424 static int
3425 cardbus_update_ranges_prop(dev_info_t *dip, cardbus_range_t *addition)
3426 {
3427 int rlen;
3428 cardbus_range_t *ranges;
3429 caddr_t newreg;
3430 uint_t status;
3431 #if defined(CARDBUS_DEBUG)
3432 int i, nrange;
3433 const cardbus_range_t *nr;
3434 #endif
3435
3436 cardbus_err(dip, 6, "cardbus_update_ranges_prop\n");
3437
3438 status = ddi_getlongprop(DDI_DEV_T_NONE,
3439 dip, DDI_PROP_DONTPASS, "ranges",
3440 (caddr_t)&ranges, &rlen);
3441
3442 switch (status) {
3443 case DDI_PROP_SUCCESS:
3444 break;
3445 case DDI_PROP_NO_MEMORY:
3446 cardbus_err(dip, 1,
3447 "ranges present, but unable to get memory\n");
3448 return (PCICFG_FAILURE);
3449 default:
3450 cardbus_err(dip, 8, "no ranges property - creating one\n");
3451 if (ndi_prop_update_int_array(DDI_DEV_T_NONE,
3452 dip, "ranges", (int *)addition,
3453 sizeof (cardbus_range_t)/sizeof (int))
3454 != DDI_SUCCESS) {
3455 cardbus_err(dip, 1, "Did'nt create ranges property\n");
3456 return (PCICFG_FAILURE);
3457 }
3458 return (PCICFG_SUCCESS);
3459 }
3460
3461 /*
3462 * Allocate memory for the existing reg(s) plus one and then
3463 * build it.
3464 */
3465 newreg = kmem_zalloc(rlen+sizeof (cardbus_range_t), KM_SLEEP);
3466
3467 bcopy(ranges, newreg, rlen);
3468 bcopy(addition, newreg + rlen, sizeof (cardbus_range_t));
3469
3470 /*
3471 * Write out the new "ranges" property
3472 */
3473 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE,
3474 dip, "ranges", (int *)newreg,
3475 (rlen + sizeof (cardbus_range_t))/sizeof (int));
3476
3477 #if defined(CARDBUS_DEBUG)
3478 cardbus_err(dip, 8, "cardbus_update_ranges_prop ranges property:\n");
3479
3480 nrange = rlen / sizeof (cardbus_range_t);
3481 nr = (cardbus_range_t *)newreg;
3482 for (i = 0; i <= nrange; i++) {
3483 /* nrange is one higher for new entry */
3484 cardbus_err(dip, 9,
3485 "\trange parent addr 0x%x.0x%x.0x%x "
3486 "child addr 0x%x.0x%x.0x%x size 0x%x.0x%x\n",
3487 nr->parent_hi,
3488 nr->parent_mid, nr->parent_lo,
3489 nr->child_hi,
3490 nr->child_mid, nr->child_lo,
3491 nr->size_hi, nr->size_lo);
3492 nr++;
3493 }
3494 #endif
3495
3496 kmem_free((caddr_t)newreg, rlen+sizeof (cardbus_range_t));
3497 kmem_free((caddr_t)ranges, rlen);
3498
3499 return (PCICFG_SUCCESS);
3500 }
3501
3502 static int
3503 cardbus_update_reg_prop(dev_info_t *dip, uint32_t regvalue, uint_t reg_offset)
3504 {
3505 int rlen;
3506 pci_regspec_t *reg;
3507 caddr_t newreg;
3508 uint32_t hiword;
3509 pci_regspec_t addition;
3510 uint32_t size;
3511 uint_t status;
3512
3513 status = ddi_getlongprop(DDI_DEV_T_NONE,
3514 dip, DDI_PROP_DONTPASS, "reg", (caddr_t)®, &rlen);
3515
3516 switch (status) {
3517 case DDI_PROP_SUCCESS:
3518 break;
3519 case DDI_PROP_NO_MEMORY:
3520 cardbus_err(dip, 1, "reg present, but unable to get memory\n");
3521 return (PCICFG_FAILURE);
3522 default:
3523 cardbus_err(dip, 1, "no reg property\n");
3524 return (PCICFG_FAILURE);
3525 }
3526
3527 /*
3528 * Allocate memory for the existing reg(s) plus one and then
3529 * build it.
3530 */
3531 newreg = kmem_zalloc(rlen+sizeof (pci_regspec_t), KM_SLEEP);
3532
3533 /*
3534 * Build the regspec, then add it to the existing one(s)
3535 */
3536 hiword = PCICFG_MAKE_REG_HIGH(PCI_REG_BUS_G(reg->pci_phys_hi),
3537 PCI_REG_DEV_G(reg->pci_phys_hi),
3538 PCI_REG_FUNC_G(reg->pci_phys_hi),
3539 reg_offset);
3540
3541 if (reg_offset == PCI_CONF_ROM) {
3542 size = (~(PCI_BASE_ROM_ADDR_M & regvalue))+1;
3543 hiword |= PCI_ADDR_MEM32;
3544 } else {
3545 size = (~(PCI_BASE_M_ADDR_M & regvalue))+1;
3546
3547 if ((PCI_BASE_SPACE_M & regvalue) == PCI_BASE_SPACE_MEM) {
3548 if ((PCI_BASE_TYPE_M & regvalue) == PCI_BASE_TYPE_MEM) {
3549 hiword |= PCI_ADDR_MEM32;
3550 } else if ((PCI_BASE_TYPE_M & regvalue)
3551 == PCI_BASE_TYPE_ALL) {
3552 /*
3553 * This is a 64 bit PCI memory space.
3554 * It needs to be allocated as 32 bit
3555 * for bus map purposes.
3556 */
3557 hiword |= PCI_ADDR_MEM32;
3558 }
3559 } else {
3560 hiword |= PCI_ADDR_IO;
3561 }
3562 }
3563
3564 addition.pci_phys_hi = hiword;
3565 addition.pci_phys_mid = 0;
3566 addition.pci_phys_low = 0;
3567 addition.pci_size_hi = 0;
3568 addition.pci_size_low = size;
3569
3570 cardbus_err(dip, 8,
3571 "cardbus_update_reg_prop, phys_hi 0x%08x,"
3572 " phys_mid 0x%08x, phys_low 0x%08x, size_hi 0x%08x,"
3573 " size_low 0x%08x\n", hiword, 0, 0, 0, size);
3574
3575 bcopy(reg, newreg, rlen);
3576 bcopy(&addition, newreg + rlen, sizeof (pci_regspec_t));
3577
3578 /*
3579 * Write out the new "reg" property
3580 */
3581 (void) ndi_prop_update_int_array(DDI_DEV_T_NONE,
3582 dip, "reg", (int *)newreg,
3583 (rlen + sizeof (pci_regspec_t))/sizeof (int));
3584
3585 kmem_free((caddr_t)reg, rlen);
3586 kmem_free((caddr_t)newreg, rlen+sizeof (pci_regspec_t));
3587
3588 return (PCICFG_SUCCESS);
3589 }
3590
3591 /*
3592 * Setup the basic 1275 properties based on information found in the config
3593 * header of the PCI device
3594 */
3595 static int
3596 cardbus_set_standard_props(dev_info_t *parent, dev_info_t *dip,
3597 ddi_acc_handle_t config_handle)
3598 {
3599 int ret;
3600 uint16_t val;
3601 uint32_t wordval;
3602 uint8_t byteval;
3603
3604 /* These two exists only for non-bridges */
3605 if ((pci_config_get8(config_handle,
3606 PCI_CONF_HEADER) & PCI_HEADER_TYPE_M) == PCI_HEADER_ZERO) {
3607 byteval = pci_config_get8(config_handle, PCI_CONF_MIN_G);
3608 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3609 "min-grant", byteval)) != DDI_SUCCESS) {
3610 cardbus_err(dip, 1, "Failed to sent min-grant\n");
3611 return (ret);
3612 }
3613
3614 byteval = pci_config_get8(config_handle, PCI_CONF_MAX_L);
3615 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3616 "max-latency", byteval)) != DDI_SUCCESS) {
3617 return (ret);
3618 }
3619 }
3620
3621 /*
3622 * These should always exist and have the value of the
3623 * corresponding register value
3624 */
3625 val = pci_config_get16(config_handle, PCI_CONF_VENID);
3626
3627 /*
3628 * according to section 6.2.1 of revision 2 of the PCI local
3629 * bus specification - 0FFFFh is an invalid value for the vendor ID
3630 */
3631 if (val == 0xffff) {
3632 cardbus_err(dip, 1, "Illegal vendor-id 0x%x\n", val);
3633 return (PCICFG_FAILURE);
3634 }
3635 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3636 "vendor-id", val)) != DDI_SUCCESS) {
3637 return (ret);
3638 }
3639
3640 val = pci_config_get16(config_handle, PCI_CONF_DEVID);
3641 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3642 "device-id", val)) != DDI_SUCCESS) {
3643 return (ret);
3644 }
3645 byteval = pci_config_get8(config_handle, PCI_CONF_REVID);
3646 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3647 "revision-id", byteval)) != DDI_SUCCESS) {
3648 return (ret);
3649 }
3650
3651 wordval = (pci_config_get16(config_handle, PCI_CONF_SUBCLASS)<< 8) |
3652 (pci_config_get8(config_handle, PCI_CONF_PROGCLASS));
3653
3654 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3655 "class-code", wordval)) != DDI_SUCCESS) {
3656 return (ret);
3657 }
3658 val = (pci_config_get16(config_handle,
3659 PCI_CONF_STAT) & PCI_STAT_DEVSELT) >> 9;
3660 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3661 "devsel-speed", val)) != DDI_SUCCESS) {
3662 return (ret);
3663 }
3664
3665 /*
3666 * The next three are bits set in the status register. The property is
3667 * present (but with no value other than its own existence) if the bit
3668 * is set, non-existent otherwise
3669 */
3670 if (ddi_prop_exists(DDI_DEV_T_ANY, parent, DDI_PROP_DONTPASS,
3671 "fast-back-to-back") &&
3672 pci_config_get16(config_handle, PCI_CONF_STAT) & PCI_STAT_FBBC) {
3673
3674 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3675 "fast-back-to-back", 0)) != DDI_SUCCESS) {
3676 return (ret);
3677 }
3678 }
3679 if (pci_config_get16(config_handle, PCI_CONF_STAT) & PCI_STAT_66MHZ) {
3680 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3681 "66mhz-capable", 0)) != DDI_SUCCESS) {
3682 return (ret);
3683 }
3684 }
3685 if (pci_config_get16(config_handle, PCI_CONF_STAT) & PCI_STAT_UDF) {
3686 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3687 "udf-supported", 0)) != DDI_SUCCESS) {
3688 return (ret);
3689 }
3690 }
3691
3692 /*
3693 * These next three are optional and are not present
3694 * if the corresponding register is zero. If the value
3695 * is non-zero then the property exists with the value
3696 * of the register.
3697 */
3698
3699 /* look in the correct place for header type 2 */
3700 byteval = pci_config_get8(config_handle, PCI_CONF_HEADER);
3701 if ((byteval & PCI_HEADER_TYPE_M) == PCI_HEADER_TWO) {
3702 if ((val = pci_config_get16(config_handle,
3703 PCI_CBUS_SUBVENID)) != 0) {
3704 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3705 "subsystem-vendor-id", val)) != DDI_SUCCESS) {
3706 return (ret);
3707 }
3708 }
3709 if ((val = pci_config_get16(config_handle,
3710 PCI_CBUS_SUBSYSID)) != 0) {
3711 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3712 "subsystem-id", val)) != DDI_SUCCESS) {
3713 return (ret);
3714 }
3715 }
3716 } else {
3717 if ((val = pci_config_get16(config_handle,
3718 PCI_CONF_SUBVENID)) != 0) {
3719 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3720 "subsystem-vendor-id", val)) != DDI_SUCCESS) {
3721 return (ret);
3722 }
3723 }
3724 if ((val = pci_config_get16(config_handle,
3725 PCI_CONF_SUBSYSID)) != 0) {
3726 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3727 "subsystem-id", val)) != DDI_SUCCESS) {
3728 return (ret);
3729 }
3730 }
3731 }
3732
3733 if ((val = pci_config_get8(config_handle,
3734 PCI_CONF_CACHE_LINESZ)) != 0) {
3735 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3736 "cache-line-size", val)) != DDI_SUCCESS) {
3737 return (ret);
3738 }
3739 }
3740
3741 /*
3742 * If the Interrupt Pin register is non-zero then the
3743 * interrupts property exists
3744 */
3745 if ((byteval = pci_config_get8(config_handle, PCI_CONF_IPIN)) != 0) {
3746 /*
3747 * If interrupt pin is non-zero,
3748 * record the interrupt line used
3749 */
3750 cardbus_err(dip, 8, "Adding interrupts property\n");
3751 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3752 "interrupts", byteval)) != DDI_SUCCESS) {
3753 return (ret);
3754 }
3755 }
3756 return (PCICFG_SUCCESS);
3757 }
3758
3759 /*
3760 * Setup the basic properties required by the ISA node.
3761 */
3762 static int
3763 cardbus_set_isa_props(dev_info_t *parent, dev_info_t *dip,
3764 char *name, char *compat[])
3765 {
3766 int ret, n;
3767
3768 _NOTE(ARGUNUSED(parent))
3769
3770 cardbus_err(dip, 8, "Adding interrupts property\n");
3771 if ((ret = ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3772 "interrupts", 1)) != DDI_SUCCESS) {
3773 return (ret);
3774 }
3775
3776 /*
3777 * The node name field needs to be filled in with the name
3778 */
3779 if (ndi_devi_set_nodename(dip, name, 0) != NDI_SUCCESS) {
3780 cardbus_err(dip, 1, "Failed to set nodename for node\n");
3781 return (PCICFG_FAILURE);
3782 }
3783
3784 /*
3785 * Create the compatible property as an array of pointers
3786 * to strings. Start with the buffer created above.
3787 */
3788 n = 0;
3789 while (compat[n] != NULL)
3790 n++;
3791
3792 if (n != 0)
3793 if ((ret = ndi_prop_update_string_array(DDI_DEV_T_NONE, dip,
3794 "compatible", compat, n)) != DDI_SUCCESS)
3795 return (ret);
3796
3797 return (PCICFG_SUCCESS);
3798 }
3799
3800 static int
3801 cardbus_set_busnode_props(dev_info_t *dip)
3802 {
3803 cardbus_err(dip, 6, "cardbus_set_busnode_props\n");
3804
3805 cardbus_force_stringprop(dip, "device_type", "pci");
3806
3807 if (ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3808 "#address-cells", 3) != DDI_SUCCESS) {
3809 cardbus_err(dip, 4, "Failed to set #address-cells\n");
3810 }
3811 if (ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3812 "#size-cells", 2) != DDI_SUCCESS) {
3813 cardbus_err(dip, 4, "Failed to set #size-cells\n");
3814 }
3815 return (PCICFG_SUCCESS);
3816 }
3817
3818 static int
3819 cardbus_set_busnode_isaprops(dev_info_t *dip)
3820 {
3821 cardbus_err(dip, 6, "cardbus_set_busnode_props\n");
3822
3823 cardbus_force_stringprop(dip, "device_type", "isa");
3824
3825 if (ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3826 "#address-cells", 2) != DDI_SUCCESS) {
3827 cardbus_err(dip, 4, "Failed to set #address-cells\n");
3828 }
3829 if (ndi_prop_update_int(DDI_DEV_T_NONE, dip,
3830 "#size-cells", 1) != DDI_SUCCESS) {
3831 cardbus_err(dip, 4, "Failed to set #size-cells\n");
3832 }
3833 return (PCICFG_SUCCESS);
3834 }
3835
3836 /*
3837 * Use cb%x,%x rather than pci%x,%x so that we can use specific cardbus
3838 * drivers in /etc/driver_aliases if required
3839 */
3840 static int
3841 cardbus_set_childnode_props(dev_info_t *dip, ddi_acc_handle_t config_handle)
3842 {
3843 int ret;
3844 #ifndef _DONT_USE_1275_GENERIC_NAMES
3845 uint32_t wordval;
3846 #endif
3847 char *name;
3848 char buffer[64];
3849 uint32_t classcode;
3850 char *compat[8];
3851 int i, n;
3852 uint16_t subsysid, subvenid, devid, venid;
3853 uint8_t header_type;
3854
3855 /*
3856 * NOTE: These are for both a child and PCI-PCI bridge node
3857 */
3858 #ifndef _DONT_USE_1275_GENERIC_NAMES
3859 wordval = (pci_config_get16(config_handle, PCI_CONF_SUBCLASS)<< 8) |
3860 (pci_config_get8(config_handle, PCI_CONF_PROGCLASS));
3861 #endif
3862
3863 /* Cardbus support */
3864 venid = pci_config_get16(config_handle, PCI_CONF_VENID);
3865 devid = pci_config_get16(config_handle, PCI_CONF_DEVID);
3866
3867 header_type = pci_config_get8(config_handle, PCI_CONF_HEADER);
3868 if ((header_type & PCI_HEADER_TYPE_M) == PCI_HEADER_TWO) {
3869 subvenid = pci_config_get16(config_handle, PCI_CBUS_SUBVENID);
3870 subsysid = pci_config_get16(config_handle, PCI_CBUS_SUBSYSID);
3871 } else {
3872 subvenid = pci_config_get16(config_handle, PCI_CONF_SUBVENID);
3873 subsysid = pci_config_get16(config_handle, PCI_CONF_SUBSYSID);
3874 }
3875
3876 if (subsysid != 0) {
3877 (void) sprintf(buffer, "pci%x,%x", subvenid, subsysid);
3878 } else {
3879 (void) sprintf(buffer, "pci%x,%x", venid, devid);
3880 }
3881
3882 cardbus_err(dip, 8, "Childname is %s\n", buffer);
3883
3884 /*
3885 * In some environments, trying to use "generic" 1275 names is
3886 * not the convention. In those cases use the name as created
3887 * above. In all the rest of the cases, check to see if there
3888 * is a generic name first.
3889 */
3890 #ifdef _DONT_USE_1275_GENERIC_NAMES
3891 name = buffer;
3892 #else
3893 if ((name = cardbus_get_class_name(wordval>>8)) == NULL) {
3894 /*
3895 * Set name to the above fabricated name
3896 */
3897 name = buffer;
3898 }
3899
3900 cardbus_err(dip, 8, "Set nodename to %s\n", name);
3901 #endif
3902
3903 /*
3904 * The node name field needs to be filled in with the name
3905 */
3906 if (ndi_devi_set_nodename(dip, name, 0) != NDI_SUCCESS) {
3907 cardbus_err(dip, 1, "Failed to set nodename for node\n");
3908 return (PCICFG_FAILURE);
3909 }
3910
3911 /*
3912 * Create the compatible property as an array of pointers
3913 * to strings. Start with the cb name.
3914 */
3915 n = 0;
3916
3917 if (subsysid != 0) {
3918 (void) sprintf(buffer, "cb%x,%x", subvenid, subsysid);
3919 } else {
3920 (void) sprintf(buffer, "cb%x,%x", venid, devid);
3921 }
3922
3923 compat[n] = kmem_alloc(strlen(buffer) + 1, KM_SLEEP);
3924 (void) strcpy(compat[n++], buffer);
3925
3926 if (subsysid != 0) {
3927 /*
3928 * Add subsys numbers as pci compatible.
3929 */
3930 (void) sprintf(buffer, "pci%x,%x", subvenid, subsysid);
3931 compat[n] = kmem_alloc(strlen(buffer) + 1, KM_SLEEP);
3932 (void) strcpy(compat[n++], buffer);
3933 }
3934
3935 /*
3936 * Add in the VendorID/DeviceID compatible name.
3937 */
3938 (void) sprintf(buffer, "pci%x,%x", venid, devid);
3939
3940 compat[n] = kmem_alloc(strlen(buffer) + 1, KM_SLEEP);
3941 (void) strcpy(compat[n++], buffer);
3942
3943 classcode = (pci_config_get16(config_handle, PCI_CONF_SUBCLASS)<< 8) |
3944 (pci_config_get8(config_handle, PCI_CONF_PROGCLASS));
3945
3946 /*
3947 * Add in the Classcode
3948 */
3949 (void) sprintf(buffer, "pciclass,%06x", classcode);
3950
3951 cardbus_err(dip, 8, "class code %s\n", buffer);
3952
3953 compat[n] = kmem_alloc(strlen(buffer) + 1, KM_SLEEP);
3954 (void) strcpy(compat[n++], buffer);
3955
3956 if ((ret = ndi_prop_update_string_array(DDI_DEV_T_NONE, dip,
3957 "compatible", (char **)compat, n)) != DDI_SUCCESS) {
3958 return (ret);
3959 }
3960
3961 for (i = 0; i < n; i++) {
3962 kmem_free(compat[i], strlen(compat[i]) + 1);
3963 }
3964
3965 return (PCICFG_SUCCESS);
3966 }
3967
3968 /*
3969 * Program the bus numbers into the bridge
3970 */
3971 static void
3972 cardbus_set_bus_numbers(ddi_acc_handle_t config_handle,
3973 uint_t primary, uint_t secondary)
3974 {
3975 cardbus_err(NULL, 8,
3976 "cardbus_set_bus_numbers [%d->%d]\n", primary, secondary);
3977
3978 /*
3979 * Primary bus#
3980 */
3981 pci_config_put8(config_handle, PCI_BCNF_PRIBUS, primary);
3982
3983 /*
3984 * Secondary bus#
3985 */
3986 pci_config_put8(config_handle, PCI_BCNF_SECBUS, secondary);
3987
3988 /*
3989 * Set the subordinate bus number to ff in order to pass through any
3990 * type 1 cycle with a bus number higher than the secondary bus#
3991 * Note that this is reduced once the probe is complete in the
3992 * cardbus_setup_bridge() function.
3993 */
3994 pci_config_put8(config_handle, PCI_BCNF_SUBBUS, 0xFF);
3995 }
3996
3997 static void
3998 enable_pci_isa_bridge(dev_info_t *dip, ddi_acc_handle_t config_handle)
3999 {
4000 uint16_t comm, stat;
4001
4002 stat = pci_config_get16(config_handle, PCI_CONF_STAT);
4003 comm = pci_config_get16(config_handle, PCI_CONF_COMM);
4004
4005 /*
4006 * Enable memory, IO, bus mastership and error detection.
4007 */
4008 comm |= (PCI_COMM_ME | PCI_COMM_MAE | PCI_COMM_IO |
4009 PCI_COMM_PARITY_DETECT | PCI_COMM_SERR_ENABLE);
4010 if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
4011 "fast-back-to-back"))
4012 comm |= PCI_COMM_BACK2BACK_ENAB;
4013 pci_config_put16(config_handle, PCI_CONF_COMM, comm);
4014 cardbus_err(NULL, 8,
4015 "enable_pci_isa_bridge stat 0x%04x comm 0x%04x\n", stat, comm);
4016
4017 /*
4018 * ITE8888 Specific registers.
4019 */
4020 pci_config_put8(config_handle, 0x50, 0x00); /* Timing Control */
4021 pci_config_put8(config_handle, 0x52, 0x00); /* Master DMA Access */
4022 pci_config_put8(config_handle, 0x53, 0x01); /* ROMCS */
4023 }
4024
4025 static void
4026 enable_pci_pci_bridge(dev_info_t *dip, ddi_acc_handle_t config_handle)
4027 {
4028 uint16_t comm, stat, bctrl;
4029
4030 stat = pci_config_get16(config_handle, PCI_CONF_STAT);
4031 comm = pci_config_get16(config_handle, PCI_CONF_COMM);
4032 bctrl = pci_config_get16(config_handle, PCI_CBUS_BRIDGE_CTRL);
4033
4034 comm &= ~(PCI_COMM_IO | PCI_COMM_MAE);
4035 comm |= (PCI_COMM_ME | PCI_COMM_PARITY_DETECT | PCI_COMM_SERR_ENABLE);
4036
4037 /*
4038 * Enable back to back.
4039 */
4040 if (stat & PCI_STAT_FBBC)
4041 comm |= PCI_COMM_BACK2BACK_ENAB;
4042
4043 pci_config_put16(config_handle, PCI_CONF_COMM, comm);
4044
4045 /*
4046 * Reset the sub-ordinate bus.
4047 */
4048 if (!(bctrl & PCI_BCNF_BCNTRL_RESET))
4049 pci_config_put16(config_handle, PCI_CBUS_BRIDGE_CTRL,
4050 bctrl | PCI_BCNF_BCNTRL_RESET);
4051 else
4052 bctrl &= ~PCI_BCNF_BCNTRL_RESET;
4053
4054 /*
4055 * Enable error reporting.
4056 */
4057 bctrl |= (PCI_BCNF_BCNTRL_PARITY_ENABLE | PCI_BCNF_BCNTRL_SERR_ENABLE |
4058 PCI_BCNF_BCNTRL_MAST_AB_MODE);
4059
4060 /*
4061 * Enable back to back on secondary bus.
4062 */
4063 if (stat & PCI_STAT_FBBC)
4064 bctrl |= PCI_BCNF_BCNTRL_B2B_ENAB;
4065
4066 pci_config_put16(config_handle, PCI_CBUS_BRIDGE_CTRL, bctrl);
4067 cardbus_err(dip, 8,
4068 "enable_pci_pci_bridge stat 0x%04x comm 0x%04x bctrl 0x%04x\n",
4069 stat, comm, bctrl);
4070 }
4071
4072 static int cardbus_reset_wait = 20;
4073
4074 static void
4075 enable_cardbus_bridge(dev_info_t *dip, ddi_acc_handle_t config_handle)
4076 {
4077 uint16_t comm, stat, bctrl;
4078
4079 stat = pci_config_get16(config_handle, PCI_CONF_STAT);
4080 comm = pci_config_get16(config_handle, PCI_CONF_COMM);
4081 bctrl = pci_config_get16(config_handle, PCI_CBUS_BRIDGE_CTRL);
4082
4083 /*
4084 * Don't mess with the command register on the cardbus bridge
4085 * itself. This should have been done when it's parent
4086 * did the setup. Some devices *require* certain things to
4087 * disabled, this can be done using the "command-preserve"
4088 * property and if we mess with it here it breaks that.
4089 *
4090 * comm |= (PCI_COMM_ME | PCI_COMM_PARITY_DETECT |
4091 * PCI_COMM_SERR_ENABLE);
4092 */
4093
4094 /*
4095 * Reset the sub-ordinate bus.
4096 */
4097 if (!(bctrl & PCI_BCNF_BCNTRL_RESET))
4098 pci_config_put16(config_handle, PCI_CBUS_BRIDGE_CTRL,
4099 bctrl | PCI_BCNF_BCNTRL_RESET);
4100 else
4101 bctrl &= ~PCI_BCNF_BCNTRL_RESET;
4102
4103 /*
4104 * Turn off pre-fetch.
4105 */
4106 bctrl &= ~(CB_BCNF_BCNTRL_MEM0_PREF | CB_BCNF_BCNTRL_MEM1_PREF |
4107 PCI_BCNF_BCNTRL_PARITY_ENABLE | PCI_BCNF_BCNTRL_SERR_ENABLE);
4108
4109 /*
4110 * Enable error reporting.
4111 */
4112 bctrl |= (PCI_BCNF_BCNTRL_MAST_AB_MODE | CB_BCNF_BCNTRL_WRITE_POST);
4113 if (comm & PCI_COMM_PARITY_DETECT)
4114 bctrl |= PCI_BCNF_BCNTRL_PARITY_ENABLE;
4115 if (comm & PCI_COMM_SERR_ENABLE)
4116 bctrl |= PCI_BCNF_BCNTRL_SERR_ENABLE;
4117
4118 pci_config_put16(config_handle, PCI_CBUS_BRIDGE_CTRL, bctrl);
4119 pci_config_put8(config_handle, PCI_CBUS_LATENCY_TIMER,
4120 cardbus_latency_timer);
4121
4122 pci_config_put16(config_handle, PCI_CONF_STAT, stat);
4123 pci_config_put16(config_handle, PCI_CONF_COMM, comm);
4124
4125 cardbus_err(dip, 8,
4126 "enable_cardbus_bridge() stat 0x%04x comm 0x%04x bctrl 0x%04x\n",
4127 stat, comm, bctrl);
4128
4129 /* after resetting the bridge, wait for everything to stablize */
4130 delay(drv_usectohz(cardbus_reset_wait * 1000));
4131
4132 }
4133
4134 static void
4135 disable_pci_pci_bridge(dev_info_t *dip, ddi_acc_handle_t config_handle)
4136 {
4137 uint16_t comm, bctrl;
4138
4139 comm = pci_config_get16(config_handle, PCI_CONF_COMM);
4140 bctrl = pci_config_get16(config_handle, PCI_CBUS_BRIDGE_CTRL);
4141
4142 /*
4143 * Turn off subordinate bus access.
4144 */
4145 pci_config_put8(config_handle, PCI_BCNF_SECBUS, 0);
4146 pci_config_put8(config_handle, PCI_BCNF_SUBBUS, 0);
4147
4148 /*
4149 * Disable error reporting.
4150 */
4151 bctrl &= ~(PCI_BCNF_BCNTRL_PARITY_ENABLE | PCI_BCNF_BCNTRL_SERR_ENABLE |
4152 PCI_BCNF_BCNTRL_MAST_AB_MODE);
4153 comm = 0;
4154
4155 pci_config_put16(config_handle, PCI_CONF_COMM, comm);
4156 pci_config_put16(config_handle, PCI_CBUS_BRIDGE_CTRL, bctrl);
4157
4158 cardbus_err(dip, 6,
4159 "disable_pci_pci_bridge() stat 0x%04x comm 0x%04x bctrl 0x%04x\n",
4160 pci_config_get16(config_handle, PCI_CONF_STAT), comm, bctrl);
4161 }
4162
4163 static void
4164 disable_cardbus_bridge(dev_info_t *dip, ddi_acc_handle_t config_handle)
4165 {
4166 uint16_t comm, bctrl;
4167
4168 comm = pci_config_get16(config_handle, PCI_CONF_COMM);
4169 bctrl = pci_config_get16(config_handle, PCI_CBUS_BRIDGE_CTRL);
4170
4171 /*
4172 * Turn off subordinate bus access.
4173 */
4174 pci_config_put8(config_handle, PCI_BCNF_SECBUS, 0);
4175 pci_config_put8(config_handle, PCI_BCNF_SUBBUS, 0);
4176
4177 /*
4178 * Disable error reporting.
4179 */
4180 bctrl &= ~(PCI_BCNF_BCNTRL_PARITY_ENABLE | PCI_BCNF_BCNTRL_SERR_ENABLE |
4181 PCI_BCNF_BCNTRL_MAST_AB_MODE);
4182
4183 pci_config_put32(config_handle, PCI_CBUS_MEM_LIMIT0, 0);
4184 pci_config_put32(config_handle, PCI_CBUS_MEM_BASE0, 0);
4185 pci_config_put32(config_handle, PCI_CBUS_IO_LIMIT0, 0);
4186 pci_config_put32(config_handle, PCI_CBUS_IO_BASE0, 0);
4187 pci_config_put16(config_handle, PCI_CONF_COMM, comm);
4188 pci_config_put16(config_handle, PCI_CBUS_BRIDGE_CTRL, bctrl);
4189
4190 cardbus_err(dip, 6,
4191 "disable_cardbus_bridge() stat 0x%04x comm 0x%04x bctrl 0x%04x\n",
4192 pci_config_get16(config_handle, PCI_CONF_STAT), comm, bctrl);
4193 }
4194
4195 static void
4196 enable_cardbus_device(dev_info_t *dip, ddi_acc_handle_t config_handle)
4197 {
4198 uint16_t comm, stat;
4199
4200 stat = pci_config_get16(config_handle, PCI_CONF_STAT);
4201 comm = pci_config_get16(config_handle, PCI_CONF_COMM);
4202
4203 /*
4204 * Enable memory, IO, bus mastership and error detection.
4205 */
4206 comm |= (PCI_COMM_ME | PCI_COMM_MAE | PCI_COMM_IO |
4207 PCI_COMM_PARITY_DETECT | PCI_COMM_SERR_ENABLE);
4208 if (ddi_prop_exists(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
4209 "fast-back-to-back"))
4210 comm |= PCI_COMM_BACK2BACK_ENAB;
4211 pci_config_put16(config_handle, PCI_CONF_COMM, comm);
4212 cardbus_err(NULL, 8,
4213 "enable_cardbus_device stat 0x%04x comm 0x%04x\n", stat, comm);
4214 }
4215
4216 static void
4217 disable_cardbus_device(ddi_acc_handle_t config_handle)
4218 {
4219 cardbus_err(NULL, 8, "disable_cardbus_device\n");
4220
4221 /*
4222 * Turn off everything in the command register.
4223 */
4224 pci_config_put16(config_handle, PCI_CONF_COMM, 0x0);
4225 }
4226
4227 #ifndef _DONT_USE_1275_GENERIC_NAMES
4228 static char *
4229 cardbus_get_class_name(uint32_t classcode)
4230 {
4231 struct cardbus_name_entry *ptr;
4232
4233 for (ptr = &cardbus_class_lookup[0]; ptr->name != NULL; ptr++) {
4234 if (ptr->class_code == classcode) {
4235 return (ptr->name);
4236 }
4237 }
4238 return (NULL);
4239 }
4240 #endif /* _DONT_USE_1275_GENERIC_NAMES */
4241
4242 static void
4243 cardbus_force_boolprop(dev_info_t *dip, char *pname)
4244 {
4245 int ret;
4246
4247 if ((ret = ndi_prop_create_boolean(DDI_DEV_T_NONE, dip,
4248 pname)) != DDI_SUCCESS) {
4249 if (ret == DDI_PROP_NOT_FOUND)
4250 if (ddi_prop_create(DDI_DEV_T_NONE, dip,
4251 DDI_PROP_CANSLEEP, pname,
4252 (caddr_t)NULL, 0) != DDI_SUCCESS)
4253 cardbus_err(dip, 4,
4254 "Failed to set boolean property "
4255 "\"%s\"\n", pname);
4256 }
4257 }
4258
4259 static void
4260 cardbus_force_intprop(dev_info_t *dip, char *pname, int *pval, int len)
4261 {
4262 int ret;
4263
4264 if ((ret = ndi_prop_update_int_array(DDI_DEV_T_NONE, dip,
4265 pname, pval, len)) != DDI_SUCCESS) {
4266 if (ret == DDI_PROP_NOT_FOUND)
4267 if (ddi_prop_create(DDI_DEV_T_NONE, dip,
4268 DDI_PROP_CANSLEEP, pname,
4269 (caddr_t)pval, len*sizeof (int))
4270 != DDI_SUCCESS)
4271 cardbus_err(dip, 4,
4272 "Failed to set int property \"%s\"\n",
4273 pname);
4274 }
4275 }
4276
4277 static void
4278 cardbus_force_stringprop(dev_info_t *dip, char *pname, char *pval)
4279 {
4280 int ret;
4281
4282 if ((ret = ndi_prop_update_string(DDI_DEV_T_NONE, dip,
4283 pname, pval)) != DDI_SUCCESS) {
4284 if (ret == DDI_PROP_NOT_FOUND)
4285 if (ddi_prop_create(DDI_DEV_T_NONE, dip,
4286 DDI_PROP_CANSLEEP, pname,
4287 pval, strlen(pval) + 1) != DDI_SUCCESS)
4288 cardbus_err(dip, 4,
4289 "Failed to set string property "
4290 "\"%s\" to \"%s\"\n",
4291 pname, pval);
4292 }
4293 }
4294
4295 static void
4296 split_addr(char *naddr, int *dev, int *func)
4297 {
4298 char c;
4299 int *ip = dev;
4300
4301 *dev = 0;
4302 *func = 0;
4303
4304 while (c = *naddr++) {
4305 if (c == ',') {
4306 ip = func;
4307 continue;
4308 }
4309 if (c >= '0' && c <= '9') {
4310 *ip = (*ip * 16) + (c - '0');
4311 } else if (c >= 'a' && c <= 'f') {
4312 *ip = (*ip * 16) + 10 + (c - 'a');
4313 } else
4314 break;
4315 }
4316 }
4317
4318 #ifdef DEBUG
4319 static void
4320 cardbus_dump_common_config(ddi_acc_handle_t config_handle)
4321 {
4322 cardbus_err(NULL, 1,
4323 " Vendor ID = [0x%04x] "
4324 "Device ID = [0x%04x]\n",
4325 pci_config_get16(config_handle, PCI_CONF_VENID),
4326 pci_config_get16(config_handle, PCI_CONF_DEVID));
4327 cardbus_err(NULL, 1,
4328 " Command REG = [0x%04x] "
4329 "Status REG = [0x%04x]\n",
4330 pci_config_get16(config_handle, PCI_CONF_COMM),
4331 pci_config_get16(config_handle, PCI_CONF_STAT));
4332 cardbus_err(NULL, 1,
4333 " Revision ID = [0x%02x] "
4334 "Prog Class = [0x%02x]\n",
4335 pci_config_get8(config_handle, PCI_CONF_REVID),
4336 pci_config_get8(config_handle, PCI_CONF_PROGCLASS));
4337 cardbus_err(NULL, 1,
4338 " Dev Class = [0x%02x] "
4339 "Base Class = [0x%02x]\n",
4340 pci_config_get8(config_handle, PCI_CONF_SUBCLASS),
4341 pci_config_get8(config_handle, PCI_CONF_BASCLASS));
4342 cardbus_err(NULL, 1,
4343 " Cache LnSz = [0x%02x] "
4344 "Latency Tmr = [0x%02x]\n",
4345 pci_config_get8(config_handle, PCI_CONF_CACHE_LINESZ),
4346 pci_config_get8(config_handle, PCI_CONF_LATENCY_TIMER));
4347 cardbus_err(NULL, 1,
4348 " Header Type = [0x%02x] "
4349 "BIST = [0x%02x]\n",
4350 pci_config_get8(config_handle, PCI_CONF_HEADER),
4351 pci_config_get8(config_handle, PCI_CONF_BIST));
4352 }
4353
4354 static void
4355 cardbus_dump_device_config(ddi_acc_handle_t config_handle)
4356 {
4357 cardbus_dump_common_config(config_handle);
4358
4359 cardbus_err(NULL, 1,
4360 " BASE 0 = [0x%08x] BASE 1 = [0x%08x]\n",
4361 pci_config_get32(config_handle, PCI_CONF_BASE0),
4362 pci_config_get32(config_handle, PCI_CONF_BASE1));
4363 cardbus_err(NULL, 1,
4364 " BASE 2 = [0x%08x] BASE 3 = [0x%08x]\n",
4365 pci_config_get32(config_handle, PCI_CONF_BASE2),
4366 pci_config_get32(config_handle, PCI_CONF_BASE3));
4367 cardbus_err(NULL, 1,
4368 " BASE 4 = [0x%08x] BASE 5 = [0x%08x]\n",
4369 pci_config_get32(config_handle, PCI_CONF_BASE4),
4370 pci_config_get32(config_handle, PCI_CONF_BASE5));
4371 cardbus_err(NULL, 1,
4372 " Cardbus CIS = [0x%08x] ROM = [0x%08x]\n",
4373 pci_config_get32(config_handle, PCI_CONF_CIS),
4374 pci_config_get32(config_handle, PCI_CONF_ROM));
4375 cardbus_err(NULL, 1,
4376 " Sub VID = [0x%04x] Sub SID = [0x%04x]\n",
4377 pci_config_get16(config_handle, PCI_CONF_SUBVENID),
4378 pci_config_get16(config_handle, PCI_CONF_SUBSYSID));
4379 cardbus_err(NULL, 1,
4380 " I Line = [0x%02x] I Pin = [0x%02x]\n",
4381 pci_config_get8(config_handle, PCI_CONF_ILINE),
4382 pci_config_get8(config_handle, PCI_CONF_IPIN));
4383 cardbus_err(NULL, 1,
4384 " Max Grant = [0x%02x] Max Latent = [0x%02x]\n",
4385 pci_config_get8(config_handle, PCI_CONF_MIN_G),
4386 pci_config_get8(config_handle, PCI_CONF_MAX_L));
4387 }
4388
4389 static void
4390 cardbus_dump_bridge_config(ddi_acc_handle_t config_handle,
4391 uint8_t header_type)
4392 {
4393 if (header_type == PCI_HEADER_PPB) {
4394 cardbus_dump_common_config(config_handle);
4395 cardbus_err(NULL, 1,
4396 "........................................\n");
4397 } else {
4398 cardbus_dump_common_config(config_handle);
4399 cardbus_err(NULL, 1,
4400 " Mem Base = [0x%08x] CBus Status = [0x%04x]\n",
4401 pci_config_get32(config_handle, PCI_CBUS_SOCK_REG),
4402 pci_config_get16(config_handle, PCI_CBUS_SEC_STATUS));
4403 }
4404
4405 cardbus_err(NULL, 1,
4406 " Pri Bus = [0x%02x] Sec Bus = [0x%02x]\n",
4407 pci_config_get8(config_handle, PCI_BCNF_PRIBUS),
4408 pci_config_get8(config_handle, PCI_BCNF_SECBUS));
4409 cardbus_err(NULL, 1,
4410 " Sub Bus = [0x%02x] Sec Latency = [0x%02x]\n",
4411 pci_config_get8(config_handle, PCI_BCNF_SUBBUS),
4412 pci_config_get8(config_handle, PCI_BCNF_LATENCY_TIMER));
4413
4414 switch (header_type) {
4415 case PCI_HEADER_PPB:
4416 cardbus_err(NULL, 1,
4417 " I/O Base LO = [0x%02x] I/O Lim LO = [0x%02x]\n",
4418 pci_config_get8(config_handle, PCI_BCNF_IO_BASE_LOW),
4419 pci_config_get8(config_handle, PCI_BCNF_IO_LIMIT_LOW));
4420 cardbus_err(NULL, 1,
4421 " Sec. Status = [0x%04x]\n",
4422 pci_config_get16(config_handle, PCI_BCNF_SEC_STATUS));
4423 cardbus_err(NULL, 1,
4424 " Mem Base = [0x%04x] Mem Limit = [0x%04x]\n",
4425 pci_config_get16(config_handle, PCI_BCNF_MEM_BASE),
4426 pci_config_get16(config_handle, PCI_BCNF_MEM_LIMIT));
4427 cardbus_err(NULL, 1,
4428 " PF Mem Base = [0x%04x] PF Mem Lim = [0x%04x]\n",
4429 pci_config_get16(config_handle, PCI_BCNF_PF_BASE_LOW),
4430 pci_config_get16(config_handle, PCI_BCNF_PF_LIMIT_LOW));
4431 cardbus_err(NULL, 1,
4432 " PF Base HI = [0x%08x] PF Lim HI = [0x%08x]\n",
4433 pci_config_get32(config_handle, PCI_BCNF_PF_BASE_HIGH),
4434 pci_config_get32(config_handle, PCI_BCNF_PF_LIMIT_HIGH));
4435 cardbus_err(NULL, 1,
4436 " I/O Base HI = [0x%04x] I/O Lim HI = [0x%04x]\n",
4437 pci_config_get16(config_handle, PCI_BCNF_IO_BASE_HI),
4438 pci_config_get16(config_handle, PCI_BCNF_IO_LIMIT_HI));
4439 cardbus_err(NULL, 1,
4440 " ROM addr = [0x%08x]\n",
4441 pci_config_get32(config_handle, PCI_BCNF_ROM));
4442 break;
4443 case PCI_HEADER_CARDBUS:
4444 cardbus_err(NULL, 1,
4445 " Mem Base 0 = [0x%08x] Mem Limit 0 = [0x%08x]\n",
4446 pci_config_get32(config_handle, PCI_CBUS_MEM_BASE0),
4447 pci_config_get32(config_handle, PCI_CBUS_MEM_LIMIT0));
4448 cardbus_err(NULL, 1,
4449 " Mem Base 1 = [0x%08x] Mem Limit 1 = [0x%08x]\n",
4450 pci_config_get32(config_handle, PCI_CBUS_MEM_BASE1),
4451 pci_config_get32(config_handle, PCI_CBUS_MEM_LIMIT1));
4452 cardbus_err(NULL, 1,
4453 " IO Base 0 = [0x%08x] IO Limit 0 = [0x%08x]\n",
4454 pci_config_get32(config_handle, PCI_CBUS_IO_BASE0),
4455 pci_config_get32(config_handle, PCI_CBUS_IO_LIMIT0));
4456 cardbus_err(NULL, 1,
4457 " IO Base 1 = [0x%08x] IO Limit 1 = [0x%08x]\n",
4458 pci_config_get32(config_handle, PCI_CBUS_IO_BASE1),
4459 pci_config_get32(config_handle, PCI_CBUS_IO_LIMIT1));
4460 break;
4461 }
4462 cardbus_err(NULL, 1,
4463 " Intr Line = [0x%02x] Intr Pin = [0x%02x]\n",
4464 pci_config_get8(config_handle, PCI_BCNF_ILINE),
4465 pci_config_get8(config_handle, PCI_BCNF_IPIN));
4466 cardbus_err(NULL, 1,
4467 " Bridge Ctrl = [0x%04x]\n",
4468 pci_config_get16(config_handle, PCI_BCNF_BCNTRL));
4469
4470 switch (header_type) {
4471 case PCI_HEADER_CARDBUS:
4472 cardbus_err(NULL, 1,
4473 " Sub VID = [0x%04x] Sub SID = [0x%04x]\n",
4474 pci_config_get16(config_handle, PCI_CBUS_SUBVENID),
4475 pci_config_get16(config_handle, PCI_CBUS_SUBSYSID));
4476 /* LATER: TI1250 only */
4477 cardbus_err(NULL, 1,
4478 " Sys Control = [0x%08x]\n",
4479 pci_config_get32(config_handle, 0x80));
4480 }
4481 }
4482
4483 static void
4484 cardbus_dump_config(ddi_acc_handle_t config_handle)
4485 {
4486 uint8_t header_type = pci_config_get8(config_handle,
4487 PCI_CONF_HEADER) & PCI_HEADER_TYPE_M;
4488
4489 if (header_type == PCI_HEADER_PPB || header_type == PCI_HEADER_CARDBUS)
4490 cardbus_dump_bridge_config(config_handle, header_type);
4491 else
4492 cardbus_dump_device_config(config_handle);
4493 }
4494
4495 static void
4496 cardbus_dump_reg(dev_info_t *dip, const pci_regspec_t *regspec, int nelems)
4497 {
4498 /* int rlen = nelems * sizeof(pci_regspec_t); */
4499
4500 cardbus_err(dip, 6,
4501 "cardbus_dump_reg: \"reg\" has %d elements\n", nelems);
4502
4503 #if defined(CARDBUS_DEBUG)
4504 if (cardbus_debug >= 1) {
4505 int i;
4506 uint32_t *regs = (uint32_t *)regspec;
4507
4508 for (i = 0; i < nelems; i++) {
4509
4510 cardbus_err(NULL, 6,
4511 "\t%d:%08x %08x %08x %08x %08x\n",
4512 i, regs[0], regs[1], regs[2], regs[3], regs[4]);
4513 }
4514 }
4515 #endif
4516 }
4517
4518 #endif
4519
4520 #if defined(CARDBUS_DEBUG)
4521 void
4522 cardbus_dump_children(dev_info_t *dip, int level)
4523 {
4524 dev_info_t *next;
4525
4526 cardbus_err(dip, 1,
4527 "\t%d: %s: 0x%p\n", level, ddi_node_name(dip), (void *) dip);
4528 for (next = ddi_get_child(dip); next;
4529 next = ddi_get_next_sibling(next))
4530 cardbus_dump_children(next, level + 1);
4531 }
4532
4533 void
4534 cardbus_dump_family_tree(dev_info_t *dip)
4535 {
4536 cardbus_err(dip, 1, "0x%p family tree:\n", (void *) dip);
4537 cardbus_dump_children(dip, 1);
4538 }
4539 #endif
4540