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