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