blob: f7ac7ceb428acb6593c5c5605ae0a6b14de4388d [file] [log] [blame]
Patrick Georgiea063cb2020-05-08 19:28:13 +02001/* inteltool - dump all registers on an Intel CPU + chipset based system */
Patrick Georgi7333a112020-05-08 20:48:04 +02002/* SPDX-License-Identifier: GPL-2.0-only */
Nico Huber18980232017-04-07 12:26:07 +02003
4#include <stdio.h>
5#include <stdlib.h>
6#include <stddef.h>
7#include <stdint.h>
8#include <assert.h>
9#include <inttypes.h>
10#include "inteltool.h"
11#include "pcr.h"
12
Johanna Schanderf80c5d92020-01-29 09:20:23 +010013#include "gpio_names/apollolake.h"
Johanna Schanderd5a65302020-01-29 09:16:06 +010014#include "gpio_names/cannonlake.h"
Matt DeVillier3c784452019-06-11 23:23:46 -050015#include "gpio_names/cannonlake_lp.h"
Johanna Schander7da602f2020-01-29 09:51:25 +010016#include "gpio_names/denverton.h"
Sean Rhodes645dde72021-10-22 09:31:22 +010017#include "gpio_names/geminilake.h"
Johanna Schanderdca20cd2020-01-29 09:14:18 +010018#include "gpio_names/icelake.h"
Johanna Schanderaff7d1f2020-01-29 09:29:39 +010019#include "gpio_names/lewisburg.h"
Christian Walter1364ac32022-09-08 11:44:19 +020020#include "gpio_names/emmitsburg.h"
Johanna Schandere98af862020-01-29 09:25:45 +010021#include "gpio_names/sunrise.h"
Michał Żygowski8ac40f32021-07-09 16:00:16 +020022#include "gpio_names/tigerlake.h"
Brandon Weeks7ee7b132023-12-26 15:55:03 -080023#include "gpio_names/alderlake_n.h"
Michał Kopeć2d8edeb2022-04-05 10:40:03 +020024#include "gpio_names/alderlake_h.h"
Kacper Stojekfb9110b2022-08-17 10:28:20 +020025#include "gpio_names/alderlake_p.h"
Kacper Stojek76d2b662022-10-17 14:30:24 +020026#include "gpio_names/elkhartlake.h"
Karol Zmyslowskib2f5a222023-03-10 19:44:04 +010027#include "gpio_names/jasperlake.h"
Johanna Schanderdca20cd2020-01-29 09:14:18 +010028
Nico Huber18980232017-04-07 12:26:07 +020029#define SBBAR_SIZE (16 * MiB)
30#define PCR_PORT_SIZE (64 * KiB)
31
Nico Huber18980232017-04-07 12:26:07 +020032static const char *decode_pad_mode(const struct gpio_group *const group,
33 const size_t pad, const uint32_t dw0)
34{
35 const size_t pad_mode = dw0 >> 10 & 7;
Nico Huber8a95c6c2018-11-27 12:27:22 +010036 const char *const pad_name =
37 group->pad_names[pad * group->func_count + pad_mode];
38
Nico Huber18980232017-04-07 12:26:07 +020039 if (!pad_mode)
Nico Huber8a95c6c2018-11-27 12:27:22 +010040 return pad_name[0] == '*' ? "*GPIO" : "GPIO";
Nico Huber18980232017-04-07 12:26:07 +020041 else if (pad_mode < group->func_count)
42 return group->pad_names[pad * group->func_count + pad_mode];
43 else
44 return "RESERVED";
45}
46
47static void print_gpio_group(const uint8_t pid, size_t pad_cfg,
Thomas Heijligen725369f2019-02-19 10:51:34 +000048 const struct gpio_group *const group,
49 size_t pad_stepping)
Nico Huber18980232017-04-07 12:26:07 +020050{
51 size_t p;
52
53 printf("%s\n", group->display);
54
Thomas Heijligen725369f2019-02-19 10:51:34 +000055 for (p = 0; p < group->pad_count; ++p, pad_cfg += pad_stepping) {
Nico Huber18980232017-04-07 12:26:07 +020056 const uint32_t dw0 = read_pcr32(pid, pad_cfg);
57 const uint32_t dw1 = read_pcr32(pid, pad_cfg + 4);
Nico Huber8a95c6c2018-11-27 12:27:22 +010058 const char *const pad_name =
59 group->pad_names[p * group->func_count];
Nico Huber18980232017-04-07 12:26:07 +020060
Nico Huber8a95c6c2018-11-27 12:27:22 +010061 printf("0x%04zx: 0x%016"PRIx64" %-12s %-20s\n", pad_cfg,
Nico Huber18980232017-04-07 12:26:07 +020062 (uint64_t)dw1 << 32 | dw0,
Nico Huber8a95c6c2018-11-27 12:27:22 +010063 pad_name[0] == '*' ? &pad_name[1] : pad_name,
Nico Huber18980232017-04-07 12:26:07 +020064 decode_pad_mode(group, p, dw0));
65 }
66}
67
Thomas Heijligen725369f2019-02-19 10:51:34 +000068static void print_gpio_community(const struct gpio_community *const community,
69 size_t pad_stepping)
Nico Huber18980232017-04-07 12:26:07 +020070{
71 size_t group, pad_count;
72 size_t pad_cfg; /* offset in bytes under this communities PCR port */
73
74 printf("%s\n\nPCR Port ID: 0x%06zx\n\n",
75 community->name, (size_t)community->pcr_port_id << 16);
76
77 for (group = 0, pad_count = 0; group < community->group_count; ++group)
78 pad_count += community->groups[group]->pad_count;
79 assert(pad_count * 8 <= PCR_PORT_SIZE - 0x10);
80
81 pad_cfg = read_pcr32(community->pcr_port_id, 0x0c);
82 if (pad_cfg + pad_count * 8 > PCR_PORT_SIZE) {
83 fprintf(stderr, "Bad Pad Base Address: 0x%08zx\n", pad_cfg);
84 return;
85 }
86
87 for (group = 0; group < community->group_count; ++group) {
Christian Walter1364ac32022-09-08 11:44:19 +020088 if (community->groups[group]->pad_offset)
89 pad_cfg = community->groups[group]->pad_offset;
Nico Huber18980232017-04-07 12:26:07 +020090 print_gpio_group(community->pcr_port_id,
Thomas Heijligen725369f2019-02-19 10:51:34 +000091 pad_cfg, community->groups[group],
92 pad_stepping);
93 pad_cfg += community->groups[group]->pad_count * pad_stepping;
Nico Huber18980232017-04-07 12:26:07 +020094 }
95}
96
Johanna Schandere32ded82020-01-29 10:08:17 +010097const struct gpio_community *const *get_gpio_communities(struct pci_dev *const sb,
98 size_t* community_count,
99 size_t* pad_stepping)
Nico Huber18980232017-04-07 12:26:07 +0200100{
Johanna Schandere32ded82020-01-29 10:08:17 +0100101 *pad_stepping = 8;
Nico Huber18980232017-04-07 12:26:07 +0200102
103 switch (sb->device_id) {
Pavel Sayekat9429b702019-07-28 23:09:08 +0600104 case PCI_DEVICE_ID_INTEL_H110:
Felix Singerf98dc482019-07-29 21:53:14 +0200105 case PCI_DEVICE_ID_INTEL_H170:
106 case PCI_DEVICE_ID_INTEL_Z170:
107 case PCI_DEVICE_ID_INTEL_Q170:
108 case PCI_DEVICE_ID_INTEL_Q150:
Nico Huber54fe32f2017-10-03 16:03:07 +0200109 case PCI_DEVICE_ID_INTEL_B150:
Christian Walter9a8c5e72019-05-06 17:50:57 +0200110 case PCI_DEVICE_ID_INTEL_C236:
Felix Singerf98dc482019-07-29 21:53:14 +0200111 case PCI_DEVICE_ID_INTEL_C232:
112 case PCI_DEVICE_ID_INTEL_QM170:
113 case PCI_DEVICE_ID_INTEL_HM170:
114 case PCI_DEVICE_ID_INTEL_CM236:
Timofey Komarov6c800822021-06-25 12:07:32 +0300115 case PCI_DEVICE_ID_INTEL_H270:
116 case PCI_DEVICE_ID_INTEL_Z270:
117 case PCI_DEVICE_ID_INTEL_Q270:
118 case PCI_DEVICE_ID_INTEL_Q250:
119 case PCI_DEVICE_ID_INTEL_B250:
120 case PCI_DEVICE_ID_INTEL_Z370:
121 case PCI_DEVICE_ID_INTEL_H310C:
122 case PCI_DEVICE_ID_INTEL_X299:
Johanna Schandere32ded82020-01-29 10:08:17 +0100123 *community_count = ARRAY_SIZE(sunrise_communities);
124 return sunrise_communities;
Felix Singer0a7543d2019-02-19 23:49:11 +0100125 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_PRE:
126 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_U_BASE_SKL:
127 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_Y_PREM_SKL:
128 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_U_PREM_SKL:
129 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_U_BASE_KBL:
130 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_U_PREM_KBL:
131 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_Y_PREM_KBL:
Matthew Garrett2bf28e52018-07-23 21:09:47 -0700132 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_U_IHDCP_BASE:
133 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_U_IHDCP_PREM:
134 case PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_Y_IHDCP_PREM:
Johanna Schandere32ded82020-01-29 10:08:17 +0100135 *community_count = ARRAY_SIZE(sunrise_lp_communities);
136 return sunrise_lp_communities;
Maxim Polyakovb89ce2e2019-08-17 14:54:02 +0300137 case PCI_DEVICE_ID_INTEL_C621:
138 case PCI_DEVICE_ID_INTEL_C622:
139 case PCI_DEVICE_ID_INTEL_C624:
140 case PCI_DEVICE_ID_INTEL_C625:
141 case PCI_DEVICE_ID_INTEL_C626:
142 case PCI_DEVICE_ID_INTEL_C627:
143 case PCI_DEVICE_ID_INTEL_C628:
144 case PCI_DEVICE_ID_INTEL_C629:
Maxim Polyakovde7092b2020-07-17 00:19:41 +0300145 case PCI_DEVICE_ID_INTEL_C621A:
146 case PCI_DEVICE_ID_INTEL_C627A:
147 case PCI_DEVICE_ID_INTEL_C629A:
Maxim Polyakovb89ce2e2019-08-17 14:54:02 +0300148 case PCI_DEVICE_ID_INTEL_C624_SUPER:
149 case PCI_DEVICE_ID_INTEL_C627_SUPER_1:
150 case PCI_DEVICE_ID_INTEL_C621_SUPER:
151 case PCI_DEVICE_ID_INTEL_C627_SUPER_2:
152 case PCI_DEVICE_ID_INTEL_C628_SUPER:
Maxim Polyakovde7092b2020-07-17 00:19:41 +0300153 case PCI_DEVICE_ID_INTEL_C621A_SUPER:
154 case PCI_DEVICE_ID_INTEL_C627A_SUPER:
155 case PCI_DEVICE_ID_INTEL_C629A_SUPER:
Johanna Schandere32ded82020-01-29 10:08:17 +0100156 *community_count = ARRAY_SIZE(lewisburg_communities);
157 return lewisburg_communities;
Christian Walter1364ac32022-09-08 11:44:19 +0200158 case PCI_DEVICE_ID_INTEL_EBG:
159 *pad_stepping = 16;
160 *community_count = ARRAY_SIZE(emmitsburg_communities);
161 return emmitsburg_communities;
Thomas Heijligenda027192019-01-12 19:20:50 +0100162 case PCI_DEVICE_ID_INTEL_DNV_LPC:
Johanna Schandere32ded82020-01-29 10:08:17 +0100163 *community_count = ARRAY_SIZE(denverton_communities);
164 return denverton_communities;
Nico Huber8a95c6c2018-11-27 12:27:22 +0100165 case PCI_DEVICE_ID_INTEL_APL_LPC:
Johanna Schandere32ded82020-01-29 10:08:17 +0100166 *community_count = ARRAY_SIZE(apl_communities);
167 return apl_communities;
Sean Rhodes645dde72021-10-22 09:31:22 +0100168 case PCI_DEVICE_ID_INTEL_GLK_LPC:
169 *community_count = ARRAY_SIZE(glk_communities);
170 *pad_stepping = 16;
171 return glk_communities;
Matt DeVillier3c784452019-06-11 23:23:46 -0500172 case PCI_DEVICE_ID_INTEL_CANNONPOINT_LP_U_PREM:
Matt DeVillier62e883d2020-08-08 11:17:31 -0500173 case PCI_DEVICE_ID_INTEL_COMETPOINT_LP_U_PREM:
174 case PCI_DEVICE_ID_INTEL_COMETPOINT_LP_U_BASE:
Matt DeVillier3c784452019-06-11 23:23:46 -0500175 *community_count = ARRAY_SIZE(cannonlake_pch_lp_communities);
176 *pad_stepping = 16;
177 return cannonlake_pch_lp_communities;
Thomas Heijligen725369f2019-02-19 10:51:34 +0000178 case PCI_DEVICE_ID_INTEL_H310:
179 case PCI_DEVICE_ID_INTEL_H370:
180 case PCI_DEVICE_ID_INTEL_Z390:
181 case PCI_DEVICE_ID_INTEL_Q370:
182 case PCI_DEVICE_ID_INTEL_B360:
183 case PCI_DEVICE_ID_INTEL_C246:
184 case PCI_DEVICE_ID_INTEL_C242:
185 case PCI_DEVICE_ID_INTEL_QM370:
186 case PCI_DEVICE_ID_INTEL_HM370:
187 case PCI_DEVICE_ID_INTEL_CM246:
Johanna Schandere32ded82020-01-29 10:08:17 +0100188 *community_count = ARRAY_SIZE(cannonlake_pch_h_communities);
189 *pad_stepping = 16;
190 return cannonlake_pch_h_communities;
Johanna Schander0174ea72020-01-04 15:14:59 +0100191 case PCI_DEVICE_ID_INTEL_ICELAKE_LP_U:
Johanna Schandere32ded82020-01-29 10:08:17 +0100192 *community_count = ARRAY_SIZE(icelake_pch_h_communities);
193 *pad_stepping = 16;
194 return icelake_pch_h_communities;
Michał Żygowski8ac40f32021-07-09 16:00:16 +0200195 case PCI_DEVICE_ID_INTEL_TIGERPOINT_U_SUPER:
196 case PCI_DEVICE_ID_INTEL_TIGERPOINT_U_PREM:
197 case PCI_DEVICE_ID_INTEL_TIGERPOINT_U_BASE:
198 case PCI_DEVICE_ID_INTEL_TIGERPOINT_Y_SUPER:
199 case PCI_DEVICE_ID_INTEL_TIGERPOINT_Y_PREM:
200 *community_count = ARRAY_SIZE(tigerlake_pch_lp_communities);
201 *pad_stepping = 16;
202 return tigerlake_pch_lp_communities;
203 case PCI_DEVICE_ID_INTEL_Q570:
204 case PCI_DEVICE_ID_INTEL_Z590:
205 case PCI_DEVICE_ID_INTEL_H570:
206 case PCI_DEVICE_ID_INTEL_B560:
207 case PCI_DEVICE_ID_INTEL_H510:
208 case PCI_DEVICE_ID_INTEL_WM590:
209 case PCI_DEVICE_ID_INTEL_QM580:
210 case PCI_DEVICE_ID_INTEL_HM570:
211 case PCI_DEVICE_ID_INTEL_C252:
212 case PCI_DEVICE_ID_INTEL_C256:
213 case PCI_DEVICE_ID_INTEL_W580:
214 *community_count = ARRAY_SIZE(tigerlake_pch_h_communities);
215 *pad_stepping = 16;
216 return tigerlake_pch_h_communities;
Maximilian Brune8d1051f2022-08-08 12:55:57 +0200217 case PCI_DEVICE_ID_INTEL_H610E:
218 case PCI_DEVICE_ID_INTEL_Q670E:
219 case PCI_DEVICE_ID_INTEL_R680E:
Michał Kopeć2d8edeb2022-04-05 10:40:03 +0200220 case PCI_DEVICE_ID_INTEL_H610:
221 case PCI_DEVICE_ID_INTEL_B660:
222 case PCI_DEVICE_ID_INTEL_H670:
223 case PCI_DEVICE_ID_INTEL_Q670:
224 case PCI_DEVICE_ID_INTEL_Z690:
225 case PCI_DEVICE_ID_INTEL_W680:
Michał Kopeć2d8edeb2022-04-05 10:40:03 +0200226 case PCI_DEVICE_ID_INTEL_WM690:
227 case PCI_DEVICE_ID_INTEL_HM670:
Michał Żygowski472d83b2023-06-16 12:49:12 +0200228 case PCI_DEVICE_ID_INTEL_W790:
229 case PCI_DEVICE_ID_INTEL_Z790:
230 case PCI_DEVICE_ID_INTEL_H770:
231 case PCI_DEVICE_ID_INTEL_B760:
Michał Kopeć2d8edeb2022-04-05 10:40:03 +0200232 case PCI_DEVICE_ID_INTEL_HM770:
Michał Żygowski472d83b2023-06-16 12:49:12 +0200233 case PCI_DEVICE_ID_INTEL_WM790:
234 case PCI_DEVICE_ID_INTEL_C262:
235 case PCI_DEVICE_ID_INTEL_C266:
Michał Kopeć2d8edeb2022-04-05 10:40:03 +0200236 *community_count = ARRAY_SIZE(alderlake_pch_h_communities);
237 *pad_stepping = 16;
238 return alderlake_pch_h_communities;
Kacper Stojekfb9110b2022-08-17 10:28:20 +0200239 case PCI_DEVICE_ID_INTEL_ADL_P:
240 case PCI_DEVICE_ID_INTEL_ADL_M:
241 case PCI_DEVICE_ID_INTEL_RPL_P:
242 *community_count = ARRAY_SIZE(alderlake_pch_p_communities);
243 *pad_stepping = 16;
244 return alderlake_pch_p_communities;
Brandon Weeks7ee7b132023-12-26 15:55:03 -0800245 case PCI_DEVICE_ID_INTEL_ADL_N:
246 *community_count = ARRAY_SIZE(alderlake_pch_n_communities);
247 *pad_stepping = 16;
248 return alderlake_pch_n_communities;
Karol Zmyslowskib2f5a222023-03-10 19:44:04 +0100249 case PCI_DEVICE_ID_INTEL_JSL:
250 *community_count = ARRAY_SIZE(jasperlake_pch_communities);
251 *pad_stepping = 16;
252 return jasperlake_pch_communities;
Kacper Stojek76d2b662022-10-17 14:30:24 +0200253 case PCI_DEVICE_ID_INTEL_EHL:
254 *community_count = ARRAY_SIZE(elkhartlake_pch_communities);
255 *pad_stepping = 16;
256 return elkhartlake_pch_communities;
Kacper Stojekfb9110b2022-08-17 10:28:20 +0200257
Nico Huber18980232017-04-07 12:26:07 +0200258 default:
Johanna Schandere32ded82020-01-29 10:08:17 +0100259 return NULL;
Nico Huber18980232017-04-07 12:26:07 +0200260 }
Johanna Schandere32ded82020-01-29 10:08:17 +0100261}
262
263void print_gpio_groups(struct pci_dev *const sb)
264{
265 size_t community_count;
266 const struct gpio_community *const *communities;
267 size_t pad_stepping;
268
269 communities = get_gpio_communities(sb, &community_count, &pad_stepping);
270
271 if (!communities)
272 return;
273
274 pcr_init(sb);
Nico Huber18980232017-04-07 12:26:07 +0200275
276 printf("\n============= GPIOS =============\n\n");
277
278 for (; community_count; --community_count)
Thomas Heijligen725369f2019-02-19 10:51:34 +0000279 print_gpio_community(*communities++, pad_stepping);
Nico Huber18980232017-04-07 12:26:07 +0200280}