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 /* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * PCIC device/interrupt handler 29 * The "pcic" driver handles the Intel 82365SL, Cirrus Logic 30 * and Toshiba (and possibly other clones) PCMCIA adapter chip 31 * sets. It implements a subset of Socket Services as defined 32 * in the Solaris PCMCIA design documents 33 */ 34 35 /* 36 * currently defined "properties" 37 * 38 * clock-frequency bus clock frequency 39 * smi system management interrupt override 40 * need-mult-irq need status IRQ for each pair of sockets 41 * disable-audio don't route audio signal to speaker 42 */ 43 44 45 #include <sys/types.h> 46 #include <sys/inttypes.h> 47 #include <sys/param.h> 48 #include <sys/systm.h> 49 #include <sys/user.h> 50 #include <sys/buf.h> 51 #include <sys/file.h> 52 #include <sys/uio.h> 53 #include <sys/conf.h> 54 #include <sys/stat.h> 55 #include <sys/autoconf.h> 56 #include <sys/vtoc.h> 57 #include <sys/dkio.h> 58 #include <sys/ddi.h> 59 #include <sys/sunddi.h> 60 #include <sys/sunndi.h> 61 #include <sys/var.h> 62 #include <sys/callb.h> 63 #include <sys/open.h> 64 #include <sys/ddidmareq.h> 65 #include <sys/dma_engine.h> 66 #include <sys/kstat.h> 67 #include <sys/kmem.h> 68 #include <sys/modctl.h> 69 #include <sys/pci.h> 70 #include <sys/pci_impl.h> 71 72 #include <sys/pctypes.h> 73 #include <sys/pcmcia.h> 74 #include <sys/sservice.h> 75 76 #include <sys/note.h> 77 78 #include <sys/pcic_reg.h> 79 #include <sys/pcic_var.h> 80 81 #if defined(__i386) || defined(__amd64) 82 #include <sys/pci_cfgspace.h> 83 #endif 84 85 #if defined(__sparc) 86 #include <sys/pci/pci_nexus.h> 87 #endif 88 89 #include <sys/hotplug/hpcsvc.h> 90 #include "cardbus/cardbus.h" 91 92 #define SOFTC_SIZE (sizeof (anp_t)) 93 94 static int pcic_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **); 95 static int pcic_attach(dev_info_t *, ddi_attach_cmd_t); 96 static int pcic_detach(dev_info_t *, ddi_detach_cmd_t); 97 static int32_t pcic_quiesce(dev_info_t *); 98 static uint_t pcic_intr(caddr_t, caddr_t); 99 static int pcic_do_io_intr(pcicdev_t *, uint32_t); 100 static int pcic_probe(dev_info_t *); 101 102 static int pcic_open(dev_t *, int, int, cred_t *); 103 static int pcic_close(dev_t, int, int, cred_t *); 104 static int pcic_ioctl(dev_t, int, intptr_t, int, cred_t *, int *); 105 106 typedef struct pcm_regs pcm_regs_t; 107 108 static void pcic_init_assigned(dev_info_t *); 109 static int pcic_apply_avail_ranges(dev_info_t *, pcm_regs_t *, 110 pci_regspec_t *, int); 111 int pci_resource_setup_avail(dev_info_t *, pci_regspec_t *, int); 112 113 /* 114 * On x86 platforms the ddi_iobp_alloc(9F) and ddi_mem_alloc(9F) calls 115 * are xlated into DMA ctlops. To make this nexus work on x86, we 116 * need to have the default ddi_dma_mctl ctlops in the bus_ops 117 * structure, just to pass the request to the parent. The correct 118 * ctlops should be ddi_no_dma_mctl because so far we don't do DMA. 119 */ 120 static 121 struct bus_ops pcmciabus_ops = { 122 BUSO_REV, 123 pcmcia_bus_map, 124 NULL, 125 NULL, 126 NULL, 127 i_ddi_map_fault, 128 ddi_no_dma_map, 129 ddi_no_dma_allochdl, 130 ddi_no_dma_freehdl, 131 ddi_no_dma_bindhdl, 132 ddi_no_dma_unbindhdl, 133 ddi_no_dma_flush, 134 ddi_no_dma_win, 135 ddi_dma_mctl, 136 pcmcia_ctlops, 137 pcmcia_prop_op, 138 NULL, /* (*bus_get_eventcookie)(); */ 139 NULL, /* (*bus_add_eventcall)(); */ 140 NULL, /* (*bus_remove_eventcall)(); */ 141 NULL, /* (*bus_post_event)(); */ 142 NULL, /* (*bus_intr_ctl)(); */ 143 NULL, /* (*bus_config)(); */ 144 NULL, /* (*bus_unconfig)(); */ 145 NULL, /* (*bus_fm_init)(); */ 146 NULL, /* (*bus_fm_fini)(); */ 147 NULL, /* (*bus_enter)() */ 148 NULL, /* (*bus_exit)() */ 149 NULL, /* (*bus_power)() */ 150 pcmcia_intr_ops /* (*bus_intr_op)(); */ 151 }; 152 153 static struct cb_ops pcic_cbops = { 154 pcic_open, 155 pcic_close, 156 nodev, 157 nodev, 158 nodev, 159 nodev, 160 nodev, 161 pcic_ioctl, 162 nodev, 163 nodev, 164 nodev, 165 nochpoll, 166 ddi_prop_op, 167 NULL, 168 #ifdef CARDBUS 169 D_NEW | D_MP | D_HOTPLUG 170 #else 171 D_NEW | D_MP 172 #endif 173 }; 174 175 static struct dev_ops pcic_devops = { 176 DEVO_REV, 177 0, 178 pcic_getinfo, 179 nulldev, 180 pcic_probe, 181 pcic_attach, 182 pcic_detach, 183 nulldev, 184 &pcic_cbops, 185 &pcmciabus_ops, 186 NULL, 187 pcic_quiesce, /* devo_quiesce */ 188 }; 189 190 void *pcic_soft_state_p = NULL; 191 static int pcic_maxinst = -1; 192 193 int pcic_do_insertion = 1; 194 int pcic_do_removal = 1; 195 196 struct irqmap { 197 int irq; 198 int count; 199 } pcic_irq_map[16]; 200 201 202 int pcic_debug = 0x0; 203 static void pcic_err(dev_info_t *dip, int level, const char *fmt, ...); 204 extern void cardbus_dump_pci_config(dev_info_t *dip); 205 extern void cardbus_dump_socket(dev_info_t *dip); 206 extern int cardbus_validate_iline(dev_info_t *dip, ddi_acc_handle_t handle); 207 static void pcic_dump_debqueue(char *msg); 208 209 #if defined(PCIC_DEBUG) 210 static void xxdmp_all_regs(pcicdev_t *, int, uint32_t); 211 212 #define pcic_mutex_enter(a) \ 213 { \ 214 pcic_err(NULL, 10, "Set lock at %d\n", __LINE__); \ 215 mutex_enter(a); \ 216 }; 217 218 #define pcic_mutex_exit(a) \ 219 { \ 220 pcic_err(NULL, 10, "Clear lock at %d\n", __LINE__); \ 221 mutex_exit(a); \ 222 }; 223 224 #else 225 #define pcic_mutex_enter(a) mutex_enter(a) 226 #define pcic_mutex_exit(a) mutex_exit(a) 227 #endif 228 229 #define PCIC_VCC_3VLEVEL 1 230 #define PCIC_VCC_5VLEVEL 2 231 #define PCIC_VCC_12LEVEL 3 232 233 /* bit patterns to select voltage levels */ 234 int pcic_vpp_levels[13] = { 235 0, 0, 0, 236 1, /* 3.3V */ 237 0, 238 1, /* 5V */ 239 0, 0, 0, 0, 0, 0, 240 2 /* 12V */ 241 }; 242 243 uint8_t pcic_cbv_levels[13] = { 244 0, 0, 0, 245 3, /* 3.3V */ 246 0, 247 2, /* 5V */ 248 0, 0, 0, 0, 0, 0, 249 1 /* 12V */ 250 }; 251 252 struct power_entry pcic_power[4] = { 253 { 254 0, VCC|VPP1|VPP2 255 }, 256 { 257 33, /* 3.3Volt */ 258 VCC|VPP1|VPP2 259 }, 260 { 261 5*10, /* 5Volt */ 262 VCC|VPP1|VPP2 /* currently only know about this */ 263 }, 264 { 265 12*10, /* 12Volt */ 266 VPP1|VPP2 267 } 268 }; 269 270 /* 271 * Base used to allocate ranges of PCI memory on x86 systems 272 * Each instance gets a chunk above the base that is used to map 273 * in the memory and I/O windows for that device. 274 * Pages below the base are also allocated for the EXCA registers, 275 * one per instance. 276 */ 277 #define PCIC_PCI_MEMCHUNK 0x1000000 278 279 static int pcic_wait_insert_time = 5000000; /* In micro-seconds */ 280 static int pcic_debounce_time = 200000; /* In micro-seconds */ 281 282 struct debounce { 283 pcic_socket_t *pcs; 284 clock_t expire; 285 struct debounce *next; 286 }; 287 288 static struct debounce *pcic_deb_queue = NULL; 289 static kmutex_t pcic_deb_mtx; 290 static kcondvar_t pcic_deb_cv; 291 static kthread_t *pcic_deb_threadid; 292 293 static inthandler_t *pcic_handlers; 294 295 static void pcic_setup_adapter(pcicdev_t *); 296 static int pcic_change(pcicdev_t *, int); 297 static int pcic_ll_reset(pcicdev_t *, int); 298 static void pcic_mswait(pcicdev_t *, int, int); 299 static boolean_t pcic_check_ready(pcicdev_t *, int); 300 static void pcic_set_cdtimers(pcicdev_t *, int, uint32_t, int); 301 static void pcic_ready_wait(pcicdev_t *, int); 302 extern int pcmcia_get_intr(dev_info_t *, int); 303 extern int pcmcia_return_intr(dev_info_t *, int); 304 extern void pcmcia_cb_suspended(int); 305 extern void pcmcia_cb_resumed(int); 306 307 static int pcic_callback(dev_info_t *, int (*)(), int); 308 static int pcic_inquire_adapter(dev_info_t *, inquire_adapter_t *); 309 static int pcic_get_adapter(dev_info_t *, get_adapter_t *); 310 static int pcic_get_page(dev_info_t *, get_page_t *); 311 static int pcic_get_socket(dev_info_t *, get_socket_t *); 312 static int pcic_get_status(dev_info_t *, get_ss_status_t *); 313 static int pcic_get_window(dev_info_t *, get_window_t *); 314 static int pcic_inquire_socket(dev_info_t *, inquire_socket_t *); 315 static int pcic_inquire_window(dev_info_t *, inquire_window_t *); 316 static int pcic_reset_socket(dev_info_t *, int, int); 317 static int pcic_set_page(dev_info_t *, set_page_t *); 318 static int pcic_set_window(dev_info_t *, set_window_t *); 319 static int pcic_set_socket(dev_info_t *, set_socket_t *); 320 static int pcic_set_interrupt(dev_info_t *, set_irq_handler_t *); 321 static int pcic_clear_interrupt(dev_info_t *, clear_irq_handler_t *); 322 static void pcic_pm_detection(void *); 323 static void pcic_iomem_pci_ctl(ddi_acc_handle_t, uchar_t *, unsigned); 324 static int clext_reg_read(pcicdev_t *, int, uchar_t); 325 static void clext_reg_write(pcicdev_t *, int, uchar_t, uchar_t); 326 static int pcic_calc_speed(pcicdev_t *, uint32_t); 327 static int pcic_card_state(pcicdev_t *, pcic_socket_t *); 328 static int pcic_find_pci_type(pcicdev_t *); 329 static void pcic_82092_smiirq_ctl(pcicdev_t *, int, int, int); 330 static void pcic_handle_cd_change(pcicdev_t *, pcic_socket_t *, uint8_t); 331 static uint_t pcic_cd_softint(caddr_t, caddr_t); 332 static uint8_t pcic_getb(pcicdev_t *, int, int); 333 static void pcic_putb(pcicdev_t *, int, int, int8_t); 334 static int pcic_set_vcc_level(pcicdev_t *, set_socket_t *); 335 static uint_t pcic_softintr(caddr_t, caddr_t); 336 337 static void pcic_debounce(pcic_socket_t *); 338 static void pcic_do_resume(pcicdev_t *); 339 static void *pcic_add_debqueue(pcic_socket_t *, int); 340 static void pcic_rm_debqueue(void *); 341 static void pcic_deb_thread(); 342 343 static boolean_t pcic_load_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp); 344 static void pcic_unload_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp); 345 static uint32_t pcic_getcb(pcicdev_t *pcic, int reg); 346 static void pcic_putcb(pcicdev_t *pcic, int reg, uint32_t value); 347 static void pcic_cb_enable_intr(dev_info_t *); 348 static void pcic_cb_disable_intr(dev_info_t *); 349 static void pcic_enable_io_intr(pcicdev_t *pcic, int socket, int irq); 350 static void pcic_disable_io_intr(pcicdev_t *pcic, int socket); 351 352 static cb_nexus_cb_t pcic_cbnexus_ops = { 353 pcic_cb_enable_intr, 354 pcic_cb_disable_intr 355 }; 356 357 static int pcic_exca_powerctl(pcicdev_t *pcic, int socket, int powerlevel); 358 static int pcic_cbus_powerctl(pcicdev_t *pcic, int socket); 359 360 #if defined(__sparc) 361 static int pcic_fault(enum pci_fault_ops op, void *arg); 362 #endif 363 364 365 /* 366 * pcmcia interface operations structure 367 * this is the private interface that is exported to the nexus 368 */ 369 pcmcia_if_t pcic_if_ops = { 370 PCIF_MAGIC, 371 PCIF_VERSION, 372 pcic_callback, 373 pcic_get_adapter, 374 pcic_get_page, 375 pcic_get_socket, 376 pcic_get_status, 377 pcic_get_window, 378 pcic_inquire_adapter, 379 pcic_inquire_socket, 380 pcic_inquire_window, 381 pcic_reset_socket, 382 pcic_set_page, 383 pcic_set_window, 384 pcic_set_socket, 385 pcic_set_interrupt, 386 pcic_clear_interrupt, 387 NULL, 388 }; 389 390 /* 391 * chip type identification routines 392 * this list of functions is searched until one of them succeeds 393 * or all fail. i82365SL is assumed if failed. 394 */ 395 static int pcic_ci_cirrus(pcicdev_t *); 396 static int pcic_ci_vadem(pcicdev_t *); 397 static int pcic_ci_ricoh(pcicdev_t *); 398 399 int (*pcic_ci_funcs[])(pcicdev_t *) = { 400 pcic_ci_cirrus, 401 pcic_ci_vadem, 402 pcic_ci_ricoh, 403 NULL 404 }; 405 406 static struct modldrv modldrv = { 407 &mod_driverops, /* Type of module. This one is a driver */ 408 "PCIC PCMCIA adapter driver", /* Name of the module. */ 409 &pcic_devops, /* driver ops */ 410 }; 411 412 static struct modlinkage modlinkage = { 413 MODREV_1, (void *)&modldrv, NULL 414 }; 415 416 int 417 _init() 418 { 419 int stat; 420 421 /* Allocate soft state */ 422 if ((stat = ddi_soft_state_init(&pcic_soft_state_p, 423 SOFTC_SIZE, 2)) != DDI_SUCCESS) 424 return (stat); 425 426 if ((stat = mod_install(&modlinkage)) != 0) 427 ddi_soft_state_fini(&pcic_soft_state_p); 428 429 return (stat); 430 } 431 432 int 433 _fini() 434 { 435 int stat = 0; 436 437 if ((stat = mod_remove(&modlinkage)) != 0) 438 return (stat); 439 440 if (pcic_deb_threadid) { 441 mutex_enter(&pcic_deb_mtx); 442 pcic_deb_threadid = 0; 443 while (!pcic_deb_threadid) 444 cv_wait(&pcic_deb_cv, &pcic_deb_mtx); 445 pcic_deb_threadid = 0; 446 mutex_exit(&pcic_deb_mtx); 447 448 mutex_destroy(&pcic_deb_mtx); 449 cv_destroy(&pcic_deb_cv); 450 } 451 452 ddi_soft_state_fini(&pcic_soft_state_p); 453 454 return (stat); 455 } 456 457 int 458 _info(struct modinfo *modinfop) 459 { 460 return (mod_info(&modlinkage, modinfop)); 461 } 462 463 /* 464 * pcic_getinfo() 465 * provide instance/device information about driver 466 */ 467 /*ARGSUSED*/ 468 static int 469 pcic_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **result) 470 { 471 anp_t *anp; 472 int error = DDI_SUCCESS; 473 minor_t minor; 474 475 switch (cmd) { 476 case DDI_INFO_DEVT2DEVINFO: 477 minor = getminor((dev_t)arg); 478 minor &= 0x7f; 479 if (!(anp = ddi_get_soft_state(pcic_soft_state_p, minor))) 480 *result = NULL; 481 else 482 *result = anp->an_dip; 483 break; 484 case DDI_INFO_DEVT2INSTANCE: 485 minor = getminor((dev_t)arg); 486 minor &= 0x7f; 487 *result = (void *)((long)minor); 488 break; 489 default: 490 error = DDI_FAILURE; 491 break; 492 } 493 return (error); 494 } 495 496 static int 497 pcic_probe(dev_info_t *dip) 498 { 499 int value; 500 ddi_device_acc_attr_t attr; 501 ddi_acc_handle_t handle; 502 uchar_t *index, *data; 503 504 if (ddi_dev_is_sid(dip) == DDI_SUCCESS) 505 return (DDI_PROBE_DONTCARE); 506 507 /* 508 * find a PCIC device (any vendor) 509 * while there can be up to 4 such devices in 510 * a system, we currently only look for 1 511 * per probe. There will be up to 2 chips per 512 * instance since they share I/O space 513 */ 514 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 515 attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC; 516 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 517 518 if (ddi_regs_map_setup(dip, PCIC_ISA_CONTROL_REG_NUM, 519 (caddr_t *)&index, 520 PCIC_ISA_CONTROL_REG_OFFSET, 521 PCIC_ISA_CONTROL_REG_LENGTH, 522 &attr, &handle) != DDI_SUCCESS) 523 return (DDI_PROBE_FAILURE); 524 525 data = index + 1; 526 527 #if defined(PCIC_DEBUG) 528 if (pcic_debug) 529 cmn_err(CE_CONT, "pcic_probe: entered\n"); 530 if (pcic_debug) 531 cmn_err(CE_CONT, "\tindex=%p\n", (void *)index); 532 #endif 533 ddi_put8(handle, index, PCIC_CHIP_REVISION); 534 ddi_put8(handle, data, 0); 535 value = ddi_get8(handle, data); 536 #if defined(PCIC_DEBUG) 537 if (pcic_debug) 538 cmn_err(CE_CONT, "\tchip revision register = %x\n", value); 539 #endif 540 if ((value & PCIC_REV_MASK) >= PCIC_REV_LEVEL_LOW && 541 (value & 0x30) == 0) { 542 /* 543 * we probably have a PCIC chip in the system 544 * do a little more checking. If we find one, 545 * reset everything in case of softboot 546 */ 547 ddi_put8(handle, index, PCIC_MAPPING_ENABLE); 548 ddi_put8(handle, data, 0); 549 value = ddi_get8(handle, data); 550 #if defined(PCIC_DEBUG) 551 if (pcic_debug) 552 cmn_err(CE_CONT, "\tzero test = %x\n", value); 553 #endif 554 /* should read back as zero */ 555 if (value == 0) { 556 /* 557 * we do have one and it is off the bus 558 */ 559 #if defined(PCIC_DEBUG) 560 if (pcic_debug) 561 cmn_err(CE_CONT, "pcic_probe: success\n"); 562 #endif 563 ddi_regs_map_free(&handle); 564 return (DDI_PROBE_SUCCESS); 565 } 566 } 567 #if defined(PCIC_DEBUG) 568 if (pcic_debug) 569 cmn_err(CE_CONT, "pcic_probe: failed\n"); 570 #endif 571 ddi_regs_map_free(&handle); 572 return (DDI_PROBE_FAILURE); 573 } 574 575 /* 576 * These are just defaults they can also be changed via a property in the 577 * conf file. 578 */ 579 static int pci_config_reg_num = PCIC_PCI_CONFIG_REG_NUM; 580 static int pci_control_reg_num = PCIC_PCI_CONTROL_REG_NUM; 581 static int pcic_do_pcmcia_sr = 1; 582 static int pcic_use_cbpwrctl = PCF_CBPWRCTL; 583 584 /* 585 * enable insertion/removal interrupt for 32bit cards 586 */ 587 static int 588 cardbus_enable_cd_intr(dev_info_t *dip) 589 { 590 ddi_acc_handle_t iohandle; 591 caddr_t ioaddr; 592 ddi_device_acc_attr_t attr; 593 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 594 attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC; 595 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 596 (void) ddi_regs_map_setup(dip, 1, 597 (caddr_t *)&ioaddr, 598 0, 599 4096, 600 &attr, &iohandle); 601 602 /* CSC Interrupt: Card detect interrupt on */ 603 ddi_put32(iohandle, (uint32_t *)(ioaddr+CB_STATUS_MASK), 604 ddi_get32(iohandle, 605 (uint32_t *)(ioaddr+CB_STATUS_MASK)) | CB_SE_CCDMASK); 606 607 ddi_put32(iohandle, (uint32_t *)(ioaddr+CB_STATUS_EVENT), 608 ddi_get32(iohandle, (uint32_t *)(ioaddr+CB_STATUS_EVENT))); 609 610 ddi_regs_map_free(&iohandle); 611 return (1); 612 } 613 614 /* 615 * quiesce(9E) entry point. 616 * 617 * This function is called when the system is single-threaded at high 618 * PIL with preemption disabled. Therefore, this function must not be 619 * blocked. 620 * 621 * This function returns DDI_SUCCESS on success, or DDI_FAILURE on failure. 622 * DDI_FAILURE indicates an error condition and should almost never happen. 623 */ 624 static int32_t 625 pcic_quiesce(dev_info_t *dip) 626 { 627 anp_t *anp = ddi_get_driver_private(dip); 628 pcicdev_t *pcic = anp->an_private; 629 int i; 630 631 for (i = 0; i < pcic->pc_numsockets; i++) { 632 pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 0); 633 pcic_putb(pcic, i, PCIC_CARD_DETECT, 0); 634 pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0); 635 /* disable interrupts and put card into RESET */ 636 pcic_putb(pcic, i, PCIC_INTERRUPT, 0); 637 /* poweroff socket */ 638 pcic_putb(pcic, i, PCIC_POWER_CONTROL, 0); 639 pcic_putcb(pcic, CB_CONTROL, 0); 640 } 641 642 return (DDI_SUCCESS); 643 } 644 645 /* 646 * pcic_attach() 647 * attach the PCIC (Intel 82365SL/CirrusLogic/Toshiba) driver 648 * to the system. This is a child of "sysbus" since that is where 649 * the hardware lives, but it provides services to the "pcmcia" 650 * nexus driver. It gives a pointer back via its private data 651 * structure which contains both the dip and socket services entry 652 * points 653 */ 654 static int 655 pcic_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) 656 { 657 anp_t *pcic_nexus; 658 pcicdev_t *pcic; 659 int irqlevel, value; 660 int pci_cfrn, pci_ctrn; 661 int i, j, smi, actual; 662 char *typename; 663 char bus_type[16] = "(unknown)"; 664 int len = sizeof (bus_type); 665 ddi_device_acc_attr_t attr; 666 anp_t *anp = ddi_get_driver_private(dip); 667 uint_t pri; 668 669 #if defined(PCIC_DEBUG) 670 if (pcic_debug) { 671 cmn_err(CE_CONT, "pcic_attach: entered\n"); 672 } 673 #endif 674 switch (cmd) { 675 case DDI_ATTACH: 676 break; 677 case DDI_RESUME: 678 pcic = anp->an_private; 679 /* 680 * for now, this is a simulated resume. 681 * a real one may need different things. 682 */ 683 if (pcic != NULL && pcic->pc_flags & PCF_SUSPENDED) { 684 mutex_enter(&pcic->pc_lock); 685 /* should probe for new sockets showing up */ 686 pcic_setup_adapter(pcic); 687 pcic->pc_flags &= ~PCF_SUSPENDED; 688 mutex_exit(&pcic->pc_lock); 689 (void) pcmcia_begin_resume(dip); 690 691 pcic_do_resume(pcic); 692 #ifdef CARDBUS 693 cardbus_restore_children(ddi_get_child(dip)); 694 #endif 695 696 /* 697 * for complete implementation need END_RESUME (later) 698 */ 699 return (DDI_SUCCESS); 700 701 } 702 return (DDI_SUCCESS); 703 default: 704 return (DDI_FAILURE); 705 } 706 707 /* 708 * Allocate soft state associated with this instance. 709 */ 710 if (ddi_soft_state_zalloc(pcic_soft_state_p, 711 ddi_get_instance(dip)) != DDI_SUCCESS) { 712 cmn_err(CE_CONT, "pcic%d: Unable to alloc state\n", 713 ddi_get_instance(dip)); 714 return (DDI_FAILURE); 715 } 716 717 pcic_nexus = ddi_get_soft_state(pcic_soft_state_p, 718 ddi_get_instance(dip)); 719 720 pcic = kmem_zalloc(sizeof (pcicdev_t), KM_SLEEP); 721 722 pcic->dip = dip; 723 pcic_nexus->an_dip = dip; 724 pcic_nexus->an_if = &pcic_if_ops; 725 pcic_nexus->an_private = pcic; 726 pcic->pc_numpower = sizeof (pcic_power)/sizeof (pcic_power[0]); 727 pcic->pc_power = pcic_power; 728 729 pci_ctrn = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP, 730 "pci-control-reg-number", pci_control_reg_num); 731 pci_cfrn = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP, 732 "pci-config-reg-number", pci_config_reg_num); 733 734 ddi_set_driver_private(dip, pcic_nexus); 735 736 /* 737 * pcic->pc_irq is really the IPL level we want to run at 738 * set the default values here and override from intr spec 739 */ 740 pcic->pc_irq = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP, 741 "interrupt-priorities", -1); 742 743 if (pcic->pc_irq == -1) { 744 int actual; 745 uint_t pri; 746 ddi_intr_handle_t hdl; 747 748 /* see if intrspec tells us different */ 749 if (ddi_intr_alloc(dip, &hdl, DDI_INTR_TYPE_FIXED, 750 0, 1, &actual, DDI_INTR_ALLOC_NORMAL) == DDI_SUCCESS) { 751 if (ddi_intr_get_pri(hdl, &pri) == DDI_SUCCESS) 752 pcic->pc_irq = pri; 753 else 754 pcic->pc_irq = LOCK_LEVEL + 1; 755 (void) ddi_intr_free(hdl); 756 } 757 } 758 pcic_nexus->an_ipl = pcic->pc_irq; 759 760 /* 761 * Check our parent bus type. We do different things based on which 762 * bus we're on. 763 */ 764 if (ddi_prop_op(DDI_DEV_T_ANY, ddi_get_parent(dip), 765 PROP_LEN_AND_VAL_BUF, DDI_PROP_CANSLEEP, 766 "device_type", (caddr_t)&bus_type[0], &len) != 767 DDI_PROP_SUCCESS) { 768 if (ddi_prop_op(DDI_DEV_T_ANY, ddi_get_parent(dip), 769 PROP_LEN_AND_VAL_BUF, DDI_PROP_CANSLEEP, 770 "bus-type", (caddr_t)&bus_type[0], &len) != 771 DDI_PROP_SUCCESS) { 772 773 cmn_err(CE_CONT, 774 "pcic%d: can't find parent bus type\n", 775 ddi_get_instance(dip)); 776 777 kmem_free(pcic, sizeof (pcicdev_t)); 778 ddi_soft_state_free(pcic_soft_state_p, 779 ddi_get_instance(dip)); 780 return (DDI_FAILURE); 781 } 782 } /* ddi_prop_op("device_type") */ 783 784 if (strcmp(bus_type, DEVI_PCI_NEXNAME) == 0 || 785 strcmp(bus_type, DEVI_PCIEX_NEXNAME) == 0) { 786 pcic->pc_flags = PCF_PCIBUS; 787 } else { 788 cmn_err(CE_WARN, "!pcic%d: non-pci mode (%s) not supported, " 789 "set BIOS to yenta mode if applicable\n", 790 ddi_get_instance(dip), bus_type); 791 kmem_free(pcic, sizeof (pcicdev_t)); 792 ddi_soft_state_free(pcic_soft_state_p, 793 ddi_get_instance(dip)); 794 return (DDI_FAILURE); 795 } 796 797 if ((pcic->bus_speed = ddi_getprop(DDI_DEV_T_ANY, ddi_get_parent(dip), 798 DDI_PROP_CANSLEEP, 799 "clock-frequency", 0)) == 0) { 800 if (pcic->pc_flags & PCF_PCIBUS) 801 pcic->bus_speed = PCIC_PCI_DEF_SYSCLK; 802 else 803 pcic->bus_speed = PCIC_ISA_DEF_SYSCLK; 804 } else { 805 /* 806 * OBP can declare the speed in Hz... 807 */ 808 if (pcic->bus_speed > 1000000) 809 pcic->bus_speed /= 1000000; 810 } /* ddi_prop_op("clock-frequency") */ 811 812 pcic->pc_io_type = PCIC_IO_TYPE_82365SL; /* default mode */ 813 814 #ifdef PCIC_DEBUG 815 if (pcic_debug) { 816 cmn_err(CE_CONT, 817 "pcic%d: parent bus type = [%s], speed = %d MHz\n", 818 ddi_get_instance(dip), 819 bus_type, pcic->bus_speed); 820 } 821 #endif 822 823 /* 824 * The reg properties on a PCI node are different than those 825 * on a non-PCI node. Handle that difference here. 826 * If it turns out to be a CardBus chip, we have even more 827 * differences. 828 */ 829 if (pcic->pc_flags & PCF_PCIBUS) { 830 int class_code; 831 #if defined(__i386) || defined(__amd64) 832 pcic->pc_base = 0x1000000; 833 pcic->pc_bound = (uint32_t)~0; 834 pcic->pc_iobase = 0x1000; 835 pcic->pc_iobound = 0xefff; 836 #elif defined(__sparc) 837 pcic->pc_base = 0x0; 838 pcic->pc_bound = (uint32_t)~0; 839 pcic->pc_iobase = 0x00000; 840 pcic->pc_iobound = 0xffff; 841 #endif 842 843 /* usually need to get at config space so map first */ 844 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 845 attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC; 846 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 847 848 if (ddi_regs_map_setup(dip, pci_cfrn, 849 (caddr_t *)&pcic->cfgaddr, 850 PCIC_PCI_CONFIG_REG_OFFSET, 851 PCIC_PCI_CONFIG_REG_LENGTH, 852 &attr, 853 &pcic->cfg_handle) != 854 DDI_SUCCESS) { 855 cmn_err(CE_CONT, 856 "pcic%d: unable to map config space" 857 "regs\n", 858 ddi_get_instance(dip)); 859 860 kmem_free(pcic, sizeof (pcicdev_t)); 861 return (DDI_FAILURE); 862 } /* ddi_regs_map_setup */ 863 864 class_code = ddi_getprop(DDI_DEV_T_ANY, dip, 865 DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS, 866 "class-code", -1); 867 #ifdef PCIC_DEBUG 868 if (pcic_debug) { 869 cmn_err(CE_CONT, "pcic_attach class_code=%x\n", 870 class_code); 871 } 872 #endif 873 874 switch (class_code) { 875 case PCIC_PCI_CARDBUS: 876 pcic->pc_flags |= PCF_CARDBUS; 877 pcic->pc_io_type = PCIC_IO_TYPE_YENTA; 878 /* 879 * Get access to the adapter registers on the 880 * PCI bus. A 4K memory page 881 */ 882 #if defined(PCIC_DEBUG) 883 pcic_err(dip, 8, "Is Cardbus device\n"); 884 if (pcic_debug) { 885 int nr; 886 long rs; 887 (void) ddi_dev_nregs(dip, &nr); 888 pcic_err(dip, 9, "\tdev, cfgaddr 0x%p," 889 "cfghndl 0x%p nregs %d", 890 (void *)pcic->cfgaddr, 891 (void *)pcic->cfg_handle, nr); 892 893 (void) ddi_dev_regsize(dip, 894 PCIC_PCI_CONTROL_REG_NUM, &rs); 895 896 pcic_err(dip, 9, "\tsize of reg %d is 0x%x\n", 897 PCIC_PCI_CONTROL_REG_NUM, (int)rs); 898 } 899 #endif 900 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 901 attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC; 902 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 903 904 if (ddi_regs_map_setup(dip, pci_ctrn, 905 (caddr_t *)&pcic->ioaddr, 906 PCIC_PCI_CONTROL_REG_OFFSET, 907 PCIC_CB_CONTROL_REG_LENGTH, 908 &attr, &pcic->handle) != 909 DDI_SUCCESS) { 910 cmn_err(CE_CONT, 911 "pcic%d: unable to map PCI regs\n", 912 ddi_get_instance(dip)); 913 ddi_regs_map_free(&pcic->cfg_handle); 914 kmem_free(pcic, sizeof (pcicdev_t)); 915 return (DDI_FAILURE); 916 } /* ddi_regs_map_setup */ 917 918 /* 919 * Find out the chip type - If we're on a PCI bus, 920 * the adapter has that information in the PCI 921 * config space. 922 * Note that we call pcic_find_pci_type here since 923 * it needs a valid mapped pcic->handle to 924 * access some of the adapter registers in 925 * some cases. 926 */ 927 if (pcic_find_pci_type(pcic) != DDI_SUCCESS) { 928 ddi_regs_map_free(&pcic->handle); 929 ddi_regs_map_free(&pcic->cfg_handle); 930 kmem_free(pcic, sizeof (pcicdev_t)); 931 cmn_err(CE_WARN, "pcic: %s: unsupported " 932 "bridge\n", ddi_get_name_addr(dip)); 933 return (DDI_FAILURE); 934 } 935 break; 936 937 default: 938 case PCIC_PCI_PCMCIA: 939 /* 940 * Get access to the adapter IO registers on the 941 * PCI bus config space. 942 */ 943 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 944 attr.devacc_attr_endian_flags = DDI_STRUCTURE_LE_ACC; 945 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 946 947 /* 948 * We need a default mapping to the adapter's IO 949 * control register space. For most adapters 950 * that are of class PCIC_PCI_PCMCIA (or of 951 * a default class) the control registers 952 * will be using the 82365-type control/data 953 * format. 954 */ 955 if (ddi_regs_map_setup(dip, pci_ctrn, 956 (caddr_t *)&pcic->ioaddr, 957 PCIC_PCI_CONTROL_REG_OFFSET, 958 PCIC_PCI_CONTROL_REG_LENGTH, 959 &attr, 960 &pcic->handle) != DDI_SUCCESS) { 961 cmn_err(CE_CONT, 962 "pcic%d: unable to map PCI regs\n", 963 ddi_get_instance(dip)); 964 ddi_regs_map_free(&pcic->cfg_handle); 965 kmem_free(pcic, sizeof (pcicdev_t)); 966 return (DDI_FAILURE); 967 } /* ddi_regs_map_setup */ 968 969 /* 970 * Find out the chip type - If we're on a PCI bus, 971 * the adapter has that information in the PCI 972 * config space. 973 * Note that we call pcic_find_pci_type here since 974 * it needs a valid mapped pcic->handle to 975 * access some of the adapter registers in 976 * some cases. 977 */ 978 if (pcic_find_pci_type(pcic) != DDI_SUCCESS) { 979 ddi_regs_map_free(&pcic->handle); 980 ddi_regs_map_free(&pcic->cfg_handle); 981 kmem_free(pcic, sizeof (pcicdev_t)); 982 cmn_err(CE_WARN, "pcic: %s: unsupported " 983 "bridge\n", 984 ddi_get_name_addr(dip)); 985 return (DDI_FAILURE); 986 } 987 988 /* 989 * Some PCI-PCMCIA(R2) adapters are Yenta-compliant 990 * for extended registers even though they are 991 * not CardBus adapters. For those adapters, 992 * re-map pcic->handle to be large enough to 993 * encompass the Yenta registers. 994 */ 995 switch (pcic->pc_type) { 996 case PCIC_TI_PCI1031: 997 ddi_regs_map_free(&pcic->handle); 998 999 if (ddi_regs_map_setup(dip, 1000 PCIC_PCI_CONTROL_REG_NUM, 1001 (caddr_t *)&pcic->ioaddr, 1002 PCIC_PCI_CONTROL_REG_OFFSET, 1003 PCIC_CB_CONTROL_REG_LENGTH, 1004 &attr, 1005 &pcic->handle) != DDI_SUCCESS) { 1006 cmn_err(CE_CONT, 1007 "pcic%d: unable to map " 1008 "PCI regs\n", 1009 ddi_get_instance(dip)); 1010 ddi_regs_map_free(&pcic->cfg_handle); 1011 kmem_free(pcic, sizeof (pcicdev_t)); 1012 return (DDI_FAILURE); 1013 } /* ddi_regs_map_setup */ 1014 break; 1015 default: 1016 break; 1017 } /* switch (pcic->pc_type) */ 1018 break; 1019 } /* switch (class_code) */ 1020 } else { 1021 /* 1022 * We're not on a PCI bus, so assume an ISA bus type 1023 * register property. Get access to the adapter IO 1024 * registers on a non-PCI bus. 1025 */ 1026 attr.devacc_attr_version = DDI_DEVICE_ATTR_V0; 1027 attr.devacc_attr_endian_flags = DDI_NEVERSWAP_ACC; 1028 attr.devacc_attr_dataorder = DDI_STRICTORDER_ACC; 1029 pcic->mem_reg_num = PCIC_ISA_MEM_REG_NUM; 1030 pcic->io_reg_num = PCIC_ISA_IO_REG_NUM; 1031 1032 if (ddi_regs_map_setup(dip, PCIC_ISA_CONTROL_REG_NUM, 1033 (caddr_t *)&pcic->ioaddr, 1034 PCIC_ISA_CONTROL_REG_OFFSET, 1035 PCIC_ISA_CONTROL_REG_LENGTH, 1036 &attr, 1037 &pcic->handle) != DDI_SUCCESS) { 1038 cmn_err(CE_CONT, 1039 "pcic%d: unable to map ISA registers\n", 1040 ddi_get_instance(dip)); 1041 1042 kmem_free(pcic, sizeof (pcicdev_t)); 1043 return (DDI_FAILURE); 1044 } /* ddi_regs_map_setup */ 1045 1046 /* ISA bus is limited to 24-bits, but not first 640K */ 1047 pcic->pc_base = 0xd0000; 1048 pcic->pc_bound = (uint32_t)~0; 1049 pcic->pc_iobase = 0x1000; 1050 pcic->pc_iobound = 0xefff; 1051 } /* !PCF_PCIBUS */ 1052 1053 #ifdef PCIC_DEBUG 1054 if (pcic_debug) { 1055 cmn_err(CE_CONT, "pcic_attach pc_flags=%x pc_type=%x\n", 1056 pcic->pc_flags, pcic->pc_type); 1057 } 1058 #endif 1059 1060 /* 1061 * Setup various adapter registers for the PCI case. For the 1062 * non-PCI case, find out the chip type. 1063 */ 1064 if (pcic->pc_flags & PCF_PCIBUS) { 1065 int iline; 1066 #if defined(__sparc) 1067 iline = 0; 1068 #else 1069 iline = cardbus_validate_iline(dip, pcic->cfg_handle); 1070 #endif 1071 1072 /* set flags and socket counts based on chip type */ 1073 switch (pcic->pc_type) { 1074 uint32_t cfg; 1075 case PCIC_INTEL_i82092: 1076 cfg = ddi_get8(pcic->cfg_handle, 1077 pcic->cfgaddr + PCIC_82092_PCICON); 1078 /* we can only support 4 Socket version */ 1079 if (cfg & PCIC_82092_4_SOCKETS) { 1080 pcic->pc_numsockets = 4; 1081 pcic->pc_type = PCIC_INTEL_i82092; 1082 if (iline != 0xFF) 1083 pcic->pc_intr_mode = 1084 PCIC_INTR_MODE_PCI_1; 1085 else 1086 pcic->pc_intr_mode = PCIC_INTR_MODE_ISA; 1087 } else { 1088 cmn_err(CE_CONT, 1089 "pcic%d: Intel 82092 adapter " 1090 "in unsupported configuration: 0x%x", 1091 ddi_get_instance(pcic->dip), cfg); 1092 pcic->pc_numsockets = 0; 1093 } /* PCIC_82092_4_SOCKETS */ 1094 break; 1095 case PCIC_CL_PD6730: 1096 case PCIC_CL_PD6729: 1097 pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1; 1098 cfg = ddi_getprop(DDI_DEV_T_ANY, dip, 1099 DDI_PROP_CANSLEEP, 1100 "interrupts", 0); 1101 /* if not interrupt pin then must use ISA style IRQs */ 1102 if (cfg == 0 || iline == 0xFF) 1103 pcic->pc_intr_mode = PCIC_INTR_MODE_ISA; 1104 else { 1105 /* 1106 * we have the option to use PCI interrupts. 1107 * this might not be optimal but in some cases 1108 * is the only thing possible (sparc case). 1109 * we now deterine what is possible. 1110 */ 1111 pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1; 1112 } 1113 pcic->pc_numsockets = 2; 1114 pcic->pc_flags |= PCF_IO_REMAP; 1115 break; 1116 case PCIC_TI_PCI1031: 1117 /* this chip doesn't do CardBus but looks like one */ 1118 pcic->pc_flags &= ~PCF_CARDBUS; 1119 /* FALLTHROUGH */ 1120 default: 1121 pcic->pc_flags |= PCF_IO_REMAP; 1122 /* FALLTHROUGH */ 1123 /* indicate feature even if not supported */ 1124 pcic->pc_flags |= PCF_DMA | PCF_ZV; 1125 /* Not sure if these apply to all these chips */ 1126 pcic->pc_flags |= (PCF_VPPX|PCF_33VCAP); 1127 pcic->pc_flags |= pcic_use_cbpwrctl; 1128 1129 pcic->pc_numsockets = 1; /* one per function */ 1130 if (iline != 0xFF) { 1131 uint8_t cfg; 1132 pcic->pc_intr_mode = PCIC_INTR_MODE_PCI_1; 1133 1134 cfg = ddi_get8(pcic->cfg_handle, 1135 (pcic->cfgaddr + PCIC_BRIDGE_CTL_REG)); 1136 cfg &= (~PCIC_FUN_INT_MOD_ISA); 1137 ddi_put8(pcic->cfg_handle, (pcic->cfgaddr + 1138 PCIC_BRIDGE_CTL_REG), cfg); 1139 } 1140 else 1141 pcic->pc_intr_mode = PCIC_INTR_MODE_ISA; 1142 pcic->pc_io_type = PCIC_IOTYPE_YENTA; 1143 break; 1144 } 1145 } else { 1146 /* 1147 * We're not on a PCI bus so do some more 1148 * checking for adapter type here. 1149 * For the non-PCI bus case: 1150 * It could be any one of a number of different chips 1151 * If we can't determine anything else, it is assumed 1152 * to be an Intel 82365SL. The Cirrus Logic PD6710 1153 * has an extension register that provides unique 1154 * identification. Toshiba chip isn't detailed as yet. 1155 */ 1156 1157 /* Init the CL id mode */ 1158 pcic_putb(pcic, 0, PCIC_CHIP_INFO, 0); 1159 value = pcic_getb(pcic, 0, PCIC_CHIP_INFO); 1160 1161 /* default to Intel i82365SL and then refine */ 1162 pcic->pc_type = PCIC_I82365SL; 1163 pcic->pc_chipname = PCIC_TYPE_I82365SL; 1164 for (value = 0; pcic_ci_funcs[value] != NULL; value++) { 1165 /* go until one succeeds or none left */ 1166 if (pcic_ci_funcs[value](pcic)) 1167 break; 1168 } 1169 1170 /* any chip specific flags get set here */ 1171 switch (pcic->pc_type) { 1172 case PCIC_CL_PD6722: 1173 pcic->pc_flags |= PCF_DMA; 1174 } 1175 1176 for (i = 0; i < PCIC_MAX_SOCKETS; i++) { 1177 /* 1178 * look for total number of sockets. 1179 * basically check each possible socket for 1180 * presence like in probe 1181 */ 1182 1183 /* turn all windows off */ 1184 pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0); 1185 value = pcic_getb(pcic, i, PCIC_MAPPING_ENABLE); 1186 1187 /* 1188 * if a zero is read back, then this socket 1189 * might be present. It would be except for 1190 * some systems that map the secondary PCIC 1191 * chip space back to the first. 1192 */ 1193 if (value != 0) { 1194 /* definitely not so skip */ 1195 /* note: this is for Compaq support */ 1196 continue; 1197 } 1198 1199 /* further tests */ 1200 value = pcic_getb(pcic, i, PCIC_CHIP_REVISION) & 1201 PCIC_REV_MASK; 1202 if (!(value >= PCIC_REV_LEVEL_LOW && 1203 value <= PCIC_REV_LEVEL_HI)) 1204 break; 1205 1206 pcic_putb(pcic, i, PCIC_SYSMEM_0_STARTLOW, 0xaa); 1207 pcic_putb(pcic, i, PCIC_SYSMEM_1_STARTLOW, 0x55); 1208 value = pcic_getb(pcic, i, PCIC_SYSMEM_0_STARTLOW); 1209 1210 j = pcic_getb(pcic, i, PCIC_SYSMEM_1_STARTLOW); 1211 if (value != 0xaa || j != 0x55) 1212 break; 1213 1214 /* 1215 * at this point we know if we have hardware 1216 * of some type and not just the bus holding 1217 * a pattern for us. We still have to determine 1218 * the case where more than 2 sockets are 1219 * really the same due to peculiar mappings of 1220 * hardware. 1221 */ 1222 j = pcic->pc_numsockets++; 1223 pcic->pc_sockets[j].pcs_flags = 0; 1224 pcic->pc_sockets[j].pcs_io = pcic->ioaddr; 1225 pcic->pc_sockets[j].pcs_socket = i; 1226 1227 /* put PC Card into RESET, just in case */ 1228 value = pcic_getb(pcic, i, PCIC_INTERRUPT); 1229 pcic_putb(pcic, i, PCIC_INTERRUPT, 1230 value & ~PCIC_RESET); 1231 } 1232 1233 #if defined(PCIC_DEBUG) 1234 if (pcic_debug) 1235 cmn_err(CE_CONT, "num sockets = %d\n", 1236 pcic->pc_numsockets); 1237 #endif 1238 if (pcic->pc_numsockets == 0) { 1239 ddi_regs_map_free(&pcic->handle); 1240 kmem_free(pcic, sizeof (pcicdev_t)); 1241 return (DDI_FAILURE); 1242 } 1243 1244 /* 1245 * need to think this through again in light of 1246 * Compaq not following the model that all the 1247 * chip vendors recommend. IBM 755 seems to be 1248 * afflicted as well. Basically, if the vendor 1249 * wired things wrong, socket 0 responds for socket 2 1250 * accesses, etc. 1251 */ 1252 if (pcic->pc_numsockets > 2) { 1253 int count = pcic->pc_numsockets / 4; 1254 for (i = 0; i < count; i++) { 1255 /* put pattern into socket 0 */ 1256 pcic_putb(pcic, i, 1257 PCIC_SYSMEM_0_STARTLOW, 0x11); 1258 1259 /* put pattern into socket 2 */ 1260 pcic_putb(pcic, i + 2, 1261 PCIC_SYSMEM_0_STARTLOW, 0x33); 1262 1263 /* read back socket 0 */ 1264 value = pcic_getb(pcic, i, 1265 PCIC_SYSMEM_0_STARTLOW); 1266 1267 /* read back chip 1 socket 0 */ 1268 j = pcic_getb(pcic, i + 2, 1269 PCIC_SYSMEM_0_STARTLOW); 1270 if (j == value) { 1271 pcic->pc_numsockets -= 2; 1272 } 1273 } 1274 } 1275 1276 smi = 0xff; /* no more override */ 1277 1278 if (ddi_getprop(DDI_DEV_T_NONE, dip, 1279 DDI_PROP_DONTPASS, "need-mult-irq", 1280 0xffff) != 0xffff) 1281 pcic->pc_flags |= PCF_MULT_IRQ; 1282 1283 } /* !PCF_PCIBUS */ 1284 1285 /* 1286 * some platforms/busses need to have resources setup 1287 * this is temporary until a real resource allocator is 1288 * implemented. 1289 */ 1290 1291 pcic_init_assigned(dip); 1292 1293 typename = pcic->pc_chipname; 1294 1295 #ifdef PCIC_DEBUG 1296 if (pcic_debug) { 1297 int nregs, nintrs; 1298 1299 if (ddi_dev_nregs(dip, &nregs) != DDI_SUCCESS) 1300 nregs = 0; 1301 1302 if (ddi_dev_nintrs(dip, &nintrs) != DDI_SUCCESS) 1303 nintrs = 0; 1304 1305 cmn_err(CE_CONT, 1306 "pcic%d: %d register sets, %d interrupts\n", 1307 ddi_get_instance(dip), nregs, nintrs); 1308 1309 nintrs = 0; 1310 while (nregs--) { 1311 off_t size; 1312 1313 if (ddi_dev_regsize(dip, nintrs, &size) == 1314 DDI_SUCCESS) { 1315 cmn_err(CE_CONT, 1316 "\tregnum %d size %ld (0x%lx)" 1317 "bytes", 1318 nintrs, size, size); 1319 if (nintrs == 1320 (pcic->pc_io_type == PCIC_IO_TYPE_82365SL ? 1321 PCIC_ISA_CONTROL_REG_NUM : 1322 PCIC_PCI_CONTROL_REG_NUM)) 1323 cmn_err(CE_CONT, 1324 " mapped at: 0x%p\n", 1325 (void *)pcic->ioaddr); 1326 else 1327 cmn_err(CE_CONT, "\n"); 1328 } else { 1329 cmn_err(CE_CONT, 1330 "\tddi_dev_regsize(rnumber" 1331 "= %d) returns DDI_FAILURE\n", 1332 nintrs); 1333 } 1334 nintrs++; 1335 } /* while */ 1336 } /* if (pcic_debug) */ 1337 #endif 1338 1339 cv_init(&pcic->pm_cv, NULL, CV_DRIVER, NULL); 1340 1341 if (!ddi_getprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS, 1342 "disable-audio", 0)) 1343 pcic->pc_flags |= PCF_AUDIO; 1344 1345 if (ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_CANSLEEP, 1346 "disable-cardbus", 0)) 1347 pcic->pc_flags &= ~PCF_CARDBUS; 1348 1349 (void) ddi_prop_update_string(DDI_DEV_T_NONE, dip, PCICPROP_CTL, 1350 typename); 1351 1352 /* 1353 * Init all socket SMI levels to 0 (no SMI) 1354 */ 1355 for (i = 0; i < PCIC_MAX_SOCKETS; i++) { 1356 pcic->pc_sockets[i].pcs_smi = 0; 1357 pcic->pc_sockets[i].pcs_debounce_id = 0; 1358 pcic->pc_sockets[i].pcs_pcic = pcic; 1359 } 1360 pcic->pc_lastreg = -1; /* just to make sure we are in sync */ 1361 1362 /* 1363 * Setup the IRQ handler(s) 1364 */ 1365 switch (pcic->pc_intr_mode) { 1366 int xx; 1367 case PCIC_INTR_MODE_ISA: 1368 /* 1369 * On a non-PCI bus, we just use whatever SMI IRQ level was 1370 * specified above, and the IO IRQ levels are allocated 1371 * dynamically. 1372 */ 1373 for (xx = 15, smi = 0; xx >= 0; xx--) { 1374 if (PCIC_IRQ(xx) & 1375 PCIC_AVAIL_IRQS) { 1376 smi = pcmcia_get_intr(dip, xx); 1377 if (smi >= 0) 1378 break; 1379 } 1380 } 1381 #if defined(PCIC_DEBUG) 1382 if (pcic_debug) 1383 cmn_err(CE_NOTE, "\tselected IRQ %d as SMI\n", smi); 1384 #endif 1385 /* init to same so share is easy */ 1386 for (i = 0; i < pcic->pc_numsockets; i++) 1387 pcic->pc_sockets[i].pcs_smi = smi; 1388 /* any special handling of IRQ levels */ 1389 if (pcic->pc_flags & PCF_MULT_IRQ) { 1390 for (i = 2; i < pcic->pc_numsockets; i++) { 1391 if ((i & 1) == 0) { 1392 int xx; 1393 for (xx = 15, smi = 0; xx >= 0; xx--) { 1394 if (PCIC_IRQ(xx) & 1395 PCIC_AVAIL_IRQS) { 1396 smi = 1397 pcmcia_get_intr(dip, 1398 xx); 1399 if (smi >= 0) 1400 break; 1401 } 1402 } 1403 } 1404 if (smi >= 0) 1405 pcic->pc_sockets[i].pcs_smi = smi; 1406 } 1407 } 1408 pcic->pc_intr_htblp = kmem_alloc(pcic->pc_numsockets * 1409 sizeof (ddi_intr_handle_t), KM_SLEEP); 1410 for (i = 0, irqlevel = -1; i < pcic->pc_numsockets; i++) { 1411 struct intrspec *ispecp; 1412 struct ddi_parent_private_data *pdp; 1413 1414 if (irqlevel == pcic->pc_sockets[i].pcs_smi) 1415 continue; 1416 else { 1417 irqlevel = pcic->pc_sockets[i].pcs_smi; 1418 } 1419 /* 1420 * now convert the allocated IRQ into an intrspec 1421 * and ask our parent to add it. Don't use 1422 * the ddi_add_intr since we don't have a 1423 * default intrspec in all cases. 1424 * 1425 * note: this sort of violates DDI but we don't 1426 * get hardware intrspecs for many of the devices. 1427 * at the same time, we know how to allocate them 1428 * so we do the right thing. 1429 */ 1430 if (ddi_intr_alloc(dip, &pcic->pc_intr_htblp[i], 1431 DDI_INTR_TYPE_FIXED, 0, 1, &actual, 1432 DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) { 1433 cmn_err(CE_WARN, "%s: ddi_intr_alloc failed", 1434 ddi_get_name(dip)); 1435 goto isa_exit1; 1436 } 1437 1438 /* 1439 * See earlier note: 1440 * Since some devices don't have 'intrspec' 1441 * we make one up in rootnex. 1442 * 1443 * However, it is not properly initialized as 1444 * the data it needs is present in this driver 1445 * and there is no interface to pass that up. 1446 * Specially 'irqlevel' is very important and 1447 * it is part of pcic struct. 1448 * 1449 * Set 'intrspec' up here; otherwise adding the 1450 * interrupt will fail. 1451 */ 1452 pdp = ddi_get_parent_data(dip); 1453 ispecp = (struct intrspec *)&pdp->par_intr[0]; 1454 ispecp->intrspec_vec = irqlevel; 1455 ispecp->intrspec_pri = pcic->pc_irq; 1456 1457 /* Stay compatible w/ PCMCIA */ 1458 pcic->pc_pri = (ddi_iblock_cookie_t) 1459 (uintptr_t)pcic->pc_irq; 1460 pcic->pc_dcookie.idev_priority = 1461 (uintptr_t)pcic->pc_pri; 1462 pcic->pc_dcookie.idev_vector = (ushort_t)irqlevel; 1463 1464 (void) ddi_intr_set_pri(pcic->pc_intr_htblp[i], 1465 pcic->pc_irq); 1466 1467 if (i == 0) { 1468 mutex_init(&pcic->intr_lock, NULL, MUTEX_DRIVER, 1469 DDI_INTR_PRI(pcic->pc_irq)); 1470 mutex_init(&pcic->pc_lock, NULL, MUTEX_DRIVER, 1471 NULL); 1472 } 1473 1474 if (ddi_intr_add_handler(pcic->pc_intr_htblp[i], 1475 pcic_intr, (caddr_t)pcic, NULL)) { 1476 cmn_err(CE_WARN, 1477 "%s: ddi_intr_add_handler failed", 1478 ddi_get_name(dip)); 1479 goto isa_exit2; 1480 } 1481 1482 if (ddi_intr_enable(pcic->pc_intr_htblp[i])) { 1483 cmn_err(CE_WARN, "%s: ddi_intr_enable failed", 1484 ddi_get_name(dip)); 1485 for (j = i; j < 0; j--) 1486 (void) ddi_intr_remove_handler( 1487 pcic->pc_intr_htblp[j]); 1488 goto isa_exit2; 1489 } 1490 } 1491 break; 1492 case PCIC_INTR_MODE_PCI_1: 1493 case PCIC_INTR_MODE_PCI: 1494 /* 1495 * If we're on a PCI bus, we route all interrupts, both SMI 1496 * and IO interrupts, through a single interrupt line. 1497 * Assign the SMI IRQ level to the IO IRQ level here. 1498 */ 1499 pcic->pc_pci_intr_hdlp = kmem_alloc(sizeof (ddi_intr_handle_t), 1500 KM_SLEEP); 1501 if (ddi_intr_alloc(dip, pcic->pc_pci_intr_hdlp, 1502 DDI_INTR_TYPE_FIXED, 0, 1, &actual, 1503 DDI_INTR_ALLOC_NORMAL) != DDI_SUCCESS) 1504 goto pci_exit1; 1505 1506 if (ddi_intr_get_pri(pcic->pc_pci_intr_hdlp[0], 1507 &pri) != DDI_SUCCESS) { 1508 (void) ddi_intr_free(pcic->pc_pci_intr_hdlp[0]); 1509 goto pci_exit1; 1510 } 1511 1512 pcic->pc_pri = (void *)(uintptr_t)pri; 1513 mutex_init(&pcic->intr_lock, NULL, MUTEX_DRIVER, pcic->pc_pri); 1514 mutex_init(&pcic->pc_lock, NULL, MUTEX_DRIVER, NULL); 1515 1516 if (ddi_intr_add_handler(pcic->pc_pci_intr_hdlp[0], 1517 pcic_intr, (caddr_t)pcic, NULL)) 1518 goto pci_exit2; 1519 1520 if (ddi_intr_enable(pcic->pc_pci_intr_hdlp[0])) { 1521 (void) ddi_intr_remove_handler( 1522 pcic->pc_pci_intr_hdlp[0]); 1523 goto pci_exit2; 1524 } 1525 1526 /* Stay compatible w/ PCMCIA */ 1527 pcic->pc_dcookie.idev_priority = (ushort_t)pri; 1528 1529 /* init to same (PCI) so share is easy */ 1530 for (i = 0; i < pcic->pc_numsockets; i++) 1531 pcic->pc_sockets[i].pcs_smi = 0xF; /* any valid */ 1532 break; 1533 } 1534 1535 /* 1536 * Setup the adapter hardware to some reasonable defaults. 1537 */ 1538 mutex_enter(&pcic->pc_lock); 1539 /* mark the driver state as attached */ 1540 pcic->pc_flags |= PCF_ATTACHED; 1541 pcic_setup_adapter(pcic); 1542 1543 for (j = 0; j < pcic->pc_numsockets; j++) 1544 if (ddi_intr_add_softint(dip, 1545 &pcic->pc_sockets[j].pcs_cd_softint_hdl, 1546 PCIC_SOFTINT_PRI_VAL, pcic_cd_softint, 1547 (caddr_t)&pcic->pc_sockets[j]) != DDI_SUCCESS) 1548 goto pci_exit2; 1549 1550 #if defined(PCIC_DEBUG) 1551 if (pcic_debug) 1552 cmn_err(CE_CONT, "type = %s sockets = %d\n", typename, 1553 pcic->pc_numsockets); 1554 #endif 1555 1556 pcic_nexus->an_iblock = &pcic->pc_pri; 1557 pcic_nexus->an_idev = &pcic->pc_dcookie; 1558 1559 mutex_exit(&pcic->pc_lock); 1560 1561 #ifdef CARDBUS 1562 (void) cardbus_enable_cd_intr(dip); 1563 if (pcic_debug) { 1564 1565 cardbus_dump_pci_config(dip); 1566 cardbus_dump_socket(dip); 1567 } 1568 1569 /* 1570 * Give the Cardbus misc module a chance to do it's per-adapter 1571 * instance setup. Note that there is no corresponding detach() 1572 * call. 1573 */ 1574 if (pcic->pc_flags & PCF_CARDBUS) 1575 if (cardbus_attach(dip, &pcic_cbnexus_ops) != DDI_SUCCESS) { 1576 cmn_err(CE_CONT, 1577 "pcic_attach: cardbus_attach failed\n"); 1578 goto pci_exit2; 1579 } 1580 #endif 1581 1582 /* 1583 * Give the PCMCIA misc module a chance to do it's per-adapter 1584 * instance setup. 1585 */ 1586 if ((i = pcmcia_attach(dip, pcic_nexus)) != DDI_SUCCESS) 1587 goto pci_exit2; 1588 1589 if (pcic_maxinst == -1) { 1590 /* This assumes that all instances run at the same IPL. */ 1591 mutex_init(&pcic_deb_mtx, NULL, MUTEX_DRIVER, NULL); 1592 cv_init(&pcic_deb_cv, NULL, CV_DRIVER, NULL); 1593 pcic_deb_threadid = thread_create((caddr_t)NULL, 0, 1594 pcic_deb_thread, (caddr_t)NULL, 0, &p0, TS_RUN, 1595 v.v_maxsyspri - 2); 1596 } 1597 pcic_maxinst = max(pcic_maxinst, ddi_get_instance(dip)); 1598 /* 1599 * Setup a debounce timeout to do an initial card detect 1600 * and enable interrupts. 1601 */ 1602 for (j = 0; j < pcic->pc_numsockets; j++) { 1603 pcic->pc_sockets[j].pcs_debounce_id = 1604 pcic_add_debqueue(&pcic->pc_sockets[j], 1605 drv_usectohz(pcic_debounce_time)); 1606 } 1607 1608 return (i); 1609 1610 isa_exit2: 1611 mutex_destroy(&pcic->intr_lock); 1612 mutex_destroy(&pcic->pc_lock); 1613 for (j = i; j < 0; j--) 1614 (void) ddi_intr_free(pcic->pc_intr_htblp[j]); 1615 isa_exit1: 1616 (void) pcmcia_return_intr(dip, pcic->pc_sockets[i].pcs_smi); 1617 ddi_regs_map_free(&pcic->handle); 1618 if (pcic->pc_flags & PCF_PCIBUS) 1619 ddi_regs_map_free(&pcic->cfg_handle); 1620 kmem_free(pcic->pc_intr_htblp, pcic->pc_numsockets * 1621 sizeof (ddi_intr_handle_t)); 1622 kmem_free(pcic, sizeof (pcicdev_t)); 1623 return (DDI_FAILURE); 1624 1625 pci_exit2: 1626 mutex_destroy(&pcic->intr_lock); 1627 mutex_destroy(&pcic->pc_lock); 1628 (void) ddi_intr_free(pcic->pc_pci_intr_hdlp[0]); 1629 pci_exit1: 1630 ddi_regs_map_free(&pcic->handle); 1631 if (pcic->pc_flags & PCF_PCIBUS) 1632 ddi_regs_map_free(&pcic->cfg_handle); 1633 kmem_free(pcic->pc_pci_intr_hdlp, sizeof (ddi_intr_handle_t)); 1634 kmem_free(pcic, sizeof (pcicdev_t)); 1635 return (DDI_FAILURE); 1636 } 1637 1638 /* 1639 * pcic_detach() 1640 * request to detach from the system 1641 */ 1642 static int 1643 pcic_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) 1644 { 1645 anp_t *anp = ddi_get_driver_private(dip); 1646 pcicdev_t *pcic = anp->an_private; 1647 int i; 1648 1649 switch (cmd) { 1650 case DDI_DETACH: 1651 /* don't detach if the nexus still talks to us */ 1652 if (pcic->pc_callback != NULL) 1653 return (DDI_FAILURE); 1654 1655 /* kill off the pm simulation */ 1656 if (pcic->pc_pmtimer) 1657 (void) untimeout(pcic->pc_pmtimer); 1658 1659 /* turn everything off for all sockets and chips */ 1660 for (i = 0; i < pcic->pc_numsockets; i++) { 1661 if (pcic->pc_sockets[i].pcs_debounce_id) 1662 pcic_rm_debqueue( 1663 pcic->pc_sockets[i].pcs_debounce_id); 1664 pcic->pc_sockets[i].pcs_debounce_id = 0; 1665 1666 pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 0); 1667 pcic_putb(pcic, i, PCIC_CARD_DETECT, 0); 1668 pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0); 1669 /* disable interrupts and put card into RESET */ 1670 pcic_putb(pcic, i, PCIC_INTERRUPT, 0); 1671 } 1672 (void) ddi_intr_disable(pcic->pc_pci_intr_hdlp[0]); 1673 (void) ddi_intr_remove_handler(pcic->pc_pci_intr_hdlp[0]); 1674 (void) ddi_intr_free(pcic->pc_pci_intr_hdlp[0]); 1675 kmem_free(pcic->pc_pci_intr_hdlp, sizeof (ddi_intr_handle_t)); 1676 pcic->pc_flags = 0; 1677 mutex_destroy(&pcic->pc_lock); 1678 mutex_destroy(&pcic->intr_lock); 1679 cv_destroy(&pcic->pm_cv); 1680 if (pcic->pc_flags & PCF_PCIBUS) 1681 ddi_regs_map_free(&pcic->cfg_handle); 1682 if (pcic->handle) 1683 ddi_regs_map_free(&pcic->handle); 1684 kmem_free(pcic, sizeof (pcicdev_t)); 1685 ddi_soft_state_free(pcic_soft_state_p, ddi_get_instance(dip)); 1686 return (DDI_SUCCESS); 1687 1688 case DDI_SUSPEND: 1689 case DDI_PM_SUSPEND: 1690 /* 1691 * we got a suspend event (either real or imagined) 1692 * so notify the nexus proper that all existing cards 1693 * should go away. 1694 */ 1695 mutex_enter(&pcic->pc_lock); 1696 #ifdef CARDBUS 1697 if (pcic->pc_flags & PCF_CARDBUS) { 1698 for (i = 0; i < pcic->pc_numsockets; i++) { 1699 if ((pcic->pc_sockets[i].pcs_flags & 1700 (PCS_CARD_PRESENT|PCS_CARD_ISCARDBUS)) == 1701 (PCS_CARD_PRESENT|PCS_CARD_ISCARDBUS)) { 1702 1703 pcmcia_cb_suspended( 1704 pcic->pc_sockets[i].pcs_socket); 1705 } 1706 } 1707 1708 cardbus_save_children(ddi_get_child(dip)); 1709 } 1710 #endif 1711 /* turn everything off for all sockets and chips */ 1712 for (i = 0; i < pcic->pc_numsockets; i++) { 1713 if (pcic->pc_sockets[i].pcs_debounce_id) 1714 pcic_rm_debqueue( 1715 pcic->pc_sockets[i].pcs_debounce_id); 1716 pcic->pc_sockets[i].pcs_debounce_id = 0; 1717 1718 pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 0); 1719 pcic_putb(pcic, i, PCIC_CARD_DETECT, 0); 1720 pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0); 1721 /* disable interrupts and put card into RESET */ 1722 pcic_putb(pcic, i, PCIC_INTERRUPT, 0); 1723 pcic_putb(pcic, i, PCIC_POWER_CONTROL, 0); 1724 if (pcic->pc_flags & PCF_CBPWRCTL) 1725 pcic_putcb(pcic, CB_CONTROL, 0); 1726 1727 if (pcic->pc_sockets[i].pcs_flags & PCS_CARD_PRESENT) { 1728 pcic->pc_sockets[i].pcs_flags = PCS_STARTING; 1729 /* 1730 * Because we are half way through a save 1731 * all this does is schedule a removal event 1732 * to cs for when the system comes back. 1733 * This doesn't actually matter. 1734 */ 1735 if (!pcic_do_pcmcia_sr && pcic_do_removal && 1736 pcic->pc_callback) { 1737 PC_CALLBACK(pcic->dip, pcic->pc_cb_arg, 1738 PCE_CARD_REMOVAL, 1739 pcic->pc_sockets[i].pcs_socket); 1740 } 1741 } 1742 } 1743 1744 pcic->pc_flags |= PCF_SUSPENDED; 1745 mutex_exit(&pcic->pc_lock); 1746 1747 /* 1748 * when true power management exists, save the adapter 1749 * state here to enable a recovery. For the emulation 1750 * condition, the state is gone 1751 */ 1752 return (DDI_SUCCESS); 1753 1754 default: 1755 return (EINVAL); 1756 } 1757 } 1758 1759 static uint32_t pcic_tisysctl_onbits = ((1<<27) | (1<<15) | (1<<14)); 1760 static uint32_t pcic_tisysctl_offbits = 0; 1761 static uint32_t pcic_default_latency = 0x40; 1762 1763 static void 1764 pcic_setup_adapter(pcicdev_t *pcic) 1765 { 1766 int i; 1767 int value, flags; 1768 1769 #if defined(__i386) || defined(__amd64) 1770 pci_regspec_t *reg; 1771 uchar_t bus, dev, func; 1772 uint_t classcode; 1773 int length; 1774 #endif 1775 1776 if (pcic->pc_flags & PCF_PCIBUS) { 1777 /* 1778 * all PCI-to-PCMCIA bus bridges need memory and I/O enabled 1779 */ 1780 flags = (PCIC_ENABLE_IO | PCIC_ENABLE_MEM); 1781 pcic_iomem_pci_ctl(pcic->cfg_handle, pcic->cfgaddr, flags); 1782 } 1783 /* enable each socket */ 1784 for (i = 0; i < pcic->pc_numsockets; i++) { 1785 pcic->pc_sockets[i].pcs_flags = 0; 1786 /* find out the socket capabilities (I/O vs memory) */ 1787 value = pcic_getb(pcic, i, 1788 PCIC_CHIP_REVISION) & PCIC_REV_ID_MASK; 1789 if (value == PCIC_REV_ID_IO || value == PCIC_REV_ID_BOTH) 1790 pcic->pc_sockets[i].pcs_flags |= PCS_SOCKET_IO; 1791 1792 /* disable all windows just in case */ 1793 pcic_putb(pcic, i, PCIC_MAPPING_ENABLE, 0); 1794 1795 switch (pcic->pc_type) { 1796 uint32_t cfg32; 1797 uint16_t cfg16; 1798 uint8_t cfg; 1799 1800 /* enable extended registers for Vadem */ 1801 case PCIC_VADEM_VG469: 1802 case PCIC_VADEM: 1803 1804 /* enable card status change interrupt for socket */ 1805 break; 1806 1807 case PCIC_I82365SL: 1808 break; 1809 1810 case PCIC_CL_PD6710: 1811 pcic_putb(pcic, 0, PCIC_MISC_CTL_2, PCIC_LED_ENABLE); 1812 break; 1813 1814 /* 1815 * On the CL_6730, we need to set up the interrupt 1816 * signalling mode (PCI mode) and set the SMI and 1817 * IRQ interrupt lines to PCI/level-mode. 1818 */ 1819 case PCIC_CL_PD6730: 1820 switch (pcic->pc_intr_mode) { 1821 case PCIC_INTR_MODE_PCI_1: 1822 clext_reg_write(pcic, i, PCIC_CLEXT_MISC_CTL_3, 1823 ((clext_reg_read(pcic, i, 1824 PCIC_CLEXT_MISC_CTL_3) & 1825 ~PCIC_CLEXT_INT_PCI) | 1826 PCIC_CLEXT_INT_PCI)); 1827 clext_reg_write(pcic, i, PCIC_CLEXT_EXT_CTL_1, 1828 (PCIC_CLEXT_IRQ_LVL_MODE | 1829 PCIC_CLEXT_SMI_LVL_MODE)); 1830 cfg = PCIC_CL_LP_DYN_MODE; 1831 pcic_putb(pcic, i, PCIC_MISC_CTL_2, cfg); 1832 break; 1833 case PCIC_INTR_MODE_ISA: 1834 break; 1835 } 1836 break; 1837 /* 1838 * On the CL_6729, we set the SMI and IRQ interrupt 1839 * lines to PCI/level-mode. as well as program the 1840 * correct clock speed divider bit. 1841 */ 1842 case PCIC_CL_PD6729: 1843 switch (pcic->pc_intr_mode) { 1844 case PCIC_INTR_MODE_PCI_1: 1845 clext_reg_write(pcic, i, PCIC_CLEXT_EXT_CTL_1, 1846 (PCIC_CLEXT_IRQ_LVL_MODE | 1847 PCIC_CLEXT_SMI_LVL_MODE)); 1848 1849 break; 1850 case PCIC_INTR_MODE_ISA: 1851 break; 1852 } 1853 if (pcic->bus_speed > PCIC_PCI_25MHZ && i == 0) { 1854 cfg = 0; 1855 cfg |= PCIC_CL_TIMER_CLK_DIV; 1856 pcic_putb(pcic, i, PCIC_MISC_CTL_2, cfg); 1857 } 1858 break; 1859 case PCIC_INTEL_i82092: 1860 cfg = PCIC_82092_EN_TIMING; 1861 if (pcic->bus_speed < PCIC_SYSCLK_33MHZ) 1862 cfg |= PCIC_82092_PCICLK_25MHZ; 1863 ddi_put8(pcic->cfg_handle, pcic->cfgaddr + 1864 PCIC_82092_PCICON, cfg); 1865 break; 1866 case PCIC_TI_PCI1130: 1867 case PCIC_TI_PCI1131: 1868 case PCIC_TI_PCI1250: 1869 case PCIC_TI_PCI1031: 1870 cfg = ddi_get8(pcic->cfg_handle, 1871 pcic->cfgaddr + PCIC_DEVCTL_REG); 1872 cfg &= ~PCIC_DEVCTL_INTR_MASK; 1873 switch (pcic->pc_intr_mode) { 1874 case PCIC_INTR_MODE_ISA: 1875 cfg |= PCIC_DEVCTL_INTR_ISA; 1876 break; 1877 } 1878 #ifdef PCIC_DEBUG 1879 if (pcic_debug) { 1880 cmn_err(CE_CONT, "pcic_setup_adapter: " 1881 "write reg 0x%x=%x \n", 1882 PCIC_DEVCTL_REG, cfg); 1883 } 1884 #endif 1885 ddi_put8(pcic->cfg_handle, 1886 pcic->cfgaddr + PCIC_DEVCTL_REG, 1887 cfg); 1888 1889 cfg = ddi_get8(pcic->cfg_handle, 1890 pcic->cfgaddr + PCIC_CRDCTL_REG); 1891 cfg &= ~(PCIC_CRDCTL_PCIINTR|PCIC_CRDCTL_PCICSC| 1892 PCIC_CRDCTL_PCIFUNC); 1893 switch (pcic->pc_intr_mode) { 1894 case PCIC_INTR_MODE_PCI_1: 1895 cfg |= PCIC_CRDCTL_PCIINTR | 1896 PCIC_CRDCTL_PCICSC | 1897 PCIC_CRDCTL_PCIFUNC; 1898 pcic->pc_flags |= PCF_USE_SMI; 1899 break; 1900 } 1901 #ifdef PCIC_DEBUG 1902 if (pcic_debug) { 1903 cmn_err(CE_CONT, "pcic_setup_adapter: " 1904 " write reg 0x%x=%x \n", 1905 PCIC_CRDCTL_REG, cfg); 1906 } 1907 #endif 1908 ddi_put8(pcic->cfg_handle, 1909 pcic->cfgaddr + PCIC_CRDCTL_REG, 1910 cfg); 1911 break; 1912 case PCIC_TI_PCI1221: 1913 case PCIC_TI_PCI1225: 1914 cfg = ddi_get8(pcic->cfg_handle, 1915 pcic->cfgaddr + PCIC_DEVCTL_REG); 1916 cfg |= (PCIC_DEVCTL_INTR_DFLT | PCIC_DEVCTL_3VCAPABLE); 1917 #ifdef PCIC_DEBUG 1918 if (pcic_debug) { 1919 cmn_err(CE_CONT, "pcic_setup_adapter: " 1920 " write reg 0x%x=%x \n", 1921 PCIC_DEVCTL_REG, cfg); 1922 } 1923 #endif 1924 ddi_put8(pcic->cfg_handle, 1925 pcic->cfgaddr + PCIC_DEVCTL_REG, cfg); 1926 1927 cfg = ddi_get8(pcic->cfg_handle, 1928 pcic->cfgaddr + PCIC_DIAG_REG); 1929 if (pcic->pc_type == PCIC_TI_PCI1225) { 1930 cfg |= (PCIC_DIAG_CSC | PCIC_DIAG_ASYNC); 1931 } else { 1932 cfg |= PCIC_DIAG_ASYNC; 1933 } 1934 pcic->pc_flags |= PCF_USE_SMI; 1935 #ifdef PCIC_DEBUG 1936 if (pcic_debug) { 1937 cmn_err(CE_CONT, "pcic_setup_adapter: " 1938 " write reg 0x%x=%x \n", 1939 PCIC_DIAG_REG, cfg); 1940 } 1941 #endif 1942 ddi_put8(pcic->cfg_handle, 1943 pcic->cfgaddr + PCIC_DIAG_REG, cfg); 1944 break; 1945 case PCIC_TI_PCI1520: 1946 case PCIC_TI_PCI1510: 1947 case PCIC_TI_VENDOR: 1948 if (pcic->pc_intr_mode == PCIC_INTR_MODE_ISA) { 1949 /* functional intr routed by ExCA register */ 1950 cfg = ddi_get8(pcic->cfg_handle, 1951 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG); 1952 cfg |= PCIC_FUN_INT_MOD_ISA; 1953 ddi_put8(pcic->cfg_handle, 1954 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG, 1955 cfg); 1956 1957 /* IRQ serialized interrupts */ 1958 cfg = ddi_get8(pcic->cfg_handle, 1959 pcic->cfgaddr + PCIC_DEVCTL_REG); 1960 cfg &= ~PCIC_DEVCTL_INTR_MASK; 1961 cfg |= PCIC_DEVCTL_INTR_ISA; 1962 ddi_put8(pcic->cfg_handle, 1963 pcic->cfgaddr + PCIC_DEVCTL_REG, 1964 cfg); 1965 break; 1966 } 1967 1968 /* CSC interrupt routed to PCI */ 1969 cfg = ddi_get8(pcic->cfg_handle, 1970 pcic->cfgaddr + PCIC_DIAG_REG); 1971 cfg |= (PCIC_DIAG_CSC | PCIC_DIAG_ASYNC); 1972 ddi_put8(pcic->cfg_handle, 1973 pcic->cfgaddr + PCIC_DIAG_REG, cfg); 1974 1975 #if defined(__i386) || defined(__amd64) 1976 /* 1977 * Some TI chips have 2 cardbus slots(function0 and 1978 * function1), and others may have just 1 cardbus slot. 1979 * The interrupt routing register is shared between the 1980 * 2 functions and can only be accessed through 1981 * function0. Here we check the presence of the second 1982 * cardbus slot and do the right thing. 1983 */ 1984 1985 if (ddi_getlongprop(DDI_DEV_T_ANY, pcic->dip, 1986 DDI_PROP_DONTPASS, "reg", (caddr_t)®, 1987 &length) != DDI_PROP_SUCCESS) { 1988 cmn_err(CE_WARN, 1989 "pcic_setup_adapter(), failed to" 1990 " read reg property\n"); 1991 break; 1992 } 1993 1994 bus = PCI_REG_BUS_G(reg->pci_phys_hi); 1995 dev = PCI_REG_DEV_G(reg->pci_phys_hi); 1996 func = PCI_REG_FUNC_G(reg->pci_phys_hi); 1997 kmem_free((caddr_t)reg, length); 1998 1999 if (func != 0) { 2000 break; 2001 } 2002 2003 classcode = (*pci_getl_func)(bus, dev, 1, 2004 PCI_CONF_REVID); 2005 classcode >>= 8; 2006 if (classcode != 0x060700 && 2007 classcode != 0x060500) { 2008 break; 2009 } 2010 2011 /* Parallel PCI interrupts only */ 2012 cfg = ddi_get8(pcic->cfg_handle, 2013 pcic->cfgaddr + PCIC_DEVCTL_REG); 2014 cfg &= ~PCIC_DEVCTL_INTR_MASK; 2015 ddi_put8(pcic->cfg_handle, 2016 pcic->cfgaddr + PCIC_DEVCTL_REG, 2017 cfg); 2018 2019 /* tie INTA and INTB together */ 2020 cfg = ddi_get8(pcic->cfg_handle, 2021 (pcic->cfgaddr + PCIC_SYSCTL_REG + 3)); 2022 cfg |= PCIC_SYSCTL_INTRTIE; 2023 ddi_put8(pcic->cfg_handle, (pcic->cfgaddr + 2024 PCIC_SYSCTL_REG + 3), cfg); 2025 #endif 2026 2027 break; 2028 case PCIC_TI_PCI1410: 2029 cfg = ddi_get8(pcic->cfg_handle, 2030 pcic->cfgaddr + PCIC_DIAG_REG); 2031 cfg |= (PCIC_DIAG_CSC | PCIC_DIAG_ASYNC); 2032 ddi_put8(pcic->cfg_handle, 2033 pcic->cfgaddr + PCIC_DIAG_REG, cfg); 2034 break; 2035 case PCIC_TOSHIBA_TOPIC100: 2036 case PCIC_TOSHIBA_TOPIC95: 2037 case PCIC_TOSHIBA_VENDOR: 2038 cfg = ddi_get8(pcic->cfg_handle, pcic->cfgaddr + 2039 PCIC_TOSHIBA_SLOT_CTL_REG); 2040 cfg |= (PCIC_TOSHIBA_SCR_SLOTON | 2041 PCIC_TOSHIBA_SCR_SLOTEN); 2042 cfg &= (~PCIC_TOSHIBA_SCR_PRT_MASK); 2043 cfg |= PCIC_TOSHIBA_SCR_PRT_3E2; 2044 ddi_put8(pcic->cfg_handle, pcic->cfgaddr + 2045 PCIC_TOSHIBA_SLOT_CTL_REG, cfg); 2046 cfg = ddi_get8(pcic->cfg_handle, pcic->cfgaddr + 2047 PCIC_TOSHIBA_INTR_CTL_REG); 2048 switch (pcic->pc_intr_mode) { 2049 case PCIC_INTR_MODE_ISA: 2050 cfg &= ~PCIC_TOSHIBA_ICR_SRC; 2051 ddi_put8(pcic->cfg_handle, 2052 pcic->cfgaddr + 2053 PCIC_TOSHIBA_INTR_CTL_REG, cfg); 2054 2055 cfg = ddi_get8(pcic->cfg_handle, 2056 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG); 2057 cfg |= PCIC_FUN_INT_MOD_ISA; 2058 ddi_put8(pcic->cfg_handle, 2059 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG, 2060 cfg); 2061 break; 2062 case PCIC_INTR_MODE_PCI_1: 2063 cfg |= PCIC_TOSHIBA_ICR_SRC; 2064 cfg &= (~PCIC_TOSHIBA_ICR_PIN_MASK); 2065 cfg |= PCIC_TOSHIBA_ICR_PIN_INTA; 2066 ddi_put8(pcic->cfg_handle, 2067 pcic->cfgaddr + 2068 PCIC_TOSHIBA_INTR_CTL_REG, cfg); 2069 break; 2070 } 2071 break; 2072 case PCIC_O2MICRO_VENDOR: 2073 cfg32 = ddi_get32(pcic->cfg_handle, 2074 (uint32_t *)(pcic->cfgaddr + 2075 PCIC_O2MICRO_MISC_CTL)); 2076 switch (pcic->pc_intr_mode) { 2077 case PCIC_INTR_MODE_ISA: 2078 cfg32 |= (PCIC_O2MICRO_ISA_LEGACY | 2079 PCIC_O2MICRO_INT_MOD_PCI); 2080 ddi_put32(pcic->cfg_handle, 2081 (uint32_t *)(pcic->cfgaddr + 2082 PCIC_O2MICRO_MISC_CTL), 2083 cfg32); 2084 cfg = ddi_get8(pcic->cfg_handle, 2085 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG); 2086 cfg |= PCIC_FUN_INT_MOD_ISA; 2087 ddi_put8(pcic->cfg_handle, 2088 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG, 2089 cfg); 2090 break; 2091 case PCIC_INTR_MODE_PCI_1: 2092 cfg32 &= ~PCIC_O2MICRO_ISA_LEGACY; 2093 cfg32 |= PCIC_O2MICRO_INT_MOD_PCI; 2094 ddi_put32(pcic->cfg_handle, 2095 (uint32_t *)(pcic->cfgaddr + 2096 PCIC_O2MICRO_MISC_CTL), 2097 cfg32); 2098 break; 2099 } 2100 break; 2101 case PCIC_RICOH_VENDOR: 2102 if (pcic->pc_intr_mode == PCIC_INTR_MODE_ISA) { 2103 cfg16 = ddi_get16(pcic->cfg_handle, 2104 (uint16_t *)(pcic->cfgaddr + 2105 PCIC_RICOH_MISC_CTL_2)); 2106 cfg16 |= (PCIC_RICOH_CSC_INT_MOD | 2107 PCIC_RICOH_FUN_INT_MOD); 2108 ddi_put16(pcic->cfg_handle, 2109 (uint16_t *)(pcic->cfgaddr + 2110 PCIC_RICOH_MISC_CTL_2), 2111 cfg16); 2112 2113 cfg16 = ddi_get16(pcic->cfg_handle, 2114 (uint16_t *)(pcic->cfgaddr + 2115 PCIC_RICOH_MISC_CTL)); 2116 cfg16 |= PCIC_RICOH_SIRQ_EN; 2117 ddi_put16(pcic->cfg_handle, 2118 (uint16_t *)(pcic->cfgaddr + 2119 PCIC_RICOH_MISC_CTL), 2120 cfg16); 2121 2122 cfg = ddi_get8(pcic->cfg_handle, 2123 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG); 2124 cfg |= PCIC_FUN_INT_MOD_ISA; 2125 ddi_put8(pcic->cfg_handle, 2126 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG, 2127 cfg); 2128 } 2129 break; 2130 default: 2131 break; 2132 } /* switch */ 2133 2134 /* 2135 * The default value in the EEPROM (loaded on reset) for 2136 * MFUNC0/MFUNC1 may be incorrect. Here we make sure that 2137 * MFUNC0 is connected to INTA, and MFUNC1 is connected to 2138 * INTB. This applies to all TI CardBus controllers. 2139 */ 2140 if ((pcic->pc_type >> 16) == PCIC_TI_VENDORID && 2141 pcic->pc_intr_mode == PCIC_INTR_MODE_PCI_1) { 2142 value = ddi_get32(pcic->cfg_handle, 2143 (uint32_t *)(pcic->cfgaddr + PCIC_MFROUTE_REG)); 2144 value &= ~0xff; 2145 ddi_put32(pcic->cfg_handle, (uint32_t *)(pcic->cfgaddr + 2146 PCIC_MFROUTE_REG), value|PCIC_TI_MFUNC_SEL); 2147 } 2148 2149 /* setup general card status change interrupt */ 2150 switch (pcic->pc_type) { 2151 case PCIC_TI_PCI1225: 2152 case PCIC_TI_PCI1221: 2153 case PCIC_TI_PCI1031: 2154 case PCIC_TI_PCI1520: 2155 case PCIC_TI_PCI1410: 2156 pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 2157 PCIC_CHANGE_DEFAULT); 2158 break; 2159 default: 2160 if (pcic->pc_intr_mode == 2161 PCIC_INTR_MODE_PCI_1) { 2162 pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 2163 PCIC_CHANGE_DEFAULT); 2164 break; 2165 } else { 2166 pcic_putb(pcic, i, PCIC_MANAGEMENT_INT, 2167 PCIC_CHANGE_DEFAULT | 2168 (pcic->pc_sockets[i].pcs_smi << 4)); 2169 break; 2170 } 2171 } 2172 2173 pcic->pc_flags |= PCF_INTRENAB; 2174 2175 /* take card out of RESET */ 2176 pcic_putb(pcic, i, PCIC_INTERRUPT, PCIC_RESET); 2177 /* turn power off and let CS do this */ 2178 pcic_putb(pcic, i, PCIC_POWER_CONTROL, 0); 2179 2180 /* final chip specific initialization */ 2181 switch (pcic->pc_type) { 2182 case PCIC_VADEM: 2183 pcic_putb(pcic, i, PCIC_VG_CONTROL, 2184 PCIC_VC_DELAYENABLE); 2185 pcic->pc_flags |= PCF_DEBOUNCE; 2186 /* FALLTHROUGH */ 2187 case PCIC_I82365SL: 2188 pcic_putb(pcic, i, PCIC_GLOBAL_CONTROL, 2189 PCIC_GC_CSC_WRITE); 2190 /* clear any pending interrupts */ 2191 value = pcic_getb(pcic, i, PCIC_CARD_STATUS_CHANGE); 2192 pcic_putb(pcic, i, PCIC_CARD_STATUS_CHANGE, value); 2193 break; 2194 /* The 82092 uses PCI config space to enable interrupts */ 2195 case PCIC_INTEL_i82092: 2196 pcic_82092_smiirq_ctl(pcic, i, PCIC_82092_CTL_SMI, 2197 PCIC_82092_INT_ENABLE); 2198 break; 2199 case PCIC_CL_PD6729: 2200 if (pcic->bus_speed >= PCIC_PCI_DEF_SYSCLK && i == 0) { 2201 value = pcic_getb(pcic, i, PCIC_MISC_CTL_2); 2202 pcic_putb(pcic, i, PCIC_MISC_CTL_2, 2203 value | PCIC_CL_TIMER_CLK_DIV); 2204 } 2205 break; 2206 } /* switch */ 2207 2208 #if defined(PCIC_DEBUG) 2209 if (pcic_debug) 2210 cmn_err(CE_CONT, 2211 "socket %d value=%x, flags = %x (%s)\n", 2212 i, value, pcic->pc_sockets[i].pcs_flags, 2213 (pcic->pc_sockets[i].pcs_flags & 2214 PCS_CARD_PRESENT) ? 2215 "card present" : "no card"); 2216 #endif 2217 } 2218 } 2219 2220 /* 2221 * pcic_intr(caddr_t, caddr_t) 2222 * interrupt handler for the PCIC style adapter 2223 * handles all basic interrupts and also checks 2224 * for status changes and notifies the nexus if 2225 * necessary 2226 * 2227 * On PCI bus adapters, also handles all card 2228 * IO interrupts. 2229 */ 2230 /*ARGSUSED*/ 2231 uint32_t 2232 pcic_intr(caddr_t arg1, caddr_t arg2) 2233 { 2234 pcicdev_t *pcic = (pcicdev_t *)arg1; 2235 int value = 0, i, ret = DDI_INTR_UNCLAIMED; 2236 uint8_t status; 2237 uint_t io_ints; 2238 2239 #if defined(PCIC_DEBUG) 2240 pcic_err(pcic->dip, 0xf, 2241 "pcic_intr: enter pc_flags=0x%x PCF_ATTACHED=0x%x" 2242 " pc_numsockets=%d \n", 2243 pcic->pc_flags, PCF_ATTACHED, pcic->pc_numsockets); 2244 #endif 2245 2246 if (!(pcic->pc_flags & PCF_ATTACHED)) 2247 return (DDI_INTR_UNCLAIMED); 2248 2249 mutex_enter(&pcic->intr_lock); 2250 2251 if (pcic->pc_flags & PCF_SUSPENDED) { 2252 mutex_exit(&pcic->intr_lock); 2253 return (ret); 2254 } 2255 2256 /* 2257 * need to change to only ACK and touch the slot that 2258 * actually caused the interrupt. Currently everything 2259 * is acked 2260 * 2261 * we need to look at all known sockets to determine 2262 * what might have happened, so step through the list 2263 * of them 2264 */ 2265 2266 /* 2267 * Set the bitmask for IO interrupts to initially include all sockets 2268 */ 2269 io_ints = (1 << pcic->pc_numsockets) - 1; 2270 2271 for (i = 0; i < pcic->pc_numsockets; i++) { 2272 int card_type; 2273 pcic_socket_t *sockp; 2274 int value_cb = 0; 2275 2276 sockp = &pcic->pc_sockets[i]; 2277 /* get the socket's I/O addresses */ 2278 2279 if (sockp->pcs_flags & PCS_WAITING) { 2280 io_ints &= ~(1 << i); 2281 continue; 2282 } 2283 2284 if (sockp->pcs_flags & PCS_CARD_IO) 2285 card_type = IF_IO; 2286 else 2287 card_type = IF_MEMORY; 2288 2289 if (pcic->pc_io_type == PCIC_IO_TYPE_YENTA) 2290 value_cb = pcic_getcb(pcic, CB_STATUS_EVENT); 2291 2292 value = pcic_change(pcic, i); 2293 2294 if ((value != 0) || (value_cb != 0)) { 2295 int x = pcic->pc_cb_arg; 2296 2297 ret = DDI_INTR_CLAIMED; 2298 2299 #if defined(PCIC_DEBUG) 2300 pcic_err(pcic->dip, 0x9, 2301 "card_type = %d, value_cb = 0x%x\n", 2302 card_type, 2303 value_cb ? value_cb : 2304 pcic_getcb(pcic, CB_STATUS_EVENT)); 2305 if (pcic_debug) 2306 cmn_err(CE_CONT, 2307 "\tchange on socket %d (%x)\n", i, 2308 value); 2309 #endif 2310 /* find out what happened */ 2311 status = pcic_getb(pcic, i, PCIC_INTERFACE_STATUS); 2312 2313 /* acknowledge the interrupt */ 2314 if (value_cb) 2315 pcic_putcb(pcic, CB_STATUS_EVENT, value_cb); 2316 2317 if (value) 2318 pcic_putb(pcic, i, PCIC_CARD_STATUS_CHANGE, 2319 value); 2320 2321 if (pcic->pc_callback == NULL) { 2322 /* if not callback handler, nothing to do */ 2323 continue; 2324 } 2325 2326 /* Card Detect */ 2327 if (value & PCIC_CD_DETECT || 2328 value_cb & CB_PS_CCDMASK) { 2329 uint8_t irq; 2330 #if defined(PCIC_DEBUG) 2331 if (pcic_debug) 2332 cmn_err(CE_CONT, 2333 "\tcd_detect: status=%x," 2334 " flags=%x\n", 2335 status, sockp->pcs_flags); 2336 #else 2337 #ifdef lint 2338 if (status == 0) 2339 status++; 2340 #endif 2341 #endif 2342 /* 2343 * Turn off all interrupts for this socket here. 2344 */ 2345 irq = pcic_getb(pcic, sockp->pcs_socket, 2346 PCIC_MANAGEMENT_INT); 2347 irq &= ~PCIC_CHANGE_MASK; 2348 pcic_putb(pcic, sockp->pcs_socket, 2349 PCIC_MANAGEMENT_INT, irq); 2350 2351 pcic_putcb(pcic, CB_STATUS_MASK, 0x0); 2352 2353 /* 2354 * Put the socket in debouncing state so that 2355 * the leaf driver won't receive interrupts. 2356 * Crucial for handling surprise-removal. 2357 */ 2358 sockp->pcs_flags |= PCS_DEBOUNCING; 2359 2360 if (!sockp->pcs_cd_softint_flg) { 2361 sockp->pcs_cd_softint_flg = 1; 2362 (void) ddi_intr_trigger_softint( 2363 sockp->pcs_cd_softint_hdl, NULL); 2364 } 2365 2366 io_ints &= ~(1 << i); 2367 } /* PCIC_CD_DETECT */ 2368 2369 /* Ready/Change Detect */ 2370 sockp->pcs_state ^= SBM_RDYBSY; 2371 if (card_type == IF_MEMORY && value & PCIC_RD_DETECT) { 2372 sockp->pcs_flags |= PCS_READY; 2373 PC_CALLBACK(pcic->dip, x, PCE_CARD_READY, i); 2374 } 2375 2376 /* Battery Warn Detect */ 2377 if (card_type == IF_MEMORY && 2378 value & PCIC_BW_DETECT && 2379 !(sockp->pcs_state & SBM_BVD2)) { 2380 sockp->pcs_state |= SBM_BVD2; 2381 PC_CALLBACK(pcic->dip, x, 2382 PCE_CARD_BATTERY_WARN, i); 2383 } 2384 2385 /* Battery Dead Detect */ 2386 if (value & PCIC_BD_DETECT) { 2387 /* 2388 * need to work out event if RI not enabled 2389 * and card_type == IF_IO 2390 */ 2391 if (card_type == IF_MEMORY && 2392 !(sockp->pcs_state & SBM_BVD1)) { 2393 sockp->pcs_state |= SBM_BVD1; 2394 PC_CALLBACK(pcic->dip, x, 2395 PCE_CARD_BATTERY_DEAD, 2396 i); 2397 } else { 2398 /* 2399 * information in pin replacement 2400 * register if one is available 2401 */ 2402 PC_CALLBACK(pcic->dip, x, 2403 PCE_CARD_STATUS_CHANGE, 2404 i); 2405 } /* IF_MEMORY */ 2406 } /* PCIC_BD_DETECT */ 2407 } /* if pcic_change */ 2408 /* 2409 * for any controllers that we can detect whether a socket 2410 * had an interrupt for the PC Card, we should sort that out 2411 * here. 2412 */ 2413 } /* for pc_numsockets */ 2414 2415 /* 2416 * If we're on a PCI bus, we may need to cycle through each IO 2417 * interrupt handler that is registered since they all 2418 * share the same interrupt line. 2419 */ 2420 2421 2422 #if defined(PCIC_DEBUG) 2423 pcic_err(pcic->dip, 0xf, 2424 "pcic_intr: pc_intr_mode=%d pc_type=%x io_ints=0x%x\n", 2425 pcic->pc_intr_mode, pcic->pc_type, io_ints); 2426 #endif 2427 2428 if (io_ints) { 2429 if (pcic_do_io_intr(pcic, io_ints) == DDI_INTR_CLAIMED) 2430 ret = DDI_INTR_CLAIMED; 2431 } 2432 2433 mutex_exit(&pcic->intr_lock); 2434 2435 #if defined(PCIC_DEBUG) 2436 pcic_err(pcic->dip, 0xf, 2437 "pcic_intr: ret=%d value=%d DDI_INTR_CLAIMED=%d\n", 2438 ret, value, DDI_INTR_CLAIMED); 2439 #endif 2440 2441 return (ret); 2442 } 2443 2444 /* 2445 * pcic_change() 2446 * check to see if this socket had a change in state 2447 * by checking the status change register 2448 */ 2449 static int 2450 pcic_change(pcicdev_t *pcic, int socket) 2451 { 2452 return (pcic_getb(pcic, socket, PCIC_CARD_STATUS_CHANGE)); 2453 } 2454 2455 /* 2456 * pcic_do_io_intr - calls client interrupt handlers 2457 */ 2458 static int 2459 pcic_do_io_intr(pcicdev_t *pcic, uint32_t sockets) 2460 { 2461 inthandler_t *tmp; 2462 int ret = DDI_INTR_UNCLAIMED; 2463 2464 #if defined(PCIC_DEBUG) 2465 pcic_err(pcic->dip, 0xf, 2466 "pcic_do_io_intr: pcic=%p sockets=%d irq_top=%p\n", 2467 (void *)pcic, (int)sockets, (void *)pcic->irq_top); 2468 #endif 2469 2470 if (pcic->irq_top != NULL) { 2471 tmp = pcic->irq_current; 2472 2473 do { 2474 int cur = pcic->irq_current->socket; 2475 pcic_socket_t *sockp = 2476 &pcic->pc_sockets[cur]; 2477 2478 #if defined(PCIC_DEBUG) 2479 pcic_err(pcic->dip, 0xf, 2480 "\t pcs_flags=0x%x PCS_CARD_PRESENT=0x%x\n", 2481 sockp->pcs_flags, PCS_CARD_PRESENT); 2482 pcic_err(pcic->dip, 0xf, 2483 "\t sockets=%d cur=%d intr=%p arg1=%p " 2484 "arg2=%p\n", 2485 sockets, cur, (void *)pcic->irq_current->intr, 2486 pcic->irq_current->arg1, 2487 pcic->irq_current->arg2); 2488 #endif 2489 if ((sockp->pcs_flags & PCS_CARD_PRESENT) && 2490 !(sockp->pcs_flags & PCS_DEBOUNCING) && 2491 (sockets & (1 << cur))) { 2492 2493 if ((*pcic->irq_current->intr)(pcic->irq_current->arg1, 2494 pcic->irq_current->arg2) == DDI_INTR_CLAIMED) 2495 ret = DDI_INTR_CLAIMED; 2496 2497 #if defined(PCIC_DEBUG) 2498 pcic_err(pcic->dip, 0xf, 2499 "\t ret=%d DDI_INTR_CLAIMED=%d\n", 2500 ret, DDI_INTR_CLAIMED); 2501 #endif 2502 } 2503 2504 2505 if ((pcic->irq_current = pcic->irq_current->next) == NULL) 2506 pcic->irq_current = pcic->irq_top; 2507 2508 } while (pcic->irq_current != tmp); 2509 2510 if ((pcic->irq_current = pcic->irq_current->next) == NULL) 2511 pcic->irq_current = pcic->irq_top; 2512 2513 } else { 2514 ret = DDI_INTR_UNCLAIMED; 2515 } 2516 2517 #if defined(PCIC_DEBUG) 2518 pcic_err(pcic->dip, 0xf, 2519 "pcic_do_io_intr: exit ret=%d DDI_INTR_CLAIMED=%d\n", 2520 ret, DDI_INTR_CLAIMED); 2521 #endif 2522 2523 return (ret); 2524 2525 } 2526 2527 /* 2528 * pcic_inquire_adapter() 2529 * SocketServices InquireAdapter function 2530 * get characteristics of the physical adapter 2531 */ 2532 /*ARGSUSED*/ 2533 static int 2534 pcic_inquire_adapter(dev_info_t *dip, inquire_adapter_t *config) 2535 { 2536 anp_t *anp = ddi_get_driver_private(dip); 2537 pcicdev_t *pcic = anp->an_private; 2538 2539 config->NumSockets = pcic->pc_numsockets; 2540 config->NumWindows = pcic->pc_numsockets * PCIC_NUMWINSOCK; 2541 config->NumEDCs = 0; 2542 config->AdpCaps = 0; 2543 config->ActiveHigh = 0; 2544 config->ActiveLow = PCIC_AVAIL_IRQS; 2545 config->NumPower = pcic->pc_numpower; 2546 config->power_entry = pcic->pc_power; /* until we resolve this */ 2547 #if defined(PCIC_DEBUG) 2548 if (pcic_debug) { 2549 cmn_err(CE_CONT, "pcic_inquire_adapter:\n"); 2550 cmn_err(CE_CONT, "\tNumSockets=%d\n", config->NumSockets); 2551 cmn_err(CE_CONT, "\tNumWindows=%d\n", config->NumWindows); 2552 } 2553 #endif 2554 config->ResourceFlags = 0; 2555 switch (pcic->pc_intr_mode) { 2556 case PCIC_INTR_MODE_PCI_1: 2557 config->ResourceFlags |= RES_OWN_IRQ | RES_IRQ_NEXUS | 2558 RES_IRQ_SHAREABLE; 2559 break; 2560 } 2561 return (SUCCESS); 2562 } 2563 2564 /* 2565 * pcic_callback() 2566 * The PCMCIA nexus calls us via this function 2567 * in order to set the callback function we are 2568 * to call the nexus with 2569 */ 2570 /*ARGSUSED*/ 2571 static int 2572 pcic_callback(dev_info_t *dip, int (*handler)(), int arg) 2573 { 2574 anp_t *anp = ddi_get_driver_private(dip); 2575 pcicdev_t *pcic = anp->an_private; 2576 2577 if (handler != NULL) { 2578 pcic->pc_callback = handler; 2579 pcic->pc_cb_arg = arg; 2580 pcic->pc_flags |= PCF_CALLBACK; 2581 } else { 2582 pcic->pc_callback = NULL; 2583 pcic->pc_cb_arg = 0; 2584 pcic->pc_flags &= ~PCF_CALLBACK; 2585 } 2586 /* 2587 * we're now registered with the nexus 2588 * it is acceptable to do callbacks at this point. 2589 * don't call back from here though since it could block 2590 */ 2591 return (PC_SUCCESS); 2592 } 2593 2594 /* 2595 * pcic_calc_speed (pcicdev_t *pcic, uint32_t speed) 2596 * calculate the speed bits from the specified memory speed 2597 * there may be more to do here 2598 */ 2599 2600 static int 2601 pcic_calc_speed(pcicdev_t *pcic, uint32_t speed) 2602 { 2603 uint32_t wspeed = 1; /* assume 1 wait state when unknown */ 2604 uint32_t bspeed = PCIC_ISA_DEF_SYSCLK; 2605 2606 switch (pcic->pc_type) { 2607 case PCIC_I82365SL: 2608 case PCIC_VADEM: 2609 case PCIC_VADEM_VG469: 2610 default: 2611 /* Intel chip wants it in waitstates */ 2612 wspeed = mhztons(PCIC_ISA_DEF_SYSCLK) * 3; 2613 if (speed <= wspeed) 2614 wspeed = 0; 2615 else if (speed <= (wspeed += mhztons(bspeed))) 2616 wspeed = 1; 2617 else if (speed <= (wspeed += mhztons(bspeed))) 2618 wspeed = 2; 2619 else 2620 wspeed = 3; 2621 wspeed <<= 6; /* put in right bit positions */ 2622 break; 2623 2624 case PCIC_INTEL_i82092: 2625 wspeed = SYSMEM_82092_80NS; 2626 if (speed > 80) 2627 wspeed = SYSMEM_82092_100NS; 2628 if (speed > 100) 2629 wspeed = SYSMEM_82092_150NS; 2630 if (speed > 150) 2631 wspeed = SYSMEM_82092_200NS; 2632 if (speed > 200) 2633 wspeed = SYSMEM_82092_250NS; 2634 if (speed > 250) 2635 wspeed = SYSMEM_82092_600NS; 2636 wspeed <<= 5; /* put in right bit positions */ 2637 break; 2638 2639 } /* switch */ 2640 2641 return (wspeed); 2642 } 2643 2644 /* 2645 * These values are taken from the PC Card Standard Electrical Specification. 2646 * Generally the larger value is taken if 2 are possible. 2647 */ 2648 static struct pcic_card_times { 2649 uint16_t cycle; /* Speed as found in the atribute space of he card. */ 2650 uint16_t setup; /* Corresponding address setup time. */ 2651 uint16_t width; /* Corresponding width, OE or WE. */ 2652 uint16_t hold; /* Corresponding data or address hold time. */ 2653 } pcic_card_times[] = { 2654 2655 /* 2656 * Note: The rounded up times for 250, 200 & 150 have been increased 2657 * due to problems with the 3-Com ethernet cards (pcelx) on UBIIi. 2658 * See BugID 00663. 2659 */ 2660 2661 /* 2662 * Rounded up times Original times from 2663 * that add up to the the PCMCIA Spec. 2664 * cycle time. 2665 */ 2666 {600, 180, 370, 140}, /* 100, 300, 70 */ 2667 {400, 120, 300, 90}, /* Made this one up */ 2668 {250, 100, 190, 70}, /* 30, 150, 30 */ 2669 {200, 80, 170, 70}, /* 20, 120, 30 */ 2670 {150, 50, 110, 40}, /* 20, 80, 20 */ 2671 {100, 40, 80, 40}, /* 10, 60, 15 */ 2672 {0, 10, 60, 15} /* 10, 60, 15 */ 2673 }; 2674 2675 /* 2676 * pcic_set_cdtimers 2677 * This is specific to several Cirrus Logic chips 2678 */ 2679 static void 2680 pcic_set_cdtimers(pcicdev_t *pcic, int socket, uint32_t speed, int tset) 2681 { 2682 int cmd, set, rec, offset, clk_pulse; 2683 struct pcic_card_times *ctp; 2684 2685 if ((tset == IOMEM_CLTIMER_SET_1) || (tset == SYSMEM_CLTIMER_SET_1)) 2686 offset = 3; 2687 else 2688 offset = 0; 2689 2690 clk_pulse = mhztons(pcic->bus_speed); 2691 for (ctp = pcic_card_times; speed < ctp->cycle; ctp++) 2692 ; 2693 2694 /* 2695 * Add (clk_pulse/2) and an extra 1 to account for rounding errors. 2696 */ 2697 set = ((ctp->setup + 10 + 1 + (clk_pulse/2))/clk_pulse) - 1; 2698 if (set < 0) 2699 set = 0; 2700 2701 cmd = ((ctp->width + 10 + 1 + (clk_pulse/2))/clk_pulse) - 1; 2702 if (cmd < 0) 2703 cmd = 0; 2704 2705 rec = ((ctp->hold + 10 + 1 + (clk_pulse/2))/clk_pulse) - 2; 2706 if (rec < 0) 2707 rec = 0; 2708 2709 #if defined(PCIC_DEBUG) 2710 pcic_err(pcic->dip, 8, "pcic_set_cdtimers(%d, Timer Set %d)\n" 2711 "ct=%d, cp=%d, cmd=0x%x, setup=0x%x, rec=0x%x\n", 2712 (unsigned)speed, offset == 3 ? 1 : 0, 2713 ctp->cycle, clk_pulse, cmd, set, rec); 2714 #endif 2715 2716 pcic_putb(pcic, socket, PCIC_TIME_COMMAND_0 + offset, cmd); 2717 pcic_putb(pcic, socket, PCIC_TIME_SETUP_0 + offset, set); 2718 pcic_putb(pcic, socket, PCIC_TIME_RECOVER_0 + offset, rec); 2719 } 2720 2721 /* 2722 * pcic_set_window 2723 * essentially the same as the Socket Services specification 2724 * We use socket and not adapter since they are identifiable 2725 * but the rest is the same 2726 * 2727 * dip pcic driver's device information 2728 * window parameters for the request 2729 */ 2730 static int 2731 pcic_set_window(dev_info_t *dip, set_window_t *window) 2732 { 2733 anp_t *anp = ddi_get_driver_private(dip); 2734 pcicdev_t *pcic = anp->an_private; 2735 int select; 2736 int socket, pages, which, ret; 2737 pcic_socket_t *sockp = &pcic->pc_sockets[window->socket]; 2738 ra_return_t res; 2739 ndi_ra_request_t req; 2740 uint32_t base = window->base; 2741 2742 #if defined(PCIC_DEBUG) 2743 if (pcic_debug) { 2744 cmn_err(CE_CONT, "pcic_set_window: entered\n"); 2745 cmn_err(CE_CONT, 2746 "\twindow=%d, socket=%d, WindowSize=%d, speed=%d\n", 2747 window->window, window->socket, window->WindowSize, 2748 window->speed); 2749 cmn_err(CE_CONT, 2750 "\tbase=%x, state=%x\n", (unsigned)window->base, 2751 (unsigned)window->state); 2752 } 2753 #endif 2754 2755 /* 2756 * do some basic sanity checking on what we support 2757 * we don't do paged mode 2758 */ 2759 if (window->state & WS_PAGED) { 2760 cmn_err(CE_WARN, "pcic_set_window: BAD_ATTRIBUTE\n"); 2761 return (BAD_ATTRIBUTE); 2762 } 2763 2764 /* 2765 * we don't care about previous mappings. 2766 * Card Services will deal with that so don't 2767 * even check 2768 */ 2769 2770 socket = window->socket; 2771 2772 if (!(window->state & WS_IO)) { 2773 int win, tmp; 2774 pcs_memwin_t *memp; 2775 #if defined(PCIC_DEBUG) 2776 if (pcic_debug) 2777 cmn_err(CE_CONT, "\twindow type is memory\n"); 2778 #endif 2779 /* this is memory window mapping */ 2780 win = window->window % PCIC_NUMWINSOCK; 2781 tmp = window->window / PCIC_NUMWINSOCK; 2782 2783 /* only windows 2-6 can do memory mapping */ 2784 if (tmp != window->socket || win < PCIC_IOWINDOWS) { 2785 cmn_err(CE_CONT, 2786 "\tattempt to map to non-mem window\n"); 2787 return (BAD_WINDOW); 2788 } 2789 2790 if (window->WindowSize == 0) 2791 window->WindowSize = MEM_MIN; 2792 else if ((window->WindowSize & (PCIC_PAGE-1)) != 0) { 2793 cmn_err(CE_WARN, "pcic_set_window: BAD_SIZE\n"); 2794 return (BAD_SIZE); 2795 } 2796 2797 mutex_enter(&pcic->pc_lock); /* protect the registers */ 2798 2799 memp = &sockp->pcs_windows[win].mem; 2800 memp->pcw_speed = window->speed; 2801 2802 win -= PCIC_IOWINDOWS; /* put in right range */ 2803 2804 if (window->WindowSize != memp->pcw_len) 2805 which = memp->pcw_len; 2806 else 2807 which = 0; 2808 2809 if (window->state & WS_ENABLED) { 2810 uint32_t wspeed; 2811 #if defined(PCIC_DEBUG) 2812 if (pcic_debug) { 2813 cmn_err(CE_CONT, 2814 "\tbase=%x, win=%d\n", (unsigned)base, 2815 win); 2816 if (which) 2817 cmn_err(CE_CONT, 2818 "\tneed to remap window\n"); 2819 } 2820 #endif 2821 2822 if (which && (memp->pcw_status & PCW_MAPPED)) { 2823 ddi_regs_map_free(&memp->pcw_handle); 2824 res.ra_addr_lo = memp->pcw_base; 2825 res.ra_len = memp->pcw_len; 2826 (void) pcmcia_free_mem(memp->res_dip, &res); 2827 memp->pcw_status &= ~(PCW_MAPPED|PCW_ENABLED); 2828 memp->pcw_hostmem = NULL; 2829 memp->pcw_base = NULL; 2830 memp->pcw_len = 0; 2831 } 2832 2833 which = window->WindowSize >> PAGE_SHIFT; 2834 2835 if (!(memp->pcw_status & PCW_MAPPED)) { 2836 ret = 0; 2837 2838 memp->pcw_base = base; 2839 bzero(&req, sizeof (req)); 2840 req.ra_len = which << PAGE_SHIFT; 2841 req.ra_addr = (uint64_t)memp->pcw_base; 2842 req.ra_boundbase = pcic->pc_base; 2843 req.ra_boundlen = pcic->pc_bound; 2844 req.ra_flags = (memp->pcw_base ? 2845 NDI_RA_ALLOC_SPECIFIED : 0) | 2846 NDI_RA_ALLOC_BOUNDED; 2847 req.ra_align_mask = 2848 (PAGESIZE - 1) | (PCIC_PAGE - 1); 2849 #if defined(PCIC_DEBUG) 2850 pcic_err(dip, 8, 2851 "\tlen 0x%"PRIx64 2852 "addr 0x%"PRIx64"bbase 0x%"PRIx64 2853 " blen 0x%"PRIx64" flags 0x%x" 2854 " algn 0x%"PRIx64"\n", 2855 req.ra_len, req.ra_addr, 2856 req.ra_boundbase, 2857 req.ra_boundlen, req.ra_flags, 2858 req.ra_align_mask); 2859 #endif 2860 2861 ret = pcmcia_alloc_mem(dip, &req, &res, 2862 &memp->res_dip); 2863 if (ret == DDI_FAILURE) { 2864 mutex_exit(&pcic->pc_lock); 2865 cmn_err(CE_WARN, 2866 "\tpcmcia_alloc_mem() failed\n"); 2867 return (BAD_SIZE); 2868 } 2869 memp->pcw_base = res.ra_addr_lo; 2870 base = memp->pcw_base; 2871 2872 #if defined(PCIC_DEBUG) 2873 if (pcic_debug) 2874 cmn_err(CE_CONT, 2875 "\tsetwindow: new base=%x\n", 2876 (unsigned)memp->pcw_base); 2877 #endif 2878 memp->pcw_len = window->WindowSize; 2879 2880 which = pcmcia_map_reg(pcic->dip, 2881 window->child, 2882 &res, 2883 (uint32_t)(window->state & 2884 0xffff) | 2885 (window->socket << 16), 2886 (caddr_t *)&memp->pcw_hostmem, 2887 &memp->pcw_handle, 2888 &window->attr, NULL); 2889 2890 if (which != DDI_SUCCESS) { 2891 2892 cmn_err(CE_WARN, "\tpcmcia_map_reg() " 2893 "failed\n"); 2894 2895 res.ra_addr_lo = memp->pcw_base; 2896 res.ra_len = memp->pcw_len; 2897 (void) pcmcia_free_mem(memp->res_dip, 2898 &res); 2899 2900 mutex_exit(&pcic->pc_lock); 2901 2902 return (BAD_WINDOW); 2903 } 2904 memp->pcw_status |= PCW_MAPPED; 2905 #if defined(PCIC_DEBUG) 2906 if (pcic_debug) 2907 cmn_err(CE_CONT, 2908 "\tmap=%x, hostmem=%p\n", 2909 which, 2910 (void *)memp->pcw_hostmem); 2911 #endif 2912 } else { 2913 base = memp->pcw_base; 2914 } 2915 2916 /* report the handle back to caller */ 2917 window->handle = memp->pcw_handle; 2918 2919 #if defined(PCIC_DEBUG) 2920 if (pcic_debug) { 2921 cmn_err(CE_CONT, 2922 "\twindow mapped to %x@%x len=%d\n", 2923 (unsigned)window->base, 2924 (unsigned)memp->pcw_base, 2925 memp->pcw_len); 2926 } 2927 #endif 2928 2929 /* find the register set offset */ 2930 select = win * PCIC_MEM_1_OFFSET; 2931 #if defined(PCIC_DEBUG) 2932 if (pcic_debug) 2933 cmn_err(CE_CONT, "\tselect=%x\n", select); 2934 #endif 2935 2936 /* 2937 * at this point, the register window indicator has 2938 * been converted to be an offset from the first 2939 * set of registers that are used for programming 2940 * the window mapping and the offset used to select 2941 * the correct set of registers to access the 2942 * specified socket. This allows basing everything 2943 * off the _0 window 2944 */ 2945 2946 /* map the physical page base address */ 2947 which = (window->state & WS_16BIT) ? SYSMEM_DATA_16 : 0; 2948 which |= (window->speed <= MEM_SPEED_MIN) ? 2949 SYSMEM_ZERO_WAIT : 0; 2950 2951 /* need to select register set */ 2952 select = PCIC_MEM_1_OFFSET * win; 2953 2954 pcic_putb(pcic, socket, 2955 PCIC_SYSMEM_0_STARTLOW + select, 2956 SYSMEM_LOW(base)); 2957 pcic_putb(pcic, socket, 2958 PCIC_SYSMEM_0_STARTHI + select, 2959 SYSMEM_HIGH(base) | which); 2960 2961 /* 2962 * Some adapters can decode window addresses greater 2963 * than 16-bits worth, so handle them here. 2964 */ 2965 switch (pcic->pc_type) { 2966 case PCIC_INTEL_i82092: 2967 pcic_putb(pcic, socket, 2968 PCIC_82092_CPAGE, 2969 SYSMEM_EXT(base)); 2970 break; 2971 case PCIC_CL_PD6729: 2972 case PCIC_CL_PD6730: 2973 clext_reg_write(pcic, socket, 2974 PCIC_CLEXT_MMAP0_UA + win, 2975 SYSMEM_EXT(base)); 2976 break; 2977 case PCIC_TI_PCI1130: 2978 /* 2979 * Note that the TI chip has one upper byte 2980 * per socket so all windows get bound to a 2981 * 16MB segment. This must be detected and 2982 * handled appropriately. We can detect that 2983 * it is done by seeing if the pc_base has 2984 * changed and changing when the register 2985 * is first set. This will force the bounds 2986 * to be correct. 2987 */ 2988 if (pcic->pc_bound == 0xffffffff) { 2989 pcic_putb(pcic, socket, 2990 PCIC_TI_WINDOW_PAGE_PCI, 2991 SYSMEM_EXT(base)); 2992 pcic->pc_base = SYSMEM_EXT(base) << 24; 2993 pcic->pc_bound = 0x1000000; 2994 } 2995 break; 2996 case PCIC_TI_PCI1031: 2997 case PCIC_TI_PCI1131: 2998 case PCIC_TI_PCI1250: 2999 case PCIC_TI_PCI1225: 3000 case PCIC_TI_PCI1221: 3001 case PCIC_SMC_34C90: 3002 case PCIC_CL_PD6832: 3003 case PCIC_RICOH_RL5C466: 3004 case PCIC_TI_PCI1410: 3005 case PCIC_ENE_1410: 3006 case PCIC_TI_PCI1510: 3007 case PCIC_TI_PCI1520: 3008 case PCIC_O2_OZ6912: 3009 case PCIC_TI_PCI1420: 3010 case PCIC_ENE_1420: 3011 case PCIC_TI_VENDOR: 3012 case PCIC_TOSHIBA_TOPIC100: 3013 case PCIC_TOSHIBA_TOPIC95: 3014 case PCIC_TOSHIBA_VENDOR: 3015 case PCIC_RICOH_VENDOR: 3016 case PCIC_O2MICRO_VENDOR: 3017 pcic_putb(pcic, socket, 3018 PCIC_YENTA_MEM_PAGE + win, 3019 SYSMEM_EXT(base)); 3020 break; 3021 default: 3022 cmn_err(CE_NOTE, "pcic_set_window: unknown " 3023 "cardbus vendor:0x%X\n", 3024 pcic->pc_type); 3025 pcic_putb(pcic, socket, 3026 PCIC_YENTA_MEM_PAGE + win, 3027 SYSMEM_EXT(base)); 3028 3029 break; 3030 } /* switch */ 3031 3032 /* 3033 * specify the length of the mapped range 3034 * we convert to pages (rounding up) so that 3035 * the hardware gets the right thing 3036 */ 3037 pages = (window->WindowSize+PCIC_PAGE-1)/PCIC_PAGE; 3038 3039 /* 3040 * Setup this window's timing. 3041 */ 3042 switch (pcic->pc_type) { 3043 case PCIC_CL_PD6729: 3044 case PCIC_CL_PD6730: 3045 case PCIC_CL_PD6710: 3046 case PCIC_CL_PD6722: 3047 wspeed = SYSMEM_CLTIMER_SET_0; 3048 pcic_set_cdtimers(pcic, socket, 3049 window->speed, 3050 wspeed); 3051 break; 3052 3053 case PCIC_INTEL_i82092: 3054 default: 3055 wspeed = pcic_calc_speed(pcic, window->speed); 3056 break; 3057 } /* switch */ 3058 3059 #if defined(PCIC_DEBUG) 3060 if (pcic_debug) 3061 cmn_err(CE_CONT, 3062 "\twindow %d speed bits = %x for " 3063 "%dns\n", 3064 win, (unsigned)wspeed, window->speed); 3065 #endif 3066 3067 pcic_putb(pcic, socket, PCIC_SYSMEM_0_STOPLOW + select, 3068 SYSMEM_LOW(base + 3069 (pages * PCIC_PAGE)-1)); 3070 3071 wspeed |= SYSMEM_HIGH(base + (pages * PCIC_PAGE)-1); 3072 pcic_putb(pcic, socket, PCIC_SYSMEM_0_STOPHI + select, 3073 wspeed); 3074 3075 /* 3076 * now map the card's memory pages - we start with page 3077 * 0 3078 * we also default to AM -- set page might change it 3079 */ 3080 base = memp->pcw_base; 3081 pcic_putb(pcic, socket, 3082 PCIC_CARDMEM_0_LOW + select, 3083 CARDMEM_LOW(0 - (uint32_t)base)); 3084 3085 pcic_putb(pcic, socket, 3086 PCIC_CARDMEM_0_HI + select, 3087 CARDMEM_HIGH(0 - (uint32_t)base) | 3088 CARDMEM_REG_ACTIVE); 3089 3090 /* 3091 * enable the window even though redundant 3092 * and SetPage may do it again. 3093 */ 3094 select = pcic_getb(pcic, socket, 3095 PCIC_MAPPING_ENABLE); 3096 select |= SYSMEM_WINDOW(win); 3097 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, select); 3098 memp->pcw_offset = 0; 3099 memp->pcw_status |= PCW_ENABLED; 3100 } else { 3101 /* 3102 * not only do we unmap the memory, the 3103 * window has been turned off. 3104 */ 3105 if (which && memp->pcw_status & PCW_MAPPED) { 3106 ddi_regs_map_free(&memp->pcw_handle); 3107 res.ra_addr_lo = memp->pcw_base; 3108 res.ra_len = memp->pcw_len; 3109 (void) pcmcia_free_mem(memp->res_dip, &res); 3110 memp->pcw_hostmem = NULL; 3111 memp->pcw_status &= ~PCW_MAPPED; 3112 } 3113 3114 /* disable current mapping */ 3115 select = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE); 3116 select &= ~SYSMEM_WINDOW(win); 3117 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, select); 3118 memp->pcw_status &= ~PCW_ENABLED; 3119 } 3120 memp->pcw_len = window->WindowSize; 3121 window->handle = memp->pcw_handle; 3122 #if defined(PCIC_DEBUG) 3123 if (pcic_debug) 3124 xxdmp_all_regs(pcic, window->socket, -1); 3125 #endif 3126 } else { 3127 /* 3128 * This is a request for an IO window 3129 */ 3130 int win, tmp; 3131 pcs_iowin_t *winp; 3132 /* I/O windows */ 3133 #if defined(PCIC_DEBUG) 3134 if (pcic_debug) 3135 cmn_err(CE_CONT, "\twindow type is I/O\n"); 3136 #endif 3137 3138 /* only windows 0 and 1 can do I/O */ 3139 win = window->window % PCIC_NUMWINSOCK; 3140 tmp = window->window / PCIC_NUMWINSOCK; 3141 3142 if (win >= PCIC_IOWINDOWS || tmp != window->socket) { 3143 cmn_err(CE_WARN, 3144 "\twindow is out of range (%d)\n", 3145 window->window); 3146 return (BAD_WINDOW); 3147 } 3148 3149 mutex_enter(&pcic->pc_lock); /* protect the registers */ 3150 3151 winp = &sockp->pcs_windows[win].io; 3152 winp->pcw_speed = window->speed; 3153 if (window->WindowSize != 1 && window->WindowSize & 1) { 3154 /* we don't want an odd-size window */ 3155 window->WindowSize++; 3156 } 3157 winp->pcw_len = window->WindowSize; 3158 3159 if (window->state & WS_ENABLED) { 3160 if (winp->pcw_status & PCW_MAPPED) { 3161 ddi_regs_map_free(&winp->pcw_handle); 3162 res.ra_addr_lo = winp->pcw_base; 3163 res.ra_len = winp->pcw_len; 3164 (void) pcmcia_free_io(winp->res_dip, &res); 3165 winp->pcw_status &= ~(PCW_MAPPED|PCW_ENABLED); 3166 } 3167 3168 /* 3169 * if the I/O address wasn't allocated, allocate 3170 * it now. If it was allocated, it better 3171 * be free to use. 3172 * The winp->pcw_offset value is set and used 3173 * later on if the particular adapter 3174 * that we're running on has the ability 3175 * to translate IO accesses to the card 3176 * (such as some adapters in the Cirrus 3177 * Logic family). 3178 */ 3179 winp->pcw_offset = 0; 3180 3181 /* 3182 * Setup the request parameters for the 3183 * requested base and length. If 3184 * we're on an adapter that has 3185 * IO window offset registers, then 3186 * we don't need a specific base 3187 * address, just a length, and then 3188 * we'll cause the correct IO address 3189 * to be generated on the socket by 3190 * setting up the IO window offset 3191 * registers. 3192 * For adapters that support this capability, we 3193 * always use the IO window offset registers, 3194 * even if the passed base/length would be in 3195 * range. 3196 */ 3197 base = window->base; 3198 bzero(&req, sizeof (req)); 3199 req.ra_len = window->WindowSize; 3200 3201 req.ra_addr = (uint64_t) 3202 ((pcic->pc_flags & PCF_IO_REMAP) ? 0 : base); 3203 req.ra_flags = (req.ra_addr) ? 3204 NDI_RA_ALLOC_SPECIFIED : 0; 3205 3206 req.ra_flags |= NDI_RA_ALIGN_SIZE; 3207 /* need to rethink this */ 3208 req.ra_boundbase = pcic->pc_iobase; 3209 req.ra_boundlen = pcic->pc_iobound; 3210 req.ra_flags |= NDI_RA_ALLOC_BOUNDED; 3211 3212 #if defined(PCIC_DEBUG) 3213 pcic_err(dip, 8, 3214 "\tlen 0x%"PRIx64" addr 0x%"PRIx64 3215 "bbase 0x%"PRIx64 3216 "blen 0x%"PRIx64" flags 0x%x algn 0x%" 3217 PRIx64"\n", 3218 req.ra_len, (uint64_t)req.ra_addr, 3219 req.ra_boundbase, 3220 req.ra_boundlen, req.ra_flags, 3221 req.ra_align_mask); 3222 #endif 3223 3224 /* 3225 * Try to allocate the space. If we fail this, 3226 * return the appropriate error depending 3227 * on whether the caller specified a 3228 * specific base address or not. 3229 */ 3230 if (pcmcia_alloc_io(dip, &req, &res, 3231 &winp->res_dip) == DDI_FAILURE) { 3232 winp->pcw_status &= ~PCW_ENABLED; 3233 mutex_exit(&pcic->pc_lock); 3234 cmn_err(CE_WARN, "Failed to alloc I/O:\n" 3235 "\tlen 0x%" PRIx64 " addr 0x%" PRIx64 3236 "bbase 0x%" PRIx64 3237 "blen 0x%" PRIx64 "flags 0x%x" 3238 "algn 0x%" PRIx64 "\n", 3239 req.ra_len, req.ra_addr, 3240 req.ra_boundbase, 3241 req.ra_boundlen, req.ra_flags, 3242 req.ra_align_mask); 3243 3244 return (base?BAD_BASE:BAD_SIZE); 3245 } /* pcmcia_alloc_io */ 3246 3247 /* 3248 * Don't change the original base. Either we use 3249 * the offset registers below (PCF_IO_REMAP is set) 3250 * or it was allocated correctly anyway. 3251 */ 3252 winp->pcw_base = res.ra_addr_lo; 3253 3254 #if defined(PCIC_DEBUG) 3255 pcic_err(dip, 8, 3256 "\tsetwindow: new base=%x orig base 0x%x\n", 3257 (unsigned)winp->pcw_base, base); 3258 #endif 3259 3260 if ((which = pcmcia_map_reg(pcic->dip, 3261 window->child, 3262 &res, 3263 (uint32_t)(window->state & 3264 0xffff) | 3265 (window->socket << 16), 3266 (caddr_t *)&winp->pcw_hostmem, 3267 &winp->pcw_handle, 3268 &window->attr, 3269 base)) != DDI_SUCCESS) { 3270 3271 cmn_err(CE_WARN, "pcmcia_map_reg()" 3272 "failed\n"); 3273 3274 res.ra_addr_lo = winp->pcw_base; 3275 res.ra_len = winp->pcw_len; 3276 (void) pcmcia_free_io(winp->res_dip, 3277 &res); 3278 3279 mutex_exit(&pcic->pc_lock); 3280 return (BAD_WINDOW); 3281 } 3282 3283 window->handle = winp->pcw_handle; 3284 winp->pcw_status |= PCW_MAPPED; 3285 3286 /* find the register set offset */ 3287 select = win * PCIC_IO_OFFSET; 3288 3289 #if defined(PCIC_DEBUG) 3290 if (pcic_debug) { 3291 cmn_err(CE_CONT, 3292 "\tenable: window=%d, select=%x, " 3293 "base=%x, handle=%p\n", 3294 win, select, 3295 (unsigned)window->base, 3296 (void *)window->handle); 3297 } 3298 #endif 3299 /* 3300 * at this point, the register window indicator has 3301 * been converted to be an offset from the first 3302 * set of registers that are used for programming 3303 * the window mapping and the offset used to select 3304 * the correct set of registers to access the 3305 * specified socket. This allows basing everything 3306 * off the _0 window 3307 */ 3308 3309 /* map the I/O base in */ 3310 pcic_putb(pcic, socket, 3311 PCIC_IO_ADDR_0_STARTLOW + select, 3312 LOW_BYTE((uint32_t)winp->pcw_base)); 3313 pcic_putb(pcic, socket, 3314 PCIC_IO_ADDR_0_STARTHI + select, 3315 HIGH_BYTE((uint32_t)winp->pcw_base)); 3316 3317 pcic_putb(pcic, socket, 3318 PCIC_IO_ADDR_0_STOPLOW + select, 3319 LOW_BYTE((uint32_t)winp->pcw_base + 3320 window->WindowSize - 1)); 3321 pcic_putb(pcic, socket, 3322 PCIC_IO_ADDR_0_STOPHI + select, 3323 HIGH_BYTE((uint32_t)winp->pcw_base + 3324 window->WindowSize - 1)); 3325 3326 /* 3327 * We've got the requested IO space, now see if we 3328 * need to adjust the IO window offset registers 3329 * so that the correct IO address is generated 3330 * at the socket. If this window doesn't have 3331 * this capability, then we're all done setting 3332 * up the IO resources. 3333 */ 3334 if (pcic->pc_flags & PCF_IO_REMAP) { 3335 3336 3337 /* 3338 * Note that only 16 bits are used to program 3339 * the registers but leave 32 bits on pcw_offset 3340 * so that we can generate the original base 3341 * in get_window() 3342 */ 3343 winp->pcw_offset = (base - winp->pcw_base); 3344 3345 pcic_putb(pcic, socket, 3346 PCIC_IO_OFFSET_LOW + 3347 (win * PCIC_IO_OFFSET_OFFSET), 3348 winp->pcw_offset & 0x0ff); 3349 pcic_putb(pcic, socket, 3350 PCIC_IO_OFFSET_HI + 3351 (win * PCIC_IO_OFFSET_OFFSET), 3352 (winp->pcw_offset >> 8) & 0x0ff); 3353 3354 } /* PCF_IO_REMAP */ 3355 3356 /* now get the other details (size, etc) right */ 3357 3358 /* 3359 * Set the data size control bits here. Most of the 3360 * adapters will ignore IOMEM_16BIT when 3361 * IOMEM_IOCS16 is set, except for the Intel 3362 * 82092, which only pays attention to the 3363 * IOMEM_16BIT bit. Sigh... Intel can't even 3364 * make a proper clone of their own chip. 3365 * The 82092 also apparently can't set the timing 3366 * of I/O windows. 3367 */ 3368 which = (window->state & WS_16BIT) ? 3369 (IOMEM_16BIT | IOMEM_IOCS16) : 0; 3370 3371 switch (pcic->pc_type) { 3372 case PCIC_CL_PD6729: 3373 case PCIC_CL_PD6730: 3374 case PCIC_CL_PD6710: 3375 case PCIC_CL_PD6722: 3376 case PCIC_CL_PD6832: 3377 /* 3378 * Select Timer Set 1 - this will take 3379 * effect when the PCIC_IO_CONTROL 3380 * register is written to later on; 3381 * the call to pcic_set_cdtimers 3382 * just sets up the timer itself. 3383 */ 3384 which |= IOMEM_CLTIMER_SET_1; 3385 pcic_set_cdtimers(pcic, socket, 3386 window->speed, 3387 IOMEM_CLTIMER_SET_1); 3388 which |= IOMEM_IOCS16; 3389 break; 3390 case PCIC_TI_PCI1031: 3391 3392 if (window->state & WS_16BIT) 3393 which |= IOMEM_WAIT16; 3394 3395 break; 3396 case PCIC_TI_PCI1130: 3397 3398 if (window->state & WS_16BIT) 3399 which |= IOMEM_WAIT16; 3400 3401 break; 3402 case PCIC_INTEL_i82092: 3403 break; 3404 default: 3405 if (window->speed > 3406 mhztons(pcic->bus_speed) * 3) 3407 which |= IOMEM_WAIT16; 3408 #ifdef notdef 3409 if (window->speed < 3410 mhztons(pcic->bus_speed) * 6) 3411 which |= IOMEM_ZERO_WAIT; 3412 #endif 3413 break; 3414 } /* switch (pc_type) */ 3415 3416 /* 3417 * Setup the data width and timing 3418 */ 3419 select = pcic_getb(pcic, socket, PCIC_IO_CONTROL); 3420 select &= ~(PCIC_IO_WIN_MASK << (win * 4)); 3421 select |= IOMEM_SETWIN(win, which); 3422 pcic_putb(pcic, socket, PCIC_IO_CONTROL, select); 3423 3424 /* 3425 * Enable the IO window 3426 */ 3427 select = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE); 3428 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, 3429 select | IOMEM_WINDOW(win)); 3430 3431 winp->pcw_status |= PCW_ENABLED; 3432 3433 #if defined(PCIC_DEBUG) 3434 if (pcic_debug) { 3435 cmn_err(CE_CONT, 3436 "\twhich = %x, select = %x (%x)\n", 3437 which, select, 3438 IOMEM_SETWIN(win, which)); 3439 xxdmp_all_regs(pcic, window->socket * 0x40, 24); 3440 } 3441 #endif 3442 } else { 3443 /* 3444 * not only do we unmap the IO space, the 3445 * window has been turned off. 3446 */ 3447 if (winp->pcw_status & PCW_MAPPED) { 3448 ddi_regs_map_free(&winp->pcw_handle); 3449 res.ra_addr_lo = winp->pcw_base; 3450 res.ra_len = winp->pcw_len; 3451 (void) pcmcia_free_io(winp->res_dip, &res); 3452 winp->pcw_status &= ~PCW_MAPPED; 3453 } 3454 3455 /* disable current mapping */ 3456 select = pcic_getb(pcic, socket, 3457 PCIC_MAPPING_ENABLE); 3458 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, 3459 select &= ~IOMEM_WINDOW(win)); 3460 winp->pcw_status &= ~PCW_ENABLED; 3461 3462 winp->pcw_base = 0; 3463 winp->pcw_len = 0; 3464 winp->pcw_offset = 0; 3465 window->base = 0; 3466 /* now make sure we don't accidentally re-enable */ 3467 /* find the register set offset */ 3468 select = win * PCIC_IO_OFFSET; 3469 pcic_putb(pcic, socket, 3470 PCIC_IO_ADDR_0_STARTLOW + select, 0); 3471 pcic_putb(pcic, socket, 3472 PCIC_IO_ADDR_0_STARTHI + select, 0); 3473 pcic_putb(pcic, socket, 3474 PCIC_IO_ADDR_0_STOPLOW + select, 0); 3475 pcic_putb(pcic, socket, 3476 PCIC_IO_ADDR_0_STOPHI + select, 0); 3477 } 3478 } 3479 mutex_exit(&pcic->pc_lock); 3480 3481 return (SUCCESS); 3482 } 3483 3484 /* 3485 * pcic_card_state() 3486 * compute the instantaneous Card State information 3487 */ 3488 static int 3489 pcic_card_state(pcicdev_t *pcic, pcic_socket_t *sockp) 3490 { 3491 int value, result; 3492 #if defined(PCIC_DEBUG) 3493 int orig_value; 3494 #endif 3495 3496 mutex_enter(&pcic->pc_lock); /* protect the registers */ 3497 3498 value = pcic_getb(pcic, sockp->pcs_socket, PCIC_INTERFACE_STATUS); 3499 3500 #if defined(PCIC_DEBUG) 3501 orig_value = value; 3502 if (pcic_debug >= 8) 3503 cmn_err(CE_CONT, "pcic_card_state(%p) if status = %b for %d\n", 3504 (void *)sockp, 3505 value, 3506 "\020\1BVD1\2BVD2\3CD1\4CD2\5WP\6RDY\7PWR\10~GPI", 3507 sockp->pcs_socket); 3508 #endif 3509 /* 3510 * Lie to socket services if we are not ready. 3511 * This is when we are starting up or during debounce timeouts 3512 * or if the card is a cardbus card. 3513 */ 3514 if (!(sockp->pcs_flags & (PCS_STARTING|PCS_CARD_ISCARDBUS)) && 3515 !sockp->pcs_debounce_id && 3516 (value & PCIC_ISTAT_CD_MASK) == PCIC_CD_PRESENT_OK) { 3517 result = SBM_CD; 3518 3519 if (value & PCIC_WRITE_PROTECT || !(value & PCIC_POWER_ON)) 3520 result |= SBM_WP; 3521 if (value & PCIC_POWER_ON) { 3522 if (value & PCIC_READY) 3523 result |= SBM_RDYBSY; 3524 value = (~value) & (PCIC_BVD1 | PCIC_BVD2); 3525 if (value & PCIC_BVD1) 3526 result |= SBM_BVD1; 3527 if (value & PCIC_BVD2) 3528 result |= SBM_BVD2; 3529 } 3530 } else 3531 result = 0; 3532 3533 mutex_exit(&pcic->pc_lock); 3534 3535 #if defined(PCIC_DEBUG) 3536 pcic_err(pcic->dip, 8, 3537 "pcic_card_state(%p) if status = %b for %d (rval=0x%x)\n", 3538 (void *) sockp, orig_value, 3539 "\020\1BVD1\2BVD2\3CD1\4CD2\5WP\6RDY\7PWR\10~GPI", 3540 sockp->pcs_socket, result); 3541 #endif 3542 3543 return (result); 3544 } 3545 3546 /* 3547 * pcic_set_page() 3548 * SocketServices SetPage function 3549 * set the page of PC Card memory that should be in the mapped 3550 * window 3551 */ 3552 /*ARGSUSED*/ 3553 static int 3554 pcic_set_page(dev_info_t *dip, set_page_t *page) 3555 { 3556 anp_t *anp = ddi_get_driver_private(dip); 3557 pcicdev_t *pcic = anp->an_private; 3558 int select; 3559 int which, socket, window; 3560 uint32_t base; 3561 pcs_memwin_t *memp; 3562 3563 /* get real socket/window numbers */ 3564 window = page->window % PCIC_NUMWINSOCK; 3565 socket = page->window / PCIC_NUMWINSOCK; 3566 3567 #if defined(PCIC_DEBUG) 3568 if (pcic_debug) { 3569 cmn_err(CE_CONT, 3570 "pcic_set_page: window=%d, socket=%d, page=%d\n", 3571 window, socket, page->page); 3572 } 3573 #endif 3574 /* only windows 2-6 work on memory */ 3575 if (window < PCIC_IOWINDOWS) 3576 return (BAD_WINDOW); 3577 3578 /* only one page supported (but any size) */ 3579 if (page->page != 0) 3580 return (BAD_PAGE); 3581 3582 mutex_enter(&pcic->pc_lock); /* protect the registers */ 3583 3584 memp = &pcic->pc_sockets[socket].pcs_windows[window].mem; 3585 window -= PCIC_IOWINDOWS; 3586 3587 #if defined(PCIC_DEBUG) 3588 if (pcic_debug) 3589 cmn_err(CE_CONT, "\tpcw_base=%x, pcw_hostmem=%p, pcw_len=%x\n", 3590 (uint32_t)memp->pcw_base, 3591 (void *)memp->pcw_hostmem, memp->pcw_len); 3592 #endif 3593 3594 /* window must be enabled */ 3595 if (!(memp->pcw_status & PCW_ENABLED)) 3596 return (BAD_ATTRIBUTE); 3597 3598 /* find the register set offset */ 3599 select = window * PCIC_MEM_1_OFFSET; 3600 #if defined(PCIC_DEBUG) 3601 if (pcic_debug) 3602 cmn_err(CE_CONT, "\tselect=%x\n", select); 3603 #endif 3604 3605 /* 3606 * now map the card's memory pages - we start with page 0 3607 */ 3608 3609 which = 0; /* assume simple case */ 3610 if (page->state & PS_ATTRIBUTE) { 3611 which |= CARDMEM_REG_ACTIVE; 3612 memp->pcw_status |= PCW_ATTRIBUTE; 3613 } else { 3614 memp->pcw_status &= ~PCW_ATTRIBUTE; 3615 } 3616 3617 /* 3618 * if caller says Write Protect, enforce it. 3619 */ 3620 if (page->state & PS_WP) { 3621 which |= CARDMEM_WRITE_PROTECT; 3622 memp->pcw_status |= PCW_WP; 3623 } else { 3624 memp->pcw_status &= ~PCW_WP; 3625 } 3626 #if defined(PCIC_DEBUG) 3627 if (pcic_debug) { 3628 cmn_err(CE_CONT, "\tmemory type = %s\n", 3629 (which & CARDMEM_REG_ACTIVE) ? "attribute" : "common"); 3630 if (which & CARDMEM_WRITE_PROTECT) 3631 cmn_err(CE_CONT, "\twrite protect\n"); 3632 cmn_err(CE_CONT, "\tpage offset=%x pcw_base=%x (%x)\n", 3633 (unsigned)page->offset, 3634 (unsigned)memp->pcw_base, 3635 (int)page->offset - (int)memp->pcw_base & 0xffffff); 3636 } 3637 #endif 3638 /* address computation based on 64MB range and not larger */ 3639 base = (uint32_t)memp->pcw_base & 0x3ffffff; 3640 pcic_putb(pcic, socket, PCIC_CARDMEM_0_LOW + select, 3641 CARDMEM_LOW((int)page->offset - (int)base)); 3642 (void) pcic_getb(pcic, socket, PCIC_CARDMEM_0_LOW + select); 3643 pcic_putb(pcic, socket, PCIC_CARDMEM_0_HI + select, 3644 CARDMEM_HIGH((int)page->offset - base) | which); 3645 (void) pcic_getb(pcic, socket, PCIC_CARDMEM_0_HI + select); 3646 3647 /* 3648 * while not really necessary, this just makes sure 3649 * nothing turned the window off behind our backs 3650 */ 3651 which = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE); 3652 which |= SYSMEM_WINDOW(window); 3653 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, which); 3654 (void) pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE); 3655 3656 memp->pcw_offset = (off_t)page->offset; 3657 3658 #if defined(PCIC_DEBUG) 3659 if (pcic_debug) { 3660 cmn_err(CE_CONT, "\tbase=%p, *base=%x\n", 3661 (void *)memp->pcw_hostmem, 3662 (uint32_t)*memp->pcw_hostmem); 3663 3664 xxdmp_all_regs(pcic, socket, -1); 3665 3666 cmn_err(CE_CONT, "\tbase=%p, *base=%x\n", 3667 (void *)memp->pcw_hostmem, 3668 (uint32_t)*memp->pcw_hostmem); 3669 } 3670 #endif 3671 3672 if (which & PCW_ATTRIBUTE) 3673 pcic_mswait(pcic, socket, 2); 3674 3675 mutex_exit(&pcic->pc_lock); 3676 3677 return (SUCCESS); 3678 } 3679 3680 /* 3681 * pcic_set_vcc_level() 3682 * 3683 * set voltage based on adapter information 3684 * 3685 * this routine implements a limited solution for support of 3.3v cards. 3686 * the general solution, which would fully support the pcmcia spec 3687 * as far as allowing client drivers to request which voltage levels 3688 * to be set, requires more framework support and driver changes - ess 3689 */ 3690 static int 3691 pcic_set_vcc_level(pcicdev_t *pcic, set_socket_t *socket) 3692 { 3693 uint32_t socket_present_state; 3694 3695 #if defined(PCIC_DEBUG) 3696 if (pcic_debug) { 3697 cmn_err(CE_CONT, 3698 "pcic_set_vcc_level(pcic=%p, VccLevel=%d)\n", 3699 (void *)pcic, socket->VccLevel); 3700 } 3701 #endif 3702 3703 /* 3704 * check VccLevel 3705 * if this is zero, power is being turned off 3706 * if it is non-zero, power is being turned on. 3707 */ 3708 if (socket->VccLevel == 0) { 3709 return (0); 3710 } 3711 3712 /* 3713 * range checking for sanity's sake 3714 */ 3715 if (socket->VccLevel >= pcic->pc_numpower) { 3716 return (BAD_VCC); 3717 } 3718 3719 switch (pcic->pc_io_type) { 3720 /* 3721 * Yenta-compliant adapters have vcc info in the extended registers 3722 * Other adapters can be added as needed, but the 'default' case 3723 * has been left as it was previously so as not to break existing 3724 * adapters. 3725 */ 3726 case PCIC_IO_TYPE_YENTA: 3727 /* 3728 * Here we ignore the VccLevel passed in and read the 3729 * card type from the adapter socket present state register 3730 */ 3731 socket_present_state = 3732 ddi_get32(pcic->handle, (uint32_t *)(pcic->ioaddr + 3733 PCIC_PRESENT_STATE_REG)); 3734 #if defined(PCIC_DEBUG) 3735 if (pcic_debug) { 3736 cmn_err(CE_CONT, 3737 "socket present state = 0x%x\n", 3738 socket_present_state); 3739 } 3740 #endif 3741 switch (socket_present_state & PCIC_VCC_MASK) { 3742 case PCIC_VCC_3VCARD: 3743 /* fall through */ 3744 case PCIC_VCC_3VCARD|PCIC_VCC_5VCARD: 3745 socket->VccLevel = PCIC_VCC_3VLEVEL; 3746 return 3747 (POWER_3VCARD_ENABLE|POWER_OUTPUT_ENABLE); 3748 case PCIC_VCC_5VCARD: 3749 socket->VccLevel = PCIC_VCC_5VLEVEL; 3750 return 3751 (POWER_CARD_ENABLE|POWER_OUTPUT_ENABLE); 3752 default: 3753 /* 3754 * if no card is present, this can be the 3755 * case of a client making a SetSocket call 3756 * after card removal. In this case we return 3757 * the current power level 3758 */ 3759 return ((unsigned)ddi_get8(pcic->handle, 3760 pcic->ioaddr + CB_R2_OFFSET + 3761 PCIC_POWER_CONTROL)); 3762 } 3763 3764 default: 3765 3766 switch (socket->VccLevel) { 3767 case PCIC_VCC_3VLEVEL: 3768 return (BAD_VCC); 3769 case PCIC_VCC_5VLEVEL: 3770 /* enable Vcc */ 3771 return (POWER_CARD_ENABLE|POWER_OUTPUT_ENABLE); 3772 default: 3773 return (BAD_VCC); 3774 } 3775 } 3776 } 3777 3778 3779 /* 3780 * pcic_set_socket() 3781 * Socket Services SetSocket call 3782 * sets basic socket configuration 3783 */ 3784 static int 3785 pcic_set_socket(dev_info_t *dip, set_socket_t *socket) 3786 { 3787 anp_t *anp = ddi_get_driver_private(dip); 3788 pcicdev_t *pcic = anp->an_private; 3789 pcic_socket_t *sockp = &pcic->pc_sockets[socket->socket]; 3790 int irq, interrupt, mirq; 3791 int powerlevel = 0; 3792 int ind, value, orig_pwrctl; 3793 3794 #if defined(PCIC_DEBUG) 3795 if (pcic_debug) { 3796 cmn_err(CE_CONT, 3797 "pcic_set_socket(dip=%p, socket=%d)" 3798 " Vcc=%d Vpp1=%d Vpp2=%d\n", (void *)dip, 3799 socket->socket, socket->VccLevel, socket->Vpp1Level, 3800 socket->Vpp2Level); 3801 } 3802 #endif 3803 /* 3804 * check VccLevel, etc. before setting mutex 3805 * if this is zero, power is being turned off 3806 * if it is non-zero, power is being turned on. 3807 * the default case is to assume Vcc only. 3808 */ 3809 3810 /* this appears to be very implementation specific */ 3811 3812 if (socket->Vpp1Level != socket->Vpp2Level) 3813 return (BAD_VPP); 3814 3815 if (socket->VccLevel == 0 || !(sockp->pcs_flags & PCS_CARD_PRESENT)) { 3816 powerlevel = 0; 3817 sockp->pcs_vcc = 0; 3818 sockp->pcs_vpp1 = 0; 3819 sockp->pcs_vpp2 = 0; 3820 } else { 3821 #if defined(PCIC_DEBUG) 3822 pcic_err(dip, 9, "\tVcc=%d Vpp1Level=%d, Vpp2Level=%d\n", 3823 socket->VccLevel, socket->Vpp1Level, socket->Vpp2Level); 3824 #endif 3825 /* valid Vcc power level? */ 3826 if (socket->VccLevel >= pcic->pc_numpower) 3827 return (BAD_VCC); 3828 3829 switch (pcic_power[socket->VccLevel].PowerLevel) { 3830 case 33: /* 3.3V */ 3831 case 60: /* for bad CIS in Option GPRS card */ 3832 if (!(pcic->pc_flags & PCF_33VCAP)) { 3833 cmn_err(CE_WARN, 3834 "%s%d: Bad Request for 3.3V " 3835 "(Controller incapable)\n", 3836 ddi_get_name(pcic->dip), 3837 ddi_get_instance(pcic->dip)); 3838 return (BAD_VCC); 3839 } 3840 /* FALLTHROUGH */ 3841 case 50: /* 5V */ 3842 if ((pcic->pc_io_type == PCIC_IO_TYPE_YENTA) && 3843 pcic_getcb(pcic, CB_PRESENT_STATE) & 3844 CB_PS_33VCARD) { 3845 /* 3846 * This is actually a 3.3V card. 3847 * Solaris Card Services 3848 * doesn't understand 3.3V 3849 * so we cheat and change 3850 * the setting to the one appropriate to 3.3V. 3851 * Note that this is the entry number 3852 * in the pcic_power[] array. 3853 */ 3854 sockp->pcs_vcc = PCIC_VCC_3VLEVEL; 3855 } else 3856 sockp->pcs_vcc = socket->VccLevel; 3857 break; 3858 default: 3859 return (BAD_VCC); 3860 } 3861 3862 /* enable Vcc */ 3863 powerlevel = POWER_CARD_ENABLE; 3864 3865 #if defined(PCIC_DEBUG) 3866 if (pcic_debug) { 3867 cmn_err(CE_CONT, "\tVcc=%d powerlevel=%x\n", 3868 socket->VccLevel, powerlevel); 3869 } 3870 #endif 3871 ind = 0; /* default index to 0 power */ 3872 if ((int)socket->Vpp1Level >= 0 && 3873 socket->Vpp1Level < pcic->pc_numpower) { 3874 if (!(pcic_power[socket->Vpp1Level].ValidSignals 3875 & VPP1)) { 3876 return (BAD_VPP); 3877 } 3878 ind = pcic_power[socket->Vpp1Level].PowerLevel/10; 3879 powerlevel |= pcic_vpp_levels[ind]; 3880 sockp->pcs_vpp1 = socket->Vpp1Level; 3881 } 3882 if ((int)socket->Vpp2Level >= 0 && 3883 socket->Vpp2Level < pcic->pc_numpower) { 3884 if (!(pcic_power[socket->Vpp2Level].ValidSignals 3885 & VPP2)) { 3886 return (BAD_VPP); 3887 } 3888 ind = pcic_power[socket->Vpp2Level].PowerLevel/10; 3889 powerlevel |= (pcic_vpp_levels[ind] << 2); 3890 sockp->pcs_vpp2 = socket->Vpp2Level; 3891 } 3892 3893 if (pcic->pc_flags & PCF_VPPX) { 3894 /* 3895 * this adapter doesn't allow separate Vpp1/Vpp2 3896 * if one is turned on, both are turned on and only 3897 * the Vpp1 bits should be set 3898 */ 3899 if (sockp->pcs_vpp2 != sockp->pcs_vpp1) { 3900 /* must be the same if one not zero */ 3901 if (sockp->pcs_vpp1 != 0 && 3902 sockp->pcs_vpp2 != 0) { 3903 cmn_err(CE_WARN, 3904 "%s%d: Bad Power Request " 3905 "(Vpp1/2 not the same)\n", 3906 ddi_get_name(pcic->dip), 3907 ddi_get_instance(pcic->dip)); 3908 return (BAD_VPP); 3909 } 3910 } 3911 powerlevel &= ~(3<<2); 3912 } 3913 3914 #if defined(PCIC_DEBUG) 3915 if (pcic_debug) { 3916 cmn_err(CE_CONT, "\tpowerlevel=%x, ind=%x\n", 3917 powerlevel, ind); 3918 } 3919 #endif 3920 } 3921 mutex_enter(&pcic->pc_lock); /* protect the registers */ 3922 3923 /* turn socket->IREQRouting off while programming */ 3924 interrupt = pcic_getb(pcic, socket->socket, PCIC_INTERRUPT); 3925 interrupt &= ~PCIC_INTR_MASK; 3926 if (pcic->pc_flags & PCF_USE_SMI) 3927 interrupt |= PCIC_INTR_ENABLE; 3928 pcic_putb(pcic, socket->socket, PCIC_INTERRUPT, interrupt); 3929 3930 switch (pcic->pc_type) { 3931 case PCIC_INTEL_i82092: 3932 pcic_82092_smiirq_ctl(pcic, socket->socket, PCIC_82092_CTL_IRQ, 3933 PCIC_82092_INT_DISABLE); 3934 break; 3935 default: 3936 break; 3937 } /* switch */ 3938 3939 /* the SCIntMask specifies events to detect */ 3940 mirq = pcic_getb(pcic, socket->socket, PCIC_MANAGEMENT_INT); 3941 3942 #if defined(PCIC_DEBUG) 3943 if (pcic_debug) 3944 cmn_err(CE_CONT, 3945 "\tSCIntMask=%x, interrupt=%x, mirq=%x\n", 3946 socket->SCIntMask, interrupt, mirq); 3947 #endif 3948 mirq &= ~(PCIC_BD_DETECT|PCIC_BW_DETECT|PCIC_RD_DETECT); 3949 pcic_putb(pcic, socket->socket, PCIC_MANAGEMENT_INT, 3950 mirq & ~PCIC_CHANGE_MASK); 3951 3952 /* save the mask we want to use */ 3953 sockp->pcs_intmask = socket->SCIntMask; 3954 3955 /* 3956 * Until there is a card present it's not worth enabling 3957 * any interrupts except "Card detect". This is done 3958 * elsewhere in the driver so don't change things if 3959 * there is no card! 3960 */ 3961 if (sockp->pcs_flags & PCS_CARD_PRESENT) { 3962 3963 /* now update the hardware to reflect events desired */ 3964 if (sockp->pcs_intmask & SBM_BVD1 || socket->IFType == IF_IO) 3965 mirq |= PCIC_BD_DETECT; 3966 3967 if (sockp->pcs_intmask & SBM_BVD2) 3968 mirq |= PCIC_BW_DETECT; 3969 3970 if (sockp->pcs_intmask & SBM_RDYBSY) 3971 mirq |= PCIC_RD_DETECT; 3972 3973 if (sockp->pcs_intmask & SBM_CD) 3974 mirq |= PCIC_CD_DETECT; 3975 } 3976 3977 if (sockp->pcs_flags & PCS_READY) { 3978 /* 3979 * card just came ready. 3980 * make sure enough time elapses 3981 * before touching it. 3982 */ 3983 sockp->pcs_flags &= ~PCS_READY; 3984 pcic_mswait(pcic, socket->socket, 10); 3985 } 3986 3987 #if defined(PCIC_DEBUG) 3988 if (pcic_debug) { 3989 cmn_err(CE_CONT, "\tstatus change set to %x\n", mirq); 3990 } 3991 #endif 3992 3993 switch (pcic->pc_type) { 3994 case PCIC_I82365SL: 3995 case PCIC_VADEM: 3996 case PCIC_VADEM_VG469: 3997 /* 3998 * The Intel version has different options. This is a 3999 * special case of GPI which might be used for eject 4000 */ 4001 4002 irq = pcic_getb(pcic, socket->socket, PCIC_CARD_DETECT); 4003 if (sockp->pcs_intmask & (SBM_EJECT|SBM_INSERT) && 4004 pcic->pc_flags & PCF_GPI_EJECT) { 4005 irq |= PCIC_GPI_ENABLE; 4006 } else { 4007 irq &= ~PCIC_GPI_ENABLE; 4008 } 4009 pcic_putb(pcic, socket->socket, PCIC_CARD_DETECT, irq); 4010 break; 4011 case PCIC_CL_PD6710: 4012 case PCIC_CL_PD6722: 4013 if (socket->IFType == IF_IO) { 4014 pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_2, 0x0); 4015 value = pcic_getb(pcic, socket->socket, 4016 PCIC_MISC_CTL_1); 4017 if (pcic->pc_flags & PCF_AUDIO) 4018 value |= PCIC_MC_SPEAKER_ENB; 4019 pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_1, 4020 value); 4021 } else { 4022 value = pcic_getb(pcic, socket->socket, 4023 PCIC_MISC_CTL_1); 4024 value &= ~PCIC_MC_SPEAKER_ENB; 4025 pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_1, 4026 value); 4027 } 4028 break; 4029 case PCIC_CL_PD6729: 4030 case PCIC_CL_PD6730: 4031 case PCIC_CL_PD6832: 4032 value = pcic_getb(pcic, socket->socket, PCIC_MISC_CTL_1); 4033 if ((socket->IFType == IF_IO) && (pcic->pc_flags & PCF_AUDIO)) { 4034 value |= PCIC_MC_SPEAKER_ENB; 4035 } else { 4036 value &= ~PCIC_MC_SPEAKER_ENB; 4037 } 4038 4039 if (pcic_power[sockp->pcs_vcc].PowerLevel == 33) 4040 value |= PCIC_MC_3VCC; 4041 else 4042 value &= ~PCIC_MC_3VCC; 4043 4044 pcic_putb(pcic, socket->socket, PCIC_MISC_CTL_1, value); 4045 break; 4046 4047 case PCIC_O2_OZ6912: 4048 value = pcic_getcb(pcic, CB_MISCCTRL); 4049 if ((socket->IFType == IF_IO) && (pcic->pc_flags & PCF_AUDIO)) 4050 value |= (1<<25); 4051 else 4052 value &= ~(1<<25); 4053 pcic_putcb(pcic, CB_MISCCTRL, value); 4054 if (pcic_power[sockp->pcs_vcc].PowerLevel == 33) 4055 powerlevel |= 0x08; 4056 break; 4057 4058 case PCIC_TI_PCI1250: 4059 case PCIC_TI_PCI1221: 4060 case PCIC_TI_PCI1225: 4061 case PCIC_TI_PCI1410: 4062 case PCIC_ENE_1410: 4063 case PCIC_TI_PCI1510: 4064 case PCIC_TI_PCI1520: 4065 case PCIC_TI_PCI1420: 4066 case PCIC_ENE_1420: 4067 value = ddi_get8(pcic->cfg_handle, 4068 pcic->cfgaddr + PCIC_CRDCTL_REG); 4069 if ((socket->IFType == IF_IO) && (pcic->pc_flags & PCF_AUDIO)) { 4070 value |= PCIC_CRDCTL_SPKR_ENBL; 4071 } else { 4072 value &= ~PCIC_CRDCTL_SPKR_ENBL; 4073 } 4074 ddi_put8(pcic->cfg_handle, 4075 pcic->cfgaddr + PCIC_CRDCTL_REG, value); 4076 if (pcic_power[sockp->pcs_vcc].PowerLevel == 33) 4077 powerlevel |= 0x08; 4078 break; 4079 } 4080 4081 /* 4082 * ctlind processing -- we can ignore this 4083 * there aren't any outputs on the chip for this and 4084 * the GUI will display what it thinks is correct 4085 */ 4086 4087 /* 4088 * If outputs are enabled and the power is going off 4089 * turn off outputs first. 4090 */ 4091 4092 /* power setup -- if necessary */ 4093 orig_pwrctl = pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL); 4094 if ((orig_pwrctl & POWER_OUTPUT_ENABLE) && sockp->pcs_vcc == 0) { 4095 orig_pwrctl &= ~POWER_OUTPUT_ENABLE; 4096 pcic_putb(pcic, socket->socket, 4097 PCIC_POWER_CONTROL, orig_pwrctl); 4098 (void) pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL); 4099 } 4100 4101 if (pcic->pc_flags & PCF_CBPWRCTL) { 4102 value = pcic_cbus_powerctl(pcic, socket->socket); 4103 powerlevel = 0; 4104 } else 4105 value = pcic_exca_powerctl(pcic, socket->socket, powerlevel); 4106 4107 if (value != SUCCESS) { 4108 mutex_exit(&pcic->pc_lock); 4109 return (value); 4110 } 4111 4112 /* 4113 * If outputs were disabled and the power is going on 4114 * turn on outputs afterwards. 4115 */ 4116 if (!(orig_pwrctl & POWER_OUTPUT_ENABLE) && sockp->pcs_vcc != 0) { 4117 orig_pwrctl = pcic_getb(pcic, socket->socket, 4118 PCIC_POWER_CONTROL); 4119 orig_pwrctl |= POWER_OUTPUT_ENABLE; 4120 pcic_putb(pcic, socket->socket, 4121 PCIC_POWER_CONTROL, orig_pwrctl); 4122 (void) pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL); 4123 } 4124 4125 /* 4126 * Once we have done the power stuff can re-enable management 4127 * interrupts. 4128 */ 4129 pcic_putb(pcic, socket->socket, PCIC_MANAGEMENT_INT, mirq); 4130 4131 #if defined(PCIC_DEBUG) 4132 pcic_err(dip, 8, "\tmanagement int set to %x pwrctl to 0x%x " 4133 "cbctl 0x%x\n", 4134 mirq, pcic_getb(pcic, socket->socket, PCIC_POWER_CONTROL), 4135 pcic_getcb(pcic, CB_CONTROL)); 4136 #endif 4137 4138 /* irq processing */ 4139 if (socket->IFType == IF_IO) { 4140 /* IRQ only for I/O */ 4141 irq = socket->IREQRouting & PCIC_INTR_MASK; 4142 value = pcic_getb(pcic, socket->socket, PCIC_INTERRUPT); 4143 value &= ~PCIC_INTR_MASK; 4144 4145 /* to enable I/O operation */ 4146 value |= PCIC_IO_CARD | PCIC_RESET; 4147 sockp->pcs_flags |= PCS_CARD_IO; 4148 if (irq != sockp->pcs_irq) { 4149 if (sockp->pcs_irq != 0) 4150 cmn_err(CE_CONT, 4151 "SetSocket: IRQ mismatch %x != %x!\n", 4152 irq, sockp->pcs_irq); 4153 else 4154 sockp->pcs_irq = irq; 4155 } 4156 irq = sockp->pcs_irq; 4157 4158 pcic_putb(pcic, socket->socket, PCIC_INTERRUPT, value); 4159 if (socket->IREQRouting & IRQ_ENABLE) { 4160 pcic_enable_io_intr(pcic, socket->socket, irq); 4161 sockp->pcs_flags |= PCS_IRQ_ENABLED; 4162 } else { 4163 pcic_disable_io_intr(pcic, socket->socket); 4164 sockp->pcs_flags &= ~PCS_IRQ_ENABLED; 4165 } 4166 #if defined(PCIC_DEBUG) 4167 if (pcic_debug) { 4168 cmn_err(CE_CONT, 4169 "\tsocket type is I/O and irq %x is %s\n", irq, 4170 (socket->IREQRouting & IRQ_ENABLE) ? 4171 "enabled" : "not enabled"); 4172 xxdmp_all_regs(pcic, socket->socket, 20); 4173 } 4174 #endif 4175 } else { 4176 /* make sure I/O mode is off */ 4177 4178 sockp->pcs_irq = 0; 4179 4180 value = pcic_getb(pcic, socket->socket, PCIC_INTERRUPT); 4181 value &= ~PCIC_IO_CARD; 4182 pcic_putb(pcic, socket->socket, PCIC_INTERRUPT, value); 4183 pcic_disable_io_intr(pcic, socket->socket); 4184 sockp->pcs_flags &= ~(PCS_CARD_IO|PCS_IRQ_ENABLED); 4185 } 4186 4187 sockp->pcs_state &= ~socket->State; 4188 4189 mutex_exit(&pcic->pc_lock); 4190 return (SUCCESS); 4191 } 4192 4193 /* 4194 * pcic_inquire_socket() 4195 * SocketServices InquireSocket function 4196 * returns basic characteristics of the socket 4197 */ 4198 /*ARGSUSED*/ 4199 static int 4200 pcic_inquire_socket(dev_info_t *dip, inquire_socket_t *socket) 4201 { 4202 anp_t *anp = ddi_get_driver_private(dip); 4203 pcicdev_t *pcic = anp->an_private; 4204 int value; 4205 4206 socket->SCIntCaps = PCIC_DEFAULT_INT_CAPS; 4207 socket->SCRptCaps = PCIC_DEFAULT_RPT_CAPS; 4208 socket->CtlIndCaps = PCIC_DEFAULT_CTL_CAPS; 4209 value = pcic->pc_sockets[socket->socket].pcs_flags; 4210 socket->SocketCaps = (value & PCS_SOCKET_IO) ? IF_IO : IF_MEMORY; 4211 socket->ActiveHigh = 0; 4212 /* these are the usable IRQs */ 4213 socket->ActiveLow = 0xfff0; 4214 return (SUCCESS); 4215 } 4216 4217 /* 4218 * pcic_inquire_window() 4219 * SocketServices InquireWindow function 4220 * returns detailed characteristics of the window 4221 * this is where windows get tied to sockets 4222 */ 4223 /*ARGSUSED*/ 4224 static int 4225 pcic_inquire_window(dev_info_t *dip, inquire_window_t *window) 4226 { 4227 int type, socket; 4228 4229 type = window->window % PCIC_NUMWINSOCK; 4230 socket = window->window / PCIC_NUMWINSOCK; 4231 4232 #if defined(PCIC_DEBUG) 4233 if (pcic_debug >= 8) 4234 cmn_err(CE_CONT, 4235 "pcic_inquire_window: window = %d/%d socket=%d\n", 4236 window->window, type, socket); 4237 #endif 4238 if (type < PCIC_IOWINDOWS) { 4239 window->WndCaps = WC_IO|WC_WAIT; 4240 type = IF_IO; 4241 } else { 4242 window->WndCaps = WC_COMMON|WC_ATTRIBUTE|WC_WAIT; 4243 type = IF_MEMORY; 4244 } 4245 4246 /* initialize the socket map - one socket per window */ 4247 PR_ZERO(window->Sockets); 4248 PR_SET(window->Sockets, socket); 4249 4250 if (type == IF_IO) { 4251 iowin_char_t *io; 4252 io = &window->iowin_char; 4253 io->IOWndCaps = WC_BASE|WC_SIZE|WC_WENABLE|WC_8BIT| 4254 WC_16BIT; 4255 io->FirstByte = (baseaddr_t)IOMEM_FIRST; 4256 io->LastByte = (baseaddr_t)IOMEM_LAST; 4257 io->MinSize = IOMEM_MIN; 4258 io->MaxSize = IOMEM_MAX; 4259 io->ReqGran = IOMEM_GRAN; 4260 io->AddrLines = IOMEM_DECODE; 4261 io->EISASlot = 0; 4262 } else { 4263 mem_win_char_t *mem; 4264 mem = &window->mem_win_char; 4265 mem->MemWndCaps = WC_BASE|WC_SIZE|WC_WENABLE|WC_8BIT| 4266 WC_16BIT|WC_WP; 4267 4268 mem->FirstByte = (baseaddr_t)MEM_FIRST; 4269 mem->LastByte = (baseaddr_t)MEM_LAST; 4270 4271 mem->MinSize = MEM_MIN; 4272 mem->MaxSize = MEM_MAX; 4273 mem->ReqGran = PCIC_PAGE; 4274 mem->ReqBase = 0; 4275 mem->ReqOffset = PCIC_PAGE; 4276 mem->Slowest = MEM_SPEED_MAX; 4277 mem->Fastest = MEM_SPEED_MIN; 4278 } 4279 return (SUCCESS); 4280 } 4281 4282 /* 4283 * pcic_get_adapter() 4284 * SocketServices GetAdapter function 4285 * this is nearly a no-op. 4286 */ 4287 /*ARGSUSED*/ 4288 static int 4289 pcic_get_adapter(dev_info_t *dip, get_adapter_t *adapt) 4290 { 4291 anp_t *anp = ddi_get_driver_private(dip); 4292 pcicdev_t *pcic = anp->an_private; 4293 4294 if (pcic->pc_flags & PCF_INTRENAB) 4295 adapt->SCRouting = IRQ_ENABLE; 4296 adapt->state = 0; 4297 return (SUCCESS); 4298 } 4299 4300 /* 4301 * pcic_get_page() 4302 * SocketServices GetPage function 4303 * returns info about the window 4304 */ 4305 /*ARGSUSED*/ 4306 static int 4307 pcic_get_page(dev_info_t *dip, get_page_t *page) 4308 { 4309 anp_t *anp = ddi_get_driver_private(dip); 4310 pcicdev_t *pcic = anp->an_private; 4311 int socket, window; 4312 pcs_memwin_t *winp; 4313 4314 socket = page->window / PCIC_NUMWINSOCK; 4315 window = page->window % PCIC_NUMWINSOCK; 4316 4317 /* I/O windows are the first two */ 4318 if (window < PCIC_IOWINDOWS || socket >= pcic->pc_numsockets) { 4319 return (BAD_WINDOW); 4320 } 4321 4322 winp = &pcic->pc_sockets[socket].pcs_windows[window].mem; 4323 4324 if (page->page != 0) 4325 return (BAD_PAGE); 4326 4327 page->state = 0; 4328 if (winp->pcw_status & PCW_ENABLED) 4329 page->state |= PS_ENABLED; 4330 if (winp->pcw_status & PCW_ATTRIBUTE) 4331 page->state |= PS_ATTRIBUTE; 4332 if (winp->pcw_status & PCW_WP) 4333 page->state |= PS_WP; 4334 4335 page->offset = (off_t)winp->pcw_offset; 4336 4337 return (SUCCESS); 4338 } 4339 4340 /* 4341 * pcic_get_socket() 4342 * SocketServices GetSocket 4343 * returns information about the current socket setting 4344 */ 4345 /*ARGSUSED*/ 4346 static int 4347 pcic_get_socket(dev_info_t *dip, get_socket_t *socket) 4348 { 4349 anp_t *anp = ddi_get_driver_private(dip); 4350 pcicdev_t *pcic = anp->an_private; 4351 int socknum, irq_enabled; 4352 pcic_socket_t *sockp; 4353 4354 socknum = socket->socket; 4355 sockp = &pcic->pc_sockets[socknum]; 4356 4357 socket->SCIntMask = sockp->pcs_intmask; 4358 sockp->pcs_state = pcic_card_state(pcic, sockp); 4359 4360 socket->state = sockp->pcs_state; 4361 if (socket->state & SBM_CD) { 4362 socket->VccLevel = sockp->pcs_vcc; 4363 socket->Vpp1Level = sockp->pcs_vpp1; 4364 socket->Vpp2Level = sockp->pcs_vpp2; 4365 irq_enabled = (sockp->pcs_flags & PCS_IRQ_ENABLED) ? 4366 IRQ_ENABLE : 0; 4367 socket->IRQRouting = sockp->pcs_irq | irq_enabled; 4368 socket->IFType = (sockp->pcs_flags & PCS_CARD_IO) ? 4369 IF_IO : IF_MEMORY; 4370 } else { 4371 socket->VccLevel = 0; 4372 socket->Vpp1Level = 0; 4373 socket->Vpp2Level = 0; 4374 socket->IRQRouting = 0; 4375 socket->IFType = IF_MEMORY; 4376 } 4377 socket->CtlInd = 0; /* no indicators */ 4378 4379 return (SUCCESS); 4380 } 4381 4382 /* 4383 * pcic_get_status() 4384 * SocketServices GetStatus 4385 * returns status information about the PC Card in 4386 * the selected socket 4387 */ 4388 /*ARGSUSED*/ 4389 static int 4390 pcic_get_status(dev_info_t *dip, get_ss_status_t *status) 4391 { 4392 anp_t *anp = ddi_get_driver_private(dip); 4393 pcicdev_t *pcic = anp->an_private; 4394 int socknum, irq_enabled; 4395 pcic_socket_t *sockp; 4396 4397 socknum = status->socket; 4398 sockp = &pcic->pc_sockets[socknum]; 4399 4400 status->CardState = pcic_card_state(pcic, sockp); 4401 status->SocketState = sockp->pcs_state; 4402 status->CtlInd = 0; /* no indicators */ 4403 4404 if (sockp->pcs_flags & PCS_CARD_PRESENT) 4405 status->SocketState |= SBM_CD; 4406 if (status->CardState & SBM_CD) { 4407 irq_enabled = (sockp->pcs_flags & PCS_CARD_ENABLED) ? 4408 IRQ_ENABLE : 0; 4409 status->IRQRouting = sockp->pcs_irq | irq_enabled; 4410 status->IFType = (sockp->pcs_flags & PCS_CARD_IO) ? 4411 IF_IO : IF_MEMORY; 4412 } else { 4413 status->IRQRouting = 0; 4414 status->IFType = IF_MEMORY; 4415 } 4416 4417 #if defined(PCIC_DEBUG) 4418 if (pcic_debug >= 8) 4419 cmn_err(CE_CONT, "pcic_get_status: socket=%d, CardState=%x," 4420 "SocketState=%x\n", 4421 socknum, status->CardState, status->SocketState); 4422 #endif 4423 switch (pcic->pc_type) { 4424 uint32_t present_state; 4425 case PCIC_TI_PCI1410: 4426 case PCIC_TI_PCI1520: 4427 case PCIC_TI_PCI1420: 4428 case PCIC_ENE_1420: 4429 case PCIC_TOSHIBA_TOPIC100: 4430 case PCIC_TOSHIBA_TOPIC95: 4431 case PCIC_TOSHIBA_VENDOR: 4432 case PCIC_O2MICRO_VENDOR: 4433 case PCIC_TI_VENDOR: 4434 case PCIC_RICOH_VENDOR: 4435 present_state = pcic_getcb(pcic, CB_PRESENT_STATE); 4436 if (present_state & PCIC_CB_CARD) 4437 status->IFType = IF_CARDBUS; 4438 #if defined(PCIC_DEBUG) 4439 if (pcic_debug >= 8) 4440 cmn_err(CE_CONT, 4441 "pcic_get_status: present_state=0x%x\n", 4442 present_state); 4443 #endif 4444 break; 4445 default: 4446 break; 4447 } 4448 4449 return (SUCCESS); 4450 } 4451 4452 /* 4453 * pcic_get_window() 4454 * SocketServices GetWindow function 4455 * returns state information about the specified window 4456 */ 4457 /*ARGSUSED*/ 4458 static int 4459 pcic_get_window(dev_info_t *dip, get_window_t *window) 4460 { 4461 anp_t *anp = ddi_get_driver_private(dip); 4462 pcicdev_t *pcic = anp->an_private; 4463 int socket, win; 4464 pcic_socket_t *sockp; 4465 pcs_memwin_t *winp; 4466 4467 socket = window->window / PCIC_NUMWINSOCK; 4468 win = window->window % PCIC_NUMWINSOCK; 4469 #if defined(PCIC_DEBUG) 4470 if (pcic_debug) { 4471 cmn_err(CE_CONT, "pcic_get_window(socket=%d, window=%d)\n", 4472 socket, win); 4473 } 4474 #endif 4475 4476 if (socket > pcic->pc_numsockets) 4477 return (BAD_WINDOW); 4478 4479 sockp = &pcic->pc_sockets[socket]; 4480 winp = &sockp->pcs_windows[win].mem; 4481 4482 window->socket = socket; 4483 window->size = winp->pcw_len; 4484 window->speed = winp->pcw_speed; 4485 window->handle = (ddi_acc_handle_t)winp->pcw_handle; 4486 window->base = (uint32_t)winp->pcw_base + winp->pcw_offset; 4487 4488 if (win >= PCIC_IOWINDOWS) { 4489 window->state = 0; 4490 } else { 4491 window->state = WS_IO; 4492 } 4493 if (winp->pcw_status & PCW_ENABLED) 4494 window->state |= WS_ENABLED; 4495 4496 if (winp->pcw_status & PCS_CARD_16BIT) 4497 window->state |= WS_16BIT; 4498 #if defined(PCIC_DEBUG) 4499 if (pcic_debug) 4500 cmn_err(CE_CONT, "\tsize=%d, speed=%d, base=%p, state=%x\n", 4501 window->size, (unsigned)window->speed, 4502 (void *)window->handle, window->state); 4503 #endif 4504 4505 return (SUCCESS); 4506 } 4507 4508 /* 4509 * pcic_ll_reset 4510 * low level reset 4511 * separated out so it can be called when already locked 4512 * 4513 * There are two variables that control the RESET timing: 4514 * pcic_prereset_time - time in mS before asserting RESET 4515 * pcic_reset_time - time in mS to assert RESET 4516 * 4517 */ 4518 int pcic_prereset_time = 1; 4519 int pcic_reset_time = 10; 4520 int pcic_postreset_time = 20; 4521 int pcic_vpp_is_vcc_during_reset = 0; 4522 4523 static int 4524 pcic_ll_reset(pcicdev_t *pcic, int socket) 4525 { 4526 int windowbits, iobits; 4527 uint32_t pwr; 4528 4529 /* save windows that were on */ 4530 windowbits = pcic_getb(pcic, socket, PCIC_MAPPING_ENABLE); 4531 if (pcic_reset_time == 0) 4532 return (windowbits); 4533 /* turn all windows off */ 4534 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, 0); 4535 4536 #if defined(PCIC_DEBUG) 4537 pcic_err(pcic->dip, 6, 4538 "pcic_ll_reset(socket %d) powerlevel=%x cbctl 0x%x cbps 0x%x\n", 4539 socket, pcic_getb(pcic, socket, PCIC_POWER_CONTROL), 4540 pcic_getcb(pcic, CB_CONTROL), 4541 pcic_getcb(pcic, CB_PRESENT_STATE)); 4542 #endif 4543 4544 if (pcic_vpp_is_vcc_during_reset) { 4545 4546 /* 4547 * Set VPP to VCC for the duration of the reset - for aironet 4548 * card. 4549 */ 4550 if (pcic->pc_flags & PCF_CBPWRCTL) { 4551 pwr = pcic_getcb(pcic, CB_CONTROL); 4552 pcic_putcb(pcic, CB_CONTROL, (pwr&~CB_C_VPPMASK)|CB_C_VPPVCC); 4553 (void) pcic_getcb(pcic, CB_CONTROL); 4554 } else { 4555 pwr = pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 4556 pcic_putb(pcic, socket, PCIC_POWER_CONTROL, 4557 pwr | 1); 4558 (void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 4559 } 4560 } 4561 4562 if (pcic_prereset_time > 0) { 4563 pcic_err(pcic->dip, 8, "pcic_ll_reset pre_wait %d mS\n", 4564 pcic_prereset_time); 4565 pcic_mswait(pcic, socket, pcic_prereset_time); 4566 } 4567 4568 /* turn interrupts off and start a reset */ 4569 pcic_err(pcic->dip, 8, 4570 "pcic_ll_reset turn interrupts off and start a reset\n"); 4571 iobits = pcic_getb(pcic, socket, PCIC_INTERRUPT); 4572 iobits &= ~(PCIC_INTR_MASK | PCIC_RESET); 4573 pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits); 4574 (void) pcic_getb(pcic, socket, PCIC_INTERRUPT); 4575 4576 switch (pcic->pc_type) { 4577 case PCIC_INTEL_i82092: 4578 pcic_82092_smiirq_ctl(pcic, socket, PCIC_82092_CTL_IRQ, 4579 PCIC_82092_INT_DISABLE); 4580 break; 4581 default: 4582 break; 4583 } /* switch */ 4584 4585 pcic->pc_sockets[socket].pcs_state = 0; 4586 4587 if (pcic_reset_time > 0) { 4588 pcic_err(pcic->dip, 8, "pcic_ll_reset reset_wait %d mS\n", 4589 pcic_reset_time); 4590 pcic_mswait(pcic, socket, pcic_reset_time); 4591 } 4592 4593 pcic_err(pcic->dip, 8, "pcic_ll_reset take it out of reset now\n"); 4594 4595 /* take it out of RESET now */ 4596 pcic_putb(pcic, socket, PCIC_INTERRUPT, PCIC_RESET | iobits); 4597 (void) pcic_getb(pcic, socket, PCIC_INTERRUPT); 4598 4599 /* 4600 * can't access the card for 20ms, but we really don't 4601 * want to sit around that long. The pcic is still usable. 4602 * memory accesses must wait for RDY to come up. 4603 */ 4604 if (pcic_postreset_time > 0) { 4605 pcic_err(pcic->dip, 8, "pcic_ll_reset post_wait %d mS\n", 4606 pcic_postreset_time); 4607 pcic_mswait(pcic, socket, pcic_postreset_time); 4608 } 4609 4610 if (pcic_vpp_is_vcc_during_reset > 1) { 4611 4612 /* 4613 * Return VPP power to whatever it was before. 4614 */ 4615 if (pcic->pc_flags & PCF_CBPWRCTL) { 4616 pcic_putcb(pcic, CB_CONTROL, pwr); 4617 (void) pcic_getcb(pcic, CB_CONTROL); 4618 } else { 4619 pcic_putb(pcic, socket, PCIC_POWER_CONTROL, pwr); 4620 (void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 4621 } 4622 } 4623 4624 pcic_err(pcic->dip, 7, "pcic_ll_reset returning 0x%x\n", windowbits); 4625 4626 return (windowbits); 4627 } 4628 4629 /* 4630 * pcic_reset_socket() 4631 * SocketServices ResetSocket function 4632 * puts the PC Card in the socket into the RESET state 4633 * and then takes it out after the the cycle time 4634 * The socket is back to initial state when done 4635 */ 4636 static int 4637 pcic_reset_socket(dev_info_t *dip, int socket, int mode) 4638 { 4639 anp_t *anp = ddi_get_driver_private(dip); 4640 pcicdev_t *pcic = anp->an_private; 4641 int value; 4642 int i, mint; 4643 pcic_socket_t *sockp; 4644 4645 #if defined(PCIC_DEBUG) 4646 if (pcic_debug >= 8) 4647 cmn_err(CE_CONT, "pcic_reset_socket(%p, %d, %d/%s)\n", 4648 (void *)dip, socket, mode, 4649 mode == RESET_MODE_FULL ? "full" : "partial"); 4650 #endif 4651 4652 mutex_enter(&pcic->pc_lock); /* protect the registers */ 4653 4654 /* Turn off management interupts. */ 4655 mint = pcic_getb(pcic, socket, PCIC_MANAGEMENT_INT); 4656 pcic_putb(pcic, socket, PCIC_MANAGEMENT_INT, mint & ~PCIC_CHANGE_MASK); 4657 4658 sockp = &pcic->pc_sockets[socket]; 4659 4660 value = pcic_ll_reset(pcic, socket); 4661 if (mode == RESET_MODE_FULL) { 4662 /* disable and unmap all mapped windows */ 4663 for (i = 0; i < PCIC_NUMWINSOCK; i++) { 4664 if (i < PCIC_IOWINDOWS) { 4665 if (sockp->pcs_windows[i].io.pcw_status & 4666 PCW_MAPPED) { 4667 pcs_iowin_t *io; 4668 io = &sockp->pcs_windows[i].io; 4669 io->pcw_status &= ~PCW_ENABLED; 4670 } 4671 } else { 4672 if (sockp->pcs_windows[i].mem.pcw_status & 4673 PCW_MAPPED) { 4674 pcs_memwin_t *mem; 4675 mem = &sockp->pcs_windows[i].mem; 4676 mem->pcw_status &= ~PCW_ENABLED; 4677 } 4678 } 4679 } 4680 } else { 4681 /* turn windows back on */ 4682 pcic_putb(pcic, socket, PCIC_MAPPING_ENABLE, value); 4683 /* wait the rest of the time here */ 4684 pcic_mswait(pcic, socket, 10); 4685 } 4686 pcic_putb(pcic, socket, PCIC_MANAGEMENT_INT, mint); 4687 mutex_exit(&pcic->pc_lock); 4688 return (SUCCESS); 4689 } 4690 4691 /* 4692 * pcic_set_interrupt() 4693 * SocketServices SetInterrupt function 4694 */ 4695 static int 4696 pcic_set_interrupt(dev_info_t *dip, set_irq_handler_t *handler) 4697 { 4698 anp_t *anp = ddi_get_driver_private(dip); 4699 pcicdev_t *pcic = anp->an_private; 4700 int value = DDI_SUCCESS; 4701 inthandler_t *intr; 4702 4703 #if defined(PCIC_DEBUG) 4704 if (pcic_debug) { 4705 cmn_err(CE_CONT, 4706 "pcic_set_interrupt: entered pc_intr_mode=0x%x\n", 4707 pcic->pc_intr_mode); 4708 cmn_err(CE_CONT, 4709 "\t irq_top=%p handler=%p handler_id=%x\n", 4710 (void *)pcic->irq_top, (void *)handler->handler, 4711 handler->handler_id); 4712 } 4713 #endif 4714 4715 /* 4716 * If we're on a PCI bus, we route all IO IRQs through a single 4717 * PCI interrupt (typically INT A#) so we don't have to do 4718 * much other than add the caller to general interrupt handler 4719 * and set some state. 4720 */ 4721 4722 intr = kmem_zalloc(sizeof (inthandler_t), KM_NOSLEEP); 4723 if (intr == NULL) 4724 return (NO_RESOURCE); 4725 4726 switch (pcic->pc_intr_mode) { 4727 case PCIC_INTR_MODE_PCI_1: 4728 /* 4729 * We only allow above-lock-level IO IRQ handlers 4730 * in the PCI bus case. 4731 */ 4732 4733 mutex_enter(&pcic->intr_lock); 4734 4735 if (pcic->irq_top == NULL) { 4736 pcic->irq_top = intr; 4737 pcic->irq_current = pcic->irq_top; 4738 } else { 4739 while (pcic->irq_current->next != NULL) 4740 pcic->irq_current = pcic->irq_current->next; 4741 pcic->irq_current->next = intr; 4742 pcic->irq_current = pcic->irq_current->next; 4743 } 4744 4745 pcic->irq_current->intr = 4746 (ddi_intr_handler_t *)handler->handler; 4747 pcic->irq_current->handler_id = handler->handler_id; 4748 pcic->irq_current->arg1 = handler->arg1; 4749 pcic->irq_current->arg2 = handler->arg2; 4750 pcic->irq_current->socket = handler->socket; 4751 4752 mutex_exit(&pcic->intr_lock); 4753 4754 handler->iblk_cookie = &pcic->pc_pri; 4755 handler->idev_cookie = &pcic->pc_dcookie; 4756 break; 4757 4758 default: 4759 intr->intr = (ddi_intr_handler_t *)handler->handler; 4760 intr->handler_id = handler->handler_id; 4761 intr->arg1 = handler->arg1; 4762 intr->arg2 = handler->arg2; 4763 intr->socket = handler->socket; 4764 intr->irq = handler->irq; 4765 4766 /* 4767 * need to revisit this to see if interrupts can be 4768 * shared someday. Note that IRQ is set in the common 4769 * code. 4770 */ 4771 mutex_enter(&pcic->pc_lock); 4772 if (pcic->pc_handlers == NULL) { 4773 pcic->pc_handlers = intr; 4774 intr->next = intr->prev = intr; 4775 } else { 4776 insque(intr, pcic->pc_handlers); 4777 } 4778 mutex_exit(&pcic->pc_lock); 4779 4780 break; 4781 } 4782 4783 /* 4784 * need to fill in cookies in event of multiple high priority 4785 * interrupt handlers on same IRQ 4786 */ 4787 4788 #if defined(PCIC_DEBUG) 4789 if (pcic_debug) { 4790 cmn_err(CE_CONT, 4791 "pcic_set_interrupt: exit irq_top=%p value=%d\n", 4792 (void *)pcic->irq_top, value); 4793 } 4794 #endif 4795 4796 if (value == DDI_SUCCESS) { 4797 return (SUCCESS); 4798 } else { 4799 return (BAD_IRQ); 4800 } 4801 } 4802 4803 /* 4804 * pcic_clear_interrupt() 4805 * SocketServices ClearInterrupt function 4806 * 4807 * Interrupts for PCIC are complicated by the fact that we must 4808 * follow several different models for interrupts. 4809 * ISA: there is an interrupt per adapter and per socket and 4810 * they can't be shared. 4811 * PCI: some adapters have one PCI interrupt available while others 4812 * have up to 4. Solaris may or may not allow us to use more 4813 * than 1 so we essentially share them all at this point. 4814 * Hybrid: PCI bridge but interrupts wired to host interrupt controller. 4815 * This is like ISA but we have to fudge and create an intrspec 4816 * that PCI's parent understands and bypass the PCI nexus. 4817 * multifunction: this requires sharing the interrupts on a per-socket 4818 * basis. 4819 */ 4820 static int 4821 pcic_clear_interrupt(dev_info_t *dip, clear_irq_handler_t *handler) 4822 { 4823 anp_t *anp = ddi_get_driver_private(dip); 4824 pcicdev_t *pcic = anp->an_private; 4825 inthandler_t *intr, *prev, *current; 4826 int i; 4827 4828 /* 4829 * If we're on a PCI bus, we route all IO IRQs through a single 4830 * PCI interrupt (typically INT A#) so we don't have to do 4831 * much other than remove the caller from the general 4832 * interrupt handler callout list. 4833 */ 4834 4835 #if defined(PCIC_DEBUG) 4836 if (pcic_debug) { 4837 cmn_err(CE_CONT, 4838 "pcic_clear_interrupt: entered pc_intr_mode=0x%x\n", 4839 pcic->pc_intr_mode); 4840 cmn_err(CE_CONT, 4841 "\t irq_top=%p handler=%p handler_id=%x\n", 4842 (void *)pcic->irq_top, (void *)handler->handler, 4843 handler->handler_id); 4844 } 4845 #endif 4846 4847 switch (pcic->pc_intr_mode) { 4848 case PCIC_INTR_MODE_PCI_1: 4849 4850 mutex_enter(&pcic->intr_lock); 4851 if (pcic->irq_top == NULL) { 4852 mutex_exit(&pcic->intr_lock); 4853 return (BAD_IRQ); 4854 } 4855 4856 intr = NULL; 4857 pcic->irq_current = pcic->irq_top; 4858 4859 while ((pcic->irq_current != NULL) && 4860 (pcic->irq_current->handler_id != 4861 handler->handler_id)) { 4862 intr = pcic->irq_current; 4863 pcic->irq_current = pcic->irq_current->next; 4864 } 4865 4866 if (pcic->irq_current == NULL) { 4867 mutex_exit(&pcic->intr_lock); 4868 return (BAD_IRQ); 4869 } 4870 4871 if (intr != NULL) { 4872 intr->next = pcic->irq_current->next; 4873 } else { 4874 pcic->irq_top = pcic->irq_current->next; 4875 } 4876 4877 current = pcic->irq_current; 4878 pcic->irq_current = pcic->irq_top; 4879 mutex_exit(&pcic->intr_lock); 4880 kmem_free(current, sizeof (inthandler_t)); 4881 4882 break; 4883 4884 default: 4885 4886 mutex_enter(&pcic->pc_lock); 4887 intr = pcic_handlers; 4888 prev = (inthandler_t *)&pcic_handlers; 4889 4890 while (intr != NULL) { 4891 if (intr->handler_id == handler->handler_id) { 4892 i = intr->irq & PCIC_INTR_MASK; 4893 if (--pcic_irq_map[i].count == 0) { 4894 /* multi-handler form */ 4895 (void) ddi_intr_disable(pcic->pc_intr_htblp[i]); 4896 (void) ddi_intr_remove_handler( 4897 pcic->pc_intr_htblp[i]); 4898 (void) ddi_intr_free(pcic->pc_intr_htblp[i]); 4899 (void) pcmcia_return_intr(pcic->dip, i); 4900 #if defined(PCIC_DEBUG) 4901 if (pcic_debug) { 4902 cmn_err(CE_CONT, 4903 "removing interrupt %d at %s " 4904 "priority\n", i, "high"); 4905 cmn_err(CE_CONT, 4906 "ddi_remove_intr(%p, %x, %p)\n", 4907 (void *)dip, 4908 0, 4909 (void *)intr->iblk_cookie); 4910 } 4911 #endif 4912 } 4913 prev->next = intr->next; 4914 kmem_free(intr, sizeof (inthandler_t)); 4915 intr = prev->next; 4916 } else { 4917 prev = intr; 4918 intr = intr->next; 4919 } /* if (handler_id) */ 4920 } /* while */ 4921 4922 mutex_exit(&pcic->pc_lock); 4923 } 4924 4925 #if defined(PCIC_DEBUG) 4926 if (pcic_debug) { 4927 cmn_err(CE_CONT, 4928 "pcic_clear_interrupt: exit irq_top=%p\n", 4929 (void *)pcic->irq_top); 4930 } 4931 #endif 4932 4933 4934 return (SUCCESS); 4935 } 4936 4937 struct intel_regs { 4938 char *name; 4939 int off; 4940 char *fmt; 4941 } iregs[] = { 4942 {"ident ", 0}, 4943 {"if-status ", 1, "\020\1BVD1\2BVD2\3CD1\4CD2\5WP\6RDY\7PWR\10~GPI"}, 4944 {"power ", 2, "\020\1Vpp1c0\2Vpp1c1\3Vpp2c0\4Vpp2c1\5PE\6AUTO" 4945 "\7DRD\10OE"}, 4946 {"cardstatus", 4, "\020\1BD\2BW\3RC\4CD\5GPI\6R1\7R2\010R3"}, 4947 {"enable ", 6, "\020\1MW0\2MW1\3MW2\4MW3\5MW4\6MEM16\7IO0\10IO1"}, 4948 {"cd-gcr ", 0x16, "\020\1MDI16\2CRE\3GPIE\4GPIT\5CDR\6S/W"}, 4949 {"GCR ", 0x1e, "\020\1PD\2LEVEL\3WCSC\4PLS14"}, 4950 {"int-gcr ", 3, "\020\5INTR\6IO\7~RST\10RI"}, 4951 {"management", 5, "\020\1BDE\2BWE\3RE\4CDE"}, 4952 {"volt-sense", 0x1f, "\020\1A_VS1\2A_VS2\3B_VS1\4B_VS2"}, 4953 {"volt-sel ", 0x2f, "\020\5EXTCONF\6BUSSELECT\7MIXEDV\10ISAV"}, 4954 {"VG ext A ", 0x3c, "\20\3IVS\4CABLE\5CSTEP\6TEST\7RIO"}, 4955 {"io-ctrl ", 7, "\020\1DS0\2IOCS0\3ZWS0\4WS0\5DS1\6IOS1\7ZWS1\10WS1"}, 4956 {"io0-slow ", 8}, 4957 {"io0-shi ", 9}, 4958 {"io0-elow ", 0xa}, 4959 {"io0-ehi ", 0xb}, 4960 {"io1-slow ", 0xc}, 4961 {"io1-shi ", 0xd}, 4962 {"io1-elow ", 0xe}, 4963 {"io1-ehi ", 0xf}, 4964 {"mem0-slow ", 0x10}, 4965 {"mem0-shi ", 0x11, "\020\7ZW\10DS"}, 4966 {"mem0-elow ", 0x12}, 4967 {"mem0-ehi ", 0x13, "\020\7WS0\10WS1"}, 4968 {"card0-low ", 0x14}, 4969 {"card0-hi ", 0x15, "\020\7AM\10WP"}, 4970 {"mem1-slow ", 0x18}, 4971 {"mem1-shi ", 0x19, "\020\7ZW\10DS"}, 4972 {"mem1-elow ", 0x1a}, 4973 {"mem1-ehi ", 0x1b, "\020\7WS0\10WS1"}, 4974 {"card1-low ", 0x1c}, 4975 {"card1-hi ", 0x1d, "\020\7AM\10WP"}, 4976 {"mem2-slow ", 0x20}, 4977 {"mem2-shi ", 0x21, "\020\7ZW\10DS"}, 4978 {"mem2-elow ", 0x22}, 4979 {"mem2-ehi ", 0x23, "\020\7WS0\10WS1"}, 4980 {"card2-low ", 0x24}, 4981 {"card2-hi ", 0x25, "\020\7AM\10WP"}, 4982 {"mem3-slow ", 0x28}, 4983 {"mem3-shi ", 0x29, "\020\7ZW\10DS"}, 4984 {"mem3-elow ", 0x2a}, 4985 {"mem3-ehi ", 0x2b, "\020\7WS0\10WS1"}, 4986 {"card3-low ", 0x2c}, 4987 {"card3-hi ", 0x2d, "\020\7AM\10WP"}, 4988 4989 {"mem4-slow ", 0x30}, 4990 {"mem4-shi ", 0x31, "\020\7ZW\10DS"}, 4991 {"mem4-elow ", 0x32}, 4992 {"mem4-ehi ", 0x33, "\020\7WS0\10WS1"}, 4993 {"card4-low ", 0x34}, 4994 {"card4-hi ", 0x35, "\020\7AM\10WP"}, 4995 {"mpage0 ", 0x40}, 4996 {"mpage1 ", 0x41}, 4997 {"mpage2 ", 0x42}, 4998 {"mpage3 ", 0x43}, 4999 {"mpage4 ", 0x44}, 5000 {NULL}, 5001 }; 5002 5003 static struct intel_regs cregs[] = { 5004 {"misc-ctl1 ", 0x16, "\20\2VCC3\3PMI\4PSI\5SPKR\10INPACK"}, 5005 {"fifo ", 0x17, "\20\6DIOP\7DMEMP\10EMPTY"}, 5006 {"misc-ctl2 ", 0x1e, "\20\1XCLK\2LOW\3SUSP\4CORE5V\5TCD\10RIOUT"}, 5007 {"chip-info ", 0x1f, "\20\6DUAL"}, 5008 {"IO-offlow0", 0x36}, 5009 {"IO-offhi0 ", 0x37}, 5010 {"IO-offlow1", 0x38}, 5011 {"IO-offhi1 ", 0x39}, 5012 NULL, 5013 }; 5014 5015 static struct intel_regs cxregs[] = { 5016 {"ext-ctl-1 ", 0x03, 5017 "\20\1VCCLCK\2AUTOCLR\3LED\4INVIRQC\5INVIRQM\6PUC"}, 5018 {"misc-ctl3 ", 0x25, "\20\5HWSUSP"}, 5019 {"mem0-up ", 0x05}, 5020 {"mem1-up ", 0x06}, 5021 {"mem2-up ", 0x07}, 5022 {"mem3-up ", 0x08}, 5023 {"mem4-up ", 0x09}, 5024 {NULL} 5025 }; 5026 5027 void 5028 xxdmp_cl_regs(pcicdev_t *pcic, int socket, uint32_t len) 5029 { 5030 int i, value, j; 5031 char buff[256]; 5032 char *fmt; 5033 5034 cmn_err(CE_CONT, "--------- Cirrus Logic Registers --------\n"); 5035 for (buff[0] = '\0', i = 0; cregs[i].name != NULL && len-- != 0; i++) { 5036 int sval; 5037 if (cregs[i].off == PCIC_MISC_CTL_2) 5038 sval = 0; 5039 else 5040 sval = socket; 5041 value = pcic_getb(pcic, sval, cregs[i].off); 5042 if (i & 1) { 5043 if (cregs[i].fmt) 5044 fmt = "%s\t%s\t%b\n"; 5045 else 5046 fmt = "%s\t%s\t%x\n"; 5047 cmn_err(CE_CONT, fmt, buff, 5048 cregs[i].name, value, cregs[i].fmt); 5049 buff[0] = '\0'; 5050 } else { 5051 if (cregs[i].fmt) 5052 fmt = "\t%s\t%b"; 5053 else 5054 fmt = "\t%s\t%x"; 5055 (void) sprintf(buff, fmt, 5056 cregs[i].name, value, cregs[i].fmt); 5057 for (j = strlen(buff); j < 40; j++) 5058 buff[j] = ' '; 5059 buff[40] = '\0'; 5060 } 5061 } 5062 cmn_err(CE_CONT, "%s\n", buff); 5063 5064 i = pcic_getb(pcic, socket, PCIC_TIME_SETUP_0); 5065 j = pcic_getb(pcic, socket, PCIC_TIME_SETUP_1); 5066 cmn_err(CE_CONT, "\tsetup-tim0\t%x\tsetup-tim1\t%x\n", i, j); 5067 5068 i = pcic_getb(pcic, socket, PCIC_TIME_COMMAND_0); 5069 j = pcic_getb(pcic, socket, PCIC_TIME_COMMAND_1); 5070 cmn_err(CE_CONT, "\tcmd-tim0 \t%x\tcmd-tim1 \t%x\n", i, j); 5071 5072 i = pcic_getb(pcic, socket, PCIC_TIME_RECOVER_0); 5073 j = pcic_getb(pcic, socket, PCIC_TIME_RECOVER_1); 5074 cmn_err(CE_CONT, "\trcvr-tim0 \t%x\trcvr-tim1 \t%x\n", i, j); 5075 5076 cmn_err(CE_CONT, "--------- Extended Registers --------\n"); 5077 5078 for (buff[0] = '\0', i = 0; cxregs[i].name != NULL && len-- != 0; i++) { 5079 value = clext_reg_read(pcic, socket, cxregs[i].off); 5080 if (i & 1) { 5081 if (cxregs[i].fmt) 5082 fmt = "%s\t%s\t%b\n"; 5083 else 5084 fmt = "%s\t%s\t%x\n"; 5085 cmn_err(CE_CONT, fmt, buff, 5086 cxregs[i].name, value, cxregs[i].fmt); 5087 buff[0] = '\0'; 5088 } else { 5089 if (cxregs[i].fmt) 5090 fmt = "\t%s\t%b"; 5091 else 5092 fmt = "\t%s\t%x"; 5093 (void) sprintf(buff, fmt, 5094 cxregs[i].name, value, cxregs[i].fmt); 5095 for (j = strlen(buff); j < 40; j++) 5096 buff[j] = ' '; 5097 buff[40] = '\0'; 5098 } 5099 } 5100 } 5101 5102 #if defined(PCIC_DEBUG) 5103 static void 5104 xxdmp_all_regs(pcicdev_t *pcic, int socket, uint32_t len) 5105 { 5106 int i, value, j; 5107 char buff[256]; 5108 char *fmt; 5109 5110 #if defined(PCIC_DEBUG) 5111 if (pcic_debug < 2) 5112 return; 5113 #endif 5114 cmn_err(CE_CONT, 5115 "----------- PCIC Registers for socket %d---------\n", 5116 socket); 5117 cmn_err(CE_CONT, 5118 "\tname value name value\n"); 5119 5120 for (buff[0] = '\0', i = 0; iregs[i].name != NULL && len-- != 0; i++) { 5121 value = pcic_getb(pcic, socket, iregs[i].off); 5122 if (i & 1) { 5123 if (iregs[i].fmt) 5124 fmt = "%s\t%s\t%b\n"; 5125 else 5126 fmt = "%s\t%s\t%x\n"; 5127 cmn_err(CE_CONT, fmt, buff, 5128 iregs[i].name, value, iregs[i].fmt); 5129 buff[0] = '\0'; 5130 } else { 5131 if (iregs[i].fmt) 5132 fmt = "\t%s\t%b"; 5133 else 5134 fmt = "\t%s\t%x"; 5135 (void) sprintf(buff, fmt, 5136 iregs[i].name, value, iregs[i].fmt); 5137 for (j = strlen(buff); j < 40; j++) 5138 buff[j] = ' '; 5139 buff[40] = '\0'; 5140 } 5141 } 5142 switch (pcic->pc_type) { 5143 case PCIC_CL_PD6710: 5144 case PCIC_CL_PD6722: 5145 case PCIC_CL_PD6729: 5146 case PCIC_CL_PD6832: 5147 (void) xxdmp_cl_regs(pcic, socket, 0xFFFF); 5148 break; 5149 } 5150 cmn_err(CE_CONT, "%s\n", buff); 5151 } 5152 #endif 5153 5154 /* 5155 * pcic_mswait(ms) 5156 * sleep ms milliseconds 5157 * call drv_usecwait once for each ms 5158 */ 5159 static void 5160 pcic_mswait(pcicdev_t *pcic, int socket, int ms) 5161 { 5162 if (ms) { 5163 pcic->pc_sockets[socket].pcs_flags |= PCS_WAITING; 5164 pcic_mutex_exit(&pcic->pc_lock); 5165 delay(drv_usectohz(ms*1000)); 5166 pcic_mutex_enter(&pcic->pc_lock); 5167 pcic->pc_sockets[socket].pcs_flags &= ~PCS_WAITING; 5168 } 5169 } 5170 5171 /* 5172 * pcic_check_ready(pcic, index, off) 5173 * Wait for card to come ready 5174 * We only wait if the card is NOT in RESET 5175 * and power is on. 5176 */ 5177 static boolean_t 5178 pcic_check_ready(pcicdev_t *pcic, int socket) 5179 { 5180 int ifstate, intstate; 5181 5182 intstate = pcic_getb(pcic, socket, PCIC_INTERRUPT); 5183 ifstate = pcic_getb(pcic, socket, PCIC_INTERFACE_STATUS); 5184 5185 if ((intstate & PCIC_RESET) && 5186 ((ifstate & (PCIC_READY|PCIC_POWER_ON|PCIC_ISTAT_CD_MASK)) == 5187 (PCIC_READY|PCIC_POWER_ON|PCIC_CD_PRESENT_OK))) 5188 return (B_TRUE); 5189 5190 #ifdef PCIC_DEBUG 5191 pcic_err(NULL, 5, "pcic_check_read: Card not ready, intstate = 0x%x, " 5192 "ifstate = 0x%x\n", intstate, ifstate); 5193 if (pcic_debug) { 5194 pcic_debug += 4; 5195 xxdmp_all_regs(pcic, socket, -1); 5196 pcic_debug -= 4; 5197 } 5198 #endif 5199 return (B_FALSE); 5200 } 5201 5202 /* 5203 * Cirrus Logic extended register read/write routines 5204 */ 5205 static int 5206 clext_reg_read(pcicdev_t *pcic, int sn, uchar_t ext_reg) 5207 { 5208 int val; 5209 5210 switch (pcic->pc_io_type) { 5211 case PCIC_IO_TYPE_YENTA: 5212 val = ddi_get8(pcic->handle, 5213 pcic->ioaddr + CB_CLEXT_OFFSET + ext_reg); 5214 break; 5215 default: 5216 pcic_putb(pcic, sn, PCIC_CL_EXINDEX, ext_reg); 5217 val = pcic_getb(pcic, sn, PCIC_CL_EXINDEX + 1); 5218 break; 5219 } 5220 5221 return (val); 5222 } 5223 5224 static void 5225 clext_reg_write(pcicdev_t *pcic, int sn, uchar_t ext_reg, uchar_t value) 5226 { 5227 switch (pcic->pc_io_type) { 5228 case PCIC_IO_TYPE_YENTA: 5229 ddi_put8(pcic->handle, 5230 pcic->ioaddr + CB_CLEXT_OFFSET + ext_reg, value); 5231 break; 5232 default: 5233 pcic_putb(pcic, sn, PCIC_CL_EXINDEX, ext_reg); 5234 pcic_putb(pcic, sn, PCIC_CL_EXINDEX + 1, value); 5235 break; 5236 } 5237 } 5238 5239 /* 5240 * Misc PCI functions 5241 */ 5242 static void 5243 pcic_iomem_pci_ctl(ddi_acc_handle_t handle, uchar_t *cfgaddr, unsigned flags) 5244 { 5245 unsigned cmd; 5246 5247 if (flags & (PCIC_ENABLE_IO | PCIC_ENABLE_MEM)) { 5248 cmd = ddi_get16(handle, (ushort_t *)(cfgaddr + 4)); 5249 if ((cmd & (PCI_COMM_IO|PCI_COMM_MAE)) == 5250 (PCI_COMM_IO|PCI_COMM_MAE)) 5251 return; 5252 5253 if (flags & PCIC_ENABLE_IO) 5254 cmd |= PCI_COMM_IO; 5255 5256 if (flags & PCIC_ENABLE_MEM) 5257 cmd |= PCI_COMM_MAE; 5258 5259 ddi_put16(handle, (ushort_t *)(cfgaddr + 4), cmd); 5260 } /* if (PCIC_ENABLE_IO | PCIC_ENABLE_MEM) */ 5261 } 5262 5263 /* 5264 * pcic_find_pci_type - Find and return PCI-PCMCIA adapter type 5265 */ 5266 static int 5267 pcic_find_pci_type(pcicdev_t *pcic) 5268 { 5269 uint32_t vend, device; 5270 5271 vend = ddi_getprop(DDI_DEV_T_ANY, pcic->dip, 5272 DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS, 5273 "vendor-id", -1); 5274 device = ddi_getprop(DDI_DEV_T_ANY, pcic->dip, 5275 DDI_PROP_CANSLEEP|DDI_PROP_DONTPASS, 5276 "device-id", -1); 5277 5278 device = PCI_ID(vend, device); 5279 pcic->pc_type = device; 5280 pcic->pc_chipname = "PCI:unknown"; 5281 5282 switch (device) { 5283 case PCIC_INTEL_i82092: 5284 pcic->pc_chipname = PCIC_TYPE_i82092; 5285 break; 5286 case PCIC_CL_PD6729: 5287 pcic->pc_chipname = PCIC_TYPE_PD6729; 5288 /* 5289 * Some 6730's incorrectly identify themselves 5290 * as a 6729, so we need to do some more tests 5291 * here to see if the device that's claiming 5292 * to be a 6729 is really a 6730. 5293 */ 5294 if ((clext_reg_read(pcic, 0, PCIC_CLEXT_MISC_CTL_3) & 5295 PCIC_CLEXT_MISC_CTL_3_REV_MASK) == 5296 0) { 5297 pcic->pc_chipname = PCIC_TYPE_PD6730; 5298 pcic->pc_type = PCIC_CL_PD6730; 5299 } 5300 break; 5301 case PCIC_CL_PD6730: 5302 pcic->pc_chipname = PCIC_TYPE_PD6730; 5303 break; 5304 case PCIC_CL_PD6832: 5305 pcic->pc_chipname = PCIC_TYPE_PD6832; 5306 break; 5307 case PCIC_SMC_34C90: 5308 pcic->pc_chipname = PCIC_TYPE_34C90; 5309 break; 5310 case PCIC_TOSHIBA_TOPIC95: 5311 pcic->pc_chipname = PCIC_TYPE_TOPIC95; 5312 break; 5313 case PCIC_TOSHIBA_TOPIC100: 5314 pcic->pc_chipname = PCIC_TYPE_TOPIC100; 5315 break; 5316 case PCIC_TI_PCI1031: 5317 pcic->pc_chipname = PCIC_TYPE_PCI1031; 5318 break; 5319 case PCIC_TI_PCI1130: 5320 pcic->pc_chipname = PCIC_TYPE_PCI1130; 5321 break; 5322 case PCIC_TI_PCI1131: 5323 pcic->pc_chipname = PCIC_TYPE_PCI1131; 5324 break; 5325 case PCIC_TI_PCI1250: 5326 pcic->pc_chipname = PCIC_TYPE_PCI1250; 5327 break; 5328 case PCIC_TI_PCI1225: 5329 pcic->pc_chipname = PCIC_TYPE_PCI1225; 5330 break; 5331 case PCIC_TI_PCI1410: 5332 pcic->pc_chipname = PCIC_TYPE_PCI1410; 5333 break; 5334 case PCIC_TI_PCI1510: 5335 pcic->pc_chipname = PCIC_TYPE_PCI1510; 5336 break; 5337 case PCIC_TI_PCI1520: 5338 pcic->pc_chipname = PCIC_TYPE_PCI1520; 5339 break; 5340 case PCIC_TI_PCI1221: 5341 pcic->pc_chipname = PCIC_TYPE_PCI1221; 5342 break; 5343 case PCIC_TI_PCI1050: 5344 pcic->pc_chipname = PCIC_TYPE_PCI1050; 5345 break; 5346 case PCIC_ENE_1410: 5347 pcic->pc_chipname = PCIC_TYPE_1410; 5348 break; 5349 case PCIC_O2_OZ6912: 5350 pcic->pc_chipname = PCIC_TYPE_OZ6912; 5351 break; 5352 case PCIC_RICOH_RL5C466: 5353 pcic->pc_chipname = PCIC_TYPE_RL5C466; 5354 break; 5355 case PCIC_TI_PCI1420: 5356 pcic->pc_chipname = PCIC_TYPE_PCI1420; 5357 break; 5358 case PCIC_ENE_1420: 5359 pcic->pc_chipname = PCIC_TYPE_1420; 5360 break; 5361 default: 5362 switch (PCI_ID(vend, (uint32_t)0)) { 5363 case PCIC_TOSHIBA_VENDOR: 5364 pcic->pc_chipname = PCIC_TYPE_TOSHIBA; 5365 pcic->pc_type = PCIC_TOSHIBA_VENDOR; 5366 break; 5367 case PCIC_TI_VENDOR: 5368 pcic->pc_chipname = PCIC_TYPE_TI; 5369 pcic->pc_type = PCIC_TI_VENDOR; 5370 break; 5371 case PCIC_O2MICRO_VENDOR: 5372 pcic->pc_chipname = PCIC_TYPE_O2MICRO; 5373 pcic->pc_type = PCIC_O2MICRO_VENDOR; 5374 break; 5375 case PCIC_RICOH_VENDOR: 5376 pcic->pc_chipname = PCIC_TYPE_RICOH; 5377 pcic->pc_type = PCIC_RICOH_VENDOR; 5378 break; 5379 default: 5380 if (!(pcic->pc_flags & PCF_CARDBUS)) 5381 return (DDI_FAILURE); 5382 pcic->pc_chipname = PCIC_TYPE_YENTA; 5383 break; 5384 } 5385 } 5386 return (DDI_SUCCESS); 5387 } 5388 5389 static void 5390 pcic_82092_smiirq_ctl(pcicdev_t *pcic, int socket, int intr, int state) 5391 { 5392 uchar_t ppirr = ddi_get8(pcic->cfg_handle, 5393 pcic->cfgaddr + PCIC_82092_PPIRR); 5394 uchar_t val; 5395 5396 if (intr == PCIC_82092_CTL_SMI) { 5397 val = PCIC_82092_SMI_CTL(socket, 5398 PCIC_82092_INT_DISABLE); 5399 ppirr &= ~val; 5400 val = PCIC_82092_SMI_CTL(socket, state); 5401 ppirr |= val; 5402 } else { 5403 val = PCIC_82092_IRQ_CTL(socket, 5404 PCIC_82092_INT_DISABLE); 5405 ppirr &= ~val; 5406 val = PCIC_82092_IRQ_CTL(socket, state); 5407 ppirr |= val; 5408 } 5409 ddi_put8(pcic->cfg_handle, pcic->cfgaddr + PCIC_82092_PPIRR, 5410 ppirr); 5411 } 5412 5413 static uint_t 5414 pcic_cd_softint(caddr_t arg1, caddr_t arg2) 5415 { 5416 pcic_socket_t *sockp = (pcic_socket_t *)arg1; 5417 uint_t rc = DDI_INTR_UNCLAIMED; 5418 5419 _NOTE(ARGUNUSED(arg2)) 5420 5421 mutex_enter(&sockp->pcs_pcic->pc_lock); 5422 if (sockp->pcs_cd_softint_flg) { 5423 uint8_t status; 5424 sockp->pcs_cd_softint_flg = 0; 5425 rc = DDI_INTR_CLAIMED; 5426 status = pcic_getb(sockp->pcs_pcic, sockp->pcs_socket, 5427 PCIC_INTERFACE_STATUS); 5428 pcic_handle_cd_change(sockp->pcs_pcic, sockp, status); 5429 } 5430 mutex_exit(&sockp->pcs_pcic->pc_lock); 5431 return (rc); 5432 } 5433 5434 int pcic_debounce_cnt = PCIC_REM_DEBOUNCE_CNT; 5435 int pcic_debounce_intr_time = PCIC_REM_DEBOUNCE_TIME; 5436 int pcic_debounce_cnt_ok = PCIC_DEBOUNCE_OK_CNT; 5437 5438 #ifdef CARDBUS 5439 static uint32_t pcic_cbps_on = 0; 5440 static uint32_t pcic_cbps_off = CB_PS_NOTACARD | CB_PS_CCDMASK | 5441 CB_PS_XVCARD | CB_PS_YVCARD; 5442 #else 5443 static uint32_t pcic_cbps_on = CB_PS_16BITCARD; 5444 static uint32_t pcic_cbps_off = CB_PS_NOTACARD | CB_PS_CCDMASK | 5445 CB_PS_CBCARD | 5446 CB_PS_XVCARD | CB_PS_YVCARD; 5447 #endif 5448 static void 5449 pcic_handle_cd_change(pcicdev_t *pcic, pcic_socket_t *sockp, uint8_t status) 5450 { 5451 boolean_t do_debounce = B_FALSE; 5452 int debounce_time = drv_usectohz(pcic_debounce_time); 5453 uint8_t irq; 5454 timeout_id_t debounce; 5455 5456 /* 5457 * Always reset debounce but may need to check original state later. 5458 */ 5459 debounce = sockp->pcs_debounce_id; 5460 sockp->pcs_debounce_id = 0; 5461 5462 /* 5463 * Check to see whether a card is present or not. There are 5464 * only two states that we are concerned with - the state 5465 * where both CD pins are asserted, which means that the 5466 * card is fully seated, and the state where neither CD 5467 * pin is asserted, which means that the card is not 5468 * present. 5469 * The CD signals are generally very noisy and cause a lot of 5470 * contact bounce as the card is being inserted and 5471 * removed, so we need to do some software debouncing. 5472 */ 5473 5474 #ifdef PCIC_DEBUG 5475 pcic_err(pcic->dip, 6, 5476 "pcic%d handle_cd_change: socket %d card status 0x%x" 5477 " deb 0x%p\n", ddi_get_instance(pcic->dip), 5478 sockp->pcs_socket, status, debounce); 5479 #endif 5480 switch (status & PCIC_ISTAT_CD_MASK) { 5481 case PCIC_CD_PRESENT_OK: 5482 sockp->pcs_flags &= ~(PCS_CARD_REMOVED|PCS_CARD_CBREM); 5483 if (!(sockp->pcs_flags & PCS_CARD_PRESENT)) { 5484 uint32_t cbps; 5485 #ifdef PCIC_DEBUG 5486 pcic_err(pcic->dip, 8, "New card (0x%x)\n", sockp->pcs_flags); 5487 #endif 5488 cbps = pcic_getcb(pcic, CB_PRESENT_STATE); 5489 #ifdef PCIC_DEBUG 5490 pcic_err(pcic->dip, 8, "CBus PS (0x%x)\n", cbps); 5491 #endif 5492 /* 5493 * Check the CB bits are sane. 5494 */ 5495 if ((cbps & pcic_cbps_on) != pcic_cbps_on || 5496 cbps & pcic_cbps_off) { 5497 cmn_err(CE_WARN, 5498 "%s%d: Odd Cardbus Present State 0x%x\n", 5499 ddi_get_name(pcic->dip), 5500 ddi_get_instance(pcic->dip), 5501 cbps); 5502 pcic_putcb(pcic, CB_EVENT_FORCE, CB_EF_CVTEST); 5503 debounce = 0; 5504 debounce_time = drv_usectohz(1000000); 5505 } 5506 if (debounce) { 5507 sockp->pcs_flags |= PCS_CARD_PRESENT; 5508 if (pcic_do_insertion) { 5509 5510 cbps = pcic_getcb(pcic, CB_PRESENT_STATE); 5511 5512 if (cbps & CB_PS_16BITCARD) { 5513 pcic_err(pcic->dip, 5514 8, "16 bit card inserted\n"); 5515 sockp->pcs_flags |= PCS_CARD_IS16BIT; 5516 /* calls pcm_adapter_callback() */ 5517 if (pcic->pc_callback) { 5518 5519 (void) ddi_prop_update_string( 5520 DDI_DEV_T_NONE, 5521 pcic->dip, PCM_DEVICETYPE, 5522 "pccard"); 5523 PC_CALLBACK(pcic->dip, 5524 pcic->pc_cb_arg, 5525 PCE_CARD_INSERT, 5526 sockp->pcs_socket); 5527 } 5528 } else if (cbps & CB_PS_CBCARD) { 5529 pcic_err(pcic->dip, 5530 8, "32 bit card inserted\n"); 5531 5532 if (pcic->pc_flags & PCF_CARDBUS) { 5533 sockp->pcs_flags |= 5534 PCS_CARD_ISCARDBUS; 5535 #ifdef CARDBUS 5536 if (!pcic_load_cardbus(pcic, 5537 sockp)) { 5538 pcic_unload_cardbus( 5539 pcic, sockp); 5540 } 5541 5542 #else 5543 cmn_err(CE_NOTE, 5544 "32 bit Cardbus not" 5545 " supported in" 5546 " this device driver\n"); 5547 #endif 5548 } else { 5549 /* 5550 * Ignore the card 5551 */ 5552 cmn_err(CE_NOTE, 5553 "32 bit Cardbus not" 5554 " supported on this" 5555 " device\n"); 5556 } 5557 } else { 5558 cmn_err(CE_NOTE, 5559 "Unsupported PCMCIA card" 5560 " inserted\n"); 5561 } 5562 } 5563 } else { 5564 do_debounce = B_TRUE; 5565 } 5566 } else { 5567 /* 5568 * It is possible to come through here if the system 5569 * starts up with cards already inserted. Do nothing 5570 * and don't worry about it. 5571 */ 5572 #ifdef PCIC_DEBUG 5573 pcic_err(pcic->dip, 5, 5574 "pcic%d: Odd card insertion indication on socket %d\n", 5575 ddi_get_instance(pcic->dip), 5576 sockp->pcs_socket); 5577 #endif 5578 } 5579 break; 5580 5581 default: 5582 if (!(sockp->pcs_flags & PCS_CARD_PRESENT)) { 5583 /* 5584 * Someone has started to insert a card so delay a while. 5585 */ 5586 do_debounce = B_TRUE; 5587 break; 5588 } 5589 /* 5590 * Otherwise this is basically the same as not present 5591 * so fall through. 5592 */ 5593 5594 /* FALLTHRU */ 5595 case 0: 5596 if (sockp->pcs_flags & PCS_CARD_PRESENT) { 5597 if (pcic->pc_flags & PCF_CBPWRCTL) { 5598 pcic_putcb(pcic, CB_CONTROL, 0); 5599 } else { 5600 pcic_putb(pcic, sockp->pcs_socket, 5601 PCIC_POWER_CONTROL, 0); 5602 (void) pcic_getb(pcic, sockp->pcs_socket, 5603 PCIC_POWER_CONTROL); 5604 } 5605 #ifdef PCIC_DEBUG 5606 pcic_err(pcic->dip, 8, "Card removed\n"); 5607 #endif 5608 sockp->pcs_flags &= ~PCS_CARD_PRESENT; 5609 5610 if (sockp->pcs_flags & PCS_CARD_IS16BIT) { 5611 sockp->pcs_flags &= ~PCS_CARD_IS16BIT; 5612 if (pcic_do_removal && pcic->pc_callback) { 5613 PC_CALLBACK(pcic->dip, pcic->pc_cb_arg, 5614 PCE_CARD_REMOVAL, sockp->pcs_socket); 5615 } 5616 } 5617 if (sockp->pcs_flags & PCS_CARD_ISCARDBUS) { 5618 sockp->pcs_flags &= ~PCS_CARD_ISCARDBUS; 5619 sockp->pcs_flags |= PCS_CARD_CBREM; 5620 } 5621 sockp->pcs_flags |= PCS_CARD_REMOVED; 5622 5623 do_debounce = B_TRUE; 5624 } 5625 if (debounce && (sockp->pcs_flags & PCS_CARD_REMOVED)) { 5626 if (sockp->pcs_flags & PCS_CARD_CBREM) { 5627 /* 5628 * Ensure that we do the unloading in the 5629 * debounce handler, that way we're not doing 5630 * nasty things in an interrupt handler. e.g. 5631 * a USB device will wait for data which will 5632 * obviously never come because we've 5633 * unplugged the device, but the wait will 5634 * wait forever because no interrupts can 5635 * come in... 5636 */ 5637 #ifdef CARDBUS 5638 pcic_unload_cardbus(pcic, sockp); 5639 /* pcic_dump_all(pcic); */ 5640 #endif 5641 sockp->pcs_flags &= ~PCS_CARD_CBREM; 5642 } 5643 sockp->pcs_flags &= ~PCS_CARD_REMOVED; 5644 } 5645 break; 5646 } /* switch */ 5647 5648 if (do_debounce) { 5649 /* 5650 * Delay doing 5651 * anything for a while so that things can settle 5652 * down a little. Interrupts are already disabled. 5653 * Reset the state and we'll reevaluate the 5654 * whole kit 'n kaboodle when the timeout fires 5655 */ 5656 #ifdef PCIC_DEBUG 5657 pcic_err(pcic->dip, 8, "Queueing up debounce timeout for " 5658 "socket %d.%d\n", 5659 ddi_get_instance(pcic->dip), 5660 sockp->pcs_socket); 5661 #endif 5662 sockp->pcs_debounce_id = 5663 pcic_add_debqueue(sockp, debounce_time); 5664 5665 /* 5666 * We bug out here without re-enabling interrupts. They will 5667 * be re-enabled when the debounce timeout swings through 5668 * here. 5669 */ 5670 return; 5671 } 5672 5673 /* 5674 * Turn on Card detect interrupts. Other interrupts will be 5675 * enabled during set_socket calls. 5676 * 5677 * Note that set_socket only changes interrupt settings when there 5678 * is a card present. 5679 */ 5680 irq = pcic_getb(pcic, sockp->pcs_socket, PCIC_MANAGEMENT_INT); 5681 irq |= PCIC_CD_DETECT; 5682 pcic_putb(pcic, sockp->pcs_socket, PCIC_MANAGEMENT_INT, irq); 5683 pcic_putcb(pcic, CB_STATUS_MASK, CB_SE_CCDMASK); 5684 5685 /* Out from debouncing state */ 5686 sockp->pcs_flags &= ~PCS_DEBOUNCING; 5687 5688 pcic_err(pcic->dip, 7, "Leaving pcic_handle_cd_change\n"); 5689 } 5690 5691 /* 5692 * pcic_getb() 5693 * get an I/O byte based on the yardware decode method 5694 */ 5695 static uint8_t 5696 pcic_getb(pcicdev_t *pcic, int socket, int reg) 5697 { 5698 int work; 5699 5700 #if defined(PCIC_DEBUG) 5701 if (pcic_debug == 0x7fff) { 5702 cmn_err(CE_CONT, "pcic_getb0: pcic=%p socket=%d reg=%d\n", 5703 (void *)pcic, socket, reg); 5704 cmn_err(CE_CONT, "pcic_getb1: type=%d handle=%p ioaddr=%p \n", 5705 pcic->pc_io_type, (void *)pcic->handle, 5706 (void *)pcic->ioaddr); 5707 } 5708 #endif 5709 5710 switch (pcic->pc_io_type) { 5711 case PCIC_IO_TYPE_YENTA: 5712 return (ddi_get8(pcic->handle, 5713 pcic->ioaddr + CB_R2_OFFSET + reg)); 5714 default: 5715 work = (socket * PCIC_SOCKET_1) | reg; 5716 ddi_put8(pcic->handle, pcic->ioaddr, work); 5717 return (ddi_get8(pcic->handle, pcic->ioaddr + 1)); 5718 } 5719 } 5720 5721 static void 5722 pcic_putb(pcicdev_t *pcic, int socket, int reg, int8_t value) 5723 { 5724 int work; 5725 5726 #if defined(PCIC_DEBUG) 5727 if (pcic_debug == 0x7fff) { 5728 cmn_err(CE_CONT, 5729 "pcic_putb0: pcic=%p socket=%d reg=%d value=%x \n", 5730 (void *)pcic, socket, reg, value); 5731 cmn_err(CE_CONT, 5732 "pcic_putb1: type=%d handle=%p ioaddr=%p \n", 5733 pcic->pc_io_type, (void *)pcic->handle, 5734 (void *)pcic->ioaddr); 5735 } 5736 #endif 5737 5738 5739 switch (pcic->pc_io_type) { 5740 case PCIC_IO_TYPE_YENTA: 5741 ddi_put8(pcic->handle, pcic->ioaddr + CB_R2_OFFSET + reg, 5742 value); 5743 break; 5744 default: 5745 work = (socket * PCIC_SOCKET_1) | reg; 5746 ddi_put8(pcic->handle, pcic->ioaddr, work); 5747 ddi_put8(pcic->handle, pcic->ioaddr + 1, value); 5748 break; 5749 } 5750 } 5751 5752 /* 5753 * chip identification functions 5754 */ 5755 5756 /* 5757 * chip identification: Cirrus Logic PD6710/6720/6722 5758 */ 5759 static int 5760 pcic_ci_cirrus(pcicdev_t *pcic) 5761 { 5762 int value1, value2; 5763 5764 /* Init the CL id mode */ 5765 value1 = pcic_getb(pcic, 0, PCIC_CHIP_INFO); 5766 pcic_putb(pcic, 0, PCIC_CHIP_INFO, 0); 5767 value1 = pcic_getb(pcic, 0, PCIC_CHIP_INFO); 5768 value2 = pcic_getb(pcic, 0, PCIC_CHIP_INFO); 5769 5770 if ((value1 & PCIC_CI_ID) == PCIC_CI_ID && 5771 (value2 & PCIC_CI_ID) == 0) { 5772 /* chip is a Cirrus Logic and not Intel */ 5773 pcic->pc_type = PCIC_CL_PD6710; 5774 if (value1 & PCIC_CI_SLOTS) 5775 pcic->pc_chipname = PCIC_TYPE_PD6720; 5776 else 5777 pcic->pc_chipname = PCIC_TYPE_PD6710; 5778 /* now fine tune things just in case a 6722 */ 5779 value1 = clext_reg_read(pcic, 0, PCIC_CLEXT_DMASK_0); 5780 if (value1 == 0) { 5781 clext_reg_write(pcic, 0, PCIC_CLEXT_SCRATCH, 0x55); 5782 value1 = clext_reg_read(pcic, 0, PCIC_CLEXT_SCRATCH); 5783 if (value1 == 0x55) { 5784 pcic->pc_chipname = PCIC_TYPE_PD6722; 5785 pcic->pc_type = PCIC_CL_PD6722; 5786 clext_reg_write(pcic, 0, PCIC_CLEXT_SCRATCH, 0); 5787 } 5788 } 5789 return (1); 5790 } 5791 return (0); 5792 } 5793 5794 /* 5795 * chip identification: Vadem (VG365/465/468/469) 5796 */ 5797 5798 static void 5799 pcic_vadem_enable(pcicdev_t *pcic) 5800 { 5801 ddi_put8(pcic->handle, pcic->ioaddr, PCIC_VADEM_P1); 5802 ddi_put8(pcic->handle, pcic->ioaddr, PCIC_VADEM_P2); 5803 ddi_put8(pcic->handle, pcic->ioaddr, pcic->pc_lastreg); 5804 } 5805 5806 static int 5807 pcic_ci_vadem(pcicdev_t *pcic) 5808 { 5809 int value; 5810 5811 pcic_vadem_enable(pcic); 5812 value = pcic_getb(pcic, 0, PCIC_CHIP_REVISION); 5813 pcic_putb(pcic, 0, PCIC_CHIP_REVISION, 0xFF); 5814 if (pcic_getb(pcic, 0, PCIC_CHIP_REVISION) == 5815 (value | PCIC_VADEM_D3) || 5816 (pcic_getb(pcic, 0, PCIC_CHIP_REVISION) & PCIC_REV_MASK) == 5817 PCIC_VADEM_469) { 5818 int vadem, new; 5819 pcic_vadem_enable(pcic); 5820 vadem = pcic_getb(pcic, 0, PCIC_VG_DMA) & 5821 ~(PCIC_V_UNLOCK | PCIC_V_VADEMREV); 5822 new = vadem | (PCIC_V_VADEMREV|PCIC_V_UNLOCK); 5823 pcic_putb(pcic, 0, PCIC_VG_DMA, new); 5824 value = pcic_getb(pcic, 0, PCIC_CHIP_REVISION); 5825 5826 /* want to lock but leave mouse or other on */ 5827 pcic_putb(pcic, 0, PCIC_VG_DMA, vadem); 5828 switch (value & PCIC_REV_MASK) { 5829 case PCIC_VADEM_365: 5830 pcic->pc_chipname = PCIC_VG_365; 5831 pcic->pc_type = PCIC_VADEM; 5832 break; 5833 case PCIC_VADEM_465: 5834 pcic->pc_chipname = PCIC_VG_465; 5835 pcic->pc_type = PCIC_VADEM; 5836 pcic->pc_flags |= PCF_1SOCKET; 5837 break; 5838 case PCIC_VADEM_468: 5839 pcic->pc_chipname = PCIC_VG_468; 5840 pcic->pc_type = PCIC_VADEM; 5841 break; 5842 case PCIC_VADEM_469: 5843 pcic->pc_chipname = PCIC_VG_469; 5844 pcic->pc_type = PCIC_VADEM_VG469; 5845 break; 5846 } 5847 return (1); 5848 } 5849 return (0); 5850 } 5851 5852 /* 5853 * chip identification: Ricoh 5854 */ 5855 static int 5856 pcic_ci_ricoh(pcicdev_t *pcic) 5857 { 5858 int value; 5859 5860 value = pcic_getb(pcic, 0, PCIC_RF_CHIP_IDENT); 5861 switch (value) { 5862 case PCIC_RF_296: 5863 pcic->pc_type = PCIC_RICOH; 5864 pcic->pc_chipname = PCIC_TYPE_RF5C296; 5865 return (1); 5866 case PCIC_RF_396: 5867 pcic->pc_type = PCIC_RICOH; 5868 pcic->pc_chipname = PCIC_TYPE_RF5C396; 5869 return (1); 5870 } 5871 return (0); 5872 } 5873 5874 5875 /* 5876 * set up available address spaces in busra 5877 */ 5878 static void 5879 pcic_init_assigned(dev_info_t *dip) 5880 { 5881 pcm_regs_t *pcic_avail_p; 5882 pci_regspec_t *pci_avail_p, *regs; 5883 int len, entries, rlen; 5884 dev_info_t *pdip; 5885 5886 if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, 5887 "available", (caddr_t)&pcic_avail_p, &len) == DDI_PROP_SUCCESS) { 5888 /* 5889 * found "available" property at the cardbus/pcmcia node 5890 * need to translate address space entries from pcmcia 5891 * format to pci format 5892 */ 5893 entries = len / sizeof (pcm_regs_t); 5894 pci_avail_p = kmem_alloc(sizeof (pci_regspec_t) * entries, 5895 KM_SLEEP); 5896 if (pcic_apply_avail_ranges(dip, pcic_avail_p, pci_avail_p, 5897 entries) == DDI_SUCCESS) 5898 (void) pci_resource_setup_avail(dip, pci_avail_p, 5899 entries); 5900 kmem_free(pcic_avail_p, len); 5901 kmem_free(pci_avail_p, entries * sizeof (pci_regspec_t)); 5902 return; 5903 } 5904 5905 /* 5906 * "legacy" platforms will have "available" property in pci node 5907 */ 5908 for (pdip = ddi_get_parent(dip); pdip; pdip = ddi_get_parent(pdip)) { 5909 if (ddi_getlongprop(DDI_DEV_T_ANY, pdip, DDI_PROP_DONTPASS, 5910 "available", (caddr_t)&pci_avail_p, &len) == 5911 DDI_PROP_SUCCESS) { 5912 /* (void) pci_resource_setup(pdip); */ 5913 kmem_free(pci_avail_p, len); 5914 break; 5915 } 5916 } 5917 5918 if (pdip == NULL) { 5919 int len; 5920 char bus_type[16] = "(unknown)"; 5921 dev_info_t *par; 5922 5923 cmn_err(CE_CONT, 5924 "?pcic_init_assigned: no available property for pcmcia\n"); 5925 5926 /* 5927 * This code is taken from pci_resource_setup() but does 5928 * not attempt to use the "available" property to populate 5929 * the ndi maps that are created. 5930 * The fact that we will actually 5931 * free some resource below (that was allocated by OBP) 5932 * should be enough to be going on with. 5933 */ 5934 for (par = dip; par != NULL; par = ddi_get_parent(par)) { 5935 len = sizeof (bus_type); 5936 5937 if ((ddi_prop_op(DDI_DEV_T_ANY, par, 5938 PROP_LEN_AND_VAL_BUF, 5939 DDI_PROP_CANSLEEP | DDI_PROP_DONTPASS, 5940 "device_type", 5941 (caddr_t)&bus_type, &len) == DDI_SUCCESS) && 5942 (strcmp(bus_type, DEVI_PCI_NEXNAME) == 0 || 5943 strcmp(bus_type, DEVI_PCIEX_NEXNAME) == 0)) 5944 break; 5945 } 5946 if (par != NULL && 5947 (ndi_ra_map_setup(par, NDI_RA_TYPE_MEM) != NDI_SUCCESS || 5948 ndi_ra_map_setup(par, NDI_RA_TYPE_IO) != NDI_SUCCESS)) 5949 par = NULL; 5950 } else { 5951 #ifdef CARDBUS 5952 cardbus_bus_range_t *bus_range; 5953 int k; 5954 5955 if (ddi_getlongprop(DDI_DEV_T_ANY, pdip, 0, "bus-range", 5956 (caddr_t)&bus_range, &k) == DDI_PROP_SUCCESS) { 5957 if (bus_range->lo != bus_range->hi) 5958 pcic_err(pdip, 9, "allowable bus range is " 5959 "%u->%u\n", bus_range->lo, bus_range->hi); 5960 else { 5961 pcic_err(pdip, 0, 5962 "!No spare PCI bus numbers, range is " 5963 "%u->%u, cardbus isn't usable\n", 5964 bus_range->lo, bus_range->hi); 5965 } 5966 kmem_free(bus_range, k); 5967 } else 5968 pcic_err(pdip, 0, "!No bus-range property seems to " 5969 "have been set up\n"); 5970 #endif 5971 /* 5972 * Have a valid parent with the "available" property 5973 */ 5974 (void) pci_resource_setup(pdip); 5975 } 5976 5977 if ((strcmp(ddi_get_name(dip), "pcma") == 0) && 5978 ddi_getlongprop(DDI_DEV_T_NONE, dip, DDI_PROP_DONTPASS, 5979 "assigned-addresses", 5980 (caddr_t)®s, &rlen) == DDI_SUCCESS) { 5981 ra_return_t ra; 5982 5983 /* 5984 * On the UltraBook IIi the ranges are assigned under 5985 * openboot. If we don't free them here the first I/O 5986 * space that can be used is up above 0x10000 which 5987 * doesn't work for this driver due to restrictions 5988 * on the PCI I/O addresses the controllers can cope with. 5989 * They are never going to be used by anything else 5990 * so free them up to the general pool. AG. 5991 */ 5992 pcic_err(dip, 1, "Free assigned addresses\n"); 5993 5994 if ((PCI_REG_ADDR_G(regs[0].pci_phys_hi) == 5995 PCI_REG_ADDR_G(PCI_ADDR_MEM32)) && 5996 regs[0].pci_size_low == 0x1000000) { 5997 ra.ra_addr_lo = regs[0].pci_phys_low; 5998 ra.ra_len = regs[0].pci_size_low; 5999 (void) pcmcia_free_mem(dip, &ra); 6000 } 6001 if ((PCI_REG_ADDR_G(regs[1].pci_phys_hi) == 6002 PCI_REG_ADDR_G(PCI_ADDR_IO)) && 6003 (regs[1].pci_size_low == 0x8000 || 6004 regs[1].pci_size_low == 0x4000)) /* UB-IIi || UB-I */ 6005 { 6006 ra.ra_addr_lo = regs[1].pci_phys_low; 6007 ra.ra_len = regs[1].pci_size_low; 6008 (void) pcmcia_free_io(dip, &ra); 6009 } 6010 kmem_free((caddr_t)regs, rlen); 6011 } 6012 } 6013 6014 /* 6015 * translate "available" from pcmcia format to pci format 6016 */ 6017 static int 6018 pcic_apply_avail_ranges(dev_info_t *dip, pcm_regs_t *pcic_p, 6019 pci_regspec_t *pci_p, int entries) 6020 { 6021 int i, range_len, range_entries; 6022 pcic_ranges_t *pcic_range_p; 6023 6024 if (ddi_getlongprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS, "ranges", 6025 (caddr_t)&pcic_range_p, &range_len) != DDI_PROP_SUCCESS) { 6026 cmn_err(CE_CONT, "?pcic_apply_avail_ranges: " 6027 "no ranges property for pcmcia\n"); 6028 return (DDI_FAILURE); 6029 } 6030 6031 range_entries = range_len / sizeof (pcic_ranges_t); 6032 6033 /* for each "available" entry to be translated */ 6034 for (i = 0; i < entries; i++, pcic_p++, pci_p++) { 6035 int j; 6036 pcic_ranges_t *range_p = pcic_range_p; 6037 pci_p->pci_phys_hi = -1u; /* default invalid value */ 6038 6039 /* for each "ranges" entry to be searched */ 6040 for (j = 0; j < range_entries; j++, range_p++) { 6041 uint64_t range_end = range_p->pcic_range_caddrlo + 6042 range_p->pcic_range_size; 6043 uint64_t avail_end = pcic_p->phys_lo + pcic_p->phys_len; 6044 6045 if ((range_p->pcic_range_caddrhi != pcic_p->phys_hi) || 6046 (range_p->pcic_range_caddrlo > pcic_p->phys_lo) || 6047 (range_end < avail_end)) 6048 continue; 6049 6050 pci_p->pci_phys_hi = range_p->pcic_range_paddrhi; 6051 pci_p->pci_phys_mid = range_p->pcic_range_paddrmid; 6052 pci_p->pci_phys_low = range_p->pcic_range_paddrlo 6053 + (pcic_p->phys_lo - range_p->pcic_range_caddrlo); 6054 pci_p->pci_size_hi = 0; 6055 pci_p->pci_size_low = pcic_p->phys_len; 6056 } 6057 } 6058 kmem_free(pcic_range_p, range_len); 6059 return (DDI_SUCCESS); 6060 } 6061 6062 static int 6063 pcic_open(dev_t *dev, int flag, int otyp, cred_t *cred) 6064 { 6065 #ifdef CARDBUS 6066 if (cardbus_is_cb_minor(*dev)) 6067 return (cardbus_open(dev, flag, otyp, cred)); 6068 #endif 6069 return (EINVAL); 6070 } 6071 6072 static int 6073 pcic_close(dev_t dev, int flag, int otyp, cred_t *cred) 6074 { 6075 #ifdef CARDBUS 6076 if (cardbus_is_cb_minor(dev)) 6077 return (cardbus_close(dev, flag, otyp, cred)); 6078 #endif 6079 return (EINVAL); 6080 } 6081 6082 static int 6083 pcic_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *cred, 6084 int *rval) 6085 { 6086 #ifdef CARDBUS 6087 if (cardbus_is_cb_minor(dev)) 6088 return (cardbus_ioctl(dev, cmd, arg, mode, cred, rval)); 6089 #endif 6090 return (EINVAL); 6091 } 6092 6093 6094 static boolean_t 6095 pcic_load_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp) 6096 { 6097 uint32_t present_state; 6098 dev_info_t *dip = pcic->dip; 6099 set_socket_t s; 6100 get_socket_t g; 6101 boolean_t retval; 6102 unsigned vccLevel; 6103 6104 pcic_err(dip, 8, "entering pcic_load_cardbus\n"); 6105 6106 pcic_mutex_exit(&pcic->pc_lock); 6107 6108 bzero(&s, sizeof (set_socket_t)); 6109 s.socket = sockp->pcs_socket; 6110 s.SCIntMask = SBM_CD|SBM_RDYBSY; 6111 s.IFType = IF_CARDBUS; 6112 s.State = (unsigned)~0; 6113 6114 present_state = pcic_getcb(pcic, CB_PRESENT_STATE); 6115 if (present_state & PCIC_VCC_3VCARD) 6116 s.VccLevel = PCIC_VCC_3VLEVEL; 6117 else if (present_state & PCIC_VCC_5VCARD) 6118 s.VccLevel = PCIC_VCC_5VLEVEL; 6119 else { 6120 cmn_err(CE_CONT, 6121 "pcic_load_cardbus: unsupported card voltage\n"); 6122 goto failure; 6123 } 6124 vccLevel = s.VccLevel; 6125 s.Vpp1Level = s.Vpp2Level = 0; 6126 6127 if (pcic_set_socket(dip, &s) != SUCCESS) 6128 goto failure; 6129 6130 if (pcic_reset_socket(dip, sockp->pcs_socket, 6131 RESET_MODE_CARD_ONLY) != SUCCESS) 6132 goto failure; 6133 6134 bzero(&g, sizeof (get_socket_t)); 6135 g.socket = sockp->pcs_socket; 6136 if (pcic_get_socket(dip, &g) != SUCCESS) 6137 goto failure; 6138 6139 bzero(&s, sizeof (set_socket_t)); 6140 s.socket = sockp->pcs_socket; 6141 s.SCIntMask = SBM_CD; 6142 s.IREQRouting = g.IRQRouting; 6143 s.IFType = g.IFType; 6144 s.CtlInd = g.CtlInd; 6145 s.State = (unsigned)~0; 6146 s.VccLevel = vccLevel; 6147 s.Vpp1Level = s.Vpp2Level = 0; 6148 6149 retval = pcic_set_socket(dip, &s); 6150 pcmcia_cb_resumed(s.socket); 6151 if (retval != SUCCESS) 6152 goto failure; 6153 6154 retval = cardbus_load_cardbus(dip, sockp->pcs_socket, pcic->pc_base); 6155 goto exit; 6156 6157 failure: 6158 retval = B_FALSE; 6159 6160 exit: 6161 pcic_mutex_enter(&pcic->pc_lock); 6162 pcic_err(dip, 8, "exit pcic_load_cardbus (%s)\n", 6163 retval ? "success" : "failure"); 6164 return (retval); 6165 } 6166 6167 static void 6168 pcic_unload_cardbus(pcicdev_t *pcic, const pcic_socket_t *sockp) 6169 { 6170 dev_info_t *dip = pcic->dip; 6171 set_socket_t s; 6172 6173 pcic_mutex_exit(&pcic->pc_lock); 6174 6175 cardbus_unload_cardbus(dip); 6176 6177 bzero(&s, sizeof (set_socket_t)); 6178 s.socket = sockp->pcs_socket; 6179 s.SCIntMask = SBM_CD|SBM_RDYBSY; 6180 s.IREQRouting = 0; 6181 s.IFType = IF_MEMORY; 6182 s.CtlInd = 0; 6183 s.State = 0; 6184 s.VccLevel = s.Vpp1Level = s.Vpp2Level = 0; 6185 6186 (void) pcic_set_socket(dip, &s); 6187 6188 pcic_mutex_enter(&pcic->pc_lock); 6189 } 6190 6191 static uint32_t 6192 pcic_getcb(pcicdev_t *pcic, int reg) 6193 { 6194 ASSERT(pcic->pc_io_type == PCIC_IO_TYPE_YENTA); 6195 6196 return (ddi_get32(pcic->handle, 6197 (uint32_t *)(pcic->ioaddr + CB_CB_OFFSET + reg))); 6198 } 6199 6200 static void 6201 pcic_putcb(pcicdev_t *pcic, int reg, uint32_t value) 6202 { 6203 ASSERT(pcic->pc_io_type == PCIC_IO_TYPE_YENTA); 6204 6205 ddi_put32(pcic->handle, 6206 (uint32_t *)(pcic->ioaddr + CB_CB_OFFSET + reg), value); 6207 } 6208 6209 static void 6210 pcic_enable_io_intr(pcicdev_t *pcic, int socket, int irq) 6211 { 6212 uint8_t value; 6213 uint16_t brdgctl; 6214 6215 value = pcic_getb(pcic, socket, PCIC_INTERRUPT) & ~PCIC_INTR_MASK; 6216 pcic_putb(pcic, socket, PCIC_INTERRUPT, value | irq); 6217 6218 switch (pcic->pc_type) { 6219 case PCIC_INTEL_i82092: 6220 pcic_82092_smiirq_ctl(pcic, socket, PCIC_82092_CTL_IRQ, 6221 PCIC_82092_INT_ENABLE); 6222 break; 6223 case PCIC_O2_OZ6912: 6224 value = pcic_getb(pcic, 0, PCIC_CENTDMA); 6225 value |= 0x8; 6226 pcic_putb(pcic, 0, PCIC_CENTDMA, value); 6227 break; 6228 case PCIC_CL_PD6832: 6229 case PCIC_TI_PCI1250: 6230 case PCIC_TI_PCI1221: 6231 case PCIC_TI_PCI1225: 6232 case PCIC_TI_PCI1410: 6233 case PCIC_ENE_1410: 6234 case PCIC_TI_PCI1510: 6235 case PCIC_TI_PCI1520: 6236 case PCIC_TI_PCI1420: 6237 case PCIC_ENE_1420: 6238 /* route card functional interrupts to PCI interrupts */ 6239 brdgctl = ddi_get16(pcic->cfg_handle, 6240 (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL)); 6241 pcic_err(NULL, 1, 6242 "pcic_enable_io_intr brdgctl(0x%x) was: 0x%x\n", 6243 PCI_CBUS_BRIDGE_CTRL, brdgctl); 6244 brdgctl &= ~PCIC_BRDGCTL_INTR_MASK; 6245 ddi_put16(pcic->cfg_handle, 6246 (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL), 6247 brdgctl); 6248 /* Flush the write */ 6249 (void) ddi_get16(pcic->cfg_handle, 6250 (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL)); 6251 break; 6252 default: 6253 break; 6254 } 6255 } 6256 6257 static void 6258 pcic_disable_io_intr(pcicdev_t *pcic, int socket) 6259 { 6260 uint8_t value; 6261 uint16_t brdgctl; 6262 6263 value = pcic_getb(pcic, socket, PCIC_INTERRUPT) & ~PCIC_INTR_MASK; 6264 pcic_putb(pcic, socket, PCIC_INTERRUPT, value); 6265 6266 switch (pcic->pc_type) { 6267 case PCIC_INTEL_i82092: 6268 pcic_82092_smiirq_ctl(pcic, socket, PCIC_82092_CTL_IRQ, 6269 PCIC_82092_INT_DISABLE); 6270 break; 6271 case PCIC_O2_OZ6912: 6272 value = pcic_getb(pcic, 0, PCIC_CENTDMA); 6273 value &= ~0x8; 6274 pcic_putb(pcic, 0, PCIC_CENTDMA, value); 6275 /* Flush the write */ 6276 (void) pcic_getb(pcic, 0, PCIC_CENTDMA); 6277 break; 6278 case PCIC_CL_PD6832: 6279 case PCIC_TI_PCI1250: 6280 case PCIC_TI_PCI1221: 6281 case PCIC_TI_PCI1225: 6282 case PCIC_TI_PCI1410: 6283 case PCIC_ENE_1410: 6284 case PCIC_TI_PCI1510: 6285 case PCIC_TI_PCI1520: 6286 case PCIC_TI_PCI1420: 6287 case PCIC_ENE_1420: 6288 /* 6289 * This maps I/O interrupts to ExCA which 6290 * have been turned off by the write to 6291 * PCIC_INTERRUPT above. It would appear to 6292 * be the only way to actually turn I/O Ints off 6293 * while retaining CS Ints. 6294 */ 6295 brdgctl = ddi_get16(pcic->cfg_handle, 6296 (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL)); 6297 pcic_err(NULL, 1, 6298 "pcic_disable_io_intr brdgctl(0x%x) was: 0x%x\n", 6299 PCI_CBUS_BRIDGE_CTRL, brdgctl); 6300 brdgctl |= PCIC_BRDGCTL_INTR_MASK; 6301 ddi_put16(pcic->cfg_handle, 6302 (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL), 6303 brdgctl); 6304 /* Flush the write */ 6305 (void) ddi_get16(pcic->cfg_handle, 6306 (uint16_t *)(pcic->cfgaddr + PCI_CBUS_BRIDGE_CTRL)); 6307 break; 6308 default: 6309 break; 6310 } 6311 } 6312 6313 static void 6314 pcic_cb_enable_intr(dev_info_t *dip) 6315 { 6316 anp_t *anp = ddi_get_driver_private(dip); 6317 pcicdev_t *pcic = anp->an_private; 6318 6319 mutex_enter(&pcic->pc_lock); 6320 pcic_enable_io_intr(pcic, 0, pcic->pc_sockets[0].pcs_irq); 6321 mutex_exit(&pcic->pc_lock); 6322 } 6323 6324 static void 6325 pcic_cb_disable_intr(dev_info_t *dip) 6326 { 6327 anp_t *anp = ddi_get_driver_private(dip); 6328 pcicdev_t *pcic = anp->an_private; 6329 6330 mutex_enter(&pcic->pc_lock); 6331 pcic_disable_io_intr(pcic, 0); 6332 mutex_exit(&pcic->pc_lock); 6333 } 6334 6335 static int 6336 log_pci_cfg_err(ushort_t e, int bridge_secondary) 6337 { 6338 int nerr = 0; 6339 if (e & PCI_STAT_PERROR) { 6340 nerr++; 6341 cmn_err(CE_CONT, "detected parity error.\n"); 6342 } 6343 if (e & PCI_STAT_S_SYSERR) { 6344 nerr++; 6345 if (bridge_secondary) 6346 cmn_err(CE_CONT, "received system error.\n"); 6347 else 6348 cmn_err(CE_CONT, "signalled system error.\n"); 6349 } 6350 if (e & PCI_STAT_R_MAST_AB) { 6351 nerr++; 6352 cmn_err(CE_CONT, "received master abort.\n"); 6353 } 6354 if (e & PCI_STAT_R_TARG_AB) 6355 cmn_err(CE_CONT, "received target abort.\n"); 6356 if (e & PCI_STAT_S_TARG_AB) 6357 cmn_err(CE_CONT, "signalled target abort\n"); 6358 if (e & PCI_STAT_S_PERROR) { 6359 nerr++; 6360 cmn_err(CE_CONT, "signalled parity error\n"); 6361 } 6362 return (nerr); 6363 } 6364 6365 #if defined(__sparc) 6366 static int 6367 pcic_fault(enum pci_fault_ops op, void *arg) 6368 { 6369 pcicdev_t *pcic = (pcicdev_t *)arg; 6370 ushort_t pci_cfg_stat = 6371 pci_config_get16(pcic->cfg_handle, PCI_CONF_STAT); 6372 ushort_t pci_cfg_sec_stat = 6373 pci_config_get16(pcic->cfg_handle, 0x16); 6374 char nm[24]; 6375 int nerr = 0; 6376 6377 cardbus_dump_pci_config(pcic->dip); 6378 6379 switch (op) { 6380 case FAULT_LOG: 6381 (void) sprintf(nm, "%s-%d", ddi_driver_name(pcic->dip), 6382 ddi_get_instance(pcic->dip)); 6383 6384 cmn_err(CE_WARN, "%s: PCIC fault log start:\n", nm); 6385 cmn_err(CE_WARN, "%s: primary err (%x):\n", nm, pci_cfg_stat); 6386 nerr += log_pci_cfg_err(pci_cfg_stat, 0); 6387 cmn_err(CE_WARN, "%s: sec err (%x):\n", nm, pci_cfg_sec_stat); 6388 nerr += log_pci_cfg_err(pci_cfg_sec_stat, 1); 6389 cmn_err(CE_CONT, "%s: PCI fault log end.\n", nm); 6390 return (nerr); 6391 case FAULT_POKEFINI: 6392 case FAULT_RESET: 6393 pci_config_put16(pcic->cfg_handle, 6394 PCI_CONF_STAT, pci_cfg_stat); 6395 pci_config_put16(pcic->cfg_handle, 0x16, pci_cfg_sec_stat); 6396 break; 6397 case FAULT_POKEFLT: 6398 if (!(pci_cfg_stat & PCI_STAT_S_SYSERR)) 6399 return (1); 6400 if (!(pci_cfg_sec_stat & PCI_STAT_R_MAST_AB)) 6401 return (1); 6402 break; 6403 default: 6404 break; 6405 } 6406 return (DDI_SUCCESS); 6407 } 6408 #endif 6409 6410 static void 6411 pcic_do_resume(pcicdev_t *pcic) 6412 { 6413 int i, interrupt; 6414 uint8_t cfg; 6415 6416 6417 #if defined(PCIC_DEBUG) 6418 pcic_err(NULL, 6, "pcic_do_resume(): entered\n"); 6419 #endif 6420 6421 pcic_mutex_enter(&pcic->pc_lock); /* protect the registers */ 6422 for (i = 0; i < pcic->pc_numsockets; i++) { 6423 /* Enable interrupts on PCI if needs be */ 6424 interrupt = pcic_getb(pcic, i, PCIC_INTERRUPT); 6425 if (pcic->pc_flags & PCF_USE_SMI) 6426 interrupt |= PCIC_INTR_ENABLE; 6427 pcic_putb(pcic, i, PCIC_INTERRUPT, 6428 PCIC_RESET | interrupt); 6429 pcic->pc_sockets[i].pcs_debounce_id = 6430 pcic_add_debqueue(&pcic->pc_sockets[i], 6431 drv_usectohz(pcic_debounce_time)); 6432 } 6433 pcic_mutex_exit(&pcic->pc_lock); /* protect the registers */ 6434 if (pcic_do_pcmcia_sr) 6435 (void) pcmcia_wait_insert(pcic->dip); 6436 /* 6437 * The CardBus controller may be in RESET state after the 6438 * system is resumed from sleeping. The RESET bit is in 6439 * the Bridge Control register. This is true for all(TI, 6440 * Toshiba ToPIC95/97, RICOH, and O2Micro) CardBus 6441 * controllers. Need to clear the RESET bit explicitly. 6442 */ 6443 cfg = ddi_get8(pcic->cfg_handle, 6444 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG); 6445 if (cfg & (1<<6)) { 6446 cfg &= ~(1<<6); 6447 ddi_put8(pcic->cfg_handle, 6448 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG, 6449 cfg); 6450 cfg = ddi_get8(pcic->cfg_handle, 6451 pcic->cfgaddr + PCIC_BRIDGE_CTL_REG); 6452 if (cfg & (1<<6)) { 6453 pcic_err(pcic->dip, 1, 6454 "Failed to take pcic out of reset"); 6455 } 6456 } 6457 6458 } 6459 6460 static void 6461 pcic_debounce(pcic_socket_t *pcs) 6462 { 6463 uint8_t status, stschng; 6464 6465 pcic_mutex_enter(&pcs->pcs_pcic->pc_lock); 6466 pcs->pcs_flags &= ~PCS_STARTING; 6467 stschng = pcic_getb(pcs->pcs_pcic, pcs->pcs_socket, 6468 PCIC_CARD_STATUS_CHANGE); 6469 status = pcic_getb(pcs->pcs_pcic, pcs->pcs_socket, 6470 PCIC_INTERFACE_STATUS); 6471 #ifdef PCIC_DEBUG 6472 pcic_err(pcs->pcs_pcic->dip, 8, 6473 "pcic_debounce(0x%p, dip=0x%p) socket %d st 0x%x " 6474 "chg 0x%x flg 0x%x\n", 6475 (void *)pcs, (void *) pcs->pcs_pcic->dip, pcs->pcs_socket, 6476 status, stschng, pcs->pcs_flags); 6477 #endif 6478 6479 pcic_putb(pcs->pcs_pcic, pcs->pcs_socket, PCIC_CARD_STATUS_CHANGE, 6480 PCIC_CD_DETECT); 6481 pcic_handle_cd_change(pcs->pcs_pcic, pcs, status); 6482 pcic_mutex_exit(&pcs->pcs_pcic->pc_lock); 6483 } 6484 6485 static void 6486 pcic_deb_thread() 6487 { 6488 callb_cpr_t cprinfo; 6489 struct debounce *debp; 6490 clock_t lastt; 6491 6492 CALLB_CPR_INIT(&cprinfo, &pcic_deb_mtx, 6493 callb_generic_cpr, "pcic debounce thread"); 6494 mutex_enter(&pcic_deb_mtx); 6495 while (pcic_deb_threadid) { 6496 while (pcic_deb_queue) { 6497 #ifdef PCIC_DEBUG 6498 pcic_dump_debqueue("Thread"); 6499 #endif 6500 debp = pcic_deb_queue; 6501 (void) drv_getparm(LBOLT, &lastt); 6502 if (lastt >= debp->expire) { 6503 pcic_deb_queue = debp->next; 6504 mutex_exit(&pcic_deb_mtx); 6505 pcic_debounce(debp->pcs); 6506 mutex_enter(&pcic_deb_mtx); 6507 kmem_free(debp, sizeof (*debp)); 6508 } else { 6509 (void) cv_timedwait(&pcic_deb_cv, 6510 &pcic_deb_mtx, debp->expire); 6511 } 6512 } 6513 CALLB_CPR_SAFE_BEGIN(&cprinfo); 6514 cv_wait(&pcic_deb_cv, &pcic_deb_mtx); 6515 CALLB_CPR_SAFE_END(&cprinfo, &pcic_deb_mtx); 6516 } 6517 pcic_deb_threadid = (kthread_t *)1; 6518 cv_signal(&pcic_deb_cv); 6519 CALLB_CPR_EXIT(&cprinfo); /* Also exits the mutex */ 6520 thread_exit(); 6521 } 6522 6523 static void * 6524 pcic_add_debqueue(pcic_socket_t *pcs, int clocks) 6525 { 6526 clock_t lbolt; 6527 struct debounce *dbp, **dbpp = &pcic_deb_queue; 6528 6529 (void) drv_getparm(LBOLT, &lbolt); 6530 dbp = kmem_alloc(sizeof (struct debounce), KM_SLEEP); 6531 6532 dbp->expire = lbolt + clocks; 6533 dbp->pcs = pcs; 6534 mutex_enter(&pcic_deb_mtx); 6535 while (*dbpp) { 6536 if (dbp->expire > (*dbpp)->expire) 6537 dbpp = &((*dbpp)->next); 6538 else 6539 break; 6540 } 6541 dbp->next = *dbpp; 6542 *dbpp = dbp; 6543 #ifdef PCIC_DEBUG 6544 pcic_dump_debqueue("Add"); 6545 #endif 6546 cv_signal(&pcic_deb_cv); 6547 mutex_exit(&pcic_deb_mtx); 6548 return (dbp); 6549 } 6550 6551 static void 6552 pcic_rm_debqueue(void *id) 6553 { 6554 struct debounce *dbp, **dbpp = &pcic_deb_queue; 6555 6556 dbp = (struct debounce *)id; 6557 mutex_enter(&pcic_deb_mtx); 6558 while (*dbpp) { 6559 if (*dbpp == dbp) { 6560 *dbpp = dbp->next; 6561 kmem_free(dbp, sizeof (*dbp)); 6562 #ifdef PCIC_DEBUG 6563 pcic_dump_debqueue("Remove"); 6564 #endif 6565 cv_signal(&pcic_deb_cv); 6566 mutex_exit(&pcic_deb_mtx); 6567 return; 6568 } 6569 dbpp = &((*dbpp)->next); 6570 } 6571 pcic_err(NULL, 6, "pcic: Failed to find debounce id 0x%p\n", id); 6572 mutex_exit(&pcic_deb_mtx); 6573 } 6574 6575 6576 static int pcic_powerdelay = 0; 6577 6578 static int 6579 pcic_exca_powerctl(pcicdev_t *pcic, int socket, int powerlevel) 6580 { 6581 int ind, value, orig_pwrctl; 6582 6583 /* power setup -- if necessary */ 6584 orig_pwrctl = pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 6585 6586 #if defined(PCIC_DEBUG) 6587 pcic_err(pcic->dip, 6, 6588 "pcic_exca_powerctl(socket %d) powerlevel=%x orig 0x%x\n", 6589 socket, powerlevel, orig_pwrctl); 6590 #endif 6591 /* Preserve the PCIC_OUTPUT_ENABLE (control lines output enable) bit. */ 6592 powerlevel = (powerlevel & ~POWER_OUTPUT_ENABLE) | 6593 (orig_pwrctl & POWER_OUTPUT_ENABLE); 6594 if (powerlevel != orig_pwrctl) { 6595 if (powerlevel & ~POWER_OUTPUT_ENABLE) { 6596 int ifs; 6597 /* 6598 * set power to socket 6599 * note that the powerlevel was calculated earlier 6600 */ 6601 pcic_putb(pcic, socket, PCIC_POWER_CONTROL, powerlevel); 6602 (void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 6603 6604 /* 6605 * this second write to the power control register 6606 * is needed to resolve a problem on 6607 * the IBM ThinkPad 750 6608 * where the first write doesn't latch. 6609 * The second write appears to always work and 6610 * doesn't hurt the operation of other chips 6611 * so we can just use it -- this is good since we can't 6612 * determine what chip the 750 actually uses 6613 * (I suspect an early Ricoh). 6614 */ 6615 pcic_putb(pcic, socket, PCIC_POWER_CONTROL, powerlevel); 6616 6617 value = pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 6618 pcic_mswait(pcic, socket, pcic_powerdelay); 6619 #if defined(PCIC_DEBUG) 6620 pcic_err(pcic->dip, 8, 6621 "\tpowerlevel reg = %x (ifs %x)\n", 6622 value, pcic_getb(pcic, socket, 6623 PCIC_INTERFACE_STATUS)); 6624 pcic_err(pcic->dip, 8, 6625 "CBus regs: PS 0x%x, Control 0x%x\n", 6626 pcic_getcb(pcic, CB_PRESENT_STATE), 6627 pcic_getcb(pcic, CB_CONTROL)); 6628 #endif 6629 /* 6630 * since power was touched, make sure it says it 6631 * is on. This lets it become stable. 6632 */ 6633 for (ind = 0; ind < 20; ind++) { 6634 ifs = pcic_getb(pcic, socket, 6635 PCIC_INTERFACE_STATUS); 6636 if (ifs & PCIC_POWER_ON) 6637 break; 6638 else { 6639 pcic_putb(pcic, socket, 6640 PCIC_POWER_CONTROL, 0); 6641 (void) pcic_getb(pcic, socket, 6642 PCIC_POWER_CONTROL); 6643 pcic_mswait(pcic, socket, 40); 6644 if (ind == 10) { 6645 pcic_putcb(pcic, CB_EVENT_FORCE, 6646 CB_EF_CVTEST); 6647 pcic_mswait(pcic, socket, 100); 6648 } 6649 pcic_putb(pcic, socket, 6650 PCIC_POWER_CONTROL, 6651 powerlevel & ~POWER_OUTPUT_ENABLE); 6652 (void) pcic_getb(pcic, socket, 6653 PCIC_POWER_CONTROL); 6654 pcic_mswait(pcic, socket, 6655 pcic_powerdelay); 6656 pcic_putb(pcic, socket, 6657 PCIC_POWER_CONTROL, powerlevel); 6658 (void) pcic_getb(pcic, socket, 6659 PCIC_POWER_CONTROL); 6660 pcic_mswait(pcic, socket, 6661 pcic_powerdelay); 6662 } 6663 } 6664 6665 if (!(ifs & PCIC_POWER_ON)) { 6666 cmn_err(CE_WARN, 6667 "pcic socket %d: Power didn't get turned" 6668 "on!\nif status 0x%x pwrc 0x%x(x%x) " 6669 "misc1 0x%x igc 0x%x ind %d\n", 6670 socket, ifs, 6671 pcic_getb(pcic, socket, PCIC_POWER_CONTROL), 6672 orig_pwrctl, 6673 pcic_getb(pcic, socket, PCIC_MISC_CTL_1), 6674 pcic_getb(pcic, socket, PCIC_INTERRUPT), 6675 ind); 6676 return (BAD_VCC); 6677 } 6678 #if defined(PCIC_DEBUG) 6679 pcic_err(pcic->dip, 8, 6680 "\tind = %d, if status %x pwrc 0x%x " 6681 "misc1 0x%x igc 0x%x\n", 6682 ind, ifs, 6683 pcic_getb(pcic, socket, PCIC_POWER_CONTROL), 6684 pcic_getb(pcic, socket, PCIC_MISC_CTL_1), 6685 pcic_getb(pcic, socket, PCIC_INTERRUPT)); 6686 #endif 6687 } else { 6688 /* explicitly turned off the power */ 6689 pcic_putb(pcic, socket, PCIC_POWER_CONTROL, powerlevel); 6690 (void) pcic_getb(pcic, socket, PCIC_POWER_CONTROL); 6691 } 6692 } 6693 return (SUCCESS); 6694 } 6695 6696 static int pcic_cbdoreset_during_poweron = 1; 6697 static int 6698 pcic_cbus_powerctl(pcicdev_t *pcic, int socket) 6699 { 6700 uint32_t cbctl = 0, orig_cbctl, cbstev, cbps; 6701 int ind, iobits; 6702 pcic_socket_t *sockp = &pcic->pc_sockets[socket]; 6703 6704 pcic_putcb(pcic, CB_STATUS_EVENT, CB_SE_POWER_CYCLE); 6705 6706 ind = pcic_power[sockp->pcs_vpp1].PowerLevel/10; 6707 cbctl |= pcic_cbv_levels[ind]; 6708 6709 ind = pcic_power[sockp->pcs_vcc].PowerLevel/10; 6710 cbctl |= (pcic_cbv_levels[ind]<<4); 6711 6712 orig_cbctl = pcic_getcb(pcic, CB_CONTROL); 6713 6714 #if defined(PCIC_DEBUG) 6715 pcic_err(pcic->dip, 6, 6716 "pcic_cbus_powerctl(socket %d) vcc %d vpp1 %d " 6717 "cbctl 0x%x->0x%x\n", 6718 socket, sockp->pcs_vcc, sockp->pcs_vpp1, orig_cbctl, cbctl); 6719 #endif 6720 if (cbctl != orig_cbctl) { 6721 if (pcic_cbdoreset_during_poweron && 6722 (orig_cbctl & (CB_C_VCCMASK|CB_C_VPPMASK)) == 0) { 6723 iobits = pcic_getb(pcic, socket, PCIC_INTERRUPT); 6724 pcic_putb(pcic, socket, PCIC_INTERRUPT, 6725 iobits & ~PCIC_RESET); 6726 } 6727 pcic_putcb(pcic, CB_CONTROL, cbctl); 6728 6729 if ((cbctl & CB_C_VCCMASK) == (orig_cbctl & CB_C_VCCMASK)) { 6730 pcic_mswait(pcic, socket, pcic_powerdelay); 6731 return (SUCCESS); 6732 } 6733 for (ind = 0; ind < 20; ind++) { 6734 cbstev = pcic_getcb(pcic, CB_STATUS_EVENT); 6735 6736 if (cbstev & CB_SE_POWER_CYCLE) { 6737 6738 /* 6739 * delay 400 ms: though the standard defines that the Vcc 6740 * set-up time is 20 ms, some PC-Card bridge requires longer 6741 * duration. 6742 * Note: We should check the status AFTER the delay to give time 6743 * for things to stabilize. 6744 */ 6745 pcic_mswait(pcic, socket, 400); 6746 6747 cbps = pcic_getcb(pcic, CB_PRESENT_STATE); 6748 if (cbctl && !(cbps & CB_PS_POWER_CYCLE)) { 6749 /* break; */ 6750 cmn_err(CE_WARN, "cbus_powerctl: power off??\n"); 6751 } 6752 if (cbctl & CB_PS_BADVCC) { 6753 cmn_err(CE_WARN, "cbus_powerctl: bad power request\n"); 6754 break; 6755 } 6756 6757 #if defined(PCIC_DEBUG) 6758 pcic_err(pcic->dip, 8, 6759 "cbstev = 0x%x cbps = 0x%x cbctl 0x%x(0x%x)", 6760 cbstev, pcic_getcb(pcic, CB_PRESENT_STATE), 6761 cbctl, orig_cbctl); 6762 #endif 6763 if (pcic_cbdoreset_during_poweron && 6764 (orig_cbctl & (CB_C_VCCMASK|CB_C_VPPMASK)) == 0) { 6765 pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits); 6766 } 6767 return (SUCCESS); 6768 } 6769 pcic_mswait(pcic, socket, 40); 6770 } 6771 if (pcic_cbdoreset_during_poweron && 6772 (orig_cbctl & (CB_C_VCCMASK|CB_C_VPPMASK)) == 0) { 6773 pcic_putb(pcic, socket, PCIC_INTERRUPT, iobits); 6774 } 6775 cmn_err(CE_WARN, 6776 "pcic socket %d: Power didn't get turned on/off!\n" 6777 "cbstev = 0x%x cbps = 0x%x cbctl 0x%x(0x%x) " 6778 "vcc %d vpp1 %d", socket, cbstev, 6779 pcic_getcb(pcic, CB_PRESENT_STATE), 6780 cbctl, orig_cbctl, sockp->pcs_vcc, sockp->pcs_vpp1); 6781 return (BAD_VCC); 6782 } 6783 return (SUCCESS); 6784 } 6785 6786 static int pcic_do_pprintf = 0; 6787 6788 static void 6789 pcic_dump_debqueue(char *msg) 6790 { 6791 struct debounce *debp = pcic_deb_queue; 6792 clock_t lbolt; 6793 6794 (void) drv_getparm(LBOLT, &lbolt); 6795 pcic_err(NULL, 6, debp ? "pcic debounce list (%s) lbolt 0x%x:\n" : 6796 "pcic debounce_list (%s) EMPTY lbolt 0x%x\n", msg, lbolt); 6797 while (debp) { 6798 pcic_err(NULL, 6, "%p: exp 0x%x next 0x%p id 0x%p\n", 6799 (void *) debp, (int)debp->expire, (void *) debp->next, 6800 debp->pcs->pcs_debounce_id); 6801 debp = debp->next; 6802 } 6803 } 6804 6805 6806 /* PRINTFLIKE3 */ 6807 static void 6808 pcic_err(dev_info_t *dip, int level, const char *fmt, ...) 6809 { 6810 if (pcic_debug && (level <= pcic_debug)) { 6811 va_list adx; 6812 int instance; 6813 char buf[256]; 6814 const char *name; 6815 #if !defined(PCIC_DEBUG) 6816 int ce; 6817 char qmark = 0; 6818 6819 if (level <= 3) 6820 ce = CE_WARN; 6821 else 6822 ce = CE_CONT; 6823 if (level == 4) 6824 qmark = 1; 6825 #endif 6826 6827 if (dip) { 6828 instance = ddi_get_instance(dip); 6829 /* name = ddi_binding_name(dip); */ 6830 name = ddi_driver_name(dip); 6831 } else { 6832 instance = 0; 6833 name = ""; 6834 } 6835 6836 va_start(adx, fmt); 6837 (void) vsprintf(buf, fmt, adx); 6838 va_end(adx); 6839 6840 #if defined(PCIC_DEBUG) 6841 if (pcic_do_pprintf) { 6842 if (dip) { 6843 if (instance >= 0) 6844 prom_printf("%s(%d),0x%p: %s", name, 6845 instance, (void *)dip, buf); 6846 else 6847 prom_printf("%s,0x%p: %s", 6848 name, (void *)dip, buf); 6849 } else 6850 prom_printf(buf); 6851 } else { 6852 if (dip) { 6853 if (instance >= 0) 6854 cmn_err(CE_CONT, "%s(%d),0x%p: %s", 6855 name, instance, (void *) dip, buf); 6856 else 6857 cmn_err(CE_CONT, "%s,0x%p: %s", 6858 name, (void *) dip, buf); 6859 } else 6860 cmn_err(CE_CONT, buf); 6861 } 6862 #else 6863 if (dip) 6864 cmn_err(ce, qmark ? "?%s%d: %s" : "%s%d: %s", name, 6865 instance, buf); 6866 else 6867 cmn_err(ce, qmark ? "?%s" : buf, buf); 6868 #endif 6869 } 6870 }