int pcisetpms(Pcidev* p, int state) { int pmc, pmcsr, ptr; if((ptr = pcicap(p, PciCapPMG)) == -1) return -1; pmc = pcicfgr16(p, ptr+Pmgcap); pmcsr = pcicfgr16(p, ptr+Pmgctl); switch(state){ default: return -1; case 0: break; case 1: if(!(pmc & 0x0200)) return -1; break; case 2: if(!(pmc & 0x0400)) return -1; break; case 3: break; } pcicfgw16(p, ptr+4, (pmcsr & ~3) | state); return pmcsr & 3; }
int pcigetpms(Pcidev* p) { int ptr; if((ptr = pcicap(p, PciCapPMG)) == -1) return -1; return pcicfgr16(p, ptr+Pmgctl) & 0x0003; }
static char* powermode(Ctlr *ctlr) { uchar c[Tcmdsize]; int capoff, reg; memset(c, 0, sizeof(c)); capoff = pcicap(ctlr->pdev, PciCapPCIe); if(capoff >= 0){ reg = pcicfgr8(ctlr->pdev, capoff+1); if((reg & 1) == 0) /* PCI_PCIE_LCR_ASPM_L0S */ c[0] |= 1<<3; /* WPI_PS_PCI_PMGT */ } return cmd(ctlr, 119, c, 4*(3+5)); }