Edward O'Callaghan (eocallaghan(a)alterapraxis.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5385
-gerrit
commit f326fbb085ba696c6e0daa4f31b1d00a182cb20b
Author: Edward O'Callaghan <eocallaghan(a)alterapraxis.com>
Date: Fri Mar 14 01:06:22 2014 +1100
drivers/hwm: Add a generic hwm driver.
Make generic, testing with Fintek Super I/O....
currently wired in to fintek superio, need to move ararry of
values to mainboard.c and fix linkage issue???
Change-Id: Ic7bdea55907e379aad9e74b87b514e8038ef9fd0
Signed-off-by: Edward O'Callaghan <eocallaghan(a)alterapraxis.com>
---
src/drivers/Kconfig | 1 +
src/drivers/hwm/Kconfig | 6 ++
src/drivers/hwm/Makefile.inc | 20 ++++++
src/drivers/hwm/superio_hwm.c | 118 ++++++++++++++++++++++++++++++++++
src/include/hwm/superio_hwm.h | 32 +++++++++
src/superio/fintek/f71869ad/chip.h | 1 +
src/superio/fintek/f71869ad/superio.c | 5 +-
7 files changed, 182 insertions(+), 1 deletion(-)
diff --git a/src/drivers/Kconfig b/src/drivers/Kconfig
index 5267ff8..6b793d9 100644
--- a/src/drivers/Kconfig
+++ b/src/drivers/Kconfig
@@ -40,3 +40,4 @@ source src/drivers/trident/Kconfig
source src/drivers/uart/Kconfig
source src/drivers/usb/Kconfig
source src/drivers/xpowers/Kconfig
+source src/drivers/hwm/Kconfig
diff --git a/src/drivers/hwm/Kconfig b/src/drivers/hwm/Kconfig
new file mode 100644
index 0000000..5ef1b5c
--- /dev/null
+++ b/src/drivers/hwm/Kconfig
@@ -0,0 +1,6 @@
+config SUPERIO_HWM
+ bool "Super I/O HWM"
+ default y
+ help
+ Just enough of a driver to make coreboot control system fans.
+ No configuration is necessary for the OS to pick up the device.
diff --git a/src/drivers/hwm/Makefile.inc b/src/drivers/hwm/Makefile.inc
new file mode 100644
index 0000000..9777667
--- /dev/null
+++ b/src/drivers/hwm/Makefile.inc
@@ -0,0 +1,20 @@
+##
+## This file is part of the coreboot project.
+##
+## Copyright (C) 2014 Edward O'Callaghan <eocallaghan(a)alterapraxis.com>
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; version 2 of the License.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+##
+
+ramstage-$(CONFIG_SUPERIO_HWM) += superio_hwm.c
diff --git a/src/drivers/hwm/superio_hwm.c b/src/drivers/hwm/superio_hwm.c
new file mode 100644
index 0000000..8c3bfab
--- /dev/null
+++ b/src/drivers/hwm/superio_hwm.c
@@ -0,0 +1,118 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2014 Edward O'Callaghan <eocallaghan(a)alterapraxis.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/* This code should work for all Fintek Super I/O HWM's. */
+#include <arch/io.h>
+#include <console/console.h>
+#include <device/device.h>
+#include <device/pnp.h>
+#include <stdlib.h>
+#include "superio_hwm.h"
+
+/* Helper functions */
+static void pnp_write_index(u16 port, u8 reg, u8 value)
+{
+ outb(reg, port);
+ outb(value, port + 1);
+}
+
+static u8 pnp_read_index(u16 port, u8 reg)
+{
+ outb(reg, port);
+ return inb(port + 1);
+}
+/* .. */
+
+/* Initialize F71869AD hardware monitor registers, which are at 0x225. */
+/* XXX: make configurable.. */
+static void init_registers(u16 base)
+{
+ u8 reg, value;
+ int i;
+
+ /* XXX: work out correct values??? */
+ u8 hwm_reg_values[] = {
+ /* reg mask data */
+ 0x01, 0x03, 0x03,
+ 0x08, 0x26, 0x98,
+ 0x0a, 0x40, 0x00,
+ 0x0d, 0x00, 0x00,
+ 0x0e, 0xff, 0x55,
+ 0x0f, 0x20, 0x20,
+ };
+
+ for (i = 0; i < ARRAY_SIZE(hwm_reg_values); i += 3) {
+ reg = hwm_reg_values[i];
+ value = pnp_read_index(base, reg);
+ value &= 0xff & hwm_reg_values[i + 1];
+ value |= 0xff & hwm_reg_values[i + 2];
+ printk(BIOS_DEBUG, "Super I/O HWM: base = 0x%04x, reg = 0x%02x, "
+ "value = 0x%02x\n", base, reg, value);
+ pnp_write_index(base, reg, value);
+ }
+}
+/* .. */
+
+/* Main driver */
+void hwm_init(device_t dev)
+{
+ /* return if hwm is disabled in devicetree.cb */
+ struct drivers_superio_hwm_config *config = dev->chip_info;
+ if (!dev->enabled || !config)
+ return;
+
+ u32 hwm_base = config->base;
+
+ printk(BIOS_DEBUG, "Super I/O HWM: Initializing Hardware Monitor at pci %04x\n"
+ , hwm_base);
+
+ struct resource *res = find_resource(dev, PNP_IDX_IO0);
+ if (!res) {
+ printk(BIOS_WARNING, "Super I/O HWM: No HWM resource found.\n");
+ return;
+ }
+
+ printk(BIOS_DEBUG, "Super I/O HWM: Base Address at 0x%x\n", (u32)res->base);
+ printk(BIOS_WARNING, "Super I/O HWM: Configuring registers...\n");
+ init_registers(res->base);
+}
+
+/*
+static void hwm_noop(device_t dummy)
+{
+}
+
+static struct device_operations hwm_ops = {
+ .read_resources = hwm_noop,
+ .set_resources = hwm_noop,
+ .enable_resources = hwm_noop,
+ .init = hwm_init,
+};
+
+static void enable_dev(device_t dev)
+{
+ dev->ops = &hwm_ops;
+}
+
+struct chip_operations hwm_fintek_ops = {
+ CHIP_NAME("Super I/O Hardware Monitor.")
+ .enable_dev = enable_dev
+};
+*/
diff --git a/src/include/hwm/superio_hwm.h b/src/include/hwm/superio_hwm.h
new file mode 100644
index 0000000..49e431c
--- /dev/null
+++ b/src/include/hwm/superio_hwm.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2014 Edward O'Callaghan <eocallaghan(a)alterapraxis.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef DRIVERS_SUPERIO_HWM_H
+#define DRIVERS_SUPERIO_HWM_H
+
+#include <device/device.h>
+
+/* Initialization parameters?? */
+typedef struct drivers_superio_hwm_config {
+ u32 base;
+} hwm_config_t;
+
+void hwm_init(device_t dev);
+
+#endif /* DRIVERS_SUPERIO_HWM_H */
diff --git a/src/superio/fintek/f71869ad/chip.h b/src/superio/fintek/f71869ad/chip.h
index 5b18c33..fe5be17 100644
--- a/src/superio/fintek/f71869ad/chip.h
+++ b/src/superio/fintek/f71869ad/chip.h
@@ -21,6 +21,7 @@
#ifndef SUPERIO_FINTEK_F71869AD_CHIP_H
#define SUPERIO_FINTEK_F71869AD_CHIP_H
+#include <hwm/superio_hwm.h>
#include <pc80/keyboard.h>
#include <device/device.h>
diff --git a/src/superio/fintek/f71869ad/superio.c b/src/superio/fintek/f71869ad/superio.c
index 11ad6f8..97e65b9 100644
--- a/src/superio/fintek/f71869ad/superio.c
+++ b/src/superio/fintek/f71869ad/superio.c
@@ -37,6 +37,9 @@ static void f71869ad_init(device_t dev)
switch(dev->path.pnp.device) {
/* TODO: Might potentially need code for HWM or FDC etc. */
+ case F71869AD_HWM:
+ hwm_init(dev);
+ break;
case F71869AD_KBC:
pc_keyboard_init(&conf->keyboard);
break;
@@ -109,7 +112,7 @@ static struct pnp_info pnp_dev_info[] = {
{ &ops, F71869AD_SP1, PNP_IO0 | PNP_IRQ0, {0x07f8, 0}, },
{ &ops, F71869AD_SP2, PNP_IO0 | PNP_IRQ0, {0x07f8, 0}, },
{ &ops, F71869AD_PP, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, {0x07f8, 0}, },
- { &ops, F71869AD_HWM, PNP_IO0 | PNP_IRQ0, {0x0ff8, 0}, },
+ { &ops, F71869AD_HWM, PNP_IO0 | PNP_IRQ0, {0x07f8, 0}, },
{ &ops, F71869AD_KBC, PNP_IO0 | PNP_IRQ0 | PNP_IRQ1, {0x07ff, 0}, },
{ &ops, F71869AD_GPIO, },
{ &ops, F71869AD_BSEL, PNP_IO0, {0x07f8, 0}, },
Mono Moosbart (mono(a)posteo.de) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5387
-gerrit
commit a2db75519444c5056a0eeb8ad12cf23b49c2bbc8
Author: Mono <mono(a)posteo.de>
Date: Sat Mar 15 21:27:18 2014 +0100
intel/i945: Only write CID, PN, TCID, and ULBA once
Component ID (CID) in Element Self Description Register (ESD)
can be written once only. The current implementation tries
to write CID three times. The second and third write operations
have no effect. Moreover, the current implementation does not
make sure the read-only bits remain unchanged.
The same is true for Target Port Number (PN) and
Target Component ID (TCID) in Upstream Link Descriptor Register (ULD).
The current implementation tries to write those bits twice. The second
operation is ignored.
Upstream Link Base Address Register (ULBA) is affected too.
Change-Id: Iea731951af2411cbada77ccdcaacca239e4ffdc6
Signed-off-by: Mono <mono(a)posteo.de>
---
src/northbridge/intel/i945/early_init.c | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/src/northbridge/intel/i945/early_init.c b/src/northbridge/intel/i945/early_init.c
index 57232af..47b8afc 100644
--- a/src/northbridge/intel/i945/early_init.c
+++ b/src/northbridge/intel/i945/early_init.c
@@ -310,7 +310,6 @@ static void ich7_setup_dmi_rcrb(void)
RCBA32(V0CTL) = 0x80000001;
RCBA32(V1CAP) = 0x03128010;
- RCBA32(ESD) = 0x00000810;
RCBA32(RP1D) = 0x01000003;
RCBA32(RP2D) = 0x02000002;
RCBA32(RP3D) = 0x03000002;
@@ -332,12 +331,6 @@ static void ich7_setup_dmi_rcrb(void)
reg32 |= (0x40 << 1) | (4 << 17) | (1 << 24) | (1 << 31);
RCBA32(V1CTL) = reg32;
- RCBA32(ESD) |= (2 << 16);
-
- RCBA32(ULD) |= (1 << 24) | (1 << 16);
-
- RCBA32(ULBA) = DEFAULT_DMIBAR;
-
RCBA32(RP1D) |= (2 << 16);
RCBA32(RP2D) |= (2 << 16);
RCBA32(RP3D) |= (2 << 16);
@@ -845,10 +838,14 @@ static void i945_setup_root_complex_topology(void)
static void ich7_setup_root_complex_topology(void)
{
- RCBA32(0x104) = 0x00000802;
- RCBA32(0x110) = 0x00000001;
+ /* Component ID (CID), Write-Once bit */
+ RCBA32(ESD) |= (2 << 16);
+ /* Target Port Number (PN) and Target Component ID (TCID), Write-Once bits */
+ RCBA32(ULD) |= (1 << 24) | (1 << 16);
+ /* What is this? */
RCBA32(0x114) = 0x00000000;
- RCBA32(0x118) = 0x00000000;
+ /* Upstream Link Base Address Register (ULBA), Write-Once register */
+ RCBA32(ULBA) = DEFAULT_DMIBAR;
}
static void ich7_setup_pci_express(void)
Paul Menzel (paulepanter(a)users.sourceforge.net) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5388
-gerrit
commit 0a2020d1490beea49db89c38585002ded9ecc9fa
Author: Paul Menzel <paulepanter(a)users.sourceforge.net>
Date: Sun Mar 16 00:15:57 2014 +0100
util/cbfstool: Use `%zu` instead of `%ld` for size_t arguments
Since commit aa2f739a (cbfs: fix issues with word size and endianness.) [1]
cbfstool fails to built under 32-bit platforms.
error: format ‘%ld’ expects argument of type ‘long int’, but argument 3 has type ‘size_t’
Some of these errors were fixed indirectly by subsequent patches, but not
all of them.
Also no error is seen when building a coreboot image which indirectly
builds cbfstool at `build/cbfstool` too.
For arguments of size_t the length modifier `z` and, as sizes are
non-negative, the conversion specifier `u` should be used, so use `%zu`
instead of `%ld` as the format string.
[1] http://review.coreboot.org/4817
Change-Id: Id84a20fbf237376a31f7e4816bd139463800c977
Signed-off-by: Paul Menzel <paulepanter(a)users.sourceforge.net>
---
util/cbfstool/cbfs-mkstage.c | 2 +-
util/cbfstool/elfheaders.c | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/util/cbfstool/cbfs-mkstage.c b/util/cbfstool/cbfs-mkstage.c
index 6aa3746..eadc775 100644
--- a/util/cbfstool/cbfs-mkstage.c
+++ b/util/cbfstool/cbfs-mkstage.c
@@ -132,7 +132,7 @@ int parse_elf_to_stage(const struct buffer *input, struct buffer *output,
continue;
if (input->size < (phdr[i].p_offset + phdr[i].p_filesz)){
ERROR("Underflow copying out the segment."
- "File has %ld bytes left, segment end is %ld\n",
+ "File has %zd bytes left, segment end is %zd\n",
input->size, phdr[i].p_offset + phdr[i].p_filesz);
return -1;
}
diff --git a/util/cbfstool/elfheaders.c b/util/cbfstool/elfheaders.c
index f3ed05c..816278f 100644
--- a/util/cbfstool/elfheaders.c
+++ b/util/cbfstool/elfheaders.c
@@ -147,7 +147,7 @@ check_size(const struct buffer *b, size_t offset, size_t size, const char *desc)
if (offset >= buffer_size(b) || (offset + size) > buffer_size(b)) {
ERROR("The file is not large enough for the '%s'. "
- "%ld bytes @ offset %zu, input %zu bytes.\n",
+ "%zu bytes @ offset %zu, input %zu bytes.\n",
desc, size, offset, buffer_size(b));
return -1;
}
Mono Moosbart (mono(a)posteo.de) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/5387
-gerrit
commit 7dab609e9f582f9872d43b5c5e9e17e7dcff1f17
Author: Mono <mono(a)posteo.de>
Date: Sat Mar 15 21:27:18 2014 +0100
intel/i945: Only write CID, PN and TCID once
Component ID (CID) in Element Self Description Register (ESD)
can be written once only. The current implementation tries
to write CID three times. The second and third write operations
have no effect. Moreover, the current implementation does not
make sure the read-only bits remain unchanged.
The same is true for Target Port Number (PN) and
Target Component ID (TCID) in Upstream Link Descriptor Register (ULD).
The current implementation tries to write those bits twice. The second
operation is ignored.
Change-Id: Iea731951af2411cbada77ccdcaacca239e4ffdc6
Signed-off-by: Mono <mono(a)posteo.de>
---
src/northbridge/intel/i945/early_init.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/src/northbridge/intel/i945/early_init.c b/src/northbridge/intel/i945/early_init.c
index 57232af..d04a17c 100644
--- a/src/northbridge/intel/i945/early_init.c
+++ b/src/northbridge/intel/i945/early_init.c
@@ -310,7 +310,6 @@ static void ich7_setup_dmi_rcrb(void)
RCBA32(V0CTL) = 0x80000001;
RCBA32(V1CAP) = 0x03128010;
- RCBA32(ESD) = 0x00000810;
RCBA32(RP1D) = 0x01000003;
RCBA32(RP2D) = 0x02000002;
RCBA32(RP3D) = 0x03000002;
@@ -332,10 +331,6 @@ static void ich7_setup_dmi_rcrb(void)
reg32 |= (0x40 << 1) | (4 << 17) | (1 << 24) | (1 << 31);
RCBA32(V1CTL) = reg32;
- RCBA32(ESD) |= (2 << 16);
-
- RCBA32(ULD) |= (1 << 24) | (1 << 16);
-
RCBA32(ULBA) = DEFAULT_DMIBAR;
RCBA32(RP1D) |= (2 << 16);
@@ -845,8 +840,10 @@ static void i945_setup_root_complex_topology(void)
static void ich7_setup_root_complex_topology(void)
{
- RCBA32(0x104) = 0x00000802;
- RCBA32(0x110) = 0x00000001;
+ /* Component ID (CID), Write-Once bit */
+ RCBA32(ESD) |= (2 << 16);
+ /* Target Port Number (PN) and Target Component ID (TCID), Write-Once bits */
+ RCBA32(ULD) |= (1 << 24) | (1 << 16);
RCBA32(0x114) = 0x00000000;
RCBA32(0x118) = 0x00000000;
}