soc/intel: hook up new gpio device in the soc chips
This change adds the required gpio operations struct to soc/common gpio code and hooks them up in all socs currently using the gpio block code, except DNV-NS, which is handled in a separate change. Also, add the gpio device to existing chipset devicetrees. Successfully tested on Supermicro X11SSM-F with CB:48097, X11SSH-TF with CB:48711 and OCP DeltaLake with CB:48672. Change-Id: I81dbbf5397b28ffa7537465c53332779245b39f6 Tested-by: Johnny Lin <Johnny_Lin@wiwynn.com> Tested-by: Michael Niewöhner <foss@mniewoehner.de> Tested-by: Patrick Rudolph <siro@das-labor.org> Signed-off-by: Michael Niewöhner <foss@mniewoehner.de> Reviewed-on: https://review.coreboot.org/c/coreboot/+/48583 Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Nico Huber <nico.h@gmx.de> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
979a071b0e
commit
8913b783b9
|
@ -6,6 +6,7 @@
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/acpi.h>
|
#include <intelblocks/acpi.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/pcie_rp.h>
|
#include <intelblocks/pcie_rp.h>
|
||||||
#include <intelblocks/xdci.h>
|
#include <intelblocks/xdci.h>
|
||||||
|
@ -182,6 +183,8 @@ static void soc_enable(struct device *dev)
|
||||||
else if (dev->path.type == DEVICE_PATH_PCI &&
|
else if (dev->path.type == DEVICE_PATH_PCI &&
|
||||||
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
||||||
dev->ops = &pmc_ops;
|
dev->ops = &pmc_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_alderlake_ops = {
|
struct chip_operations soc_intel_alderlake_ops = {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
chip soc/intel/alderlake
|
chip soc/intel/alderlake
|
||||||
device domain 0 on
|
device domain 0 on
|
||||||
|
device gpio 0 alias pch_gpio on end
|
||||||
device pci 00.0 alias system_agent on end
|
device pci 00.0 alias system_agent on end
|
||||||
device pci 01.0 alias pcie5 off end
|
device pci 01.0 alias pcie5 off end
|
||||||
device pci 02.0 alias igpu off end
|
device pci 02.0 alias igpu off end
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <fsp/api.h>
|
#include <fsp/api.h>
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/cpulib.h>
|
#include <intelblocks/cpulib.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/pmclib.h>
|
#include <intelblocks/pmclib.h>
|
||||||
#include <romstage_handoff.h>
|
#include <romstage_handoff.h>
|
||||||
|
@ -216,6 +217,8 @@ static void enable_dev(struct device *dev)
|
||||||
dev->ops = &pci_domain_ops;
|
dev->ops = &pci_domain_ops;
|
||||||
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/acpi.h>
|
#include <intelblocks/acpi.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/pcie_rp.h>
|
#include <intelblocks/pcie_rp.h>
|
||||||
#include <intelblocks/xdci.h>
|
#include <intelblocks/xdci.h>
|
||||||
|
@ -209,6 +210,8 @@ static void soc_enable(struct device *dev)
|
||||||
dev->ops = &pci_domain_ops;
|
dev->ops = &pci_domain_ops;
|
||||||
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_cannonlake_ops = {
|
struct chip_operations soc_intel_cannonlake_ops = {
|
||||||
|
|
|
@ -3,3 +3,5 @@ ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
||||||
romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
romstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
||||||
smm-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
smm-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
||||||
verstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
verstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio.c
|
||||||
|
|
||||||
|
ramstage-$(CONFIG_SOC_INTEL_COMMON_BLOCK_GPIO) += gpio_dev.c
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
|
#include <device/device.h>
|
||||||
#include <intelblocks/gpio.h>
|
#include <intelblocks/gpio.h>
|
||||||
#include <gpio.h>
|
#include <gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <device/device.h>
|
||||||
|
#include <device/gpio.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
static struct gpio_operations gpio_ops = {
|
||||||
|
.get = gpio_get,
|
||||||
|
.set = gpio_set,
|
||||||
|
.input_pulldown = gpio_input_pulldown,
|
||||||
|
.input_pullup = gpio_input_pullup,
|
||||||
|
.input = gpio_input,
|
||||||
|
.output = gpio_output,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct device_operations block_gpio_ops = {
|
||||||
|
.read_resources = noop_read_resources,
|
||||||
|
.set_resources = noop_set_resources,
|
||||||
|
.ops_gpio = &gpio_ops,
|
||||||
|
};
|
||||||
|
|
||||||
|
void block_gpio_enable(struct device *dev)
|
||||||
|
{
|
||||||
|
assert(dev->path.type == DEVICE_PATH_GPIO);
|
||||||
|
dev->ops = &block_gpio_ops;
|
||||||
|
}
|
|
@ -25,6 +25,7 @@
|
||||||
|
|
||||||
#ifndef __ACPI__
|
#ifndef __ACPI__
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
#include <device/device.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* GPIO numbers may not be contiguous and instead will have a different
|
* GPIO numbers may not be contiguous and instead will have a different
|
||||||
|
@ -222,5 +223,11 @@ void gpi_clear_int_cfg(void);
|
||||||
/* The function performs GPIO Power Management programming. */
|
/* The function performs GPIO Power Management programming. */
|
||||||
void gpio_pm_configure(const uint8_t *misccfg_pm_values, size_t num);
|
void gpio_pm_configure(const uint8_t *misccfg_pm_values, size_t num);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set gpio ops of the device to gpio block ops.
|
||||||
|
* Shall be called by all SoCs that use intelblocks/gpio.
|
||||||
|
*/
|
||||||
|
void block_gpio_enable(struct device *dev);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif /* _SOC_INTELBLOCKS_GPIO_H_ */
|
#endif /* _SOC_INTELBLOCKS_GPIO_H_ */
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/acpi.h>
|
#include <intelblocks/acpi.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/pcie_rp.h>
|
#include <intelblocks/pcie_rp.h>
|
||||||
#include <intelblocks/xdci.h>
|
#include <intelblocks/xdci.h>
|
||||||
|
@ -163,6 +164,8 @@ static void soc_enable(struct device *dev)
|
||||||
else if (dev->path.type == DEVICE_PATH_PCI &&
|
else if (dev->path.type == DEVICE_PATH_PCI &&
|
||||||
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
||||||
dev->ops = &pmc_ops;
|
dev->ops = &pmc_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_elkhartlake_ops = {
|
struct chip_operations soc_intel_elkhartlake_ops = {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/acpi.h>
|
#include <intelblocks/acpi.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/xdci.h>
|
#include <intelblocks/xdci.h>
|
||||||
#include <romstage_handoff.h>
|
#include <romstage_handoff.h>
|
||||||
|
@ -144,6 +145,8 @@ static void soc_enable(struct device *dev)
|
||||||
dev->ops = &pci_domain_ops;
|
dev->ops = &pci_domain_ops;
|
||||||
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_icelake_ops = {
|
struct chip_operations soc_intel_icelake_ops = {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <intelblocks/gspi.h>
|
#include <intelblocks/gspi.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <soc/gpe.h>
|
#include <soc/gpe.h>
|
||||||
|
#include <soc/gpio.h>
|
||||||
#include <soc/pch.h>
|
#include <soc/pch.h>
|
||||||
#include <soc/gpio_defs.h>
|
#include <soc/gpio_defs.h>
|
||||||
#include <soc/pci_devs.h>
|
#include <soc/pci_devs.h>
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/acpi.h>
|
#include <intelblocks/acpi.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/pcie_rp.h>
|
#include <intelblocks/pcie_rp.h>
|
||||||
#include <intelblocks/xdci.h>
|
#include <intelblocks/xdci.h>
|
||||||
|
@ -169,6 +170,8 @@ static void soc_enable(struct device *dev)
|
||||||
else if (dev->path.type == DEVICE_PATH_PCI &&
|
else if (dev->path.type == DEVICE_PATH_PCI &&
|
||||||
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
||||||
dev->ops = &pmc_ops;
|
dev->ops = &pmc_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_jasperlake_ops = {
|
struct chip_operations soc_intel_jasperlake_ops = {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <intelblocks/gspi.h>
|
#include <intelblocks/gspi.h>
|
||||||
#include <intelblocks/power_limit.h>
|
#include <intelblocks/power_limit.h>
|
||||||
#include <soc/gpe.h>
|
#include <soc/gpe.h>
|
||||||
|
#include <soc/gpio.h>
|
||||||
#include <soc/pch.h>
|
#include <soc/pch.h>
|
||||||
#include <soc/pci_devs.h>
|
#include <soc/pci_devs.h>
|
||||||
#include <soc/pmc.h>
|
#include <soc/pmc.h>
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <device/device.h>
|
#include <device/device.h>
|
||||||
#include <device/pci_ids.h>
|
#include <device/pci_ids.h>
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
|
#include <gpio.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/lpc_lib.h>
|
#include <intelblocks/lpc_lib.h>
|
||||||
|
@ -103,6 +104,8 @@ static void soc_enable(struct device *dev)
|
||||||
dev->ops = &pci_domain_ops;
|
dev->ops = &pci_domain_ops;
|
||||||
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER)
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_skylake_ops = {
|
struct chip_operations soc_intel_skylake_ops = {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
chip soc/intel/skylake
|
chip soc/intel/skylake
|
||||||
device domain 0 on
|
device domain 0 on
|
||||||
|
device gpio 0 alias pch_gpio on end # GPIO
|
||||||
device pci 00.0 alias system_agent on end # Host Bridge
|
device pci 00.0 alias system_agent on end # Host Bridge
|
||||||
device pci 01.0 alias peg0 off end # PEG0
|
device pci 01.0 alias peg0 off end # PEG0
|
||||||
device pci 01.1 alias peg1 off end # PEG1
|
device pci 01.1 alias peg1 off end # PEG1
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
#include <intelblocks/acpi.h>
|
#include <intelblocks/acpi.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/itss.h>
|
#include <intelblocks/itss.h>
|
||||||
#include <intelblocks/pcie_rp.h>
|
#include <intelblocks/pcie_rp.h>
|
||||||
#include <intelblocks/xdci.h>
|
#include <intelblocks/xdci.h>
|
||||||
|
@ -177,6 +178,8 @@ static void soc_enable(struct device *dev)
|
||||||
else if (dev->path.type == DEVICE_PATH_PCI &&
|
else if (dev->path.type == DEVICE_PATH_PCI &&
|
||||||
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
dev->path.pci.devfn == PCH_DEVFN_PMC)
|
||||||
dev->ops = &pmc_ops;
|
dev->ops = &pmc_ops;
|
||||||
|
else if (dev->path.type == DEVICE_PATH_GPIO)
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct chip_operations soc_intel_tigerlake_ops = {
|
struct chip_operations soc_intel_tigerlake_ops = {
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <intelblocks/gspi.h>
|
#include <intelblocks/gspi.h>
|
||||||
#include <intelblocks/power_limit.h>
|
#include <intelblocks/power_limit.h>
|
||||||
#include <soc/gpe.h>
|
#include <soc/gpe.h>
|
||||||
|
#include <soc/gpio.h>
|
||||||
#include <soc/pch.h>
|
#include <soc/pch.h>
|
||||||
#include <soc/pci_devs.h>
|
#include <soc/pci_devs.h>
|
||||||
#include <soc/pmc.h>
|
#include <soc/pmc.h>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
chip soc/intel/tigerlake
|
chip soc/intel/tigerlake
|
||||||
device domain 0 on
|
device domain 0 on
|
||||||
|
device gpio 0 alias pch_gpio on end
|
||||||
device pci 00.0 alias system_agent on end
|
device pci 00.0 alias system_agent on end
|
||||||
device pci 02.0 alias igpu off end
|
device pci 02.0 alias igpu off end
|
||||||
device pci 04.0 alias dptf off end
|
device pci 04.0 alias dptf off end
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include <console/debug.h>
|
#include <console/debug.h>
|
||||||
#include <cpu/x86/lapic.h>
|
#include <cpu/x86/lapic.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <intelblocks/lpc_lib.h>
|
#include <intelblocks/lpc_lib.h>
|
||||||
#include <intelblocks/p2sb.h>
|
#include <intelblocks/p2sb.h>
|
||||||
#include <soc/acpi.h>
|
#include <soc/acpi.h>
|
||||||
|
@ -61,6 +62,8 @@ static void chip_enable_dev(struct device *dev)
|
||||||
attach_iio_stacks(dev);
|
attach_iio_stacks(dev);
|
||||||
} else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
|
} else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
|
} else if (dev->path.type == DEVICE_PATH_GPIO) {
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#define _SOC_CHIP_H_
|
#define _SOC_CHIP_H_
|
||||||
|
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <soc/gpio.h>
|
||||||
#include <soc/irq.h>
|
#include <soc/irq.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include <cbfs.h>
|
#include <cbfs.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <device/pci.h>
|
#include <device/pci.h>
|
||||||
|
#include <intelblocks/gpio.h>
|
||||||
#include <soc/acpi.h>
|
#include <soc/acpi.h>
|
||||||
#include <soc/chip_common.h>
|
#include <soc/chip_common.h>
|
||||||
#include <soc/pch.h>
|
#include <soc/pch.h>
|
||||||
|
@ -37,6 +38,8 @@ static void soc_enable_dev(struct device *dev)
|
||||||
attach_iio_stacks(dev);
|
attach_iio_stacks(dev);
|
||||||
} else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
|
} else if (dev->path.type == DEVICE_PATH_CPU_CLUSTER) {
|
||||||
dev->ops = &cpu_bus_ops;
|
dev->ops = &cpu_bus_ops;
|
||||||
|
} else if (dev->path.type == DEVICE_PATH_GPIO) {
|
||||||
|
block_gpio_enable(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <intelblocks/cfg.h>
|
#include <intelblocks/cfg.h>
|
||||||
|
#include <soc/gpio.h>
|
||||||
#include <soc/irq.h>
|
#include <soc/irq.h>
|
||||||
|
|
||||||
struct soc_intel_xeon_sp_skx_config {
|
struct soc_intel_xeon_sp_skx_config {
|
||||||
|
|
Loading…
Reference in New Issue