From 9ca8dbcc65cfc63d6f5ef3312a33184e1d726e00 Mon Sep 17 00:00:00 2001 From: Yunhong Jiang Date: Tue, 4 Aug 2015 12:17:53 -0700 Subject: Add the rt linux 4.1.3-rt3 as base Import the rt linux 4.1.3-rt3 as OPNFV kvm base. It's from git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git linux-4.1.y-rt and the base is: commit 0917f823c59692d751951bf5ea699a2d1e2f26a2 Author: Sebastian Andrzej Siewior Date: Sat Jul 25 12:13:34 2015 +0200 Prepare v4.1.3-rt3 Signed-off-by: Sebastian Andrzej Siewior We lose all the git history this way and it's not good. We should apply another opnfv project repo in future. Change-Id: I87543d81c9df70d99c5001fbdf646b202c19f423 Signed-off-by: Yunhong Jiang --- kernel/arch/arm/mach-shmobile/Kconfig | 213 +++ kernel/arch/arm/mach-shmobile/Makefile | 65 + kernel/arch/arm/mach-shmobile/Makefile.boot | 15 + .../arch/arm/mach-shmobile/board-armadillo800eva.c | 1365 ++++++++++++++++++++ .../arch/arm/mach-shmobile/board-bockw-reference.c | 86 ++ kernel/arch/arm/mach-shmobile/board-bockw.c | 737 +++++++++++ kernel/arch/arm/mach-shmobile/board-kzm9g.c | 916 +++++++++++++ .../arm/mach-shmobile/board-marzen-reference.c | 56 + kernel/arch/arm/mach-shmobile/board-marzen.c | 347 +++++ kernel/arch/arm/mach-shmobile/clock-r8a7740.c | 675 ++++++++++ kernel/arch/arm/mach-shmobile/clock-r8a7778.c | 342 +++++ kernel/arch/arm/mach-shmobile/clock-r8a7779.c | 271 ++++ kernel/arch/arm/mach-shmobile/clock-sh73a0.c | 752 +++++++++++ kernel/arch/arm/mach-shmobile/clock.c | 47 + kernel/arch/arm/mach-shmobile/clock.h | 42 + kernel/arch/arm/mach-shmobile/common.h | 48 + kernel/arch/arm/mach-shmobile/console.c | 27 + kernel/arch/arm/mach-shmobile/cpufreq.c | 17 + kernel/arch/arm/mach-shmobile/dma-register.h | 84 ++ kernel/arch/arm/mach-shmobile/headsmp-scu.S | 46 + kernel/arch/arm/mach-shmobile/headsmp.S | 98 ++ .../arm/mach-shmobile/include/mach/head-kzm9g.txt | 410 ++++++ kernel/arch/arm/mach-shmobile/include/mach/irqs.h | 10 + kernel/arch/arm/mach-shmobile/include/mach/zboot.h | 19 + .../arm/mach-shmobile/include/mach/zboot_macros.h | 108 ++ kernel/arch/arm/mach-shmobile/intc-sh73a0.c | 337 +++++ kernel/arch/arm/mach-shmobile/intc.h | 295 +++++ kernel/arch/arm/mach-shmobile/irqs.h | 15 + kernel/arch/arm/mach-shmobile/platsmp-apmu.c | 238 ++++ kernel/arch/arm/mach-shmobile/platsmp-apmu.h | 32 + kernel/arch/arm/mach-shmobile/platsmp-scu.c | 97 ++ kernel/arch/arm/mach-shmobile/platsmp.c | 38 + kernel/arch/arm/mach-shmobile/pm-r8a7740.c | 129 ++ kernel/arch/arm/mach-shmobile/pm-r8a7779.c | 143 ++ kernel/arch/arm/mach-shmobile/pm-rcar-gen2.c | 115 ++ kernel/arch/arm/mach-shmobile/pm-rcar.c | 137 ++ kernel/arch/arm/mach-shmobile/pm-rcar.h | 15 + kernel/arch/arm/mach-shmobile/pm-rmobile.c | 434 +++++++ kernel/arch/arm/mach-shmobile/pm-rmobile.h | 64 + kernel/arch/arm/mach-shmobile/pm-sh73a0.c | 32 + kernel/arch/arm/mach-shmobile/r8a7740.h | 58 + kernel/arch/arm/mach-shmobile/r8a7778.h | 78 ++ kernel/arch/arm/mach-shmobile/r8a7779.h | 35 + kernel/arch/arm/mach-shmobile/r8a7790.h | 6 + kernel/arch/arm/mach-shmobile/r8a7791.h | 6 + kernel/arch/arm/mach-shmobile/rcar-gen2.h | 10 + .../arm/mach-shmobile/regulator-quirk-rcar-gen2.c | 147 +++ kernel/arch/arm/mach-shmobile/setup-emev2.c | 53 + kernel/arch/arm/mach-shmobile/setup-r7s72100.c | 32 + kernel/arch/arm/mach-shmobile/setup-r8a73a4.c | 32 + kernel/arch/arm/mach-shmobile/setup-r8a7740.c | 859 ++++++++++++ kernel/arch/arm/mach-shmobile/setup-r8a7778.c | 633 +++++++++ kernel/arch/arm/mach-shmobile/setup-r8a7779.c | 771 +++++++++++ kernel/arch/arm/mach-shmobile/setup-r8a7790.c | 37 + kernel/arch/arm/mach-shmobile/setup-r8a7791.c | 38 + kernel/arch/arm/mach-shmobile/setup-r8a7794.c | 33 + kernel/arch/arm/mach-shmobile/setup-rcar-gen2.c | 203 +++ kernel/arch/arm/mach-shmobile/setup-sh73a0.c | 810 ++++++++++++ kernel/arch/arm/mach-shmobile/sh-gpio.h | 29 + kernel/arch/arm/mach-shmobile/sh73a0.h | 89 ++ kernel/arch/arm/mach-shmobile/smp-emev2.c | 55 + kernel/arch/arm/mach-shmobile/smp-r8a7779.c | 136 ++ kernel/arch/arm/mach-shmobile/smp-r8a7790.c | 71 + kernel/arch/arm/mach-shmobile/smp-r8a7791.c | 65 + kernel/arch/arm/mach-shmobile/smp-sh73a0.c | 75 ++ kernel/arch/arm/mach-shmobile/suspend.c | 48 + kernel/arch/arm/mach-shmobile/timer.c | 112 ++ 67 files changed, 13438 insertions(+) create mode 100644 kernel/arch/arm/mach-shmobile/Kconfig create mode 100644 kernel/arch/arm/mach-shmobile/Makefile create mode 100644 kernel/arch/arm/mach-shmobile/Makefile.boot create mode 100644 kernel/arch/arm/mach-shmobile/board-armadillo800eva.c create mode 100644 kernel/arch/arm/mach-shmobile/board-bockw-reference.c create mode 100644 kernel/arch/arm/mach-shmobile/board-bockw.c create mode 100644 kernel/arch/arm/mach-shmobile/board-kzm9g.c create mode 100644 kernel/arch/arm/mach-shmobile/board-marzen-reference.c create mode 100644 kernel/arch/arm/mach-shmobile/board-marzen.c create mode 100644 kernel/arch/arm/mach-shmobile/clock-r8a7740.c create mode 100644 kernel/arch/arm/mach-shmobile/clock-r8a7778.c create mode 100644 kernel/arch/arm/mach-shmobile/clock-r8a7779.c create mode 100644 kernel/arch/arm/mach-shmobile/clock-sh73a0.c create mode 100644 kernel/arch/arm/mach-shmobile/clock.c create mode 100644 kernel/arch/arm/mach-shmobile/clock.h create mode 100644 kernel/arch/arm/mach-shmobile/common.h create mode 100644 kernel/arch/arm/mach-shmobile/console.c create mode 100644 kernel/arch/arm/mach-shmobile/cpufreq.c create mode 100644 kernel/arch/arm/mach-shmobile/dma-register.h create mode 100644 kernel/arch/arm/mach-shmobile/headsmp-scu.S create mode 100644 kernel/arch/arm/mach-shmobile/headsmp.S create mode 100644 kernel/arch/arm/mach-shmobile/include/mach/head-kzm9g.txt create mode 100644 kernel/arch/arm/mach-shmobile/include/mach/irqs.h create mode 100644 kernel/arch/arm/mach-shmobile/include/mach/zboot.h create mode 100644 kernel/arch/arm/mach-shmobile/include/mach/zboot_macros.h create mode 100644 kernel/arch/arm/mach-shmobile/intc-sh73a0.c create mode 100644 kernel/arch/arm/mach-shmobile/intc.h create mode 100644 kernel/arch/arm/mach-shmobile/irqs.h create mode 100644 kernel/arch/arm/mach-shmobile/platsmp-apmu.c create mode 100644 kernel/arch/arm/mach-shmobile/platsmp-apmu.h create mode 100644 kernel/arch/arm/mach-shmobile/platsmp-scu.c create mode 100644 kernel/arch/arm/mach-shmobile/platsmp.c create mode 100644 kernel/arch/arm/mach-shmobile/pm-r8a7740.c create mode 100644 kernel/arch/arm/mach-shmobile/pm-r8a7779.c create mode 100644 kernel/arch/arm/mach-shmobile/pm-rcar-gen2.c create mode 100644 kernel/arch/arm/mach-shmobile/pm-rcar.c create mode 100644 kernel/arch/arm/mach-shmobile/pm-rcar.h create mode 100644 kernel/arch/arm/mach-shmobile/pm-rmobile.c create mode 100644 kernel/arch/arm/mach-shmobile/pm-rmobile.h create mode 100644 kernel/arch/arm/mach-shmobile/pm-sh73a0.c create mode 100644 kernel/arch/arm/mach-shmobile/r8a7740.h create mode 100644 kernel/arch/arm/mach-shmobile/r8a7778.h create mode 100644 kernel/arch/arm/mach-shmobile/r8a7779.h create mode 100644 kernel/arch/arm/mach-shmobile/r8a7790.h create mode 100644 kernel/arch/arm/mach-shmobile/r8a7791.h create mode 100644 kernel/arch/arm/mach-shmobile/rcar-gen2.h create mode 100644 kernel/arch/arm/mach-shmobile/regulator-quirk-rcar-gen2.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-emev2.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r7s72100.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a73a4.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a7740.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a7778.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a7779.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a7790.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a7791.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-r8a7794.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-rcar-gen2.c create mode 100644 kernel/arch/arm/mach-shmobile/setup-sh73a0.c create mode 100644 kernel/arch/arm/mach-shmobile/sh-gpio.h create mode 100644 kernel/arch/arm/mach-shmobile/sh73a0.h create mode 100644 kernel/arch/arm/mach-shmobile/smp-emev2.c create mode 100644 kernel/arch/arm/mach-shmobile/smp-r8a7779.c create mode 100644 kernel/arch/arm/mach-shmobile/smp-r8a7790.c create mode 100644 kernel/arch/arm/mach-shmobile/smp-r8a7791.c create mode 100644 kernel/arch/arm/mach-shmobile/smp-sh73a0.c create mode 100644 kernel/arch/arm/mach-shmobile/suspend.c create mode 100644 kernel/arch/arm/mach-shmobile/timer.c (limited to 'kernel/arch/arm/mach-shmobile') diff --git a/kernel/arch/arm/mach-shmobile/Kconfig b/kernel/arch/arm/mach-shmobile/Kconfig new file mode 100644 index 000000000..0fb484221 --- /dev/null +++ b/kernel/arch/arm/mach-shmobile/Kconfig @@ -0,0 +1,213 @@ +config ARCH_SHMOBILE + bool + select ZONE_DMA if ARM_LPAE + +config PM_RCAR + bool + +config PM_RMOBILE + bool + select PM_GENERIC_DOMAINS + +config ARCH_RCAR_GEN1 + bool + select PM_RCAR if PM || SMP + select RENESAS_INTC_IRQPIN + select SYS_SUPPORTS_SH_TMU + +config ARCH_RCAR_GEN2 + bool + select PM_RCAR if PM || SMP + select RENESAS_IRQC + select SYS_SUPPORTS_SH_CMT + select PCI_DOMAINS if PCI + +config ARCH_RMOBILE + bool + select PM_RMOBILE if PM + select SYS_SUPPORTS_SH_CMT + select SYS_SUPPORTS_SH_TMU + +menuconfig ARCH_SHMOBILE_MULTI + bool "Renesas ARM SoCs" if ARCH_MULTI_V7 + depends on MMU + select ARCH_SHMOBILE + select HAVE_ARM_SCU if SMP + select HAVE_ARM_TWD if SMP + select ARM_GIC + select ARCH_DMA_ADDR_T_64BIT if ARM_LPAE + select NO_IOPORT_MAP + select PINCTRL + select ARCH_REQUIRE_GPIOLIB + +if ARCH_SHMOBILE_MULTI + +#comment "Renesas ARM SoCs System Type" + +config ARCH_EMEV2 + bool "Emma Mobile EV2" + select SYS_SUPPORTS_EM_STI + +config ARCH_R7S72100 + bool "RZ/A1H (R7S72100)" + select SYS_SUPPORTS_SH_MTU2 + +config ARCH_R8A73A4 + bool "R-Mobile APE6 (R8A73A40)" + select ARCH_RMOBILE + select RENESAS_IRQC + +config ARCH_R8A7740 + bool "R-Mobile A1 (R8A77400)" + select ARCH_RMOBILE + select RENESAS_INTC_IRQPIN + +config ARCH_R8A7778 + bool "R-Car M1A (R8A77781)" + select ARCH_RCAR_GEN1 + +config ARCH_R8A7779 + bool "R-Car H1 (R8A77790)" + select ARCH_RCAR_GEN1 + +config ARCH_R8A7790 + bool "R-Car H2 (R8A77900)" + select ARCH_RCAR_GEN2 + select I2C + +config ARCH_R8A7791 + bool "R-Car M2-W (R8A77910)" + select ARCH_RCAR_GEN2 + select I2C + +config ARCH_R8A7794 + bool "R-Car E2 (R8A77940)" + select ARCH_RCAR_GEN2 + +config ARCH_SH73A0 + bool "SH-Mobile AG5 (R8A73A00)" + select ARCH_RMOBILE + select RENESAS_INTC_IRQPIN + +comment "Renesas ARM SoCs Board Type" + +config MACH_MARZEN + bool "MARZEN board" + depends on ARCH_R8A7779 + select REGULATOR_FIXED_VOLTAGE if REGULATOR + +comment "Renesas ARM SoCs System Configuration" +endif + +if ARCH_SHMOBILE_LEGACY + +comment "Renesas ARM SoCs System Type" + +config ARCH_SH73A0 + bool "SH-Mobile AG5 (R8A73A00)" + select ARCH_RMOBILE + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_GIC + select I2C + select SH_INTC + select RENESAS_INTC_IRQPIN + +config ARCH_R8A7740 + bool "R-Mobile A1 (R8A77400)" + select ARCH_RMOBILE + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_GIC + select RENESAS_INTC_IRQPIN + +config ARCH_R8A7778 + bool "R-Car M1A (R8A77781)" + select ARCH_RCAR_GEN1 + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_GIC + +config ARCH_R8A7779 + bool "R-Car H1 (R8A77790)" + select ARCH_RCAR_GEN1 + select ARCH_WANT_OPTIONAL_GPIOLIB + select ARM_GIC + +comment "Renesas ARM SoCs Board Type" + +config MACH_ARMADILLO800EVA + bool "Armadillo-800 EVA board" + depends on ARCH_R8A7740 + select ARCH_REQUIRE_GPIOLIB + select REGULATOR_FIXED_VOLTAGE if REGULATOR + select SMSC_PHY if SH_ETH + select SND_SOC_WM8978 if SND_SIMPLE_CARD + select USE_OF + +config MACH_BOCKW + bool "BOCK-W platform" + depends on ARCH_R8A7778 + select ARCH_REQUIRE_GPIOLIB + select REGULATOR_FIXED_VOLTAGE if REGULATOR + select SND_SOC_AK4554 if SND_SIMPLE_CARD + select SND_SOC_AK4642 if SND_SIMPLE_CARD + select USE_OF + +config MACH_BOCKW_REFERENCE + bool "BOCK-W - Reference Device Tree Implementation" + depends on ARCH_R8A7778 + select ARCH_REQUIRE_GPIOLIB + select REGULATOR_FIXED_VOLTAGE if REGULATOR + select USE_OF + ---help--- + Use reference implementation of BockW board support + which makes use of device tree at the expense + of not supporting a number of devices. + + This is intended to aid developers + +config MACH_MARZEN + bool "MARZEN board" + depends on ARCH_R8A7779 + select ARCH_REQUIRE_GPIOLIB + select REGULATOR_FIXED_VOLTAGE if REGULATOR + select USE_OF + +config MACH_KZM9G + bool "KZM-A9-GT board" + depends on ARCH_SH73A0 + select ARCH_REQUIRE_GPIOLIB + select REGULATOR_FIXED_VOLTAGE if REGULATOR + select SND_SOC_AK4642 if SND_SIMPLE_CARD + select USE_OF + +comment "Renesas ARM SoCs System Configuration" + +config CPU_HAS_INTEVT + bool + default y + +config SH_CLK_CPG + bool + +source "drivers/sh/Kconfig" + +endif + +if ARCH_SHMOBILE + +menu "Timer and clock configuration" + +config SHMOBILE_TIMER_HZ + int "Kernel HZ (jiffies per second)" + range 32 1024 + default "128" + help + Allows the configuration of the timer frequency. It is customary + to have the timer interrupt run at 1000 Hz or 100 Hz, but in the + case of low timer frequencies other values may be more suitable. + Renesas ARM SoC systems using a 32768 Hz RCLK for clock events may + want to select a HZ value such as 128 that can evenly divide RCLK. + A HZ value that does not divide evenly may cause timer drift. + +endmenu + +endif diff --git a/kernel/arch/arm/mach-shmobile/Makefile b/kernel/arch/arm/mach-shmobile/Makefile new file mode 100644 index 000000000..89e463de4 --- /dev/null +++ b/kernel/arch/arm/mach-shmobile/Makefile @@ -0,0 +1,65 @@ +# +# Makefile for the linux kernel. +# + +# Common objects +obj-y := timer.o console.o + +# CPU objects +obj-$(CONFIG_ARCH_SH73A0) += setup-sh73a0.o pm-sh73a0.o +obj-$(CONFIG_ARCH_R8A73A4) += setup-r8a73a4.o +obj-$(CONFIG_ARCH_R8A7740) += setup-r8a7740.o pm-r8a7740.o +obj-$(CONFIG_ARCH_R8A7778) += setup-r8a7778.o +obj-$(CONFIG_ARCH_R8A7779) += setup-r8a7779.o pm-r8a7779.o +obj-$(CONFIG_ARCH_R8A7790) += setup-r8a7790.o +obj-$(CONFIG_ARCH_R8A7791) += setup-r8a7791.o +obj-$(CONFIG_ARCH_R8A7794) += setup-r8a7794.o +obj-$(CONFIG_ARCH_EMEV2) += setup-emev2.o +obj-$(CONFIG_ARCH_R7S72100) += setup-r7s72100.o + +# Clock objects +ifndef CONFIG_COMMON_CLK +obj-y += clock.o +obj-$(CONFIG_ARCH_SH73A0) += clock-sh73a0.o +obj-$(CONFIG_ARCH_R8A7740) += clock-r8a7740.o +obj-$(CONFIG_ARCH_R8A7778) += clock-r8a7778.o +obj-$(CONFIG_ARCH_R8A7779) += clock-r8a7779.o +endif + +# CPU reset vector handling objects +cpu-y := platsmp.o headsmp.o + +# Shared SoC family objects +obj-$(CONFIG_ARCH_RCAR_GEN2) += setup-rcar-gen2.o platsmp-apmu.o $(cpu-y) +CFLAGS_setup-rcar-gen2.o += -march=armv7-a +obj-$(CONFIG_ARCH_R8A7790) += regulator-quirk-rcar-gen2.o +obj-$(CONFIG_ARCH_R8A7791) += regulator-quirk-rcar-gen2.o + +# SMP objects +smp-y := $(cpu-y) +smp-$(CONFIG_ARCH_SH73A0) += smp-sh73a0.o headsmp-scu.o platsmp-scu.o +smp-$(CONFIG_ARCH_R8A7779) += smp-r8a7779.o headsmp-scu.o platsmp-scu.o +smp-$(CONFIG_ARCH_R8A7790) += smp-r8a7790.o +smp-$(CONFIG_ARCH_R8A7791) += smp-r8a7791.o +smp-$(CONFIG_ARCH_EMEV2) += smp-emev2.o headsmp-scu.o platsmp-scu.o + +# PM objects +obj-$(CONFIG_SUSPEND) += suspend.o +obj-$(CONFIG_CPU_FREQ) += cpufreq.o +obj-$(CONFIG_PM_RCAR) += pm-rcar.o +obj-$(CONFIG_PM_RMOBILE) += pm-rmobile.o +obj-$(CONFIG_ARCH_RCAR_GEN2) += pm-rcar-gen2.o + +# Board objects +ifdef CONFIG_ARCH_SHMOBILE_MULTI +obj-$(CONFIG_MACH_MARZEN) += board-marzen-reference.o +else +obj-$(CONFIG_MACH_BOCKW) += board-bockw.o +obj-$(CONFIG_MACH_BOCKW_REFERENCE) += board-bockw-reference.o +obj-$(CONFIG_MACH_MARZEN) += board-marzen.o +obj-$(CONFIG_MACH_ARMADILLO800EVA) += board-armadillo800eva.o +obj-$(CONFIG_MACH_KZM9G) += board-kzm9g.o intc-sh73a0.o +endif + +# Framework support +obj-$(CONFIG_SMP) += $(smp-y) diff --git a/kernel/arch/arm/mach-shmobile/Makefile.boot b/kernel/arch/arm/mach-shmobile/Makefile.boot new file mode 100644 index 000000000..e1ef19cef --- /dev/null +++ b/kernel/arch/arm/mach-shmobile/Makefile.boot @@ -0,0 +1,15 @@ +# per-board load address for uImage +loadaddr-y := +loadaddr-$(CONFIG_MACH_ARMADILLO800EVA) += 0x40008000 +loadaddr-$(CONFIG_MACH_BOCKW) += 0x60008000 +loadaddr-$(CONFIG_MACH_BOCKW_REFERENCE) += 0x60008000 +loadaddr-$(CONFIG_MACH_KZM9G) += 0x41008000 +loadaddr-$(CONFIG_MACH_MARZEN) += 0x60008000 + +__ZRELADDR := $(sort $(loadaddr-y)) + zreladdr-y += $(__ZRELADDR) + +# Unsupported legacy stuff +# +#params_phys-y (Instead: Pass atags pointer in r2) +#initrd_phys-y (Instead: Use compiled-in initramfs) diff --git a/kernel/arch/arm/mach-shmobile/board-armadillo800eva.c b/kernel/arch/arm/mach-shmobile/board-armadillo800eva.c new file mode 100644 index 000000000..bf37e3c53 --- /dev/null +++ b/kernel/arch/arm/mach-shmobile/board-armadillo800eva.c @@ -0,0 +1,1365 @@ +/* + * armadillo 800 eva board support + * + * Copyright (C) 2012 Renesas Solutions Corp. + * Copyright (C) 2012 Kuninori Morimoto + * + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include