coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
gpio.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.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  /* (applicable only for GPD group) */
13  { .logical = PAD_CFG0_LOGICAL_RESET_RSMRST, .chipset = 3U << 30 },
14 };
15 
16 static const struct pad_group dnv_community_nc_groups[] = {
19 };
20 
21 static const struct pad_group dnv_community_sc_dfx_groups[] = {
23 };
24 
25 static const struct pad_group dnv_community_sc0_groups[] = {
28 };
29 
30 static const struct pad_group dnv_community_sc1_groups[] = {
33 };
34 
35 static const struct pad_community dnv_gpio_communities[] = {
36  {
37  .port = PID_GPIOCOM1,
38  .first_pad = SOUTH_GROUP1_SUSPWRDNACK,
39  .last_pad = SOUTH_GROUP1_GPIO_3,
40  .num_gpi_regs = NUM_SC1_GPI_REGS,
41  .gpi_status_offset = NUM_NC_GPI_REGS + NUM_SC_DFX_GPI_REGS +
43  .pad_cfg_base = R_PCH_PCR_GPIO_SC1_PADCFG_OFFSET,
44  .host_own_reg_0 = R_PCH_PCR_GPIO_SC1_PAD_OWN,
45  .gpi_int_sts_reg_0 = R_PCH_PCR_GPIO_SC1_GPI_IS,
46  .gpi_int_en_reg_0 = R_PCH_PCR_GPIO_SC1_GPI_IE,
47  .gpi_smi_sts_reg_0 = R_PCH_PCR_GPIO_SC1_GPI_GPE_STS,
48  .gpi_smi_en_reg_0 = R_PCH_PCR_GPIO_SC1_GPI_GPE_EN,
49  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
50  .name = "GPIO_GPE_SC1",
51  .acpi_path = "\\_SB.GPO3",
52  .reset_map = rst_map,
53  .num_reset_vals = ARRAY_SIZE(rst_map),
54  .groups = dnv_community_sc1_groups,
55  .num_groups = ARRAY_SIZE(dnv_community_sc1_groups),
56  }, {
57  .port = PID_GPIOCOM1,
58  .first_pad = SOUTH_GROUP0_SMB3_CLTT_DATA,
59  .last_pad = SOUTH_GROUP0_DFX_SPARE4,
60  .num_gpi_regs = NUM_SC0_GPI_REGS,
61  .gpi_status_offset = NUM_NC_GPI_REGS + NUM_SC_DFX_GPI_REGS,
62  .pad_cfg_base = R_PCH_PCR_GPIO_SC0_PADCFG_OFFSET,
63  .host_own_reg_0 = R_PCH_PCR_GPIO_SC0_PAD_OWN,
64  .gpi_int_sts_reg_0 = R_PCH_PCR_GPIO_SC0_GPI_IS,
65  .gpi_int_en_reg_0 = R_PCH_PCR_GPIO_SC0_GPI_IE,
66  .gpi_smi_sts_reg_0 = R_PCH_PCR_GPIO_SC0_GPI_GPE_STS,
67  .gpi_smi_en_reg_0 = R_PCH_PCR_GPIO_SC0_GPI_GPE_EN,
68  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
69  .name = "GPIO_GPE_SC0",
70  .acpi_path = "\\_SB.GPO2",
71  .reset_map = rst_map,
72  .num_reset_vals = ARRAY_SIZE(rst_map),
73  .groups = dnv_community_sc0_groups,
74  .num_groups = ARRAY_SIZE(dnv_community_sc0_groups),
75  }, {
76  .port = PID_GPIOCOM1,
77  .first_pad = SOUTH_DFX_DFX_PORT_CLK0,
78  .last_pad = SOUTH_DFX_DFX_PORT15,
79  .num_gpi_regs = NUM_SC_DFX_GPI_REGS,
80  .gpi_status_offset = NUM_NC_GPI_REGS,
82  .host_own_reg_0 = R_PCH_PCR_GPIO_SC_DFX_HOSTSW_OWN,
83  .gpi_int_sts_reg_0 = R_PCH_PCR_GPIO_SC_DFX_GPI_IS,
84  .gpi_int_en_reg_0 = R_PCH_PCR_GPIO_SC_DFX_GPI_IE,
85  .gpi_smi_sts_reg_0 = R_PCH_PCR_GPIO_SC_DFX_GPI_GPE_STS,
86  .gpi_smi_en_reg_0 = R_PCH_PCR_GPIO_SC_DFX_GPI_GPE_EN,
87  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
88  .name = "GPIO_GPE_SC_DFX",
89  .acpi_path = "\\_SB.GPO1",
90  .reset_map = rst_map,
91  .num_reset_vals = ARRAY_SIZE(rst_map),
94  }, {
95  .port = PID_GPIOCOM0,
96  .first_pad = NORTH_ALL_GBE0_SDP0,
97  .last_pad = NORTH_ALL_MEMHOT_N,
98  .num_gpi_regs = NUM_NC_GPI_REGS,
99  .gpi_status_offset = 0,
100  .pad_cfg_base = R_PCH_PCR_GPIO_NC_PADCFG_OFFSET,
101  .host_own_reg_0 = R_PCH_PCR_GPIO_NC_PAD_OWN,
102  .gpi_int_sts_reg_0 = R_PCH_PCR_GPIO_NC_GPI_IS,
103  .gpi_int_en_reg_0 = R_PCH_PCR_GPIO_NC_GPI_IE,
104  .gpi_smi_sts_reg_0 = R_PCH_PCR_GPIO_NC_GPI_GPE_STS,
105  .gpi_smi_en_reg_0 = R_PCH_PCR_GPIO_NC_GPI_GPE_EN,
106  .max_pads_per_group = GPIO_MAX_NUM_PER_GROUP,
107  .name = "GPIO_GPE_NC",
108  .acpi_path = "\\_SB.GPO0",
109  .reset_map = rst_map,
110  .num_reset_vals = ARRAY_SIZE(rst_map),
111  .groups = dnv_community_nc_groups,
112  .num_groups = ARRAY_SIZE(dnv_community_nc_groups),
113  }
114 };
115 
116 const struct pad_community *soc_gpio_get_community(size_t *num_communities)
117 {
118  *num_communities = ARRAY_SIZE(dnv_gpio_communities);
119  return dnv_gpio_communities;
120 }
#define GPIO_MAX_NUM_PER_GROUP
Definition: gpio_soc_defs.h:31
#define ARRAY_SIZE(a)
Definition: helpers.h:12
@ PID_GPIOCOM0
Definition: pcr.h:17
@ PID_GPIOCOM1
Definition: pcr.h:18
const struct pad_community * soc_gpio_get_community(size_t *num_communities)
Definition: gpio.c:241
#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_RSMRST
Definition: gpio_defs.h:47
#define PAD_CFG0_LOGICAL_RESET_PLTRST
Definition: gpio_defs.h:46
#define PAD_CFG0_LOGICAL_RESET_DEEP
Definition: gpio_defs.h:45
static const struct pad_group dnv_community_sc0_groups[]
Definition: gpio.c:25
static const struct pad_group dnv_community_sc_dfx_groups[]
Definition: gpio.c:21
static const struct pad_community dnv_gpio_communities[]
Definition: gpio.c:35
static const struct pad_group dnv_community_sc1_groups[]
Definition: gpio.c:30
static const struct reset_mapping rst_map[]
Definition: gpio.c:8
static const struct pad_group dnv_community_nc_groups[]
Definition: gpio.c:16
#define NUM_SC0_GPI_REGS
Definition: gpio.h:20
#define NUM_NC_GPI_REGS
Definition: gpio.h:12
#define NUM_SC_DFX_GPI_REGS
Definition: gpio.h:16
#define NUM_SC1_GPI_REGS
Definition: gpio.h:24
#define R_PCH_PCR_GPIO_SC1_GPI_IE
Definition: gpio_defs.h:86
#define NORTH_ALL_PCIE_CLKREQ4_N
Definition: gpio_defs.h:341
#define SOUTH_DFX_DFX_PORT_CLK0
Definition: gpio_defs.h:350
#define R_PCH_PCR_GPIO_SC1_PAD_OWN
Definition: gpio_defs.h:80
#define R_PCH_PCR_GPIO_NC_PADCFG_OFFSET
Definition: gpio_defs.h:41
#define R_PCH_PCR_GPIO_SC_DFX_GPI_IS
Definition: gpio_defs.h:55
#define SOUTH_GROUP0_DFX_SPARE4
Definition: gpio_defs.h:422
#define R_PCH_PCR_GPIO_SC0_GPI_GPE_EN
Definition: gpio_defs.h:71
#define SOUTH_GROUP1_GPIO_3
Definition: gpio_defs.h:465
#define R_PCH_PCR_GPIO_NC_GPI_GPE_EN
Definition: gpio_defs.h:36
#define SOUTH_GROUP1_EMMC_STROBE
Definition: gpio_defs.h:455
#define R_PCH_PCR_GPIO_NC_GPI_IS
Definition: gpio_defs.h:33
#define R_PCH_PCR_GPIO_SC0_PAD_OWN
Definition: gpio_defs.h:63
#define SOUTH_GROUP1_SUSPWRDNACK
Definition: gpio_defs.h:423
#define R_PCH_PCR_GPIO_SC0_PADCFG_OFFSET
Definition: gpio_defs.h:76
#define NORTH_ALL_MEMHOT_N
Definition: gpio_defs.h:349
#define R_PCH_PCR_GPIO_SC1_PADCFG_OFFSET
Definition: gpio_defs.h:93
#define R_PCH_PCR_GPIO_SC_DFX_PADCFG_OFFSET
Definition: gpio_defs.h:59
#define R_PCH_PCR_GPIO_SC0_GPI_IE
Definition: gpio_defs.h:69
#define SOUTH_DFX_DFX_PORT15
Definition: gpio_defs.h:367
#define NORTH_ALL_GBE0_SDP0
Definition: gpio_defs.h:309
#define R_PCH_PCR_GPIO_SC_DFX_GPI_GPE_STS
Definition: gpio_defs.h:57
#define R_PCH_PCR_GPIO_SC_DFX_GPI_GPE_EN
Definition: gpio_defs.h:58
#define SOUTH_GROUP1_EMMC_CLK
Definition: gpio_defs.h:456
#define R_PCH_PCR_GPIO_NC_GPI_GPE_STS
Definition: gpio_defs.h:35
#define SOUTH_GROUP0_SATA0_LED_N
Definition: gpio_defs.h:401
#define SOUTH_GROUP0_SATA1_LED_N
Definition: gpio_defs.h:402
#define SOUTH_GROUP0_SMB3_CLTT_DATA
Definition: gpio_defs.h:368
#define R_PCH_PCR_GPIO_SC1_GPI_GPE_STS
Definition: gpio_defs.h:87
#define R_PCH_PCR_GPIO_SC1_GPI_GPE_EN
Definition: gpio_defs.h:88
#define R_PCH_PCR_GPIO_SC0_GPI_GPE_STS
Definition: gpio_defs.h:70
#define R_PCH_PCR_GPIO_SC_DFX_GPI_IE
Definition: gpio_defs.h:56
#define R_PCH_PCR_GPIO_SC1_GPI_IS
Definition: gpio_defs.h:85
#define R_PCH_PCR_GPIO_NC_PAD_OWN
Definition: gpio_defs.h:26
#define R_PCH_PCR_GPIO_NC_GPI_IE
Definition: gpio_defs.h:34
#define R_PCH_PCR_GPIO_SC_DFX_HOSTSW_OWN
Definition: gpio_defs.h:54
#define R_PCH_PCR_GPIO_SC0_GPI_IS
Definition: gpio_defs.h:68
#define NORTH_ALL_PCIE_CLKREQ3_N
Definition: gpio_defs.h:340
uint8_t port
Definition: gpio.h:135
Definition: gpio.h:94
uint32_t logical
Definition: gpio.h:89