Lines Matching refs:mcp
73 static int mc_board_add(mc_opl_t *mcp);
74 static int mc_board_del(mc_opl_t *mcp);
75 static int mc_suspend(mc_opl_t *mcp, uint32_t flag);
76 static int mc_resume(mc_opl_t *mcp, uint32_t flag);
80 static void insert_mcp(mc_opl_t *mcp);
81 static void delete_mcp(mc_opl_t *mcp);
83 static int pa_to_maddr(mc_opl_t *mcp, uint64_t pa, mc_addr_t *maddr);
85 static int mc_rangecheck_pa(mc_opl_t *mcp, uint64_t pa);
91 int mc_get_mem_sid_dimm(mc_opl_t *mcp, char *dname, char *buf,
93 mc_dimm_info_t *mc_get_dimm_list(mc_opl_t *mcp);
95 int mc_set_mem_sid(mc_opl_t *mcp, char *buf, int buflen, int lsb, int bank,
102 static void mc_clear_rewrite(mc_opl_t *mcp, int i);
103 static void mc_set_rewrite(mc_opl_t *mcp, int bank, uint32_t addr, int state);
490 mc_opl_t *mcp; in mc_attach() local
501 mcp = ddi_get_soft_state(mc_statep, instance); in mc_attach()
502 rv = mc_resume(mcp, MC_DRIVER_SUSPENDED); in mc_attach()
517 if ((mcp = ddi_get_soft_state(mc_statep, instance)) == NULL) { in mc_attach()
530 mcp->mc_dip = devi; in mc_attach()
532 if (mc_board_add(mcp)) in mc_attach()
535 insert_mcp(mcp); in mc_attach()
562 mc_opl_t *mcp; in mc_detach() local
566 if ((mcp = ddi_get_soft_state(mc_statep, instance)) == NULL) { in mc_detach()
572 rv = mc_suspend(mcp, MC_DRIVER_SUSPENDED); in mc_detach()
580 delete_mcp(mcp); in mc_detach()
581 if (mc_board_del(mcp) != DDI_SUCCESS) { in mc_detach()
640 pa_is_valid(mc_opl_t *mcp, uint64_t addr) in pa_is_valid() argument
642 if (mcp->mlist == NULL) in pa_is_valid()
643 mc_get_mlist(mcp); in pa_is_valid()
645 if (mcp->mlist && address_in_memlist(mcp->mlist, addr, 0)) { in pa_is_valid()
661 mcaddr_to_pa(mc_opl_t *mcp, mc_addr_t *maddr, uint64_t *pa) in mcaddr_to_pa() argument
680 int mc_bit = mcp->mc_trans_table[cs][i]; in mcaddr_to_pa()
694 *pa = mcp->mc_start_address + pa_offset; in mcaddr_to_pa()
697 if (pa_to_maddr(mcp, *pa, &maddr1) == -1) { in mcaddr_to_pa()
707 if (IS_MIRROR(mcp, maddr->ma_bank)) { in mcaddr_to_pa()
734 pa_to_cs(mc_opl_t *mcp, uint64_t pa_offset) in pa_to_cs() argument
742 if (mcp->mc_trans_table[0][i] == CS_SHIFT) { in pa_to_cs()
755 pa_to_dimm(mc_opl_t *mcp, uint64_t pa_offset) in pa_to_dimm() argument
758 int cs = pa_to_cs(mcp, pa_offset); in pa_to_dimm()
763 int mc_bit = mcp->mc_trans_table[cs][i]; in pa_to_dimm()
776 pa_to_bank(mc_opl_t *mcp, uint64_t pa_offset) in pa_to_bank() argument
779 int cs = pa_to_cs(mcp, pa_offset); in pa_to_bank()
780 int bankno = mcp->mc_trans_table[cs][INDEX_OF_BANK_SUPPLEMENT_BIT]; in pa_to_bank()
785 int mc_bit = mcp->mc_trans_table[cs][i]; in pa_to_bank()
813 pa_to_maddr(mc_opl_t *mcp, uint64_t pa, mc_addr_t *maddr) in pa_to_maddr() argument
817 if (!mc_rangecheck_pa(mcp, pa)) in pa_to_maddr()
821 pa_offset = pa - mcp->mc_start_address; in pa_to_maddr()
823 maddr->ma_bd = mcp->mc_board_num; in pa_to_maddr()
824 maddr->ma_phys_bd = mcp->mc_phys_board_num; in pa_to_maddr()
825 maddr->ma_bank = pa_to_bank(mcp, pa_offset); in pa_to_maddr()
826 maddr->ma_dimm_addr = pa_to_dimm(mcp, pa_offset); in pa_to_maddr()
1183 restart_patrol(mc_opl_t *mcp, int bank, mc_rsaddr_info_t *rsaddr_info) in restart_patrol() argument
1188 if (MC_REWRITE_MODE(mcp, bank)) { in restart_patrol()
1192 MAC_PTRL_START(mcp, bank); in restart_patrol()
1196 rv = mcaddr_to_pa(mcp, &rsaddr_info->mi_restartaddr, &pa); in restart_patrol()
1199 MAC_PTRL_START(mcp, bank); in restart_patrol()
1203 if (!mc_rangecheck_pa(mcp, pa)) { in restart_patrol()
1206 "on board %d\n", pa, mcp->mc_board_num); in restart_patrol()
1207 MAC_PTRL_START(mcp, bank); in restart_patrol()
1230 if (!pa_is_valid(mcp, pa)) { in restart_patrol()
1250 MAC_PTRL_START(mcp, bank); in restart_patrol()
1268 if (pa >= (mcp->mc_start_address + mcp->mc_size)) { in restart_patrol()
1270 pa = mcp->mc_start_address; in restart_patrol()
1277 MAC_PTRL_START(mcp, bank); in restart_patrol()
1291 ST_MAC_REG(MAC_RESTART_ADD(mcp, bank), MAC_RESTART_PA(pa)); in restart_patrol()
1292 MAC_PTRL_START_ADD(mcp, bank); in restart_patrol()
1332 do_rewrite(mc_opl_t *mcp, int bank, uint32_t dimm_addr, int retrying) in do_rewrite() argument
1346 if (!retrying && MC_REWRITE_MODE(mcp, bank)) { in do_rewrite()
1354 cntl = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)); in do_rewrite()
1366 ST_MAC_REG(MAC_REWRITE_ADD(mcp, bank), dimm_addr); in do_rewrite()
1367 MAC_REW_REQ(mcp, bank); in do_rewrite()
1377 cntl = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)); in do_rewrite()
1384 MAC_CLEAR_ERRS(mcp, bank, MAC_CNTL_REW_ERRS); in do_rewrite()
1387 mc_set_rewrite(mcp, bank, dimm_addr, retry_state); in do_rewrite()
1393 mc_clear_rewrite(mc_opl_t *mcp, int bank) in mc_clear_rewrite() argument
1399 bankp = &(mcp->mc_bank[bank]); in mc_clear_rewrite()
1410 if (do_rewrite(mcp, bank, rew_addr, 1) == 0) in mc_clear_rewrite()
1417 if (!IS_MIRROR(mcp, bank)) { in mc_clear_rewrite()
1418 MC_CLEAR_REWRITE_MODE(mcp, bank); in mc_clear_rewrite()
1421 bankp = &(mcp->mc_bank[mbank]); in mc_clear_rewrite()
1423 MC_CLEAR_REWRITE_MODE(mcp, bank); in mc_clear_rewrite()
1424 MC_CLEAR_REWRITE_MODE(mcp, mbank); in mc_clear_rewrite()
1434 mc_set_rewrite(mc_opl_t *mcp, int bank, uint32_t addr, int state) in mc_set_rewrite() argument
1439 bankp = &mcp->mc_bank[bank]; in mc_set_rewrite()
1450 maddr.ma_bd = mcp->mc_board_num; in mc_set_rewrite()
1453 if (mcaddr_to_pa(mcp, &maddr, &paddr) == 0) { in mc_set_rewrite()
1456 paddr, mcp->mc_board_num, bank, addr); in mc_set_rewrite()
1460 mcp->mc_board_num, bank, addr); in mc_set_rewrite()
1468 MC_SET_REWRITE_MODE(mcp, bank); in mc_set_rewrite()
1477 if (IS_MIRROR(mcp, bank)) { in mc_set_rewrite()
1479 MC_SET_REWRITE_MODE(mcp, mbank); in mc_set_rewrite()
1484 mc_process_scf_log(mc_opl_t *mcp) in mc_process_scf_log() argument
1492 while ((p = mcp->mc_scf_log[bank]) != NULL && in mc_process_scf_log()
1496 while ((LD_MAC_REG(MAC_STATIC_ERR_ADD(mcp, p->sl_bank)) in mc_process_scf_log()
1505 ST_MAC_REG(MAC_STATIC_ERR_LOG(mcp, p->sl_bank), in mc_process_scf_log()
1508 ST_MAC_REG(MAC_STATIC_ERR_ADD(mcp, p->sl_bank), in mc_process_scf_log()
1510 mcp->mc_scf_retry[bank] = 0; in mc_process_scf_log()
1515 if (mcp->mc_scf_retry[bank]++ <= in mc_process_scf_log()
1526 mcp->mc_scf_log[bank] = p->sl_next; in mc_process_scf_log()
1527 mcp->mc_scf_total[bank]--; in mc_process_scf_log()
1528 ASSERT(mcp->mc_scf_total[bank] >= 0); in mc_process_scf_log()
1534 mc_queue_scf_log(mc_opl_t *mcp, mc_flt_stat_t *flt_stat, int bank) in mc_queue_scf_log() argument
1538 if (mcp->mc_scf_total[bank] >= mc_max_scf_logs) { in mc_queue_scf_log()
1550 if (mcp->mc_scf_log[bank] == NULL) { in mc_queue_scf_log()
1555 mcp->mc_scf_log_tail[bank] = mcp->mc_scf_log[bank] = p; in mc_queue_scf_log()
1557 mcp->mc_scf_log_tail[bank]->sl_next = p; in mc_queue_scf_log()
1558 mcp->mc_scf_log_tail[bank] = p; in mc_queue_scf_log()
1560 mcp->mc_scf_total[bank]++; in mc_queue_scf_log()
1576 mc_scrub_ce(mc_opl_t *mcp, int bank, mc_flt_stat_t *flt_stat, int ptrl_error) in mc_scrub_ce() argument
1589 cntl = do_rewrite(mcp, bank, flt_stat->mf_err_add, 0); in mc_scrub_ce()
1623 mc_queue_scf_log(mcp, flt_stat, bank); in mc_scrub_ce()
1647 mc_write_cntl(mc_opl_t *mcp, int bank, uint32_t value) in mc_write_cntl() argument
1649 int ebank = (IS_MIRROR(mcp, bank)) ? MIRROR_IDX(bank) : bank; in mc_write_cntl()
1651 if (mcp->mc_speedup_period[ebank] > 0) in mc_write_cntl()
1654 value |= mcp->mc_speed; in mc_write_cntl()
1655 ST_MAC_REG(MAC_PTRL_CNTL(mcp, bank), value); in mc_write_cntl()
1659 mc_read_ptrl_reg(mc_opl_t *mcp, int bank, mc_flt_stat_t *flt_stat) in mc_read_ptrl_reg() argument
1661 flt_stat->mf_cntl = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)) & in mc_read_ptrl_reg()
1663 flt_stat->mf_err_add = LD_MAC_REG(MAC_PTRL_ERR_ADD(mcp, bank)); in mc_read_ptrl_reg()
1664 flt_stat->mf_err_log = LD_MAC_REG(MAC_PTRL_ERR_LOG(mcp, bank)); in mc_read_ptrl_reg()
1665 flt_stat->mf_flt_maddr.ma_bd = mcp->mc_board_num; in mc_read_ptrl_reg()
1666 flt_stat->mf_flt_maddr.ma_phys_bd = mcp->mc_phys_board_num; in mc_read_ptrl_reg()
1672 mc_read_mi_reg(mc_opl_t *mcp, int bank, mc_flt_stat_t *flt_stat) in mc_read_mi_reg() argument
1676 status = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)) & MAC_CNTL_MI_ERRS; in mc_read_mi_reg()
1682 flt_stat->mf_err_add = LD_MAC_REG(MAC_MI_ERR_ADD(mcp, bank)); in mc_read_mi_reg()
1683 flt_stat->mf_err_log = LD_MAC_REG(MAC_MI_ERR_LOG(mcp, bank)); in mc_read_mi_reg()
1684 status = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)) & in mc_read_mi_reg()
1692 flt_stat->mf_flt_maddr.ma_bd = mcp->mc_board_num; in mc_read_mi_reg()
1693 flt_stat->mf_flt_maddr.ma_phys_bd = mcp->mc_phys_board_num; in mc_read_mi_reg()
1734 mc_process_error_mir(mc_opl_t *mcp, mc_aflt_t *mc_aflt, mc_flt_stat_t *flt_stat) in mc_process_error_mir() argument
1763 mc_scrub_ce(mcp, bank, &flt_stat[i], ptrl_error); in mc_process_error_mir()
1764 if (MC_REWRITE_ACTIVE(mcp, bank)) { in mc_process_error_mir()
1828 (void) do_rewrite(mcp, in mc_process_error_mir()
1873 (void) do_rewrite(mcp, in mc_process_error_mir()
1891 mc_error_handler_mir(mc_opl_t *mcp, int bank, mc_rsaddr_info_t *rsaddr) in mc_error_handler_mir() argument
1905 mc_aflt.mflt_mcp = mcp; in mc_error_handler_mir()
1913 mc_read_ptrl_reg(mcp, bank, &flt_stat[i]); in mc_error_handler_mir()
1930 mc_read_mi_reg(mcp, bank, &mi_flt_stat[i]); in mc_error_handler_mir()
1940 MAC_CLEAR_ERRS(mcp, bank, (MAC_CNTL_PTRL_ERRS|MAC_CNTL_MI_ERRS)); in mc_error_handler_mir()
1942 MAC_CLEAR_ERRS(mcp, bank ^ 1, (MAC_CNTL_PTRL_ERRS|MAC_CNTL_MI_ERRS)); in mc_error_handler_mir()
1956 mi_valid = mc_process_error_mir(mcp, &mc_aflt, &mi_flt_stat[0]); in mc_error_handler_mir()
1985 rsaddr->mi_valid = mc_process_error_mir(mcp, &mc_aflt, &flt_stat[0]); in mc_error_handler_mir()
1988 mc_process_error(mc_opl_t *mcp, int bank, mc_aflt_t *mc_aflt, in mc_process_error() argument
2007 mc_scrub_ce(mcp, bank, flt_stat, ptrl_error); in mc_process_error()
2008 if (MC_REWRITE_ACTIVE(mcp, bank)) { in mc_process_error()
2035 mc_error_handler(mc_opl_t *mcp, int bank, mc_rsaddr_info_t *rsaddr) in mc_error_handler() argument
2045 mc_aflt.mflt_mcp = mcp; in mc_error_handler()
2049 mc_read_ptrl_reg(mcp, bank, &flt_stat); in mc_error_handler()
2058 mc_read_mi_reg(mcp, bank, &mi_flt_stat); in mc_error_handler()
2065 MAC_CLEAR_ERRS(mcp, bank, (MAC_CNTL_PTRL_ERRS|MAC_CNTL_MI_ERRS)); in mc_error_handler()
2071 mi_valid = mc_process_error(mcp, bank, &mc_aflt, &mi_flt_stat); in mc_error_handler()
2091 rsaddr->mi_valid = mc_process_error(mcp, bank, &mc_aflt, in mc_error_handler()
2115 mc_process_rewrite(mc_opl_t *mcp, int bank) in mc_process_rewrite() argument
2121 bankp = &(mcp->mc_bank[bank]); in mc_process_rewrite()
2127 cntl = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)); in mc_process_rewrite()
2131 ST_MAC_REG(MAC_REWRITE_ADD(mcp, bank), rew_addr); in mc_process_rewrite()
2132 MAC_REW_REQ(mcp, bank); in mc_process_rewrite()
2137 cntl = ldphysio(MAC_PTRL_CNTL(mcp, bank)); in mc_process_rewrite()
2140 MAC_CLEAR_ERRS(mcp, bank, in mc_process_rewrite()
2142 mc_clear_rewrite(mcp, bank); in mc_process_rewrite()
2158 if (++mcp->mc_bank[bank].mcb_rewrite_count in mc_process_rewrite()
2164 " automatically.\n", mcp->mc_board_num, in mc_process_rewrite()
2171 mc_check_errors_func(mc_opl_t *mcp) in mc_check_errors_func() argument
2183 if (mcp->mc_status & MC_MEMORYLESS) in mc_check_errors_func()
2187 if (mcp->mc_bank[i].mcb_status & BANK_INSTALLED) { in mc_check_errors_func()
2188 if (MC_REWRITE_ACTIVE(mcp, i)) { in mc_check_errors_func()
2189 mc_process_rewrite(mcp, i); in mc_check_errors_func()
2191 stat = ldphysio(MAC_PTRL_STAT(mcp, i)); in mc_check_errors_func()
2192 cntl = ldphysio(MAC_PTRL_CNTL(mcp, i)); in mc_check_errors_func()
2197 ebk = (IS_MIRROR(mcp, i)) ? MIRROR_IDX(i) : i; in mc_check_errors_func()
2201 mcp->mc_board_num, i, stat, cntl); in mc_check_errors_func()
2209 MAC_CLEAR_MAX(mcp, i); in mc_check_errors_func()
2210 mcp->mc_period[ebk]++; in mc_check_errors_func()
2211 if (IS_MIRROR(mcp, i)) { in mc_check_errors_func()
2213 "/LSB%d/B%d\n", mcp->mc_period[ebk], in mc_check_errors_func()
2214 mcp->mc_board_num, i); in mc_check_errors_func()
2217 "/LSB%d/B%d\n", mcp->mc_period[ebk], in mc_check_errors_func()
2218 mcp->mc_board_num, i); in mc_check_errors_func()
2250 if (mcp->mc_speedup_period[ebk] > 0) { in mc_check_errors_func()
2252 (--mcp->mc_speedup_period[ebk] == in mc_check_errors_func()
2268 MAC_CLEAR_ERRS(mcp, i, in mc_check_errors_func()
2271 if (IS_MIRROR(mcp, i)) { in mc_check_errors_func()
2274 MAC_CLEAR_ERRS(mcp, in mc_check_errors_func()
2290 mcp->mc_speedup_period[ebk] = 2; in mc_check_errors_func()
2291 MAC_CMD(mcp, i, 0); in mc_check_errors_func()
2299 mcp->mc_speedup_period[ebk] = 0; in mc_check_errors_func()
2302 if (IS_MIRROR(mcp, i)) { in mc_check_errors_func()
2303 mc_error_handler_mir(mcp, i, in mc_check_errors_func()
2306 mc_error_handler(mcp, i, &rsaddr_info); in mc_check_errors_func()
2310 (void) restart_patrol(mcp, i, &rsaddr_info); in mc_check_errors_func()
2321 if (!IS_MIRROR(mcp, i) || (i & 0x1)) in mc_check_errors_func()
2322 (void) restart_patrol(mcp, i, NULL); in mc_check_errors_func()
2327 mcp->mc_last_error += error_count; in mc_check_errors_func()
2329 mcp->mc_last_error = 0; in mc_check_errors_func()
2350 mc_opl_t *mcp; in mc_polling() local
2356 if ((mcp = mc_instances[i]) == NULL) { in mc_polling()
2360 mutex_enter(&mcp->mc_lock); in mc_polling()
2362 if (!(mcp->mc_status & MC_POLL_RUNNING)) { in mc_polling()
2363 mutex_exit(&mcp->mc_lock); in mc_polling()
2366 if (scan_error && mcp->mc_tick_left <= 0) { in mc_polling()
2367 mc_check_errors_func((void *)mcp); in mc_polling()
2368 mcp->mc_tick_left = OPL_MAX_BOARDS; in mc_polling()
2371 mcp->mc_tick_left--; in mc_polling()
2373 mc_process_scf_log(mcp); in mc_polling()
2374 mutex_exit(&mcp->mc_lock); in mc_polling()
2379 get_ptrl_start_address(mc_opl_t *mcp, int bank, mc_addr_t *maddr) in get_ptrl_start_address() argument
2381 maddr->ma_bd = mcp->mc_board_num; in get_ptrl_start_address()
2392 get_base_address(mc_opl_t *mcp) in get_base_address() argument
2397 if (ddi_getlongprop(DDI_DEV_T_ANY, mcp->mc_dip, DDI_PROP_DONTPASS, in get_base_address()
2402 mcp->mc_start_address = mem_range->addr; in get_base_address()
2403 mcp->mc_size = mem_range->size; in get_base_address()
2428 mc_rangecheck_pa(mc_opl_t *mcp, uint64_t pa) in mc_rangecheck_pa() argument
2430 if ((pa < mcp->mc_start_address) || (mcp->mc_start_address + in mc_rangecheck_pa()
2431 mcp->mc_size <= pa)) in mc_rangecheck_pa()
2541 mc_get_mlist(mc_opl_t *mcp) in mc_get_mlist() argument
2550 mlist = mc_memlist_del_span(mlist, 0ull, mcp->mc_start_address); in mc_get_mlist()
2556 startpa = mcp->mc_start_address + mcp->mc_size; in mc_get_mlist()
2565 mcp->mlist = mlist; in mc_get_mlist()
2570 mc_board_add(mc_opl_t *mcp) in mc_board_add() argument
2589 mcp->mc_board_num = (int)ddi_getprop(DDI_DEV_T_ANY, mcp->mc_dip, in mc_board_add()
2592 if (mcp->mc_board_num == -1) { in mc_board_add()
2601 if (get_base_address(mcp) == DDI_FAILURE) { in mc_board_add()
2607 cc = ddi_getlongprop_buf(DDI_DEV_T_ANY, mcp->mc_dip, in mc_board_add()
2609 (caddr_t)mcp->mc_trans_table[i], &len); in mc_board_add()
2612 bzero(mcp->mc_trans_table[i], MC_TT_ENTRIES); in mc_board_add()
2615 mcp->mlist = NULL; in mc_board_add()
2617 mc_get_mlist(mcp); in mc_board_add()
2620 cc = ddi_getlongprop(DDI_DEV_T_ANY, mcp->mc_dip, DDI_PROP_DONTPASS, in mc_board_add()
2627 cc = ddi_getlongprop(DDI_DEV_T_ANY, mcp->mc_dip, DDI_PROP_DONTPASS, in mc_board_add()
2637 mcp->mc_phys_board_num = mc_opl_get_physical_board(mcp->mc_board_num); in mc_board_add()
2639 if (mcp->mc_phys_board_num < 0) { in mc_board_add()
2646 mutex_init(&mcp->mc_lock, NULL, MUTEX_DRIVER, NULL); in mc_board_add()
2660 mcp->mc_status |= MC_MEMORYLESS; in mc_board_add()
2665 mcp->mc_scf_retry[i] = 0; in mc_board_add()
2666 mcp->mc_period[i] = 0; in mc_board_add()
2667 mcp->mc_speedup_period[i] = 0; in mc_board_add()
2715 mcp->mc_speed = mc_scan_speeds[MC_MAX_SPEEDS - 1].mc_speeds; in mc_board_add()
2718 mcp->mc_speed = mc_scan_speeds[i].mc_speeds; in mc_board_add()
2723 mcp->mc_speed = 0; in mc_board_add()
2736 bankp = &(mcp->mc_bank[bk]); in mc_board_add()
2748 reg = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bk)); in mc_board_add()
2754 mirr = LD_MAC_REG(MAC_MIRR(mcp, bk)); in mc_board_add()
2757 MC_LOG("Mirror -> /LSB%d/B%d\n", mcp->mc_board_num, in mc_board_add()
2766 ST_MAC_REG(MAC_MIRR(mcp, bk), 0); in mc_board_add()
2774 !(mcp->mc_bank[bk^1].mcb_status & BANK_PTRL_RUNNING)) { in mc_board_add()
2775 MC_LOG("Starting up /LSB%d/B%d\n", mcp->mc_board_num, in mc_board_add()
2777 get_ptrl_start_address(mcp, bk, &rsaddr.mi_restartaddr); in mc_board_add()
2780 (void) restart_patrol(mcp, bk, &rsaddr); in mc_board_add()
2783 mcp->mc_board_num, bk); in mc_board_add()
2790 ret = ndi_prop_update_int(DDI_DEV_T_NONE, mcp->mc_dip, "mirror-mode", in mc_board_add()
2796 mcp->mc_dimm_list = mc_get_dimm_list(mcp); in mc_board_add()
2801 mcp->mc_last_error = 0; in mc_board_add()
2804 mcp->mc_status |= MC_POLL_RUNNING; in mc_board_add()
2810 mc_board_del(mc_opl_t *mcp) in mc_board_del() argument
2818 mutex_enter(&mcp->mc_lock); in mc_board_del()
2819 if (mcp->mc_status & MC_MEMORYLESS) { in mc_board_del()
2820 mutex_exit(&mcp->mc_lock); in mc_board_del()
2821 mutex_destroy(&mcp->mc_lock); in mc_board_del()
2825 if (mcp->mc_bank[i].mcb_status & BANK_INSTALLED) { in mc_board_del()
2826 mcp->mc_bank[i].mcb_status &= ~BANK_INSTALLED; in mc_board_del()
2831 mcp->mc_status &= ~MC_POLL_RUNNING; in mc_board_del()
2835 while ((p = mcp->mc_scf_log[i]) != NULL) { in mc_board_del()
2836 mcp->mc_scf_log[i] = p->sl_next; in mc_board_del()
2837 mcp->mc_scf_total[i]--; in mc_board_del()
2842 if (mcp->mlist) in mc_board_del()
2843 mc_memlist_delete(mcp->mlist); in mc_board_del()
2845 if (mcp->mc_dimm_list) in mc_board_del()
2846 mc_free_dimm_list(mcp->mc_dimm_list); in mc_board_del()
2848 mutex_exit(&mcp->mc_lock); in mc_board_del()
2850 mutex_destroy(&mcp->mc_lock); in mc_board_del()
2855 mc_suspend(mc_opl_t *mcp, uint32_t flag) in mc_suspend() argument
2858 mutex_enter(&mcp->mc_lock); in mc_suspend()
2859 if (mcp->mc_status & MC_MEMORYLESS) { in mc_suspend()
2860 mutex_exit(&mcp->mc_lock); in mc_suspend()
2864 mcp->mc_status &= ~MC_POLL_RUNNING; in mc_suspend()
2866 mcp->mc_status |= flag; in mc_suspend()
2867 mutex_exit(&mcp->mc_lock); in mc_suspend()
2876 mc_opl_t *mcp; in opl_mc_update_mlist() local
2887 if ((mcp = mc_instances[i]) == NULL) in opl_mc_update_mlist()
2889 mutex_enter(&mcp->mc_lock); in opl_mc_update_mlist()
2890 if (mcp->mlist) in opl_mc_update_mlist()
2891 mc_memlist_delete(mcp->mlist); in opl_mc_update_mlist()
2892 mcp->mlist = NULL; in opl_mc_update_mlist()
2893 mc_get_mlist(mcp); in opl_mc_update_mlist()
2894 mutex_exit(&mcp->mc_lock); in opl_mc_update_mlist()
2902 mc_resume(mc_opl_t *mcp, uint32_t flag) in mc_resume() argument
2907 mutex_enter(&mcp->mc_lock); in mc_resume()
2908 if (mcp->mc_status & MC_MEMORYLESS) { in mc_resume()
2909 mutex_exit(&mcp->mc_lock); in mc_resume()
2912 basepa = mcp->mc_start_address; in mc_resume()
2913 if (get_base_address(mcp) == DDI_FAILURE) { in mc_resume()
2914 mutex_exit(&mcp->mc_lock); in mc_resume()
2918 if (basepa != mcp->mc_start_address) { in mc_resume()
2919 if (mcp->mlist) in mc_resume()
2920 mc_memlist_delete(mcp->mlist); in mc_resume()
2921 mcp->mlist = NULL; in mc_resume()
2922 mc_get_mlist(mcp); in mc_resume()
2925 mcp->mc_status &= ~flag; in mc_resume()
2927 if (mcp->mc_status & (MC_SOFT_SUSPENDED | MC_DRIVER_SUSPENDED)) { in mc_resume()
2928 mutex_exit(&mcp->mc_lock); in mc_resume()
2932 if (!(mcp->mc_status & MC_POLL_RUNNING)) { in mc_resume()
2934 mcp->mc_status |= MC_POLL_RUNNING; in mc_resume()
2936 if (mcp->mc_bank[i].mcb_status & BANK_INSTALLED) { in mc_resume()
2937 mc_check_errors_func(mcp); in mc_resume()
2941 mutex_exit(&mcp->mc_lock); in mc_resume()
2949 mc_opl_t *mcp; in mc_pa_to_mcp() local
2954 if ((mcp = mc_instances[i]) == NULL) in mc_pa_to_mcp()
2957 if (!(mcp->mc_status & MC_POLL_RUNNING) || in mc_pa_to_mcp()
2958 (mcp->mc_status & MC_SOFT_SUSPENDED)) in mc_pa_to_mcp()
2960 if (mc_rangecheck_pa(mcp, pa)) { in mc_pa_to_mcp()
2961 return (mcp); in mc_pa_to_mcp()
2992 mc_opl_t *mcp; in mc_get_mem_unum() local
2997 if (((mcp = mc_pa_to_mcp(flt_addr)) == NULL) || in mc_get_mem_unum()
2998 (!pa_is_valid(mcp, flt_addr))) { in mc_get_mem_unum()
3009 bank = pa_to_bank(mcp, flt_addr - mcp->mc_start_address); in mc_get_mem_unum()
3010 sb = mcp->mc_phys_board_num; in mc_get_mem_unum()
3011 cs = pa_to_cs(mcp, flt_addr - mcp->mc_start_address); in mc_get_mem_unum()
3059 mc_opl_t *mcp; in opl_mc_suspend() local
3064 if ((mcp = mc_instances[i]) == NULL) in opl_mc_suspend()
3066 (void) mc_suspend(mcp, MC_SOFT_SUSPENDED); in opl_mc_suspend()
3076 mc_opl_t *mcp; in opl_mc_resume() local
3081 if ((mcp = mc_instances[i]) == NULL) in opl_mc_resume()
3083 (void) mc_resume(mcp, MC_SOFT_SUSPENDED); in opl_mc_resume()
3090 insert_mcp(mc_opl_t *mcp) in insert_mcp() argument
3093 if (mc_instances[mcp->mc_board_num] != NULL) { in insert_mcp()
3095 mcp->mc_board_num); in insert_mcp()
3097 mc_instances[mcp->mc_board_num] = mcp; in insert_mcp()
3102 delete_mcp(mc_opl_t *mcp) in delete_mcp() argument
3105 mc_instances[mcp->mc_board_num] = 0; in delete_mcp()
3132 mc_opl_t *mcp; in mc_inject_error() local
3146 if ((mcp = mc_pa_to_mcp(pa)) == NULL) { in mc_inject_error()
3152 mutex_enter(&mcp->mc_lock); in mc_inject_error()
3155 if (mcp->mc_status & (MC_SOFT_SUSPENDED | MC_DRIVER_SUSPENDED)) { in mc_inject_error()
3156 mutex_exit(&mcp->mc_lock); in mc_inject_error()
3162 MC_LOG("pa %lx, offset %lx\n", pa, pa - mcp->mc_start_address); in mc_inject_error()
3164 if (!pa_is_valid(mcp, pa)) { in mc_inject_error()
3165 mutex_exit(&mcp->mc_lock); in mc_inject_error()
3169 pa0 = pa - mcp->mc_start_address; in mc_inject_error()
3171 bank = pa_to_bank(mcp, pa0); in mc_inject_error()
3176 if (MC_INJECT_MIRROR(error_type) && !IS_MIRROR(mcp, bank)) { in mc_inject_error()
3177 mutex_exit(&mcp->mc_lock); in mc_inject_error()
3182 dimm_addr = pa_to_dimm(mcp, pa0); in mc_inject_error()
3184 MC_LOG("injecting error to /LSB%d/B%d/%x\n", mcp->mc_board_num, bank, in mc_inject_error()
3196 ST_MAC_REG(MAC_EG_CNTL(mcp, bank), 0); in mc_inject_error()
3198 ST_MAC_REG(MAC_EG_ADD(mcp, bank), dimm_addr & MAC_EG_ADD_MASK); in mc_inject_error()
3201 ST_MAC_REG(MAC_EG_CNTL(mcp, bank^1), 0); in mc_inject_error()
3202 ST_MAC_REG(MAC_EG_ADD(mcp, bank^1), dimm_addr & in mc_inject_error()
3249 ST_MAC_REG(MAC_MIRR(mcp, bank), MAC_MIRR_BANK_EXCLUSIVE); in mc_inject_error()
3253 ST_MAC_REG(MAC_MIRR(mcp, bank), 0); in mc_inject_error()
3266 ST_MAC_REG(MAC_EG_CNTL(mcp, bank), cntl & MAC_EG_SETUP_MASK); in mc_inject_error()
3267 ST_MAC_REG(MAC_EG_CNTL(mcp, bank), cntl); in mc_inject_error()
3270 ST_MAC_REG(MAC_EG_CNTL(mcp, bank^1), cntl & in mc_inject_error()
3272 ST_MAC_REG(MAC_EG_CNTL(mcp, bank^1), cntl); in mc_inject_error()
3340 ST_MAC_REG(MAC_EG_CNTL(mcp, bank), in mc_inject_error()
3342 ST_MAC_REG(MAC_EG_CNTL(mcp, bank), cntl); in mc_inject_error()
3345 ST_MAC_REG(MAC_EG_CNTL(mcp, bank^1), cntl & in mc_inject_error()
3347 ST_MAC_REG(MAC_EG_CNTL(mcp, bank^1), cntl); in mc_inject_error()
3358 rsaddr.mi_restartaddr.ma_bd = mcp->mc_board_num; in mc_inject_error()
3363 (void) restart_patrol(mcp, bank, &rsaddr); in mc_inject_error()
3368 int ebank = (IS_MIRROR(mcp, bank)) ? MIRROR_IDX(bank) : bank; in mc_inject_error()
3371 stat = LD_MAC_REG(MAC_PTRL_STAT(mcp, bank)); in mc_inject_error()
3372 cntl = LD_MAC_REG(MAC_PTRL_CNTL(mcp, bank)); in mc_inject_error()
3381 mcp->mc_speedup_period[ebank] = 0; in mc_inject_error()
3384 if (IS_MIRROR(mcp, bank)) { in mc_inject_error()
3385 mc_error_handler_mir(mcp, bank, &rsaddr); in mc_inject_error()
3387 mc_error_handler(mcp, bank, &rsaddr); in mc_inject_error()
3390 (void) restart_patrol(mcp, bank, &rsaddr); in mc_inject_error()
3397 mcp->mc_speedup_period[ebank] = 2; in mc_inject_error()
3398 MAC_CMD(mcp, bank, 0); in mc_inject_error()
3399 (void) restart_patrol(mcp, bank, NULL); in mc_inject_error()
3403 mutex_exit(&mcp->mc_lock); in mc_inject_error()
3511 mc_get_mem_sid_dimm(mc_opl_t *mcp, char *dname, char *buf, in mc_get_mem_sid_dimm() argument
3517 if ((d = mcp->mc_dimm_list) == NULL) { in mc_get_mem_sid_dimm()
3545 mc_set_mem_sid(mc_opl_t *mcp, char *buf, int buflen, int sb, in mc_set_mem_sid() argument
3568 if ((ret = mc_get_mem_sid_dimm(mcp, dimmnm, buf, buflen, in mc_set_mem_sid()
3589 mc_opl_t *mcp; in mc_get_mem_sid() local
3610 if ((mcp = mc_instances[i]) == NULL) in mc_get_mem_sid()
3612 mutex_enter(&mcp->mc_lock); in mc_get_mem_sid()
3613 if (mcp->mc_phys_board_num != board) { in mc_get_mem_sid()
3614 mutex_exit(&mcp->mc_lock); in mc_get_mem_sid()
3617 ret = mc_get_mem_sid_dimm(mcp, dname, buf, buflen, lenp); in mc_get_mem_sid()
3619 mutex_exit(&mcp->mc_lock); in mc_get_mem_sid()
3622 mutex_exit(&mcp->mc_lock); in mc_get_mem_sid()
3637 mc_opl_t *mcp; in mc_get_mem_offset() local
3641 if ((mcp = mc_instances[i]) == NULL) in mc_get_mem_offset()
3643 mutex_enter(&mcp->mc_lock); in mc_get_mem_offset()
3644 if (!pa_is_valid(mcp, paddr)) { in mc_get_mem_offset()
3645 mutex_exit(&mcp->mc_lock); in mc_get_mem_offset()
3648 if (pa_to_maddr(mcp, paddr, &maddr) == 0) { in mc_get_mem_offset()
3652 mutex_exit(&mcp->mc_lock); in mc_get_mem_offset()
3711 mc_opl_t *mcp; in mc_get_mem_addr() local
3729 if ((mcp = mc_instances[i]) == NULL) in mc_get_mem_addr()
3731 mutex_enter(&mcp->mc_lock); in mc_get_mem_addr()
3732 if (mcp->mc_phys_board_num != board) { in mc_get_mem_addr()
3733 mutex_exit(&mcp->mc_lock); in mc_get_mem_addr()
3743 maddr.ma_bd = mcp->mc_board_num; in mc_get_mem_addr()
3746 ret = mcaddr_to_pa(mcp, &maddr, paddr); in mc_get_mem_addr()
3751 mutex_exit(&mcp->mc_lock); in mc_get_mem_addr()
3754 mutex_exit(&mcp->mc_lock); in mc_get_mem_addr()
3757 mutex_exit(&mcp->mc_lock); in mc_get_mem_addr()
3781 mc_get_dimm_list(mc_opl_t *mcp) in mc_get_dimm_list() argument
3795 ret = scf_get_dimminfo(mcp->mc_board_num, (void *)bd_dimmp, &bufsz); in mc_get_dimm_list()
3882 mc_opl_t *mcp; in mc_scf_log_event() local
3937 if ((mcp = mc_pa_to_mcp(pa)) == NULL) { in mc_scf_log_event()
3945 unum, mcp->mc_board_num, bank, flt_pag->err_add, pa, in mc_scf_log_event()
3948 mutex_enter(&mcp->mc_lock); in mc_scf_log_event()
3950 if (!pa_is_valid(mcp, pa)) { in mc_scf_log_event()
3951 mutex_exit(&mcp->mc_lock); in mc_scf_log_event()
3959 mc_queue_scf_log(mcp, &flt_stat, bank); in mc_scf_log_event()
3961 mutex_exit(&mcp->mc_lock); in mc_scf_log_event()