Lines Matching +full:powered +full:- +full:while +full:- +full:suspended
32 * kernel-resident power management code. Implements power management
37 * PM - (device) Power Management
48 * They are recognized by the pm code by the lack of a pm-components property
54 * After setting component 0 from 0 to a non-zero power level, a call must be
60 * For non-bc devices, the driver describes the components by exporting a
61 * pm-components(9P) property that tells how many components there are,
64 * Devices which export pm-components(9P) are automatically power managed
81 * -implement PM policy as described in power.conf(5)
84 * -set threshold values (defaults if none provided by pmconfig)
85 * -set dependencies among devices
86 * -enable/disable autopm
87 * -enable/disable cpupm
88 * -turn down idle components based on thresholds (if autopm or cpupm is
90 * -maintain power states based on dependencies among devices
91 * -upon request, or when the frame buffer powers off, attempt to turn off
94 * -prevent powering off of a device which exported the
95 * pm-no-involuntary-power-cycles property without active involvement of
98 * -provide a mechanism for a device driver to request that a device's component
100 * -allow a process to directly control the power levels of device components
101 * (via ioctls issued to /dev/pm--see usr/src/uts/common/io/pm.c)
102 * -ensure that the console frame buffer is powered up before being referenced
104 * -maintain implicit dependencies (e.g. parent must be powered up if child is)
105 * -provide "backwards compatible" behavior for devices without pm-components
130 * has any component that is at a non-zero power level, all components of the
132 * asynchronous. When the keeping device is powered up, a request is queued
152 #include <sys/pathname.h> /* name -> dev_info xlation */
199 * pm_clone_lock -> pm_pscc_interest_rwlock,
200 * pm_clone_lock -> pm_pscc_direct_rwlock.
207 * pm_rsvp_lock -> pm_pscc_interest_rwlock,
208 * pm_rsvp_lock -> pm_pscc_direct_rwlock,
209 * pm_rsvp_lock -> pm_clone_lock.
213 * ppm_lock -> ppm driver unit_lock
219 * pm_compcnt_lock -> ppm_lock.
230 * pm_remdrv_lock -> pm_noinvol_rwlock.
236 * No other locks are taken while holding this lock.
245 * No other locks are taken while holding this lock.
253 * pm_thresh_rwlock -> devi_pm_lock
257 * No other PM locks are taken while holding pm_noinvol_rwlock.
263 * pm_pscc_direct_rwlock -> psce_lock
269 * pm_pscc_interest_rwlock -> psce_lock
271 * per-dip locks:
273 * Each node has these per-dip locks, which are only used if the device is
281 * devi_pm_lock -> pm_rsvp_lock,
282 * devi_pm_lock -> pm_dep_thread_lock,
283 * devi_pm_lock -> pm_noinvol_rwlock,
284 * devi_pm_lock -> power lock
291 * the power level of another, this lock allows re-entrancy by
300 * up or after a CPR operation. It is per-dip to keep from
301 * single-threading all the disk drivers on a system.
304 * No other PM locks are taken while holding this lock.
318 clock_t pm_id_ticks = 5; /* ticks to wait before scan during idle-down */
371 * If this variable is non-zero, cpr should return "not supported" when
379 * variable is non-zero, cpr should proceed even in the absence
393 * This flag is true while processes are stopped for a checkpoint/resume.
436 * List of devices that exported no-involuntary-power-cycles property
513 (DEVI(dip)->devi_pm_flags & (PMC_DEV_THRESH|PMC_COMP_THRESH))) {\
517 PMD(PMD_LEVEL, ("%s: %s@%s(%s#%d) incr notlowest->%d\n",\
525 (DEVI(dip)->devi_pm_flags & (PMC_DEV_THRESH|PMC_COMP_THRESH))) {\
527 pm_comps_notlowest--; \
537 * console frame-buffer power-management is not enabled when
539 * to non-zero.
543 int pm_cfb_enabled = 1; /* non-zero allows pm of console frame buffer */
545 int pm_cfb_override = 1; /* non-zero allows pm of cfb with debuggers */
547 int pm_cfb_override = 0; /* non-zero allows pm of cfb with debuggers */
633 * idleness can be re-calculated. That's to avoid devices from in pm_cpr_callb()
634 * being powered down right after resume if the system was in in pm_cpr_callb()
635 * suspended mode long enough. in pm_cpr_callb()
642 * If there is any auto-pm device, get the scanning in pm_cpr_callb()
676 * and be single-threaded with respect to driver attach/detach
718 * pm_scan_init - create pm scan data structure. Called (if autopm or cpupm
737 DEVI(dip)->devi_pm_scan = scanp; in pm_scan_init()
738 } else if (scanp->ps_scan_flags & PM_SCAN_STOP) { in pm_scan_init()
741 scanp->ps_scan_flags &= ~PM_SCAN_STOP; in pm_scan_init()
747 * pm_scan_fini - remove pm scan data structure when stopping pm on the device
764 ASSERT(!scanp->ps_scan_id && !(scanp->ps_scan_flags & in pm_scan_fini()
768 DEVI(dip)->devi_pm_scan = NULL; in pm_scan_fini()
781 if (cp->pmc_cur_pwr == PM_LEVEL_UNKNOWN) in cur_power()
782 return (cp->pmc_cur_pwr); in cur_power()
784 return (cp->pmc_comp.pmc_lvals[cp->pmc_cur_pwr]); in cur_power()
835 int *ip = cp->pmc_comp.pmc_lvals; in e_pm_valid_power()
836 int limit = cp->pmc_comp.pmc_numlevels; in e_pm_valid_power()
846 ip = cp->pmc_comp.pmc_lvals; in e_pm_valid_power()
930 PMD(PMD_DIN | PMD_FAIL, ("%s: %s@%s(%s#%d) [%d] %s->%d failed, " in dev_is_needed()
964 (scanp->ps_scan_flags & PM_SCAN_STOP)) { in pm_rescan()
968 if (scanp->ps_scan_flags & PM_SCANNING) { in pm_rescan()
969 scanp->ps_scan_flags |= PM_SCAN_AGAIN; in pm_rescan()
972 } else if (scanp->ps_scan_id) { in pm_rescan()
973 scanid = scanp->ps_scan_id; in pm_rescan()
974 scanp->ps_scan_id = 0; in pm_rescan()
984 * attach might soon fail and dip dissolved, and panic may happen while in pm_rescan()
994 * but it may get re-started during the post_detach processing if the in pm_rescan()
998 (scanp->ps_scan_flags & PM_SCAN_DISPATCHED) || in pm_rescan()
1003 if (scanp->ps_scan_id) { in pm_rescan()
1004 scanid = scanp->ps_scan_id; in pm_rescan()
1005 scanp->ps_scan_id = 0; in pm_rescan()
1009 if (scanp->ps_scan_id) { in pm_rescan()
1013 (ulong_t)scanp->ps_scan_id)) in pm_rescan()
1018 scanp->ps_scan_id = timeout(pm_rescan, (void *)dip, in pm_rescan()
1019 (scanp->ps_idle_down ? pm_id_ticks : in pm_rescan()
1023 (ulong_t)scanp->ps_scan_id)) in pm_rescan()
1027 scanp->ps_scan_flags |= PM_SCAN_DISPATCHED; in pm_rescan()
1047 (scanp->ps_scan_flags & PM_SCAN_STOP)) { in pm_scan()
1048 scanp->ps_scan_flags &= ~(PM_SCAN_AGAIN | PM_SCAN_DISPATCHED); in pm_scan()
1053 if (scanp->ps_idle_down) { in pm_scan()
1058 PMID_SET_SCANS(scanp->ps_idle_down) in pm_scan()
1060 "(pmid %x)\n", pmf, PM_DEVICE(dip), scanp->ps_idle_down)) in pm_scan()
1064 if (scanp->ps_scan_flags & PM_SCANNING) { in pm_scan()
1065 scanp->ps_scan_flags |= PM_SCAN_AGAIN; in pm_scan()
1068 scanp->ps_scan_flags &= ~PM_SCAN_DISPATCHED; in pm_scan()
1073 scanp->ps_scan_flags |= PM_SCANNING; in pm_scan()
1074 scanp->ps_scan_flags &= ~PM_SCAN_DISPATCHED; in pm_scan()
1076 scanp->ps_scan_flags &= ~PM_SCAN_AGAIN; in pm_scan()
1080 } while (scanp->ps_scan_flags & PM_SCAN_AGAIN); in pm_scan()
1082 ASSERT(scanp->ps_scan_flags & PM_SCANNING); in pm_scan()
1083 scanp->ps_scan_flags &= ~PM_SCANNING; in pm_scan()
1085 if (scanp->ps_idle_down) { in pm_scan()
1086 scanp->ps_idle_down &= ~PMID_SCANS; in pm_scan()
1088 "(pmid %x)\n", pmf, PM_DEVICE(dip), scanp->ps_idle_down)) in pm_scan()
1094 nextscan = (LONG_MAX - 1) / hz; in pm_scan()
1095 if (scanp->ps_scan_id) { in pm_scan()
1096 PMD(PMD_SCAN, ("%s: %s@%s(%s#%d): while scanning " in pm_scan()
1098 PM_DEVICE(dip), (ulong_t)scanp->ps_scan_id)) in pm_scan()
1101 } else if (!(scanp->ps_scan_flags & PM_SCAN_STOP)) { in pm_scan()
1102 scanp->ps_scan_id = timeout(pm_rescan, (void *)dip, in pm_scan()
1106 (ulong_t)nextscan, (ulong_t)scanp->ps_scan_id)) in pm_scan()
1121 valuep[i] = PM_CP(dip, i)->pmc_timestamp; in pm_get_timestamps()
1128 * "no-involuntary-power-cycles" property or we're pretending it did (console
1130 * free cycle" allowed when all such leaf nodes have voluntarily powered down
1149 if (DEVI(dip)->devi_pm_noinvolpm == 0) { in pm_noinvol()
1151 if (DEVI(dip)->devi_pm_volpmd != 0) { in pm_noinvol()
1156 DEVI(pdip)->devi_pm_noinvolpm, in pm_noinvol()
1157 DEVI(pdip)->devi_pm_volpmd)) in pm_noinvol()
1159 } while (pdip); in pm_noinvol()
1162 ASSERT(DEVI(dip)->devi_pm_volpmd == 0); in pm_noinvol()
1173 if (DEVI(dip)->devi_pm_noinvolpm != DEVI(dip)->devi_pm_volpmd) in pm_noinvol()
1175 DEVI(dip)->devi_pm_noinvolpm, DEVI(dip)->devi_pm_volpmd, in pm_noinvol()
1178 return (DEVI(dip)->devi_pm_noinvolpm != DEVI(dip)->devi_pm_volpmd); in pm_noinvol()
1227 (scanp->ps_scan_flags & PM_SCAN_STOP) || in pm_scan_dev()
1262 pwrndx = cp->pmc_cur_pwr; in pm_scan_dev()
1266 cp->pmc_comp.pmc_lvals[pwrndx]; in pm_scan_dev()
1277 if ((timestamp[i] == 0) || (cp->pmc_busycount > 0)) { in pm_scan_dev()
1287 idletime = now - timestamp[i]; /* idle time */ in pm_scan_dev()
1292 PMD(PMD_SCAN, ("%s: %s@%s(%s#%d) comp %d, %d->%d\n", in pm_scan_dev()
1298 "%d->%d Failed\n", pmf, PM_DEVICE(dip), in pm_scan_dev()
1304 "%d->%d, GOOD curpwr %d\n", pmf, in pm_scan_dev()
1326 timeleft = thresh - idletime; in pm_scan_dev()
1328 timeleft = min(timeleft, (thresh - idletime)); in pm_scan_dev()
1345 * pm_scan_stop - cancel scheduled pm_rescan,
1365 scanp->ps_scan_flags |= PM_SCAN_STOP; in pm_scan_stop()
1368 while (scanp->ps_scan_id) { in pm_scan_stop()
1369 scanid = scanp->ps_scan_id; in pm_scan_stop()
1370 scanp->ps_scan_id = 0; in pm_scan_stop()
1376 while (scanp->ps_scan_flags & (PM_SCANNING | PM_SCAN_DISPATCHED)) { in pm_scan_stop()
1408 limit = cp->pmc_comp.pmc_numlevels; in power_val_to_index()
1409 ip = cp->pmc_comp.pmc_lvals; in power_val_to_index()
1413 return (-1); in power_val_to_index()
1428 (index = power_val_to_index(cp, val)) == -1) in power_val_to_string()
1431 return (cp->pmc_comp.pmc_lnames[index]); in power_val_to_string()
1456 DEVI(dip)->devi_pm_volpmd = 0; in pm_clear_volpm_dip()
1480 for (ip = pm_noinvol_head; ip; ip = ip->ni_next) { in pm_clear_volpm_list()
1482 ip->ni_path)) in pm_clear_volpm_list()
1483 if (strncmp(pathbuf, ip->ni_path, len) == 0 && in pm_clear_volpm_list()
1484 ip->ni_path[len] == '/') { in pm_clear_volpm_list()
1486 ip->ni_path)) in pm_clear_volpm_list()
1487 ip->ni_volpmd = 0; in pm_clear_volpm_list()
1488 ip->ni_wasvolpmd = 0; in pm_clear_volpm_list()
1508 int suspended = 0; in power_dev() local
1532 DEVI(dip)->devi_pm_flags |= PMC_SUSPENDED; in power_dev()
1533 suspended++; in power_dev()
1552 PMD(PMD_PPM, ("%s: %s@%s(%s#%d):%s[%d] %s (%d) -> %s (%d) via %s@%s\n", in power_dev()
1553 pmf, PM_DEVICE(dip), cp->pmc_comp.pmc_name, comp, in power_dev()
1558 * If non-bc noinvolpm device is turning first comp on, or noinvolpm in power_dev()
1562 if (DEVI(dip)->devi_pm_volpmd && in power_dev()
1576 int volpmd = DEVI(dip)->devi_pm_volpmd; in power_dev()
1587 "to level %d (%s)\n", pmf, comp, cp->pmc_comp.pmc_name, in power_dev()
1591 * If some other devices were also powered up (e.g. other cpus in in power_dev()
1601 * -This is comp 0 and we have successfully powered it up in power_dev()
1602 * -This is comp 0 and we have failed to power it down. Resume is in power_dev()
1603 * needed because we have suspended it above in power_dev()
1611 * It must be either suspended or resumed in power_dev()
1614 ASSERT((DEVI(dip)->devi_pm_flags & in power_dev()
1616 (PM_CP(dip, comp)->pmc_flags & in power_dev()
1619 resume_needed = suspended; in power_dev()
1624 * It must be either suspended or resumed in power_dev()
1627 ASSERT((DEVI(dip)->devi_pm_flags & in power_dev()
1629 (PM_CP(dip, comp)->pmc_flags & in power_dev()
1632 resume_needed = suspended; in power_dev()
1637 ASSERT(DEVI(dip)->devi_pm_flags & PMC_SUSPENDED); in power_dev()
1641 DEVI(dip)->devi_pm_flags &= ~PMC_SUSPENDED; in power_dev()
1667 for (cur = lock_loan_head.pmlk_next; cur; cur = cur->pmlk_next) in pm_devi_lock_held()
1668 if (cur->pmlk_borrower == curthread) in pm_devi_lock_held()
1672 return (cur != NULL && cur->pmlk_lender == DEVI(dip)->devi_busy_thread); in pm_devi_lock_held()
1756 pm_divertdebug--; in pm_set_power()
1792 while (pn_pathleft(&pn)) { in pm_name_to_dip()
1814 /* loop with active ndi_devi_hold of child->parent */ in pm_name_to_dip()
1837 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_unsatisfy()
1838 if (!dp->pdr_isprop) { in pm_unsatisfy()
1839 if (strcmp(dp->pdr_keeper, keeper) == 0 && in pm_unsatisfy()
1840 (dp->pdr_kept_count > 0) && in pm_unsatisfy()
1841 strcmp(dp->pdr_kept_paths[0], kept) == 0) { in pm_unsatisfy()
1842 if (dp->pdr_satisfied) { in pm_unsatisfy()
1843 dp->pdr_satisfied = 0; in pm_unsatisfy()
1892 cp = &DEVI(dip)->devi_pm_components[j]; in pm_unkeeps()
1900 DEVI(kept)->devi_pm_flags in pm_unkeeps()
1907 DEVI(kept)->devi_pm_flags in pm_unkeeps()
1949 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_free_keeper()
1950 if (strcmp(dp->pdr_keeper, path) != 0) in pm_free_keeper()
1956 pm_unkeeps(dp->pdr_kept_count, path, dp->pdr_kept_paths, pwr); in pm_free_keeper()
1957 if (dp->pdr_kept_count) { in pm_free_keeper()
1958 for (i = 0; i < dp->pdr_kept_count; i++) { in pm_free_keeper()
1959 length = strlen(dp->pdr_kept_paths[i]); in pm_free_keeper()
1960 kmem_free(dp->pdr_kept_paths[i], length + 1); in pm_free_keeper()
1962 kmem_free(dp->pdr_kept_paths, in pm_free_keeper()
1963 dp->pdr_kept_count * sizeof (char **)); in pm_free_keeper()
1964 dp->pdr_kept_paths = NULL; in pm_free_keeper()
1965 dp->pdr_kept_count = 0; in pm_free_keeper()
1984 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_free_kept()
1985 if (dp->pdr_kept_count == 0) in pm_free_kept()
1987 count = dp->pdr_kept_count; in pm_free_kept()
1990 if (strcmp(dp->pdr_kept_paths[i], path) == 0) { in pm_free_kept()
1991 pm_unkepts(path, dp->pdr_keeper); in pm_free_kept()
1992 length = strlen(dp->pdr_kept_paths[i]) + 1; in pm_free_kept()
1993 kmem_free(dp->pdr_kept_paths[i], length); in pm_free_kept()
1994 dp->pdr_kept_paths[i] = NULL; in pm_free_kept()
1995 dp->pdr_kept_count--; in pm_free_kept()
1999 if (dp->pdr_kept_count) { in pm_free_kept()
2000 length = dp->pdr_kept_count * sizeof (char **); in pm_free_kept()
2004 if (dp->pdr_kept_paths[i] != NULL) { in pm_free_kept()
2005 paths[j] = dp->pdr_kept_paths[i]; in pm_free_kept()
2009 ASSERT(j == dp->pdr_kept_count); in pm_free_kept()
2012 kmem_free(dp->pdr_kept_paths, count * sizeof (char **)); in pm_free_kept()
2013 dp->pdr_kept_paths = paths; in pm_free_kept()
2056 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_is_kept()
2057 if (dp->pdr_kept_count == 0) in pm_is_kept()
2059 for (i = 0; i < dp->pdr_kept_count; i++) { in pm_is_kept()
2060 if (strcmp(dp->pdr_kept_paths[i], path) == 0) in pm_is_kept()
2078 PMD(PMD_KIDSUP, ("%s: kidsupcnt for %s@%s(%s#%d) %d->%d\n", pmf, in e_pm_hold_rele_power()
2091 kmutex_t ppm_lock; /* in case we ever do multi-threaded startup */
2101 * that either all components of power-managed devices are at their
2114 for (ppmcp = ppm_callbacks; ppmcp->ppmc_func; ppmcp++) in pm_ppm_notify_all_lowest()
2115 (void) pm_ctlops((dev_info_t *)ppmcp->ppmc_dip, dip, in pm_ppm_notify_all_lowest()
2127 srn_inuse--; in pm_ppm_notify_all_lowest()
2142 DEVI(dip)->devi_pm_info = value; in pm_set_pm_info()
2155 for (p = pm_blocked_list; p; p = p->pr_next) in pm_rsvp_lookup()
2156 if (p->pr_dip == dip && p->pr_comp == comp) { in pm_rsvp_lookup()
2181 for (p = pm_blocked_list; p; p = p->pr_next) { in pm_proceed()
2182 if (dip == p->pr_dip) { in pm_proceed()
2183 p->pr_retval = PMP_RELEASE; in pm_proceed()
2186 cv_signal(&p->pr_cv); in pm_proceed()
2193 * succeed and a non-matching request for the same device fail in pm_proceed()
2203 if (found->pr_newlevel <= newlevel) { in pm_proceed()
2204 found->pr_retval = PMP_SUCCEED; in pm_proceed()
2208 found->pr_retval = PMP_FAIL; in pm_proceed()
2212 cv_signal(&found->pr_cv); in pm_proceed()
2232 new_work->pdw_type = cmd; in pm_dispatch_to_dep_thread()
2233 new_work->pdw_wait = wait; in pm_dispatch_to_dep_thread()
2234 new_work->pdw_done = 0; in pm_dispatch_to_dep_thread()
2235 new_work->pdw_ret = 0; in pm_dispatch_to_dep_thread()
2236 new_work->pdw_pwr = cached_pwr; in pm_dispatch_to_dep_thread()
2237 cv_init(&new_work->pdw_cv, NULL, CV_DEFAULT, NULL); in pm_dispatch_to_dep_thread()
2239 new_work->pdw_keeper = kmem_zalloc(strlen(keeper) + 1, in pm_dispatch_to_dep_thread()
2241 (void) strcpy(new_work->pdw_keeper, keeper); in pm_dispatch_to_dep_thread()
2244 new_work->pdw_kept = kmem_zalloc(strlen(kept) + 1, KM_SLEEP); in pm_dispatch_to_dep_thread()
2245 (void) strcpy(new_work->pdw_kept, kept); in pm_dispatch_to_dep_thread()
2251 new_work->pdw_next = NULL; in pm_dispatch_to_dep_thread()
2253 pm_dep_thread_tail->pdw_next = new_work; in pm_dispatch_to_dep_thread()
2255 new_work->pdw_next = NULL; in pm_dispatch_to_dep_thread()
2260 while (!new_work->pdw_done) in pm_dispatch_to_dep_thread()
2261 cv_wait(&new_work->pdw_cv, &pm_dep_thread_lock); in pm_dispatch_to_dep_thread()
2266 *res = new_work->pdw_ret; in pm_dispatch_to_dep_thread()
2271 if (new_work->pdw_keeper) in pm_dispatch_to_dep_thread()
2272 kmem_free(new_work->pdw_keeper, in pm_dispatch_to_dep_thread()
2273 strlen(new_work->pdw_keeper) + 1); in pm_dispatch_to_dep_thread()
2274 if (new_work->pdw_kept) in pm_dispatch_to_dep_thread()
2275 kmem_free(new_work->pdw_kept, in pm_dispatch_to_dep_thread()
2276 strlen(new_work->pdw_kept) + 1); in pm_dispatch_to_dep_thread()
2299 info->pmi_dev_pm_state &= ~PM_DIRECT; in pm_rem_info()
2300 ASSERT(info->pmi_clone); in pm_rem_info()
2301 info->pmi_clone = 0; in pm_rem_info()
2302 pm_proceed(dip, PMP_RELEASE, -1, -1); in pm_rem_info()
2325 e_pm_hold_rele_power(pdip, -count); in pm_rem_info()
2336 * not being power-managed anymore. in pm_rem_info()
2340 if (cp->pmc_cur_pwr != 0) in pm_rem_info()
2395 if (cp->pmc_timestamp) in pm_reset_timestamps()
2396 cp->pmc_timestamp = gethrestime_sec(); in pm_reset_timestamps()
2411 int limit = cp->pmc_comp.pmc_numlevels; in pm_level_to_index()
2412 int *ip = cp->pmc_comp.pmc_lvals; in pm_level_to_index()
2421 (int)(cp - DEVI(dip)->devi_pm_components), level)) in pm_level_to_index()
2437 int curpwr = (cp->pmc_flags & PM_PHC_WHILE_SET_POWER ? in e_pm_set_cur_pwr()
2438 cp->pmc_phc_pwr : cp->pmc_cur_pwr); in e_pm_set_cur_pwr()
2444 level == cp->pmc_comp.pmc_lvals[curpwr]) in e_pm_set_cur_pwr()
2453 } else if (level == cp->pmc_comp.pmc_lvals[0]) { in e_pm_set_cur_pwr()
2456 cp->pmc_phc_pwr = PM_LEVEL_UNKNOWN; in e_pm_set_cur_pwr()
2457 cp->pmc_cur_pwr = pm_level_to_index(dip, cp, level); in e_pm_set_cur_pwr()
2483 if ((ops->devo_rev < 2) || !(fn = ops->devo_power)) { in pm_power()
2485 (ops->devo_rev < 2 ? " wrong devo_rev" : ""), in pm_power()
2489 cp->pmc_flags |= PM_POWER_OP; in pm_power()
2491 cp->pmc_flags &= ~PM_POWER_OP; in pm_power()
2503 if (cp->pmc_flags & PM_PHC_WHILE_SET_POWER) { in pm_power()
2505 cp->pmc_comp.pmc_lvals[cp->pmc_cur_pwr]; in pm_power()
2514 "level=%d (%s)\n", pmf, comp, cp->pmc_comp.pmc_name, PM_DEVICE(dip), in pm_power()
2576 * specially, then this is a no-op in pm_lower_power()
2606 for (p = pm_pscc_direct; p; p = p->pscc_next) { in pm_psc_dip_to_direct()
2607 if (p->pscc_dip == dip) { in pm_psc_dip_to_direct()
2609 psce = p->pscc_entries; in pm_psc_dip_to_direct()
2610 mutex_enter(&psce->psce_lock); in pm_psc_dip_to_direct()
2626 * we create a record that has a size of -1, a physaddr of NULL, and that
2639 ASSERT(MUTEX_HELD(&psce->psce_lock)); in psc_entry()
2642 p = psce->psce_in; in psc_entry()
2649 p->flags |= PSC_EVENT_LOST; in psc_entry()
2650 size = (size_t)-1; in psc_entry()
2654 if (p->size) { /* overflow; mark the next entry */ in psc_entry()
2655 if (p->size != (size_t)-1) in psc_entry()
2656 kmem_free(p->physpath, p->size); in psc_entry()
2657 ASSERT(psce->psce_out == p); in psc_entry()
2658 if (p == psce->psce_last) { in psc_entry()
2659 psce->psce_first->flags |= PSC_EVENT_LOST; in psc_entry()
2660 psce->psce_out = psce->psce_first; in psc_entry()
2662 (p + 1)->flags |= PSC_EVENT_LOST; in psc_entry()
2663 psce->psce_out = (p + 1); in psc_entry()
2667 p->flags |= PSC_EVENT_LOST; in psc_entry()
2668 p->size = 0; in psc_entry()
2669 p->physpath = NULL; in psc_entry()
2674 p->flags |= PSC_ALL_LOWEST; in psc_entry()
2676 p->flags &= ~PSC_ALL_LOWEST; in psc_entry()
2679 p->event = event; in psc_entry()
2680 p->timestamp = gethrestime_sec(); in psc_entry()
2681 p->component = comp; in psc_entry()
2682 p->old_level = old; in psc_entry()
2683 p->new_level = new; in psc_entry()
2684 p->physpath = physpath; in psc_entry()
2685 p->size = size; in psc_entry()
2687 (void) strcpy(p->physpath, buf); in psc_entry()
2688 if (p == psce->psce_last) in psc_entry()
2689 psce->psce_in = psce->psce_first; in psc_entry()
2691 psce->psce_in = ++p; in psc_entry()
2692 mutex_exit(&psce->psce_lock); in psc_entry()
2709 pscc = (*cookiep)->pscc_next; in psc_interest()
2713 mutex_enter(&pscc->pscc_entries->psce_lock); in psc_interest()
2714 return (pscc->pscc_entries); in psc_interest()
2736 PMD(PMD_DPM, ("%s: PENDING %s@%s(%s#%d), comp %d, %d -> %d\n", in pm_enqueue_notify()
2741 "%d\n", pmf, PM_DEVICE(dip), pscc->pscc_clone, in pm_enqueue_notify()
2742 pm_poll_cnt[pscc->pscc_clone])) in pm_enqueue_notify()
2745 PMD(PMD_DPM, ("%s: sig %d\n", pmf, pscc->pscc_clone)) in pm_enqueue_notify()
2748 pm_poll_cnt[pscc->pscc_clone]++; in pm_enqueue_notify()
2749 cv_signal(&pm_clones_cv[pscc->pscc_clone]); in pm_enqueue_notify()
2754 PMD(PMD_DPM, ("%s: HAS %s@%s(%s#%d), comp %d, %d -> %d\n", in pm_enqueue_notify()
2759 "%d\n", pmf, PM_DEVICE(dip), pscc->pscc_clone, in pm_enqueue_notify()
2760 pm_poll_cnt[pscc->pscc_clone])) in pm_enqueue_notify()
2763 PMD(PMD_DPM, ("%s: sig %d\n", pmf, pscc->pscc_clone)) in pm_enqueue_notify()
2766 pm_poll_cnt[pscc->pscc_clone]++; in pm_enqueue_notify()
2767 cv_signal(&pm_clones_cv[pscc->pscc_clone]); in pm_enqueue_notify()
2773 while ((psce = psc_interest(&cookie, &pscc)) != NULL) { in pm_enqueue_notify()
2776 cv_signal(&pm_clones_cv[pscc->pscc_clone]); in pm_enqueue_notify()
2795 next = p->ppd_next; in pm_enqueue_notify_others()
2796 pm_enqueue_notify(PSC_HAS_CHANGED, p->ppd_who, in pm_enqueue_notify_others()
2797 p->ppd_cmpt, p->ppd_new_level, p->ppd_old_level, in pm_enqueue_notify_others()
2825 * 1 - If the thread owning the effective power lock (the first lock on
2829 * 0 - otherwise
2841 dev_info_t *ppm = (dev_info_t *)DEVI(dip)->devi_pm_ppm; in pm_blocked_by_us()
2858 owner->t_state == TS_SLEEP && in pm_blocked_by_us()
2859 owner->t_sobj_ops && in pm_blocked_by_us()
2860 SOBJ_TYPE(owner->t_sobj_ops) == SOBJ_MUTEX && in pm_blocked_by_us()
2861 (mp = (kmutex_t *)owner->t_wchan) && in pm_blocked_by_us()
2902 ASSERT(DEVI(dip)->devi_pm_flags & PMC_SUSPENDED); in pm_check_and_resume()
2909 DEVI(dip)->devi_pm_flags &= ~PMC_SUSPENDED; in pm_check_and_resume()
2969 while (!pm_try_parent_child_locks(pdip, dip)) { in pm_power_has_changed()
2971 (cp->pmc_flags & PM_POWER_OP)) { in pm_power_has_changed()
2988 cp->pmc_flags |= PM_PHC_WHILE_SET_POWER; in pm_power_has_changed()
2991 * while the set power path remains blocked. Keep the in pm_power_has_changed()
2995 if (cp->pmc_phc_pwr == PM_LEVEL_UNKNOWN) in pm_power_has_changed()
2996 cp->pmc_phc_pwr = cp->pmc_cur_pwr; in pm_power_has_changed()
2997 cp->pmc_cur_pwr = in pm_power_has_changed()
3031 /* non-deadlock case */ in pm_power_has_changed()
3054 * Return: the increment value for pm_cfb_comps_off (-1, 0, or 1)
3060 int on = (old == PM_LEVEL_UNKNOWN || old == cp->pmc_norm_pwr); in calc_cfb_comps_incr()
3061 int want_normal = (new == cp->pmc_norm_pwr); in calc_cfb_comps_incr()
3067 incr = -1; in calc_cfb_comps_incr()
3098 dev_info_t *ppm = (dev_info_t *)DEVI(dip)->devi_pm_ppm; in pm_phc_impl()
3104 old_level = (cp->pmc_flags & PM_PHC_WHILE_SET_POWER ? in pm_phc_impl()
3105 cp->pmc_phc_pwr : cp->pmc_cur_pwr); in pm_phc_impl()
3107 old_level = cp->pmc_comp.pmc_lvals[old_level]; in pm_phc_impl()
3135 PMD(PMD_CFB, ("%s: %s@%s(%s#%d) comp=%d %d->%d " in pm_phc_impl()
3136 "cfb_comps_off->%d\n", pmf, PM_DEVICE(dip), in pm_phc_impl()
3177 /* -1 also treated as 0 in this case */ in pm_phc_impl()
3212 * device node (by returning non-zero) if it wants to be involved in the
3232 if (ppmcp->ppmc_func == NULL) { in pm_register_ppm()
3233 ppmcp->ppmc_func = func; in pm_register_ppm()
3234 ppmcp->ppmc_dip = dip; in pm_register_ppm()
3242 while ((dip = ddi_get_parent(dip)) != NULL) { in pm_register_ppm()
3246 /* don't bother with the not power-manageable nodes */ in pm_register_ppm()
3252 p->old_level = PM_LEVEL_UNKNOWN; in pm_register_ppm()
3253 p->who = dip; in pm_register_ppm()
3257 pwr = cp->pmc_cur_pwr; in pm_register_ppm()
3259 p->cmpt = i; in pm_register_ppm()
3260 p->new_level = cur_power(cp); in pm_register_ppm()
3261 p->old_level = PM_LEVEL_UNKNOWN; in pm_register_ppm()
3292 for (ppmcp = ppm_callbacks; ppmcp->ppmc_func; ppmcp++) { in pm_ppm_claim()
3293 if ((*ppmcp->ppmc_func)(dip)) { in pm_ppm_claim()
3294 DEVI(dip)->devi_pm_ppm = in pm_ppm_claim()
3295 (struct dev_info *)ppmcp->ppmc_dip; in pm_ppm_claim()
3321 info->pmi_dev_pm_state |= PM_DETACHING; in pm_detaching()
3327 * console and old-style devices get brought up when detaching. in pm_detaching()
3334 while (cfb_inuse) { in pm_detaching()
3362 if (info->pmi_dev_pm_state & PM_DETACHING) { in pm_detach_failed()
3363 info->pmi_dev_pm_state &= ~PM_DETACHING; in pm_detach_failed()
3364 if (info->pmi_dev_pm_state & PM_ALLNORM_DEFERRED) { in pm_detach_failed()
3374 info->pmi_dev_pm_state &= ~PM_ALLNORM_DEFERRED; in pm_detach_failed()
3395 pmc = &cp->pmc_comp; in e_pm_default_levels()
3396 pmc->pmc_numlevels = 2; in e_pm_default_levels()
3397 pmc->pmc_lvals[0] = 0; in e_pm_default_levels()
3398 pmc->pmc_lvals[1] = norm; in e_pm_default_levels()
3406 pm_component_t *p = DEVI(dip)->devi_pm_components; in e_pm_default_components()
3408 p = DEVI(dip)->devi_pm_components; in e_pm_default_components()
3410 p->pmc_comp = bc_comp; /* struct assignment */ in e_pm_default_components()
3411 p->pmc_comp.pmc_lvals = kmem_zalloc(2 * sizeof (int), in e_pm_default_components()
3413 p->pmc_comp.pmc_thresh = kmem_alloc(2 * sizeof (int), in e_pm_default_components()
3415 p->pmc_comp.pmc_numlevels = 2; in e_pm_default_components()
3416 p->pmc_comp.pmc_thresh[0] = INT_MAX; in e_pm_default_components()
3417 p->pmc_comp.pmc_thresh[1] = INT_MAX; in e_pm_default_components()
3423 * for their creation by parsing the pm-components property.
3426 * done while attaching, and the device isn't visible until after it has
3435 pm_component_t *p = DEVI(dip)->devi_pm_components; in pm_premanage()
3442 if (DEVI(dip)->devi_pm_flags & PMC_COMPONENTS_DONE) in pm_premanage()
3444 if (DEVI(dip)->devi_pm_flags & PMC_COMPONENTS_FAILED) { in pm_premanage()
3448 * Look up pm-components property and create components accordingly in pm_premanage()
3456 DEVI(dip)->devi_pm_flags |= PMC_COMPONENTS_FAILED; in pm_premanage()
3460 * If they don't have the pm-components property, then we in pm_premanage()
3472 DEVI(dip)->devi_pm_flags |= PMC_BC; in pm_premanage()
3482 if (norm == (uint_t)-1) { in pm_premanage()
3502 p = DEVI(dip)->devi_pm_components; in pm_premanage()
3504 p->pmc_comp = *pcp++; /* struct assignment */ in pm_premanage()
3505 ASSERT(PM_CP(dip, i)->pmc_cur_pwr == 0); in pm_premanage()
3508 if (DEVI(dip)->devi_pm_flags & PMC_CPU_THRESH) in pm_premanage()
3587 * We only get components destroyed while no power management is
3595 return (PM_CP(dip, comp)->pmc_norm_pwr); in pm_get_normal_power()
3626 return (cp->pmc_comp.pmc_thresh[1]); in cur_threshold()
3628 pwr = cp->pmc_cur_pwr; in cur_threshold()
3631 if (DEVI(dip)->devi_pm_flags & PMC_NEXDEF_THRESH) in cur_threshold()
3633 else if (DEVI(dip)->devi_pm_flags & PMC_CPU_THRESH) in cur_threshold()
3639 ASSERT(cp->pmc_comp.pmc_thresh); in cur_threshold()
3640 return (cp->pmc_comp.pmc_thresh[pwr]); in cur_threshold()
3652 nxt_pwr = cp->pmc_comp.pmc_lvals[0]; in pm_next_lower_power()
3654 pwrndx--; in pm_next_lower_power()
3656 nxt_pwr = cp->pmc_comp.pmc_lvals[pwrndx]; in pm_next_lower_power()
3782 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in bring_wekeeps_up()
3783 if (strcmp(dp->pdr_keeper, keeper) != 0) in bring_wekeeps_up()
3785 for (i = 0; i < dp->pdr_kept_count; i++) { in bring_wekeeps_up()
3786 kept_path = dp->pdr_kept_paths[i]; in bring_wekeeps_up()
3802 if (wku_info->pmi_dev_pm_state & PM_DETACHING) { in bring_wekeeps_up()
3834 DEVI(kept_dip)->devi_pm_flags |= PMC_SKIP_BRINGUP; in bring_pmdep_up()
3837 /* if we got here the keeper had a transition from OFF->ON */ in bring_pmdep_up()
3850 static const int nameln = sizeof (namestr) - 1;
3851 static const char pmcompstr[] = "pm-components";
3869 compp->pmc_lnames_sz = size; \
3870 tp = compp->pmc_lname_buf = kmem_alloc(size, KM_SLEEP); \
3871 compp->pmc_numlevels = level; \
3872 compp->pmc_lnames = kmem_alloc(level * sizeof (char *), KM_SLEEP); \
3873 compp->pmc_lvals = kmem_alloc(level * sizeof (int), KM_SLEEP); \
3874 compp->pmc_thresh = kmem_alloc(level * sizeof (int), KM_SLEEP); \
3877 compp->pmc_thresh[j] = INT_MAX; /* only [0] sticks */ \
3878 compp->pmc_lvals[j] = lvals[j]; \
3880 compp->pmc_lnames[j] = tp; \
3883 ASSERT(tp > compp->pmc_lname_buf && tp <= \
3884 compp->pmc_lname_buf + compp->pmc_lnames_sz); \
3897 ASSERT(!DEVI(dip)->devi_pm_components); in e_pm_create_components()
3898 ASSERT(!(DEVI(dip)->devi_pm_flags & PMC_COMPONENTS_DONE)); in e_pm_create_components()
3903 DEVI(dip)->devi_pm_comp_size = size; in e_pm_create_components()
3904 DEVI(dip)->devi_pm_num_components = num_components; in e_pm_create_components()
3907 compp->pmc_timestamp = gethrestime_sec(); in e_pm_create_components()
3908 compp->pmc_norm_pwr = (uint_t)-1; in e_pm_create_components()
3912 DEVI(dip)->devi_pm_components = ocompp; in e_pm_create_components()
3913 DEVI(dip)->devi_pm_flags |= PMC_COMPONENTS_DONE; in e_pm_create_components()
3932 while (isxdigit(ch)) { in pm_parsenum()
3937 cp--; in pm_parsenum()
3944 while (isdigit(ch)) { in pm_parsenum()
3949 cp--; in pm_parsenum()
3959 offset = 'a' - 10; in pm_parsenum()
3961 offset = 'A' - 10; in pm_parsenum()
3965 value += *np - offset; in pm_parsenum()
3974 value += *np - offset; in pm_parsenum()
3986 PM_CP(dip, component_number)->pmc_norm_pwr = level; in e_pm_set_max_power()
3995 return (PM_CP(dip, component_number)->pmc_norm_pwr); in e_pm_get_max_power()
4011 cp = DEVI(dip)->devi_pm_components; in e_pm_destroy_components()
4014 int nlevels = cp->pmc_comp.pmc_numlevels; in e_pm_destroy_components()
4015 kmem_free(cp->pmc_comp.pmc_lvals, nlevels * sizeof (int)); in e_pm_destroy_components()
4016 kmem_free(cp->pmc_comp.pmc_thresh, nlevels * sizeof (int)); in e_pm_destroy_components()
4022 kmem_free(cp->pmc_comp.pmc_name, cp->pmc_comp.pmc_name_sz); in e_pm_destroy_components()
4023 kmem_free(cp->pmc_comp.pmc_lnames, nlevels * sizeof (char *)); in e_pm_destroy_components()
4024 kmem_free(cp->pmc_comp.pmc_lname_buf, in e_pm_destroy_components()
4025 cp->pmc_comp.pmc_lnames_sz); in e_pm_destroy_components()
4027 kmem_free(DEVI(dip)->devi_pm_components, DEVI(dip)->devi_pm_comp_size); in e_pm_destroy_components()
4028 DEVI(dip)->devi_pm_components = NULL; in e_pm_destroy_components()
4029 DEVI(dip)->devi_pm_num_components = 0; in e_pm_destroy_components()
4030 DEVI(dip)->devi_pm_flags &= in e_pm_destroy_components()
4035 * Read the pm-components property (if there is one) and use it to set up
4037 * pm-components found and successfully parsed, else returns NULL.
4099 np[npi++] = lvals[level - 1]; in pm_autoconfig()
4112 ptail->next = p; in pm_autoconfig()
4115 compp = p->comp = kmem_zalloc(sizeof (pm_comp_t), in pm_autoconfig()
4117 compp->pmc_name_sz = strlen(cp) + 1; in pm_autoconfig()
4118 compp->pmc_name = kmem_zalloc(compp->pmc_name_sz, in pm_autoconfig()
4120 (void) strncpy(compp->pmc_name, cp, compp->pmc_name_sz); in pm_autoconfig()
4146 np[npi++] = lvals[level - 1]; in pm_autoconfig()
4155 * Now we have a list of components--we have to return instead an in pm_autoconfig()
4167 * Now sanity-check values: levels must be monotonically in pm_autoconfig()
4170 if (p->comp->pmc_numlevels < 2) { in pm_autoconfig()
4173 p->comp->pmc_name, PM_DEVICE(dip), in pm_autoconfig()
4174 p->comp->pmc_numlevels)) in pm_autoconfig()
4177 for (j = 0; j < p->comp->pmc_numlevels; j++) { in pm_autoconfig()
4178 if ((p->comp->pmc_lvals[j] < 0) || ((j > 0) && in pm_autoconfig()
4179 (p->comp->pmc_lvals[j] <= in pm_autoconfig()
4180 p->comp->pmc_lvals[j - 1]))) { in pm_autoconfig()
4183 p->comp->pmc_name, PM_DEVICE(dip), in pm_autoconfig()
4184 p->comp->pmc_lvals[j], in pm_autoconfig()
4185 p->comp->pmc_lvals[j - 1])) in pm_autoconfig()
4189 ret[i] = *p->comp; /* struct assignment */ in pm_autoconfig()
4202 p = p->next; in pm_autoconfig()
4204 kmem_free(ptail->comp, sizeof (*ptail->comp)); in pm_autoconfig()
4223 for (i = 0; i < nelems - 1; i++) in pm_autoconfig()
4226 cmn_err(CE_CONT, "!'%s'", pp[nelems - 1]); in pm_autoconfig()
4227 cmn_err(CE_CONT, "! for %s@%s(%s#%d) is ill-formed.\n", PM_DEVICE(dip)); in pm_autoconfig()
4236 pp = p->comp; in pm_autoconfig()
4237 n = pp->pmc_numlevels; in pm_autoconfig()
4238 if (pp->pmc_name_sz) { in pm_autoconfig()
4239 kmem_free(pp->pmc_name, pp->pmc_name_sz); in pm_autoconfig()
4241 if (pp->pmc_lnames_sz) { in pm_autoconfig()
4242 kmem_free(pp->pmc_lname_buf, pp->pmc_lnames_sz); in pm_autoconfig()
4244 if (pp->pmc_lnames) { in pm_autoconfig()
4245 kmem_free(pp->pmc_lnames, n * (sizeof (char *))); in pm_autoconfig()
4247 if (pp->pmc_thresh) { in pm_autoconfig()
4248 kmem_free(pp->pmc_thresh, n * (sizeof (int))); in pm_autoconfig()
4250 if (pp->pmc_lvals) { in pm_autoconfig()
4251 kmem_free(pp->pmc_lvals, n * (sizeof (int))); in pm_autoconfig()
4253 p = ptail->next; in pm_autoconfig()
4268 * Devices may well get powered all the way down before the target time, but
4298 pmc = &PM_CP(dip, comp)->pmc_comp; in pm_set_device_threshold()
4299 for (level = 1; level < pmc->pmc_numlevels; in pm_set_device_threshold()
4301 pmc->pmc_thresh[level] = thresh; in pm_set_device_threshold()
4304 DEVI(dip)->devi_pm_dev_thresh = in pm_set_device_threshold()
4310 if (DEVI(dip)->devi_pm_flags & in pm_set_device_threshold()
4318 pm_comps_notlowest--; in pm_set_device_threshold()
4329 DEVI(dip)->devi_pm_flags &= PMC_THRESH_NONE; in pm_set_device_threshold()
4330 DEVI(dip)->devi_pm_flags |= PMC_NEXDEF_THRESH; in pm_set_device_threshold()
4333 } else if (DEVI(dip)->devi_pm_flags & PMC_NEXDEF_THRESH) { in pm_set_device_threshold()
4336 * non-default threshold, include that node in in pm_set_device_threshold()
4361 pmc = &PM_CP(dip, comp)->pmc_comp; in pm_set_device_threshold()
4362 ASSERT(pmc->pmc_numlevels > 1); in pm_set_device_threshold()
4363 transitions += pmc->pmc_numlevels - 1; in pm_set_device_threshold()
4369 pmc = &PM_CP(dip, comp)->pmc_comp; in pm_set_device_threshold()
4370 for (level = 1; level < pmc->pmc_numlevels; level++) { in pm_set_device_threshold()
4371 pmc->pmc_thresh[level] = thresh; in pm_set_device_threshold()
4377 pmc = &PM_CP(dip, comp)->pmc_comp; in pm_set_device_threshold()
4378 for (level = 1; level < pmc->pmc_numlevels; level++) { in pm_set_device_threshold()
4381 comp, level, pmc->pmc_thresh[level])) in pm_set_device_threshold()
4388 remainder = target_threshold - thresh * transitions; in pm_set_device_threshold()
4395 while (remainder > 0) { in pm_set_device_threshold()
4397 while (remainder && (comp < ncomp)) { in pm_set_device_threshold()
4398 pmc = &PM_CP(dip, comp)->pmc_comp; in pm_set_device_threshold()
4399 if (level < pmc->pmc_numlevels) { in pm_set_device_threshold()
4400 pmc->pmc_thresh[level] += 1; in pm_set_device_threshold()
4401 remainder--; in pm_set_device_threshold()
4409 pmc = &PM_CP(dip, comp)->pmc_comp; in pm_set_device_threshold()
4410 for (level = 1; level < pmc->pmc_numlevels; level++) { in pm_set_device_threshold()
4413 comp, level, pmc->pmc_thresh[level])) in pm_set_device_threshold()
4418 DEVI(dip)->devi_pm_dev_thresh = base; in pm_set_device_threshold()
4419 DEVI(dip)->devi_pm_flags &= PMC_THRESH_NONE; in pm_set_device_threshold()
4420 DEVI(dip)->devi_pm_flags |= flag; in pm_set_device_threshold()
4425 * Called when there is no old-style platform power management driver
4435 * This function calls the entry point supplied by the platform-specific
4437 * The use of global for getting the function name from platform-specific
4491 return (DEVI(dip)->devi_pm_flags & PMC_PARENTAL_SR); in e_ddi_parental_suspend_resume()
4524 * This is now handled by exporting the pm-components property.
4539 if (DEVI(dip)->devi_pm_components) { in pm_create_components()
4545 DEVI(dip)->devi_pm_flags |= PMC_BC; in pm_create_components()
4566 cmn_err(CE_WARN, "!driver exporting pm-components property " in pm_destroy_components()
4571 * We ignore this unless this is an old-style driver, except for in pm_destroy_components()
4603 DEVI(dip)->devi_pm_flags &= in pm_destroy_components()
4619 cp->pmc_busycount++; in pm_busy_component()
4620 cp->pmc_timestamp = 0; in pm_busy_component()
4639 if (cp->pmc_busycount) { in pm_idle_component()
4640 if (--(cp->pmc_busycount) == 0) in pm_idle_component()
4641 cp->pmc_timestamp = gethrestime_sec(); in pm_idle_component()
4643 cp->pmc_timestamp = gethrestime_sec(); in pm_idle_component()
4662 if (PM_IS_NEXUS(dip) && (cp->pmc_busycount == 0)) { in pm_idle_component()
4672 * This functionality is replaced by the pm-component property.
4673 * We'll only get components destroyed while no power management is
4683 "(driver exporting pm-components property) ignored", in pm_set_normal_power()
4725 if (DEVI(dip)->devi_pm_flags & PMC_NOPMKID) { in pm_stop()
4726 DEVI(dip)->devi_pm_flags &= ~PMC_NOPMKID; in pm_stop()
4774 if (ddi_getlongprop(DDI_DEV_T_ANY, dip, propflag, "pm-hardware-state", in e_pm_props()
4776 if (strcmp(pp, "needs-suspend-resume") == 0) { in e_pm_props()
4778 } else if (strcmp(pp, "no-suspend-resume") == 0) { in e_pm_props()
4780 } else if (strcmp(pp, "parental-suspend-resume") == 0) { in e_pm_props()
4785 PM_ADDR(dip), "pm-hardware-state", pp); in e_pm_props()
4793 * "pm-want-child-notification?" is defined by the parent. in e_pm_props()
4796 "pm-want-child-notification?") && PM_HAS_BUS_POWER(dip)) in e_pm_props()
4799 dip, propflag, "pm-want-child-notification?")); in e_pm_props()
4801 "no-involuntary-power-cycles")) in e_pm_props()
4806 if (ddi_getlongprop(DDI_DEV_T_ANY, dip, propflag, "pm-class", in e_pm_props()
4813 PM_ADDR(dip), "pm-class", pp); in e_pm_props()
4818 DEVI(dip)->devi_pm_flags |= flags; in e_pm_props()
4843 * different platform-specific power control drivers. in pm_default_ctlops()
4852 switch (reqp->request_type) { in pm_default_ctlops()
4855 target_dip = reqp->req.ppm_set_power_req.who; in pm_default_ctlops()
4857 new_level = reqp->req.ppm_set_power_req.new_level; in pm_default_ctlops()
4858 cmpt = reqp->req.ppm_set_power_req.cmpt; in pm_default_ctlops()
4861 reqp->req.ppm_set_power_req.old_level = old_level; in pm_default_ctlops()
4863 PMD(PMD_PPM, ("%s: PPM_SET_POWER %s@%s(%s#%d)[%d] %d->" in pm_default_ctlops()
4880 switch (reqp->request_type) { in pm_default_ctlops()
4921 reqp->req.ppm_config_req.result)) in pm_default_ctlops()
4929 ASSERT(reqp->req.ppm_notify_level_req.who == rdip); in pm_default_ctlops()
4931 "%s@%s(%s#%d)[%d] %d->%d\n", pmf, in pm_default_ctlops()
4932 PM_DEVICE(reqp->req.ppm_notify_level_req.who), in pm_default_ctlops()
4933 reqp->req.ppm_notify_level_req.cmpt, in pm_default_ctlops()
4934 PM_CURPOWER(reqp->req.ppm_notify_level_req.who, in pm_default_ctlops()
4935 reqp->req.ppm_notify_level_req.cmpt), in pm_default_ctlops()
4936 reqp->req.ppm_notify_level_req.new_level)) in pm_default_ctlops()
4945 pm_lock_power_single(reqp->req.ppm_lock_power_req.who); in pm_default_ctlops()
4950 reqp->req.ppm_unlock_power_req.who); in pm_default_ctlops()
4955 reqp->req.ppm_lock_power_req.who); in pm_default_ctlops()
4959 target_dip = reqp->req.ppm_power_lock_owner_req.who; in pm_default_ctlops()
4961 reqp->req.ppm_power_lock_owner_req.owner = in pm_default_ctlops()
4962 DEVI(rdip)->devi_busy_thread; in pm_default_ctlops()
4976 * We overload the bus_ctl ops here--perhaps we ought to have a distinct
4991 ASSERT(DEVI(d)->devi_ops && DEVI(d)->devi_ops->devo_bus_ops && in pm_ctlops()
4992 DEVI(d)->devi_ops->devo_bus_ops->bus_ctl); in pm_ctlops()
4994 fp = DEVI(d)->devi_ops->devo_bus_ops->bus_ctl; in pm_ctlops()
5031 DEVI(dip)->devi_pm_flags |= PMC_NOPMKID; in pm_start()
5056 ASSERT(*rp->ptr_physpath); in pm_record_thresh()
5059 ptr; pptr = ptr, ptr = ptr->ptr_next) { in pm_record_thresh()
5060 if (strcmp(rp->ptr_physpath, ptr->ptr_physpath) == 0) { in pm_record_thresh()
5062 rp->ptr_next = ptr->ptr_next; in pm_record_thresh()
5064 pptr->ptr_next = rp; in pm_record_thresh()
5069 kmem_free(ptr, ptr->ptr_size); in pm_record_thresh()
5078 rp->ptr_next = pm_thresh_head; in pm_record_thresh()
5081 rp->ptr_next = NULL; in pm_record_thresh()
5095 p->pdr_size = size; in newpdr()
5096 p->pdr_isprop = isprop; in newpdr()
5097 p->pdr_kept_paths = NULL; in newpdr()
5098 p->pdr_kept_count = 0; in newpdr()
5099 p->pdr_kept = (char *)((intptr_t)p + sizeof (pm_pdr_t)); in newpdr()
5100 (void) strcpy(p->pdr_kept, kept); in newpdr()
5101 p->pdr_keeper = (char *)((intptr_t)p->pdr_kept + strlen(kept) + 1); in newpdr()
5102 (void) strcpy(p->pdr_keeper, keeps); in newpdr()
5103 ASSERT((intptr_t)p->pdr_keeper + strlen(p->pdr_keeper) + 1 <= in newpdr()
5105 ASSERT((intptr_t)p->pdr_kept + strlen(p->pdr_kept) + 1 <= in newpdr()
5112 * keeper -> kept list for simplification. At this point We do not
5133 ppdr = pdr, pdr = pdr->pdr_next) { in pm_record_keeper()
5134 PMD(PMD_KEEPS, ("%s: check %s, %s\n", pmf, pdr->pdr_kept, in pm_record_keeper()
5135 pdr->pdr_keeper)) in pm_record_keeper()
5136 if (strcmp(kept, pdr->pdr_kept) == 0 && in pm_record_keeper()
5137 strcmp(keeper, pdr->pdr_keeper) == 0) { in pm_record_keeper()
5147 ASSERT(ppdr->pdr_next == NULL); in pm_record_keeper()
5148 ppdr->pdr_next = npdr; in pm_record_keeper()
5180 for (rp = pm_thresh_head; rp; rp = rp->ptr_next) { in pm_thresh_specd()
5181 if (strcmp(rp->ptr_physpath, path) != 0) in pm_thresh_specd()
5269 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_keeper()
5270 if (!dp->pdr_isprop) { in pm_keeper()
5273 PMD(PMD_KEEPS, ("%s: keeper %s\n", pmf, dp->pdr_keeper)) in pm_keeper()
5274 if (dp->pdr_satisfied) { in pm_keeper()
5278 if (strcmp(dp->pdr_keeper, keeper) == 0) { in pm_keeper()
5282 if (strcmp(dp->pdr_keeper, keeper) != 0) in pm_keeper()
5284 for (i = 0; i < dp->pdr_kept_count; i++) { in pm_keeper()
5285 if (dp->pdr_kept_paths[i] == NULL) in pm_keeper()
5287 kept = pm_name_to_dip(dp->pdr_kept_paths[i], 1); in pm_keeper()
5291 DDI_PROP_DONTPASS, dp->pdr_kept)); in pm_keeper()
5295 dp->pdr_kept_count)) in pm_keeper()
5333 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_kept()
5334 if (dp->pdr_isprop) { in pm_kept()
5335 PMD(PMD_KEEPS, ("%s: property %s\n", pmf, dp->pdr_kept)) in pm_kept()
5337 DDI_PROP_DONTPASS, dp->pdr_kept)) { in pm_kept()
5341 if (strcmp(dp->pdr_keeper, keptp) == 0) in pm_kept()
5343 keeper = pm_name_to_dip(dp->pdr_keeper, 1); in pm_kept()
5355 if (dp->pdr_kept_count == 0) { in pm_kept()
5363 dp->pdr_kept_paths = paths; in pm_kept()
5364 dp->pdr_kept_count++; in pm_kept()
5367 for (i = 0; i < dp->pdr_kept_count; in pm_kept()
5370 dp->pdr_kept_paths[i]) in pm_kept()
5380 length = dp->pdr_kept_count * in pm_kept()
5385 if (dp->pdr_kept_count) { in pm_kept()
5386 bcopy(dp->pdr_kept_paths, in pm_kept()
5388 kmem_free(dp->pdr_kept_paths, in pm_kept()
5391 dp->pdr_kept_paths = paths; in pm_kept()
5396 dp->pdr_kept_paths[i] = path; in pm_kept()
5397 dp->pdr_kept_count++; in pm_kept()
5419 if (strcmp(keptp, dp->pdr_kept) == 0) { in pm_kept()
5420 if (dp->pdr_kept_paths == NULL) { in pm_kept()
5428 dp->pdr_kept_paths = paths; in pm_kept()
5429 dp->pdr_kept_count++; in pm_kept()
5459 if (dp->pdr_kept_paths == NULL) in pm_apply_recorded_dep()
5461 keptp = dp->pdr_kept_paths[0]; in pm_apply_recorded_dep()
5470 dp->pdr_keeper, keptp)) in pm_apply_recorded_dep()
5472 ASSERT(dp->pdr_satisfied == 0); in pm_apply_recorded_dep()
5473 dp->pdr_satisfied = 1; in pm_apply_recorded_dep()
5475 pm_unresolved_deps--; in pm_apply_recorded_dep()
5494 * External interface to sanity-check a power level.
5526 new->pr_dip = dip; in pm_block()
5527 new->pr_comp = comp; in pm_block()
5528 new->pr_newlevel = newpower; in pm_block()
5529 new->pr_oldlevel = oldpower; in pm_block()
5530 cv_init(&new->pr_cv, NULL, CV_DEFAULT, NULL); in pm_block()
5539 while (ret == 0) { in pm_block()
5547 if (cv_wait_sig(&new->pr_cv, &pm_rsvp_lock) == 0) { in pm_block()
5550 ret = new->pr_retval; in pm_block()
5555 cv_destroy(&new->pr_cv); in pm_block()
5567 ASSERT(clone >= 0 && clone < PM_MAX_CLONE - 1); in pm_interest_registered()
5589 pscc->pscc_clone = clone; in pm_register_watcher()
5590 pscc->pscc_dip = dip; in pm_register_watcher()
5595 for (p = pm_pscc_direct; p; p = p->pscc_next) { in pm_register_watcher()
5601 if (p->pscc_clone == clone) { in pm_register_watcher()
5602 pscc->pscc_entries = p->pscc_entries; in pm_register_watcher()
5603 pscc->pscc_entries->psce_references++; in pm_register_watcher()
5610 mutex_init(&psce->psce_lock, NULL, MUTEX_DEFAULT, NULL); in pm_register_watcher()
5611 psce->psce_first = in pm_register_watcher()
5614 psce->psce_in = psce->psce_out = psce->psce_first; in pm_register_watcher()
5615 psce->psce_last = &psce->psce_first[PSCCOUNT - 1]; in pm_register_watcher()
5616 psce->psce_references = 1; in pm_register_watcher()
5617 pscc->pscc_entries = psce; in pm_register_watcher()
5625 for (p = pm_pscc_interest; p; p = p->pscc_next) { in pm_register_watcher()
5629 ASSERT(p->pscc_clone != clone); in pm_register_watcher()
5633 psce->psce_first = kmem_zalloc(sizeof (pm_state_change_t) * in pm_register_watcher()
5635 psce->psce_in = psce->psce_out = psce->psce_first; in pm_register_watcher()
5636 psce->psce_last = &psce->psce_first[PSCCOUNT - 1]; in pm_register_watcher()
5637 psce->psce_references = 1; in pm_register_watcher()
5638 pscc->pscc_entries = psce; in pm_register_watcher()
5653 ASSERT(p->pr_prev == NULL); in pm_dequeue_blocked()
5654 if (p->pr_next != NULL) in pm_dequeue_blocked()
5655 p->pr_next->pr_prev = NULL; in pm_dequeue_blocked()
5656 pm_blocked_list = p->pr_next; in pm_dequeue_blocked()
5658 ASSERT(p->pr_prev != NULL); in pm_dequeue_blocked()
5659 p->pr_prev->pr_next = p->pr_next; in pm_dequeue_blocked()
5660 if (p->pr_next != NULL) in pm_dequeue_blocked()
5661 p->pr_next->pr_prev = p->pr_prev; in pm_dequeue_blocked()
5672 ASSERT(p->pscc_prev == NULL); in pm_dequeue_pscc()
5673 if (p->pscc_next != NULL) in pm_dequeue_pscc()
5674 p->pscc_next->pscc_prev = NULL; in pm_dequeue_pscc()
5675 *list = p->pscc_next; in pm_dequeue_pscc()
5677 ASSERT(p->pscc_prev != NULL); in pm_dequeue_pscc()
5678 p->pscc_prev->pscc_next = p->pscc_next; in pm_dequeue_pscc()
5679 if (p->pscc_next != NULL) in pm_dequeue_pscc()
5680 p->pscc_next->pscc_prev = p->pscc_prev; in pm_dequeue_pscc()
5693 ASSERT(p->pscc_next == NULL); in pm_enqueue_pscc()
5694 ASSERT(p->pscc_prev == NULL); in pm_enqueue_pscc()
5696 p->pscc_next = h; in pm_enqueue_pscc()
5697 ASSERT(h->pscc_prev == NULL); in pm_enqueue_pscc()
5698 h->pscc_prev = p; in pm_enqueue_pscc()
5699 ASSERT(p->pscc_prev == NULL); in pm_enqueue_pscc()
5719 pn = p->pscc_next; in pm_deregister_watcher()
5720 if (p->pscc_clone == clone) { in pm_deregister_watcher()
5722 psce = p->pscc_entries; in pm_deregister_watcher()
5723 ASSERT(psce->psce_references == 1); in pm_deregister_watcher()
5724 mutex_destroy(&psce->psce_lock); in pm_deregister_watcher()
5725 kmem_free(psce->psce_first, in pm_deregister_watcher()
5737 pn = p->pscc_next; in pm_deregister_watcher()
5738 if ((dip && p->pscc_dip == dip) || in pm_deregister_watcher()
5739 (dip == NULL && clone == p->pscc_clone)) { in pm_deregister_watcher()
5740 ASSERT(clone == p->pscc_clone); in pm_deregister_watcher()
5750 psce = p->pscc_entries; in pm_deregister_watcher()
5752 if (psce->psce_references == 1) { in pm_deregister_watcher()
5753 kmem_free(psce->psce_first, in pm_deregister_watcher()
5757 psce->psce_references--; in pm_deregister_watcher()
5778 for (p = *list; p; p = p->pscc_next) { in pm_psc_find_clone()
5779 if (clone == p->pscc_clone) { in pm_psc_find_clone()
5780 psce = p->pscc_entries; in pm_psc_find_clone()
5781 mutex_enter(&psce->psce_lock); in pm_psc_find_clone()
5782 if (psce->psce_out->size) { in pm_psc_find_clone()
5786 mutex_exit(&psce->psce_lock); in pm_psc_find_clone()
5822 ASSERT(p->pr_next == NULL); in pm_enqueue_blocked()
5823 ASSERT(p->pr_prev == NULL); in pm_enqueue_blocked()
5825 p->pr_next = pm_blocked_list; in pm_enqueue_blocked()
5826 ASSERT(pm_blocked_list->pr_prev == NULL); in pm_enqueue_blocked()
5827 pm_blocked_list->pr_prev = p; in pm_enqueue_blocked()
5955 for (cur = lock_loan_head.pmlk_next; cur; cur = cur->pmlk_next) in pm_lock_power_single()
5956 if (cur->pmlk_borrower == curthread) in pm_lock_power_single()
5965 if (cur->pmlk_lender == DEVI(dip)->devi_busy_thread) { in pm_lock_power_single()
5966 ASSERT(cur->pmlk_dip == NULL || cur->pmlk_dip == dip); in pm_lock_power_single()
5967 cur->pmlk_dip = dip; in pm_lock_power_single()
5993 for (cur = lock_loan_head.pmlk_next; cur; cur = cur->pmlk_next) in pm_unlock_power_single()
5994 if (cur->pmlk_borrower == curthread) in pm_unlock_power_single()
5998 if (cur == NULL || cur->pmlk_dip != dip) in pm_unlock_power_single()
6026 for (rp = pm_dep_head; rp; rp = rp->pdr_next) { in prdeps()
6028 (void *)rp, (rp->pdr_isprop ? "property" : "device"), in prdeps()
6029 rp->pdr_keeper, rp->pdr_kept, rp->pdr_kept_count, in prdeps()
6030 (void *)rp->pdr_next); in prdeps()
6031 if (rp->pdr_kept_count != 0) { in prdeps()
6034 while (i < rp->pdr_kept_count) { in prdeps()
6035 pm_log("%s ", rp->pdr_kept_paths[i]); in prdeps()
6050 for (ip = pm_noinvol_head; ip; ip = ip->ni_next) in pr_noinvol()
6052 ip->ni_major, ip->ni_flags, ip->ni_noinvolpm, ip->ni_path); in pr_noinvol()
6072 PM_DEVICE(dip), (void *)rp, rp->ptr_physpath)) in pm_apply_recorded_thresh()
6085 ep = rp->ptr_entries; in pm_apply_recorded_thresh()
6089 if (rp->ptr_numcomps == 0) { /* PM_SET_DEVICE_THRESHOLD product */ in pm_apply_recorded_thresh()
6090 ASSERT(ep && ep->pte_numthresh == 1); in pm_apply_recorded_thresh()
6092 pmf, PM_DEVICE(dip), ep->pte_thresh[0])) in pm_apply_recorded_thresh()
6094 pm_set_device_threshold(dip, ep->pte_thresh[0], PMC_DEV_THRESH); in pm_apply_recorded_thresh()
6101 for (j = 0; j < ep->pte_numthresh; j++) { in pm_apply_recorded_thresh()
6104 i, ep->pte_thresh[j])) in pm_apply_recorded_thresh()
6105 cp->pmc_comp.pmc_thresh[j + 1] = ep->pte_thresh[j]; in pm_apply_recorded_thresh()
6109 DEVI(dip)->devi_pm_flags &= PMC_THRESH_NONE; in pm_apply_recorded_thresh()
6110 DEVI(dip)->devi_pm_flags |= PMC_COMP_THRESH; in pm_apply_recorded_thresh()
6131 rp->ptr_physpath)) in pm_valid_thresh()
6140 if (rp->ptr_numcomps == 0) { in pm_valid_thresh()
6141 ASSERT(rp->ptr_entries && rp->ptr_entries->pte_numthresh == 1); in pm_valid_thresh()
6144 if (rp->ptr_numcomps != (comps = PM_NUMCMPTS(dip))) { in pm_valid_thresh()
6146 pmf, PM_NUMCMPTS(dip), rp->ptr_numcomps, rp->ptr_physpath)) in pm_valid_thresh()
6149 ep = rp->ptr_entries; in pm_valid_thresh()
6152 if ((ep + i)->pte_numthresh != in pm_valid_thresh()
6153 cp->pmc_comp.pmc_numlevels - 1) { in pm_valid_thresh()
6155 pmf, rp->ptr_physpath, i, in pm_valid_thresh()
6156 cp->pmc_comp.pmc_numlevels - 1, in pm_valid_thresh()
6157 (ep + i)->pte_numthresh)) in pm_valid_thresh()
6174 for (pptr = NULL, ptr = pm_thresh_head; ptr; ptr = ptr->ptr_next) { in pm_unrecord_threshold()
6175 if (strcmp(physpath, ptr->ptr_physpath) == 0) { in pm_unrecord_threshold()
6177 pptr->ptr_next = ptr->ptr_next; in pm_unrecord_threshold()
6180 pm_thresh_head = ptr->ptr_next; in pm_unrecord_threshold()
6182 kmem_free(ptr, ptr->ptr_size); in pm_unrecord_threshold()
6198 while (pm_thresh_head) { in pm_discard_thresholds()
6200 pm_thresh_head = rp->ptr_next; in pm_discard_thresholds()
6201 kmem_free(rp, rp->ptr_size); in pm_discard_thresholds()
6226 while (pm_dep_head) { in pm_discard_dependencies()
6228 if (!rp->pdr_isprop) { in pm_discard_dependencies()
6229 ASSERT(rp->pdr_satisfied == 0); in pm_discard_dependencies()
6231 pm_unresolved_deps--; in pm_discard_dependencies()
6234 pm_prop_deps--; in pm_discard_dependencies()
6236 pm_dep_head = rp->pdr_next; in pm_discard_dependencies()
6237 if (rp->pdr_kept_count) { in pm_discard_dependencies()
6238 for (i = 0; i < rp->pdr_kept_count; i++) { in pm_discard_dependencies()
6239 length = strlen(rp->pdr_kept_paths[i]) + 1; in pm_discard_dependencies()
6240 kmem_free(rp->pdr_kept_paths[i], length); in pm_discard_dependencies()
6242 kmem_free(rp->pdr_kept_paths, in pm_discard_dependencies()
6243 rp->pdr_kept_count * sizeof (char **)); in pm_discard_dependencies()
6245 kmem_free(rp, rp->pdr_size); in pm_discard_dependencies()
6338 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_rele_dep()
6339 if (strcmp(dp->pdr_keeper, keeper) != 0) in pm_rele_dep()
6341 for (count = 0; count < dp->pdr_kept_count; count++) { in pm_rele_dep()
6342 kept_path = dp->pdr_kept_paths[count]; in pm_rele_dep()
6350 ASSERT(DEVI(kept)->devi_pm_kidsupcnt > 0); in pm_rele_dep()
6360 * if our keeper is up since dependency is not honored while a kept
6377 for (dp = pm_dep_head; dp; dp = dp->pdr_next) { in pm_bring_self_up()
6378 if (dp->pdr_kept_count == 0) in pm_bring_self_up()
6380 for (i = 0; i < dp->pdr_kept_count; i++) { in pm_bring_self_up()
6381 if (strcmp(dp->pdr_kept_paths[i], keptpath) != 0) in pm_bring_self_up()
6383 keeper = pm_name_to_dip(dp->pdr_keeper, 1); in pm_bring_self_up()
6398 DEVI(kept)->devi_pm_flags &= in pm_bring_self_up()
6417 pdw_type_decode(work->pdw_type))) in pm_process_dep_request()
6419 (work->pdw_keeper ? work->pdw_keeper : "NULL"), in pm_process_dep_request()
6420 (work->pdw_kept ? work->pdw_kept : "NULL"))) in pm_process_dep_request()
6423 switch (work->pdw_type) { in pm_process_dep_request()
6426 bring_wekeeps_up(work->pdw_keeper); in pm_process_dep_request()
6430 pm_rele_dep(work->pdw_keeper); in pm_process_dep_request()
6433 pm_free_keeps(work->pdw_keeper, work->pdw_pwr); in pm_process_dep_request()
6443 pm_bring_self_up(work->pdw_kept); in pm_process_dep_request()
6446 (void) pm_record_keeper(work->pdw_kept, work->pdw_keeper, 0); in pm_process_dep_request()
6451 (void) pm_record_keeper(work->pdw_kept, work->pdw_keeper, 1); in pm_process_dep_request()
6456 ret = pm_kept(work->pdw_kept); in pm_process_dep_request()
6461 ret = pm_keeper(work->pdw_keeper); in pm_process_dep_request()
6466 ret = pm_keeper(work->pdw_keeper); in pm_process_dep_request()
6469 ret = pm_kept(work->pdw_kept); in pm_process_dep_request()
6474 ret = pm_is_kept(work->pdw_kept); in pm_process_dep_request()
6476 pmf, work->pdw_kept, ret)) in pm_process_dep_request()
6493 if (!work->pdw_wait) { in pm_process_dep_request()
6494 if (work->pdw_keeper) in pm_process_dep_request()
6495 kmem_free(work->pdw_keeper, in pm_process_dep_request()
6496 strlen(work->pdw_keeper) + 1); in pm_process_dep_request()
6497 if (work->pdw_kept) in pm_process_dep_request()
6498 kmem_free(work->pdw_kept, strlen(work->pdw_kept) + 1); in pm_process_dep_request()
6504 work->pdw_ret = ret; in pm_process_dep_request()
6505 work->pdw_done = 1; in pm_process_dep_request()
6506 cv_signal(&work->pdw_cv); in pm_process_dep_request()
6529 pm_dep_thread_workq = work->pdw_next; in pm_dep_thread()
6531 pm_dep_thread_tail = work->pdw_next; in pm_dep_thread()
6560 if (DEVI(dip)->devi_pm_volpmd && in pm_forget_power_level()
6561 PM_CP(dip, 0)->pmc_cur_pwr == 0) in pm_forget_power_level()
6562 DEVI(dip)->devi_pm_volpmd = 0; in pm_forget_power_level()
6569 * This function advises the caller whether it should make a power-off
6571 * at this time, the time that the next power-off transition can
6575 * 1 power-off advised
6576 * 0 power-off not advised, intervalp will point to seconds from
6577 * now that a power-off is advised. If it is passed the number
6580 * -1 error
6598 return (-1); in pm_trans_check()
6601 if (datap->format == DC_SCSI_FORMAT) { in pm_trans_check()
6624 * again to keep it on track to meet the 5-year in pm_trans_check()
6638 scp = &datap->un.scsi_cycles; in pm_trans_check()
6640 "svc_date=%s, svc_flag=%d\n", pmf, datap->format, in pm_trans_check()
6641 scp->lifemax, scp->ncycles, scp->svc_date, scp->flag)) in pm_trans_check()
6642 if (scp->ncycles < 0 || scp->flag != 0) { in pm_trans_check()
6644 return (-1); in pm_trans_check()
6647 if (scp->ncycles > scp->lifemax) { in pm_trans_check()
6655 bcopy(scp->svc_date, dbuf, DC_SCSI_YEAR_LEN); in pm_trans_check()
6658 service_years = stoi(&ptr) - EPOCH_YEAR; in pm_trans_check()
6659 bcopy(&scp->svc_date[DC_SCSI_YEAR_LEN], dbuf, in pm_trans_check()
6665 * could be (00-51) or (01-52) in pm_trans_check()
6673 return (-1); in pm_trans_check()
6677 * calculate service date in seconds-since-epoch, in pm_trans_check()
6678 * adding one day for each leap-year. in pm_trans_check()
6680 * (years-since-epoch + 2) fixes integer truncation, in pm_trans_check()
6681 * example: (8) leap-years during [1972, 2000] in pm_trans_check()
6682 * (2000 - 1970) = 30; and (30 + 2) / 4 = 8; in pm_trans_check()
6693 now = ((now + DC_SPD -1) / DC_SPD) * DC_SPD; in pm_trans_check()
6697 return (-1); in pm_trans_check()
6700 tdiff = now - service_seconds; in pm_trans_check()
6704 * NOTE - Leap years are not considered in the calculations in pm_trans_check()
6709 (scp->ncycles <= scp->lifemax)) in pm_trans_check()
6717 ((scp->lifemax * pcnt[full_years - 1]) / 100); in pm_trans_check()
6718 upper_bound_cycles = (scp->lifemax * pcnt[full_years]) / 100; in pm_trans_check()
6720 if (scp->ncycles <= lower_bound_cycles) in pm_trans_check()
6728 cycles_diff = (upper_bound_cycles - lower_bound_cycles); in pm_trans_check()
6737 if (scp->ncycles <= cycles_allowed) in pm_trans_check()
6745 * over-used, we may need to skip years with in pm_trans_check()
6749 cycles_over = (scp->ncycles - lower_bound_cycles); in pm_trans_check()
6750 while (cycles_over > cycles_diff) { in pm_trans_check()
6756 cycles_over -= cycles_diff; in pm_trans_check()
6759 (scp->lifemax * pcnt[full_years]) / 100; in pm_trans_check()
6760 cycles_diff = (upper_bound_cycles - lower_bound_cycles); in pm_trans_check()
6770 *intervalp = (when_allowed - now); in pm_trans_check()
6776 } else if (datap->format == DC_SMART_FORMAT) { in pm_trans_check()
6781 smart_p = &datap->un.smart_count; in pm_trans_check()
6782 if (smart_p->consumed >= smart_p->allowed) { in pm_trans_check()
6791 return (-1); in pm_trans_check()
6837 cp->ppc_dip = dip; in pm_pre_probe()
6846 cp->ppc_ppm = PPM(dip); in pm_pre_probe()
6855 cp->ppc_ppm = NULL; in pm_pre_probe()
6911 * Do not power up the node if it is called due to auto-modunload. in pm_pre_unconfig()
6941 cp->ppc_cmd = (int)cmd; in pm_pre_attach()
6942 cp->ppc_ppm = PPM(dip); in pm_pre_attach()
6943 cp->ppc_dip = dip; in pm_pre_attach()
6952 if (cp->ppc_ppm) { /* if ppm driver claims the node */ in pm_pre_attach()
6956 (void) pm_ctlops(cp->ppc_ppm, dip, DDI_CTLOPS_POWER, in pm_pre_attach()
6971 if (cp->ppc_ppm) { /* if ppm driver claims the node */ in pm_pre_attach()
6973 power_req.req.resume_req.who = cp->ppc_dip; in pm_pre_attach()
6975 (ddi_attach_cmd_t)cp->ppc_cmd; in pm_pre_attach()
6976 ASSERT(PPM(cp->ppc_dip) == cp->ppc_ppm); in pm_pre_attach()
6977 (void) pm_ctlops(cp->ppc_ppm, cp->ppc_dip, in pm_pre_attach()
6983 power_req.req.resume_req.who = cp->ppc_dip; in pm_pre_attach()
6985 (ddi_attach_cmd_t)cp->ppc_cmd; in pm_pre_attach()
6986 (void) pm_ctlops(NULL, cp->ppc_dip, in pm_pre_attach()
7040 if (cp->ppc_ppm) { /* if ppm driver claims the node */ in pm_post_probe()
7042 power_req.req.ppm_config_req.who = cp->ppc_dip; in pm_post_probe()
7044 ASSERT(PPM(cp->ppc_dip) == cp->ppc_ppm); in pm_post_probe()
7045 (void) pm_ctlops(cp->ppc_ppm, cp->ppc_dip, DDI_CTLOPS_POWER, in pm_post_probe()
7051 power_req.req.ppm_config_req.who = cp->ppc_dip; in pm_post_probe()
7053 (void) pm_ctlops(NULL, cp->ppc_dip, DDI_CTLOPS_POWER, in pm_post_probe()
7108 if (cp->ppc_cmd != DDI_ATTACH) in pm_post_attach()
7111 dip = cp->ppc_dip; in pm_post_attach()
7115 * Attach succeeded, so proceed to doing post-attach pm tasks in pm_post_attach()
7126 if (cp->ppc_ppm) { /* if ppm driver claims the node */ in pm_post_attach()
7128 power_req.req.ppm_config_req.who = cp->ppc_dip; in pm_post_attach()
7130 ASSERT(PPM(cp->ppc_dip) == cp->ppc_ppm); in pm_post_attach()
7131 (void) pm_ctlops(cp->ppc_ppm, cp->ppc_dip, in pm_post_attach()
7137 power_req.req.ppm_config_req.who = cp->ppc_dip; in pm_post_attach()
7139 (void) pm_ctlops(NULL, cp->ppc_dip, in pm_post_attach()
7156 cp->ppc_dip = dip; in pm_pre_detach()
7157 cp->ppc_cmd = (int)cmd; in pm_pre_detach()
7161 pm_detaching(dip); /* suspend pm while detaching */ in pm_pre_detach()
7168 cp->ppc_ppm = PPM(dip); in pm_pre_detach()
7177 cp->ppc_ppm = NULL; in pm_pre_detach()
7187 * Dip is either a leaf node that exported "no-involuntary-power-cycles" prop.,
7203 np->ni_size = plen; in pm_record_invol_path()
7204 np->ni_path = kmem_alloc(plen, KM_SLEEP); in pm_record_invol_path()
7205 np->ni_noinvolpm = noinvolpm; in pm_record_invol_path()
7206 np->ni_volpmd = volpmd; in pm_record_invol_path()
7207 np->ni_wasvolpmd = wasvolpmd; in pm_record_invol_path()
7208 np->ni_flags = flags; in pm_record_invol_path()
7209 (void) strcpy(np->ni_path, path); in pm_record_invol_path()
7216 np->ni_major = pm_path_to_major(path); in pm_record_invol_path()
7218 np->ni_major = major; in pm_record_invol_path()
7221 for (ip = pm_noinvol_head; ip; pp = ip, ip = ip->ni_next) { in pm_record_invol_path()
7222 int comp = strcmp(path, ip->ni_path); in pm_record_invol_path()
7225 pmf, path, ip->ni_path)) in pm_record_invol_path()
7227 np->ni_next = ip; in pm_record_invol_path()
7229 pp->ni_next = np; in pm_record_invol_path()
7249 pp->ni_path)) in pm_record_invol_path()
7250 ASSERT(pp->ni_next == 0); in pm_record_invol_path()
7251 pp->ni_next = np; in pm_record_invol_path()
7253 PMD(PMD_NOINVOL, ("%s: %s added to end-of-list\n", pmf, path)) in pm_record_invol_path()
7274 pm_record_invol_path(pathbuf, (DEVI(dip)->devi_pm_flags & in pm_record_invol()
7275 (PMC_NO_INVOL | PMC_CONSOLE_FB)), DEVI(dip)->devi_pm_noinvolpm, in pm_record_invol()
7276 DEVI(dip)->devi_pm_volpmd, volpmd, PM_MAJOR(dip)); in pm_record_invol()
7292 dev_info_t *dip = cp->ppc_dip; in pm_post_detach()
7296 switch (cp->ppc_cmd) { in pm_post_detach()
7298 if (cp->ppc_ppm) { /* if ppm driver claims the node */ in pm_post_detach()
7300 power_req.req.ppm_config_req.who = cp->ppc_dip; in pm_post_detach()
7302 ASSERT(PPM(cp->ppc_dip) == cp->ppc_ppm); in pm_post_detach()
7303 (void) pm_ctlops(cp->ppc_ppm, cp->ppc_dip, in pm_post_detach()
7309 power_req.req.ppm_config_req.who = cp->ppc_dip; in pm_post_detach()
7311 (void) pm_ctlops(NULL, cp->ppc_dip, in pm_post_detach()
7319 if (cp->ppc_cmd == DDI_DETACH && in pm_post_detach()
7320 ((DEVI(dip)->devi_pm_flags & in pm_post_detach()
7322 DEVI(dip)->devi_pm_noinvolpm)) in pm_post_detach()
7324 DEVI(dip)->devi_pm_flags &= in pm_post_detach()
7361 cp->ppc_cmd); in pm_post_detach()
7388 if (cp->pmc_timestamp == 0 && cp->pmc_busycount == 0) in pm_adjust_timestamps()
7389 cp->pmc_timestamp = gethrestime_sec(); in pm_adjust_timestamps()
7409 if (DEVI(dip)->devi_pm_flags & PMC_NOINVOL_DONE) in pm_noinvol_specd()
7411 DEVI(dip)->devi_pm_flags |= PMC_NOINVOL_DONE; in pm_noinvol_specd()
7416 DEVI(dip)->devi_pm_volpmd = 0; in pm_noinvol_specd()
7417 DEVI(dip)->devi_pm_noinvolpm = 0; in pm_noinvol_specd()
7419 for (ip = pm_noinvol_head; ip; pp = ip, ip = ip->ni_next) { in pm_noinvol_specd()
7421 pmf, pathbuf, ip->ni_path)) in pm_noinvol_specd()
7422 if (strcmp(pathbuf, ip->ni_path) == 0) { in pm_noinvol_specd()
7435 for (ip = pm_noinvol_head; ip; pp = ip, ip = ip->ni_next) { in pm_noinvol_specd()
7437 pmf, pathbuf, ip->ni_path)) in pm_noinvol_specd()
7438 if (strcmp(pathbuf, ip->ni_path) == 0) { in pm_noinvol_specd()
7439 ip->ni_flags &= ~PMC_DRIVER_REMOVED; in pm_noinvol_specd()
7440 DEVI(dip)->devi_pm_flags |= ip->ni_flags; in pm_noinvol_specd()
7451 DEVI(dip)->devi_pm_noinvolpm = ip->ni_noinvolpm; in pm_noinvol_specd()
7452 ASSERT((DEVI(dip)->devi_pm_flags & in pm_noinvol_specd()
7454 DEVI(dip)->devi_pm_noinvolpm); in pm_noinvol_specd()
7455 DEVI(dip)->devi_pm_volpmd = ip->ni_volpmd; in pm_noinvol_specd()
7458 ip->ni_noinvolpm, ip->ni_volpmd, in pm_noinvol_specd()
7459 ip->ni_wasvolpmd, ip->ni_flags, ip->ni_path)) in pm_noinvol_specd()
7467 pmf, ip->ni_path, pp->ni_path)) in pm_noinvol_specd()
7468 pp->ni_next = ip->ni_next; in pm_noinvol_specd()
7471 pmf, ip->ni_path)) in pm_noinvol_specd()
7473 pm_noinvol_head = ip->ni_next; in pm_noinvol_specd()
7476 wasvolpmd = ip->ni_wasvolpmd; in pm_noinvol_specd()
7478 kmem_free(ip->ni_path, ip->ni_size); in pm_noinvol_specd()
7507 if (cp->pmc_cur_pwr == PM_LEVEL_UNKNOWN || in pm_all_components_off()
7508 cp->pmc_comp.pmc_lvals[cp->pmc_cur_pwr]) in pm_all_components_off()
7532 for (ip = pm_noinvol_head; ip; ip = ip->ni_next) { in pm_reattach_noinvol()
7536 ip->ni_persistent = 0; in pm_reattach_noinvol()
7540 for (ip = pm_noinvol_head; ip; ip = ip->ni_next) { in pm_reattach_noinvol()
7543 maj = ip->ni_major; in pm_reattach_noinvol()
7545 path = ip->ni_path; in pm_reattach_noinvol()
7546 if (path != NULL && !(ip->ni_flags & PMC_DRIVER_REMOVED)) { in pm_reattach_noinvol()
7547 if (ip->ni_persistent) { in pm_reattach_noinvol()
7555 "(%s|%d)\n", pmf, ip->ni_path, in pm_reattach_noinvol()
7558 ip->ni_path); in pm_reattach_noinvol()
7563 ip->ni_persistent++; in pm_reattach_noinvol()
7586 pmf, ip->ni_path)) in pm_reattach_noinvol()
7606 * console frame-buffer power-mgmt gets enabled when debugging
7667 DEVI(dip)->devi_pm_flags |= (PMC_CONSOLE_FB | PMC_NO_INVOL); in pm_cfb_setup()
7668 PMD(PMD_CFB, ("%s: cfb_dip -> %s@%s(%s#%d)\n", pmf, in pm_cfb_setup()
7672 PMD(PMD_CFB, ("%s: %s@%s(%s#%d) not power-managed\n", in pm_cfb_setup()
7712 cfb_inuse--; in pm_cfb_rele()
7774 * returns 1 when power is off (power-up is needed)
7775 * returns 0 when power is on (power-up not needed)
7833 pm_divertdebug--; in pm_cfb_powerup()
7839 * Check if the console framebuffer is powered up. If not power it up.
7864 * But, if the fb is powered down, this routine will be called to bring in pm_cfb_trigger()
7939 pm_bufend = pm_msgbuf + mmu_ptob(PMLOGPGS) - 1; in pm_log()
7946 if (size > (pm_bufend - pm_msgp)) { /* wraps */ in pm_log()
7947 bzero(pm_msgp, pm_bufend - pm_msgp); in pm_log()
8003 info->pmi_lp = kmem_alloc(PM_NUMCMPTS(dip) * in pm_save_direct_lvl_walk()
8005 ip = info->pmi_lp; in pm_save_direct_lvl_walk()
8007 ip = info->pmi_levels; in pm_save_direct_lvl_walk()
8018 pm_proceed(dip, PMP_RELEASE, -1, -1); in pm_save_direct_lvl_walk()
8052 ip = &info->pmi_lp[nc - 1]; in pm_restore_direct_lvl_walk()
8054 ip = &info->pmi_levels[nc - 1]; in pm_restore_direct_lvl_walk()
8065 for (i = nc - 1; i >= 0; i--, ip--) { in pm_restore_direct_lvl_walk()
8078 "%s@%s(%s#%d)[%d] exact(%d)->%d, " in pm_restore_direct_lvl_walk()
8084 kmem_free(info->pmi_lp, nc * sizeof (int)); in pm_restore_direct_lvl_walk()
8085 info->pmi_lp = NULL; in pm_restore_direct_lvl_walk()
8111 * When user calls rem_drv, we need to forget no-involuntary-power-cycles state
8147 for (ip = pm_noinvol_head; ip; pp = ip, ip = ip->ni_next) { in i_pm_driver_removed()
8148 if (major != ip->ni_major) in i_pm_driver_removed()
8151 * If it is an ancestor of no-invol node, which is in i_pm_driver_removed()
8156 ip->ni_flags |= PMC_DRIVER_REMOVED; in i_pm_driver_removed()
8159 wasvolpmd = ip->ni_wasvolpmd; in i_pm_driver_removed()
8165 pmf, ip->ni_path, pp->ni_path)) in i_pm_driver_removed()
8166 pp->ni_next = ip->ni_next; in i_pm_driver_removed()
8169 ip->ni_path)) in i_pm_driver_removed()
8171 pm_noinvol_head = ip->ni_next; in i_pm_driver_removed()
8174 adjust_ancestors(ip->ni_path, wasvolpmd); in i_pm_driver_removed()
8177 * been skipped. Adjust the no-invol counters for such skipped in i_pm_driver_removed()
8180 pm_noinvol_process_ancestors(ip->ni_path); in i_pm_driver_removed()
8181 kmem_free(ip->ni_path, ip->ni_size); in i_pm_driver_removed()
8189 * returns 1, if *aip is a ancestor of a no-invol node
8197 ASSERT(strlen(aip->ni_path) != 0); in pm_is_noinvol_ancestor()
8198 for (ip = pm_noinvol_head; ip; ip = ip->ni_next) { in pm_is_noinvol_ancestor()
8206 if ((strstr(ip->ni_path, aip->ni_path) == ip->ni_path) && in pm_is_noinvol_ancestor()
8207 (ip->ni_path[strlen(aip->ni_path)] == '/')) in pm_is_noinvol_ancestor()
8263 for (lp = pm_noinvol_head; lp; pp = lp, lp = lp->ni_next) { in adjust_ancestors()
8268 if (strcmp(pathbuf, lp->ni_path) == 0) { in adjust_ancestors()
8269 PMD(PMD_NOINVOL, ("%s: %s no %d -> %d\n", pmf, in adjust_ancestors()
8270 lp->ni_path, lp->ni_noinvolpm, in adjust_ancestors()
8271 lp->ni_noinvolpm - 1)) in adjust_ancestors()
8272 lp->ni_noinvolpm--; in adjust_ancestors()
8273 if (wasvolpmd && lp->ni_volpmd) { in adjust_ancestors()
8274 PMD(PMD_NOINVOL, ("%s: %s vol %d -> " in adjust_ancestors()
8275 "%d\n", pmf, lp->ni_path, in adjust_ancestors()
8276 lp->ni_volpmd, lp->ni_volpmd - 1)) in adjust_ancestors()
8277 lp->ni_volpmd--; in adjust_ancestors()
8281 * are no more no-invol descendants and node in adjust_ancestors()
8282 * itself is not a no-invol node. in adjust_ancestors()
8284 if (!(lp->ni_noinvolpm || in adjust_ancestors()
8285 (lp->ni_flags & PMC_NO_INVOL))) { in adjust_ancestors()
8286 ASSERT(lp->ni_volpmd == 0); in adjust_ancestors()
8290 lp->ni_path, pp->ni_path)) in adjust_ancestors()
8291 pp->ni_next = lp->ni_next; in adjust_ancestors()
8294 "head\n", pmf, lp->ni_path)) in adjust_ancestors()
8296 pm_noinvol_head = lp->ni_next; in adjust_ancestors()
8303 kmem_free(lp->ni_path, lp->ni_size); in adjust_ancestors()
8318 * Do no-invol processing for any ancestors i.e. adjust counters of ancestors,
8327 for (lp = pm_noinvol_head; lp; lp = lp->ni_next) { in pm_noinvol_process_ancestors()
8328 if (strstr(path, lp->ni_path) && in pm_noinvol_process_ancestors()
8329 (lp->ni_flags & PMC_DRIVER_REMOVED)) { in pm_noinvol_process_ancestors()
8331 i_pm_driver_removed(lp->ni_major); in pm_noinvol_process_ancestors()
8340 * "no-involuntary-power-cycles" property or we're pretending it did (console
8342 * free cycle" allowed when all such leaf nodes have voluntarily powered down
8354 for (ip = pm_noinvol_head; ip; ip = ip->ni_next) { in pm_noinvol_detached()
8355 if (strcmp(path, ip->ni_path) == 0) { in pm_noinvol_detached()
8356 if (ip->ni_flags & PMC_CONSOLE_FB) { in pm_noinvol_detached()
8363 if (ip->ni_noinvolpm != ip->ni_volpmd) in pm_noinvol_detached()
8365 "\n", pmf, ip->ni_noinvolpm, ip->ni_volpmd, in pm_noinvol_detached()
8368 ret = (ip->ni_noinvolpm != ip->ni_volpmd); in pm_noinvol_detached()
8412 e_pm_hold_rele_power(dip, -1); in pm_rele_power()
8498 pspm = (pm_sp_misc_t *)bpc->bpc_private; in pm_busop_bus_power()
8499 tdip = bpc->bpc_dip; in pm_busop_bus_power()
8514 ASSERT(pspm->pspm_direction == PM_LEVEL_UPONLY || in pm_busop_bus_power()
8515 pspm->pspm_direction == PM_LEVEL_DOWNONLY || in pm_busop_bus_power()
8516 pspm->pspm_direction == PM_LEVEL_EXACT); in pm_busop_bus_power()
8527 pm_canblock_t canblock = pspm->pspm_canblock; in pm_busop_bus_power()
8547 pspm = (pm_sp_misc_t *)bpn->bpn_private; in pm_busop_bus_power()
8550 !e_pm_valid_comp(dip, bpn->bpn_comp, &cp) || in pm_busop_bus_power()
8551 !e_pm_valid_power(dip, bpn->bpn_comp, bpn->bpn_level)) { in pm_busop_bus_power()
8554 *pspm->pspm_errnop = EIO; in pm_busop_bus_power()
8559 ASSERT(bpn->bpn_dip == dip); in pm_busop_bus_power()
8565 new_bpc.bpc_comp = bpn->bpn_comp; in pm_busop_bus_power()
8566 new_bpc.bpc_olevel = PM_CURPOWER(dip, bpn->bpn_comp); in pm_busop_bus_power()
8567 new_bpc.bpc_nlevel = bpn->bpn_level; in pm_busop_bus_power()
8568 new_bpc.bpc_private = bpn->bpn_private; in pm_busop_bus_power()
8569 ((pm_sp_misc_t *)(new_bpc.bpc_private))->pspm_direction = in pm_busop_bus_power()
8571 ((pm_sp_misc_t *)(new_bpc.bpc_private))->pspm_errnop = in pm_busop_bus_power()
8580 tdip = bpi->bpni_dip; in pm_busop_bus_power()
8624 if (cinfo && ((bpi->bpni_cmd == PM_BP_NOINVOL_REMDRV) || in pm_busop_bus_power()
8625 (bpi->bpni_cmd == PM_BP_NOINVOL_CFB))) in pm_busop_bus_power()
8647 pm_sp_misc_t *pspm = (pm_sp_misc_t *)bpc->bpc_private; in pm_busop_set_power()
8648 pm_canblock_t canblock = pspm->pspm_canblock; in pm_busop_set_power()
8649 int scan = pspm->pspm_scan; in pm_busop_set_power()
8650 int comp = bpc->bpc_comp; in pm_busop_set_power()
8651 int olevel = bpc->bpc_olevel; in pm_busop_set_power()
8652 int nlevel = bpc->bpc_nlevel; in pm_busop_set_power()
8656 int direction = pspm->pspm_direction; in pm_busop_set_power()
8657 int *errnop = pspm->pspm_errnop; in pm_busop_set_power()
8693 while (PM_ISDIRECT(dip) && !pm_processes_stopped) { in pm_busop_set_power()
8748 "dir=%s\n", pmf, PM_DEVICE(dip), comp, bpc->bpc_olevel, nlevel, in pm_busop_set_power()
8780 while (cfb_inuse) { in pm_busop_set_power()
8796 idletime = gethrestime_sec() - cp->pmc_timestamp; in pm_busop_set_power()
8798 (cp->pmc_busycount > 0) || in pm_busop_set_power()
8801 if (DEVI(dip)->devi_pm_kidsupcnt != 0) in pm_busop_set_power()
8804 if (cp->pmc_busycount > 0) in pm_busop_set_power()
8828 * Pre-adjust pm_cfb_comps_off if lowering a console fb in pm_busop_set_power()
8834 PMD(PMD_CFB, ("%s: %s@%s(%s#%d)[%d] %d->%d cfb_comps_off->%d\n", in pm_busop_set_power()
8843 * All descendents of this node should already be powered off. in pm_busop_set_power()
8861 * Post-adjust pm_cfb_comps_off if we brought an fb component in pm_busop_set_power()
8866 PMD(PMD_CFB, ("%s: %s@%s(%s#%d)[%d] %d->%d " in pm_busop_set_power()
8867 "cfb_comps_off->%d\n", pmf, PM_DEVICE(dip), in pm_busop_set_power()
8918 old = (cp->pmc_flags & PM_PHC_WHILE_SET_POWER ? in pm_busop_set_power()
8919 cp->pmc_phc_pwr : olevel); in pm_busop_set_power()
8929 next = p->ppd_next; in pm_busop_set_power()
8944 update_comps_off(-comps_off_incr, dip); in pm_busop_set_power()
8945 PMD(PMD_CFB, ("%s: %s@%s(%s#%d)[%d] %d->%d " in pm_busop_set_power()
8946 "cfb_comps_off->%d\n", pmf, PM_DEVICE(dip), in pm_busop_set_power()
8958 cp->pmc_flags &= ~PM_PHC_WHILE_SET_POWER; in pm_busop_set_power()
8967 bpc->bpc_olevel = clevel; in pm_busop_set_power()
8982 * in effect in the case of OFF->ON transition. in pm_busop_set_power()
8988 * If the power transition was an ON->OFF transition, in pm_busop_set_power()
9012 pm_sp_misc_t *pspm = (pm_sp_misc_t *)bpc->bpc_private; in pm_busop_match_request()
9013 int comp = bpc->bpc_comp; in pm_busop_match_request()
9014 int nlevel = bpc->bpc_nlevel; in pm_busop_match_request()
9015 pm_canblock_t canblock = pspm->pspm_canblock; in pm_busop_match_request()
9016 int direction = pspm->pspm_direction; in pm_busop_match_request()
9093 "->%d failure result %d\n", pmf, PM_DEVICE(dip), in pm_all_to_normal_nexus()
9135 switch (req->bpni_cmd) { in pm_noinvol_update_node()
9138 "noinvol %d->%d\n", pmf, PM_DEVICE(dip), in pm_noinvol_update_node()
9139 DEVI(dip)->devi_pm_noinvolpm, in pm_noinvol_update_node()
9140 DEVI(dip)->devi_pm_noinvolpm - 1)) in pm_noinvol_update_node()
9141 ASSERT(DEVI(dip)->devi_pm_noinvolpm); in pm_noinvol_update_node()
9143 DEVI(dip)->devi_pm_noinvolpm--; in pm_noinvol_update_node()
9144 if (req->bpni_wasvolpmd) { in pm_noinvol_update_node()
9146 "%s@%s(%s#%d) volpmd %d->%d\n", pmf, in pm_noinvol_update_node()
9147 PM_DEVICE(dip), DEVI(dip)->devi_pm_volpmd, in pm_noinvol_update_node()
9148 DEVI(dip)->devi_pm_volpmd - 1)) in pm_noinvol_update_node()
9149 if (DEVI(dip)->devi_pm_volpmd) in pm_noinvol_update_node()
9150 DEVI(dip)->devi_pm_volpmd--; in pm_noinvol_update_node()
9157 "noinvolpm %d->%d\n", pmf, PM_DEVICE(dip), in pm_noinvol_update_node()
9158 DEVI(dip)->devi_pm_noinvolpm, in pm_noinvol_update_node()
9159 DEVI(dip)->devi_pm_noinvolpm + 1)) in pm_noinvol_update_node()
9161 DEVI(dip)->devi_pm_noinvolpm++; in pm_noinvol_update_node()
9162 if (req->bpni_wasvolpmd) { in pm_noinvol_update_node()
9164 "%s@%s(%s#%d) volpmd %d->%d\n", pmf, in pm_noinvol_update_node()
9165 PM_DEVICE(dip), DEVI(dip)->devi_pm_volpmd, in pm_noinvol_update_node()
9166 DEVI(dip)->devi_pm_volpmd + 1)) in pm_noinvol_update_node()
9167 DEVI(dip)->devi_pm_volpmd++; in pm_noinvol_update_node()
9174 "noinvol %d->%d\n", pmf, PM_DEVICE(dip), in pm_noinvol_update_node()
9175 DEVI(dip)->devi_pm_noinvolpm, in pm_noinvol_update_node()
9176 DEVI(dip)->devi_pm_noinvolpm - 1)) in pm_noinvol_update_node()
9177 ASSERT(DEVI(dip)->devi_pm_noinvolpm); in pm_noinvol_update_node()
9179 DEVI(dip)->devi_pm_noinvolpm--; in pm_noinvol_update_node()
9180 if (req->bpni_wasvolpmd) { in pm_noinvol_update_node()
9183 "volpmd %d->%d\n", pmf, PM_DEVICE(dip), in pm_noinvol_update_node()
9184 DEVI(dip)->devi_pm_volpmd, in pm_noinvol_update_node()
9185 DEVI(dip)->devi_pm_volpmd - 1)) in pm_noinvol_update_node()
9191 if (DEVI(dip)->devi_pm_volpmd) in pm_noinvol_update_node()
9192 DEVI(dip)->devi_pm_volpmd--; in pm_noinvol_update_node()
9199 ("%s: PM_BP_NOIVOL_CFB %s@%s(%s#%d) noinvol %d->%d\n", in pm_noinvol_update_node()
9200 pmf, PM_DEVICE(dip), DEVI(dip)->devi_pm_noinvolpm, in pm_noinvol_update_node()
9201 DEVI(dip)->devi_pm_noinvolpm + 1)) in pm_noinvol_update_node()
9203 DEVI(dip)->devi_pm_noinvolpm++; in pm_noinvol_update_node()
9209 ("%s: PM_BP_NOIVOL_PWR %s@%s(%s#%d) volpmd %d->%d\n", in pm_noinvol_update_node()
9211 DEVI(dip)->devi_pm_volpmd, DEVI(dip)->devi_pm_volpmd - in pm_noinvol_update_node()
9212 req->bpni_volpmd)) in pm_noinvol_update_node()
9214 DEVI(dip)->devi_pm_volpmd -= req->bpni_volpmd; in pm_noinvol_update_node()
9244 ce_level = (pdpchk->pdpc_par_involved == 0) ? CE_PANIC : in pm_desc_pwrchk_walk()
9246 PMD(PMD_SET, ("%s: %s@%s(%s#%d) is powered off while desc " in pm_desc_pwrchk_walk()
9248 PM_DEVICE(pdpchk->pdpc_dip), PM_DEVICE(dip), i, curpwr)) in pm_desc_pwrchk_walk()
9249 cmn_err(ce_level, "!device %s@%s(%s#%d) is powered on, " in pm_desc_pwrchk_walk()
9250 "while its ancestor, %s@%s(%s#%d), is powering off!", in pm_desc_pwrchk_walk()
9251 PM_DEVICE(dip), PM_DEVICE(pdpchk->pdpc_dip)); in pm_desc_pwrchk_walk()
9268 cur->pmlk_borrower = curthread; in pm_borrow_lock()
9269 cur->pmlk_lender = lender; in pm_borrow_lock()
9271 cur->pmlk_next = prev->pmlk_next; in pm_borrow_lock()
9272 prev->pmlk_next = cur; in pm_borrow_lock()
9286 ASSERT(prev->pmlk_next != NULL); in pm_return_lock()
9287 for (cur = prev->pmlk_next; cur; prev = cur, cur = cur->pmlk_next) in pm_return_lock()
9288 if (cur->pmlk_borrower == curthread) in pm_return_lock()
9292 prev->pmlk_next = cur->pmlk_next; in pm_return_lock()
9308 while ((inb(CPR_LSTAT) & CPR_RXR) != CPR_RXR) in pm_getchar()
9318 while ((inb(CPR_LSTAT) & CPR_TXR) == 0) in pm_putchar()
9327 while (*s) { in pm_printf()
9344 ASSERT(DEVI(ddi_root_node())->devi_pm_ppm); in pm_ppm_searchlist()
9345 ret = pm_ctlops((dev_info_t *)DEVI(ddi_root_node())->devi_pm_ppm, in pm_ppm_searchlist()