110590588cce553a3d8d304974982845682cbce5bklu/*++ 210590588cce553a3d8d304974982845682cbce5bklu 37e242786b7f9200f505514218642622f8bde01fbrsunCopyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR> 4b1f700a8593435e2bdc8f9b3dc21bced4774c80fhhtianThis program and the accompanying materials 510590588cce553a3d8d304974982845682cbce5bkluare licensed and made available under the terms and conditions of the BSD License 610590588cce553a3d8d304974982845682cbce5bkluwhich accompanies this distribution. The full text of the license may be found at 710590588cce553a3d8d304974982845682cbce5bkluhttp://opensource.org/licenses/bsd-license.php 810590588cce553a3d8d304974982845682cbce5bklu 910590588cce553a3d8d304974982845682cbce5bkluTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 1010590588cce553a3d8d304974982845682cbce5bkluWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 1110590588cce553a3d8d304974982845682cbce5bklu 1210590588cce553a3d8d304974982845682cbce5bkluModule Name: 1310590588cce553a3d8d304974982845682cbce5bklu 1410590588cce553a3d8d304974982845682cbce5bklu PciPowerManagement.c 1510590588cce553a3d8d304974982845682cbce5bklu 1610590588cce553a3d8d304974982845682cbce5bkluAbstract: 1710590588cce553a3d8d304974982845682cbce5bklu 1810590588cce553a3d8d304974982845682cbce5bklu PCI Bus Driver 1910590588cce553a3d8d304974982845682cbce5bklu 2010590588cce553a3d8d304974982845682cbce5bkluRevision History 2110590588cce553a3d8d304974982845682cbce5bklu 2210590588cce553a3d8d304974982845682cbce5bklu--*/ 2310590588cce553a3d8d304974982845682cbce5bklu 24d8bee43ce44db3012de2274b135ede6d06106f7deric_tian#include "PciBus.h" 2510590588cce553a3d8d304974982845682cbce5bklu 2610590588cce553a3d8d304974982845682cbce5bkluEFI_STATUS 27d8bee43ce44db3012de2274b135ede6d06106f7deric_tianEFIAPI 2810590588cce553a3d8d304974982845682cbce5bkluResetPowerManagementFeature ( 2910590588cce553a3d8d304974982845682cbce5bklu IN PCI_IO_DEVICE *PciIoDevice 3010590588cce553a3d8d304974982845682cbce5bklu ) 3110590588cce553a3d8d304974982845682cbce5bklu/*++ 3210590588cce553a3d8d304974982845682cbce5bklu 3310590588cce553a3d8d304974982845682cbce5bkluRoutine Description: 3410590588cce553a3d8d304974982845682cbce5bklu 3510590588cce553a3d8d304974982845682cbce5bklu This function is intended to turn off PWE assertion and 3610590588cce553a3d8d304974982845682cbce5bklu put the device to D0 state if the device supports 3710590588cce553a3d8d304974982845682cbce5bklu PCI Power Management. 3810590588cce553a3d8d304974982845682cbce5bklu 3910590588cce553a3d8d304974982845682cbce5bkluArguments: 4010590588cce553a3d8d304974982845682cbce5bklu 4110590588cce553a3d8d304974982845682cbce5bkluReturns: 4210590588cce553a3d8d304974982845682cbce5bklu 4310590588cce553a3d8d304974982845682cbce5bklu None 4410590588cce553a3d8d304974982845682cbce5bklu 4510590588cce553a3d8d304974982845682cbce5bklu--*/ 4610590588cce553a3d8d304974982845682cbce5bklu{ 4710590588cce553a3d8d304974982845682cbce5bklu EFI_STATUS Status; 4810590588cce553a3d8d304974982845682cbce5bklu UINT8 PowerManagementRegBlock; 497e242786b7f9200f505514218642622f8bde01fbrsun UINT16 PowerManagementCSR; 5010590588cce553a3d8d304974982845682cbce5bklu 5110590588cce553a3d8d304974982845682cbce5bklu PowerManagementRegBlock = 0; 5210590588cce553a3d8d304974982845682cbce5bklu 5310590588cce553a3d8d304974982845682cbce5bklu Status = LocateCapabilityRegBlock ( 5410590588cce553a3d8d304974982845682cbce5bklu PciIoDevice, 5510590588cce553a3d8d304974982845682cbce5bklu EFI_PCI_CAPABILITY_ID_PMI, 5610590588cce553a3d8d304974982845682cbce5bklu &PowerManagementRegBlock, 5710590588cce553a3d8d304974982845682cbce5bklu NULL 5810590588cce553a3d8d304974982845682cbce5bklu ); 5910590588cce553a3d8d304974982845682cbce5bklu 6010590588cce553a3d8d304974982845682cbce5bklu if (EFI_ERROR (Status)) { 6110590588cce553a3d8d304974982845682cbce5bklu return EFI_UNSUPPORTED; 6210590588cce553a3d8d304974982845682cbce5bklu } 6310590588cce553a3d8d304974982845682cbce5bklu 6410590588cce553a3d8d304974982845682cbce5bklu // 6510590588cce553a3d8d304974982845682cbce5bklu // Turn off the PWE assertion and put the device into D0 State 6610590588cce553a3d8d304974982845682cbce5bklu // 6710590588cce553a3d8d304974982845682cbce5bklu 6810590588cce553a3d8d304974982845682cbce5bklu // 697e242786b7f9200f505514218642622f8bde01fbrsun // Read PMCSR 7010590588cce553a3d8d304974982845682cbce5bklu // 717e242786b7f9200f505514218642622f8bde01fbrsun Status = PciIoDevice->PciIo.Pci.Read ( 727e242786b7f9200f505514218642622f8bde01fbrsun &PciIoDevice->PciIo, 737e242786b7f9200f505514218642622f8bde01fbrsun EfiPciIoWidthUint16, 747e242786b7f9200f505514218642622f8bde01fbrsun PowerManagementRegBlock + 4, 757e242786b7f9200f505514218642622f8bde01fbrsun 1, 767e242786b7f9200f505514218642622f8bde01fbrsun &PowerManagementCSR 777e242786b7f9200f505514218642622f8bde01fbrsun ); 787e242786b7f9200f505514218642622f8bde01fbrsun if (!EFI_ERROR (Status)) { 797e242786b7f9200f505514218642622f8bde01fbrsun // 807e242786b7f9200f505514218642622f8bde01fbrsun // Clear PME_Status bit 817e242786b7f9200f505514218642622f8bde01fbrsun // 827e242786b7f9200f505514218642622f8bde01fbrsun PowerManagementCSR |= BIT15; 837e242786b7f9200f505514218642622f8bde01fbrsun // 847e242786b7f9200f505514218642622f8bde01fbrsun // Clear PME_En bit. PowerState = D0. 857e242786b7f9200f505514218642622f8bde01fbrsun // 867e242786b7f9200f505514218642622f8bde01fbrsun PowerManagementCSR &= ~(BIT8 | BIT1 | BIT0); 877e242786b7f9200f505514218642622f8bde01fbrsun 887e242786b7f9200f505514218642622f8bde01fbrsun // 897e242786b7f9200f505514218642622f8bde01fbrsun // Write PMCSR 907e242786b7f9200f505514218642622f8bde01fbrsun // 917e242786b7f9200f505514218642622f8bde01fbrsun Status = PciIoDevice->PciIo.Pci.Write ( 927e242786b7f9200f505514218642622f8bde01fbrsun &PciIoDevice->PciIo, 937e242786b7f9200f505514218642622f8bde01fbrsun EfiPciIoWidthUint16, 947e242786b7f9200f505514218642622f8bde01fbrsun PowerManagementRegBlock + 4, 957e242786b7f9200f505514218642622f8bde01fbrsun 1, 967e242786b7f9200f505514218642622f8bde01fbrsun &PowerManagementCSR 977e242786b7f9200f505514218642622f8bde01fbrsun ); 987e242786b7f9200f505514218642622f8bde01fbrsun } 997e242786b7f9200f505514218642622f8bde01fbrsun return Status; 10010590588cce553a3d8d304974982845682cbce5bklu} 101