Damien Zammit (damien@zamaudio.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3532
-gerrit
commit 9127fe99158a4db51eaab6cb6d68e786a51bfe98 Author: Damien Zammit damien@zamaudio.com Date: Wed Jun 26 06:25:39 2013 +1000
NOTFORMERGE: Preliminary support for new superio IT8728F.
Cloned from IT8718F and verified against the datasheet for the new model. So far untested on hardware, not sure how to obtain valid IRQ settings.
Change-Id: I82e23e2fe5f9651c4b7b5195b4ccee6d2d852fbe Signed-off-by: Damien Zammit damien@zamaudio.com --- src/superio/ite/Kconfig | 2 + src/superio/ite/Makefile.inc | 1 + src/superio/ite/it8728f/Makefile.inc | 22 +++++++ src/superio/ite/it8728f/chip.h | 33 +++++++++++ src/superio/ite/it8728f/early_serial.c | 105 +++++++++++++++++++++++++++++++++ src/superio/ite/it8728f/it8728.h | 40 +++++++++++++ src/superio/ite/it8728f/superio.c | 77 ++++++++++++++++++++++++ 7 files changed, 280 insertions(+)
diff --git a/src/superio/ite/Kconfig b/src/superio/ite/Kconfig index e1970e8..0cf112f 100644 --- a/src/superio/ite/Kconfig +++ b/src/superio/ite/Kconfig @@ -38,5 +38,7 @@ config SUPERIO_ITE_IT8718F bool config SUPERIO_ITE_IT8721F bool +config SUPERIO_ITE_IT8728F + bool config SUPERIO_ITE_IT8772F bool diff --git a/src/superio/ite/Makefile.inc b/src/superio/ite/Makefile.inc index ce595b8..8610eea 100644 --- a/src/superio/ite/Makefile.inc +++ b/src/superio/ite/Makefile.inc @@ -25,4 +25,5 @@ subdirs-y += it8712f subdirs-y += it8716f subdirs-y += it8718f subdirs-y += it8721f +subdirs-y += it8728f subdirs-y += it8772f diff --git a/src/superio/ite/it8728f/Makefile.inc b/src/superio/ite/it8728f/Makefile.inc new file mode 100644 index 0000000..0989eee --- /dev/null +++ b/src/superio/ite/it8728f/Makefile.inc @@ -0,0 +1,22 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2006 Uwe Hermann uwe@hermann-uwe.de +## +## 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 +## + +ramstage-$(CONFIG_SUPERIO_ITE_IT8728F) += superio.c + diff --git a/src/superio/ite/it8728f/chip.h b/src/superio/ite/it8728f/chip.h new file mode 100644 index 0000000..8013531 --- /dev/null +++ b/src/superio/ite/it8728f/chip.h @@ -0,0 +1,33 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2006 Uwe Hermann uwe@hermann-uwe.de + * + * 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 + */ + +#ifndef SUPERIO_ITE_IT8728F_CHIP_H +#define SUPERIO_ITE_IT8728F_CHIP_H + +#include <device/device.h> +#include <pc80/keyboard.h> +#include <uart8250.h> + +struct superio_ite_it8728f_config { + + struct pc_keyboard keyboard; +}; + +#endif diff --git a/src/superio/ite/it8728f/early_serial.c b/src/superio/ite/it8728f/early_serial.c new file mode 100644 index 0000000..43c431a --- /dev/null +++ b/src/superio/ite/it8728f/early_serial.c @@ -0,0 +1,105 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2006 Uwe Hermann uwe@hermann-uwe.de + * + * 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 + */ + +#include <arch/io.h> +#include "it8728f.h" + +/* The base address is 0x2e or 0x4e, depending on config bytes. */ +#define SIO_BASE 0x2e +#define SIO_INDEX SIO_BASE +#define SIO_DATA (SIO_BASE + 1) + +/* Global configuration registers. */ +#define IT8728F_CONFIG_REG_CC 0x02 /* Configure Control (write-only). */ +#define IT8728F_CONFIG_REG_LDN 0x07 /* Logical Device Number. */ +#define IT8728F_CONFIG_REG_CHIPVERS 0x22 /* Chip version */ +#define IT8728F_CONFIG_REG_CLOCKSEL 0x23 /* Clock Selection. */ +#define IT8728F_CONFIG_REG_SWSUSP 0x24 /* Software Suspend, Flash I/F. 'Special register' */ + +static void it8728f_sio_write(u8 ldn, u8 index, u8 value) +{ + outb(IT8728F_CONFIG_REG_LDN, SIO_BASE); + outb(ldn, SIO_DATA); + outb(index, SIO_BASE); + outb(value, SIO_DATA); +} + +static void it8728f_enter_conf(void) +{ + u16 port = 0x2e; /* TODO: Don't hardcode! */ + + outb(0x87, port); + outb(0x01, port); + outb(0x55, port); + outb((port == 0x4e) ? 0xaa : 0x55, port); +} + +static void it8728f_exit_conf(void) +{ + it8728f_sio_write(0x00, IT8728F_CONFIG_REG_CC, 0x02); +} + +/* Select 24MHz CLKIN (48MHz default). */ +void it8728f_24mhz_clkin(void) +{ + it8728f_enter_conf(); + it8728f_sio_write(0x00, IT8728F_CONFIG_REG_CLOCKSEL, 0x1); + it8728f_exit_conf(); +} + +/* + * GIGABYTE uses a special Super I/O register to protect its Dual BIOS + * mechanism. It lives in the GPIO LDN. However, register 0xEF is not + * mentioned in the IT8728F datasheet so just hardcode it to 0x7E for now. + * (This is what the IT8718F does too). + */ +void it8728f_disable_reboot(void) +{ + it8728f_enter_conf(); + it8728f_sio_write(IT8728F_GPIO, 0xEF, 0x7E); + it8728f_exit_conf(); +} + +/* Enable the serial port(s). */ +void it8728f_enable_serial(device_t dev, u16 iobase) +{ + /* (1) Enter the configuration state (MB PnP mode). */ + it8728f_enter_conf(); + + /* (2) Modify the data of configuration registers. */ + + /* + * Select the chip to configure (if there's more than one). + * Set bit 7 to select JP3=1, clear bit 7 to select JP3=0. + * If this register is not written, both chips are configured. + */ + + /* it8718f_sio_write(0x00, IT8718F_CONFIG_REG_CONFIGSEL, 0x00); */ + + /* Enable serial port(s). */ + it8728f_sio_write(IT8728F_SP1, 0x30, 0x1); /* Serial port 1 */ + it8728f_sio_write(IT8728F_SP2, 0x30, 0x1); /* Serial port 2 */ + + /* Clear software suspend mode (clear bit 0). TODO: Needed? */ + /* it8718f_sio_write(0x00, IT8718F_CONFIG_REG_SWSUSP, 0x00); */ + + /* (3) Exit the configuration state (MB PnP mode). */ + it8728f_exit_conf(); +} diff --git a/src/superio/ite/it8728f/it8728.h b/src/superio/ite/it8728f/it8728.h new file mode 100644 index 0000000..c669a8c --- /dev/null +++ b/src/superio/ite/it8728f/it8728.h @@ -0,0 +1,40 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2006 Uwe Hermann uwe@hermann-uwe.de + * + * 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 + */ + +#ifndef SUPERIO_ITE_IT8728F_IT8728F_H +#define SUPERIO_ITE_IT8728F_IT8728F_H + +#define IT8728F_FDC 0x00 /* Floppy */ +#define IT8728F_SP1 0x01 /* Com1 */ +#define IT8728F_SP2 0x02 /* Com2 */ +#define IT8728F_PP 0x03 /* Parallel port */ +#define IT8728F_EC 0x04 /* Environment controller */ +#define IT8728F_KBCK 0x05 /* PS/2 keyboard */ +#define IT8728F_KBCM 0x06 /* PS/2 mouse */ +#define IT8728F_GPIO 0x07 /* GPIO */ +#define IT8728F_IR 0x0a /* Consumer IR */ + +#if defined(__PRE_RAM__) +void it8728f_24mhz_clkin(void); +void it8728f_disable_reboot(void); +void it8728f_enable_serial(device_t dev, u16 iobase); +#endif + +#endif diff --git a/src/superio/ite/it8728f/superio.c b/src/superio/ite/it8728f/superio.c new file mode 100644 index 0000000..116e78a --- /dev/null +++ b/src/superio/ite/it8728f/superio.c @@ -0,0 +1,77 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2006 Uwe Hermann uwe@hermann-uwe.de + * + * 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 + */ + +#include <device/device.h> +#include <device/pnp.h> +#include <uart8250.h> +#include <pc80/keyboard.h> +#include <stdlib.h> +#include "chip.h" +#include "it8728f.h" + +static void init(device_t dev) +{ + struct superio_ite_it8728f_config *conf = dev->chip_info; + + if (!dev->enabled) + return; + + switch (dev->path.pnp.device) { + case IT8728F_FDC: /* TODO. */ + break; + case IT8728F_PP: /* TODO. */ + break; + case IT8728F_EC: /* TODO. */ + break; + case IT8728F_KBCK: + pc_keyboard_init(&conf->keyboard); + break; + case IT8728F_KBCM: /* TODO. */ + break; + case IT8728F_IR: /* TODO. */ + break; + } +} + +static struct device_operations ops = { + .read_resources = pnp_read_resources, + .set_resources = pnp_set_resources, + .enable_resources = pnp_enable_resources, + .enable = pnp_enable, + .init = init, +}; + +/* TODO: FDC, PP, EC, KBCM, IR. */ +static struct pnp_info pnp_dev_info[] = { +//??? { &ops, IT8728F_SP1, PNP_IO0 | PNP_IRQ0, {0x03f8, 0}, }, +//??? { &ops, IT8728F_SP2, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0 | PNP_DRQ1, {0x02f8, 0}, }, +//??? { &ops, IT8728F_KBCK, PNP_IO0 | PNP_IO1 | PNP_IRQ0, {0x07f8, 0}, {0x07f8, 4}, }, +}; + +static void enable_dev(struct device *dev) +{ + pnp_enable_devices(dev, &pnp_ops, + ARRAY_SIZE(pnp_dev_info), pnp_dev_info); +} + +struct chip_operations superio_ite_it8718f_ops = { + CHIP_NAME("ITE IT8728F Super I/O") + .enable_dev = enable_dev, +};