Angel Pons has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/68554 )
Change subject: [WIP HACK] Hermes WoL misery ......................................................................
[WIP HACK] Hermes WoL misery
Change-Id: I2cdde8022e89c112a5bc2ceb57ae615d9b308068 Signed-off-by: Angel Pons th3fanbus@gmail.com --- M src/mainboard/prodrive/hermes/Makefile.inc M src/mainboard/prodrive/hermes/devicetree.cb A src/mainboard/prodrive/hermes/ethernet.c 3 files changed, 91 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/54/68554/1
diff --git a/src/mainboard/prodrive/hermes/Makefile.inc b/src/mainboard/prodrive/hermes/Makefile.inc index 63be66c..a46dda6 100644 --- a/src/mainboard/prodrive/hermes/Makefile.inc +++ b/src/mainboard/prodrive/hermes/Makefile.inc @@ -5,6 +5,7 @@
romstage-y += eeprom.c
+ramstage-y += ethernet.c ramstage-y += gpio.c ramstage-y += ramstage.c ramstage-y += mainboard.c diff --git a/src/mainboard/prodrive/hermes/devicetree.cb b/src/mainboard/prodrive/hermes/devicetree.cb index 70ff564..ec3666e 100644 --- a/src/mainboard/prodrive/hermes/devicetree.cb +++ b/src/mainboard/prodrive/hermes/devicetree.cb @@ -199,6 +199,7 @@ register "PcieRpEnable[4]" = "1" register "PcieRpLtrEnable[4]" = "1" device pci 00.0 on + ops mb_prodrive_hermes_ethernet_device_ops smbios_dev_info 3 end end @@ -206,6 +207,7 @@ register "PcieRpEnable[5]" = "1" register "PcieRpLtrEnable[5]" = "1" device pci 00.0 on + ops mb_prodrive_hermes_ethernet_device_ops smbios_dev_info 4 end end @@ -213,6 +215,7 @@ register "PcieRpEnable[6]" = "1" register "PcieRpLtrEnable[6]" = "1" device pci 00.0 on + ops mb_prodrive_hermes_ethernet_device_ops smbios_dev_info 2 end end @@ -220,6 +223,7 @@ register "PcieRpEnable[7]" = "1" register "PcieRpLtrEnable[7]" = "1" device pci 00.0 on + ops mb_prodrive_hermes_ethernet_device_ops smbios_dev_info 1 end end diff --git a/src/mainboard/prodrive/hermes/ethernet.c b/src/mainboard/prodrive/hermes/ethernet.c new file mode 100644 index 0000000..3f49cbf --- /dev/null +++ b/src/mainboard/prodrive/hermes/ethernet.c @@ -0,0 +1,76 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include <arch/io.h> +#include <console/console.h> +#include <device/device.h> +#include <device/mmio.h> +#include <device/pci.h> +#include <device/pci_ops.h> +#include <types.h> + +#include "chip.h" + +#define E1000_WUC 0x05800 +#define E1000_WUFC 0x05808 + +static inline uint32_t eth_mm_read32(uintptr_t base, uint32_t offset) +{ + return read32p(base + offset); +} + +static inline void eth_mm_write32(uintptr_t base, uint32_t offset, uint32_t value) +{ + write32p(base + offset, value); +} + +static inline uint32_t eth_io_read32(uint16_t base, uint32_t offset) +{ + outl(offset, base); + return inl(base + sizeof(uint32_t)); +} + +static inline void eth_io_write32(uint16_t base, uint32_t offset, uint32_t value) +{ + outl(offset, base); + outl(value, base + sizeof(uint32_t)); +} + +static void ethernet_final(struct device *dev) +{ + const bool enable_wol = false; + + printk(BIOS_INFO, "\nHERMES: %s WOL %sabled\n", dev_path(dev), enable_wol ? "En" : "Dis"); + + struct resource *res_mm = find_resource(dev, PCI_BASE_ADDRESS_0); + struct resource *res_io = find_resource(dev, PCI_BASE_ADDRESS_2); + + printk(BIOS_INFO, "\tMM BASE = %p\n", (void *)(uintptr_t)res_mm->base); + printk(BIOS_INFO, "\tIO BASE = %p\n", (void *)(uintptr_t)res_io->base); + printk(BIOS_INFO, "\n"); + + const uintptr_t mm_base = res_mm->base; + const uint16_t io_base = (uint16_t)(res_io->base & 0xffff); + + printk(BIOS_INFO, "\tMM WUC = 0x%08x\n", eth_mm_read32(mm_base, E1000_WUC)); + printk(BIOS_INFO, "\tIO WUC = 0x%08x\n", eth_io_read32(io_base, E1000_WUC)); + printk(BIOS_INFO, "\n"); + printk(BIOS_INFO, "\tMM WUFC = 0x%08x\n", eth_mm_read32(mm_base, E1000_WUFC)); + printk(BIOS_INFO, "\tIO WUFC = 0x%08x\n", eth_io_read32(io_base, E1000_WUFC)); + printk(BIOS_INFO, "\n"); + + //eth_io_write32(io_base, E1000_WUC, enable_wol ? 0xb : 0); + + printk(BIOS_INFO, "\tMM WUC = 0x%08x\n", eth_mm_read32(mm_base, E1000_WUC)); + printk(BIOS_INFO, "\tIO WUC = 0x%08x\n", eth_io_read32(io_base, E1000_WUC)); + printk(BIOS_INFO, "\n"); + + printk(BIOS_INFO, "\n"); +} + +struct device_operations mb_prodrive_hermes_ethernet_device_ops = { + .read_resources = pci_dev_read_resources, + .set_resources = pci_dev_set_resources, + .enable_resources = pci_dev_enable_resources, + .ops_pci = &pci_dev_ops_pci, + .final = ethernet_final, +};