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