1 /*++
2
3 Copyright (c) 2005 - 2012, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 PciPowerManagement.c
15
16 Abstract:
17
18 PCI Bus Driver
19
20 Revision History
21
22 --*/
23
24 #include "PciBus.h"
25
26 EFI_STATUS
27 EFIAPI
ResetPowerManagementFeature(IN PCI_IO_DEVICE * PciIoDevice)28 ResetPowerManagementFeature (
29 IN PCI_IO_DEVICE *PciIoDevice
30 )
31 /*++
32
33 Routine Description:
34
35 This function is intended to turn off PWE assertion and
36 put the device to D0 state if the device supports
37 PCI Power Management.
38
39 Arguments:
40
41 Returns:
42
43 None
44
45 --*/
46 {
47 EFI_STATUS Status;
48 UINT8 PowerManagementRegBlock;
49 UINT16 PowerManagementCSR;
50
51 PowerManagementRegBlock = 0;
52
53 Status = LocateCapabilityRegBlock (
54 PciIoDevice,
55 EFI_PCI_CAPABILITY_ID_PMI,
56 &PowerManagementRegBlock,
57 NULL
58 );
59
60 if (EFI_ERROR (Status)) {
61 return EFI_UNSUPPORTED;
62 }
63
64 //
65 // Turn off the PWE assertion and put the device into D0 State
66 //
67
68 //
69 // Read PMCSR
70 //
71 Status = PciIoDevice->PciIo.Pci.Read (
72 &PciIoDevice->PciIo,
73 EfiPciIoWidthUint16,
74 PowerManagementRegBlock + 4,
75 1,
76 &PowerManagementCSR
77 );
78 if (!EFI_ERROR (Status)) {
79 //
80 // Clear PME_Status bit
81 //
82 PowerManagementCSR |= BIT15;
83 //
84 // Clear PME_En bit. PowerState = D0.
85 //
86 PowerManagementCSR &= ~(BIT8 | BIT1 | BIT0);
87
88 //
89 // Write PMCSR
90 //
91 Status = PciIoDevice->PciIo.Pci.Write (
92 &PciIoDevice->PciIo,
93 EfiPciIoWidthUint16,
94 PowerManagementRegBlock + 4,
95 1,
96 &PowerManagementCSR
97 );
98 }
99 return Status;
100 }
101