SPDX: Convert all of our single license tags to Linux Kernel style
[oweals/u-boot.git] / arch / x86 / cpu / intel_common / me_status.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * From Coreboot src/southbridge/intel/bd82x6x/me_status.c
4  *
5  * Copyright (C) 2011 The Chromium OS Authors. All rights reserved.
6  */
7
8 #include <common.h>
9 #include <asm/arch/me.h>
10
11 /* HFS1[3:0] Current Working State Values */
12 static const char *const me_cws_values[] = {
13         [ME_HFS_CWS_RESET]      = "Reset",
14         [ME_HFS_CWS_INIT]       = "Initializing",
15         [ME_HFS_CWS_REC]        = "Recovery",
16         [ME_HFS_CWS_NORMAL]     = "Normal",
17         [ME_HFS_CWS_WAIT]       = "Platform Disable Wait",
18         [ME_HFS_CWS_TRANS]      = "OP State Transition",
19         [ME_HFS_CWS_INVALID]    = "Invalid CPU Plugged In"
20 };
21
22 /* HFS1[8:6] Current Operation State Values */
23 static const char *const me_opstate_values[] = {
24         [ME_HFS_STATE_PREBOOT]  = "Preboot",
25         [ME_HFS_STATE_M0_UMA]   = "M0 with UMA",
26         [ME_HFS_STATE_M3]       = "M3 without UMA",
27         [ME_HFS_STATE_M0]       = "M0 without UMA",
28         [ME_HFS_STATE_BRINGUP]  = "Bring up",
29         [ME_HFS_STATE_ERROR]    = "M0 without UMA but with error"
30 };
31
32 /* HFS[19:16] Current Operation Mode Values */
33 static const char *const me_opmode_values[] = {
34         [ME_HFS_MODE_NORMAL]    = "Normal",
35         [ME_HFS_MODE_DEBUG]     = "Debug",
36         [ME_HFS_MODE_DIS]       = "Soft Temporary Disable",
37         [ME_HFS_MODE_OVER_JMPR] = "Security Override via Jumper",
38         [ME_HFS_MODE_OVER_MEI]  = "Security Override via MEI Message"
39 };
40
41 /* HFS[15:12] Error Code Values */
42 static const char *const me_error_values[] = {
43         [ME_HFS_ERROR_NONE]     = "No Error",
44         [ME_HFS_ERROR_UNCAT]    = "Uncategorized Failure",
45         [ME_HFS_ERROR_IMAGE]    = "Image Failure",
46         [ME_HFS_ERROR_DEBUG]    = "Debug Failure"
47 };
48
49 /* GMES[31:28] ME Progress Code */
50 static const char *const me_progress_values[] = {
51         [ME_GMES_PHASE_ROM]     = "ROM Phase",
52         [ME_GMES_PHASE_BUP]     = "BUP Phase",
53         [ME_GMES_PHASE_UKERNEL] = "uKernel Phase",
54         [ME_GMES_PHASE_POLICY]  = "Policy Module",
55         [ME_GMES_PHASE_MODULE]  = "Module Loading",
56         [ME_GMES_PHASE_UNKNOWN] = "Unknown",
57         [ME_GMES_PHASE_HOST]    = "Host Communication"
58 };
59
60 /* GMES[27:24] Power Management Event */
61 static const char *const me_pmevent_values[] = {
62         [0x00] = "Clean Moff->Mx wake",
63         [0x01] = "Moff->Mx wake after an error",
64         [0x02] = "Clean global reset",
65         [0x03] = "Global reset after an error",
66         [0x04] = "Clean Intel ME reset",
67         [0x05] = "Intel ME reset due to exception",
68         [0x06] = "Pseudo-global reset",
69         [0x07] = "S0/M0->Sx/M3",
70         [0x08] = "Sx/M3->S0/M0",
71         [0x09] = "Non-power cycle reset",
72         [0x0a] = "Power cycle reset through M3",
73         [0x0b] = "Power cycle reset through Moff",
74         [0x0c] = "Sx/Mx->Sx/Moff"
75 };
76
77 /* Progress Code 0 states */
78 static const char *const me_progress_rom_values[] = {
79         [0x00] = "BEGIN",
80         [0x06] = "DISABLE"
81 };
82
83 /* Progress Code 1 states */
84 static const char *const me_progress_bup_values[] = {
85         [0x00] = "Initialization starts",
86         [0x01] = "Disable the host wake event",
87         [0x04] = "Flow determination start process",
88         [0x08] = "Error reading/matching the VSCC table in the descriptor",
89         [0x0a] = "Check to see if straps say ME DISABLED",
90         [0x0b] = "Timeout waiting for PWROK",
91         [0x0d] = "Possibly handle BUP manufacturing override strap",
92         [0x11] = "Bringup in M3",
93         [0x12] = "Bringup in M0",
94         [0x13] = "Flow detection error",
95         [0x15] = "M3 clock switching error",
96         [0x18] = "M3 kernel load",
97         [0x1c] = "T34 missing - cannot program ICC",
98         [0x1f] = "Waiting for DID BIOS message",
99         [0x20] = "Waiting for DID BIOS message failure",
100         [0x21] = "DID reported an error",
101         [0x22] = "Enabling UMA",
102         [0x23] = "Enabling UMA error",
103         [0x24] = "Sending DID Ack to BIOS",
104         [0x25] = "Sending DID Ack to BIOS error",
105         [0x26] = "Switching clocks in M0",
106         [0x27] = "Switching clocks in M0 error",
107         [0x28] = "ME in temp disable",
108         [0x32] = "M0 kernel load",
109 };
110
111 /* Progress Code 3 states */
112 static const char *const me_progress_policy_values[] = {
113         [0x00] = "Entery into Policy Module",
114         [0x03] = "Received S3 entry",
115         [0x04] = "Received S4 entry",
116         [0x05] = "Received S5 entry",
117         [0x06] = "Received UPD entry",
118         [0x07] = "Received PCR entry",
119         [0x08] = "Received NPCR entry",
120         [0x09] = "Received host wake",
121         [0x0a] = "Received AC<>DC switch",
122         [0x0b] = "Received DRAM Init Done",
123         [0x0c] = "VSCC Data not found for flash device",
124         [0x0d] = "VSCC Table is not valid",
125         [0x0e] = "Flash Partition Boundary is outside address space",
126         [0x0f] = "ME cannot access the chipset descriptor region",
127         [0x10] = "Required VSCC values for flash parts do not match",
128 };
129
130
131 /**
132  * _intel_me_status() - Check Intel Management Engine status
133  *
134  * struct hfs:  Firmware status
135  * struct gmes: Management engine status
136  */
137 static void _intel_me_status(struct me_hfs *hfs, struct me_gmes *gmes)
138 {
139         /* Check Current States */
140         debug("ME: FW Partition Table      : %s\n",
141               hfs->fpt_bad ? "BAD" : "OK");
142         debug("ME: Bringup Loader Failure  : %s\n",
143               hfs->ft_bup_ld_flr ? "YES" : "NO");
144         debug("ME: Firmware Init Complete  : %s\n",
145               hfs->fw_init_complete ? "YES" : "NO");
146         debug("ME: Manufacturing Mode      : %s\n",
147               hfs->mfg_mode ? "YES" : "NO");
148         debug("ME: Boot Options Present    : %s\n",
149               hfs->boot_options_present ? "YES" : "NO");
150         debug("ME: Update In Progress      : %s\n",
151               hfs->update_in_progress ? "YES" : "NO");
152         debug("ME: Current Working State   : %s\n",
153               me_cws_values[hfs->working_state]);
154         debug("ME: Current Operation State : %s\n",
155               me_opstate_values[hfs->operation_state]);
156         debug("ME: Current Operation Mode  : %s\n",
157               me_opmode_values[hfs->operation_mode]);
158         debug("ME: Error Code              : %s\n",
159               me_error_values[hfs->error_code]);
160         debug("ME: Progress Phase          : %s\n",
161               me_progress_values[gmes->progress_code]);
162         debug("ME: Power Management Event  : %s\n",
163               me_pmevent_values[gmes->current_pmevent]);
164
165         debug("ME: Progress Phase State    : ");
166         switch (gmes->progress_code) {
167         case ME_GMES_PHASE_ROM:         /* ROM Phase */
168                 debug("%s", me_progress_rom_values[gmes->current_state]);
169                 break;
170
171         case ME_GMES_PHASE_BUP:         /* Bringup Phase */
172                 if (gmes->current_state < ARRAY_SIZE(me_progress_bup_values) &&
173                     me_progress_bup_values[gmes->current_state])
174                         debug("%s",
175                               me_progress_bup_values[gmes->current_state]);
176                 else
177                         debug("0x%02x", gmes->current_state);
178                 break;
179
180         case ME_GMES_PHASE_POLICY:      /* Policy Module Phase */
181                 if (gmes->current_state <
182                                 ARRAY_SIZE(me_progress_policy_values) &&
183                     me_progress_policy_values[gmes->current_state])
184                         debug("%s",
185                               me_progress_policy_values[gmes->current_state]);
186                 else
187                         debug("0x%02x", gmes->current_state);
188                 break;
189
190         case ME_GMES_PHASE_HOST:        /* Host Communication Phase */
191                 if (!gmes->current_state)
192                         debug("Host communication established");
193                 else
194                         debug("0x%02x", gmes->current_state);
195                 break;
196
197         default:
198                 debug("Unknown 0x%02x", gmes->current_state);
199         }
200         debug("\n");
201 }
202
203 void intel_me_status(struct udevice *me_dev)
204 {
205         struct me_hfs hfs;
206         struct me_gmes gmes;
207
208         pci_read_dword_ptr(me_dev, &hfs, PCI_ME_HFS);
209         pci_read_dword_ptr(me_dev, &gmes, PCI_ME_GMES);
210
211         _intel_me_status(&hfs, &gmes);
212 }