PciPowerManagement.c revision d8bee43ce44db3012de2274b135ede6d06106f7d
110590588cce553a3d8d304974982845682cbce5bklu/*++ 210590588cce553a3d8d304974982845682cbce5bklu 310590588cce553a3d8d304974982845682cbce5bkluCopyright (c) 2005 - 2006, Intel Corporation 410590588cce553a3d8d304974982845682cbce5bkluAll rights reserved. This 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; 4910590588cce553a3d8d304974982845682cbce5bklu UINT16 PMCSR; 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 PMCSR = 0x8000; 6810590588cce553a3d8d304974982845682cbce5bklu 6910590588cce553a3d8d304974982845682cbce5bklu // 7010590588cce553a3d8d304974982845682cbce5bklu // Write PMCSR 7110590588cce553a3d8d304974982845682cbce5bklu // 7210590588cce553a3d8d304974982845682cbce5bklu PciIoDevice->PciIo.Pci.Write ( 7310590588cce553a3d8d304974982845682cbce5bklu &PciIoDevice->PciIo, 7410590588cce553a3d8d304974982845682cbce5bklu EfiPciIoWidthUint16, 7510590588cce553a3d8d304974982845682cbce5bklu PowerManagementRegBlock + 4, 7610590588cce553a3d8d304974982845682cbce5bklu 1, 7710590588cce553a3d8d304974982845682cbce5bklu &PMCSR 7810590588cce553a3d8d304974982845682cbce5bklu ); 7910590588cce553a3d8d304974982845682cbce5bklu 8010590588cce553a3d8d304974982845682cbce5bklu return EFI_SUCCESS; 8110590588cce553a3d8d304974982845682cbce5bklu} 82