Andrew Wu (arw@dmp.com.tw) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3473
-gerrit
commit 9abfac9988aa651a239f8d2c9fad2d26b14f6d52 Author: Andrew Wu arw@dmp.com.tw Date: Sun Jun 16 01:47:58 2013 +0800
Add initial support for DMP Vortex86EX mainboard.
Change-Id: I74de250c69a57109362be1b2f00c0b4aa24a64e8 Signed-off-by: Andrew Wu arw@dmp.com.tw --- src/cpu/Kconfig | 1 + src/cpu/Makefile.inc | 1 + src/cpu/dmp/Kconfig | 20 + src/cpu/dmp/Makefile.inc | 20 + src/cpu/dmp/vortex86ex/Kconfig | 22 + src/cpu/dmp/vortex86ex/Makefile.inc | 31 + src/cpu/dmp/vortex86ex/biosdata.inc | 84 ++ src/cpu/dmp/vortex86ex/biosdata.lds | 84 ++ src/cpu/dmp/vortex86ex/biosdata_ex.inc | 195 +++ src/cpu/dmp/vortex86ex/biosdata_ex.lds | 35 + src/cpu/dmp/vortex86ex/dmp_kbd_fw_part1.inc | 531 +++++++++ src/mainboard/Kconfig | 3 + src/mainboard/dmp/Kconfig | 36 + src/mainboard/dmp/vortex86ex/Kconfig | 1651 ++++++++++++++++++++++++++ src/mainboard/dmp/vortex86ex/chip.h | 23 + src/mainboard/dmp/vortex86ex/devicetree.cb | 34 + src/mainboard/dmp/vortex86ex/irq_tables.c | 57 + src/mainboard/dmp/vortex86ex/mainboard.c | 35 + src/mainboard/dmp/vortex86ex/romstage.c | 428 +++++++ src/northbridge/Kconfig | 1 + src/northbridge/Makefile.inc | 1 + src/northbridge/dmp/Kconfig | 20 + src/northbridge/dmp/Makefile.inc | 20 + src/northbridge/dmp/vortex86ex/Kconfig | 27 + src/northbridge/dmp/vortex86ex/Makefile.inc | 21 + src/northbridge/dmp/vortex86ex/bootblock.c | 76 ++ src/northbridge/dmp/vortex86ex/chip.h | 26 + src/northbridge/dmp/vortex86ex/northbridge.c | 147 +++ src/northbridge/dmp/vortex86ex/northbridge.h | 76 ++ src/northbridge/dmp/vortex86ex/raminit.c | 559 +++++++++ src/northbridge/dmp/vortex86ex/xgi_oprom.c | 35 + src/southbridge/Kconfig | 1 + src/southbridge/Makefile.inc | 1 + src/southbridge/dmp/Kconfig | 20 + src/southbridge/dmp/Makefile.inc | 20 + src/southbridge/dmp/vortex86ex/Kconfig | 27 + src/southbridge/dmp/vortex86ex/Makefile.inc | 22 + src/southbridge/dmp/vortex86ex/bootblock.c | 68 ++ src/southbridge/dmp/vortex86ex/chip.h | 38 + src/southbridge/dmp/vortex86ex/hard_reset.c | 25 + src/southbridge/dmp/vortex86ex/ide_sd_sata.c | 171 +++ src/southbridge/dmp/vortex86ex/southbridge.c | 563 +++++++++ src/southbridge/dmp/vortex86ex/southbridge.h | 89 ++ 43 files changed, 5345 insertions(+)
diff --git a/src/cpu/Kconfig b/src/cpu/Kconfig index d1e5237..788e219 100644 --- a/src/cpu/Kconfig +++ b/src/cpu/Kconfig @@ -12,6 +12,7 @@ endif # ARCH_ARM if ARCH_X86
source src/cpu/amd/Kconfig +source src/cpu/dmp/Kconfig source src/cpu/intel/Kconfig source src/cpu/via/Kconfig source src/cpu/qemu-x86/Kconfig diff --git a/src/cpu/Makefile.inc b/src/cpu/Makefile.inc index 8b9d074..09d36ec 100644 --- a/src/cpu/Makefile.inc +++ b/src/cpu/Makefile.inc @@ -2,6 +2,7 @@ ## Subdirectories ################################################################################ subdirs-y += amd +subdirs-y += dmp subdirs-y += armltd subdirs-y += intel subdirs-y += samsung diff --git a/src/cpu/dmp/Kconfig b/src/cpu/dmp/Kconfig new file mode 100644 index 0000000..db7e2bd --- /dev/null +++ b/src/cpu/dmp/Kconfig @@ -0,0 +1,20 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +source src/cpu/dmp/vortex86ex/Kconfig diff --git a/src/cpu/dmp/Makefile.inc b/src/cpu/dmp/Makefile.inc new file mode 100644 index 0000000..002212c --- /dev/null +++ b/src/cpu/dmp/Makefile.inc @@ -0,0 +1,20 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +subdirs-$(CONFIG_CPU_DMP_VORTEX86EX) += vortex86ex diff --git a/src/cpu/dmp/vortex86ex/Kconfig b/src/cpu/dmp/vortex86ex/Kconfig new file mode 100644 index 0000000..54db4e0 --- /dev/null +++ b/src/cpu/dmp/vortex86ex/Kconfig @@ -0,0 +1,22 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +config CPU_DMP_VORTEX86EX + bool + select UDELAY_TSC diff --git a/src/cpu/dmp/vortex86ex/Makefile.inc b/src/cpu/dmp/vortex86ex/Makefile.inc new file mode 100644 index 0000000..ff0b58c --- /dev/null +++ b/src/cpu/dmp/vortex86ex/Makefile.inc @@ -0,0 +1,31 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +subdirs-y += ../../x86/tsc +subdirs-y += ../../x86/mtrr +subdirs-y += ../../x86/lapic +subdirs-y += ../../x86/cache +subdirs-y += ../../x86/smm + +chipset_bootblock_inc += $(src)/cpu/dmp/vortex86ex/biosdata.inc +chipset_bootblock_inc += $(src)/cpu/dmp/vortex86ex/biosdata_ex.inc +chipset_bootblock_lds += $(src)/cpu/dmp/vortex86ex/biosdata.lds +chipset_bootblock_lds += $(src)/cpu/dmp/vortex86ex/biosdata_ex.lds + +ROMCCFLAGS := -mcpu=i386 -O2 diff --git a/src/cpu/dmp/vortex86ex/biosdata.inc b/src/cpu/dmp/vortex86ex/biosdata.inc new file mode 100644 index 0000000..055fffe --- /dev/null +++ b/src/cpu/dmp/vortex86ex/biosdata.inc @@ -0,0 +1,84 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + + .section ".dmp_reserved", "a", @progbits + + .skip 0x3c000 - 0x3bc00, 0xff + +.previous + + .section ".dmp_kbd_fw_part2", "a", @progbits + + .skip 0x3d000 - 0x3c000, 0xff + +.previous + + .section ".dmp_mtbf_low_cnt", "a", @progbits + + .skip 0x3e000 - 0x3d000, 0xff + +.previous + + .section ".dmp_kbd_fw_part1", "a", @progbits + + #include "src/cpu/dmp/vortex86ex/dmp_kbd_fw_part1.inc" + +.previous + + .section ".dmp_spi_flash_disk_driver", "a", @progbits + + .skip 0x3f800 - 0x3f000, 0xff + +.previous + + .section ".dmp_frontdoor", "a", @progbits + + .skip 0x3fd00 - 0x3f800, 0xff + +.previous + + .section ".dmp_isoinfo", "a", @progbits + + .skip 26 * 16, 0xff + +.previous + + .section ".dmp_isodata_checksum", "a", @progbits + + .skip 8, 0xff + +.previous + + .section ".dmp_mac", "a", @progbits + + .skip 6, 0xff + +.previous + + .section ".dmp_mtbf_limit", "a", @progbits + + .skip 3, 0xff + +.previous + + .section ".dmp_isodata", "a", @progbits + + .skip 32, 0xff + +.previous diff --git a/src/cpu/dmp/vortex86ex/biosdata.lds b/src/cpu/dmp/vortex86ex/biosdata.lds new file mode 100644 index 0000000..b525b2a --- /dev/null +++ b/src/cpu/dmp/vortex86ex/biosdata.lds @@ -0,0 +1,84 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +SECTIONS { + + /* Vortex86 ROM fixed data areas used range is too big, we need + * to move bootblock from default address to another place, + * otherwise .dmp_frontdoor section can't be included. + * Address before ..fbc00 is available. + */ + ROMLOC_MIN = 0xffffbc00 - (_erom - _rom + 16) - + (CONFIG_SIPI_VECTOR_IN_ROM ? 4096 : 0); + + . = 0xffffbc00; + .dmp_reserved (.): { + *(.dmp_reserved) + } + + . = 0xffffc000; + .dmp_kbd_fw_part2 (.): { + *(.dmp_kbd_fw_part2) + } + + . = 0xffffd000; + .dmp_mtbf_low_cnt (.): { + *(.dmp_mtbf_low_cnt) + } + + . = 0xffffe000; + .dmp_kbd_fw_part1 (.): { + *(.dmp_kbd_fw_part1) + } + + . = 0xfffff000; + .dmp_spi_flash_disk_driver (.): { + *(.dmp_spi_flash_disk_driver) + } + + . = 0xfffff800; + .dmp_frontdoor (.): { + *(.dmp_frontdoor) + } + + . = 0xfffffe00; + .dmp_isoinfo (.): { + *(.dmp_isoinfo) + } + + . = 0xffffffa0; + .dmp_isodata_checksum (.): { + *(.dmp_isodata_checksum) + } + + . = 0xffffffb0; + .dmp_mac (.): { + *(.dmp_mac) + } + + . = 0xffffffb8; + .dmp_mtbf_limit (.): { + *(.dmp_mtbf_limit) + } + + . = 0xffffffc0; + .dmp_isodata (.): { + *(.dmp_isodata) + } +} diff --git a/src/cpu/dmp/vortex86ex/biosdata_ex.inc b/src/cpu/dmp/vortex86ex/biosdata_ex.inc new file mode 100644 index 0000000..5005dea --- /dev/null +++ b/src/cpu/dmp/vortex86ex/biosdata_ex.inc @@ -0,0 +1,195 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include "config.h" + +/* +PLL Freq = 25 * NS /(MS * 2^RS) +CPU Freq = PLL/(CPU_DIV+2) +DRAM Freq = PLL/2(DRAM_DIV+1) + +DDR3 +CPU/DRAM/PCI B6 B7 BB BC BD BF +200/200/33 30 03 0F 02 8F 07 +300/300/33 48 03 0F 02 1F 07 +300/300/33 48 03 0F 3A DF 07 ; write leveling disable, cpu bypass disable +300/300/33 48 03 0F 22 3F 07 ; cpu bypass disable +300/300/100 48 03 23 02 7F 07 +400/200/33 60 43 0F 02 3F 07 ; without 200MHz timing, so set 300MHz timing +400/200/100 60 43 23 02 4F 07 +400/400/33 60 03 0F 02 BF 09 +500/250/33 50 42 0F 02 DF 07 +500/500/33 78 03 0F 02 4F 09 +400/300/33 90 53 0F 02 3F 07 +400/300/33 90 53 0F 1A DF 07 ; write leveling/gate training disable +400/300/100 90 53 23 02 9F 07 +444/333/33 A0 53 0F 02 5F 08 +466/350/33 A8 53 0F 02 DF 09 +500/375/33 B4 53 0F 02 AF 09 + +DDR3: +Board ID +0 +1 +2 +3 +4 +5 +6 : 200 +7 : 300 +8 : 333 +9 : 400 +A : 467 +B : 533 +C : 600 +D : 667 +E : 733 +F : 800 +*/ + +#if CONFIG_PLL_200_200_33 + // 200/200/33 30 03 0F 02 8F 07 + byte_fffb6 = 0x30 + byte_fffb7 = 0x03 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_300_300_33 + // 300/300/33 48 03 0F 02 1F 07 + byte_fffb6 = 0x48 + byte_fffb7 = 0x03 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_300_300_100 + // 300/300/100 48 03 23 02 7F 07 + byte_fffb6 = 0x48 + byte_fffb7 = 0x03 + byte_fffbb = 0x23 + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_400_200_33 + // 400/200/33 60 43 0F 02 3F 07 ; without 200MHz timing, so set 300MHz timing + byte_fffb6 = 0x60 + byte_fffb7 = 0x43 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_400_200_100 + // 400/200/100 60 43 23 02 4F 07 + byte_fffb6 = 0x60 + byte_fffb7 = 0x43 + byte_fffbb = 0x23 + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_400_400_33 + // 400/400/33 60 03 0F 02 BF 09 + byte_fffb6 = 0x60 + byte_fffb7 = 0x03 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x09 +#elif CONFIG_PLL_500_250_33 + // 500/250/33 50 42 0F 02 DF 07 + byte_fffb6 = 0x50 + byte_fffb7 = 0x42 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_500_500_33 + // 500/500/33 78 03 0F 02 4F 09 + byte_fffb6 = 0x78 + byte_fffb7 = 0x03 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x09 +#elif CONFIG_PLL_400_300_33 + // 400/300/33 90 53 0F 02 3F 07 + byte_fffb6 = 0x90 + byte_fffb7 = 0x53 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_400_300_100 + // 400/300/100 90 53 23 02 9F 07 + byte_fffb6 = 0x90 + byte_fffb7 = 0x53 + byte_fffbb = 0x23 + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x07 +#elif CONFIG_PLL_444_333_33 + // 444/333/33 A0 53 0F 02 5F 08 + byte_fffb6 = 0xa0 + byte_fffb7 = 0x53 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x08 +#elif CONFIG_PLL_466_350_33 + // 466/350/33 A8 53 0F 02 DF 09 + byte_fffb6 = 0xa8 + byte_fffb7 = 0x53 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x09 +#elif CONFIG_PLL_500_375_33 + // 500/375/33 B4 53 0F 02 AF 09 + byte_fffb6 = 0xb4 + byte_fffb7 = 0x53 + byte_fffbb = 0x0f + byte_fffbc = 0x02 + byte_fffbe = 0xff + byte_fffbf = 0x09 +#else + #error Error Strap PLL config. +#endif + +tmp_sum = byte_fffb6 + byte_fffb7 + byte_fffbb + byte_fffbc +pll_checksum = ((tmp_sum >> 8) & 0x3) + ((tmp_sum >> 4) & 0x0f) + (tmp_sum & 0x0f) + +byte_fffbd = ((pll_checksum & 0x0f) << 4) | 0x0f + + .section ".a9123_crossbar_config", "a", @progbits + + .skip 0x3fdf0 - 0x3fd00, 0xff + +.previous + + .section ".a9123_strap_1", "a", @progbits + + .byte byte_fffb6, byte_fffb7 + +.previous + + .section ".a9123_strap_2", "a", @progbits + + .byte byte_fffbb, byte_fffbc, byte_fffbd, byte_fffbe, byte_fffbf + +.previous diff --git a/src/cpu/dmp/vortex86ex/biosdata_ex.lds b/src/cpu/dmp/vortex86ex/biosdata_ex.lds new file mode 100644 index 0000000..d711648 --- /dev/null +++ b/src/cpu/dmp/vortex86ex/biosdata_ex.lds @@ -0,0 +1,35 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +SECTIONS { + . = 0xfffffd00; + .a9123_crossbar_config (.): { + *(.a9123_crossbar_config) + } + + . = 0xffffffb6; + .a9123_strap_1 (.): { + *(.a9123_strap_1) + } + + . = 0xffffffbb; + .a9123_strap_2 (.): { + *(.a9123_strap_2) + } +} diff --git a/src/cpu/dmp/vortex86ex/dmp_kbd_fw_part1.inc b/src/cpu/dmp/vortex86ex/dmp_kbd_fw_part1.inc new file mode 100644 index 0000000..486bf1b --- /dev/null +++ b/src/cpu/dmp/vortex86ex/dmp_kbd_fw_part1.inc @@ -0,0 +1,531 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + + .byte 0x02, 0x04, 0xa3, 0x02, 0x0a, 0xfb, 0xef, 0x75 + .byte 0xf0, 0x03, 0xa4, 0xff, 0xae, 0x07, 0x1f, 0xee + .byte 0x70, 0xfa, 0x22, 0x02, 0x0a, 0xd5, 0x12, 0x09 + .byte 0x5e, 0x7f, 0x30, 0x12, 0x05, 0xfb, 0x90, 0xe0 + .byte 0x00, 0x74, 0x16, 0xf0, 0x12, 0x0d, 0xda, 0xc2 + .byte 0x92, 0xc2, 0x93, 0xc2, 0x90, 0xd2, 0x91, 0xd2 + .byte 0xb8, 0xd2, 0xba, 0xd2, 0x88, 0xd2, 0xa8, 0xd2 + .byte 0x8a, 0xd2, 0xaa, 0x7d, 0x44, 0xe4, 0xff, 0x12 + .byte 0x0e, 0x3a, 0x7d, 0x4d, 0x0f, 0x12, 0x0e, 0x3a + .byte 0x7d, 0x26, 0x0f, 0x12, 0x0e, 0x3a, 0x7d, 0x50 + .byte 0x0f, 0x12, 0x0e, 0x3a, 0x12, 0x0e, 0x59, 0xd2 + .byte 0xaf, 0x7f, 0xb1, 0x12, 0x0e, 0xf5, 0x90, 0x0f + .byte 0xfe, 0xe4, 0x93, 0xff, 0xb4, 0x55, 0x0a, 0xa3 + .byte 0xe4, 0x93, 0xb4, 0xaa, 0x04, 0xd2, 0x08, 0x80 + .byte 0x10, 0xef, 0xb4, 0x12, 0x0c, 0x90, 0x0f, 0xff + .byte 0xe4, 0x93, 0xb4, 0x34, 0x04, 0xc2, 0x08, 0xc2 + .byte 0x12, 0x12, 0x03, 0x6c, 0x12, 0x0d, 0xa6, 0x12 + .byte 0x01, 0x08, 0x30, 0x01, 0x27, 0x30, 0x12, 0x1f + .byte 0x20, 0x00, 0x1c, 0x30, 0x11, 0x19, 0x12, 0x0d + .byte 0x25, 0x12, 0x09, 0xc4, 0x30, 0x08, 0x05, 0xc2 + .byte 0x1a, 0x12, 0x0a, 0x26, 0x12, 0x0d, 0x92, 0xd2 + .byte 0x00, 0x12, 0x0d, 0x3b, 0x12, 0x07, 0xc2, 0x12 + .byte 0x0d, 0xda, 0xc2, 0x01, 0x12, 0x03, 0x6c, 0x12 + .byte 0x07, 0x2e, 0x30, 0x12, 0xc4, 0x30, 0x00, 0xc1 + .byte 0x90, 0xd0, 0x00, 0xe0, 0x30, 0xe0, 0xba, 0xc2 + .byte 0xaf, 0x12, 0x0e, 0x07, 0x50, 0x0e, 0x12, 0x0e + .byte 0xb6, 0x12, 0x0e, 0xbc, 0xd2, 0x1a, 0x12, 0x0a + .byte 0x26, 0x12, 0x0d, 0x3b, 0xd2, 0xaf, 0x80, 0xa1 + .byte 0xae, 0x03, 0xab, 0x05, 0x53, 0x1a, 0xef, 0x90 + .byte 0xd0, 0x00, 0xe5, 0x1a, 0xf0, 0xad, 0x07, 0x8e + .byte 0x33, 0x7f, 0x20, 0x12, 0x0d, 0x51, 0x43, 0x1a + .byte 0x10, 0x90, 0xd0, 0x00, 0xe5, 0x1a, 0xf0, 0x22 + .byte 0xda, 0x7e, 0x10, 0x09, 0x14, 0x12, 0x0d, 0xa6 + .byte 0x90, 0xe0, 0x00, 0xe0, 0xff, 0x20, 0xe1, 0x03 + .byte 0x02, 0x02, 0xc8, 0xc2, 0xa8, 0xc2, 0xaa, 0x20 + .byte 0x04, 0x03, 0x30, 0x07, 0x05, 0xd2, 0xa8, 0xd2 + .byte 0xaa, 0x22, 0xef, 0xa2, 0xe3, 0x92, 0x1c, 0x90 + .byte 0xf0, 0x00, 0xe0, 0xf5, 0x2c, 0x12, 0x0e, 0x2f + .byte 0xd2, 0xa8, 0xd2, 0xaa, 0x30, 0x1c, 0x03, 0x02 + .byte 0x01, 0xee, 0xc2, 0x1d, 0xc2, 0x1e, 0x20, 0x17 + .byte 0x03, 0x02, 0x01, 0xd4, 0xe5, 0x18, 0x24, 0xe1 + .byte 0x60, 0x3b, 0x24, 0x54, 0x70, 0x03, 0x02, 0x01 + .byte 0xd0, 0x24, 0xfa, 0x60, 0x14, 0x14, 0x60, 0x1e + .byte 0x14, 0x60, 0x1f, 0x14, 0x60, 0x23, 0x24, 0x74 + .byte 0x70, 0x6c, 0xaf, 0x2c, 0x12, 0x05, 0xfb, 0x80 + .byte 0x67, 0xe5, 0x2c, 0x30, 0xe1, 0x04, 0xd2, 0x90 + .byte 0x80, 0x5e, 0xc2, 0x90, 0x80, 0x5a, 0xc2, 0x1f + .byte 0x80, 0x02, 0xd2, 0x1f, 0x85, 0x2c, 0x2f, 0x80 + .byte 0x46, 0xd2, 0x1e, 0x80, 0x4b, 0xe5, 0x2c, 0x70 + .byte 0x1a, 0x12, 0x0c, 0xed, 0x12, 0x08, 0xf2, 0x85 + .byte 0x38, 0x12, 0x85, 0x39, 0x13, 0x85, 0x3a, 0x14 + .byte 0x85, 0x09, 0x15, 0x85, 0x0a, 0x16, 0x85, 0x0b + .byte 0x17, 0x80, 0x2d, 0xe5, 0x2c, 0xc3, 0x94, 0x01 + .byte 0x40, 0x13, 0xe5, 0x2c, 0xd3, 0x94, 0x06, 0x50 + .byte 0x0c, 0xc2, 0x1f, 0x74, 0x11, 0x25, 0x2c, 0xf8 + .byte 0xe6, 0xf5, 0x2f, 0x80, 0x0a, 0xe5, 0x2c, 0xb4 + .byte 0x07, 0x0e, 0xc2, 0x1f, 0x85, 0x3b, 0x2f, 0xd2 + .byte 0x20, 0x12, 0x0d, 0xb8, 0x80, 0x02, 0xd2, 0x1d + .byte 0xc2, 0x17, 0x80, 0x02, 0xd2, 0x1d, 0x30, 0x1d + .byte 0x07, 0xaf, 0x2c, 0x12, 0x05, 0x2f, 0x80, 0x08 + .byte 0x30, 0x1e, 0x05, 0xaf, 0x2c, 0x12, 0x05, 0x97 + .byte 0x12, 0x0e, 0x85, 0x02, 0x02, 0xc2, 0xc2, 0x1d + .byte 0xe5, 0x2c, 0x12, 0x0b, 0x21, 0x02, 0xb7, 0x1f + .byte 0x02, 0x35, 0x20, 0x02, 0xb7, 0x60, 0x02, 0x56 + .byte 0xa7, 0x02, 0x5d, 0xa8, 0x02, 0x64, 0xa9, 0x02 + .byte 0x48, 0xaa, 0x02, 0x64, 0xab, 0x02, 0x6d, 0xad + .byte 0x02, 0x74, 0xae, 0x02, 0x41, 0xc0, 0x02, 0xb7 + .byte 0xcb, 0x02, 0x7b, 0xd0, 0x02, 0xb7, 0xd1, 0x02 + .byte 0xb7, 0xd2, 0x02, 0xb7, 0xd3, 0x02, 0xb7, 0xd4 + .byte 0x02, 0x98, 0xdd, 0x02, 0x8d, 0xdf, 0x02, 0xa8 + .byte 0xfe, 0x00, 0x00, 0x02, 0xb5, 0x12, 0x0a, 0x83 + .byte 0x8f, 0x2d, 0xc2, 0x1f, 0x85, 0x2d, 0x2f, 0x80 + .byte 0x28, 0xc2, 0x1f, 0x75, 0x2f, 0xff, 0x80, 0x21 + .byte 0x7f, 0x30, 0x12, 0x05, 0xfb, 0xc2, 0x1f, 0x75 + .byte 0x2f, 0x55, 0xc2, 0x20, 0x80, 0x4b, 0x12, 0x0e + .byte 0x8d, 0xd2, 0x1d, 0x80, 0x5a, 0x12, 0x0e, 0xe6 + .byte 0xd2, 0x1d, 0x80, 0x53, 0xc2, 0x1f, 0xe4, 0xf5 + .byte 0x2f, 0xd2, 0x20, 0x80, 0x34, 0x12, 0x0e, 0x94 + .byte 0xd2, 0x1d, 0x80, 0x43, 0x12, 0x0e, 0xf0, 0xd2 + .byte 0x1d, 0x80, 0x3c, 0x75, 0x2e, 0x01, 0x30, 0x90 + .byte 0x03, 0x43, 0x2e, 0x02, 0xc2, 0x1f, 0x85, 0x2e + .byte 0x2f, 0xd2, 0x20, 0x80, 0x14, 0xd2, 0x90, 0xc2 + .byte 0x1f, 0x85, 0x0f, 0x2f, 0xd2, 0x20, 0x80, 0x09 + .byte 0xc2, 0x90, 0xc2, 0x1f, 0x85, 0x0f, 0x2f, 0xd2 + .byte 0x20, 0x12, 0x0d, 0xb8, 0xd2, 0x1d, 0x80, 0x0f + .byte 0xc2, 0x91, 0x7f, 0x05, 0x12, 0x00, 0x06, 0xd2 + .byte 0x91, 0xd2, 0x1d, 0x80, 0x02, 0xd2, 0x1d, 0x30 + .byte 0x1d, 0x03, 0x12, 0x0e, 0x85, 0xd2, 0x17, 0x85 + .byte 0x2c, 0x18, 0x20, 0x01, 0x03, 0x12, 0x0d, 0xda + .byte 0x22, 0x44, 0x4d, 0x26, 0x50, 0x00, 0xff, 0x43 + .byte 0x41, 0x3f, 0x3d, 0x3b, 0x3c, 0x58, 0x64, 0x44 + .byte 0x42, 0x40, 0x3e, 0x0f, 0x29, 0x59, 0x65, 0x38 + .byte 0x2a, 0x70, 0x1d, 0x10, 0x02, 0x5a, 0x66, 0x71 + .byte 0x2c, 0x1f, 0x1e, 0x11, 0x03, 0x5b, 0x67, 0x2e + .byte 0x2d, 0x20, 0x12, 0x05, 0x04, 0x5c, 0x68, 0x39 + .byte 0x2f, 0x21, 0x14, 0x13, 0x06, 0x5d, 0x69, 0x31 + .byte 0x30, 0x23, 0x22, 0x15, 0x07, 0x5e, 0x6a, 0x72 + .byte 0x32, 0x24, 0x16, 0x08, 0x09, 0x5f, 0x6b, 0x33 + .byte 0x25, 0x17, 0x18, 0x0b, 0x0a, 0x60, 0x6c, 0x34 + .byte 0x35, 0x26, 0x27, 0x19, 0x0c, 0x61, 0x6d, 0x73 + .byte 0x28, 0x74, 0x1a, 0x0d, 0x62, 0x6e, 0x3a, 0x36 + .byte 0x1c, 0x1b, 0x75, 0x2b, 0x63, 0x76, 0x55, 0x56 + .byte 0x77, 0x78, 0x79, 0x7a, 0x0e, 0x7b, 0x7c, 0x4f + .byte 0x7d, 0x4b, 0x47, 0x7e, 0x7f, 0x6f, 0x52, 0x53 + .byte 0x50, 0x4c, 0x4d, 0x48, 0x01, 0x45, 0x57, 0x4e + .byte 0x51, 0x4a, 0x37, 0x49, 0x46, 0x54, 0x00, 0x00 + .byte 0x00, 0x41, 0x54, 0x00, 0x01, 0x01, 0x02, 0x01 + .byte 0x02, 0x02, 0x03, 0x01, 0x02, 0x02, 0x03, 0x02 + .byte 0x03, 0x03, 0x04, 0x14, 0x23, 0x14, 0x3a, 0x14 + .byte 0x4d, 0x42, 0x32, 0x23, 0x20, 0x0c, 0x03, 0x02 + .byte 0x04, 0x08, 0xc2, 0x1a, 0xc2, 0x1b, 0xe5, 0x10 + .byte 0x30, 0xe7, 0x57, 0xe5, 0x11, 0xae, 0x10, 0x78 + .byte 0x06, 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9 + .byte 0xf5, 0x26, 0xff, 0x12, 0x0d, 0xca, 0x8f, 0x27 + .byte 0xe5, 0x10, 0xc4, 0x13, 0x13, 0x54, 0x03, 0xff + .byte 0xe5, 0x27, 0x54, 0x01, 0xb5, 0x07, 0x05, 0xe4 + .byte 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xef, 0x30 + .byte 0xe0, 0x04, 0xd2, 0x1b, 0x80, 0x24, 0x20, 0x13 + .byte 0x1f, 0xaf, 0x26, 0x12, 0x07, 0x79, 0xaf, 0x26 + .byte 0x12, 0x09, 0xf6, 0x8e, 0x28, 0x8f, 0x29, 0xe5 + .byte 0x29, 0xf4, 0x70, 0x03, 0xe5, 0x28, 0xf4, 0x60 + .byte 0x09, 0x85, 0x29, 0x26, 0xd2, 0x1a, 0x80, 0x02 + .byte 0xd2, 0x1a, 0x30, 0x1a, 0x1b, 0xc2, 0x27, 0x7f + .byte 0x07, 0x12, 0x0b, 0x6c, 0xc2, 0x27, 0x7f, 0x06 + .byte 0x12, 0x0b, 0x6c, 0xa2, 0x13, 0x92, 0x25, 0x85 + .byte 0x26, 0x31, 0x12, 0x08, 0xbb, 0xc2, 0x0c, 0x22 + .byte 0x30, 0x1b, 0x10, 0xa2, 0x13, 0x92, 0x21, 0x75 + .byte 0x30, 0xff, 0xd2, 0x22, 0xc2, 0x23, 0xd2, 0x24 + .byte 0x02, 0x06, 0xee, 0xc2, 0x0c, 0x12, 0x0e, 0x7d + .byte 0x22, 0xe4, 0xf5, 0x26, 0xf5, 0x27, 0x75, 0x28 + .byte 0x0f, 0x75, 0x29, 0xff, 0xe5, 0x27, 0x25, 0x29 + .byte 0xff, 0xe5, 0x26, 0x35, 0x28, 0xc3, 0x13, 0xf5 + .byte 0x2a, 0xef, 0x13, 0xf5, 0x2b, 0xff, 0xae, 0x2a + .byte 0x12, 0x0e, 0x15, 0xbf, 0xff, 0x0e, 0xe5, 0x2b + .byte 0x24, 0xff, 0xf5, 0x29, 0xe5, 0x2a, 0x34, 0xff + .byte 0xf5, 0x28, 0x80, 0x47, 0xef, 0x70, 0x0d, 0xe5 + .byte 0x2b, 0x24, 0x01, 0xf5, 0x27, 0xe4, 0x35, 0x2a + .byte 0xf5, 0x26, 0x80, 0x37, 0x75, 0x2c, 0xff, 0xe4 + .byte 0xf5, 0x2d, 0xe5, 0x2c, 0xc3, 0x13, 0xf5, 0x2c + .byte 0xb5, 0x07, 0x1c, 0xe5, 0x2b, 0xae, 0x2a, 0x78 + .byte 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8, 0xf9 + .byte 0x7c, 0x00, 0x25, 0x2d, 0xff, 0xec, 0x3e, 0xcf + .byte 0x24, 0x01, 0xcf, 0x34, 0x00, 0xfe, 0x22, 0x05 + .byte 0x2d, 0xe5, 0x2d, 0xb4, 0x07, 0xd4, 0x7e, 0xff + .byte 0x7f, 0xff, 0x22, 0xd3, 0xe5, 0x27, 0x95, 0x29 + .byte 0xe5, 0x28, 0x64, 0x80, 0xf8, 0xe5, 0x26, 0x64 + .byte 0x80, 0x98, 0x40, 0x80, 0xe5, 0x27, 0xae, 0x26 + .byte 0x78, 0x03, 0xc3, 0x33, 0xce, 0x33, 0xce, 0xd8 + .byte 0xf9, 0xff, 0x22, 0x78, 0x7f, 0xe4, 0xf6, 0xd8 + .byte 0xfd, 0x75, 0x81, 0x3b, 0x02, 0x04, 0xea, 0x02 + .byte 0x00, 0x16, 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93 + .byte 0xa3, 0x40, 0x03, 0xf6, 0x80, 0x01, 0xf2, 0x08 + .byte 0xdf, 0xf4, 0x80, 0x29, 0xe4, 0x93, 0xa3, 0xf8 + .byte 0x54, 0x07, 0x24, 0x0c, 0xc8, 0xc3, 0x33, 0xc4 + .byte 0x54, 0x0f, 0x44, 0x20, 0xc8, 0x83, 0x40, 0x04 + .byte 0xf4, 0x56, 0x80, 0x01, 0x46, 0xf6, 0xdf, 0xe4 + .byte 0x80, 0x0b, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20 + .byte 0x40, 0x80, 0x90, 0x08, 0x80, 0xe4, 0x7e, 0x01 + .byte 0x93, 0x60, 0xbc, 0xa3, 0xff, 0x54, 0x3f, 0x30 + .byte 0xe5, 0x09, 0x54, 0x1f, 0xfe, 0xe4, 0x93, 0xa3 + .byte 0x60, 0x01, 0x0e, 0xcf, 0x54, 0xc0, 0x25, 0xe0 + .byte 0x60, 0xa8, 0x40, 0xb8, 0xe4, 0x93, 0xa3, 0xfa + .byte 0xe4, 0x93, 0xa3, 0xf8, 0xe4, 0x93, 0xa3, 0xc8 + .byte 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83, 0xca, 0xf0 + .byte 0xa3, 0xc8, 0xc5, 0x82, 0xc8, 0xca, 0xc5, 0x83 + .byte 0xca, 0xdf, 0xe9, 0xde, 0xe7, 0x80, 0xbe, 0xd2 + .byte 0x0d, 0xc2, 0x96, 0xd2, 0x0e, 0xd2, 0x10, 0xc2 + .byte 0x94, 0x8f, 0x08, 0x12, 0x0d, 0xca, 0xef, 0x13 + .byte 0xb3, 0x92, 0x14, 0xd2, 0x16, 0xe4, 0xf5, 0x0c + .byte 0x7f, 0x28, 0x12, 0x00, 0x06, 0xc2, 0x97, 0xd2 + .byte 0x03, 0xc2, 0x0a, 0x7f, 0xe8, 0x7e, 0xfd, 0x12 + .byte 0x0c, 0x79, 0xc2, 0x0d, 0xd2, 0x96, 0x30, 0x16 + .byte 0x16, 0x12, 0x0e, 0x62, 0x50, 0xf8, 0xc2, 0xaf + .byte 0xd2, 0x97, 0xc2, 0x21, 0x12, 0x06, 0xe5, 0xc2 + .byte 0x16, 0xe4, 0xf5, 0x0c, 0xd2, 0xaf, 0x22, 0x7f + .byte 0xe8, 0x7e, 0xfd, 0x12, 0x0c, 0x79, 0x20, 0x04 + .byte 0x12, 0x20, 0x0a, 0x0f, 0x12, 0x0e, 0x62, 0x50 + .byte 0xf5, 0xc2, 0xaf, 0xc2, 0x21, 0x12, 0x06, 0xe5 + .byte 0xd2, 0xaf, 0x22, 0x12, 0x07, 0x2e, 0x22, 0xd2 + .byte 0x10, 0xc2, 0x94, 0xd2, 0x0a, 0xd2, 0x0d, 0xc2 + .byte 0x96, 0x8f, 0x08, 0x12, 0x0d, 0xca, 0xef, 0x13 + .byte 0xb3, 0x92, 0x14, 0xd2, 0x16, 0xe4, 0xf5, 0x0e + .byte 0x7f, 0x28, 0x12, 0x00, 0x06, 0xc2, 0x95, 0xd2 + .byte 0x05, 0xc2, 0x0e, 0x7f, 0xe8, 0x7e, 0xfd, 0x12 + .byte 0x0c, 0x79, 0xc2, 0x10, 0xd2, 0x94, 0x30, 0x16 + .byte 0x14, 0x12, 0x0e, 0x62, 0x50, 0xf8, 0xc2, 0xaf + .byte 0xd2, 0x95, 0x12, 0x06, 0xe3, 0xc2, 0x16, 0xe4 + .byte 0xf5, 0x0e, 0xd2, 0xaf, 0x22, 0x7f, 0xe8, 0x7e + .byte 0xfd, 0x12, 0x0c, 0x79, 0x20, 0x07, 0x10, 0x20 + .byte 0x0e, 0x0d, 0x12, 0x0e, 0x62, 0x50, 0xf5, 0xc2 + .byte 0xaf, 0x12, 0x06, 0xe3, 0xd2, 0xaf, 0x22, 0x12 + .byte 0x07, 0x2e, 0x22, 0xad, 0x07, 0xed, 0x30, 0xe6 + .byte 0x04, 0xd2, 0x0f, 0x80, 0x02, 0xc2, 0x0f, 0xed + .byte 0x30, 0xe5, 0x05, 0x12, 0x0e, 0x8d, 0x80, 0x03 + .byte 0x12, 0x0e, 0xe6, 0xed, 0x30, 0xe4, 0x05, 0x12 + .byte 0x0e, 0x94, 0x80, 0x03, 0x12, 0x0e, 0xf0, 0xed + .byte 0x30, 0xe2, 0x04, 0xd2, 0x27, 0x80, 0x02, 0xc2 + .byte 0x27, 0x7f, 0x02, 0x12, 0x0b, 0x6c, 0xed, 0x30 + .byte 0xe1, 0x05, 0x12, 0x0f, 0x14, 0x80, 0x03, 0x12 + .byte 0x0f, 0x11, 0xed, 0x30, 0xe0, 0x0b, 0x12, 0x0f + .byte 0x1a, 0x20, 0x11, 0x08, 0xd2, 0x11, 0xd2, 0x01 + .byte 0x22, 0x12, 0x0f, 0x17, 0x22, 0x7f, 0x02, 0x12 + .byte 0x00, 0x06, 0x20, 0x94, 0x42, 0xa2, 0x95, 0x92 + .byte 0x18, 0x05, 0x0e, 0xe5, 0x0e, 0xb4, 0x01, 0x12 + .byte 0x20, 0x18, 0x0a, 0xd2, 0x07, 0xd2, 0x0a, 0xd2 + .byte 0x0d, 0xc2, 0x96, 0x80, 0x19, 0xe4, 0xf5, 0x0e + .byte 0x80, 0x14, 0xe5, 0x0e, 0xb4, 0x0b, 0x0f, 0xd2 + .byte 0x0e, 0xd2, 0x10, 0xc2, 0x94, 0xd2, 0x13, 0xd2 + .byte 0x0c, 0xe4, 0xf5, 0x0e, 0xc2, 0x07, 0xe5, 0x10 + .byte 0xc3, 0x13, 0xf5, 0x10, 0xe5, 0x11, 0x13, 0xf5 + .byte 0x11, 0x30, 0x18, 0x03, 0x43, 0x10, 0x80, 0x22 + .byte 0x7f, 0x02, 0x12, 0x00, 0x06, 0x20, 0x96, 0x42 + .byte 0xa2, 0x97, 0x92, 0x19, 0x05, 0x0c, 0xe5, 0x0c + .byte 0xb4, 0x01, 0x12, 0x20, 0x19, 0x0a, 0xd2, 0x04 + .byte 0xd2, 0x0e, 0xd2, 0x10, 0xc2, 0x94, 0x80, 0x19 + .byte 0xe4, 0xf5, 0x0c, 0x80, 0x14, 0xe5, 0x0c, 0xb4 + .byte 0x0b, 0x0f, 0xd2, 0x0a, 0xd2, 0x0d, 0xc2, 0x96 + .byte 0xc2, 0x13, 0xd2, 0x0c, 0xe4, 0xf5, 0x0c, 0xc2 + .byte 0x04, 0xe5, 0x10, 0xc3, 0x13, 0xf5, 0x10, 0xe5 + .byte 0x11, 0x13, 0xf5, 0x11, 0x30, 0x19, 0x03, 0x43 + .byte 0x10, 0x80, 0x22, 0xd2, 0x21, 0x75, 0x30, 0xfe + .byte 0xd2, 0x22, 0xd2, 0x23, 0xc2, 0x24, 0xd2, 0x0a + .byte 0xd2, 0x0d, 0xc2, 0x96, 0xd2, 0x0e, 0xd2, 0x10 + .byte 0xc2, 0x94, 0xa2, 0x23, 0x92, 0x27, 0x7f, 0x06 + .byte 0x12, 0x0b, 0x6c, 0xa2, 0x24, 0x92, 0x27, 0x7f + .byte 0x07, 0x12, 0x0b, 0x6c, 0x30, 0x22, 0x0c, 0xa2 + .byte 0x21, 0x92, 0x25, 0x85, 0x30, 0x31, 0x12, 0x08 + .byte 0xbb, 0x80, 0x10, 0xa2, 0x21, 0x92, 0x26, 0x85 + .byte 0x30, 0x32, 0x12, 0x0b, 0xf9, 0xc2, 0x92, 0xc2 + .byte 0x93, 0xd2, 0x09, 0xc2, 0x0c, 0x22, 0x20, 0x04 + .byte 0x03, 0x30, 0x07, 0x44, 0x7f, 0xe8, 0x7e, 0xfd + .byte 0x12, 0x0c, 0x79, 0x20, 0x04, 0x03, 0x30, 0x07 + .byte 0x37, 0x12, 0x0e, 0x62, 0x50, 0xf5, 0xc2, 0xaf + .byte 0x20, 0x04, 0x03, 0x30, 0x07, 0x26, 0x30, 0x04 + .byte 0x04, 0xc2, 0x1f, 0x80, 0x02, 0xd2, 0x1f, 0xe4 + .byte 0xf5, 0x0c, 0xc2, 0x04, 0xf5, 0x0e, 0xc2, 0x07 + .byte 0x12, 0x0e, 0xeb, 0x12, 0x0e, 0x80, 0xd2, 0xaf + .byte 0xa2, 0x1f, 0x92, 0x21, 0x75, 0x30, 0xff, 0x12 + .byte 0x06, 0xe8, 0x80, 0xc7, 0xd2, 0xaf, 0x80, 0xc3 + .byte 0x22, 0xe5, 0x19, 0x60, 0x03, 0xb4, 0x02, 0x09 + .byte 0xe5, 0x0d, 0x90, 0x03, 0x63, 0x93, 0x6f, 0x60 + .byte 0x0b, 0xe5, 0x19, 0x64, 0x01, 0x70, 0x2d, 0xef + .byte 0x64, 0xf0, 0x70, 0x28, 0x05, 0x19, 0xe5, 0x19 + .byte 0xd3, 0x94, 0x02, 0x40, 0x24, 0xe4, 0xf5, 0x19 + .byte 0x05, 0x0d, 0xe5, 0x0d, 0x94, 0x09, 0x40, 0x19 + .byte 0x75, 0x2a, 0x05, 0xe4, 0xff, 0x12, 0x0c, 0x3b + .byte 0x7f, 0x07, 0x12, 0x0c, 0x3b, 0xd5, 0x2a, 0xf3 + .byte 0xe4, 0xf5, 0x0d, 0x22, 0xe4, 0xf5, 0x0d, 0xf5 + .byte 0x19, 0x22, 0xe5, 0x3b, 0x64, 0x15, 0x70, 0x41 + .byte 0x12, 0x0c, 0xed, 0xe5, 0x3a, 0x30, 0xe0, 0x05 + .byte 0x75, 0x26, 0x80, 0x80, 0x03, 0xe4, 0xf5, 0x26 + .byte 0xe5, 0x3a, 0xc3, 0x13, 0xf5, 0x3a, 0xe5, 0x39 + .byte 0x30, 0xe0, 0x03, 0x43, 0x3a, 0x80, 0xe5, 0x39 + .byte 0xc3, 0x13, 0xf5, 0x39, 0xe5, 0x38, 0x30, 0xe0 + .byte 0x03, 0x43, 0x39, 0x80, 0xc2, 0xb6, 0x90, 0xd0 + .byte 0x01, 0xe4, 0xf0, 0xa3, 0xe5, 0x26, 0xf0, 0xa3 + .byte 0xe5, 0x3a, 0xf0, 0xa3, 0xe5, 0x39, 0xf0, 0xd2 + .byte 0xb6, 0x22, 0x20, 0x94, 0x37, 0x05, 0x0e, 0xe5 + .byte 0x0e, 0xd3, 0x94, 0x08, 0x50, 0x12, 0xe5, 0x08 + .byte 0x30, 0xe0, 0x04, 0xd2, 0x95, 0x80, 0x02, 0xc2 + .byte 0x95, 0xe5, 0x08, 0xc3, 0x13, 0xf5, 0x08, 0x22 + .byte 0xe5, 0x0e, 0xb4, 0x09, 0x05, 0xa2, 0x14, 0x92 + .byte 0x95, 0x22, 0xe5, 0x0e, 0xb4, 0x0a, 0x03, 0xd2 + .byte 0x95, 0x22, 0xe5, 0x0e, 0xb4, 0x0b, 0x05, 0xc2 + .byte 0x16, 0xe4, 0xf5, 0x0e, 0x22, 0x20, 0x96, 0x37 + .byte 0x05, 0x0c, 0xe5, 0x0c, 0xd3, 0x94, 0x08, 0x50 + .byte 0x12, 0xe5, 0x08, 0x30, 0xe0, 0x04, 0xd2, 0x97 + .byte 0x80, 0x02, 0xc2, 0x97, 0xe5, 0x08, 0xc3, 0x13 + .byte 0xf5, 0x08, 0x22, 0xe5, 0x0c, 0xb4, 0x09, 0x05 + .byte 0xa2, 0x14, 0x92, 0x97, 0x22, 0xe5, 0x0c, 0xb4 + .byte 0x0a, 0x03, 0xd2, 0x97, 0x22, 0xe5, 0x0c, 0xb4 + .byte 0x0b, 0x05, 0xc2, 0x16, 0xe4, 0xf5, 0x0c, 0x22 + .byte 0x01, 0x0c, 0x00, 0xc1, 0x04, 0xc1, 0x0a, 0xc1 + .byte 0x83, 0xc1, 0x0c, 0xc1, 0x09, 0xc1, 0x02, 0xc1 + .byte 0x16, 0xc1, 0x08, 0x01, 0x0e, 0x00, 0xc1, 0x07 + .byte 0xc1, 0x0e, 0xc1, 0x85, 0xc1, 0x8b, 0xc1, 0x86 + .byte 0xc1, 0x8f, 0xc1, 0x12, 0xc1, 0x00, 0xc1, 0x11 + .byte 0xc1, 0x01, 0xc1, 0x17, 0x01, 0x0d, 0x00, 0x01 + .byte 0x19, 0x00, 0x01, 0x1a, 0x00, 0x01, 0x34, 0x03 + .byte 0xc1, 0x29, 0x00, 0xa2, 0x25, 0x92, 0x26, 0x85 + .byte 0x31, 0x32, 0x12, 0x0b, 0xf9, 0xc2, 0x92, 0xc2 + .byte 0x93, 0x20, 0x25, 0x03, 0x20, 0x06, 0x06, 0x30 + .byte 0x25, 0x1d, 0x30, 0x0b, 0x1a, 0x7f, 0x69, 0x7e + .byte 0x00, 0x12, 0x0c, 0x79, 0x12, 0x0e, 0x62, 0x50 + .byte 0xfb, 0x12, 0x0e, 0xb0, 0x50, 0x09, 0x20, 0x25 + .byte 0x04, 0xd2, 0x92, 0x80, 0x02, 0xd2, 0x93, 0xd2 + .byte 0x09, 0x22, 0x90, 0x0f, 0xfc, 0xe4, 0x93, 0xfe + .byte 0x74, 0x01, 0x93, 0xff, 0xc3, 0x95, 0x3a, 0xf5 + .byte 0x0b, 0xee, 0x95, 0x39, 0xf5, 0x0a, 0x90, 0x0f + .byte 0xfb, 0xe4, 0x93, 0xc3, 0x95, 0x38, 0xf5, 0x09 + .byte 0xc3, 0xef, 0x95, 0x3a, 0xee, 0x95, 0x39, 0x50 + .byte 0x02, 0x15, 0x09, 0xe5, 0x09, 0x30, 0xe7, 0x07 + .byte 0xe4, 0xf5, 0x09, 0xf5, 0x0a, 0xf5, 0x0b, 0x22 + .byte 0x05, 0x35, 0xaf, 0x35, 0xae, 0x07, 0xee, 0x14 + .byte 0x13, 0x13, 0x13, 0x54, 0x1f, 0xfd, 0xee, 0x54 + .byte 0x07, 0xff, 0x70, 0x06, 0xf5, 0x26, 0xf5, 0x27 + .byte 0x80, 0x15, 0x74, 0xff, 0x7e, 0x00, 0xa8, 0x07 + .byte 0x08, 0x80, 0x06, 0xce, 0xa2, 0xe7, 0x13, 0xce + .byte 0x13, 0xd8, 0xf8, 0xf5, 0x27, 0x8e, 0x26, 0xaf + .byte 0x05, 0xad, 0x27, 0x02, 0x0c, 0x5a, 0xe4, 0xff + .byte 0x7e, 0x01, 0xef, 0xc3, 0x94, 0x08, 0x50, 0x27 + .byte 0xef, 0x60, 0x1d, 0x64, 0x01, 0x60, 0x19, 0xef + .byte 0x64, 0x03, 0x60, 0x14, 0xee, 0x44, 0x02, 0x54 + .byte 0xfe, 0x90, 0xe0, 0x00, 0xf0, 0x54, 0xf4, 0xfd + .byte 0xee, 0x54, 0xf4, 0x6d, 0x60, 0x02, 0xd3, 0x22 + .byte 0x0f, 0xee, 0x25, 0xe0, 0xfe, 0x80, 0xd3, 0xc3 + .byte 0x22, 0xad, 0x07, 0xac, 0x06, 0xed, 0x24, 0xff + .byte 0xff, 0xec, 0x34, 0xff, 0xfe, 0xef, 0x78, 0x03 + .byte 0xce, 0xc3, 0x13, 0xce, 0x13, 0xd8, 0xf9, 0xff + .byte 0xed, 0x54, 0x07, 0xfd, 0x70, 0x04, 0xf5, 0x26 + .byte 0x80, 0x0d, 0x74, 0xff, 0xa8, 0x05, 0x08, 0x80 + .byte 0x02, 0xc3, 0x13, 0xd8, 0xfc, 0xf5, 0x26, 0xad + .byte 0x26, 0x02, 0x0a, 0xad, 0xc2, 0x28, 0x20, 0x29 + .byte 0x0f, 0x12, 0x0f, 0x0d, 0x8f, 0x3b, 0xe5, 0x3b + .byte 0xb4, 0x15, 0x03, 0x75, 0x34, 0x1f, 0xd2, 0x29 + .byte 0x12, 0x0a, 0x56, 0x8f, 0x35, 0xe5, 0x35, 0x30 + .byte 0xe0, 0x0c, 0x12, 0x0d, 0x7d, 0x12, 0x09, 0x28 + .byte 0xe4, 0xf5, 0x36, 0xf5, 0x37, 0x22, 0x12, 0x04 + .byte 0x09, 0x8e, 0x36, 0x8f, 0x37, 0x22, 0x20, 0x0f + .byte 0x03, 0x7e, 0x00, 0x22, 0xbf, 0xf0, 0x07, 0xd2 + .byte 0x15, 0x7e, 0xff, 0x7f, 0xff, 0x22, 0xef, 0xc3 + .byte 0x94, 0x85, 0x40, 0x03, 0x7e, 0x00, 0x22, 0xef + .byte 0x90, 0x02, 0xce, 0x93, 0xfe, 0x70, 0x02, 0xfe + .byte 0x22, 0x30, 0x15, 0x03, 0x43, 0x06, 0x80, 0xc2 + .byte 0x15, 0xaf, 0x06, 0x7e, 0x00, 0x22, 0xa2, 0x1a + .byte 0x92, 0x28, 0x05, 0x37, 0xe5, 0x37, 0x70, 0x02 + .byte 0x05, 0x36, 0xc3, 0xe5, 0x36, 0x94, 0x80, 0x50 + .byte 0x07, 0xaf, 0x37, 0xae, 0x36, 0x02, 0x09, 0x91 + .byte 0xe5, 0x35, 0xc3, 0x94, 0x10, 0x50, 0x0e, 0x12 + .byte 0x09, 0x28, 0x12, 0x0d, 0x7d, 0x12, 0x09, 0x28 + .byte 0xe4, 0xf5, 0x36, 0xf5, 0x37, 0x22, 0xe4, 0xff + .byte 0x12, 0x0e, 0x23, 0x7e, 0xff, 0xe4, 0xf5, 0x26 + .byte 0xe5, 0x26, 0xb4, 0x08, 0x07, 0x7f, 0x01, 0x12 + .byte 0x0e, 0x23, 0x7e, 0xff, 0xee, 0xb5, 0x07, 0x03 + .byte 0xaf, 0x26, 0x22, 0xee, 0xc3, 0x13, 0xfe, 0x05 + .byte 0x26, 0xe5, 0x26, 0xd3, 0x94, 0x10, 0x40, 0xe0 + .byte 0x7f, 0xff, 0x22, 0xe4, 0xff, 0x30, 0x0f, 0x02 + .byte 0x7f, 0x40, 0x20, 0x05, 0x03, 0x43, 0x07, 0x20 + .byte 0x20, 0x03, 0x03, 0x43, 0x07, 0x10, 0x90, 0xe0 + .byte 0x00, 0xe0, 0x30, 0xe2, 0x03, 0x43, 0x07, 0x04 + .byte 0x30, 0x0b, 0x03, 0x43, 0x07, 0x02, 0x30, 0x06 + .byte 0x03, 0x43, 0x07, 0x01, 0x22, 0x8e, 0x27, 0x8f + .byte 0x28, 0x8d, 0x29, 0x12, 0x0e, 0x74, 0xe5, 0x27 + .byte 0x24, 0xd0, 0xf5, 0x2a, 0xe5, 0x28, 0xf5, 0x2b + .byte 0x12, 0x0e, 0xa2, 0x85, 0x29, 0x2f, 0xab, 0x2b + .byte 0xad, 0x2a, 0xaf, 0x34, 0x12, 0x0b, 0x47, 0x12 + .byte 0x0e, 0xa9, 0x02, 0x0d, 0xea, 0xc0, 0xe0, 0xc0 + .byte 0xf0, 0xc0, 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x06 + .byte 0xc0, 0x07, 0x20, 0x10, 0x0b, 0x30, 0x16, 0x05 + .byte 0x12, 0x08, 0x0a, 0x80, 0x03, 0x12, 0x06, 0x4d + .byte 0xd0, 0x07, 0xd0, 0x06, 0xd0, 0xd0, 0xd0, 0xf0 + .byte 0xd0, 0xe0, 0x32, 0xc0, 0xe0, 0xc0, 0xf0, 0xc0 + .byte 0xd0, 0x75, 0xd0, 0x00, 0xc0, 0x06, 0xc0, 0x07 + .byte 0x20, 0x0d, 0x0b, 0x30, 0x16, 0x05, 0x12, 0x08 + .byte 0x45, 0x80, 0x03, 0x12, 0x06, 0x98, 0xd0, 0x07 + .byte 0xd0, 0x06, 0xd0, 0xd0, 0xd0, 0xf0, 0xd0, 0xe0 + .byte 0x32, 0xd0, 0x83, 0xd0, 0x82, 0xf8, 0xe4, 0x93 + .byte 0x70, 0x12, 0x74, 0x01, 0x93, 0x70, 0x0d, 0xa3 + .byte 0xa3, 0x93, 0xf8, 0x74, 0x01, 0x93, 0xf5, 0x82 + .byte 0x88, 0x83, 0xe4, 0x73, 0x74, 0x02, 0x93, 0x68 + .byte 0x60, 0xef, 0xa3, 0xa3, 0xa3, 0x80, 0xdf, 0xae + .byte 0x03, 0xab, 0x05, 0x53, 0x1a, 0xef, 0x90, 0xd0 + .byte 0x00, 0xe5, 0x1a, 0xf0, 0xad, 0x07, 0x8e, 0x33 + .byte 0x7f, 0x02, 0x12, 0x0d, 0x51, 0xaf, 0x2f, 0x12 + .byte 0x0c, 0xd0, 0x43, 0x1a, 0x10, 0x90, 0xd0, 0x00 + .byte 0xe5, 0x1a, 0xf0, 0x22, 0x74, 0x01, 0xa8, 0x07 + .byte 0x08, 0x80, 0x02, 0xc3, 0x33, 0xd8, 0xfc, 0xff + .byte 0x90, 0xe0, 0x00, 0xe0, 0x44, 0x02, 0xfe, 0xef + .byte 0x30, 0x27, 0x04, 0x42, 0x06, 0x80, 0x03, 0xf4 + .byte 0x52, 0x06, 0x90, 0xe0, 0x00, 0xee, 0xf0, 0x22 + .byte 0x12, 0x0e, 0x07, 0x40, 0x05, 0x12, 0x01, 0x05 + .byte 0x80, 0xf6, 0x12, 0x0e, 0xc8, 0x12, 0x0e, 0xd4 + .byte 0xc2, 0x1f, 0x75, 0x2f, 0xee, 0xa2, 0x06, 0x92 + .byte 0x20, 0x12, 0x0d, 0xb8, 0x90, 0xd0, 0x00, 0xe0 + .byte 0x30, 0xe1, 0xf9, 0x22, 0xae, 0x03, 0xab, 0x05 + .byte 0x53, 0x1a, 0xef, 0x90, 0xd0, 0x00, 0xe5, 0x1a + .byte 0xf0, 0xad, 0x07, 0x8e, 0x33, 0x7f, 0x03, 0x12 + .byte 0x0d, 0x51, 0x12, 0x0b, 0xd7, 0x43, 0x1a, 0x10 + .byte 0x90, 0xd0, 0x00, 0xe5, 0x1a, 0xf0, 0x22, 0xe5 + .byte 0x1a, 0x54, 0x9f, 0xfd, 0x44, 0x20, 0xfe, 0x7c + .byte 0x08, 0xef, 0x25, 0xe0, 0xff, 0x90, 0xd0, 0x00 + .byte 0xed, 0xf0, 0xe0, 0x30, 0xe4, 0x03, 0x43, 0x07 + .byte 0x01, 0x90, 0xd0, 0x00, 0xee, 0xf0, 0xdc, 0xe9 + .byte 0x22, 0x90, 0xf0, 0x00, 0xe5, 0x32, 0xf0, 0xf5 + .byte 0x0f, 0xa2, 0x26, 0x92, 0x27, 0x7f, 0x05, 0x12 + .byte 0x0b, 0x6c, 0x90, 0xe0, 0x00, 0xe0, 0x44, 0x02 + .byte 0x54, 0xfe, 0xfe, 0xf0, 0x44, 0x01, 0xf0, 0xee + .byte 0xf0, 0x22, 0x53, 0x1a, 0xef, 0x90, 0xd0, 0x00 + .byte 0xe5, 0x1a, 0xf0, 0x7f, 0x9f, 0x12, 0x0c, 0xd0 + .byte 0x12, 0x0b, 0xd7, 0x12, 0x0b, 0xd7, 0x12, 0x0b + .byte 0xd7, 0x43, 0x1a, 0x10, 0x90, 0xd0, 0x00, 0xe5 + .byte 0x1a, 0xf0, 0x22, 0x8f, 0x2b, 0x7f, 0xed, 0x12 + .byte 0x05, 0x2f, 0xaf, 0x2b, 0x12, 0x05, 0x2f, 0x75 + .byte 0x2c, 0x0a, 0x7f, 0xe8, 0x7e, 0xfd, 0x12, 0x0c + .byte 0x79, 0x12, 0x0e, 0x62, 0x50, 0xfb, 0xd5, 0x2c + .byte 0xf1, 0x22, 0x8f, 0x28, 0x8d, 0x29, 0x12, 0x0e + .byte 0x74, 0x12, 0x0e, 0xa2, 0xe5, 0x28, 0x24, 0xfe + .byte 0xfb, 0x85, 0x29, 0x2f, 0x7d, 0xef, 0xaf, 0x34 + .byte 0x12, 0x0b, 0x47, 0x12, 0x0e, 0xa9, 0x02, 0x0d + .byte 0xea, 0xad, 0x07, 0xac, 0x06, 0xc2, 0x8c, 0xed + .byte 0xf4, 0xff, 0xec, 0xf4, 0xfe, 0xef, 0x24, 0x01 + .byte 0xfd, 0xe4, 0x3e, 0xf5, 0x8c, 0xaf, 0x05, 0x8f + .byte 0x8a, 0xc2, 0x8d, 0xd2, 0x8c, 0x22, 0xad, 0x07 + .byte 0xac, 0x06, 0xc2, 0xca, 0xed, 0xf4, 0xff, 0xec + .byte 0xf4, 0xfe, 0xef, 0x24, 0x01, 0xfd, 0xe4, 0x3e + .byte 0xf5, 0xcd, 0xaf, 0x05, 0x8f, 0xcc, 0xc2, 0xcf + .byte 0xd2, 0xca, 0x22, 0x53, 0x1a, 0xef, 0x90, 0xd0 + .byte 0x00, 0xe5, 0x1a, 0xf0, 0x7f, 0x05, 0x12, 0x0c + .byte 0xd0, 0x12, 0x0b, 0xd7, 0x43, 0x1a, 0x10, 0x90 + .byte 0xd0, 0x00, 0xe5, 0x1a, 0xf0, 0xef, 0x13, 0x22 + .byte 0xe5, 0x1a, 0x54, 0x9f, 0xfe, 0x44, 0x40, 0xfd + .byte 0x7c, 0x08, 0x90, 0xd0, 0x00, 0xef, 0x33, 0xff + .byte 0x50, 0x03, 0xed, 0x80, 0x01, 0xee, 0xf0, 0x44 + .byte 0x20, 0xf0, 0xdc, 0xf1, 0x22, 0x12, 0x0f, 0x04 + .byte 0x8e, 0x39, 0x8f, 0x3a, 0x12, 0x0f, 0x1d, 0x8f + .byte 0x38, 0xe5, 0x38, 0x30, 0xe1, 0x03, 0x43, 0x39 + .byte 0x80, 0xe5, 0x38, 0x13, 0x13, 0x54, 0x3f, 0xf5 + .byte 0x38, 0x22, 0x53, 0x1a, 0xef, 0x90, 0xd0, 0x00 + .byte 0xe5, 0x1a, 0xf0, 0x7f, 0x05, 0x12, 0x0c, 0xd0 + .byte 0x12, 0x0b, 0xd7, 0x43, 0x1a, 0x10, 0x90, 0xd0 + .byte 0x00, 0xe5, 0x1a, 0xf0, 0x22, 0x12, 0x0e, 0xc8 + .byte 0x12, 0x0e, 0xd4, 0x90, 0xd0, 0x00, 0xe0, 0x20 + .byte 0xe1, 0x08, 0x12, 0x03, 0x6c, 0x12, 0x01, 0x05 + .byte 0x80, 0xf1, 0x22, 0x12, 0x0c, 0xed, 0x12, 0x08 + .byte 0xf2, 0xe5, 0x09, 0x70, 0x0b, 0xe5, 0x0a, 0x70 + .byte 0x07, 0xe5, 0x0b, 0x70, 0x03, 0x12, 0x0e, 0xda + .byte 0x22, 0x8d, 0x31, 0x8b, 0x32, 0x12, 0x0c, 0xd0 + .byte 0xaf, 0x31, 0x12, 0x0c, 0xd0, 0xaf, 0x32, 0x12 + .byte 0x0c, 0xd0, 0xaf, 0x33, 0x02, 0x0c, 0xd0, 0x53 + .byte 0x1a, 0xef, 0x90, 0xd0, 0x00, 0xe5, 0x1a, 0xf0 + .byte 0x12, 0x0c, 0xd0, 0x43, 0x1a, 0x10, 0x90, 0xd0 + .byte 0x00, 0xe5, 0x1a, 0xf0, 0x22, 0x12, 0x0e, 0x74 + .byte 0x12, 0x0e, 0xa2, 0xe4, 0xfb, 0x7d, 0xd0, 0xaf + .byte 0x34, 0x12, 0x00, 0xe0, 0x12, 0x0e, 0xa9, 0x02 + .byte 0x0d, 0xea, 0x53, 0x1a, 0xfb, 0x90, 0xd0, 0x00 + .byte 0xe5, 0x1a, 0xf0, 0x53, 0x1a, 0xfd, 0xe5, 0x1a + .byte 0xf0, 0x7f, 0x3c, 0x02, 0x00, 0x06, 0x30, 0x09 + .byte 0x0e, 0x12, 0x0e, 0xb0, 0x40, 0x09, 0xc2, 0x92 + .byte 0xc2, 0x93, 0xc2, 0x09, 0x12, 0x0e, 0x7d, 0x22 + .byte 0xa2, 0x1f, 0x92, 0x21, 0x85, 0x2f, 0x30, 0xa2 + .byte 0x20, 0x92, 0x22, 0xc2, 0x23, 0xc2, 0x24, 0x02 + .byte 0x06, 0xee, 0xef, 0xc4, 0x54, 0x0f, 0x90, 0x03 + .byte 0x53, 0x93, 0xfe, 0xef, 0x54, 0x0f, 0x93, 0x2e + .byte 0xff, 0x22, 0x90, 0xe0, 0x00, 0xe0, 0x44, 0x02 + .byte 0x54, 0xfe, 0xfe, 0xf0, 0x54, 0xfd, 0xf0, 0xee + .byte 0xf0, 0x22, 0x12, 0x0e, 0xa2, 0x12, 0x0c, 0xb3 + .byte 0x92, 0x1b, 0x12, 0x0e, 0xa9, 0x20, 0x1b, 0xf2 + .byte 0x22, 0x30, 0x05, 0x09, 0x20, 0x0e, 0x06, 0x20 + .byte 0x02, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x22, 0x30 + .byte 0x03, 0x09, 0x20, 0x0a, 0x06, 0x20, 0x02, 0x03 + .byte 0xd3, 0x80, 0x01, 0xc3, 0x22, 0xaa, 0x06, 0xea + .byte 0x24, 0xd0, 0xfd, 0xef, 0xfb, 0xaf, 0x34, 0x12 + .byte 0x0b, 0xb4, 0x22, 0xef, 0x24, 0xfe, 0xfb, 0x7d + .byte 0xef, 0xaf, 0x34, 0x12, 0x0b, 0xb4, 0x22, 0xd2 + .byte 0x02, 0xd2, 0x0d, 0xc2, 0x96, 0xd2, 0x10, 0xc2 + .byte 0x94, 0x22, 0xef, 0x90, 0x02, 0xc9, 0x93, 0x6d + .byte 0x60, 0x02, 0x80, 0xfe, 0x22, 0x12, 0x0d, 0xf9 + .byte 0x50, 0x04, 0xc2, 0x10, 0xd2, 0x94, 0x22, 0x12 + .byte 0x0e, 0x07, 0x50, 0x04, 0xc2, 0x0d, 0xd2, 0x96 + .byte 0x22, 0xe5, 0x89, 0x54, 0xf0, 0x44, 0x01, 0xf5 + .byte 0x89, 0x22, 0x30, 0x8d, 0x04, 0xc2, 0x8c, 0xd3 + .byte 0x22, 0xc3, 0x22, 0x30, 0xcf, 0x04, 0xc2, 0xca + .byte 0xd3, 0x22, 0xc3, 0x22, 0x12, 0x0e, 0xa2, 0x12 + .byte 0x0e, 0xfa, 0x02, 0x0e, 0xa9, 0x12, 0x0e, 0xeb + .byte 0xc2, 0x0e, 0x02, 0x0e, 0x45, 0xc2, 0x02, 0x12 + .byte 0x0e, 0x4f, 0x02, 0x0e, 0x45, 0xc2, 0x05, 0xd2 + .byte 0x10, 0xc2, 0x94, 0x22, 0xc2, 0x03, 0xd2, 0x0d + .byte 0xc2, 0x96, 0x22, 0x90, 0xd0, 0x00, 0xe5, 0x1a + .byte 0xf0, 0x22, 0x30, 0x28, 0x03, 0x12, 0x0b, 0x90 + .byte 0x22, 0x30, 0x28, 0x03, 0x12, 0x0d, 0x92, 0x22 + .byte 0x90, 0xe0, 0x00, 0xe0, 0x13, 0x22, 0x53, 0x1a + .byte 0xfe, 0x02, 0x0e, 0x9b, 0x43, 0x1a, 0x01, 0x02 + .byte 0x0e, 0x9b, 0x53, 0x1a, 0xfd, 0x02, 0x0e, 0x9b + .byte 0x43, 0x1a, 0x02, 0x02, 0x0e, 0x9b, 0x53, 0x1a + .byte 0xfb, 0x02, 0x0e, 0x9b, 0x43, 0x1a, 0x04, 0x02 + .byte 0x0e, 0x9b, 0x53, 0x1a, 0x7f, 0x02, 0x0e, 0x9b + .byte 0x43, 0x1a, 0x80, 0x02, 0x0e, 0x9b, 0xd2, 0x05 + .byte 0x02, 0x0e, 0x45, 0xc2, 0x0a, 0x02, 0x0e, 0x4f + .byte 0xd2, 0x03, 0x02, 0x0e, 0x4f, 0x8f, 0x1a, 0x02 + .byte 0x0e, 0x9b, 0x7f, 0x06, 0x02, 0x0d, 0x67, 0x7f + .byte 0x04, 0x02, 0x0d, 0x67, 0xae, 0x36, 0xaf, 0x37 + .byte 0x22, 0xe4, 0xf5, 0xc8, 0x22, 0x12, 0x0c, 0x1a + .byte 0x22, 0xc2, 0x0b, 0x22, 0xd2, 0x0b, 0x22, 0xc2 + .byte 0x06, 0x22, 0xd2, 0x06, 0x22, 0xaf, 0x35, 0x22 + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff + .byte 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff diff --git a/src/mainboard/Kconfig b/src/mainboard/Kconfig index 1e5d4bd..d6413c9 100644 --- a/src/mainboard/Kconfig +++ b/src/mainboard/Kconfig @@ -50,6 +50,8 @@ config VENDOR_COMPAQ bool "Compaq" config VENDOR_DIGITALLOGIC bool "DIGITAL-LOGIC" +config VENDOR_DMP + bool "DMP" config VENDOR_EAGLELION bool "EagleLion" config VENDOR_ECS @@ -160,6 +162,7 @@ source "src/mainboard/biostar/Kconfig" source "src/mainboard/broadcom/Kconfig" source "src/mainboard/compaq/Kconfig" source "src/mainboard/digitallogic/Kconfig" +source "src/mainboard/dmp/Kconfig" source "src/mainboard/eaglelion/Kconfig" source "src/mainboard/ecs/Kconfig" source "src/mainboard/emulation/Kconfig" diff --git a/src/mainboard/dmp/Kconfig b/src/mainboard/dmp/Kconfig new file mode 100644 index 0000000..c3196d2 --- /dev/null +++ b/src/mainboard/dmp/Kconfig @@ -0,0 +1,36 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +if VENDOR_DMP + +choice + prompt "Mainboard model" + +config BOARD_DMP_EX + bool "Vortex86EX" + +endchoice + +source "src/mainboard/dmp/vortex86ex/Kconfig" + +config MAINBOARD_VENDOR + string + default "DMP" + +endif # VENDOR_DMP diff --git a/src/mainboard/dmp/vortex86ex/Kconfig b/src/mainboard/dmp/vortex86ex/Kconfig new file mode 100644 index 0000000..7b81c85 --- /dev/null +++ b/src/mainboard/dmp/vortex86ex/Kconfig @@ -0,0 +1,1651 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +if BOARD_DMP_EX + +config BOARD_SPECIFIC_OPTIONS # dummy + def_bool y + select ARCH_X86 + select CPU_DMP_VORTEX86EX + select NORTHBRIDGE_DMP_VORTEX86EX + select SOUTHBRIDGE_DMP_VORTEX86EX + select HAVE_PIRQ_TABLE + select BOARD_ROMSIZE_KB_256 + select ROMCC + select DEFAULT_EARLY_CONSOLE + select HAVE_DEBUG_RAM_SETUP + +config MAINBOARD_DIR + string + default dmp/vortex86ex + +config MAINBOARD_PART_NUMBER + string + default "Vortex86EX" + +config IRQ_SLOT_COUNT + int + default 12 + +config ID_SECTION_OFFSET + # Vortex86 ROM fixed data areas used too big range, we need + # to move ID from default address to another place. + # 18K below top of ROM should be ok. + hex + default 0x4800 + +# ROM Strap PLL config setting : + +choice + prompt "ROM Strap PLL config" + default PLL_300_300_33 + +config PLL_200_200_33 + bool "CPU=200Mhz/DRAM=200Mhz/PCI=33Mhz" + +config PLL_300_300_33 + bool "CPU=300Mhz/DRAM=300Mhz/PCI=33Mhz" + +config PLL_300_300_100 + bool "CPU=300Mhz/DRAM=300Mhz/PCI=100Mhz" + +config PLL_400_200_33 + bool "CPU=400Mhz/DRAM=200Mhz/PCI=33Mhz" + +config PLL_400_200_100 + bool "CPU=400Mhz/DRAM=200Mhz/PCI=100Mhz" + +config PLL_400_400_33 + bool "CPU=400Mhz/DRAM=400Mhz/PCI=33Mhz" + +config PLL_500_250_33 + bool "CPU=500Mhz/DRAM=250Mhz/PCI=33Mhz" + +config PLL_500_500_33 + bool "CPU=500Mhz/DRAM=500Mhz/PCI=33Mhz" + +config PLL_400_300_33 + bool "CPU=400Mhz/DRAM=300Mhz/PCI=33Mhz" + +config PLL_400_300_100 + bool "CPU=400Mhz/DRAM=300Mhz/PCI=100Mhz" + +config PLL_444_333_33 + bool "CPU=444Mhz/DRAM=333Mhz/PCI=33Mhz" + +config PLL_466_350_33 + bool "CPU=466Mhz/DRAM=350Mhz/PCI=33Mhz" + +config PLL_500_375_33 + bool "CPU=500Mhz/DRAM=375Mhz/PCI=33Mhz" + +endchoice + +menu "On-Chip Device Power Down Control" + + config TEMP_POWERDOWN + bool "Temperature sensor power-down" + + config SATA_POWERDOWN + bool "SATA power-down" + + config ADC_POWERDOWN + bool "ADC power-down" + + config PCIE0_POWERDOWN + bool "PCIE0 power-down" + + config MAC_POWERDOWN + bool "MAC power-down" + + config USB1_POWERDOWN + bool "USB2.0 Host Controller 1 power-down" + + config IDE_POWERDOWN + bool "IDE power-down" + +endmenu + +menu "Watchdog Timer setting" + +config WDT1_INITIALIZE + bool "Initialize WDT1" + default n + +config WDT1_ENABLE + depends on WDT1_INITIALIZE + bool "Enable WDT1" + default n + +choice + depends on WDT1_INITIALIZE + prompt "WDT1 Signal Select" + default WDT1_SIGNAL_RESET + +config WDT1_SINGAL_NMI + bool "NMI" +config WDT1_SIGNAL_RESET + bool "Reset" +config WDT1_SIGNAL_SMI + bool "SMI" + +endchoice + +endmenu + +menu "IDE controller setting" + +choice + prompt "Operation Mode" + default IDE_NATIVE_MODE + +config IDE_NATIVE_MODE + bool "Native Mode" +config IDE_LEGACY_MODE + bool "Legacy Mode" + +endchoice + +config IDE1_ENABLE + bool "IDE Primary channel Enable" + default y + +config IDE2_ENABLE + bool "IDE Secondary channel Enable" + default y + +config IDE_STANDARD_COMPATIBLE + bool "Standard IDE Compatible" + default n + +config IDE_COMPATIBLE_SELECTION + depends on IDE_STANDARD_COMPATIBLE + hex "IDE Compatible Selection" + default 0x808624db + +endmenu + +# GPIO setting : +menu "GPIO setting" + +# Begin of GPIO0 +config GPIO_P0_ENABLE + bool "GPIO port 0 Enable" + default n + +config GPIO_P0_DATA_ADDR + hex "GPIO port 0 data address" + depends on GPIO_P0_ENABLE + +config GPIO_P0_DIR_ADDR + hex "GPIO port 0 direction address" + depends on GPIO_P0_ENABLE + +config GPIO_P0_INIT_DIR + hex "GPIO port 0 initial direction" + default 0x00 + depends on GPIO_P0_ENABLE + +config GPIO_P0_INIT_DATA + hex "GPIO port 0 initial data" + depends on GPIO_P0_ENABLE +# end of GPIO0 + +# Begin of GPIO1 +config GPIO_P1_ENABLE + bool "GPIO port 1 Enable" + default n + +config GPIO_P1_DATA_ADDR + hex "GPIO port 1 data address" + depends on GPIO_P1_ENABLE + +config GPIO_P1_DIR_ADDR + hex "GPIO port 1 direction address" + depends on GPIO_P1_ENABLE + +config GPIO_P1_INIT_DIR + hex "GPIO port 1 initial direction" + default 0x00 + depends on GPIO_P1_ENABLE + +config GPIO_P1_INIT_DATA + hex "GPIO port 1 initial data" + depends on GPIO_P1_ENABLE +# end of GPIO1 + +# Begin of GPIO2 +config GPIO_P2_ENABLE + bool "GPIO port 2 Enable" + default n + +config GPIO_P2_DATA_ADDR + hex "GPIO port 2 data address" + depends on GPIO_P2_ENABLE + +config GPIO_P2_DIR_ADDR + hex "GPIO port 2 direction address" + depends on GPIO_P2_ENABLE + +config GPIO_P2_INIT_DIR + hex "GPIO port 2 initial direction" + default 0x00 + depends on GPIO_P2_ENABLE + +config GPIO_P2_INIT_DATA + hex "GPIO port 2 initial data" + depends on GPIO_P2_ENABLE +# end of GPIO2 + +# Begin of GPIO3 +config GPIO_P3_ENABLE + bool "GPIO port 3 Enable" + default n + +config GPIO_P3_DATA_ADDR + hex "GPIO port 3 data address" + depends on GPIO_P3_ENABLE + +config GPIO_P3_DIR_ADDR + hex "GPIO port 3 direction address" + depends on GPIO_P3_ENABLE + +config GPIO_P3_INIT_DIR + hex "GPIO port 3 initial direction" + default 0x00 + depends on GPIO_P3_ENABLE + +config GPIO_P3_INIT_DATA + hex "GPIO port 3 initial data" + depends on GPIO_P3_ENABLE +# end of GPIO3 + +# Begin of GPIO4 +config GPIO_P4_ENABLE + bool "GPIO port 4 Enable" + default n + +config GPIO_P4_DATA_ADDR + hex "GPIO port 4 data address" + depends on GPIO_P4_ENABLE + +config GPIO_P4_DIR_ADDR + hex "GPIO port 4 direction address" + depends on GPIO_P4_ENABLE + +config GPIO_P4_INIT_DIR + hex "GPIO port 4 initial direction" + default 0x00 + depends on GPIO_P4_ENABLE + +config GPIO_P4_INIT_DATA + hex "GPIO port 4 initial data" + depends on GPIO_P4_ENABLE +# end of GPIO4 + +# Begin of GPIO5 +config GPIO_P5_ENABLE + bool "GPIO port 5 Enable" + default n + +config GPIO_P5_DATA_ADDR + hex "GPIO port 5 data address" + depends on GPIO_P5_ENABLE + +config GPIO_P5_DIR_ADDR + hex "GPIO port 5 direction address" + depends on GPIO_P5_ENABLE + +config GPIO_P5_INIT_DIR + hex "GPIO port 5 initial direction" + default 0x00 + depends on GPIO_P5_ENABLE + +config GPIO_P5_INIT_DATA + hex "GPIO port 5 initial data" + depends on GPIO_P5_ENABLE +# end of GPIO5 + +# Begin of GPIO6 +config GPIO_P6_ENABLE + bool "GPIO port 6 Enable" + default n + +config GPIO_P6_DATA_ADDR + hex "GPIO port 6 data address" + depends on GPIO_P6_ENABLE + +config GPIO_P6_DIR_ADDR + hex "GPIO port 6 direction address" + depends on GPIO_P6_ENABLE + +config GPIO_P6_INIT_DIR + hex "GPIO port 6 initial direction" + default 0x00 + depends on GPIO_P6_ENABLE + +config GPIO_P6_INIT_DATA + hex "GPIO port 6 initial data" + depends on GPIO_P6_ENABLE +# end of GPIO6 + +# Begin of GPIO7 +config GPIO_P7_ENABLE + bool "GPIO port 7 Enable" + default n + +config GPIO_P7_DATA_ADDR + hex "GPIO port 7 data address" + depends on GPIO_P7_ENABLE + +config GPIO_P7_DIR_ADDR + hex "GPIO port 7 direction address" + depends on GPIO_P7_ENABLE + +config GPIO_P7_INIT_DIR + hex "GPIO port 7 initial direction" + default 0x00 + depends on GPIO_P7_ENABLE + +config GPIO_P7_INIT_DATA + hex "GPIO port 7 initial data" + depends on GPIO_P7_ENABLE +# end of GPIO7 + +# Begin of GPIO8 +config GPIO_P8_ENABLE + bool "GPIO port 8 Enable" + default n + +config GPIO_P8_DATA_ADDR + hex "GPIO port 8 data address" + depends on GPIO_P8_ENABLE + +config GPIO_P8_DIR_ADDR + hex "GPIO port 8 direction address" + depends on GPIO_P8_ENABLE + +config GPIO_P8_INIT_DIR + hex "GPIO port 8 initial direction" + default 0x00 + depends on GPIO_P8_ENABLE + +config GPIO_P8_INIT_DATA + hex "GPIO port 8 initial data" + depends on GPIO_P8_ENABLE +# end of GPIO8 + +# Begin of GPIO9 +config GPIO_P9_ENABLE + bool "GPIO port 9 Enable" + default n + +config GPIO_P9_DATA_ADDR + hex "GPIO port 9 data address" + depends on GPIO_P9_ENABLE + +config GPIO_P9_DIR_ADDR + hex "GPIO port 9 direction address" + depends on GPIO_P9_ENABLE + +config GPIO_P9_INIT_DIR + hex "GPIO port 9 initial direction" + default 0x00 + depends on GPIO_P9_ENABLE + +config GPIO_P9_INIT_DATA + hex "GPIO port 9 initial data" + depends on GPIO_P9_ENABLE +# end of GPIO9 + +endmenu + +# UART setting : +menu "UART setting" + +# Begin of UART1 +config UART1_ENABLE + bool "UART1 Enable" + default y + +choice + prompt "UART1 I/O port" + default UART1_IO_PORT_3F8 + depends on UART1_ENABLE + +config UART1_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART1_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART1_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART1_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART1_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART1_IO_PORT_OTHER_INPUT + hex "UART1 I/O port" + depends on UART1_ENABLE && UART1_IO_PORT_OTHER + +config UART1_IO + hex + depends on UART1_ENABLE + default 0x3f8 if UART1_IO_PORT_3F8 + default 0x2f8 if UART1_IO_PORT_2F8 + default 0x3e8 if UART1_IO_PORT_3E8 + default 0x2e8 if UART1_IO_PORT_2E8 + default UART1_IO_PORT_OTHER_INPUT if UART1_IO_PORT_OTHER + +choice + prompt "UART1 IRQ" + default UART1_IRQ4 + depends on UART1_ENABLE + +config UART1_IRQ_DISABLE + bool "Disable" +config UART1_IRQ3 + bool "IRQ3, COM2" +config UART1_IRQ4 + bool "IRQ4, COM1" +config UART1_IRQ5 + bool "IRQ5" +config UART1_IRQ6 + bool "IRQ6" +config UART1_IRQ7 + bool "IRQ7" +config UART1_IRQ9 + bool "IRQ9" +config UART1_IRQ10 + bool "IRQ10, COM3" +config UART1_IRQ11 + bool "IRQ11, COM4" +config UART1_IRQ12 + bool "IRQ12" +config UART1_IRQ14 + bool "IRQ14" +config UART1_IRQ15 + bool "IRQ15" + +endchoice + +config UART1_IRQ + int + depends on UART1_ENABLE + default 0 if UART1_IRQ_DISABLE + default 3 if UART1_IRQ3 + default 4 if UART1_IRQ4 + default 5 if UART1_IRQ5 + default 6 if UART1_IRQ6 + default 7 if UART1_IRQ7 + default 9 if UART1_IRQ9 + default 10 if UART1_IRQ10 + default 11 if UART1_IRQ11 + default 12 if UART1_IRQ12 + default 14 if UART1_IRQ14 + default 15 if UART1_IRQ15 + +choice + prompt "UART1 Baud rate" + default UART1_BAUD_115200 + depends on UART1_ENABLE + +config UART1_BAUD_115200 + bool "115200" +config UART1_BAUD_57600 + bool "57600" +config UART1_BAUD_38400 + bool "38400" +config UART1_BAUD_19200 + bool "19200" +config UART1_BAUD_9600 + bool "9600" + +endchoice + +config UART1_BAUD + int + depends on UART1_ENABLE + default 115200 if UART1_BAUD_115200 + default 57600 if UART1_BAUD_57600 + default 38400 if UART1_BAUD_38400 + default 19200 if UART1_BAUD_19200 + default 9600 if UART1_BAUD_9600 +# end of UART1 + +# Begin of UART2 +config UART2_ENABLE + bool "UART2 Enable" + default y + +choice + prompt "UART2 I/O port" + default UART2_IO_PORT_2F8 + depends on UART2_ENABLE + +config UART2_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART2_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART2_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART2_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART2_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART2_IO_PORT_OTHER_INPUT + hex "UART2 I/O port" + depends on UART2_ENABLE && UART2_IO_PORT_OTHER + +config UART2_IO + hex + depends on UART2_ENABLE + default 0x3f8 if UART2_IO_PORT_3F8 + default 0x2f8 if UART2_IO_PORT_2F8 + default 0x3e8 if UART2_IO_PORT_3E8 + default 0x2e8 if UART2_IO_PORT_2E8 + default UART2_IO_PORT_OTHER_INPUT if UART2_IO_PORT_OTHER + +choice + prompt "UART2 IRQ" + default UART2_IRQ3 + depends on UART2_ENABLE + +config UART2_IRQ_DISABLE + bool "Disable" +config UART2_IRQ3 + bool "IRQ3, COM2" +config UART2_IRQ4 + bool "IRQ4, COM1" +config UART2_IRQ5 + bool "IRQ5" +config UART2_IRQ6 + bool "IRQ6" +config UART2_IRQ7 + bool "IRQ7" +config UART2_IRQ9 + bool "IRQ9" +config UART2_IRQ10 + bool "IRQ10, COM3" +config UART2_IRQ11 + bool "IRQ11, COM4" +config UART2_IRQ12 + bool "IRQ12" +config UART2_IRQ14 + bool "IRQ14" +config UART2_IRQ15 + bool "IRQ15" + +endchoice + +config UART2_IRQ + int + depends on UART2_ENABLE + default 0 if UART2_IRQ_DISABLE + default 3 if UART2_IRQ3 + default 4 if UART2_IRQ4 + default 5 if UART2_IRQ5 + default 6 if UART2_IRQ6 + default 7 if UART2_IRQ7 + default 9 if UART2_IRQ9 + default 10 if UART2_IRQ10 + default 11 if UART2_IRQ11 + default 12 if UART2_IRQ12 + default 14 if UART2_IRQ14 + default 15 if UART2_IRQ15 + +choice + prompt "UART2 Baud rate" + default UART2_BAUD_115200 + depends on UART2_ENABLE + +config UART2_BAUD_115200 + bool "115200" +config UART2_BAUD_57600 + bool "57600" +config UART2_BAUD_38400 + bool "38400" +config UART2_BAUD_19200 + bool "19200" +config UART2_BAUD_9600 + bool "9600" + +endchoice + +config UART2_BAUD + int + depends on UART2_ENABLE + default 115200 if UART2_BAUD_115200 + default 57600 if UART2_BAUD_57600 + default 38400 if UART2_BAUD_38400 + default 19200 if UART2_BAUD_19200 + default 9600 if UART2_BAUD_9600 +# end of UART2 + +# Begin of UART3 +config UART3_ENABLE + bool "UART3 Enable" + default y + +choice + prompt "UART3 I/O port" + default UART3_IO_PORT_3E8 + depends on UART3_ENABLE + +config UART3_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART3_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART3_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART3_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART3_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART3_IO_PORT_OTHER_INPUT + hex "UART3 I/O port" + depends on UART3_ENABLE && UART3_IO_PORT_OTHER + +config UART3_IO + hex + depends on UART3_ENABLE + default 0x3f8 if UART3_IO_PORT_3F8 + default 0x2f8 if UART3_IO_PORT_2F8 + default 0x3e8 if UART3_IO_PORT_3E8 + default 0x2e8 if UART3_IO_PORT_2E8 + default UART3_IO_PORT_OTHER_INPUT if UART3_IO_PORT_OTHER + +choice + prompt "UART3 IRQ" + default UART3_IRQ10 + depends on UART3_ENABLE + +config UART3_IRQ_DISABLE + bool "Disable" +config UART3_IRQ3 + bool "IRQ3, COM2" +config UART3_IRQ4 + bool "IRQ4, COM1" +config UART3_IRQ5 + bool "IRQ5" +config UART3_IRQ6 + bool "IRQ6" +config UART3_IRQ7 + bool "IRQ7" +config UART3_IRQ9 + bool "IRQ9" +config UART3_IRQ10 + bool "IRQ10, COM3" +config UART3_IRQ11 + bool "IRQ11, COM4" +config UART3_IRQ12 + bool "IRQ12" +config UART3_IRQ14 + bool "IRQ14" +config UART3_IRQ15 + bool "IRQ15" + +endchoice + +config UART3_IRQ + int + depends on UART3_ENABLE + default 0 if UART3_IRQ_DISABLE + default 3 if UART3_IRQ3 + default 4 if UART3_IRQ4 + default 5 if UART3_IRQ5 + default 6 if UART3_IRQ6 + default 7 if UART3_IRQ7 + default 9 if UART3_IRQ9 + default 10 if UART3_IRQ10 + default 11 if UART3_IRQ11 + default 12 if UART3_IRQ12 + default 14 if UART3_IRQ14 + default 15 if UART3_IRQ15 + +choice + prompt "UART3 Baud rate" + default UART3_BAUD_115200 + depends on UART3_ENABLE + +config UART3_BAUD_115200 + bool "115200" +config UART3_BAUD_57600 + bool "57600" +config UART3_BAUD_38400 + bool "38400" +config UART3_BAUD_19200 + bool "19200" +config UART3_BAUD_9600 + bool "9600" + +endchoice + +config UART3_BAUD + int + depends on UART3_ENABLE + default 115200 if UART3_BAUD_115200 + default 57600 if UART3_BAUD_57600 + default 38400 if UART3_BAUD_38400 + default 19200 if UART3_BAUD_19200 + default 9600 if UART3_BAUD_9600 +# end of UART3 + +# Begin of UART4 +config UART4_ENABLE + bool "UART4 Enable" + default y + +choice + prompt "UART4 I/O port" + default UART4_IO_PORT_2E8 + depends on UART4_ENABLE + +config UART4_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART4_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART4_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART4_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART4_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART4_IO_PORT_OTHER_INPUT + hex "UART4 I/O port" + depends on UART4_ENABLE && UART4_IO_PORT_OTHER + +config UART4_IO + hex + depends on UART4_ENABLE + default 0x3f8 if UART4_IO_PORT_3F8 + default 0x2f8 if UART4_IO_PORT_2F8 + default 0x3e8 if UART4_IO_PORT_3E8 + default 0x2e8 if UART4_IO_PORT_2E8 + default UART4_IO_PORT_OTHER_INPUT if UART4_IO_PORT_OTHER + +choice + prompt "UART4 IRQ" + default UART4_IRQ11 + depends on UART4_ENABLE + +config UART4_IRQ_DISABLE + bool "Disable" +config UART4_IRQ3 + bool "IRQ3, COM2" +config UART4_IRQ4 + bool "IRQ4, COM1" +config UART4_IRQ5 + bool "IRQ5" +config UART4_IRQ6 + bool "IRQ6" +config UART4_IRQ7 + bool "IRQ7" +config UART4_IRQ9 + bool "IRQ9" +config UART4_IRQ10 + bool "IRQ10, COM3" +config UART4_IRQ11 + bool "IRQ11, COM4" +config UART4_IRQ12 + bool "IRQ12" +config UART4_IRQ14 + bool "IRQ14" +config UART4_IRQ15 + bool "IRQ15" + +endchoice + +config UART4_IRQ + int + depends on UART4_ENABLE + default 0 if UART4_IRQ_DISABLE + default 3 if UART4_IRQ3 + default 4 if UART4_IRQ4 + default 5 if UART4_IRQ5 + default 6 if UART4_IRQ6 + default 7 if UART4_IRQ7 + default 9 if UART4_IRQ9 + default 10 if UART4_IRQ10 + default 11 if UART4_IRQ11 + default 12 if UART4_IRQ12 + default 14 if UART4_IRQ14 + default 15 if UART4_IRQ15 + +choice + prompt "UART4 Baud rate" + default UART4_BAUD_115200 + depends on UART4_ENABLE + +config UART4_BAUD_115200 + bool "115200" +config UART4_BAUD_57600 + bool "57600" +config UART4_BAUD_38400 + bool "38400" +config UART4_BAUD_19200 + bool "19200" +config UART4_BAUD_9600 + bool "9600" + +endchoice + +config UART4_BAUD + int + depends on UART4_ENABLE + default 115200 if UART4_BAUD_115200 + default 57600 if UART4_BAUD_57600 + default 38400 if UART4_BAUD_38400 + default 19200 if UART4_BAUD_19200 + default 9600 if UART4_BAUD_9600 +# end of UART4 + +# Begin of UART5 +config UART5_ENABLE + bool "UART5 Enable" + default n + +choice + prompt "UART5 I/O port" + default UART5_IO_PORT_OTHER + depends on UART5_ENABLE + +config UART5_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART5_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART5_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART5_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART5_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART5_IO_PORT_OTHER_INPUT + hex "UART5 I/O port" + depends on UART5_ENABLE && UART5_IO_PORT_OTHER + +config UART5_IO + hex + depends on UART5_ENABLE + default 0x3f8 if UART5_IO_PORT_3F8 + default 0x2f8 if UART5_IO_PORT_2F8 + default 0x3e8 if UART5_IO_PORT_3E8 + default 0x2e8 if UART5_IO_PORT_2E8 + default UART5_IO_PORT_OTHER_INPUT if UART5_IO_PORT_OTHER + +choice + prompt "UART5 IRQ" + default UART5_IRQ_DISABLE + depends on UART5_ENABLE + +config UART5_IRQ_DISABLE + bool "Disable" +config UART5_IRQ3 + bool "IRQ3, COM2" +config UART5_IRQ4 + bool "IRQ4, COM1" +config UART5_IRQ5 + bool "IRQ5" +config UART5_IRQ6 + bool "IRQ6" +config UART5_IRQ7 + bool "IRQ7" +config UART5_IRQ9 + bool "IRQ9" +config UART5_IRQ10 + bool "IRQ10, COM3" +config UART5_IRQ11 + bool "IRQ11, COM4" +config UART5_IRQ12 + bool "IRQ12" +config UART5_IRQ14 + bool "IRQ14" +config UART5_IRQ15 + bool "IRQ15" + +endchoice + +config UART5_IRQ + int + depends on UART5_ENABLE + default 0 if UART5_IRQ_DISABLE + default 3 if UART5_IRQ3 + default 4 if UART5_IRQ4 + default 5 if UART5_IRQ5 + default 6 if UART5_IRQ6 + default 7 if UART5_IRQ7 + default 9 if UART5_IRQ9 + default 10 if UART5_IRQ10 + default 11 if UART5_IRQ11 + default 12 if UART5_IRQ12 + default 14 if UART5_IRQ14 + default 15 if UART5_IRQ15 + +choice + prompt "UART5 Baud rate" + default UART5_BAUD_115200 + depends on UART5_ENABLE + +config UART5_BAUD_115200 + bool "115200" +config UART5_BAUD_57600 + bool "57600" +config UART5_BAUD_38400 + bool "38400" +config UART5_BAUD_19200 + bool "19200" +config UART5_BAUD_9600 + bool "9600" + +endchoice + +config UART5_BAUD + int + depends on UART5_ENABLE + default 115200 if UART5_BAUD_115200 + default 57600 if UART5_BAUD_57600 + default 38400 if UART5_BAUD_38400 + default 19200 if UART5_BAUD_19200 + default 9600 if UART5_BAUD_9600 +# end of UART5 + +# Begin of UART6 +config UART6_ENABLE + bool "UART6 Enable" + default n + +choice + prompt "UART6 I/O port" + default UART6_IO_PORT_OTHER + depends on UART6_ENABLE + +config UART6_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART6_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART6_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART6_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART6_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART6_IO_PORT_OTHER_INPUT + hex "UART6 I/O port" + depends on UART6_ENABLE && UART6_IO_PORT_OTHER + +config UART6_IO + hex + depends on UART6_ENABLE + default 0x3f8 if UART6_IO_PORT_3F8 + default 0x2f8 if UART6_IO_PORT_2F8 + default 0x3e8 if UART6_IO_PORT_3E8 + default 0x2e8 if UART6_IO_PORT_2E8 + default UART6_IO_PORT_OTHER_INPUT if UART6_IO_PORT_OTHER + +choice + prompt "UART6 IRQ" + default UART6_IRQ_DISABLE + depends on UART6_ENABLE + +config UART6_IRQ_DISABLE + bool "Disable" +config UART6_IRQ3 + bool "IRQ3, COM2" +config UART6_IRQ4 + bool "IRQ4, COM1" +config UART6_IRQ5 + bool "IRQ5" +config UART6_IRQ6 + bool "IRQ6" +config UART6_IRQ7 + bool "IRQ7" +config UART6_IRQ9 + bool "IRQ9" +config UART6_IRQ10 + bool "IRQ10, COM3" +config UART6_IRQ11 + bool "IRQ11, COM4" +config UART6_IRQ12 + bool "IRQ12" +config UART6_IRQ14 + bool "IRQ14" +config UART6_IRQ15 + bool "IRQ15" + +endchoice + +config UART6_IRQ + int + depends on UART6_ENABLE + default 0 if UART6_IRQ_DISABLE + default 3 if UART6_IRQ3 + default 4 if UART6_IRQ4 + default 5 if UART6_IRQ5 + default 6 if UART6_IRQ6 + default 7 if UART6_IRQ7 + default 9 if UART6_IRQ9 + default 10 if UART6_IRQ10 + default 11 if UART6_IRQ11 + default 12 if UART6_IRQ12 + default 14 if UART6_IRQ14 + default 15 if UART6_IRQ15 + +choice + prompt "UART6 Baud rate" + default UART6_BAUD_115200 + depends on UART6_ENABLE + +config UART6_BAUD_115200 + bool "115200" +config UART6_BAUD_57600 + bool "57600" +config UART6_BAUD_38400 + bool "38400" +config UART6_BAUD_19200 + bool "19200" +config UART6_BAUD_9600 + bool "9600" + +endchoice + +config UART6_BAUD + int + depends on UART6_ENABLE + default 115200 if UART6_BAUD_115200 + default 57600 if UART6_BAUD_57600 + default 38400 if UART6_BAUD_38400 + default 19200 if UART6_BAUD_19200 + default 9600 if UART6_BAUD_9600 +# end of UART6 + +# Begin of UART7 +config UART7_ENABLE + bool "UART7 Enable" + default n + +choice + prompt "UART7 I/O port" + default UART7_IO_PORT_OTHER + depends on UART7_ENABLE + +config UART7_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART7_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART7_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART7_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART7_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART7_IO_PORT_OTHER_INPUT + hex "UART7 I/O port" + depends on UART7_ENABLE && UART7_IO_PORT_OTHER + +config UART7_IO + hex + depends on UART7_ENABLE + default 0x3f8 if UART7_IO_PORT_3F8 + default 0x2f8 if UART7_IO_PORT_2F8 + default 0x3e8 if UART7_IO_PORT_3E8 + default 0x2e8 if UART7_IO_PORT_2E8 + default UART7_IO_PORT_OTHER_INPUT if UART7_IO_PORT_OTHER + +choice + prompt "UART7 IRQ" + default UART7_IRQ_DISABLE + depends on UART7_ENABLE + +config UART7_IRQ_DISABLE + bool "Disable" +config UART7_IRQ3 + bool "IRQ3, COM2" +config UART7_IRQ4 + bool "IRQ4, COM1" +config UART7_IRQ5 + bool "IRQ5" +config UART7_IRQ6 + bool "IRQ6" +config UART7_IRQ7 + bool "IRQ7" +config UART7_IRQ9 + bool "IRQ9" +config UART7_IRQ10 + bool "IRQ10, COM3" +config UART7_IRQ11 + bool "IRQ11, COM4" +config UART7_IRQ12 + bool "IRQ12" +config UART7_IRQ14 + bool "IRQ14" +config UART7_IRQ15 + bool "IRQ15" + +endchoice + +config UART7_IRQ + int + depends on UART7_ENABLE + default 0 if UART7_IRQ_DISABLE + default 3 if UART7_IRQ3 + default 4 if UART7_IRQ4 + default 5 if UART7_IRQ5 + default 6 if UART7_IRQ6 + default 7 if UART7_IRQ7 + default 9 if UART7_IRQ9 + default 10 if UART7_IRQ10 + default 11 if UART7_IRQ11 + default 12 if UART7_IRQ12 + default 14 if UART7_IRQ14 + default 15 if UART7_IRQ15 + +choice + prompt "UART7 Baud rate" + default UART7_BAUD_115200 + depends on UART7_ENABLE + +config UART7_BAUD_115200 + bool "115200" +config UART7_BAUD_57600 + bool "57600" +config UART7_BAUD_38400 + bool "38400" +config UART7_BAUD_19200 + bool "19200" +config UART7_BAUD_9600 + bool "9600" + +endchoice + +config UART7_BAUD + int + depends on UART7_ENABLE + default 115200 if UART7_BAUD_115200 + default 57600 if UART7_BAUD_57600 + default 38400 if UART7_BAUD_38400 + default 19200 if UART7_BAUD_19200 + default 9600 if UART7_BAUD_9600 +# end of UART7 + +# Begin of UART8 +config UART8_ENABLE + bool "UART8 Enable" + default n + +choice + prompt "UART8 I/O port" + default UART8_IO_PORT_OTHER + depends on UART8_ENABLE + +config UART8_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART8_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART8_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART8_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART8_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART8_IO_PORT_OTHER_INPUT + hex "UART8 I/O port" + depends on UART8_ENABLE && UART8_IO_PORT_OTHER + +config UART8_IO + hex + depends on UART8_ENABLE + default 0x3f8 if UART8_IO_PORT_3F8 + default 0x2f8 if UART8_IO_PORT_2F8 + default 0x3e8 if UART8_IO_PORT_3E8 + default 0x2e8 if UART8_IO_PORT_2E8 + default UART8_IO_PORT_OTHER_INPUT if UART8_IO_PORT_OTHER + +choice + prompt "UART8 IRQ" + default UART8_IRQ_DISABLE + depends on UART8_ENABLE + +config UART8_IRQ_DISABLE + bool "Disable" +config UART8_IRQ3 + bool "IRQ3, COM2" +config UART8_IRQ4 + bool "IRQ4, COM1" +config UART8_IRQ5 + bool "IRQ5" +config UART8_IRQ6 + bool "IRQ6" +config UART8_IRQ7 + bool "IRQ7" +config UART8_IRQ9 + bool "IRQ9" +config UART8_IRQ10 + bool "IRQ10, COM3" +config UART8_IRQ11 + bool "IRQ11, COM4" +config UART8_IRQ12 + bool "IRQ12" +config UART8_IRQ14 + bool "IRQ14" +config UART8_IRQ15 + bool "IRQ15" + +endchoice + +config UART8_IRQ + int + depends on UART8_ENABLE + default 0 if UART8_IRQ_DISABLE + default 3 if UART8_IRQ3 + default 4 if UART8_IRQ4 + default 5 if UART8_IRQ5 + default 6 if UART8_IRQ6 + default 7 if UART8_IRQ7 + default 9 if UART8_IRQ9 + default 10 if UART8_IRQ10 + default 11 if UART8_IRQ11 + default 12 if UART8_IRQ12 + default 14 if UART8_IRQ14 + default 15 if UART8_IRQ15 + +choice + prompt "UART8 Baud rate" + default UART8_BAUD_115200 + depends on UART8_ENABLE + +config UART8_BAUD_115200 + bool "115200" +config UART8_BAUD_57600 + bool "57600" +config UART8_BAUD_38400 + bool "38400" +config UART8_BAUD_19200 + bool "19200" +config UART8_BAUD_9600 + bool "9600" + +endchoice + +config UART8_BAUD + int + depends on UART8_ENABLE + default 115200 if UART8_BAUD_115200 + default 57600 if UART8_BAUD_57600 + default 38400 if UART8_BAUD_38400 + default 19200 if UART8_BAUD_19200 + default 9600 if UART8_BAUD_9600 +# end of UART8 + +# Begin of UART9 +config UART9_ENABLE + bool "UART9 Enable" + default n + +choice + prompt "UART9 I/O port" + default UART9_IO_PORT_OTHER + depends on UART9_ENABLE + +config UART9_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART9_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART9_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART9_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART9_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART9_IO_PORT_OTHER_INPUT + hex "UART9 I/O port" + depends on UART9_ENABLE && UART9_IO_PORT_OTHER + +config UART9_IO + hex + depends on UART9_ENABLE + default 0x3f8 if UART9_IO_PORT_3F8 + default 0x2f8 if UART9_IO_PORT_2F8 + default 0x3e8 if UART9_IO_PORT_3E8 + default 0x2e8 if UART9_IO_PORT_2E8 + default UART9_IO_PORT_OTHER_INPUT if UART9_IO_PORT_OTHER + +choice + prompt "UART9 IRQ" + default UART9_IRQ_DISABLE + depends on UART9_ENABLE + +config UART9_IRQ_DISABLE + bool "Disable" +config UART9_IRQ3 + bool "IRQ3, COM2" +config UART9_IRQ4 + bool "IRQ4, COM1" +config UART9_IRQ5 + bool "IRQ5" +config UART9_IRQ6 + bool "IRQ6" +config UART9_IRQ7 + bool "IRQ7" +config UART9_IRQ9 + bool "IRQ9" +config UART9_IRQ10 + bool "IRQ10, COM3" +config UART9_IRQ11 + bool "IRQ11, COM4" +config UART9_IRQ12 + bool "IRQ12" +config UART9_IRQ14 + bool "IRQ14" +config UART9_IRQ15 + bool "IRQ15" + +endchoice + +config UART9_IRQ + int + depends on UART9_ENABLE + default 0 if UART9_IRQ_DISABLE + default 3 if UART9_IRQ3 + default 4 if UART9_IRQ4 + default 5 if UART9_IRQ5 + default 6 if UART9_IRQ6 + default 7 if UART9_IRQ7 + default 9 if UART9_IRQ9 + default 10 if UART9_IRQ10 + default 11 if UART9_IRQ11 + default 12 if UART9_IRQ12 + default 14 if UART9_IRQ14 + default 15 if UART9_IRQ15 + +choice + prompt "UART9 Baud rate" + default UART9_BAUD_115200 + depends on UART9_ENABLE + +config UART9_BAUD_115200 + bool "115200" +config UART9_BAUD_57600 + bool "57600" +config UART9_BAUD_38400 + bool "38400" +config UART9_BAUD_19200 + bool "19200" +config UART9_BAUD_9600 + bool "9600" + +endchoice + +config UART9_BAUD + int + depends on UART9_ENABLE + default 115200 if UART9_BAUD_115200 + default 57600 if UART9_BAUD_57600 + default 38400 if UART9_BAUD_38400 + default 19200 if UART9_BAUD_19200 + default 9600 if UART9_BAUD_9600 +# end of UART9 + +# Begin of UART10 +config UART10_ENABLE + bool "UART10 Enable" + default n + +choice + prompt "UART10 I/O port" + default UART10_IO_PORT_OTHER + depends on UART10_ENABLE + +config UART10_IO_PORT_3F8 + bool "0x3f8, COM1" +config UART10_IO_PORT_2F8 + bool "0x2f8, COM2" +config UART10_IO_PORT_3E8 + bool "0x3e8, COM3" +config UART10_IO_PORT_2E8 + bool "0x2e8, COM4" +config UART10_IO_PORT_OTHER + bool "Other" + +endchoice + +config UART10_IO_PORT_OTHER_INPUT + hex "UART10 I/O port" + depends on UART10_ENABLE && UART10_IO_PORT_OTHER + +config UART10_IO + hex + depends on UART10_ENABLE + default 0x3f8 if UART10_IO_PORT_3F8 + default 0x2f8 if UART10_IO_PORT_2F8 + default 0x3e8 if UART10_IO_PORT_3E8 + default 0x2e8 if UART10_IO_PORT_2E8 + default UART10_IO_PORT_OTHER_INPUT if UART10_IO_PORT_OTHER + +choice + prompt "UART10 IRQ" + default UART10_IRQ_DISABLE + depends on UART10_ENABLE + +config UART10_IRQ_DISABLE + bool "Disable" +config UART10_IRQ3 + bool "IRQ3, COM2" +config UART10_IRQ4 + bool "IRQ4, COM1" +config UART10_IRQ5 + bool "IRQ5" +config UART10_IRQ6 + bool "IRQ6" +config UART10_IRQ7 + bool "IRQ7" +config UART10_IRQ9 + bool "IRQ9" +config UART10_IRQ10 + bool "IRQ10, COM3" +config UART10_IRQ11 + bool "IRQ11, COM4" +config UART10_IRQ12 + bool "IRQ12" +config UART10_IRQ14 + bool "IRQ14" +config UART10_IRQ15 + bool "IRQ15" + +endchoice + +config UART10_IRQ + int + depends on UART10_ENABLE + default 0 if UART10_IRQ_DISABLE + default 3 if UART10_IRQ3 + default 4 if UART10_IRQ4 + default 5 if UART10_IRQ5 + default 6 if UART10_IRQ6 + default 7 if UART10_IRQ7 + default 9 if UART10_IRQ9 + default 10 if UART10_IRQ10 + default 11 if UART10_IRQ11 + default 12 if UART10_IRQ12 + default 14 if UART10_IRQ14 + default 15 if UART10_IRQ15 + +choice + prompt "UART10 Baud rate" + default UART10_BAUD_115200 + depends on UART10_ENABLE + +config UART10_BAUD_115200 + bool "115200" +config UART10_BAUD_57600 + bool "57600" +config UART10_BAUD_38400 + bool "38400" +config UART10_BAUD_19200 + bool "19200" +config UART10_BAUD_9600 + bool "9600" + +endchoice + +config UART10_BAUD + int + depends on UART10_ENABLE + default 115200 if UART10_BAUD_115200 + default 57600 if UART10_BAUD_57600 + default 38400 if UART10_BAUD_38400 + default 19200 if UART10_BAUD_19200 + default 9600 if UART10_BAUD_9600 +# end of UART10 + +endmenu + +# LPT setting : +menu "LPT setting" + +# Begin of LPT +config LPT_ENABLE + bool "LPT Enable" + default n + +choice + prompt "LPT I/O port" + default LPT_IO_PORT_278 + depends on LPT_ENABLE + +config LPT_IO_PORT_378 + bool "0x378, LPT1" +config LPT_IO_PORT_278 + bool "0x278, LPT2" +config LPT_IO_PORT_OTHER + bool "Other" + +endchoice + +config LPT_IO_PORT_OTHER_INPUT + hex "LPT I/O port" + depends on LPT_ENABLE && LPT_IO_PORT_OTHER + +config LPT_IO + hex + depends on LPT_ENABLE + default 0x378 if LPT_IO_PORT_378 + default 0x278 if LPT_IO_PORT_278 + default LPT_IO_PORT_OTHER_INPUT if LPT_IO_PORT_OTHER + +choice + prompt "LPT IRQ" + default LPT_IRQ_DISABLE + depends on LPT_ENABLE + +config LPT_IRQ_DISABLE + bool "Disable" +config LPT_IRQ3 + bool "IRQ3" +config LPT_IRQ4 + bool "IRQ4" +config LPT_IRQ5 + bool "IRQ5" +config LPT_IRQ6 + bool "IRQ6" +config LPT_IRQ7 + bool "IRQ7" +config LPT_IRQ9 + bool "IRQ9" +config LPT_IRQ10 + bool "IRQ10" +config LPT_IRQ11 + bool "IRQ11" +config LPT_IRQ12 + bool "IRQ12" +config LPT_IRQ14 + bool "IRQ14" +config LPT_IRQ15 + bool "IRQ15" + +endchoice + +config LPT_IRQ + int + depends on LPT_ENABLE + default 0 if LPT_IRQ_DISABLE + default 3 if LPT_IRQ3 + default 4 if LPT_IRQ4 + default 5 if LPT_IRQ5 + default 6 if LPT_IRQ6 + default 7 if LPT_IRQ7 + default 9 if LPT_IRQ9 + default 10 if LPT_IRQ10 + default 11 if LPT_IRQ11 + default 12 if LPT_IRQ12 + default 14 if LPT_IRQ14 + default 15 if LPT_IRQ15 + +choice + prompt "LPT Mode Setting" + default LPT_MODE_SPP + depends on LPT_ENABLE + +config LPT_MODE_BPP + bool "BPP mode" +config LPT_MODE_EPP_19_AND_SPP + bool "EPP 1.9 and SPP mode" +config LPT_MODE_ECP + bool "ECP Mode" +config LPT_MODE_ECP_AND_EPP_19 + bool "ECP and EPP 1.9 mode" +config LPT_MODE_SPP + bool "SPP Mode" +config LPT_MODE_EPP_17_AND_SPP + bool "EPP 1.7 and SPP mode" +config LPT_MODE_ECP_AND_EPP_17 + bool "ECP and EPP 1.7 mode" + +endchoice + +# end of LPT + +endmenu + +endif # BOARD_DMP_EX diff --git a/src/mainboard/dmp/vortex86ex/chip.h b/src/mainboard/dmp/vortex86ex/chip.h new file mode 100644 index 0000000..446e596 --- /dev/null +++ b/src/mainboard/dmp/vortex86ex/chip.h @@ -0,0 +1,23 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +extern struct chip_operations mainboard_ops; + +struct mainboard_config { +}; diff --git a/src/mainboard/dmp/vortex86ex/devicetree.cb b/src/mainboard/dmp/vortex86ex/devicetree.cb new file mode 100644 index 0000000..1fbfe7b --- /dev/null +++ b/src/mainboard/dmp/vortex86ex/devicetree.cb @@ -0,0 +1,34 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +chip northbridge/dmp/vortex86ex # North Bridge + device domain 0 on + device pci 0.0 on end # Host Bridge + chip southbridge/dmp/vortex86ex # South Bridge + device pci 7.0 on end # ISA Bridge + device pci 8.0 on end # Ethernet + device pci a.0 on end # USB 1.1 + device pci a.1 on end # USB 2.0 + device pci b.0 on end # USB 1.1 + device pci b.1 on end # USB 2.0 + device pci c.0 on end # IDE + end + end # pci domain 0 + chip cpu/dmp/vortex86ex end # CPU +end diff --git a/src/mainboard/dmp/vortex86ex/irq_tables.c b/src/mainboard/dmp/vortex86ex/irq_tables.c new file mode 100644 index 0000000..c185c4f --- /dev/null +++ b/src/mainboard/dmp/vortex86ex/irq_tables.c @@ -0,0 +1,57 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <arch/pirq_routing.h> + +static const struct irq_routing_table intel_irq_routing_table = { + PIRQ_SIGNATURE, /* u32 signature */ + PIRQ_VERSION, /* u16 version */ + 32 + 16 * 12, /* Max. number of devices on the bus */ + 0x00, /* Interrupt router bus */ + (0x07 << 3) | 0x0, /* Interrupt router dev */ + 0, /* IRQs devoted exclusively to PCI usage */ + 0x17f3, /* Vendor */ + 0x6031, /* Device */ + 0, /* Miniport */ + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, /* u8 rfu[11] */ + 0xa, /* Checksum (has to be set to some value that + * would give 0 after the sum of all bytes + * for this structure (including checksum). + */ + { + /* bus, dev | fn, {link, bitmap}, {link, bitmap}, {link, bitmap}, {link, bitmap}, slot, rfu */ + {0x00, (0x01 << 3) | 0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x04, 0xdef8}}, 0x1, 0x0}, + {0x00, (0x02 << 3) | 0x0, {{0x02, 0xdef8}, {0x03, 0xdef8}, {0x04, 0xdef8}, {0x01, 0xdef8}}, 0x2, 0x0}, + {0x00, (0x03 << 3) | 0x0, {{0x03, 0xdef8}, {0x04, 0xdef8}, {0x01, 0xdef8}, {0x02, 0xdef8}}, 0x0, 0x0}, + {0x00, (0x04 << 3) | 0x0, {{0x04, 0xdef8}, {0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}}, 0x4, 0x0}, + {0x00, (0x05 << 3) | 0x0, {{0x01, 0xdef8}, {0x02, 0xdef8}, {0x03, 0xdef8}, {0x04, 0xdef8}}, 0x5, 0x0}, + {0x00, (0x06 << 3) | 0x0, {{0x02, 0xdef8}, {0x03, 0xdef8}, {0x04, 0xdef8}, {0x01, 0xdef8}}, 0x6, 0x0}, + {0x00, (0x08 << 3) | 0x0, {{0x05, 0xdef8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}}, 0x0, 0x0}, + {0x00, (0x0a << 3) | 0x0, {{0x07, 0xdef8}, {0x08, 0xdef8}, {0x00, 0x0000}, {0x00, 0x0000}}, 0x0, 0x0}, + {0x00, (0x0b << 3) | 0x0, {{0x09, 0xdef8}, {0x0a, 0xdef8}, {0x00, 0x0000}, {0x00, 0x0000}}, 0x0, 0x0}, + {0x00, (0x0c << 3) | 0x0, {{0x0b, 0xdef8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}}, 0x0, 0x0}, + {0x00, (0x0f << 3) | 0x0, {{0x0d, 0xdef8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}}, 0x0, 0x0}, + {0x00, (0x0e << 3) | 0x0, {{0x0e, 0xdef8}, {0x00, 0x0000}, {0x00, 0x0000}, {0x00, 0x0000}}, 0x0, 0x0}, + } +}; + +unsigned long write_pirq_routing_table(unsigned long addr) +{ + return copy_pirq_routing_table(addr, &intel_irq_routing_table); +} diff --git a/src/mainboard/dmp/vortex86ex/mainboard.c b/src/mainboard/dmp/vortex86ex/mainboard.c new file mode 100644 index 0000000..934c898 --- /dev/null +++ b/src/mainboard/dmp/vortex86ex/mainboard.c @@ -0,0 +1,35 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <console/console.h> +#include <device/device.h> +#include <device/pci.h> +#include <arch/io.h> +#include <boot/tables.h> +#include <device/pci_def.h> +#include "chip.h" + +static void mb_enable(device_t dev) +{ +} + +struct chip_operations mainboard_ops = { + CHIP_NAME("DMP VORTEX86EX Mainboard") + .enable_dev = mb_enable, +}; diff --git a/src/mainboard/dmp/vortex86ex/romstage.c b/src/mainboard/dmp/vortex86ex/romstage.c new file mode 100644 index 0000000..8f02305 --- /dev/null +++ b/src/mainboard/dmp/vortex86ex/romstage.c @@ -0,0 +1,428 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2012 Andrew Wu arw@dmp.com.tw + * + * 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 <stdint.h> +#include <arch/io.h> +#include <stdlib.h> +#include <console/console.h> +#include "cpu/x86/mtrr/earlymtrr.c" +#include "drivers/pc80/i8254.c" +#include "northbridge/dmp/vortex86ex/northbridge.h" +#include "southbridge/dmp/vortex86ex/southbridge.h" +#include "northbridge/dmp/vortex86ex/raminit.c" + +#define DMP_CPUID_SX 0x31504d44 +#define DMP_CPUID_DX 0x32504d44 +#define DMP_CPUID_MX 0x33504d44 +#define DMP_CPUID_DX2 0x34504d44 +#define DMP_CPUID_MX_PLUS 0x35504d44 +#define DMP_CPUID_EX 0x37504d44 + +static u32 get_dmp_id(void) +{ + return pci_read_config32(NB, NB_REG_CID); +} + +static void check_dmp_cpu(u32 dmp_id) +{ + if (dmp_id & 0x00ffffff != 0x00504d44) { + while (1) + post_code(0x81); + } +} + +static void check_memtype_ddr2(void) +{ + /* Check STRAP register for MEMSEL, we only support DDRII. */ + u32 strap; + strap = pci_read_config32(NB, NB_REG_STRAP); + if (((strap >> 12) & 0x3) != 0x3) { + while (1) + post_code(0x83); + } +} + +/* Indirect access registers for Watch-dog timer, GPIO PORT 0,1 + * Index port is for I/O port 22h + * Index port 13h (00: lock register, C5h: unlock register) for lock/unlock function + * Index port 37h, 39h, 3Ah, 3Bh, 3Ch for Watchdog timer + * Index port 46h, 47h, 4Ch, 4Dh, 4Eh, 4Fh for GPIO port 0, 1 + */ +static void write_indirect_reg(u8 index, u8 data) +{ + outb(index, 0x22); + outb(data, 0x23); +} + +static void lock_indirect_reg(void) +{ + write_indirect_reg(0x13, 0x00); +} + +static void unlock_indirect_reg(void) +{ + write_indirect_reg(0x13, 0xc5); +} + +static void disable_watchdog(void) +{ + unlock_indirect_reg(); + // disable watchdog timer + write_indirect_reg(0x37, 0x0); +} + +void set_ex_powerdown_control(void) +{ + u32 powerdown_ctrl; + powerdown_ctrl = pci_read_config32(SB, 0xbc); +#if CONFIG_TEMP_POWERDOWN + powerdown_ctrl |= (1 << 31); +#endif +#if CONFIG_SATA_POWERDOWN + powerdown_ctrl |= (1 << 30); +#endif +#if CONFIG_ADC_POWERDOWN + powerdown_ctrl |= (1 << 28); +#endif +#if CONFIG_PCIE0_POWERDOWN + powerdown_ctrl |= (1 << 13); +#endif +#if CONFIG_MAC_POWERDOWN + powerdown_ctrl |= (1 << 3); +#endif +#if CONFIG_USB1_POWERDOWN + powerdown_ctrl |= (1 << 1); +#endif +#if CONFIG_IDE_POWERDOWN + powerdown_ctrl |= (1 << 0); +#endif + pci_write_config32(SB, 0xbc, powerdown_ctrl); +} + +static u32 make_uart_config(u16 base, u8 irq) +{ + /* Set base IO address only, skip IRQ. IRQ will be setup in + * southbridge stage. */ + u32 cfg = 0; + cfg |= 1 << 23; // UE = enabled. + cfg |= base; // UIOA. + return cfg; +} + +#define SETUP_UART(n) \ + uart_cfg = make_uart_config(CONFIG_UART##n##_IO, CONFIG_UART##n##_IRQ);\ + outl(uart_cfg, 0xc00 + (n - 1) * 4); + +static void ex_uart_early_init(void) +{ +#if CONFIG_TTYS0_BASE + u32 uart_cfg = 0; + /* Set UART Config I/O base address to 0xc00 */ + pci_write_config16(SB, 0x60, 0xc01); + /* If serial console base address is defined, find out which + * UART uses this address, and setup this UART first. */ +#if CONFIG_TTYS0_BASE == CONFIG_UART1_IO + SETUP_UART(1) +#elif CONFIG_TTYS0_BASE == CONFIG_UART2_IO + SETUP_UART(2) +#elif CONFIG_TTYS0_BASE == CONFIG_UART3_IO + SETUP_UART(3) +#elif CONFIG_TTYS0_BASE == CONFIG_UART4_IO + SETUP_UART(4) +#elif CONFIG_TTYS0_BASE == CONFIG_UART5_IO + SETUP_UART(5) +#elif CONFIG_TTYS0_BASE == CONFIG_UART6_IO + SETUP_UART(6) +#elif CONFIG_TTYS0_BASE == CONFIG_UART7_IO + SETUP_UART(7) +#elif CONFIG_TTYS0_BASE == CONFIG_UART8_IO + SETUP_UART(8) +#elif CONFIG_TTYS0_BASE == CONFIG_UART9_IO + SETUP_UART(9) +#elif CONFIG_TTYS0_BASE == CONFIG_UART10_IO + SETUP_UART(10) +#endif + /* Keep UART Config I/O base address */ + //pci_write_config16(SB, 0x60, 0x0); +#endif +} + +static void init_wdt1(void) +{ +#if CONFIG_WDT1_INITIALIZE +#if CONFIG_WDT1_ENABLE + outb(0x1 << 6, 0xa8); +#endif + u8 wdt1_signal_reg = 0; +#if CONFIG_WDT1_SINGAL_NMI + wdt1_signal_reg = 0x0c << 4; +#elif CONFIG_WDT1_SIGNAL_RESET + wdt1_signal_reg = 0x0d << 4; +#elif CONFIG_WDT1_SIGNAL_SMI + wdt1_signal_reg = 0x0e << 4; +#endif + outb(wdt1_signal_reg, 0xa9); +#endif +} + +/* Fill 32bit pattern into specified DRAM region. */ +static void fill_dram(u32 * p, u32 pattern, u32 test_len) +{ + if (test_len == 0) + return; +#if 0 + // C version, very slow. + for (p = (u32 *) 0; (u32) p < test_len; p++) { + *p = pattern; + } +#endif + // ASM version, much faster. + asm volatile ( + "cld\n\t" + "rep\n\t" + "stosl" + : /* no output registers */ + : "c" (test_len / 4), "a" (pattern), "D" (p) + ); +} + +/* Verify 32bit pattern in specified DRAM region. + * Return -1 if ok, failed memory address if error. */ +static int verify_dram(u32 * p, u32 pattern, u32 test_len) +{ + if (test_len == 0) + return -1; +#if 0 + // C version, very slow. + for (p = (u32 *) 0; (u32) p < test_len; p++) { + if (*p != pattern) { + return (int)p; + } + } + return -1; +#endif + u16 flags; + int addr; + asm volatile ( + "cld\n\t" + "rep\n\t" + "scasl\n\t" + "lahf\n\t" + : "=a" (flags), "=D" (addr) + : "c" (test_len / 4), "a" (pattern), "D" (p) + ); + if (flags & (1 << (6 + 8))) // x86 zero flag = bit 6. + { + return -1; // verify ok + } + return addr - 4; // verify error, return error address. +} + +static void test_dram_stability(void) +{ + u32 test_len = 2048 * 1024; + u32 pat = 0x5aa5a55a; + u32 ext_mem_start = 0xc0000; + u32 base_mem_test_len = test_len > 640 * 1024 ? 640 * 1024 : test_len; + u32 ext_mem_test_len = test_len > ext_mem_start ? test_len - ext_mem_start : 0; + if (ext_mem_test_len > 0) { + /* Enable all shadow RAM region C0000 - FFFFF. */ + pci_write_config32(NB, NB_REG_MAR, 0x3ffffff0); + } + int v; + fill_dram((u32 *) 0, pat, base_mem_test_len); + fill_dram((u32 *) ext_mem_start, pat, ext_mem_test_len); + v = verify_dram((u32 *) 0, pat, base_mem_test_len); + if (v == -1) { + v = verify_dram((u32 *) ext_mem_start, pat, ext_mem_test_len); + } + /* Change pattern and test again */ + if (v == -1) { + pat = 0xa55a5aa5; + fill_dram((u32 *) 0, pat, base_mem_test_len); + fill_dram((u32 *) ext_mem_start, pat, ext_mem_test_len); + v = verify_dram((u32 *) 0, pat, base_mem_test_len); + if (v == -1) { + v = verify_dram((u32 *) ext_mem_start, pat, ext_mem_test_len); + } + } + if (v != -1) { + post_code(0x86); + print_emerg("DRAM stablility test error!\nADDR = "); + print_emerg_hex32(v); + print_emerg(", WRITE = "); + print_emerg_hex32(pat); + u32 r = *(u32 *) v; + print_emerg(", READ = "); + print_emerg_hex32(r); + print_emerg(", XOR = "); + print_emerg_hex32(r ^ pat); + print_emerg("\n"); + die("System halted.\n"); + } + if (ext_mem_test_len > 0) { + /* Disable shadow RAM. */ + pci_write_config32(NB, NB_REG_MAR, 0x0); + } +} + +static void enable_l2_cache(void) +{ + /* + * Enable L2 cache by setting PCI N/B function 1 L2 cache + * control register (0xe8) bit 0 (L2_EN) and bit 1 (L2_WB_EN). + */ + u32 reg_nb_f1_e8; + reg_nb_f1_e8 = pci_read_config8(NB1, 0xe8); + reg_nb_f1_e8 |= 3; + pci_write_config8(NB1, 0xe8, reg_nb_f1_e8); +} + +static void print_ddr3_memory_setup(void) +{ +#if CONFIG_DEBUG_RAM_SETUP + print_debug("DDR3 Timing Reg 0-3:\n"); + print_debug("NB 6e : "); + print_debug_hex16(pci_read_config16(NB, 0x6e)); + print_debug("\nNB 74 : "); + print_debug_hex32(pci_read_config32(NB, 0x74)); + print_debug("\nNB 78 : "); + print_debug_hex32(pci_read_config32(NB, 0x78)); + print_debug("\nNB 7c : "); + print_debug_hex32(pci_read_config32(NB, 0x7c)); + u16 mbr = pci_read_config16(NB, 0x6c); + print_debug("\nNB 6c(MBR) : "); + print_debug_hex16(mbr); + const char *s; + u8 col = (mbr & 7); + if (col == 0) + s = " (COL=10"; + else + s = " (COL=11"; + print_debug(s); + u8 row = (mbr >> 5) & 7; + switch (row) { + case 0: + s = ", ROW = 13"; + break; + case 1: + s = ", ROW = 14"; + break; + case 2: + s = ", ROW = 15"; + break; + default: + s = ", ROW = 16"; + break; + } + print_debug(s); + u8 size = (mbr >> 8) & 0xf; + switch (size) { + case 5: + s = ", 64M"; + break; + case 6: + s = ", 128M"; + break; + case 7: + s = ", 256M"; + break; + case 8: + s = ", 512M"; + break; + case 9: + s = ", 1GB"; + break; + case 10: + s = ", 2GB"; + break; + } + print_debug(s); + u8 mask = (mbr >> 13) & 1; + if (mask == 0) + s = ", CS MASK Enable)\n"; + else + s = ", CS Mask Disable)\n"; + print_debug(s); +#endif +} + +static void main(unsigned long bist) +{ + device_t dev; + u32 dmp_id; + + dmp_id = get_dmp_id(); + check_dmp_cpu(dmp_id); + disable_watchdog(); + if (dmp_id == DMP_CPUID_EX) { + set_ex_powerdown_control(); + ex_uart_early_init(); + } + + console_init(); + + if (dmp_id == DMP_CPUID_EX) { + init_wdt1(); + } + + /* Initialize i8254 timers */ + post_code(0x42); + setup_i8254(); + + /* Initialize DRAM */ + switch (dmp_id) { + case DMP_CPUID_DX: + check_memtype_ddr2(); + config_pci_northbridge_f1(); + config_pci_northbridge_f0(); + detect_dram_size(); + break; + case DMP_CPUID_EX: + u8 reg_nb_f1_cc; + /* Setup DDR3 Timing reg 0-3 / Config reg */ + pci_write_config16(NB, 0x6e, 0x0a2f); + pci_write_config32(NB, 0x74, 0x84010200); + pci_write_config32(NB, 0x78, 0x33405544); + pci_write_config32(NB, 0x7c, 0x2e0f0e0b); + /* Disable enhance read push write */ + reg_nb_f1_cc = pci_read_config8(NB1, 0xcc); + reg_nb_f1_cc &= ~(1 << 4); + pci_write_config8(NB1, 0xcc, reg_nb_f1_cc); + detect_ddr3_dram_size(); + /* Reset enhance read push write to default(enable) */ + reg_nb_f1_cc |= (1 << 4); + pci_write_config8(NB1, 0xcc, reg_nb_f1_cc); + + print_ddr3_memory_setup(); + break; + default: + /* Other CPU type is not supported yet. */ + post_code(0x85); + die("Unknown CPU model.\n"); + } + test_dram_stability(); + + /* CPU setup, romcc pukes on invd() */ + asm volatile ("invd"); + enable_cache(); + + enable_l2_cache(); +} diff --git a/src/northbridge/Kconfig b/src/northbridge/Kconfig index b2b8abe..0ac09a6 100644 --- a/src/northbridge/Kconfig +++ b/src/northbridge/Kconfig @@ -1,4 +1,5 @@ source src/northbridge/amd/Kconfig +source src/northbridge/dmp/Kconfig source src/northbridge/intel/Kconfig source src/northbridge/rdc/Kconfig source src/northbridge/via/Kconfig diff --git a/src/northbridge/Makefile.inc b/src/northbridge/Makefile.inc index 283ba4e..1a5b1c8 100644 --- a/src/northbridge/Makefile.inc +++ b/src/northbridge/Makefile.inc @@ -1,4 +1,5 @@ subdirs-y += amd +subdirs-y += dmp subdirs-y += intel subdirs-y += rdc subdirs-y += via diff --git a/src/northbridge/dmp/Kconfig b/src/northbridge/dmp/Kconfig new file mode 100644 index 0000000..a69d1d9 --- /dev/null +++ b/src/northbridge/dmp/Kconfig @@ -0,0 +1,20 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +source src/northbridge/dmp/vortex86ex/Kconfig diff --git a/src/northbridge/dmp/Makefile.inc b/src/northbridge/dmp/Makefile.inc new file mode 100644 index 0000000..3cfcc48 --- /dev/null +++ b/src/northbridge/dmp/Makefile.inc @@ -0,0 +1,20 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +subdirs-$(CONFIG_NORTHBRIDGE_DMP_VORTEX86EX) += vortex86ex diff --git a/src/northbridge/dmp/vortex86ex/Kconfig b/src/northbridge/dmp/vortex86ex/Kconfig new file mode 100644 index 0000000..a304606 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/Kconfig @@ -0,0 +1,27 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +config NORTHBRIDGE_DMP_VORTEX86EX + bool + + +config BOOTBLOCK_NORTHBRIDGE_INIT + string + default "northbridge/dmp/vortex86ex/bootblock.c" + depends on NORTHBRIDGE_DMP_VORTEX86EX diff --git a/src/northbridge/dmp/vortex86ex/Makefile.inc b/src/northbridge/dmp/vortex86ex/Makefile.inc new file mode 100644 index 0000000..82b07fd --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/Makefile.inc @@ -0,0 +1,21 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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-y += northbridge.c +ramstage-y += xgi_oprom.c diff --git a/src/northbridge/dmp/vortex86ex/bootblock.c b/src/northbridge/dmp/vortex86ex/bootblock.c new file mode 100644 index 0000000..a90d4b9 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/bootblock.c @@ -0,0 +1,76 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <arch/io.h> +#include "northbridge.h" + +/************************************************************************/ +/* north bridge configuration space access routines */ +/************************************************************************/ + +uint8_t pci_read_nb_config8(unsigned where) +{ + return (pci_io_read_config8(NB, where)); +} + +void pci_write_nb_config8(unsigned where, uint8_t value) +{ + pci_io_write_config8(NB, where, value); +} + +uint16_t pci_read_nb_config16(unsigned where) +{ + return (pci_io_read_config16(NB, where)); +} + +void pci_write_nb_config16(unsigned where, uint16_t value) +{ + pci_io_write_config16(NB, where, value); +} + +uint32_t pci_read_nb_config32(unsigned where) +{ + return (pci_io_read_config32(NB, where)); +} + +void pci_write_nb_config32(unsigned where, uint32_t value) +{ + pci_io_write_config32(NB, where, value); +} + +void pci_write_nb1_config32(unsigned where, uint32_t value) +{ + pci_io_write_config32(NB1, where, value); +} + +/************************************************************************/ +/* bootblock north bridge initialize */ +/************************************************************************/ + +void bootblock_northbridge_init(void) +{ + pci_write_nb_config8(NB_REG_PMCR, (pci_read_nb_config8(NB_REG_PMCR)&~0xf0) | 0x05); + pci_write_nb_config8(NB_REG_MBR, (pci_read_nb_config8(NB_REG_MBR)&0xfc)); + pci_write_nb_config8(NB_REG_SMM, 0); + pci_write_nb_config8(NB_REG_SDRAM_MCR, (pci_read_nb_config8(NB_REG_SDRAM_MCR)&~0xf9) | 0x06); + pci_write_nb_config8(NB_REG_MRR, 0); + pci_write_nb_config8(NB_REG_CPU_DCR+1, (pci_read_nb_config8(NB_REG_CPU_DCR+1)&~0xfb) | 0x04); + pci_write_nb_config8(NB_REG_PACR, (pci_read_nb_config8(NB_REG_PACR)&~0xfc) | 0x01); + pci_write_nb_config32(NB_REG_BUF_SC, 0x83e7cf9f); +} diff --git a/src/northbridge/dmp/vortex86ex/chip.h b/src/northbridge/dmp/vortex86ex/chip.h new file mode 100644 index 0000000..93384c4 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/chip.h @@ -0,0 +1,26 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 _NORTHBRIDGE_DMP_VORTEX86EX +#define _NORTHBRIDGE_DMP_VORTEX86EX + +struct northbridge_dmp_vortex86ex_config { +}; + +#endif /* _NORTHBRIDGE_DMP_VORTEX86EX */ diff --git a/src/northbridge/dmp/vortex86ex/northbridge.c b/src/northbridge/dmp/vortex86ex/northbridge.c new file mode 100644 index 0000000..1218591 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/northbridge.c @@ -0,0 +1,147 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <console/console.h> +#include <arch/io.h> +#include <stdint.h> +#include <device/device.h> +#include <device/pci.h> +#include <device/pci_ids.h> +#include <cbmem.h> +#include <pc80/mc146818rtc.h> +#include "chip.h" +#include "northbridge.h" + +#define SPI_BASE 0xfc00 + +static void northbridge_init(device_t dev) +{ + printk(BIOS_DEBUG, "Vortex86EX northbridge early init ...\n"); + // enable F0A/ECA/E8A/E4A/E0A/C4A/C0A shadow read/writable. + pci_write_config32(dev, NB_REG_MAR, 0x3ff000f0); + // enable C0000h - C3FFFh/C4000h - C7FFF can be in L1 cache selection. + pci_write_config32(dev, NB_REG_HOST_CTL, (1 << 18)|(1<<19)); + // Set SPI register base. + pci_write_config16(dev, NB_REG_SPI_BASE,SPI_BASE|1); +} + +static struct device_operations northbridge_operations = { + .set_resources = pci_dev_set_resources, + .enable_resources = pci_dev_enable_resources, + .init = northbridge_init +}; + +static const struct pci_driver northbridge_driver_6021 __pci_driver = { + .ops = &northbridge_operations, + .vendor = PCI_VENDOR_ID_RDC, + .device =0x6021, /* DX CPU N/B ID */ +}; + +static const struct pci_driver northbridge_driver_6025 __pci_driver = { + .ops = &northbridge_operations, + .vendor = PCI_VENDOR_ID_RDC, + .device =0x6025, /* EX CPU N/B ID */ +}; + +/* Set CMOS register 15h/16h/17h/18h for base/extended + * memory size. */ +static void set_cmos_memory_size(unsigned long sizek) +{ + unsigned long ext_mem_size; + u8 ext_mem_size_hb, ext_mem_size_lb; + /* calculate memory size between 1M - 65M. */ + ext_mem_size = sizek - 1024; + if(ext_mem_size > 65535) + ext_mem_size = 65535; + ext_mem_size_hb = (u8)(ext_mem_size >> 8); + ext_mem_size_lb = (u8)(ext_mem_size & 0xff); + /* Base memory is always 640K. */ + cmos_write(0x80, 0x15); + cmos_write(0x02, 0x16); + /* Write extended memory size. */ + cmos_write(ext_mem_size_lb, 0x17); + cmos_write(ext_mem_size_hb, 0x18); + /* register 0x30(48) is RTC_BOOT_BYTE for CoreBoot, + * don't touch it. */ +} + +static void pci_domain_set_resources(device_t dev) +{ + device_t mc_dev; + uint32_t pci_tolm; + + printk(BIOS_SPEW, "Entering vortex86ex pci_domain_set_resources.\n"); + + pci_tolm = find_pci_tolm(dev->link_list); + mc_dev = dev->link_list->children; + if (mc_dev) { + unsigned long tomk, tolmk; + int idx; + int ss; + /* Get DDRII size setting from northbridge register. */ + /* SS = 0 for 2MB, 1 for 4MB, 2 for 8MB, 3 for 16MB ... */ + ss = pci_read_config16(mc_dev, 0x6c); + ss = ((ss >> 8) & 0xf); + tomk = (2 * 1024) << ss; + printk(BIOS_DEBUG, "I would set ram size to %ld Mbytes\n", (tomk >> 10)); + /* Compute the top of Low memory */ + tolmk = pci_tolm >> 10; + if (tolmk >= tomk) { + /* The PCI hole does does not overlap the memory. + */ + tolmk = tomk; + } + + high_tables_base = (tolmk * 1024) - HIGH_MEMORY_SIZE; + high_tables_size = HIGH_MEMORY_SIZE; + printk(BIOS_DEBUG, "tom: %lx, high_tables_base: %llx, high_tables_size: %llx\n", + tomk*1024, high_tables_base, high_tables_size); + + /* Report the memory regions */ + idx = 10; + ram_resource(dev, idx++, 0, 640); /* first 640k */ + ram_resource(dev, idx++, 768, tolmk - 768); /* leave a hole for vga */ + set_cmos_memory_size(tolmk); + } + assign_resources(dev->link_list); +} + +static struct device_operations pci_domain_ops = { + .read_resources = pci_domain_read_resources, + .set_resources = pci_domain_set_resources, + .enable_resources = NULL, + .init = NULL, + .scan_bus = pci_domain_scan_bus, +}; + +static void enable_dev(struct device *dev) +{ + printk(BIOS_SPEW, "In vortex86ex enable_dev for device %s.\n", dev_path(dev)); + + /* Set the operations if it is a special bus type */ + if (dev->path.type == DEVICE_PATH_DOMAIN) { + dev->ops = &pci_domain_ops; + pci_set_method(dev); + } +} + +struct chip_operations northbridge_dmp_vortex86ex_ops = { + CHIP_NAME("DMP Vortex86EX Northbridge") + .enable_dev = enable_dev, +}; diff --git a/src/northbridge/dmp/vortex86ex/northbridge.h b/src/northbridge/dmp/vortex86ex/northbridge.h new file mode 100644 index 0000000..efd5274 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/northbridge.h @@ -0,0 +1,76 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 NORTHBRIDGE_DMP_VORTEX86EX_H +#define NORTHBRIDGE_DMP_VORTEX86EX_H + +#define NB PCI_DEV(0, 0, 0) +#define NB_REG_VID 0x00 +#define NB_REG_DID 0x02 +#define NB_REG_CMD 0x04 +#define NB_REG_STS 0x06 +#define NB_REG_RID 0x08 +#define NB_REG_CLS_CODE 0x09 +#define NB_REG_HAD_TYPE 0x0E +#define NB_REG_SUB_VID 0x2C +#define NB_REG_SUB_DID 0x2E +#define NB_REG_SPI_BASE 0x40 +#define NB_REG_BUF_SC 0x44 +#define NB_REG_NBOCDCR 0x4A +#define NB_REG_GPUUMACR 0x4B +#define NB_REG_STRAP 0x60 +#define NB_REG_MCPS 0x66 +#define NB_REG_SDRAM_MTR 0x68 +#define NB_REG_SDRAM_MCR 0x6A +#define NB_REG_MBR 0x6C +#define NB_REG_MRR 0x6E +#define NB_REG_IO_CCR 0x70 +#define NB_REG_CPU_DCR 0x72 +#define NB_REG_DDR_MTR 0x74 +#define NB_REG_SMM 0x83 +#define NB_REG_MAR 0x84 +#define NB_REG_CID 0x90 +#define NB_REG_S1R 0x94 +#define NB_REG_S2R 0x98 +#define NB_REG_S3R 0x9C +#define NB_REG_HOST_CTL 0xA0 +#define NB_REG_CPU_MBCR 0xC4 +#define NB_REG_CDR 0xD0 +#define NB_REG_PACR 0xF0 +#define NB_REG_PMCR 0xF4 +#define NB_REG_PCI_TARGET 0xF8 +#define NB_REG_PCSCR 0xFC + +/* Additional "virtual" device, just extension of NB */ +#define NB1 PCI_DEV(0, 0, 1) +#define NB1_REG_DDRII_PHY_CTL3 0x50 +#define NB1_REG_DDR_PWR_SAV 0xBC +#define NB1_REG_DDRII_CTL_OPT1 0xC0 +#define NB1_REG_DDRII_CTL_OPT2 0xC4 +#define NB1_REG_DDRII_CTL_OPT3 0xC8 +#define NB1_REG_DDRII_CTL_OPT4 0xCC +#define NB1_REG_TEST_MODE 0xD0 +#define NB1_REG_PCI_DELAY_LINE 0xD1 +#define NB1_REG_L2_CACHE_CTL 0xE8 +#define NB1_REG_SSCR 0xEC +#define NB1_REG_DDRII_CTL 0xF0 +#define NB1_REG_DDRII_PHY_CTL1 0xF4 +#define NB1_REG_DDRII_PHY_CTL2 0xF8 + +#endif /* NORTHBRIDGE_DMP_VORTEX86EX_H */ diff --git a/src/northbridge/dmp/vortex86ex/raminit.c b/src/northbridge/dmp/vortex86ex/raminit.c new file mode 100644 index 0000000..54355f9 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/raminit.c @@ -0,0 +1,559 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#define DDRII_CTL_REG_tRAS 0x12 +#define DDRII_CTL_REG_tRRD 0x6 +#define DDRII_CTL_REG_tFAW 0x14 +#define DDRII_CTL_REG_tRTP 0x3 +#define DDRII_CTL_REG_tWTR 0x4 +#define DDRII_CTL_REG_tRC 0x15 +#define DDRII_CTL_REG_DQSnEN 0x0 + +#define DDR_CTRL_VAL \ + (DDRII_CTL_REG_tRAS << 20) | \ + (DDRII_CTL_REG_tRRD << 17) | \ + (DDRII_CTL_REG_tFAW << 12) | \ + (DDRII_CTL_REG_tRTP << 9) | \ + (DDRII_CTL_REG_tWTR << 6) | \ + (DDRII_CTL_REG_tRC << 1) | \ + (DDRII_CTL_REG_DQSnEN) + +#define DDRII_PHY_CTL_1 0x000186c3 +#define DDRII_PHY_CTL_2 0x00060000 + +static void config_pci_northbridge_f1(void) +{ + u16 i; + // DDRII PHY Control 2 + pci_write_config32(NB1, 0xf8, DDRII_PHY_CTL_2); + // DDRII PHY Control 1 + pci_write_config32(NB1, 0xf4, DDRII_PHY_CTL_1); + // wait PHY lock. + post_code(0x09); + while ((pci_read_config32(NB1, 0xf8) & (1 << 21)) == 0) { + } + post_code(0x0a); + // wait PHY stable. + for (i = 0; i < 0x300; i++) { + inb(0x80); + } + // DDRII control register. + pci_write_config32(NB1, 0xf0, DDR_CTRL_VAL); +} + +#define MEM_CLK_PHASE_R 0x0e +#define MEM_CLK_PHASE_W 0x01 + +#define ODT_EN 0x0 +#define OUTPUT_DRIVER_IMPEDANCE 0x0 +#define ODT_CONTROL 0x0 +#define ADDITIVE_LATENCY 0x0 +#define DDR_CTL_CAS_LATENCY 0x5 +#define DDR_TIMING_tWR 0x5 +#define DDR_TIMING_tRFC 0x16 +#define DDR_TIMING_tRP 0x5 +#define DDR_TIMING_tRCD 0x5 + +#define DDR_TIMING_VAL \ + (ODT_EN << 27) | \ + (OUTPUT_DRIVER_IMPEDANCE << 25) | \ + (ODT_CONTROL << 23) | \ + (ADDITIVE_LATENCY << 20) | \ + (DDR_CTL_CAS_LATENCY << 17) | \ + (DDR_TIMING_tWR << 14) | \ + (DDR_TIMING_tRFC << 8) | \ + (DDR_TIMING_tRP << 4) | \ + (DDR_TIMING_tRCD) + +static void config_pci_northbridge_f0(void) +{ + // Memory clock phase selecton register. + pci_write_config8(NB, 0x66, MEM_CLK_PHASE_R << 4 | MEM_CLK_PHASE_W); + // DDRII memory timing register. + pci_write_config32(NB, 0x74, DDR_TIMING_VAL); +} + +// memory bank register control: +// bit : +// 2 - 0 : CAT : Column Address Type : 0 0 1 = 9bit +// : 0 1 0 = 10bit +// 4 - 3 : BN : Bank Number : 1 0 = 4 bank +// : 1 1 = 8 bank +// 7 - 5 : RAT : Row Address Type : 0 1 0 = 13bit +// : 0 1 1 = 14bit +// : 1 0 0 : 15bit +// 11 - 8 : SS : Size : 0 1 0 0 = 32M +// : 0 1 0 1 = 64M +// : 0 1 1 0 = 128M +// : 0 1 1 1 = 256M +// : 1 0 0 0 = 512M +// 13 : C1M : CS#[1] Mask : 0 = actived +// : 1 = mask + +#define COL_9BIT 1 +#define COL_10BIT 2 +#define BANK_2BIT 2 +#define BANK_3BIT 3 +#define ROW_13BIT 2 +#define ROW_14BIT 3 +#define ROW_15BIT 4 +#define SIZE_32M 4 +#define SIZE_64M 5 +#define SIZE_128M 6 +#define SIZE_256M 7 +#define SIZE_512M 8 +#define C1M_ACTIVE 0 +#define C1M_MASK 1 + +static u16 get_mask(u16 bit_width, u16 bit_offset) +{ + u16 mask = (((1 << bit_width) - 1) << bit_offset); + return mask; +} + +static u16 set_bitfield(u16 val, u16 bits, u16 bit_width, u16 bit_offset) +{ + u16 mask = get_mask(bit_width, bit_offset); + val = (val & ~mask) | (bits << bit_offset); + return val; +} + +static u16 get_bitfield(u16 val, u16 bit_width, u16 bit_offset) +{ + u16 mask = get_mask(bit_width, bit_offset); + return (val & mask) >> bit_offset; +} + +static u16 set_mem_bank_reg_cat(u16 reg, u16 cat) +{ + return set_bitfield(reg, cat, 3, 0); +} + +static u16 get_mem_bank_reg_cat(u16 reg) +{ + return get_bitfield(reg, 3, 0); +} + +static u16 set_mem_bank_reg_bn(u16 reg, u16 bn) +{ + return set_bitfield(reg, bn, 2, 3); +} + +static u16 get_mem_bank_reg_bn(u16 reg) +{ + return get_bitfield(reg, 2, 3); +} + +static u16 set_mem_bank_reg_rat(u16 reg, u16 rat) +{ + return set_bitfield(reg, rat, 3, 5); +} + +static u16 get_mem_bank_reg_rat(u16 reg) +{ + return get_bitfield(reg, 3, 5); +} + +static u16 set_mem_bank_reg_ss(u16 reg, u16 ss) +{ + return set_bitfield(reg, ss, 4, 8); +} + +static u16 get_mem_bank_reg_ss(u16 reg) +{ + return get_bitfield(reg, 4, 8); +} + +static u16 set_mem_bank_reg_c1m(u16 reg, u16 c1m) +{ + return set_bitfield(reg, c1m, 1, 13); +} + +static u16 get_mem_bank_reg_c1m(u16 reg) +{ + return get_bitfield(reg, 1, 13); +} + +static u16 auto_set_mem_bank_reg_ss(u16 reg) +{ + u8 ss = 0; + // If reg is the minimum DRAM size, + // SS is also the minimum size 32M. + // If size in reg is bigger, SS is also bigger. + ss += get_mem_bank_reg_cat(reg) - 1; + ss += get_mem_bank_reg_bn(reg) - 2; + ss += get_mem_bank_reg_rat(reg) - 2; + ss += (1 - get_mem_bank_reg_c1m(reg)); + ss += SIZE_32M; + return set_mem_bank_reg_ss(reg, ss); +} + +static u16 get_mem_bank_reg(u16 cat, u16 bn, u16 rat, u16 c1m) +{ + u16 reg; + reg = 0; + reg = set_mem_bank_reg_cat(reg, cat); + reg = set_mem_bank_reg_bn(reg, bn); + reg = set_mem_bank_reg_rat(reg, rat); + reg = set_mem_bank_reg_c1m(reg, c1m); + reg = auto_set_mem_bank_reg_ss(reg); + return reg; +} + +static u8 check_address_bit(int addr_bit) +{ + u16 dummy; + *(volatile u16 *)(0) = 0; + dummy = *(volatile u16 *)(0); // read push write + *(volatile u16 *)(1 << addr_bit) = 0x5a5a; + dummy = *(volatile u16 *)(1 << addr_bit); // read push write + if ((*(volatile u16 *)(0)) != 0) + return 0; // address bit wrapped. + return 1; // address bit not wrapped. +} + +static u8 check_dram_side(int addr_bit) +{ + *(volatile u16 *)(1 << addr_bit) = 0x5a5a; + *(volatile u16 *)(0) = 0; + if ((*(volatile u16 *)(1 << addr_bit)) != 0x5a5a) + return 0; // DRAM only one side. + return 1; // two sides. +} + +static void detect_dram_size_failed(void) +{ + post_code(0x77); + while (1) ; +} + +static void detect_dram_cs(u16 br, u8 base_addr_bit) +{ + br = set_mem_bank_reg_c1m(br, C1M_ACTIVE); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_dram_side(base_addr_bit + 1)) { + base_addr_bit += 1; + return; + } + + br = set_mem_bank_reg_c1m(br, C1M_MASK); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + // no need to check CS = 0. +} + +static void detect_dram_row(u16 br, u8 base_addr_bit, u8 row_from_14) +{ + if (row_from_14) + goto row_14; + + br = set_mem_bank_reg_rat(br, ROW_15BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 15)) { + base_addr_bit += 15; + detect_dram_cs(br, base_addr_bit); + return; + } + +row_14: + br = set_mem_bank_reg_rat(br, ROW_14BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 14)) { + base_addr_bit += 14; + detect_dram_cs(br, base_addr_bit); + return; + } + + br = set_mem_bank_reg_rat(br, ROW_13BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 13)) { + base_addr_bit += 13; + detect_dram_cs(br, base_addr_bit); + return; + } + // row test error. + detect_dram_size_failed(); +} + +static void detect_dram_bank(u16 br, u8 base_addr_bit, u8 row_from_14) +{ + br = set_mem_bank_reg_bn(br, BANK_3BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 3)) { + base_addr_bit += 3; + detect_dram_row(br, base_addr_bit, row_from_14); + return; + } + + br = set_mem_bank_reg_bn(br, BANK_2BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 2)) { + base_addr_bit += 2; + detect_dram_row(br, base_addr_bit, row_from_14); + return; + } + // bank test error. + detect_dram_size_failed(); +} + +static void detect_dram_col(u16 br, u8 base_addr_bit, u8 row_from_14) +{ + br = set_mem_bank_reg_cat(br, COL_10BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 10)) { + base_addr_bit += 10; + detect_dram_bank(br, base_addr_bit, row_from_14); + return; + } + + br = set_mem_bank_reg_cat(br, COL_9BIT); + br = auto_set_mem_bank_reg_ss(br); + pci_write_config16(NB, NB_REG_MBR, br); + if (check_address_bit(base_addr_bit + 9)) { + base_addr_bit += 9; + detect_dram_bank(br, base_addr_bit, row_from_14); + return; + } + // col test error. + detect_dram_size_failed(); +} + +static void detect_dram_size(void) +{ + u16 br; + u8 base_addr_bit = 0; + br = get_mem_bank_reg(COL_10BIT, BANK_2BIT, ROW_13BIT, C1M_MASK); + // check DX CPU model. + if (pci_read_config8(NB, 0x8) == 0x01 && pci_read_config8(SB, 0x8) == 0x01) { + // for oldest DX CPU, DRAM max row is from 14, not 15. + detect_dram_col(br, base_addr_bit, 1); + } else { + // for newer DX CPU, DRAM max row is from 15. + detect_dram_col(br, base_addr_bit, 0); + } +} + +// DDRIII memory bank register control: +// bit : +// 2 - 0 : DRAMC_COLSIZE : DDRIII Column Address Type : 0 0 0 = 10bit +// : 0 0 1 = 11bit +// 7 - 5 : DRAMC_ROWSIZE : DDRIII Row Address Type : 0 0 0 = 13bit +// : 0 0 1 = 14bit +// : 0 1 0 = 15bit +// : 0 1 1 = 16bit +// 11 - 8 : DRAM_SIZE : DDRIII Size : 0 1 0 1 = 64M +// : 0 1 1 0 = 128M +// : 0 1 1 1 = 256M +// : 1 0 0 0 = 512M +// : 1 0 0 1 = 1GB +// : 1 0 1 0 = 2GB +// 13 : DRAMC_CSMASK : DDRIII CS#[1] Mask : 1 = Mask CS1 enable + +#define DDR3_COL_10BIT 0 +#define DDR3_COL_11BIT 1 +#define DDR3_ROW_13BIT 0 +#define DDR3_ROW_14BIT 1 +#define DDR3_ROW_15BIT 2 +#define DDR3_ROW_16BIT 3 +#define DDR3_SIZE_64M 5 +#define DDR3_SIZE_128M 6 +#define DDR3_SIZE_256M 7 +#define DDR3_SIZE_512M 8 +#define DDR3_SIZE_1GB 9 +#define DDR3_SIZE_2GB 10 +#define DDR3_C1M_ACTIVE 0 +#define DDR3_C1M_MASK 1 + +static u16 set_ddr3_mem_reg_col(u16 reg, u16 col) +{ + return set_bitfield(reg, col, 3, 0); +} + +static u16 get_ddr3_mem_reg_col(u16 reg) +{ + return get_bitfield(reg, 3, 0); +} + +static u16 set_ddr3_mem_reg_row(u16 reg, u16 row) +{ + return set_bitfield(reg, row, 3, 5); +} + +static u16 get_ddr3_mem_reg_row(u16 reg) +{ + return get_bitfield(reg, 3, 5); +} + +static u16 set_ddr3_mem_reg_size(u16 reg, u16 size) +{ + return set_bitfield(reg, size, 4, 8); +} + +static u16 get_ddr3_mem_reg_size(u16 reg) +{ + return get_bitfield(reg, 4, 8); +} + +static u16 set_ddr3_mem_reg_c1m(u16 reg, u16 c1m) +{ + return set_bitfield(reg, c1m, 1, 13); +} + +static u16 get_ddr3_mem_reg_c1m(u16 reg) +{ + return get_bitfield(reg, 1, 13); +} + +static u16 auto_set_ddr3_mem_reg_size(u16 reg) +{ + u8 ss = 0; + // If reg is the minimum DRAM size, + // SS is also the minimum size 128M. + // If size in reg is bigger, SS is also bigger. + ss += get_ddr3_mem_reg_col(reg); + ss += get_ddr3_mem_reg_row(reg); + ss += (1 - get_ddr3_mem_reg_c1m(reg)); + ss += DDR3_SIZE_128M; + return set_ddr3_mem_reg_size(reg, ss); +} + +static u16 get_ddr3_mem_reg(u16 col, u16 row, u16 c1m) +{ + u16 reg; + reg = 0; + reg = set_ddr3_mem_reg_col(reg, col); + reg = set_ddr3_mem_reg_row(reg, row); + reg = set_ddr3_mem_reg_c1m(reg, c1m); + reg = auto_set_ddr3_mem_reg_size(reg); + return reg; +} + +static void ddr3_phy_reset(void) +{ + // PCI N/B reg FAh bit 6 = RST_DRAM_PHY. + pci_write_config8(NB1, 0xfa, 0x40); + while ((pci_read_config8(NB1, 0xfa) & 0x40) == 0x40) { + } + // reload mode. + pci_write_config32(NB, 0x74, pci_read_config32(NB, 0x74)); +} + +static void detect_ddr3_dram_cs(u16 reg, u8 base_addr_bit) +{ + reg = set_ddr3_mem_reg_c1m(reg, DDR3_C1M_ACTIVE); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_dram_side(base_addr_bit + 1)) { + base_addr_bit += 1; + return; + } + + reg = set_ddr3_mem_reg_c1m(reg, DDR3_C1M_MASK); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + // no need to check CS = 0. + // Need to reset DDR3 PHY. + ddr3_phy_reset(); +} + +static void detect_ddr3_dram_row(u16 reg, u8 base_addr_bit) +{ + reg = set_ddr3_mem_reg_row(reg, DDR3_ROW_16BIT); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_address_bit(base_addr_bit + 16)) { + base_addr_bit += 16; + detect_ddr3_dram_cs(reg, base_addr_bit); + return; + } + + reg = set_ddr3_mem_reg_row(reg, DDR3_ROW_15BIT); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_address_bit(base_addr_bit + 15)) { + base_addr_bit += 15; + detect_ddr3_dram_cs(reg, base_addr_bit); + return; + } + + reg = set_ddr3_mem_reg_row(reg, DDR3_ROW_14BIT); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_address_bit(base_addr_bit + 14)) { + base_addr_bit += 14; + detect_ddr3_dram_cs(reg, base_addr_bit); + return; + } + + reg = set_ddr3_mem_reg_row(reg, DDR3_ROW_13BIT); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_address_bit(base_addr_bit + 13)) { + base_addr_bit += 13; + detect_ddr3_dram_cs(reg, base_addr_bit); + return; + } + // row test error. + detect_dram_size_failed(); +} + +static void detect_ddr3_dram_bank(u16 reg, u8 base_addr_bit) +{ + /* DDR3 is always 3 bank bits */ + base_addr_bit += 3; + detect_ddr3_dram_row(reg, base_addr_bit); +} + +static void detect_ddr3_dram_col(u16 reg, u8 base_addr_bit) +{ + reg = set_ddr3_mem_reg_col(reg, DDR3_COL_11BIT); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_address_bit(base_addr_bit + 11)) { + base_addr_bit += 11; + detect_ddr3_dram_bank(reg, base_addr_bit); + return; + } + + reg = set_ddr3_mem_reg_col(reg, DDR3_COL_10BIT); + reg = auto_set_ddr3_mem_reg_size(reg); + pci_write_config16(NB, NB_REG_MBR, reg); + if (check_address_bit(base_addr_bit + 10)) { + base_addr_bit += 10; + detect_ddr3_dram_bank(reg, base_addr_bit); + return; + } + // col test error. + detect_dram_size_failed(); +} + +static void detect_ddr3_dram_size(void) +{ + u16 reg; + u8 base_addr_bit = 0; + reg = get_ddr3_mem_reg(DDR3_COL_10BIT, DDR3_ROW_13BIT, DDR3_C1M_MASK); + detect_ddr3_dram_col(reg, base_addr_bit); +} diff --git a/src/northbridge/dmp/vortex86ex/xgi_oprom.c b/src/northbridge/dmp/vortex86ex/xgi_oprom.c new file mode 100644 index 0000000..dc814c2 --- /dev/null +++ b/src/northbridge/dmp/vortex86ex/xgi_oprom.c @@ -0,0 +1,35 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +/******************************************************************** + * Change the vendor / device IDs to match the XGI Z9S VBIOS header. + ********************************************************************/ +#include <device/pci.h> +u32 map_oprom_vendev(u32 vendev) +{ + u32 new_vendev = vendev; + + switch (vendev) { + case 0x18ca0020: + new_vendev = 0x18ca0021; + break; + } + + return new_vendev; +} diff --git a/src/southbridge/Kconfig b/src/southbridge/Kconfig index 31b7cc6..84b5f8d 100644 --- a/src/southbridge/Kconfig +++ b/src/southbridge/Kconfig @@ -1,5 +1,6 @@ source src/southbridge/amd/Kconfig source src/southbridge/broadcom/Kconfig +source src/southbridge/dmp/Kconfig source src/southbridge/intel/Kconfig source src/southbridge/nvidia/Kconfig source src/southbridge/rdc/Kconfig diff --git a/src/southbridge/Makefile.inc b/src/southbridge/Makefile.inc index 130d459..106752b 100644 --- a/src/southbridge/Makefile.inc +++ b/src/southbridge/Makefile.inc @@ -1,5 +1,6 @@ subdirs-y += amd subdirs-y += broadcom +subdirs-y += dmp subdirs-y += intel subdirs-y += nvidia subdirs-y += rdc diff --git a/src/southbridge/dmp/Kconfig b/src/southbridge/dmp/Kconfig new file mode 100644 index 0000000..1c5b8c7 --- /dev/null +++ b/src/southbridge/dmp/Kconfig @@ -0,0 +1,20 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +source src/southbridge/dmp/vortex86ex/Kconfig diff --git a/src/southbridge/dmp/Makefile.inc b/src/southbridge/dmp/Makefile.inc new file mode 100644 index 0000000..a94e935 --- /dev/null +++ b/src/southbridge/dmp/Makefile.inc @@ -0,0 +1,20 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +subdirs-$(CONFIG_SOUTHBRIDGE_DMP_VORTEX86EX) += vortex86ex diff --git a/src/southbridge/dmp/vortex86ex/Kconfig b/src/southbridge/dmp/vortex86ex/Kconfig new file mode 100644 index 0000000..1f73da4 --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/Kconfig @@ -0,0 +1,27 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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 +## + +config SOUTHBRIDGE_DMP_VORTEX86EX + bool + select HAVE_HARD_RESET + +config BOOTBLOCK_SOUTHBRIDGE_INIT + string + default "southbridge/dmp/vortex86ex/bootblock.c" + depends on SOUTHBRIDGE_DMP_VORTEX86EX diff --git a/src/southbridge/dmp/vortex86ex/Makefile.inc b/src/southbridge/dmp/vortex86ex/Makefile.inc new file mode 100644 index 0000000..6d2a921 --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/Makefile.inc @@ -0,0 +1,22 @@ +## +## This file is part of the coreboot project. +## +## Copyright (C) 2013 DMP Electronics Inc. +## +## 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-y += southbridge.c +ramstage-y += hard_reset.c +ramstage-y += ide_sd_sata.c diff --git a/src/southbridge/dmp/vortex86ex/bootblock.c b/src/southbridge/dmp/vortex86ex/bootblock.c new file mode 100644 index 0000000..165d22e --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/bootblock.c @@ -0,0 +1,68 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <arch/io.h> +#include "drivers/pc80/i8254.c" +#include "southbridge.h" + +/************************************************************************/ +/* south bridge configuration space access routines */ +/************************************************************************/ + +uint8_t pci_read_sb_config8(unsigned where) +{ + return (pci_io_read_config8(SB, where)); +} + +void pci_write_sb_config8(unsigned where, uint8_t value) +{ + pci_io_write_config8(SB, where, value); +} + +uint16_t pci_read_sb_config16(unsigned where) +{ + return (pci_io_read_config16(SB, where)); +} + +void pci_write_sb_config16(unsigned where, uint16_t value) +{ + pci_io_write_config16(SB, where, value); +} + +uint32_t pci_read_sb_config32(unsigned where) +{ + return (pci_io_read_config32(SB, where)); +} + +void pci_write_sb_config32(unsigned where, uint32_t value) +{ + pci_io_write_config32(SB, where, value); +} + +/************************************************************************/ +/* bootblock south bridge initialize */ +/************************************************************************/ + +void bootblock_southbridge_init(void) +{ + /* enable fast ga20 */ + pci_write_sb_config8(SB_REG_LPCCR, pci_read_sb_config8(SB_REG_LPCCR) | 0x16); + outb(inb(SYSTEM_CTL_PORT) | 0x02, SYSTEM_CTL_PORT); + setup_i8254(); +} diff --git a/src/southbridge/dmp/vortex86ex/chip.h b/src/southbridge/dmp/vortex86ex/chip.h new file mode 100644 index 0000000..09312f9 --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/chip.h @@ -0,0 +1,38 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 _SOUTHBRIDGE_DMP_VORTEX86EX +#define _SOUTHBRIDGE_DMP_VORTEX86EX + +struct southbridge_dmp_vortex86ex_config { + /* PCI function enables */ + /* i.e. so that pci scan bus will find them. */ + /* I am putting in IDE as an example but obviously this needs + * to be more complete! + */ + int enable_ide; + /* enables of functions of devices */ + int enable_usb; + int enable_native_ide; + int enable_com_ports; + int enable_keyboard; + int enable_nvram; +}; + +#endif /* _SOUTHBRIDGE_DMP_VORTEX86EX */ diff --git a/src/southbridge/dmp/vortex86ex/hard_reset.c b/src/southbridge/dmp/vortex86ex/hard_reset.c new file mode 100644 index 0000000..5d216ab --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/hard_reset.c @@ -0,0 +1,25 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <arch/io.h> +#include <reset.h> + +void hard_reset(void) +{ +} diff --git a/src/southbridge/dmp/vortex86ex/ide_sd_sata.c b/src/southbridge/dmp/vortex86ex/ide_sd_sata.c new file mode 100644 index 0000000..8214549 --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/ide_sd_sata.c @@ -0,0 +1,171 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <delay.h> +#include <stdlib.h> +#include <string.h> +#include <arch/io.h> + +#include <console/console.h> +#include <device/device.h> +#include <device/pci.h> +#include <device/pci_ids.h> +#include <device/pci_ops.h> + +/* Vortex86EX IDE to SD/STAT controller need to enable ATA decoder and + * setup timing. */ + +/* + * Primary ATA Timing Register (PATR) - Offset 40-41h + * Secondary ATA Timing Register (PATR) - Offset 42-43h + * + * Bit R/W Default Description + * 15 R/W 0h ATA Decode Enable. Decode the I/O addressing ranges assigned to this controller. + * 1: Enabled. + * 0: Disabled. + * 14 R/W 0b Device 1 ATA Timing Register Enable + * 1: Enable the device 1 ATA timing. + * 0: Disable the device 1 ATA timing + * 13-12 R/W 0h IORDY Sample Mode. Sets the setup time before IORDY are sampled. + * 00: PIO-0 + * 10: PIO-2, SW-2 + * 10: PIO-3, PIO-4, MW-1, MW-2 + * 11: Reserved + * 11-10 RO 0h Reserved + * 9-8 R/W 0h Recovery Mode. Sets the hold time after IORDY are sampled. + * 00: PIO-0, PIO-2, SW-2 + * 10: PIO-3, MW-1 + * 10: Reserved + * 11: PIO-4, MW-2 + * 7 R/W 0b DMA Timing Enable Only Select 1 + * 1: Enable the device timings for DMA operation for device 1 + * 0: Disable the device timings for DMA operation for device 1 + * 6 R/W 0b ATA/ATAPI Device Indicator 1 + * 1: Indicate presence od an ATA device + * 0: Indicate presence od an ATAPI device + * 5 R/W 0b IORDY Sample Point Enabled Select 1 + * 1: Enable IORDY sample for PIO transfers for device 1 + * 0: Disable IORDY sample for PIO transfers for device 1 + * 4 R/W 0b Fast Drive Timing Select 1 + * 1: Enable faster than PIO-0 timing modes for device 1 + * 0: Disable faster than PIO-0 timing modes for device 1 + * 3 R/W 0b DMA Timing Enable Only Select 0 + * 1: Enable the device timings for DMA operation for device 0 + * 0: Disable the device timings for DMA operation for device 0 + * 2 R/W 0b ATA/ATAPI Device Indicator 0 + * 1: Indicate presence od an ATA device + * 0: Indicate presence od an ATAPI device + * 1 R/W 0b IORDY Sample Point Enabled Select 0 + * 1: Enable IORDY sample for PIO transfers for device 0 + * 0: Disable IORDY sample for PIO transfers for device 0 + * 0 R/W 0b Fast Drive Timing Select 0 + * 1: Enable faster than PIO-0 timing modes for device 0 + * 0: Disable faster than PIO-0 timing modes for device 0 + * */ + +static void init_ide_ata_timing(struct device *dev) +{ + u16 ata_timing_pri, ata_timing_sec; + u32 ata_timing_reg32; + /* Primary channel is SD. */ +#if CONFIG_IDE1_ENABLE + ata_timing_pri = 0x8000; +#else + ata_timing_pri = 0x0000; // Disable this channel. +#endif + /* Secondary channel is SATA. */ +#if CONFIG_IDE2_ENABLE + ata_timing_sec = 0xa30f; // This setting value works well. +#else + ata_timing_sec = 0x0000; // Disable this channel. +#endif + ata_timing_reg32 = (ata_timing_sec << 16) | ata_timing_pri; + pci_write_config32(dev, 0x40, ata_timing_reg32); +#if CONFIG_IDE_NATIVE_MODE + /* Set both IDE channels to native mode. */ + u8 prog_if; + prog_if = pci_read_config8(dev, 0x09); + prog_if |= 5; + pci_write_config8(dev, 0x09, prog_if); +#endif + /* MMC function enable. */ + u32 sd_ctrl_reg; + sd_ctrl_reg = pci_read_config32(dev, 0x94); + sd_ctrl_reg |= 0x0200; + pci_write_config32(dev, 0x94, sd_ctrl_reg); + printk(BIOS_INFO, "Vortex86EX IDE controller ATA TIMING reg = %08x\n", ata_timing_reg32); +} + +static void setup_std_ide_compatible(struct device *dev) +{ +#if CONFIG_IDE_STANDARD_COMPATIBLE + // Misc Control Register (MCR) Offset 90h + // bit 0 = Vendor ID Access, bit 1 = Device ID Access. + u8 mcr; + u16 vendor = (u16) (CONFIG_IDE_COMPATIBLE_SELECTION >> 16); + u16 device = (u16) (CONFIG_IDE_COMPATIBLE_SELECTION & 0xffff); + // unlock vendor/device ID access bits. + mcr = pci_read_config8(dev, 0x90); + pci_write_config8(dev, 0x90, mcr | 3); + pci_write_config16(dev, 0x00, vendor); + pci_write_config16(dev, 0x02, device); + // restore lock bits. + pci_write_config8(dev, 0x90, mcr); +#endif +} + +static void vortex_ide_init(struct device *dev) +{ + if (dev->device == 0x1010) { + // This is SX/old DX IDE controller. + // Set IOCFG bit 15/13 : IDE Decoder Enable for Primary/Secondary channel. + u16 iocfg = 0xa000; + pci_write_config16(dev, 0x40, iocfg); + } else if (dev->device == 0x1011 || dev->device == 0x1012) { + // This is new DX/MX/MX+/DX2 IDE controller. + init_ide_ata_timing(dev); + setup_std_ide_compatible(dev); + } +} + +static struct device_operations vortex_ide_ops = { + .read_resources = pci_dev_read_resources, + .set_resources = pci_dev_set_resources, + .enable_resources = pci_dev_enable_resources, + .init = vortex_ide_init, + .scan_bus = 0, +}; + +static const struct pci_driver vortex_ide_driver_1010 __pci_driver = { + .ops = &vortex_ide_ops, + .vendor = PCI_VENDOR_ID_RDC, + .device = 0x1010, +}; + +static const struct pci_driver vortex_ide_driver_1011 __pci_driver = { + .ops = &vortex_ide_ops, + .vendor = PCI_VENDOR_ID_RDC, + .device = 0x1011, +}; + +static const struct pci_driver vortex_ide_driver_1012 __pci_driver = { + .ops = &vortex_ide_ops, + .vendor = PCI_VENDOR_ID_RDC, + .device = 0x1012, +}; diff --git a/src/southbridge/dmp/vortex86ex/southbridge.c b/src/southbridge/dmp/vortex86ex/southbridge.c new file mode 100644 index 0000000..bc8252c --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/southbridge.c @@ -0,0 +1,563 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 + */ + +#include <console/console.h> +#include <device/device.h> +#include <device/pci.h> +#include <device/pci_ops.h> +#include <device/pci_ids.h> +#include <pc80/mc146818rtc.h> +#include <string.h> +#include "arch/io.h" +#include "chip.h" +#include "southbridge.h" + +/* IRQ number to S/B PCI Interrupt routing table reg(0x58/0xb4) mapping table. */ +static const unsigned char irq_to_sb_int_routing[16] = { + 0x0, 0x0, 0x0, 0x2, // IRQ0-2 is unmappable, IRQ3 = 2. + 0x4, 0x5, 0x7, 0x6, // IRQ4-7 = 4, 5, 7, 6. + 0x0, 0x1, 0x3, 0x9, // IRQ8 is unmappable, IRQ9-11 = 1, 3, 9. + 0xb, 0x0, 0xd, 0xf // IRQ12 = b, IRQ13 is unmappable, IRQ14-15 = d, f. +}; + +/* S/B PCI Interrupt routing table reg(0x58) field bit shift. */ +#define EHCIH_IRQ_SHIFT 28 +#define OHCII_IRQ_SHIFT 24 +#define MAC_IRQ_SHIFT 16 +#define RT3_IRQ_SHIFT 12 +#define RT2_IRQ_SHIFT 8 +#define RT1_IRQ_SHIFT 4 +#define RT0_IRQ_SHIFT 0 + +/* S/B Extend PCI Interrupt routing table reg(0xb4) field bit shift. */ +#define USBD_IRQ_SHIFT 16 +#define SIDE_IRQ_SHIFT 12 +#define PIDE_IRQ_SHIFT 8 +#define EHCI2_IRQ_SHIFT 4 +#define OHCI2_IRQ_SHIFT 0 + +/* in-chip PCI device IRQs(0 for disabled). */ +#define EHCII_IRQ 5 +#define OHCII_IRQ 5 +#define MAC_IRQ 6 + +#define USBD_IRQ 0 +#define PIDE_IRQ 5 +#define EHCI2_IRQ 5 +#define OHCI2_IRQ 5 + +/* RT0-3 IRQs. */ +#define RT3_IRQ 3 +#define RT2_IRQ 4 +#define RT1_IRQ 5 +#define RT0_IRQ 6 + +/* IDE legacy mode IRQs. */ +#define IDE1_LEGACY_IRQ 14 +#define IDE2_LEGACY_IRQ 15 + +/* Internal parallel port */ +#define LPT_INT_C 0 +#define LPT_INT_ACK_SET 0 +#define LPT_UE 1 +#define LPT_PDMAS 0 +#define LPT_DREQS 0 + +static u8 get_pci_dev_func(device_t dev) +{ + return PCI_FUNC(dev->path.pci.devfn); +} + +static void verify_dmp_keyboard_error(void) +{ + post_code(0x82); + die("Internal keyboard firmware verify error!\n"); +} + +static void upload_dmp_keyboard_firmware(struct device *dev) +{ + u32 reg_sb_c0; + u32 fwptr; + + // enable firmware uploading function by set bit 10. + post_code(0x06); + reg_sb_c0 = pci_read_config32(dev, 0xc0); + pci_write_config32(dev, 0xc0, reg_sb_c0 | 0x400); + + outw(0, 0x62); // reset upload address to 0. + // upload 4096 bytes from 0xFFFFE000. + outsb(0x66, (u8 *) 0xffffe000, 4096); + // upload 4096 bytes from 0xFFFFC000. + outsb(0x66, (u8 *) 0xffffc000, 4096); + + outw(0, 0x62); // reset upload address to 0. + // verify 4096 bytes from 0xFFFFE000. + for (fwptr = 0xffffe000; fwptr < 0xfffff000; fwptr++) { + if (inb(0x66) != *(u8 *) fwptr) { + verify_dmp_keyboard_error(); + } + } + // verify 4096 bytes from 0xFFFFC000. + for (fwptr = 0xffffc000; fwptr < 0xffffd000; fwptr++) { + if (inb(0x66) != *(u8 *) fwptr) { + verify_dmp_keyboard_error(); + } + } + + // disable firmware uploading. + pci_write_config32(dev, 0xc0, reg_sb_c0 & ~0x400L); + // wait keyboard controller ready by checking status port bit 2. + post_code(0x07); + while ((inb(0x64) & 0x4) == 0) { + } + post_code(0x08); +} + +static void pci_routing_fixup(struct device *dev) +{ + const unsigned slot[3] = { 0 }; + const unsigned char slot_irqs[1][4] = { + {RT0_IRQ, RT1_IRQ, RT2_IRQ, RT3_IRQ}, + }; + const int slot_num = 1; + int i; + u32 sb_int_routing = 0; + u32 sb_ext_int_routing = 0; + + /* assign PCI-e bridge (bus#0, dev#1, fn#0) IRQ to RT0. */ + pci_assign_irqs(0, 1, slot_irqs[0]); + + /* RT0 is enabled. */ + sb_int_routing |= irq_to_sb_int_routing[RT0_IRQ] << RT0_IRQ_SHIFT; + + /* assign PCI slot IRQs. */ + for (i = 0; i < slot_num; i++) { + pci_assign_irqs(1, slot[i], slot_irqs[i]); + } + + /* Read PCI slot IRQs to see if RT1-3 is used, and enables it */ + for (i = 0; i < slot_num; i++) { + unsigned int funct; + device_t pdev; + u8 irq; + + /* Each slot may contain up to eight functions. */ + for (funct = 0; funct < 8; funct++) { + pdev = dev_find_slot(1, (slot[i] << 3) + funct); + if (!pdev) + continue; + irq = pci_read_config8(pdev, PCI_INTERRUPT_LINE); + if (irq == RT1_IRQ) { + sb_int_routing |= irq_to_sb_int_routing[RT1_IRQ] << RT1_IRQ_SHIFT; + } else if (irq == RT2_IRQ) { + sb_int_routing |= irq_to_sb_int_routing[RT2_IRQ] << RT2_IRQ_SHIFT; + } else if (irq == RT3_IRQ) { + sb_int_routing |= irq_to_sb_int_routing[RT3_IRQ] << RT3_IRQ_SHIFT; + } + } + } + + /* Setup S/B PCI Interrupt routing table reg(0x58). */ + sb_int_routing |= irq_to_sb_int_routing[EHCII_IRQ] << EHCIH_IRQ_SHIFT; + sb_int_routing |= irq_to_sb_int_routing[OHCII_IRQ] << OHCII_IRQ_SHIFT; + sb_int_routing |= irq_to_sb_int_routing[MAC_IRQ] << MAC_IRQ_SHIFT; + pci_write_config32(dev, SB_REG_PIRQ_X_ROUT, sb_int_routing); + + /* Setup S/B PCI Extend Interrupt routing table reg(0xb4). */ + sb_ext_int_routing |= irq_to_sb_int_routing[USBD_IRQ] << USBD_IRQ_SHIFT; +#if CONFIG_IDE_NATIVE_MODE + /* IDE in native mode, only uses one IRQ. */ + sb_ext_int_routing |= irq_to_sb_int_routing[0] << SIDE_IRQ_SHIFT; + sb_ext_int_routing |= irq_to_sb_int_routing[PIDE_IRQ] << PIDE_IRQ_SHIFT; +#else + /* IDE in legacy mode, use IRQ 14, 15. */ + sb_ext_int_routing |= irq_to_sb_int_routing[IDE2_LEGACY_IRQ] << SIDE_IRQ_SHIFT; + sb_ext_int_routing |= irq_to_sb_int_routing[IDE1_LEGACY_IRQ] << PIDE_IRQ_SHIFT; +#endif + sb_ext_int_routing |= irq_to_sb_int_routing[EHCI2_IRQ] << EHCI2_IRQ_SHIFT; + sb_ext_int_routing |= irq_to_sb_int_routing[OHCI2_IRQ] << OHCI2_IRQ_SHIFT; + pci_write_config32(dev, SB_REG_PIRQ_X_ROUT2, sb_ext_int_routing); + + /* Assign in-chip PCI device IRQs. */ + if (MAC_IRQ) { + unsigned char irqs[4] = { MAC_IRQ, 0, 0, 0 }; + pci_assign_irqs(0, 0x8, irqs); + } + if (OHCII_IRQ && EHCII_IRQ) { + unsigned char irqs[4] = { OHCII_IRQ, EHCII_IRQ, 0, 0 }; + pci_assign_irqs(0, 0xa, irqs); + } + if (OHCI2_IRQ && EHCI2_IRQ) { + unsigned char irqs[4] = { OHCI2_IRQ, EHCI2_IRQ, 0, 0 }; + pci_assign_irqs(0, 0xb, irqs); + } + if (CONFIG_IDE_NATIVE_MODE && PIDE_IRQ) { + /* IDE in native mode, setup PCI IRQ. */ + unsigned char irqs[4] = { PIDE_IRQ, 0, 0, 0 }; + pci_assign_irqs(0, 0xc, irqs); + } + if (USBD_IRQ) { + unsigned char irqs[4] = { USBD_IRQ, 0, 0, 0 }; + pci_assign_irqs(0, 0xf, irqs); + } +} + +static void vortex_sb_init(struct device *dev) +{ + u32 lpt_reg = 0; + +#if CONFIG_LPT_ENABLE + int ppmod = 0; +#if CONFIG_LPT_MODE_BPP + ppmod = 0; +#elif CONFIG_LPT_MODE_EPP_19_AND_SPP + ppmod = 1; +#elif CONFIG_LPT_MODE_ECP + ppmod = 2; +#elif CONFIG_LPT_MODE_ECP_AND_EPP_19 + ppmod = 3; +#elif CONFIG_LPT_MODE_SPP + ppmod = 4; +#elif CONFIG_LPT_MODE_EPP_17_AND_SPP + ppmod = 5; +#elif CONFIG_LPT_MODE_ECP_AND_EPP_17 + ppmod = 7; +#else +#error CONFIG_LPT_MODE error. +#endif + + /* Setup internal parallel port */ + lpt_reg |= (LPT_INT_C << 28); + lpt_reg |= (LPT_INT_ACK_SET << 27); + lpt_reg |= (ppmod << 24); + lpt_reg |= (LPT_UE << 23); + lpt_reg |= (LPT_PDMAS << 22); + lpt_reg |= (LPT_DREQS << 20); + lpt_reg |= (irq_to_sb_int_routing[CONFIG_LPT_IRQ] << 16); + lpt_reg |= (CONFIG_LPT_IO << 0); +#endif // CONFIG_LPT_ENABLE + pci_write_config32(dev, SB_REG_IPPCR, lpt_reg); +} + +#define SETUP_GPIO_ADDR(n) \ + u32 cfg##n = (CONFIG_GPIO_P##n##_DIR_ADDR << 16) | (CONFIG_GPIO_P##n##_DATA_ADDR);\ + outl(cfg##n, base + 4 + (n * 4));\ + gpio_enable_mask |= (1 << n); + +#define INIT_GPIO(n) \ + outb(CONFIG_GPIO_P##n##_INIT_DIR, CONFIG_GPIO_P##n##_DIR_ADDR);\ + outb(CONFIG_GPIO_P##n##_INIT_DATA, CONFIG_GPIO_P##n##_DATA_ADDR); + +static void ex_sb_gpio_init(struct device *dev) +{ + const int base = 0xb00; + u32 gpio_enable_mask = 0; + /* S/B register 63h - 62h : GPIO Port Config IO Base Address */ + pci_write_config16(dev, 0x62, base | 1); + /* Set GPIO port 0~9 base address. + * Config Base + 04h, 08h, 0ch... : GPIO port 0~9 data/dir decode addr. + * Bit 31-16 : DBA, GPIO direction base address. + * Bit 15-0 : DPBA, GPIO data port base address. + * */ +#if CONFIG_GPIO_P0_ENABLE + SETUP_GPIO_ADDR(0) +#endif +#if CONFIG_GPIO_P1_ENABLE + SETUP_GPIO_ADDR(1) +#endif +#if CONFIG_GPIO_P2_ENABLE + SETUP_GPIO_ADDR(2) +#endif +#if CONFIG_GPIO_P3_ENABLE + SETUP_GPIO_ADDR(3) +#endif +#if CONFIG_GPIO_P4_ENABLE + SETUP_GPIO_ADDR(4) +#endif +#if CONFIG_GPIO_P5_ENABLE + SETUP_GPIO_ADDR(5) +#endif +#if CONFIG_GPIO_P6_ENABLE + SETUP_GPIO_ADDR(6) +#endif +#if CONFIG_GPIO_P7_ENABLE + SETUP_GPIO_ADDR(7) +#endif +#if CONFIG_GPIO_P8_ENABLE + SETUP_GPIO_ADDR(8) +#endif +#if CONFIG_GPIO_P9_ENABLE + SETUP_GPIO_ADDR(9) +#endif + /* Enable GPIO port 0~9. */ + outl(gpio_enable_mask, base); + /* Set GPIO port 0-9 initial dir and data. */ +#if CONFIG_GPIO_P0_ENABLE + INIT_GPIO(0) +#endif +#if CONFIG_GPIO_P1_ENABLE + INIT_GPIO(1) +#endif +#if CONFIG_GPIO_P2_ENABLE + INIT_GPIO(2) +#endif +#if CONFIG_GPIO_P3_ENABLE + INIT_GPIO(3) +#endif +#if CONFIG_GPIO_P4_ENABLE + INIT_GPIO(4) +#endif +#if CONFIG_GPIO_P5_ENABLE + INIT_GPIO(5) +#endif +#if CONFIG_GPIO_P6_ENABLE + INIT_GPIO(6) +#endif +#if CONFIG_GPIO_P7_ENABLE + INIT_GPIO(7) +#endif +#if CONFIG_GPIO_P8_ENABLE + INIT_GPIO(8) +#endif +#if CONFIG_GPIO_P9_ENABLE + INIT_GPIO(9) +#endif + /* Disable GPIO Port Config IO Base Address. */ + pci_write_config16(dev, 0x62, 0x0); +} + +static u32 make_uart_config(u16 base, u8 irq) +{ + u8 mapped_irq = irq_to_sb_int_routing[irq]; + u32 cfg = 0; + cfg |= 1 << 23; // UE = enabled. + cfg |= (mapped_irq << 16); // UIRT. + cfg |= base; // UIOA. + return cfg; +} + +#define SETUP_UART(n) \ + uart_cfg = make_uart_config(CONFIG_UART##n##_IO, CONFIG_UART##n##_IRQ);\ + outl(uart_cfg, base + (n - 1) * 4);\ + uart8250_init(CONFIG_UART##n##_IO, 115200 / CONFIG_UART##n##_BAUD); + +static void ex_sb_uart_init(struct device *dev) +{ + const int base = 0xc00; + u32 uart_cfg = 0; + /* S/B register 61h - 60h : UART Config IO Base Address */ + pci_write_config16(dev, 0x60, 0xc01); + /* setup UART */ +#if CONFIG_UART1_ENABLE + SETUP_UART(1) +#endif +#if CONFIG_UART2_ENABLE + SETUP_UART(2) +#endif +#if CONFIG_UART3_ENABLE + SETUP_UART(3) +#endif +#if CONFIG_UART4_ENABLE + SETUP_UART(4) +#endif +#if CONFIG_UART5_ENABLE + SETUP_UART(5) +#endif +#if CONFIG_UART6_ENABLE + SETUP_UART(6) +#endif +#if CONFIG_UART7_ENABLE + SETUP_UART(7) +#endif +#if CONFIG_UART8_ENABLE + SETUP_UART(8) +#endif +#if CONFIG_UART9_ENABLE + SETUP_UART(9) +#endif +#if CONFIG_UART10_ENABLE + SETUP_UART(10) +#endif + /* Keep UART Config I/O base address */ + //pci_write_config16(SB, 0x60, 0x0); +} + +static int get_rtc_update_in_progress(void) +{ + if (cmos_read(RTC_REG_A) & RTC_UIP) + return 1; + return 0; +} + +static void unsafe_read_cmos_rtc(u8 rtc[7]) +{ + rtc[0] = cmos_read(RTC_CLK_ALTCENTURY); + rtc[1] = cmos_read(RTC_CLK_YEAR); + rtc[2] = cmos_read(RTC_CLK_MONTH); + rtc[3] = cmos_read(RTC_CLK_DAYOFMONTH); + rtc[4] = cmos_read(RTC_CLK_HOUR); + rtc[5] = cmos_read(RTC_CLK_MINUTE); + rtc[6] = cmos_read(RTC_CLK_SECOND); +} + +static void read_cmos_rtc(u8 rtc[7]) +{ + /* Read RTC twice and check update-in-progress flag, to make + * sure RTC is correct */ + u8 rtc_old[7], rtc_new[7]; + while (get_rtc_update_in_progress()) ; + unsafe_read_cmos_rtc(rtc_new); + do { + memcpy(rtc_old, rtc_new, 7); + while (get_rtc_update_in_progress()) ; + unsafe_read_cmos_rtc(rtc_new); + } while (memcmp(rtc_new, rtc_old, 7) != 0); +} + +static u8 convert_bcd_to_bin(u8 bcd) +{ + u8 h, l; + h = bcd >> 4; + l = bcd & 0xf; + if (h > 9 || l > 9) + return 255; + return h * 10 + l; +} + +static void fix_cmos_rtc_time(void) +{ + /* Read RTC data. */ + u8 rtc[7]; + read_cmos_rtc(rtc); + + /* Convert RTC from BCD format to binary. */ + u8 bin_rtc[7]; + int i; + for (i = 0; i < 8; i++) { + bin_rtc[i] = convert_bcd_to_bin(rtc[i]); + } + + /* If RTC date is invalid, fix it. */ + if (bin_rtc[0] > 99 || bin_rtc[1] > 99 || bin_rtc[2] > 12 || bin_rtc[3] > 31) { + /* Set PC compatible timing mode. */ + cmos_write(0x26, RTC_REG_A); + cmos_write(0x02, RTC_REG_B); + /* Now setup a default date 2008/08/08 08:08:08. */ + cmos_write(0x8, RTC_CLK_SECOND); + cmos_write(0x8, RTC_CLK_MINUTE); + cmos_write(0x8, RTC_CLK_HOUR); + cmos_write(0x6, RTC_CLK_DAYOFWEEK); /* Friday */ + cmos_write(0x8, RTC_CLK_DAYOFMONTH); + cmos_write(0x8, RTC_CLK_MONTH); + cmos_write(0x8, RTC_CLK_YEAR); + cmos_write(0x20, RTC_CLK_ALTCENTURY); + } +} + +static void vortex86_sb_set_io_resv(device_t dev, u32 io_resv_size) +{ + struct resource *res; + res = new_resource(dev, 1); + res->base = 0x0UL; + res->size = io_resv_size; + res->limit = 0xffffUL; + res->flags = IORESOURCE_IO | IORESOURCE_ASSIGNED | IORESOURCE_FIXED; +} + +static void vortex86_sb_set_spi_flash_size(device_t dev, u32 flash_size) +{ + /* SPI flash is in topmost of 4G memory space */ + struct resource *res; + res = new_resource(dev, 2); + res->base = 0x100000000LL - flash_size; + res->size = flash_size; + res->limit = 0xffffffffUL; + res->flags = IORESOURCE_MEM | IORESOURCE_FIXED | IORESOURCE_STORED | IORESOURCE_ASSIGNED; +} + +static void vortex86_sb_read_resources(device_t dev) +{ + u32 flash_size = 8 * 1024 * 1024; + + pci_dev_read_resources(dev); + + if (dev->device == 0x6011) { + /* It is EX CPU southbridge */ + if (get_pci_dev_func(dev) != 0) { + /* only for function 0, skip function 1 */ + return; + } + /* default SPI flash ROM is 64MB */ + flash_size = 64 * 1024 * 1024; + } + + /* Reserve space for I/O */ + vortex86_sb_set_io_resv(dev, 0x1000UL); + + /* Reserve space for flash */ + vortex86_sb_set_spi_flash_size(dev, flash_size); +} + +static void southbridge_init(struct device *dev) +{ + if (dev->device == 0x6011) { + /* It is EX CPU southbridge */ + if (get_pci_dev_func(dev) != 0) { + /* only for function 0, skip function 1 */ + return; + } + } + upload_dmp_keyboard_firmware(dev); + vortex_sb_init(dev); + if (dev->device == 0x6011) { + ex_sb_gpio_init(dev); + ex_sb_uart_init(dev); + } + pci_routing_fixup(dev); + + fix_cmos_rtc_time(); + rtc_init(0); +} + +static struct device_operations vortex_sb_ops = { + .read_resources = vortex86_sb_read_resources, + .set_resources = pci_dev_set_resources, + .enable_resources = pci_dev_enable_resources, + .init = &southbridge_init, + .scan_bus = scan_static_bus, + .enable = 0, + .ops_pci = 0, +}; + +static const struct pci_driver pci_driver_6031 __pci_driver = { + .ops = &vortex_sb_ops, + .vendor = PCI_VENDOR_ID_RDC, + .device = 0x6031, /* DX CPU S/B ID */ +}; + +static const struct pci_driver pci_driver_6011 __pci_driver = { + .ops = &vortex_sb_ops, + .vendor = PCI_VENDOR_ID_RDC, + .device = 0x6011, /* EX CPU S/B ID */ +}; + +struct chip_operations southbridge_dmp_vortex86ex_ops = { + CHIP_NAME("DMP Vortex86EX Southbridge") + .enable_dev = 0 +}; diff --git a/src/southbridge/dmp/vortex86ex/southbridge.h b/src/southbridge/dmp/vortex86ex/southbridge.h new file mode 100644 index 0000000..0d95407 --- /dev/null +++ b/src/southbridge/dmp/vortex86ex/southbridge.h @@ -0,0 +1,89 @@ +/* + * This file is part of the coreboot project. + * + * Copyright (C) 2013 DMP Electronics Inc. + * + * 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 SOUTHBRIDGE_DMP_VORTEX86_H +#define SOUTHBRIDGE_DMP_VORTEX86_H + +#define SB PCI_DEV(0, 7, 0) +#define SB_REG_VID 0x00 +#define SB_REG_DID 0x02 +#define SB_REG_CMD 0x04 +#define SB_REG_STS 0x06 +#define SB_REG_RID 0x08 +#define SB_REG_PI 0x09 +#define SB_REG_HDR 0x0E +#define SB_REG_SVID 0x2C +#define SB_REG_SID 0x2E +#define SB_REG_BSR 0x40 +#define SB_REG_LPCCR 0x41 +#define SB_REG_FRCSCR 0x42 +#define SB_REG_WTC 0x44 +#define SB_REG_GPIO_CNT 0x48 +#define SB_REG_GPIO_DAT 0x4C +#define SB_REG_SERIRQ_CTRL 0x50 +#define SB_REG_LPC_CNT 0x51 +#define SB_REG_COMP_DEC 0x52 +#define SB_REG_INTUART_CTL 0x53 +#define SB_REG_INTUART_IO 0x54 +#define SB_REG_PIRQ_X_ROUT 0x58 +#define SB_REG_BSCR 0x5C +#define SB_REG_GPIO_DPBA_1 0x60 +#define SB_REG_GPIO_DPBA_2 0x62 +#define SB_REG_GPIO_DPBA_3 0x64 +#define SB_REG_GPIO_DPBA_4 0x66 +#define SB_REG_GPIO_DPBA_5 0x68 +#define SB_REG_GPIO_DBA 0x6A +#define SB_REG_GPIO_CNTL 0x6C +#define SB_REG_RSR 0x6D +#define SB_REG_RCR 0x6E +#define SB_REG_LADR 0x70 +#define SB_REG_LADBAR1 0x74 +#define SB_REG_LADBAM1 0x78 +#define SB_REG_LADBAR2 0x7C +#define SB_REG_LADBAM2 0x80 +#define SB_REG_CS_BASE2 0x88 +#define SB_REG_CS_BASE_MASK2 0x8C +#define SB_REG_CS_BASE0 0x90 +#define SB_REG_CS_BASE_MASK0 0x94 +#define SB_REG_CS_BASE1 0x98 +#define SB_REG_CS_BASE_MASK1 0x9C +#define SB_REG_INTUART2_IO 0xA0 +#define SB_REG_INTUART3_IO 0xA4 +#define SB_REG_INTUART4_IO 0xA8 +#define SB_REG_INTUART9_IO 0xAC +#define SB_REG_IPPCR 0xB0 +#define SB_REG_PIRQ_X_ROUT2 0xB4 +#define SB_REG_OCDCR 0xBC +#define SB_REG_IPFCR 0xC0 +#define SB_REG_FRWPR 0xC4 +#define SB_REG_IPFCR2 0xC8 +#define SB_REG_IPFCR3 0xCC +#define SB_REG_STRAP 0xCE +#define SB_REG_PM_BASE 0xF8 +#define SB_REG_ACPI_CNT 0xFC +#define SB_REG_SMI_BASE 0x4C + +#define WDT1_REG_CNTL 0x68 +#define WDT1_REG_SIGN_SEL 0x69 +#define WDT1_REG_COUNTER0 0x6A +#define WDT1_REG_COUNTER1 0x6B +#define WDT1_REG_COUNTER2 0x6C +#define SYSTEM_CTL_PORT 0x92 + +#endif /* SOUTHBRIDGE_DMP_VORTEX86_H */