coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
gpio_glk.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <intelblocks/gpio.h>
4 #include <intelblocks/pcr.h>
5 #include <soc/pcr_ids.h>
6 #include <soc/pm.h>
7 
8 static const struct reset_mapping rst_map[] = {
9  { .logical = PAD_CFG0_LOGICAL_RESET_PWROK, .chipset = 0U << 30 },
10  { .logical = PAD_CFG0_LOGICAL_RESET_DEEP, .chipset = 1U << 30 },
11  { .logical = PAD_CFG0_LOGICAL_RESET_PLTRST, .chipset = 2U << 30 },
12 };
13 
14 static const struct pad_group glk_community_audio_groups[] = {
16 };
17 
18 static const struct pad_group glk_community_nw_groups[] = {
19  INTEL_GPP(NW_OFFSET, NW_OFFSET, GPIO_31), /* NORTHWEST 0 */
20  INTEL_GPP(NW_OFFSET, GPIO_32, GPIO_63), /* NORTHWEST 1 */
21  INTEL_GPP(NW_OFFSET, GPIO_64, GPIO_214), /* NORTHWEST 2 */
22 };
23 
24 static const struct pad_group glk_community_scc_groups[] = {
25  INTEL_GPP(SCC_OFFSET, SCC_OFFSET, GPIO_206), /* SCC 0 */
26  INTEL_GPP(SCC_OFFSET, GPIO_207, GPIO_209), /* SCC 1 */
27 };
28 
29 static const struct pad_group glk_community_n_groups[] = {
30  INTEL_GPP(N_OFFSET, N_OFFSET, GPIO_107), /* NORTH 0 */
31  INTEL_GPP(N_OFFSET, GPIO_108, GPIO_139), /* NORTH 1 */
32  INTEL_GPP(N_OFFSET, GPIO_140, GPIO_155), /* NORTH 2 */
33 };
34 
35 static const struct pad_community glk_gpio_communities[] = {
36  {
37  .port = PID_GPIO_NW,
38  .first_pad = NW_OFFSET,
39  .last_pad = GPIO_214,
40  .num_gpi_regs = NUM_NW_GPI_REGS,
41  .gpi_status_offset = 0,
42  .pad_cfg_base = PAD_CFG_BASE,
43  .host_own_reg_0 = HOSTSW_OWN_REG_0,
44  .gpi_int_sts_reg_0 = GPI_INT_STS_0,
45  .gpi_int_en_reg_0 = GPI_INT_EN_0,
46  .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
47  .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
48  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
49  .name = "GPIO_NORTHWEST",
50  .acpi_path = "\\_SB.GPO0",
51  .reset_map = rst_map,
52  .num_reset_vals = ARRAY_SIZE(rst_map),
53  .groups = glk_community_nw_groups,
54  .num_groups = ARRAY_SIZE(glk_community_nw_groups),
55  }, {
56  .port = PID_GPIO_N,
57  .first_pad = N_OFFSET,
58  .last_pad = GPIO_155,
59  .num_gpi_regs = NUM_N_GPI_REGS,
60  .gpi_status_offset = NUM_NW_GPI_REGS,
61  .pad_cfg_base = PAD_CFG_BASE,
62  .host_own_reg_0 = HOSTSW_OWN_REG_0,
63  .gpi_int_sts_reg_0 = GPI_INT_STS_0,
64  .gpi_int_en_reg_0 = GPI_INT_EN_0,
65  .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
66  .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
67  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
68  .name = "GPIO_NORTH",
69  .acpi_path = "\\_SB.GPO1",
70  .reset_map = rst_map,
71  .num_reset_vals = ARRAY_SIZE(rst_map),
72  .groups = glk_community_n_groups,
73  .num_groups = ARRAY_SIZE(glk_community_n_groups),
74  }, {
75  .port = PID_GPIO_AUDIO,
76  .first_pad = AUDIO_OFFSET,
77  .last_pad = GPIO_175,
78  .num_gpi_regs = NUM_AUDIO_GPI_REGS,
79  .gpi_status_offset = NUM_NW_GPI_REGS + NUM_N_GPI_REGS,
80  .pad_cfg_base = PAD_CFG_BASE,
81  .host_own_reg_0 = HOSTSW_OWN_REG_0,
82  .gpi_int_sts_reg_0 = GPI_INT_STS_0,
83  .gpi_int_en_reg_0 = GPI_INT_EN_0,
84  .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
85  .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
86  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
87  .name = "GPIO_AUDIO",
88  .acpi_path = "\\_SB.GPO2",
89  .reset_map = rst_map,
90  .num_reset_vals = ARRAY_SIZE(rst_map),
93  }, {
94  .port = PID_GPIO_SCC,
95  .first_pad = SCC_OFFSET,
96  .last_pad = GPIO_209,
97  .num_gpi_regs = NUM_SCC_GPI_REGS,
98  .gpi_status_offset = NUM_NW_GPI_REGS + NUM_N_GPI_REGS +
100  .pad_cfg_base = PAD_CFG_BASE,
101  .host_own_reg_0 = HOSTSW_OWN_REG_0,
102  .gpi_int_sts_reg_0 = GPI_INT_STS_0,
103  .gpi_int_en_reg_0 = GPI_INT_EN_0,
104  .gpi_smi_sts_reg_0 = GPI_SMI_STS_0,
105  .gpi_smi_en_reg_0 = GPI_SMI_EN_0,
106  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
107  .name = "GPIO_SCC",
108  .acpi_path = "\\_SB.GPO3",
109  .reset_map = rst_map,
110  .num_reset_vals = ARRAY_SIZE(rst_map),
111  .groups = glk_community_scc_groups,
112  .num_groups = ARRAY_SIZE(glk_community_scc_groups),
113  },
114 };
115 
116 const struct pad_community *soc_gpio_get_community(size_t *num_communities)
117 {
118  *num_communities = ARRAY_SIZE(glk_gpio_communities);
119  return glk_gpio_communities;
120 }
121 
122 const struct pmc_to_gpio_route *soc_pmc_gpio_routes(size_t *num)
123 {
124  static const struct pmc_to_gpio_route routes[] = {
125  { PMC_GPE_SCC_31_0, GPIO_GPE_SCC_31_0 },
126  { PMC_GPE_SCC_63_32, GPIO_GPE_SCC_63_32 },
130  /*
131  * PMC_GPE_NW_127_96 maps to GPIO group 3, which is reserved and
132  * cannot be set in GPE0_DWx. Hence, it is skipped here.
133  */
136  { PMC_GPE_N_95_64, GPIO_GPE_N_95_64 },
137  { PMC_GPE_AUDIO_31_0, GPIO_GPE_AUDIO_31_0 },
138  };
139  *num = ARRAY_SIZE(routes);
140  return routes;
141 }
#define GPIO_MAX_NUM_PER_GROUP
Definition: gpio_soc_defs.h:31
#define PID_GPIO_N
Definition: pcr_ids.h:18
#define PID_GPIO_NW
Definition: pcr_ids.h:17
#define PMC_GPE_N_63_32
Definition: pm.h:200
#define PMC_GPE_N_31_0
Definition: pm.h:199
#define PMC_GPE_NW_31_0
Definition: pm.h:196
#define PMC_GPE_NW_63_32
Definition: pm.h:197
#define PMC_GPE_NW_95_64
Definition: pm.h:198
#define GPIO_64
Definition: gpio_ftns.h:24
#define GPIO_32
Definition: gpio_ftns.h:15
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define GPIO_214
Definition: gpio_apl.h:172
#define GPIO_207
Definition: gpio_apl.h:275
#define GPIO_GPE_NW_95_64
Definition: gpio_apl.h:24
#define GPIO_GPE_N_31_0
Definition: gpio_apl.h:25
#define GPIO_175
Definition: gpio_apl.h:297
#define GPIO_206
Definition: gpio_apl.h:274
#define GPIO_209
Definition: gpio_apl.h:250
#define N_OFFSET
Definition: gpio_apl.h:321
#define GPIO_GPE_NW_31_0
Definition: gpio_apl.h:22
#define GPIO_63
Definition: gpio_apl.h:116
#define NW_OFFSET
Definition: gpio_apl.h:322
#define GPIO_GPE_NW_63_32
Definition: gpio_apl.h:23
#define NUM_NW_GPI_REGS
Definition: gpio_apl.h:52
#define NUM_N_GPI_REGS
Definition: gpio_apl.h:49
#define GPIO_GPE_N_63_32
Definition: gpio_apl.h:26
const struct pmc_to_gpio_route * soc_pmc_gpio_routes(size_t *num)
Definition: gpio_glk.c:122
static const struct pad_group glk_community_scc_groups[]
Definition: gpio_glk.c:24
const struct pad_community * soc_gpio_get_community(size_t *num_communities)
Definition: gpio_glk.c:116
static const struct pad_community glk_gpio_communities[]
Definition: gpio_glk.c:35
static const struct pad_group glk_community_n_groups[]
Definition: gpio_glk.c:29
static const struct reset_mapping rst_map[]
Definition: gpio_glk.c:8
static const struct pad_group glk_community_nw_groups[]
Definition: gpio_glk.c:18
static const struct pad_group glk_community_audio_groups[]
Definition: gpio_glk.c:14
#define NUM_AUDIO_GPI_REGS
Definition: gpio_glk.h:291
#define GPIO_GPE_AUDIO_31_0
Definition: gpio_glk.h:259
#define GPIO_GPE_SCC_63_32
Definition: gpio_glk.h:261
#define GPIO_GPE_SCC_31_0
Definition: gpio_glk.h:260
#define AUDIO_OFFSET
Definition: gpio_glk.h:182
#define SCC_OFFSET
Definition: gpio_glk.h:207
#define GPIO_GPE_N_95_64
Definition: gpio_glk.h:258
#define NUM_SCC_GPI_REGS
Definition: gpio_glk.h:295
#define GPIO_107
Definition: gpio.h:72
#define GPIO_140
Definition: gpio.h:87
#define GPIO_108
Definition: gpio.h:73
#define GPIO_31
Definition: gpio.h:47
#define GPIO_139
Definition: gpio.h:94
#define GPIO_155
Definition: gpio.h:105
#define GPI_INT_EN_0
Definition: gpio_defs.h:346
#define GPI_INT_STS_0
Definition: gpio_defs.h:345
#define HOSTSW_OWN_REG_0
Definition: gpio_defs.h:344
#define GPI_SMI_STS_0
Definition: gpio_defs.h:347
#define PAD_CFG_BASE
Definition: gpio_defs.h:349
#define GPI_SMI_EN_0
Definition: gpio_defs.h:348
#define INTEL_GPP(first_of_community, start_of_group, end_of_group)
Definition: gpio.h:49
#define PAD_CFG0_LOGICAL_RESET_PWROK
Definition: gpio_defs.h:44
#define PAD_CFG0_LOGICAL_RESET_PLTRST
Definition: gpio_defs.h:46
#define PAD_CFG0_LOGICAL_RESET_DEEP
Definition: gpio_defs.h:45
uint8_t port
Definition: gpio.h:135
Definition: gpio.h:94
uint32_t logical
Definition: gpio.h:89