From c06775b2dc433776648db8907a6ddb1b1ca243c7 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Sun, 26 Feb 2012 13:31:42 +0100 Subject: [PATCH] pvops: add patches for dom0 - mostly ACPI S3 --- config-pvops | 912 ++++++++++------- ...s-0001-xen-Add-privcmd-device-driver.patch | 967 ++++++++++++++++++ ...ave-a-ACPI-os-prepare-sleep-instead-.patch | 177 ++++ ...ot-Add-return-values-for-tboot_sleep.patch | 67 ++ ...rovide-registration-for-acpi_suspend.patch | 112 ++ ...nable-ACPI-sleep-via-the-__acpi_os_p.patch | 197 ++++ ...egister-to-the-acpi_suspend_lowlevel.patch | 53 + ...en-Utilize-the-restore_msi_irqs-hook.patch | 81 ++ ...i-Remove-the-call-to-boot_option_idl.patch | 31 + ...pose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch | 216 ++++ ...rnor-for-Xen-hypervisor-frequency-sc.patch | 529 ++++++++++ ...he-x86_msi_ops-to-have-a-restore-MSI.patch | 135 +++ series-pvops.conf | 11 + 13 files changed, 3121 insertions(+), 367 deletions(-) create mode 100644 patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch create mode 100644 patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch create mode 100644 patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch create mode 100644 patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch create mode 100644 patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch create mode 100644 patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch create mode 100644 patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch create mode 100644 patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch create mode 100644 patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch create mode 100644 patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch create mode 100644 patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch diff --git a/config-pvops b/config-pvops index 0cae50b..566f0a8 100644 --- a/config-pvops +++ b/config-pvops @@ -1,6 +1,6 @@ # -# Automatically generated make config: don't edit -# Linux/x86_64 3.0.3 Kernel Configuration +# Automatically generated file; DO NOT EDIT. +# Linux/x86_64 3.2.7 Kernel Configuration # CONFIG_64BIT=y # CONFIG_X86_32 is not set @@ -12,6 +12,7 @@ CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig" CONFIG_GENERIC_CMOS_UPDATE=y CONFIG_CLOCKSOURCE_WATCHDOG=y CONFIG_GENERIC_CLOCKEVENTS=y +CONFIG_ARCH_CLOCKSOURCE_DATA=y CONFIG_GENERIC_CLOCKEVENTS_BROADCAST=y CONFIG_LOCKDEP_SUPPORT=y CONFIG_STACKTRACE_SUPPORT=y @@ -38,7 +39,6 @@ CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y CONFIG_HAVE_SETUP_PER_CPU_AREA=y CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y -CONFIG_HAVE_CPUMASK_OF_CPU_MAP=y CONFIG_ARCH_HIBERNATION_POSSIBLE=y CONFIG_ARCH_SUSPEND_POSSIBLE=y CONFIG_ZONE_DMA32=y @@ -46,6 +46,7 @@ CONFIG_ARCH_POPULATES_NODE_MAP=y CONFIG_AUDIT_ARCH=y CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y +CONFIG_HAVE_INTEL_TXT=y CONFIG_X86_64_SMP=y CONFIG_X86_HT=y CONFIG_ARCH_HWEIGHT_CFLAGS="-fcall-saved-rdi -fcall-saved-rsi -fcall-saved-rdx -fcall-saved-rcx -fcall-saved-r8 -fcall-saved-r9 -fcall-saved-r10 -fcall-saved-r11" @@ -61,7 +62,7 @@ CONFIG_IRQ_WORK=y CONFIG_EXPERIMENTAL=y CONFIG_INIT_ENV_ARG_LIMIT=32 CONFIG_CROSS_COMPILE="" -CONFIG_LOCALVERSION="-12.xenlinux.qubes.x86_64" +CONFIG_LOCALVERSION="-3.pvops.qubes.x86_64" # CONFIG_LOCALVERSION_AUTO is not set CONFIG_HAVE_KERNEL_GZIP=y CONFIG_HAVE_KERNEL_BZIP2=y @@ -100,6 +101,7 @@ CONFIG_HAVE_SPARSE_IRQ=y CONFIG_GENERIC_IRQ_PROBE=y CONFIG_GENERIC_IRQ_SHOW=y CONFIG_GENERIC_PENDING_IRQ=y +CONFIG_GENERIC_IRQ_CHIP=y CONFIG_IRQ_FORCED_THREADING=y CONFIG_SPARSE_IRQ=y @@ -130,6 +132,7 @@ CONFIG_CGROUP_MEM_RES_CTLR=y # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_SCHED=y CONFIG_FAIR_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y CONFIG_RT_GROUP_SCHED=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set @@ -155,7 +158,7 @@ CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EXPERT is not set CONFIG_UID16=y -CONFIG_SYSCTL_SYSCALL=y +# CONFIG_SYSCTL_SYSCALL is not set CONFIG_KALLSYMS=y CONFIG_KALLSYMS_ALL=y CONFIG_HOTPLUG=y @@ -163,6 +166,7 @@ CONFIG_PRINTK=y CONFIG_BUG=y CONFIG_ELF_CORE=y CONFIG_PCSPKR_PLATFORM=y +CONFIG_HAVE_PCSPKR_PLATFORM=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -209,6 +213,7 @@ CONFIG_HAVE_MIXED_BREAKPOINTS_REGS=y CONFIG_HAVE_USER_RETURN_NOTIFIER=y CONFIG_HAVE_PERF_EVENTS_NMI=y CONFIG_HAVE_ARCH_JUMP_LABEL=y +CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y # # GCOV-based kernel profiling @@ -227,6 +232,7 @@ CONFIG_MODULE_SRCVERSION_ALL=y CONFIG_STOP_MACHINE=y CONFIG_BLOCK=y CONFIG_BLK_DEV_BSG=y +CONFIG_BLK_DEV_BSGLIB=y CONFIG_BLK_DEV_INTEGRITY=y # CONFIG_BLK_DEV_THROTTLING is not set CONFIG_BLOCK_COMPAT=y @@ -281,6 +287,7 @@ CONFIG_TICK_ONESHOT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_GENERIC_CLOCKEVENTS_BUILD=y +CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y CONFIG_SMP=y CONFIG_X86_X2APIC=y CONFIG_X86_MPPARSE=y @@ -289,6 +296,7 @@ CONFIG_X86_EXTENDED_PLATFORM=y CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_PARAVIRT_GUEST=y +# CONFIG_PARAVIRT_TIME_ACCOUNTING is not set CONFIG_XEN=y CONFIG_XEN_DOM0=y CONFIG_XEN_PRIVILEGED_GUEST=y @@ -296,7 +304,6 @@ CONFIG_XEN_PVHVM=y CONFIG_XEN_MAX_DOMAIN_MEMORY=128 CONFIG_XEN_SAVE_RESTORE=y # CONFIG_XEN_DEBUG_FS is not set -# CONFIG_XEN_DEBUG is not set # CONFIG_KVM_CLOCK is not set # CONFIG_KVM_GUEST is not set CONFIG_PARAVIRT=y @@ -313,6 +320,7 @@ CONFIG_GENERIC_CPU=y CONFIG_X86_INTERNODE_CACHE_SHIFT=6 CONFIG_X86_CMPXCHG=y CONFIG_CMPXCHG_LOCAL=y +CONFIG_CMPXCHG_DOUBLE=y CONFIG_X86_L1_CACHE_SHIFT=6 CONFIG_X86_XADD=y CONFIG_X86_WP_WORKS_OK=y @@ -329,11 +337,8 @@ CONFIG_HPET_EMULATE_RTC=y CONFIG_DMI=y CONFIG_GART_IOMMU=y # CONFIG_CALGARY_IOMMU is not set -CONFIG_AMD_IOMMU=y -# CONFIG_AMD_IOMMU_STATS is not set CONFIG_SWIOTLB=y CONFIG_IOMMU_HELPER=y -CONFIG_IOMMU_API=y # CONFIG_MAXSMP is not set CONFIG_NR_CPUS=512 # CONFIG_SCHED_SMT is not set @@ -406,6 +411,7 @@ CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=0 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1 CONFIG_X86_PAT=y CONFIG_ARCH_USES_PG_UNCACHED=y +CONFIG_ARCH_RANDOM=y # CONFIG_EFI is not set CONFIG_SECCOMP=y # CONFIG_CC_STACKPROTECTOR is not set @@ -525,8 +531,6 @@ CONFIG_PCI_MMCONFIG=y CONFIG_PCI_XEN=y CONFIG_PCI_DOMAINS=y # CONFIG_PCI_CNB20LE_QUIRK is not set -# CONFIG_DMAR is not set -CONFIG_INTR_REMAP=y CONFIG_PCIEPORTBUS=y CONFIG_HOTPLUG_PCI_PCIE=m CONFIG_PCIEAER=y @@ -541,7 +545,10 @@ CONFIG_PCI_MSI=y CONFIG_PCI_STUB=y CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_HT_IRQ=y +CONFIG_PCI_ATS=y CONFIG_PCI_IOV=y +CONFIG_PCI_PRI=y +CONFIG_PCI_PASID=y CONFIG_PCI_IOAPIC=y CONFIG_PCI_LABEL=y CONFIG_ISA_DMA_API=y @@ -797,6 +804,7 @@ CONFIG_IP_SET_HASH_IPPORTIP=m CONFIG_IP_SET_HASH_IPPORTNET=m CONFIG_IP_SET_HASH_NET=m CONFIG_IP_SET_HASH_NETPORT=m +CONFIG_IP_SET_HASH_NETIFACE=m CONFIG_IP_SET_LIST_SET=m CONFIG_IP_VS=m CONFIG_IP_VS_IPV6=y @@ -991,6 +999,7 @@ CONFIG_LAPB=m CONFIG_WAN_ROUTER=m CONFIG_PHONET=m CONFIG_IEEE802154=m +CONFIG_IEEE802154_6LOWPAN=m CONFIG_NET_SCHED=y # @@ -1090,6 +1099,7 @@ CONFIG_YAM=m CONFIG_CAN=m CONFIG_CAN_RAW=m CONFIG_CAN_BCM=m +CONFIG_CAN_GW=m # # CAN Device Drivers @@ -1103,7 +1113,9 @@ CONFIG_CAN_JANZ_ICAN3=m # CONFIG_PCH_CAN is not set CONFIG_CAN_SJA1000=m CONFIG_CAN_SJA1000_PLATFORM=m +CONFIG_CAN_EMS_PCMCIA=m CONFIG_CAN_EMS_PCI=m +CONFIG_CAN_PEAK_PCI=m CONFIG_CAN_KVASER_PCI=m CONFIG_CAN_PLX_PCI=m # CONFIG_CAN_C_CAN is not set @@ -1245,11 +1257,22 @@ CONFIG_RFKILL_LEDS=y CONFIG_RFKILL_INPUT=y CONFIG_RFKILL_REGULATOR=m CONFIG_NET_9P=m +CONFIG_NET_9P_VIRTIO=m CONFIG_NET_9P_RDMA=m # CONFIG_NET_9P_DEBUG is not set # CONFIG_CAIF is not set CONFIG_CEPH_LIB=m # CONFIG_CEPH_LIB_PRETTYDEBUG is not set +# CONFIG_CEPH_LIB_USE_DNS_RESOLVER is not set +CONFIG_NFC=m +CONFIG_NFC_NCI=m + +# +# Near Field Communication (NFC) devices +# +CONFIG_PN544_NFC=m +CONFIG_NFC_PN533=m +CONFIG_NFC_WILINK=m # # Device Drivers @@ -1269,10 +1292,11 @@ CONFIG_EXTRA_FIRMWARE="" # CONFIG_DEBUG_DRIVER is not set # CONFIG_DEBUG_DEVRES is not set CONFIG_SYS_HYPERVISOR=y +CONFIG_REGMAP=y +CONFIG_REGMAP_I2C=m CONFIG_CONNECTOR=y CONFIG_PROC_EVENTS=y CONFIG_MTD=m -# CONFIG_MTD_DEBUG is not set CONFIG_MTD_TESTS=m CONFIG_MTD_REDBOOT_PARTS=m CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-1 @@ -1380,6 +1404,7 @@ CONFIG_MTD_BLOCK2MTD=m CONFIG_MTD_DOC2000=m CONFIG_MTD_DOC2001=m CONFIG_MTD_DOC2001PLUS=m +CONFIG_MTD_DOCG3=m CONFIG_MTD_DOCPROBE=m CONFIG_MTD_DOCECC=m CONFIG_MTD_DOCPROBE_ADVANCED=y @@ -1477,6 +1502,7 @@ CONFIG_BLK_DEV_DAC960=m CONFIG_BLK_DEV_UMEM=m # CONFIG_BLK_DEV_COW_COMMON is not set CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_LOOP_MIN_COUNT=8 CONFIG_BLK_DEV_CRYPTOLOOP=m CONFIG_BLK_DEV_DRBD=m # CONFIG_DRBD_FAULT_INJECTION is not set @@ -1494,6 +1520,7 @@ CONFIG_CDROM_PKTCDVD_WCACHE=y CONFIG_ATA_OVER_ETH=m CONFIG_XEN_BLKDEV_FRONTEND=m CONFIG_XEN_BLKDEV_BACKEND=m +CONFIG_VIRTIO_BLK=m # CONFIG_BLK_DEV_HD is not set # CONFIG_BLK_DEV_RBD is not set CONFIG_SENSORS_LIS3LV02D=m @@ -1526,6 +1553,7 @@ CONFIG_TI_DAC7512=m # CONFIG_VMWARE_BALLOON is not set CONFIG_BMP085=m CONFIG_PCH_PHUB=m +CONFIG_USB_SWITCH_FSA9480=m CONFIG_C2PORT=m CONFIG_C2PORT_DURAMAR_2150=m @@ -1537,6 +1565,7 @@ CONFIG_EEPROM_AT25=m CONFIG_EEPROM_LEGACY=m CONFIG_EEPROM_MAX6875=m CONFIG_EEPROM_93CX6=m +CONFIG_EEPROM_93XX46=m CONFIG_CB710_CORE=m # CONFIG_CB710_DEBUG is not set CONFIG_CB710_DEBUG_ASSUMPTIONS=y @@ -1549,6 +1578,11 @@ CONFIG_IWMC3200TOP=m # CONFIG_TI_ST=m CONFIG_SENSORS_LIS3_I2C=m + +# +# Altera FPGA firmware download module +# +CONFIG_ALTERA_STAPL=m CONFIG_HAVE_IDE=y # CONFIG_IDE is not set @@ -1624,10 +1658,11 @@ CONFIG_SCSI_AIC94XX=m # CONFIG_AIC94XX_DEBUG is not set CONFIG_SCSI_MVSAS=m # CONFIG_SCSI_MVSAS_DEBUG is not set +CONFIG_SCSI_MVSAS_TASKLET=y +CONFIG_SCSI_MVUMI=m CONFIG_SCSI_DPT_I2O=m CONFIG_SCSI_ADVANSYS=m CONFIG_SCSI_ARCMSR=m -CONFIG_SCSI_ARCMSR_AER=y CONFIG_MEGARAID_NEWGEN=y CONFIG_MEGARAID_MM=m CONFIG_MEGARAID_MAILBOX=m @@ -1803,8 +1838,13 @@ CONFIG_MD_MULTIPATH=m CONFIG_MD_FAULTY=m CONFIG_BLK_DEV_DM=y # CONFIG_DM_DEBUG is not set +CONFIG_DM_BUFIO=m +CONFIG_DM_PERSISTENT_DATA=m CONFIG_DM_CRYPT=m CONFIG_DM_SNAPSHOT=m +CONFIG_DM_THIN_PROVISIONING=m +# CONFIG_DM_DEBUG_BLOCK_STACK_TRACING is not set +# CONFIG_DM_DEBUG_SPACE_MAPS is not set CONFIG_DM_MIRROR=m CONFIG_DM_RAID=m CONFIG_DM_LOG_USERSPACE=m @@ -1846,15 +1886,26 @@ CONFIG_I2O_SCSI=m CONFIG_I2O_PROC=m # CONFIG_MACINTOSH_DRIVERS is not set CONFIG_NETDEVICES=y -CONFIG_IFB=m -CONFIG_DUMMY=m +CONFIG_NET_CORE=y CONFIG_BONDING=m +CONFIG_DUMMY=m +CONFIG_EQUALIZER=m +CONFIG_NET_FC=y +CONFIG_MII=y +CONFIG_IEEE802154_DRIVERS=m +CONFIG_IEEE802154_FAKEHARD=m +CONFIG_IFB=m CONFIG_MACVLAN=m CONFIG_MACVTAP=m -CONFIG_EQUALIZER=m +CONFIG_NETCONSOLE=m +CONFIG_NETCONSOLE_DYNAMIC=y +CONFIG_NETPOLL=y +CONFIG_NETPOLL_TRAP=y +CONFIG_NET_POLL_CONTROLLER=y CONFIG_TUN=m CONFIG_VETH=m -# CONFIG_NET_SB1000 is not set +CONFIG_VIRTIO_NET=m +CONFIG_SUNGEM_PHY=m CONFIG_ARCNET=m CONFIG_ARCNET_1201=m CONFIG_ARCNET_1051=m @@ -1864,40 +1915,90 @@ CONFIG_ARCNET_COM90xx=m CONFIG_ARCNET_COM90xxIO=m CONFIG_ARCNET_RIM_I=m # CONFIG_ARCNET_COM20020 is not set -CONFIG_MII=y -CONFIG_PHYLIB=y +CONFIG_ATM_DRIVERS=y +CONFIG_ATM_DUMMY=m +CONFIG_ATM_TCP=m +CONFIG_ATM_LANAI=m +CONFIG_ATM_ENI=m +# CONFIG_ATM_ENI_DEBUG is not set +CONFIG_ATM_ENI_TUNE_BURST=y +CONFIG_ATM_ENI_BURST_TX_16W=y +CONFIG_ATM_ENI_BURST_TX_8W=y +CONFIG_ATM_ENI_BURST_TX_4W=y +CONFIG_ATM_ENI_BURST_TX_2W=y +CONFIG_ATM_ENI_BURST_RX_16W=y +CONFIG_ATM_ENI_BURST_RX_8W=y +CONFIG_ATM_ENI_BURST_RX_4W=y +CONFIG_ATM_ENI_BURST_RX_2W=y +CONFIG_ATM_FIRESTREAM=m +CONFIG_ATM_ZATM=m +# CONFIG_ATM_ZATM_DEBUG is not set +CONFIG_ATM_NICSTAR=m +# CONFIG_ATM_NICSTAR_USE_SUNI is not set +# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set +CONFIG_ATM_IDT77252=m +# CONFIG_ATM_IDT77252_DEBUG is not set +# CONFIG_ATM_IDT77252_RCV_ALL is not set +CONFIG_ATM_IDT77252_USE_SUNI=y +CONFIG_ATM_AMBASSADOR=m +# CONFIG_ATM_AMBASSADOR_DEBUG is not set +CONFIG_ATM_HORIZON=m +# CONFIG_ATM_HORIZON_DEBUG is not set +CONFIG_ATM_IA=m +# CONFIG_ATM_IA_DEBUG is not set +CONFIG_ATM_FORE200E=m +CONFIG_ATM_FORE200E_USE_TASKLET=y +CONFIG_ATM_FORE200E_TX_RETRY=16 +CONFIG_ATM_FORE200E_DEBUG=0 +CONFIG_ATM_HE=m +CONFIG_ATM_HE_USE_SUNI=y +CONFIG_ATM_SOLOS=m # -# MII PHY device drivers +# CAIF transport drivers # -CONFIG_MARVELL_PHY=m -CONFIG_DAVICOM_PHY=m -CONFIG_QSEMI_PHY=m -CONFIG_LXT_PHY=m -CONFIG_CICADA_PHY=m -CONFIG_VITESSE_PHY=m -CONFIG_SMSC_PHY=m -CONFIG_BROADCOM_PHY=m -CONFIG_ICPLUS_PHY=m -CONFIG_REALTEK_PHY=m -CONFIG_NATIONAL_PHY=m -CONFIG_STE10XP=m -CONFIG_LSI_ET1011C_PHY=m -CONFIG_MICREL_PHY=m -CONFIG_FIXED_PHY=y -CONFIG_MDIO_BITBANG=m -CONFIG_MDIO_GPIO=m -CONFIG_NET_ETHERNET=y -CONFIG_HAPPYMEAL=m -CONFIG_SUNGEM=m -CONFIG_CASSINI=m +CONFIG_ETHERNET=y +CONFIG_MDIO=m CONFIG_NET_VENDOR_3COM=y +CONFIG_PCMCIA_3C574=m +CONFIG_PCMCIA_3C589=m CONFIG_VORTEX=m CONFIG_TYPHOON=m -CONFIG_ENC28J60=m -# CONFIG_ENC28J60_WRITEVERIFY is not set -CONFIG_ETHOC=m +CONFIG_NET_VENDOR_ADAPTEC=y +CONFIG_ADAPTEC_STARFIRE=m +CONFIG_NET_VENDOR_ALTEON=y +CONFIG_ACENIC=m +# CONFIG_ACENIC_OMIT_TIGON_I is not set +CONFIG_NET_VENDOR_AMD=y +CONFIG_AMD8111_ETH=m +CONFIG_PCNET32=m +CONFIG_PCMCIA_NMCLAN=m +CONFIG_NET_VENDOR_ATHEROS=y +CONFIG_ATL2=m +CONFIG_ATL1=m +CONFIG_ATL1E=m +CONFIG_ATL1C=m +CONFIG_NET_VENDOR_BROADCOM=y +CONFIG_B44=m +CONFIG_B44_PCI_AUTOSELECT=y +CONFIG_B44_PCICORE_AUTOSELECT=y +CONFIG_B44_PCI=y +CONFIG_BNX2=m +CONFIG_CNIC=m +CONFIG_TIGON3=m +CONFIG_BNX2X=m +CONFIG_NET_VENDOR_BROCADE=y +CONFIG_BNA=m +CONFIG_NET_VENDOR_CHELSIO=y +CONFIG_CHELSIO_T1=m +CONFIG_CHELSIO_T1_1G=y +CONFIG_CHELSIO_T3=m +CONFIG_CHELSIO_T4=m +CONFIG_CHELSIO_T4VF=m +CONFIG_NET_VENDOR_CISCO=y +CONFIG_ENIC=m CONFIG_DNET=m +CONFIG_NET_VENDOR_DEC=y CONFIG_NET_TULIP=y CONFIG_DE2104X=m CONFIG_DE2104X_DSL=0 @@ -1911,121 +2012,207 @@ CONFIG_WINBOND_840=m CONFIG_DM9102=m CONFIG_ULI526X=m CONFIG_PCMCIA_XIRCOM=m -CONFIG_HP100=m -# CONFIG_IBM_NEW_EMAC_ZMII is not set -# CONFIG_IBM_NEW_EMAC_RGMII is not set -# CONFIG_IBM_NEW_EMAC_TAH is not set -# CONFIG_IBM_NEW_EMAC_EMAC4 is not set -# CONFIG_IBM_NEW_EMAC_NO_FLOW_CTRL is not set -# CONFIG_IBM_NEW_EMAC_MAL_CLR_ICINTSTAT is not set -# CONFIG_IBM_NEW_EMAC_MAL_COMMON_ERR is not set -CONFIG_NET_PCI=y -CONFIG_PCNET32=m -CONFIG_AMD8111_ETH=m -CONFIG_ADAPTEC_STARFIRE=m -CONFIG_KSZ884X_PCI=m -CONFIG_B44=m -CONFIG_B44_PCI_AUTOSELECT=y -CONFIG_B44_PCICORE_AUTOSELECT=y -CONFIG_B44_PCI=y -CONFIG_FORCEDETH=m -CONFIG_E100=m -CONFIG_FEALNX=m -CONFIG_NATSEMI=m -CONFIG_NE2K_PCI=m -CONFIG_8139CP=m -CONFIG_8139TOO=m -# CONFIG_8139TOO_PIO is not set -# CONFIG_8139TOO_TUNE_TWISTER is not set -CONFIG_8139TOO_8129=y -# CONFIG_8139_OLD_RX_RESET is not set -CONFIG_R6040=m -CONFIG_SIS900=m -CONFIG_EPIC100=m -CONFIG_SMSC9420=m -CONFIG_SUNDANCE=m -# CONFIG_SUNDANCE_MMIO is not set -CONFIG_TLAN=m -CONFIG_KS8842=m -CONFIG_KS8851=m -CONFIG_KS8851_MLL=m -CONFIG_VIA_RHINE=m -CONFIG_VIA_RHINE_MMIO=y -CONFIG_SC92031=m -CONFIG_NET_POCKET=y -CONFIG_ATP=m +CONFIG_NET_VENDOR_DLINK=y CONFIG_DE600=m CONFIG_DE620=m -CONFIG_ATL2=m -CONFIG_NETDEV_1000=y -CONFIG_ACENIC=m -# CONFIG_ACENIC_OMIT_TIGON_I is not set CONFIG_DL2K=m +CONFIG_SUNDANCE=m +# CONFIG_SUNDANCE_MMIO is not set +CONFIG_NET_VENDOR_EMULEX=y +CONFIG_BE2NET=m +CONFIG_NET_VENDOR_EXAR=y +CONFIG_S2IO=m +CONFIG_VXGE=m +# CONFIG_VXGE_DEBUG_TRACE_ALL is not set +CONFIG_NET_VENDOR_FUJITSU=y +CONFIG_PCMCIA_FMVJ18X=m +CONFIG_NET_VENDOR_HP=y +CONFIG_HP100=m +CONFIG_NET_VENDOR_INTEL=y +CONFIG_E100=m CONFIG_E1000=m CONFIG_E1000E=m -CONFIG_IP1000=m CONFIG_IGB=m CONFIG_IGB_DCA=y CONFIG_IGBVF=m -CONFIG_NS83820=m -CONFIG_HAMACHI=m -CONFIG_YELLOWFIN=m -CONFIG_R8169=m -CONFIG_SIS190=m -CONFIG_SKGE=m -# CONFIG_SKGE_DEBUG is not set -CONFIG_SKY2=m -# CONFIG_SKY2_DEBUG is not set -CONFIG_VIA_VELOCITY=m -CONFIG_TIGON3=m -CONFIG_BNX2=m -CONFIG_CNIC=m -CONFIG_QLA3XXX=m -CONFIG_ATL1=m -CONFIG_ATL1E=m -CONFIG_ATL1C=m -CONFIG_JME=m -CONFIG_STMMAC_ETH=m -# CONFIG_STMMAC_DA is not set -# CONFIG_STMMAC_DUAL_MAC is not set -CONFIG_PCH_GBE=m -CONFIG_NETDEV_10000=y -CONFIG_MDIO=m -CONFIG_CHELSIO_T1=m -CONFIG_CHELSIO_T1_1G=y -CONFIG_CHELSIO_T3=m -CONFIG_CHELSIO_T4=m -CONFIG_CHELSIO_T4VF=m -CONFIG_ENIC=m +CONFIG_IXGB=m CONFIG_IXGBE=m CONFIG_IXGBE_DCA=y CONFIG_IXGBE_DCB=y CONFIG_IXGBEVF=m -CONFIG_IXGB=m -CONFIG_S2IO=m -CONFIG_VXGE=m -# CONFIG_VXGE_DEBUG_TRACE_ALL is not set -CONFIG_MYRI10GE=m -CONFIG_MYRI10GE_DCA=y -CONFIG_NETXEN_NIC=m -CONFIG_NIU=m +CONFIG_NET_VENDOR_I825XX=y +CONFIG_ZNET=m +CONFIG_IP1000=m +CONFIG_JME=m +CONFIG_NET_VENDOR_MARVELL=y +CONFIG_SKGE=m +# CONFIG_SKGE_DEBUG is not set +CONFIG_SKGE_GENESIS=y +CONFIG_SKY2=m +# CONFIG_SKY2_DEBUG is not set +CONFIG_NET_VENDOR_MELLANOX=y CONFIG_MLX4_EN=m CONFIG_MLX4_CORE=m CONFIG_MLX4_DEBUG=y -CONFIG_TEHUTI=m -CONFIG_BNX2X=m +CONFIG_NET_VENDOR_MICREL=y +CONFIG_KS8842=m +CONFIG_KS8851=m +CONFIG_KS8851_MLL=m +CONFIG_KSZ884X_PCI=m +CONFIG_NET_VENDOR_MICROCHIP=y +CONFIG_ENC28J60=m +# CONFIG_ENC28J60_WRITEVERIFY is not set +CONFIG_NET_VENDOR_MYRI=y +CONFIG_MYRI10GE=m +CONFIG_MYRI10GE_DCA=y +CONFIG_FEALNX=m +CONFIG_NET_VENDOR_NATSEMI=y +CONFIG_NATSEMI=m +CONFIG_NS83820=m +CONFIG_NET_VENDOR_8390=y +CONFIG_PCMCIA_AXNET=m +CONFIG_NE2K_PCI=m +CONFIG_PCMCIA_PCNET=m +CONFIG_NET_VENDOR_NVIDIA=y +CONFIG_FORCEDETH=m +CONFIG_NET_VENDOR_OKI=y +CONFIG_PCH_GBE=m +CONFIG_ETHOC=m +# CONFIG_NET_PACKET_ENGINE is not set +CONFIG_NET_VENDOR_QLOGIC=y +CONFIG_QLA3XXX=m CONFIG_QLCNIC=m CONFIG_QLGE=m -CONFIG_BNA=m +CONFIG_NETXEN_NIC=m +CONFIG_NET_VENDOR_REALTEK=y +CONFIG_ATP=m +CONFIG_8139CP=m +CONFIG_8139TOO=m +# CONFIG_8139TOO_PIO is not set +# CONFIG_8139TOO_TUNE_TWISTER is not set +CONFIG_8139TOO_8129=y +# CONFIG_8139_OLD_RX_RESET is not set +CONFIG_R8169=m +CONFIG_NET_VENDOR_RDC=y +CONFIG_R6040=m +CONFIG_NET_VENDOR_SEEQ=y +CONFIG_SEEQ8005=m +CONFIG_NET_VENDOR_SILAN=y +CONFIG_SC92031=m +CONFIG_NET_VENDOR_SIS=y +CONFIG_SIS900=m +CONFIG_SIS190=m CONFIG_SFC=m CONFIG_SFC_MTD=y -CONFIG_BE2NET=m -CONFIG_TR=m -CONFIG_IBMOL=m -CONFIG_3C359=m -CONFIG_TMS380TR=m -CONFIG_TMSPCI=m -CONFIG_ABYSS=m +CONFIG_NET_VENDOR_SMSC=y +CONFIG_PCMCIA_SMC91C92=m +CONFIG_EPIC100=m +CONFIG_SMSC9420=m +CONFIG_NET_VENDOR_STMICRO=y +CONFIG_STMMAC_ETH=m +# CONFIG_STMMAC_DEBUG_FS is not set +# CONFIG_STMMAC_DA is not set +CONFIG_STMMAC_RING=y +# CONFIG_STMMAC_CHAINED is not set +CONFIG_NET_VENDOR_SUN=y +CONFIG_HAPPYMEAL=m +CONFIG_SUNGEM=m +CONFIG_CASSINI=m +CONFIG_NIU=m +CONFIG_NET_VENDOR_TEHUTI=y +CONFIG_TEHUTI=m +CONFIG_NET_VENDOR_TI=y +CONFIG_TLAN=m +CONFIG_NET_VENDOR_VIA=y +CONFIG_VIA_RHINE=m +CONFIG_VIA_RHINE_MMIO=y +CONFIG_VIA_VELOCITY=m +CONFIG_NET_VENDOR_XIRCOM=y +CONFIG_PCMCIA_XIRC2PS=m +CONFIG_FDDI=m +CONFIG_DEFXX=m +CONFIG_DEFXX_MMIO=y +CONFIG_SKFP=m +CONFIG_HIPPI=y +CONFIG_ROADRUNNER=m +CONFIG_ROADRUNNER_LARGE_RINGS=y +# CONFIG_NET_SB1000 is not set +CONFIG_PHYLIB=y + +# +# MII PHY device drivers +# +CONFIG_MARVELL_PHY=m +CONFIG_DAVICOM_PHY=m +CONFIG_QSEMI_PHY=m +CONFIG_LXT_PHY=m +CONFIG_CICADA_PHY=m +CONFIG_VITESSE_PHY=m +CONFIG_SMSC_PHY=m +CONFIG_BROADCOM_PHY=m +CONFIG_ICPLUS_PHY=m +CONFIG_REALTEK_PHY=m +CONFIG_NATIONAL_PHY=m +CONFIG_STE10XP=m +CONFIG_LSI_ET1011C_PHY=m +CONFIG_MICREL_PHY=m +CONFIG_FIXED_PHY=y +CONFIG_MDIO_BITBANG=m +CONFIG_MDIO_GPIO=m +CONFIG_PLIP=m +CONFIG_PPP=m +CONFIG_PPP_BSDCOMP=m +CONFIG_PPP_DEFLATE=m +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=m +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOATM=m +CONFIG_PPPOE=m +CONFIG_PPP_ASYNC=m +CONFIG_PPP_SYNC_TTY=m +CONFIG_SLIP=m +CONFIG_SLHC=m +CONFIG_SLIP_COMPRESSED=y +CONFIG_SLIP_SMART=y +CONFIG_SLIP_MODE_SLIP6=y +# CONFIG_TR is not set + +# +# USB Network Adapters +# +CONFIG_USB_CATC=m +CONFIG_USB_KAWETH=m +CONFIG_USB_PEGASUS=m +CONFIG_USB_RTL8150=m +CONFIG_USB_USBNET=m +CONFIG_USB_NET_AX8817X=m +CONFIG_USB_NET_CDCETHER=m +CONFIG_USB_NET_CDC_EEM=m +CONFIG_USB_NET_CDC_NCM=m +CONFIG_USB_NET_DM9601=m +CONFIG_USB_NET_SMSC75XX=m +CONFIG_USB_NET_SMSC95XX=m +CONFIG_USB_NET_GL620A=m +CONFIG_USB_NET_NET1080=m +CONFIG_USB_NET_PLUSB=m +CONFIG_USB_NET_MCS7830=m +CONFIG_USB_NET_RNDIS_HOST=m +CONFIG_USB_NET_CDC_SUBSET=m +CONFIG_USB_ALI_M5632=y +CONFIG_USB_AN2720=y +CONFIG_USB_BELKIN=y +CONFIG_USB_ARMLINUX=y +CONFIG_USB_EPSON2888=y +CONFIG_USB_KC2190=y +CONFIG_USB_NET_ZAURUS=m +CONFIG_USB_NET_CX82310_ETH=m +CONFIG_USB_NET_KALMIA=m +CONFIG_USB_HSO=m +CONFIG_USB_NET_INT51X1=m +CONFIG_USB_CDC_PHONET=m +CONFIG_USB_IPHETH=m +CONFIG_USB_SIERRA_NET=m +CONFIG_USB_VL600=m CONFIG_WLAN=y CONFIG_PCMCIA_RAYCS=m CONFIG_LIBERTAS_THINFIRM=m @@ -2066,7 +2253,11 @@ CONFIG_CARL9170=m CONFIG_CARL9170_LEDS=y # CONFIG_CARL9170_DEBUGFS is not set CONFIG_CARL9170_WPC=y +CONFIG_CARL9170_HWRNG=y +CONFIG_ATH6KL=m +# CONFIG_ATH6KL_DEBUG is not set CONFIG_B43=m +CONFIG_B43_SSB=y CONFIG_B43_PCI_AUTOSELECT=y CONFIG_B43_PCICORE_AUTOSELECT=y CONFIG_B43_PCMCIA=y @@ -2074,6 +2265,7 @@ CONFIG_B43_SDIO=y CONFIG_B43_PIO=y CONFIG_B43_PHY_N=y CONFIG_B43_PHY_LP=y +CONFIG_B43_PHY_HT=y CONFIG_B43_LEDS=y CONFIG_B43_HWRNG=y # CONFIG_B43_DEBUG is not set @@ -2088,6 +2280,10 @@ CONFIG_B43LEGACY_PIO=y CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y # CONFIG_B43LEGACY_DMA_MODE is not set # CONFIG_B43LEGACY_PIO_MODE is not set +CONFIG_BRCMUTIL=m +CONFIG_BRCMSMAC=m +# CONFIG_BRCMFMAC is not set +# CONFIG_BRCMDBG is not set CONFIG_HOSTAP=m CONFIG_HOSTAP_FIRMWARE=y CONFIG_HOSTAP_FIRMWARE_NVRAM=y @@ -2105,7 +2301,7 @@ CONFIG_IPW2200_QOS=y CONFIG_IPW2200_DEBUG=y CONFIG_LIBIPW=m CONFIG_LIBIPW_DEBUG=y -CONFIG_IWLAGN=m +CONFIG_IWLWIFI=m # # Debugging Options @@ -2115,7 +2311,6 @@ CONFIG_IWLWIFI_DEBUGFS=y # CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE is not set # CONFIG_IWLWIFI_DEVICE_TRACING is not set CONFIG_IWLWIFI_DEVICE_SVTOOL=y -# CONFIG_IWL_P2P is not set CONFIG_IWLWIFI_LEGACY=m # @@ -2174,6 +2369,7 @@ CONFIG_RT2X00_LIB_LEDS=y # CONFIG_RT2X00_DEBUG is not set CONFIG_RTL8192CE=m CONFIG_RTL8192SE=m +CONFIG_RTL8192DE=m CONFIG_RTL8192CU=m CONFIG_RTLWIFI=m CONFIG_RTL8192C_COMMON=m @@ -2182,7 +2378,6 @@ CONFIG_WL1251_SPI=m CONFIG_WL1251_SDIO=m CONFIG_WL12XX_MENU=m CONFIG_WL12XX=m -# CONFIG_WL12XX_HT is not set # CONFIG_WL12XX_SPI is not set # CONFIG_WL12XX_SDIO is not set CONFIG_WL12XX_PLATFORM_DATA=y @@ -2190,6 +2385,7 @@ CONFIG_ZD1211RW=m # CONFIG_ZD1211RW_DEBUG is not set CONFIG_MWIFIEX=m CONFIG_MWIFIEX_SDIO=m +CONFIG_MWIFIEX_PCIE=m # # WiMAX Wireless Broadband devices @@ -2199,53 +2395,6 @@ CONFIG_WIMAX_I2400M_USB=m CONFIG_WIMAX_I2400M_SDIO=m CONFIG_WIMAX_IWMC3200_SDIO=y CONFIG_WIMAX_I2400M_DEBUG_LEVEL=8 - -# -# USB Network Adapters -# -CONFIG_USB_CATC=m -CONFIG_USB_KAWETH=m -CONFIG_USB_PEGASUS=m -CONFIG_USB_RTL8150=m -CONFIG_USB_USBNET=m -CONFIG_USB_NET_AX8817X=m -CONFIG_USB_NET_CDCETHER=m -CONFIG_USB_NET_CDC_EEM=m -CONFIG_USB_NET_CDC_NCM=m -CONFIG_USB_NET_DM9601=m -CONFIG_USB_NET_SMSC75XX=m -CONFIG_USB_NET_SMSC95XX=m -CONFIG_USB_NET_GL620A=m -CONFIG_USB_NET_NET1080=m -CONFIG_USB_NET_PLUSB=m -CONFIG_USB_NET_MCS7830=m -CONFIG_USB_NET_RNDIS_HOST=m -CONFIG_USB_NET_CDC_SUBSET=m -CONFIG_USB_ALI_M5632=y -CONFIG_USB_AN2720=y -CONFIG_USB_BELKIN=y -CONFIG_USB_ARMLINUX=y -CONFIG_USB_EPSON2888=y -CONFIG_USB_KC2190=y -CONFIG_USB_NET_ZAURUS=m -CONFIG_USB_NET_CX82310_ETH=m -CONFIG_USB_NET_KALMIA=m -CONFIG_USB_HSO=m -CONFIG_USB_NET_INT51X1=m -CONFIG_USB_CDC_PHONET=m -CONFIG_USB_IPHETH=m -CONFIG_USB_SIERRA_NET=m -CONFIG_USB_VL600=m -CONFIG_NET_PCMCIA=y -CONFIG_PCMCIA_3C589=m -CONFIG_PCMCIA_3C574=m -CONFIG_PCMCIA_FMVJ18X=m -CONFIG_PCMCIA_PCNET=m -CONFIG_PCMCIA_NMCLAN=m -CONFIG_PCMCIA_SMC91C92=m -CONFIG_PCMCIA_XIRC2PS=m -CONFIG_PCMCIA_AXNET=m -CONFIG_PCMCIA_IBMTR=m CONFIG_WAN=y CONFIG_LANMEDIA=m CONFIG_HDLC=m @@ -2269,81 +2418,8 @@ CONFIG_LAPBETHER=m CONFIG_X25_ASY=m CONFIG_SBNI=m CONFIG_SBNI_MULTILINE=y -CONFIG_ATM_DRIVERS=y -CONFIG_ATM_DUMMY=m -CONFIG_ATM_TCP=m -CONFIG_ATM_LANAI=m -CONFIG_ATM_ENI=m -# CONFIG_ATM_ENI_DEBUG is not set -CONFIG_ATM_ENI_TUNE_BURST=y -CONFIG_ATM_ENI_BURST_TX_16W=y -CONFIG_ATM_ENI_BURST_TX_8W=y -CONFIG_ATM_ENI_BURST_TX_4W=y -CONFIG_ATM_ENI_BURST_TX_2W=y -CONFIG_ATM_ENI_BURST_RX_16W=y -CONFIG_ATM_ENI_BURST_RX_8W=y -CONFIG_ATM_ENI_BURST_RX_4W=y -CONFIG_ATM_ENI_BURST_RX_2W=y -CONFIG_ATM_FIRESTREAM=m -CONFIG_ATM_ZATM=m -# CONFIG_ATM_ZATM_DEBUG is not set -CONFIG_ATM_NICSTAR=m -# CONFIG_ATM_NICSTAR_USE_SUNI is not set -# CONFIG_ATM_NICSTAR_USE_IDT77105 is not set -CONFIG_ATM_IDT77252=m -# CONFIG_ATM_IDT77252_DEBUG is not set -# CONFIG_ATM_IDT77252_RCV_ALL is not set -CONFIG_ATM_IDT77252_USE_SUNI=y -CONFIG_ATM_AMBASSADOR=m -# CONFIG_ATM_AMBASSADOR_DEBUG is not set -CONFIG_ATM_HORIZON=m -# CONFIG_ATM_HORIZON_DEBUG is not set -CONFIG_ATM_IA=m -# CONFIG_ATM_IA_DEBUG is not set -CONFIG_ATM_FORE200E=m -CONFIG_ATM_FORE200E_USE_TASKLET=y -CONFIG_ATM_FORE200E_TX_RETRY=16 -CONFIG_ATM_FORE200E_DEBUG=0 -CONFIG_ATM_HE=m -CONFIG_ATM_HE_USE_SUNI=y -CONFIG_ATM_SOLOS=m -CONFIG_IEEE802154_DRIVERS=m -CONFIG_IEEE802154_FAKEHARD=m - -# -# CAIF transport drivers -# CONFIG_XEN_NETDEV_FRONTEND=m CONFIG_XEN_NETDEV_BACKEND=m -CONFIG_FDDI=m -CONFIG_DEFXX=m -CONFIG_DEFXX_MMIO=y -CONFIG_SKFP=m -CONFIG_HIPPI=y -CONFIG_ROADRUNNER=m -CONFIG_ROADRUNNER_LARGE_RINGS=y -CONFIG_PLIP=m -CONFIG_PPP=m -CONFIG_PPP_MULTILINK=y -CONFIG_PPP_FILTER=y -CONFIG_PPP_ASYNC=m -CONFIG_PPP_SYNC_TTY=m -CONFIG_PPP_DEFLATE=m -CONFIG_PPP_BSDCOMP=m -CONFIG_PPP_MPPE=m -CONFIG_PPPOE=m -CONFIG_PPPOATM=m -CONFIG_SLIP=m -CONFIG_SLIP_COMPRESSED=y -CONFIG_SLHC=m -CONFIG_SLIP_SMART=y -CONFIG_SLIP_MODE_SLIP6=y -CONFIG_NET_FC=y -CONFIG_NETCONSOLE=m -CONFIG_NETCONSOLE_DYNAMIC=y -CONFIG_NETPOLL=y -CONFIG_NETPOLL_TRAP=y -CONFIG_NET_POLL_CONTROLLER=y # CONFIG_VMXNET3 is not set CONFIG_ISDN=y CONFIG_ISDN_I4L=m @@ -2624,6 +2700,7 @@ CONFIG_TOUCHSCREEN_USB_ZYTRONIC=y CONFIG_TOUCHSCREEN_USB_ETT_TC45USB=y CONFIG_TOUCHSCREEN_USB_NEXIO=y CONFIG_TOUCHSCREEN_TOUCHIT213=m +CONFIG_TOUCHSCREEN_TSC_SERIO=m CONFIG_TOUCHSCREEN_TSC2005=m CONFIG_TOUCHSCREEN_TSC2007=m CONFIG_TOUCHSCREEN_PCAP=m @@ -2633,12 +2710,17 @@ CONFIG_INPUT_MISC=y CONFIG_INPUT_AD714X=m CONFIG_INPUT_AD714X_I2C=m CONFIG_INPUT_AD714X_SPI=m +CONFIG_INPUT_BMA150=m CONFIG_INPUT_PCSPKR=m +CONFIG_INPUT_MC13783_PWRBUTTON=m +CONFIG_INPUT_MMA8450=m +CONFIG_INPUT_MPU3050=m CONFIG_INPUT_APANEL=m CONFIG_INPUT_ATLAS_BTNS=m -CONFIG_INPUT_ATI_REMOTE=m CONFIG_INPUT_ATI_REMOTE2=m CONFIG_INPUT_KEYSPAN_REMOTE=m +CONFIG_INPUT_KXTJ9=m +# CONFIG_INPUT_KXTJ9_POLLED_MODE is not set CONFIG_INPUT_POWERMATE=m CONFIG_INPUT_YEALINK=m CONFIG_INPUT_CM109=m @@ -2678,6 +2760,7 @@ CONFIG_GAMEPORT_FM801=m CONFIG_VT=y CONFIG_CONSOLE_TRANSLATIONS=y CONFIG_VT_CONSOLE=y +CONFIG_VT_CONSOLE_SLEEP=y CONFIG_HW_CONSOLE=y CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_UNIX98_PTYS=y @@ -2737,6 +2820,7 @@ CONFIG_PPDEV=m CONFIG_HVC_DRIVER=y CONFIG_HVC_IRQ=y CONFIG_HVC_XEN=y +CONFIG_VIRTIO_CONSOLE=m CONFIG_IPMI_HANDLER=m CONFIG_IPMI_PANIC_EVENT=y # CONFIG_IPMI_PANIC_STRING is not set @@ -2749,6 +2833,7 @@ CONFIG_HW_RANDOM_TIMERIOMEM=m CONFIG_HW_RANDOM_INTEL=m CONFIG_HW_RANDOM_AMD=m CONFIG_HW_RANDOM_VIA=m +CONFIG_HW_RANDOM_VIRTIO=m CONFIG_NVRAM=y CONFIG_R3964=m CONFIG_APPLICOM=m @@ -2822,6 +2907,7 @@ CONFIG_I2C_SCMI=m # # I2C system bus drivers (mostly embedded / system-on-chip) # +CONFIG_I2C_DESIGNWARE_PCI=m CONFIG_I2C_GPIO=m CONFIG_I2C_INTEL_MID=m CONFIG_I2C_OCORES=m @@ -2885,6 +2971,7 @@ CONFIG_PPS=m # CONFIG_PPS_CLIENT_KTIMER is not set CONFIG_PPS_CLIENT_LDISC=m CONFIG_PPS_CLIENT_PARPORT=m +CONFIG_PPS_CLIENT_GPIO=m # # PPS generators support @@ -2898,13 +2985,13 @@ CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y CONFIG_GPIOLIB=y # CONFIG_DEBUG_GPIO is not set CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_GENERIC=m CONFIG_GPIO_MAX730X=m # # Memory mapped GPIO drivers: # -CONFIG_GPIO_BASIC_MMIO_CORE=m -CONFIG_GPIO_BASIC_MMIO=m +CONFIG_GPIO_GENERIC_PLATFORM=m CONFIG_GPIO_IT8761E=m CONFIG_GPIO_SCH=m CONFIG_GPIO_VX855=m @@ -2916,6 +3003,7 @@ CONFIG_GPIO_MAX7300=m CONFIG_GPIO_MAX732X=m CONFIG_GPIO_PCA953X=m CONFIG_GPIO_PCF857X=m +CONFIG_GPIO_TPS65912=m CONFIG_GPIO_ADP5588=m # @@ -2983,6 +3071,7 @@ CONFIG_BATTERY_BQ27X00_I2C=y CONFIG_BATTERY_BQ27X00_PLATFORM=y CONFIG_BATTERY_MAX17040=m CONFIG_BATTERY_MAX17042=m +CONFIG_CHARGER_ISP1704=m CONFIG_CHARGER_MAX8903=m CONFIG_CHARGER_GPIO=m CONFIG_HWMON=m @@ -2994,6 +3083,7 @@ CONFIG_HWMON_VID=m # CONFIG_SENSORS_ABITUGURU=m CONFIG_SENSORS_ABITUGURU3=m +CONFIG_SENSORS_AD7314=m CONFIG_SENSORS_AD7414=m CONFIG_SENSORS_AD7418=m CONFIG_SENSORS_ADCXX=m @@ -3048,23 +3138,29 @@ CONFIG_SENSORS_LTC4215=m CONFIG_SENSORS_LTC4245=m CONFIG_SENSORS_LTC4261=m CONFIG_SENSORS_LM95241=m +CONFIG_SENSORS_LM95245=m CONFIG_SENSORS_MAX1111=m CONFIG_SENSORS_MAX16065=m CONFIG_SENSORS_MAX1619=m +CONFIG_SENSORS_MAX1668=m CONFIG_SENSORS_MAX6639=m CONFIG_SENSORS_MAX6642=m CONFIG_SENSORS_MAX6650=m +CONFIG_SENSORS_NTC_THERMISTOR=m CONFIG_SENSORS_PC87360=m CONFIG_SENSORS_PC87427=m CONFIG_SENSORS_PCF8591=m CONFIG_PMBUS=m CONFIG_SENSORS_PMBUS=m CONFIG_SENSORS_ADM1275=m +CONFIG_SENSORS_LM25066=m +CONFIG_SENSORS_LTC2978=m CONFIG_SENSORS_MAX16064=m CONFIG_SENSORS_MAX34440=m CONFIG_SENSORS_MAX8688=m CONFIG_SENSORS_UCD9000=m CONFIG_SENSORS_UCD9200=m +CONFIG_SENSORS_ZL6100=m CONFIG_SENSORS_SHT15=m CONFIG_SENSORS_SHT21=m CONFIG_SENSORS_SIS5595=m @@ -3076,7 +3172,9 @@ CONFIG_SENSORS_EMC6W201=m CONFIG_SENSORS_SMSC47M1=m CONFIG_SENSORS_SMSC47M192=m CONFIG_SENSORS_SMSC47B397=m +CONFIG_SENSORS_SCH56XX_COMMON=m CONFIG_SENSORS_SCH5627=m +CONFIG_SENSORS_SCH5636=m CONFIG_SENSORS_ADS1015=m CONFIG_SENSORS_ADS7828=m CONFIG_SENSORS_ADS7871=m @@ -3110,6 +3208,7 @@ CONFIG_SENSORS_ATK0110=m CONFIG_THERMAL=m CONFIG_THERMAL_HWMON=y CONFIG_WATCHDOG=y +CONFIG_WATCHDOG_CORE=y # CONFIG_WATCHDOG_NOWAYOUT is not set # @@ -3187,8 +3286,11 @@ CONFIG_BCMA_POSSIBLE=y # Broadcom specific AMBA # # CONFIG_BCMA is not set -CONFIG_MFD_SUPPORT=y -CONFIG_MFD_CORE=m + +# +# Multifunction device drivers +# +CONFIG_MFD_CORE=y CONFIG_MFD_SM501=m CONFIG_MFD_SM501_GPIO=y CONFIG_HTC_PASIC3=m @@ -3196,6 +3298,8 @@ CONFIG_UCB1400_CORE=m CONFIG_TPS6105X=m CONFIG_TPS65010=m CONFIG_TPS6507X=m +CONFIG_MFD_TPS65912=y +CONFIG_MFD_TPS65912_SPI=y # CONFIG_MFD_TMIO is not set CONFIG_MFD_WM8400=m # CONFIG_MFD_WM831X_SPI is not set @@ -3217,6 +3321,7 @@ CONFIG_REGULATOR_DUMMY=y CONFIG_REGULATOR_FIXED_VOLTAGE=m CONFIG_REGULATOR_VIRTUAL_CONSUMER=m CONFIG_REGULATOR_USERSPACE_CONSUMER=m +CONFIG_REGULATOR_GPIO=m CONFIG_REGULATOR_BQ24022=m CONFIG_REGULATOR_MAX1586=m CONFIG_REGULATOR_MAX8649=m @@ -3232,6 +3337,7 @@ CONFIG_REGULATOR_MC13892=m CONFIG_REGULATOR_TPS6105X=m CONFIG_REGULATOR_TPS65023=m CONFIG_REGULATOR_TPS6507X=m +CONFIG_REGULATOR_TPS65912=m CONFIG_REGULATOR_ISL6271A=m CONFIG_REGULATOR_AD5398=m CONFIG_REGULATOR_TPS6524X=m @@ -3244,6 +3350,7 @@ CONFIG_MEDIA_SUPPORT=m CONFIG_VIDEO_DEV=m CONFIG_VIDEO_V4L2_COMMON=m CONFIG_DVB_CORE=m +CONFIG_DVB_NET=y CONFIG_VIDEO_MEDIA=m # @@ -3260,7 +3367,9 @@ CONFIG_IR_RC6_DECODER=m CONFIG_IR_JVC_DECODER=m CONFIG_IR_SONY_DECODER=m CONFIG_IR_RC5_SZ_DECODER=m +CONFIG_IR_MCE_KBD_DECODER=m CONFIG_IR_LIRC_CODEC=m +CONFIG_RC_ATI_REMOTE=m # CONFIG_IR_ENE is not set CONFIG_IR_IMON=m CONFIG_IR_MCEUSB=m @@ -3288,6 +3397,7 @@ CONFIG_MEDIA_TUNER_MT2131=m CONFIG_MEDIA_TUNER_QT1010=m CONFIG_MEDIA_TUNER_XC2028=m CONFIG_MEDIA_TUNER_XC5000=m +CONFIG_MEDIA_TUNER_XC4000=m CONFIG_MEDIA_TUNER_MXL5005S=m CONFIG_MEDIA_TUNER_MXL5007T=m CONFIG_MEDIA_TUNER_MC44S803=m @@ -3305,6 +3415,7 @@ CONFIG_VIDEO_TVEEPROM=m CONFIG_VIDEO_TUNER=m CONFIG_VIDEOBUF2_CORE=m CONFIG_VIDEOBUF2_MEMOPS=m +CONFIG_VIDEOBUF2_DMA_CONTIG=m CONFIG_VIDEOBUF2_VMALLOC=m CONFIG_VIDEO_CAPTURE_DRIVERS=y # CONFIG_VIDEO_ADV_DEBUG is not set @@ -3370,6 +3481,10 @@ CONFIG_VIDEO_ADV7175=m CONFIG_VIDEO_OV7670=m CONFIG_VIDEO_MT9V011=m +# +# Flash devices +# + # # Video improvement chips # @@ -3412,6 +3527,8 @@ CONFIG_VIDEO_CX88_MPEG=m CONFIG_VIDEO_CX88_VP3054=m CONFIG_VIDEO_CX23885=m CONFIG_MEDIA_ALTERA_CI=m +CONFIG_VIDEO_CX25821=m +CONFIG_VIDEO_CX25821_ALSA=m CONFIG_VIDEO_AU0828=m CONFIG_VIDEO_IVTV=m CONFIG_VIDEO_FB_IVTV=m @@ -3419,9 +3536,7 @@ CONFIG_VIDEO_CX18=m CONFIG_VIDEO_CX18_ALSA=m CONFIG_VIDEO_SAA7164=m CONFIG_VIDEO_CAFE_CCIC=m -CONFIG_VIDEO_SR030PC30=m CONFIG_VIDEO_VIA_CAMERA=m -CONFIG_VIDEO_NOON010PC30=m CONFIG_SOC_CAMERA=m CONFIG_SOC_CAMERA_IMX074=m CONFIG_SOC_CAMERA_MT9M001=m @@ -3433,6 +3548,7 @@ CONFIG_SOC_CAMERA_RJ54N1=m CONFIG_SOC_CAMERA_TW9910=m CONFIG_SOC_CAMERA_PLATFORM=m CONFIG_SOC_CAMERA_OV2640=m +CONFIG_SOC_CAMERA_OV5642=m CONFIG_SOC_CAMERA_OV6650=m CONFIG_SOC_CAMERA_OV772X=m CONFIG_SOC_CAMERA_OV9640=m @@ -3461,6 +3577,7 @@ CONFIG_USB_GSPCA_OV534_9=m CONFIG_USB_GSPCA_PAC207=m CONFIG_USB_GSPCA_PAC7302=m CONFIG_USB_GSPCA_PAC7311=m +CONFIG_USB_GSPCA_SE401=m CONFIG_USB_GSPCA_SN9C2028=m CONFIG_USB_GSPCA_SN9C20X=m CONFIG_USB_GSPCA_SONIXB=m @@ -3479,6 +3596,7 @@ CONFIG_USB_GSPCA_STK014=m CONFIG_USB_GSPCA_STV0680=m CONFIG_USB_GSPCA_SUNPLUS=m CONFIG_USB_GSPCA_T613=m +CONFIG_USB_GSPCA_TOPRO=m CONFIG_USB_GSPCA_TV8532=m CONFIG_USB_GSPCA_VC032X=m CONFIG_USB_GSPCA_VICAM=m @@ -3492,11 +3610,15 @@ CONFIG_VIDEO_HDPVR=m CONFIG_VIDEO_EM28XX=m CONFIG_VIDEO_EM28XX_ALSA=m CONFIG_VIDEO_EM28XX_DVB=m +CONFIG_VIDEO_EM28XX_RC=y CONFIG_VIDEO_TLG2300=m CONFIG_VIDEO_CX231XX=m CONFIG_VIDEO_CX231XX_RC=y CONFIG_VIDEO_CX231XX_ALSA=m CONFIG_VIDEO_CX231XX_DVB=m +CONFIG_VIDEO_TM6000=m +CONFIG_VIDEO_TM6000_ALSA=m +CONFIG_VIDEO_TM6000_DVB=m CONFIG_VIDEO_USBVISION=m CONFIG_USB_ET61X251=m CONFIG_USB_SN9C102=m @@ -3567,6 +3689,7 @@ CONFIG_DVB_USB_DTT200U=m CONFIG_DVB_USB_OPERA1=m CONFIG_DVB_USB_AF9005=m CONFIG_DVB_USB_AF9005_REMOTE=m +CONFIG_DVB_USB_PCTV452E=m CONFIG_DVB_USB_DW2102=m CONFIG_DVB_USB_CINERGY_T2=m CONFIG_DVB_USB_ANYSEE=m @@ -3578,6 +3701,8 @@ CONFIG_DVB_USB_EC168=m CONFIG_DVB_USB_AZ6027=m CONFIG_DVB_USB_LME2510=m CONFIG_DVB_USB_TECHNISAT_USB2=m +CONFIG_DVB_USB_IT913X=m +CONFIG_DVB_USB_MXL111SF=m CONFIG_DVB_TTUSB_BUDGET=m CONFIG_DVB_TTUSB_DEC=m CONFIG_SMS_SIANO_MDTV=m @@ -3634,6 +3759,11 @@ CONFIG_DVB_HOPPER=m # CONFIG_DVB_NGENE=m +# +# Supported ddbridge ('Octopus') Adapters +# +CONFIG_DVB_DDBRIDGE=m + # # Supported DVB Frontends # @@ -3647,6 +3777,12 @@ CONFIG_DVB_STB6100=m CONFIG_DVB_STV090x=m CONFIG_DVB_STV6110x=m +# +# Multistandard (cable + terrestrial) frontends +# +CONFIG_DVB_DRXK=m +CONFIG_DVB_TDA18271C2DD=m + # # DVB-S (satellite) frontends # @@ -3673,6 +3809,7 @@ CONFIG_DVB_CX24116=m CONFIG_DVB_SI21XX=m CONFIG_DVB_DS3000=m CONFIG_DVB_MB86A16=m +CONFIG_DVB_TDA10071=m # # DVB-T (terrestrial) frontends @@ -3736,13 +3873,16 @@ CONFIG_DVB_TUNER_DIB0090=m # SEC control devices for DVB-S # CONFIG_DVB_LNBP21=m +CONFIG_DVB_LNBP22=m CONFIG_DVB_ISL6405=m CONFIG_DVB_ISL6421=m CONFIG_DVB_ISL6423=m +CONFIG_DVB_A8293=m CONFIG_DVB_LGS8GXX=m CONFIG_DVB_ATBM8830=m CONFIG_DVB_TDA665x=m CONFIG_DVB_IX2505V=m +CONFIG_DVB_IT913X_FE=m # # Tools to develop new frontends @@ -3774,6 +3914,7 @@ CONFIG_DRM_MGA=m CONFIG_DRM_SIS=m CONFIG_DRM_VIA=m CONFIG_DRM_SAVAGE=m +# CONFIG_DRM_VMWGFX is not set CONFIG_STUB_POULSBO=m CONFIG_VGASTATE=m CONFIG_VIDEO_OUTPUT_CONTROL=m @@ -3874,6 +4015,7 @@ CONFIG_FB_GEODE_GX1=m CONFIG_FB_TMIO=m CONFIG_FB_TMIO_ACCELL=y CONFIG_FB_SM501=m +CONFIG_FB_SMSCUFX=m CONFIG_FB_UDL=m CONFIG_FB_VIRTUAL=m CONFIG_XEN_FBDEV_FRONTEND=y @@ -3893,6 +4035,7 @@ CONFIG_LCD_VGG2432A4=m CONFIG_LCD_PLATFORM=m CONFIG_LCD_S6E63M0=m CONFIG_LCD_LD9040=m +CONFIG_LCD_AMS369FG06=m CONFIG_BACKLIGHT_CLASS_DEVICE=y CONFIG_BACKLIGHT_GENERIC=m CONFIG_BACKLIGHT_PROGEAR=m @@ -3975,6 +4118,7 @@ CONFIG_SND_AC97_POWER_SAVE=y CONFIG_SND_AC97_POWER_SAVE_DEFAULT=0 CONFIG_SND_SB_COMMON=m CONFIG_SND_SB16_DSP=m +CONFIG_SND_TEA575X=m CONFIG_SND_PCI=y CONFIG_SND_AD1889=m CONFIG_SND_ALS300=m @@ -4024,8 +4168,8 @@ CONFIG_SND_ES1968_INPUT=y CONFIG_SND_ES1968_RADIO=y CONFIG_SND_FM801=m CONFIG_SND_FM801_TEA575X_BOOL=y -CONFIG_SND_TEA575X=m CONFIG_SND_HDA_INTEL=m +CONFIG_SND_HDA_PREALLOC_SIZE=64 CONFIG_SND_HDA_HWDEP=y CONFIG_SND_HDA_RECONFIG=y CONFIG_SND_HDA_INPUT_BEEP=y @@ -4033,6 +4177,7 @@ CONFIG_SND_HDA_INPUT_BEEP_MODE=2 CONFIG_SND_HDA_INPUT_JACK=y CONFIG_SND_HDA_PATCH_LOADER=y CONFIG_SND_HDA_CODEC_REALTEK=y +CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS=y CONFIG_SND_HDA_CODEC_ANALOG=y CONFIG_SND_HDA_CODEC_SIGMATEL=y CONFIG_SND_HDA_CODEC_VIA=y @@ -4040,6 +4185,7 @@ CONFIG_SND_HDA_CODEC_HDMI=y CONFIG_SND_HDA_CODEC_CIRRUS=y CONFIG_SND_HDA_CODEC_CONEXANT=y CONFIG_SND_HDA_CODEC_CA0110=y +CONFIG_SND_HDA_CODEC_CA0132=y CONFIG_SND_HDA_CODEC_CMEDIA=y CONFIG_SND_HDA_CODEC_SI3054=y CONFIG_SND_HDA_GENERIC=y @@ -4124,7 +4270,7 @@ CONFIG_USB_HIDDEV=y # CONFIG_HID_A4TECH=m CONFIG_HID_ACRUX=m -CONFIG_HID_ACRUX_FF=m +# CONFIG_HID_ACRUX_FF is not set CONFIG_HID_APPLE=m CONFIG_HID_BELKIN=m CONFIG_HID_CHERRY=m @@ -4136,6 +4282,8 @@ CONFIG_DRAGONRISE_FF=y CONFIG_HID_EMS_FF=m CONFIG_HID_ELECOM=m CONFIG_HID_EZKEY=m +CONFIG_HID_HOLTEK=m +# CONFIG_HOLTEK_FF is not set CONFIG_HID_KEYTOUCH=m CONFIG_HID_KYE=m CONFIG_HID_UCLOGIC=m @@ -4145,10 +4293,11 @@ CONFIG_HID_TWINHAN=m CONFIG_HID_KENSINGTON=m CONFIG_HID_LCPOWER=m CONFIG_HID_LOGITECH=m +CONFIG_HID_LOGITECH_DJ=m CONFIG_LOGITECH_FF=y CONFIG_LOGIRUMBLEPAD2_FF=y CONFIG_LOGIG940_FF=y -CONFIG_LOGIWII_FF=y +CONFIG_LOGIWHEELS_FF=y CONFIG_HID_MAGICMOUSE=m CONFIG_HID_MICROSOFT=m CONFIG_HID_MONTEREY=m @@ -4163,6 +4312,7 @@ CONFIG_HID_PICOLCD_FB=y CONFIG_HID_PICOLCD_BACKLIGHT=y CONFIG_HID_PICOLCD_LCD=y CONFIG_HID_PICOLCD_LEDS=y +CONFIG_HID_PRIMAX=m CONFIG_HID_QUANTA=m CONFIG_HID_ROCCAT=m CONFIG_HID_ROCCAT_COMMON=m @@ -4173,6 +4323,7 @@ CONFIG_HID_ROCCAT_KOVAPLUS=m CONFIG_HID_ROCCAT_PYRA=m CONFIG_HID_SAMSUNG=m CONFIG_HID_SONY=m +CONFIG_HID_SPEEDLINK=m CONFIG_HID_SUNPLUS=m CONFIG_HID_GREENASIA=m CONFIG_GREENASIA_FF=y @@ -4183,13 +4334,16 @@ CONFIG_HID_THRUSTMASTER=m CONFIG_THRUSTMASTER_FF=y CONFIG_HID_WACOM=m CONFIG_HID_WACOM_POWER_SUPPLY=y +CONFIG_HID_WIIMOTE=m CONFIG_HID_ZEROPLUS=m CONFIG_ZEROPLUS_FF=y CONFIG_HID_ZYDACRON=m CONFIG_USB_SUPPORT=y +CONFIG_USB_COMMON=m CONFIG_USB_ARCH_HAS_HCD=y CONFIG_USB_ARCH_HAS_OHCI=y CONFIG_USB_ARCH_HAS_EHCI=y +CONFIG_USB_ARCH_HAS_XHCI=y CONFIG_USB=m # CONFIG_USB_DEBUG is not set CONFIG_USB_ANNOUNCE_NEW_DEVICES=y @@ -4202,6 +4356,8 @@ CONFIG_USB_DEVICEFS=y # CONFIG_USB_DYNAMIC_MINORS is not set CONFIG_USB_SUSPEND=y # CONFIG_USB_OTG is not set +CONFIG_USB_DWC3=m +# CONFIG_USB_DWC3_DEBUG is not set CONFIG_USB_MON=m CONFIG_USB_WUSB=m CONFIG_USB_WUSB_CBAF=m @@ -4234,10 +4390,6 @@ CONFIG_USB_R8A66597_HCD=m CONFIG_USB_WHCI_HCD=m CONFIG_USB_HWA_HCD=m -# -# Enable Host or Gadget support to see Inventra options -# - # # USB Device Class drivers # @@ -4256,6 +4408,7 @@ CONFIG_USB_TMC=m CONFIG_USB_STORAGE=m # CONFIG_USB_STORAGE_DEBUG is not set CONFIG_USB_STORAGE_REALTEK=m +CONFIG_REALTEK_AUTOPM=y CONFIG_USB_STORAGE_DATAFAB=m CONFIG_USB_STORAGE_FREECOM=m CONFIG_USB_STORAGE_ISD200=m @@ -4370,6 +4523,7 @@ CONFIG_USB_XUSBATM=m # # OTG and related infrastructure # +CONFIG_USB_OTG_UTILS=y # CONFIG_USB_GPIO_VBUS is not set # CONFIG_NOP_USB_XCEIV is not set CONFIG_UWB=m @@ -4428,11 +4582,9 @@ CONFIG_LEDS_CLASS=y # CONFIG_LEDS_LM3530=m CONFIG_LEDS_NET5501=m -CONFIG_LEDS_ALIX2=m CONFIG_LEDS_PCA9532=m # CONFIG_LEDS_PCA9532_GPIO is not set CONFIG_LEDS_GPIO=m -CONFIG_LEDS_GPIO_PLATFORM=y CONFIG_LEDS_LP3944=m CONFIG_LEDS_LP5521=m CONFIG_LEDS_LP5523=m @@ -4459,8 +4611,6 @@ CONFIG_LEDS_TRIGGER_DEFAULT_ON=m # # iptables trigger is under Netfilter config (LED target) # -CONFIG_NFC_DEVICES=y -CONFIG_PN544_NFC=m # CONFIG_ACCESSIBILITY is not set CONFIG_INFINIBAND=m CONFIG_INFINIBAND_USER_MAD=m @@ -4494,7 +4644,6 @@ CONFIG_EDAC=y CONFIG_EDAC_DECODE_MCE=m # CONFIG_EDAC_MCE_INJ is not set CONFIG_EDAC_MM_EDAC=m -CONFIG_EDAC_MCE=y CONFIG_EDAC_AMD64=m # CONFIG_EDAC_AMD64_ERROR_INJECTION is not set CONFIG_EDAC_E752X=m @@ -4507,6 +4656,7 @@ CONFIG_EDAC_I7CORE=m CONFIG_EDAC_I5000=m CONFIG_EDAC_I5100=m CONFIG_EDAC_I7300=m +CONFIG_EDAC_SBRIDGE=m CONFIG_RTC_LIB=y CONFIG_RTC_CLASS=y CONFIG_RTC_HCTOSYS=y @@ -4614,11 +4764,22 @@ CONFIG_UIO_AEC=m CONFIG_UIO_SERCOS3=m CONFIG_UIO_PCI_GENERIC=m CONFIG_UIO_NETX=m +CONFIG_VIRTIO=m +CONFIG_VIRTIO_RING=m + +# +# Virtio drivers +# +# CONFIG_VIRTIO_PCI is not set +# CONFIG_VIRTIO_BALLOON is not set +CONFIG_VIRTIO_MMIO=m # # Xen driver support # CONFIG_XEN_BALLOON=y +CONFIG_XEN_SELFBALLOONING=y +CONFIG_XEN_BALLOON_MEMORY_HOTPLUG=y CONFIG_XEN_SCRUB_PAGES=y CONFIG_XEN_DEV_EVTCHN=m CONFIG_XEN_BACKEND=y @@ -4628,25 +4789,14 @@ CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_XENBUS_FRONTEND=y CONFIG_XEN_GNTDEV=m CONFIG_XEN_GRANT_DEV_ALLOC=m -CONFIG_XEN_PLATFORM_PCI=m CONFIG_SWIOTLB_XEN=y +CONFIG_XEN_TMEM=y +CONFIG_XEN_PCIDEV_BACKEND=m +CONFIG_XEN_PRIVCMD=y +CONFIG_CPU_FREQ_GOV_XEN=m CONFIG_STAGING=y -CONFIG_STALLION=m -CONFIG_ISTALLION=m -CONFIG_DIGIEPCA=m -CONFIG_RISCOM8=m -CONFIG_SPECIALIX=m -CONFIG_COMPUTONE=m CONFIG_ET131X=m -# CONFIG_ET131X_DEBUG is not set CONFIG_SLICOSS=m -# CONFIG_VIDEO_GO7007 is not set -CONFIG_VIDEO_CX25821=m -CONFIG_VIDEO_CX25821_ALSA=m -CONFIG_VIDEO_TM6000=m -CONFIG_VIDEO_TM6000_ALSA=m -CONFIG_VIDEO_TM6000_DVB=m -CONFIG_DVB_CXD2099=m CONFIG_USBIP_CORE=m CONFIG_USBIP_VHCI_HCD=m CONFIG_USBIP_HOST=m @@ -4654,10 +4804,6 @@ CONFIG_USBIP_HOST=m CONFIG_W35UND=m CONFIG_PRISM2_USB=m CONFIG_ECHO=m -CONFIG_BRCMUTIL=m -CONFIG_BRCMSMAC=m -# CONFIG_BRCMFMAC is not set -# CONFIG_BRCMDBG is not set # CONFIG_COMEDI is not set CONFIG_ASUS_OLED=m CONFIG_PANEL=m @@ -4671,10 +4817,11 @@ CONFIG_R8712U=m CONFIG_R8712_AP=y CONFIG_RTS_PSTOR=m # CONFIG_RTS_PSTOR_DEBUG is not set +CONFIG_RTS5139=m +# CONFIG_RTS5139_DEBUG is not set CONFIG_TRANZPORT=m CONFIG_POHMELFS=m # CONFIG_POHMELFS_DEBUG is not set -CONFIG_POHMELFS_CRYPTO=y CONFIG_IDE_PHISON=m CONFIG_LINE6_USB=m # CONFIG_LINE6_USB_DEBUG is not set @@ -4683,7 +4830,6 @@ CONFIG_LINE6_USB=m # CONFIG_LINE6_USB_DUMP_PCM is not set # CONFIG_LINE6_USB_RAW is not set # CONFIG_LINE6_USB_IMPULSE_RESPONSE is not set -# CONFIG_DRM_VMWGFX is not set CONFIG_DRM_NOUVEAU=m CONFIG_DRM_NOUVEAU_BACKLIGHT=y # CONFIG_DRM_NOUVEAU_DEBUG is not set @@ -4697,7 +4843,6 @@ CONFIG_USB_SERIAL_QUATECH2=m CONFIG_USB_SERIAL_QUATECH_USB2=m CONFIG_VT6655=m CONFIG_VT6656=m -# CONFIG_HYPERV is not set CONFIG_VME_BUS=m # @@ -4717,7 +4862,7 @@ CONFIG_VME_USER=m CONFIG_VMIVME_7805=m CONFIG_DX_SEP=m CONFIG_IIO=m -CONFIG_IIO_RING_BUFFER=y +CONFIG_IIO_BUFFER=y CONFIG_IIO_SW_RING=m CONFIG_IIO_KFIFO_BUF=m CONFIG_IIO_TRIGGER=y @@ -4739,13 +4884,10 @@ CONFIG_LIS3L02DQ_BUF_KFIFO=y CONFIG_SCA3000=m # -# Analog to digital convertors +# Analog to digital converters # -CONFIG_AD7150=m -CONFIG_AD7152=m CONFIG_AD7291=m CONFIG_AD7298=m -CONFIG_AD7314=m CONFIG_AD7606=m CONFIG_AD7606_IFACE_PARALLEL=m CONFIG_AD7606_IFACE_SPI=m @@ -4754,28 +4896,39 @@ CONFIG_AD799X_RING_BUFFER=y CONFIG_AD7476=m CONFIG_AD7887=m CONFIG_AD7780=m -CONFIG_AD7745=m +CONFIG_AD7793=m CONFIG_AD7816=m -CONFIG_ADT75=m +CONFIG_AD7192=m CONFIG_ADT7310=m CONFIG_ADT7410=m +CONFIG_AD7280=m CONFIG_MAX1363=m CONFIG_MAX1363_RING_BUFFER=y # -# Analog digital bi-direction convertors +# Analog digital bi-direction converters # CONFIG_ADT7316=m CONFIG_ADT7316_SPI=m CONFIG_ADT7316_I2C=m # -# Digital to analog convertors +# Capacitance to digital converters +# +CONFIG_AD7150=m +CONFIG_AD7152=m +CONFIG_AD7746=m + +# +# Digital to analog converters # +CONFIG_AD5064=m +CONFIG_AD5360=m CONFIG_AD5624R_SPI=m CONFIG_AD5446=m CONFIG_AD5504=m CONFIG_AD5791=m +CONFIG_AD5686=m CONFIG_MAX517=m # @@ -4798,6 +4951,11 @@ CONFIG_ADIS16130=m CONFIG_ADIS16260=m CONFIG_ADXRS450=m +# +# Network Analyzer, Impedance Converters +# +CONFIG_AD5933=m + # # Inertial measurement units # @@ -4831,11 +4989,8 @@ CONFIG_ADE7854_SPI=m # Resolver to digital converters # CONFIG_AD2S90=m -CONFIG_AD2S120X=m +CONFIG_AD2S1200=m CONFIG_AD2S1210=m -# CONFIG_AD2S1210_GPIO_INPUT is not set -# CONFIG_AD2S1210_GPIO_OUTPUT is not set -CONFIG_AD2S1210_GPIO_NONE=y # # Triggers - standalone @@ -4843,6 +4998,9 @@ CONFIG_AD2S1210_GPIO_NONE=y CONFIG_IIO_PERIODIC_RTC_TRIGGER=m CONFIG_IIO_GPIO_TRIGGER=m CONFIG_IIO_SYSFS_TRIGGER=m +CONFIG_IIO_SIMPLE_DUMMY=m +# CONFIG_IIO_SIMPLE_DUMMY_EVENTS is not set +# CONFIG_IIO_SIMPLE_DUMMY_BUFFER is not set CONFIG_XVMALLOC=y CONFIG_ZRAM=m # CONFIG_ZRAM_DEBUG is not set @@ -4850,48 +5008,12 @@ CONFIG_ZRAM=m CONFIG_WLAGS49_H2=m CONFIG_WLAGS49_H25=m CONFIG_FB_SM7XX=m -CONFIG_VIDEO_DT3155=m -CONFIG_DT3155_CCIR=y CONFIG_CRYSTALHD=m CONFIG_CXT1E1=m # CONFIG_SBE_PMCC4_NCOMM is not set CONFIG_FB_XGI=m -CONFIG_LIRC_STAGING=y -CONFIG_LIRC_BT829=m -CONFIG_LIRC_IGORPLUGUSB=m -CONFIG_LIRC_IMON=m -CONFIG_LIRC_PARALLEL=m -CONFIG_LIRC_SASEM=m -CONFIG_LIRC_SERIAL=m -CONFIG_LIRC_SERIAL_TRANSMITTER=y -CONFIG_LIRC_SIR=m -CONFIG_LIRC_TTUSBIR=m -CONFIG_LIRC_ZILOG=m -CONFIG_EASYCAP=m -CONFIG_EASYCAP_SND=y -# CONFIG_EASYCAP_OSS is not set -# CONFIG_EASYCAP_DEBUG is not set -CONFIG_SOLO6X10=m CONFIG_ACPI_QUICKSTART=m -CONFIG_MACH_NO_WESTBRIDGE=y CONFIG_SBE_2T3E3=m -CONFIG_ATH6K_LEGACY=m -CONFIG_AR600x_SD31_XXX=y -# CONFIG_AR600x_WB31_XXX is not set -# CONFIG_AR600x_SD32_XXX is not set -# CONFIG_AR600x_CUSTOM_XXX is not set -CONFIG_ATH6KL_ENABLE_COEXISTENCE=y -CONFIG_AR600x_DUAL_ANTENNA=y -# CONFIG_AR600x_SINGLE_ANTENNA is not set -# CONFIG_AR600x_BT_QCOM is not set -# CONFIG_AR600x_BT_CSR is not set -CONFIG_AR600x_BT_AR3001=y -CONFIG_ATH6KL_HCI_BRIDGE=y -# CONFIG_ATH6KL_CONFIG_GPIO_BT_RESET is not set -# CONFIG_ATH6KL_HTC_RAW_INTERFACE is not set -# CONFIG_ATH6KL_VIRTUAL_SCATTER_GATHER is not set -# CONFIG_ATH6KL_SKIP_ABI_VERSION_CHECK is not set -# CONFIG_ATH6KL_DEBUG is not set CONFIG_USB_ENESTORAGE=m CONFIG_BCM_WIMAX=m CONFIG_FT1000=m @@ -4905,12 +5027,31 @@ CONFIG_FT1000_PCMCIA=m CONFIG_TOUCHSCREEN_CLEARPAD_TM1217=m CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=m CONFIG_DRM_PSB=m - -# -# Altera FPGA firmware download module -# -CONFIG_ALTERA_STAPL=m +CONFIG_DRM_PSB_MRST=y +CONFIG_DRM_PSB_MFLD=y +CONFIG_DRM_PSB_CDV=y CONFIG_INTEL_MEI=m +CONFIG_STAGING_MEDIA=y +CONFIG_DVB_AS102=m +CONFIG_DVB_CXD2099=m +CONFIG_VIDEO_DT3155=m +CONFIG_DT3155_CCIR=y +CONFIG_DT3155_STREAMING=y +CONFIG_EASYCAP=m +# CONFIG_EASYCAP_DEBUG is not set +# CONFIG_VIDEO_GO7007 is not set +CONFIG_SOLO6X10=m +CONFIG_LIRC_STAGING=y +CONFIG_LIRC_BT829=m +CONFIG_LIRC_IGORPLUGUSB=m +CONFIG_LIRC_IMON=m +CONFIG_LIRC_PARALLEL=m +CONFIG_LIRC_SASEM=m +CONFIG_LIRC_SERIAL=m +CONFIG_LIRC_SERIAL_TRANSMITTER=y +CONFIG_LIRC_SIR=m +CONFIG_LIRC_TTUSBIR=m +CONFIG_LIRC_ZILOG=m CONFIG_X86_PLATFORM_DEVICES=y CONFIG_ACER_WMI=m CONFIG_ACERHDF=m @@ -4954,6 +5095,38 @@ CONFIG_XO15_EBOOK=m CONFIG_SAMSUNG_LAPTOP=m CONFIG_MXM_WMI=m CONFIG_INTEL_OAKTRAIL=m +CONFIG_SAMSUNG_Q10=m + +# +# Hardware Spinlock drivers +# +CONFIG_CLKEVT_I8253=y +CONFIG_I8253_LOCK=y +CONFIG_CLKBLD_I8253=y +CONFIG_IOMMU_API=y +CONFIG_IOMMU_SUPPORT=y +CONFIG_AMD_IOMMU=y +# CONFIG_AMD_IOMMU_STATS is not set +CONFIG_DMAR_TABLE=y +CONFIG_INTEL_IOMMU=y +CONFIG_INTEL_IOMMU_DEFAULT_ON=y +CONFIG_INTEL_IOMMU_FLOPPY_WA=y +CONFIG_IRQ_REMAP=y +CONFIG_VIRT_DRIVERS=y +# CONFIG_HYPERV is not set +CONFIG_PM_DEVFREQ=y + +# +# DEVFREQ Governors +# +CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y +CONFIG_DEVFREQ_GOV_PERFORMANCE=y +CONFIG_DEVFREQ_GOV_POWERSAVE=y +CONFIG_DEVFREQ_GOV_USERSPACE=y + +# +# DEVFREQ Drivers +# # # Firmware Drivers @@ -5124,8 +5297,10 @@ CONFIG_LOGFS=m CONFIG_CRAMFS=m CONFIG_SQUASHFS=m CONFIG_SQUASHFS_XATTR=y +CONFIG_SQUASHFS_ZLIB=y CONFIG_SQUASHFS_LZO=y CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_4K_DEVBLK_SIZE=y # CONFIG_SQUASHFS_EMBEDDED is not set CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 CONFIG_VXFS_FS=m @@ -5146,6 +5321,7 @@ CONFIG_UFS_FS_WRITE=y # CONFIG_UFS_DEBUG is not set CONFIG_EXOFS_FS=m # CONFIG_EXOFS_DEBUG is not set +CONFIG_ORE=m CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=m CONFIG_NFS_V3=y @@ -5157,7 +5333,6 @@ CONFIG_NFS_FSCACHE=y CONFIG_NFS_USE_KERNEL_DNS=y # CONFIG_NFS_USE_NEW_IDMAPPER is not set CONFIG_NFSD=m -CONFIG_NFSD_DEPRECATED=y CONFIG_NFSD_V2_ACL=y CONFIG_NFSD_V3=y CONFIG_NFSD_V3_ACL=y @@ -5300,14 +5475,13 @@ CONFIG_TIMER_STATS=y # CONFIG_PROVE_LOCKING is not set # CONFIG_SPARSE_RCU_POINTER is not set # CONFIG_LOCK_STAT is not set -# CONFIG_DEBUG_SPINLOCK_SLEEP is not set +# CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set CONFIG_STACKTRACE=y # CONFIG_DEBUG_STACK_USAGE is not set # CONFIG_DEBUG_KOBJECT is not set CONFIG_DEBUG_BUGVERBOSE=y -CONFIG_DEBUG_INFO=y -# CONFIG_DEBUG_INFO_REDUCED is not set +# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_VM is not set # CONFIG_DEBUG_VIRTUAL is not set # CONFIG_DEBUG_WRITECOUNT is not set @@ -5416,6 +5590,7 @@ CONFIG_ENCRYPTED_KEYS=m # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set CONFIG_SECURITYFS=y +CONFIG_INTEL_TXT=y CONFIG_DEFAULT_SECURITY_DAC=y CONFIG_DEFAULT_SECURITY="" CONFIG_XOR_BLOCKS=m @@ -5445,6 +5620,7 @@ CONFIG_CRYPTO_PCOMP=m CONFIG_CRYPTO_PCOMP2=y CONFIG_CRYPTO_MANAGER=y CONFIG_CRYPTO_MANAGER2=y +CONFIG_CRYPTO_USER=m CONFIG_CRYPTO_MANAGER_DISABLE_TESTS=y CONFIG_CRYPTO_GF128MUL=m CONFIG_CRYPTO_NULL=m @@ -5493,6 +5669,7 @@ CONFIG_CRYPTO_RMD160=m CONFIG_CRYPTO_RMD256=m CONFIG_CRYPTO_RMD320=m CONFIG_CRYPTO_SHA1=m +CONFIG_CRYPTO_SHA1_SSSE3=m CONFIG_CRYPTO_SHA256=m CONFIG_CRYPTO_SHA512=m CONFIG_CRYPTO_TGR192=m @@ -5508,6 +5685,8 @@ CONFIG_CRYPTO_AES_NI_INTEL=m CONFIG_CRYPTO_ANUBIS=m CONFIG_CRYPTO_ARC4=m CONFIG_CRYPTO_BLOWFISH=m +CONFIG_CRYPTO_BLOWFISH_COMMON=m +CONFIG_CRYPTO_BLOWFISH_X86_64=m CONFIG_CRYPTO_CAMELLIA=m CONFIG_CRYPTO_CAST5=m CONFIG_CRYPTO_CAST6=m @@ -5522,6 +5701,7 @@ CONFIG_CRYPTO_TEA=m # CONFIG_CRYPTO_TWOFISH is not set CONFIG_CRYPTO_TWOFISH_COMMON=m CONFIG_CRYPTO_TWOFISH_X86_64=m +CONFIG_CRYPTO_TWOFISH_X86_64_3WAY=m # # Compression @@ -5540,14 +5720,10 @@ CONFIG_CRYPTO_HW=y CONFIG_CRYPTO_DEV_PADLOCK=m CONFIG_CRYPTO_DEV_PADLOCK_AES=m CONFIG_CRYPTO_DEV_PADLOCK_SHA=m -CONFIG_CRYPTO_DEV_HIFN_795X=m -CONFIG_CRYPTO_DEV_HIFN_795X_RNG=y CONFIG_HAVE_KVM=y CONFIG_VIRTUALIZATION=y # CONFIG_KVM is not set # CONFIG_VHOST_NET is not set -# CONFIG_VIRTIO_PCI is not set -# CONFIG_VIRTIO_BALLOON is not set CONFIG_BINARY_PRINTF=y # @@ -5563,9 +5739,10 @@ CONFIG_CRC_ITU_T=m CONFIG_CRC32=y CONFIG_CRC7=m CONFIG_LIBCRC32C=m +CONFIG_CRC8=m CONFIG_ZLIB_INFLATE=y CONFIG_ZLIB_DEFLATE=m -CONFIG_LZO_COMPRESS=m +CONFIG_LZO_COMPRESS=y CONFIG_LZO_DECOMPRESS=y CONFIG_XZ_DEC=y CONFIG_XZ_DEC_X86=y @@ -5597,3 +5774,4 @@ CONFIG_CPU_RMAP=y CONFIG_NLATTR=y CONFIG_LRU_CACHE=m CONFIG_AVERAGE=y +CONFIG_CORDIC=m diff --git a/patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch b/patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch new file mode 100644 index 0000000..c2881ef --- /dev/null +++ b/patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch @@ -0,0 +1,967 @@ +From d8414d3c157dc1f83e73c17447ba41fe5afa9d3d Mon Sep 17 00:00:00 2001 +From: Bastian Blank +Date: Fri, 16 Dec 2011 11:34:33 -0500 +Subject: xen: Add privcmd device driver + +Access to arbitrary hypercalls is currently provided via xenfs. This +adds a standard character device to handle this. The support in xenfs +remains for backward compatibility and uses the device driver code. + +Signed-off-by: Bastian Blank +Acked-by: Ian Campbell +Signed-off-by: Konrad Rzeszutek Wilk +--- + drivers/xen/Kconfig | 7 + + drivers/xen/Makefile | 2 + + drivers/xen/privcmd.c | 437 +++++++++++++++++++++++++++++++++++++++++++ + drivers/xen/privcmd.h | 3 + + drivers/xen/xenfs/Makefile | 2 +- + drivers/xen/xenfs/privcmd.c | 400 --------------------------------------- + drivers/xen/xenfs/super.c | 3 +- + drivers/xen/xenfs/xenfs.h | 1 - + 8 files changed, 452 insertions(+), 403 deletions(-) + create mode 100644 drivers/xen/privcmd.c + create mode 100644 drivers/xen/privcmd.h + delete mode 100644 drivers/xen/xenfs/privcmd.c + +diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig +index 8795480..a1ced52 100644 +--- a/drivers/xen/Kconfig ++++ b/drivers/xen/Kconfig +@@ -86,6 +86,7 @@ config XEN_BACKEND + + config XENFS + tristate "Xen filesystem" ++ select XEN_PRIVCMD + default y + help + The xen filesystem provides a way for domains to share +@@ -171,4 +172,10 @@ config XEN_PCIDEV_BACKEND + xen-pciback.hide=(03:00.0)(04:00.0) + + If in doubt, say m. ++ ++config XEN_PRIVCMD ++ tristate ++ depends on XEN ++ default m ++ + endmenu +diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile +index 974fffd..aa31337 100644 +--- a/drivers/xen/Makefile ++++ b/drivers/xen/Makefile +@@ -19,7 +19,9 @@ obj-$(CONFIG_XEN_TMEM) += tmem.o + obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o + obj-$(CONFIG_XEN_DOM0) += pci.o + obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ ++obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o + + xen-evtchn-y := evtchn.o + xen-gntdev-y := gntdev.o + xen-gntalloc-y := gntalloc.o ++xen-privcmd-y := privcmd.o +diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c +new file mode 100644 +index 0000000..4e8d3da +--- /dev/null ++++ b/drivers/xen/privcmd.c +@@ -0,0 +1,437 @@ ++/****************************************************************************** ++ * privcmd.c ++ * ++ * Interface to privileged domain-0 commands. ++ * ++ * Copyright (c) 2002-2004, K A Fraser, B Dragovic ++ */ ++ ++#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 "privcmd.h" ++ ++MODULE_LICENSE("GPL"); ++ ++#ifndef HAVE_ARCH_PRIVCMD_MMAP ++static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma); ++#endif ++ ++static long privcmd_ioctl_hypercall(void __user *udata) ++{ ++ struct privcmd_hypercall hypercall; ++ long ret; ++ ++ if (copy_from_user(&hypercall, udata, sizeof(hypercall))) ++ return -EFAULT; ++ ++ ret = privcmd_call(hypercall.op, ++ hypercall.arg[0], hypercall.arg[1], ++ hypercall.arg[2], hypercall.arg[3], ++ hypercall.arg[4]); ++ ++ return ret; ++} ++ ++static void free_page_list(struct list_head *pages) ++{ ++ struct page *p, *n; ++ ++ list_for_each_entry_safe(p, n, pages, lru) ++ __free_page(p); ++ ++ INIT_LIST_HEAD(pages); ++} ++ ++/* ++ * Given an array of items in userspace, return a list of pages ++ * containing the data. If copying fails, either because of memory ++ * allocation failure or a problem reading user memory, return an ++ * error code; its up to the caller to dispose of any partial list. ++ */ ++static int gather_array(struct list_head *pagelist, ++ unsigned nelem, size_t size, ++ void __user *data) ++{ ++ unsigned pageidx; ++ void *pagedata; ++ int ret; ++ ++ if (size > PAGE_SIZE) ++ return 0; ++ ++ pageidx = PAGE_SIZE; ++ pagedata = NULL; /* quiet, gcc */ ++ while (nelem--) { ++ if (pageidx > PAGE_SIZE-size) { ++ struct page *page = alloc_page(GFP_KERNEL); ++ ++ ret = -ENOMEM; ++ if (page == NULL) ++ goto fail; ++ ++ pagedata = page_address(page); ++ ++ list_add_tail(&page->lru, pagelist); ++ pageidx = 0; ++ } ++ ++ ret = -EFAULT; ++ if (copy_from_user(pagedata + pageidx, data, size)) ++ goto fail; ++ ++ data += size; ++ pageidx += size; ++ } ++ ++ ret = 0; ++ ++fail: ++ return ret; ++} ++ ++/* ++ * Call function "fn" on each element of the array fragmented ++ * over a list of pages. ++ */ ++static int traverse_pages(unsigned nelem, size_t size, ++ struct list_head *pos, ++ int (*fn)(void *data, void *state), ++ void *state) ++{ ++ void *pagedata; ++ unsigned pageidx; ++ int ret = 0; ++ ++ BUG_ON(size > PAGE_SIZE); ++ ++ pageidx = PAGE_SIZE; ++ pagedata = NULL; /* hush, gcc */ ++ ++ while (nelem--) { ++ if (pageidx > PAGE_SIZE-size) { ++ struct page *page; ++ pos = pos->next; ++ page = list_entry(pos, struct page, lru); ++ pagedata = page_address(page); ++ pageidx = 0; ++ } ++ ++ ret = (*fn)(pagedata + pageidx, state); ++ if (ret) ++ break; ++ pageidx += size; ++ } ++ ++ return ret; ++} ++ ++struct mmap_mfn_state { ++ unsigned long va; ++ struct vm_area_struct *vma; ++ domid_t domain; ++}; ++ ++static int mmap_mfn_range(void *data, void *state) ++{ ++ struct privcmd_mmap_entry *msg = data; ++ struct mmap_mfn_state *st = state; ++ struct vm_area_struct *vma = st->vma; ++ int rc; ++ ++ /* Do not allow range to wrap the address space. */ ++ if ((msg->npages > (LONG_MAX >> PAGE_SHIFT)) || ++ ((unsigned long)(msg->npages << PAGE_SHIFT) >= -st->va)) ++ return -EINVAL; ++ ++ /* Range chunks must be contiguous in va space. */ ++ if ((msg->va != st->va) || ++ ((msg->va+(msg->npages< vma->vm_end)) ++ return -EINVAL; ++ ++ rc = xen_remap_domain_mfn_range(vma, ++ msg->va & PAGE_MASK, ++ msg->mfn, msg->npages, ++ vma->vm_page_prot, ++ st->domain); ++ if (rc < 0) ++ return rc; ++ ++ st->va += msg->npages << PAGE_SHIFT; ++ ++ return 0; ++} ++ ++static long privcmd_ioctl_mmap(void __user *udata) ++{ ++ struct privcmd_mmap mmapcmd; ++ struct mm_struct *mm = current->mm; ++ struct vm_area_struct *vma; ++ int rc; ++ LIST_HEAD(pagelist); ++ struct mmap_mfn_state state; ++ ++ if (!xen_initial_domain()) ++ return -EPERM; ++ ++ if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd))) ++ return -EFAULT; ++ ++ rc = gather_array(&pagelist, ++ mmapcmd.num, sizeof(struct privcmd_mmap_entry), ++ mmapcmd.entry); ++ ++ if (rc || list_empty(&pagelist)) ++ goto out; ++ ++ down_write(&mm->mmap_sem); ++ ++ { ++ struct page *page = list_first_entry(&pagelist, ++ struct page, lru); ++ struct privcmd_mmap_entry *msg = page_address(page); ++ ++ vma = find_vma(mm, msg->va); ++ rc = -EINVAL; ++ ++ if (!vma || (msg->va != vma->vm_start) || ++ !privcmd_enforce_singleshot_mapping(vma)) ++ goto out_up; ++ } ++ ++ state.va = vma->vm_start; ++ state.vma = vma; ++ state.domain = mmapcmd.dom; ++ ++ rc = traverse_pages(mmapcmd.num, sizeof(struct privcmd_mmap_entry), ++ &pagelist, ++ mmap_mfn_range, &state); ++ ++ ++out_up: ++ up_write(&mm->mmap_sem); ++ ++out: ++ free_page_list(&pagelist); ++ ++ return rc; ++} ++ ++struct mmap_batch_state { ++ domid_t domain; ++ unsigned long va; ++ struct vm_area_struct *vma; ++ int err; ++ ++ xen_pfn_t __user *user; ++}; ++ ++static int mmap_batch_fn(void *data, void *state) ++{ ++ xen_pfn_t *mfnp = data; ++ struct mmap_batch_state *st = state; ++ ++ if (xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, ++ st->vma->vm_page_prot, st->domain) < 0) { ++ *mfnp |= 0xf0000000U; ++ st->err++; ++ } ++ st->va += PAGE_SIZE; ++ ++ return 0; ++} ++ ++static int mmap_return_errors(void *data, void *state) ++{ ++ xen_pfn_t *mfnp = data; ++ struct mmap_batch_state *st = state; ++ ++ return put_user(*mfnp, st->user++); ++} ++ ++static struct vm_operations_struct privcmd_vm_ops; ++ ++static long privcmd_ioctl_mmap_batch(void __user *udata) ++{ ++ int ret; ++ struct privcmd_mmapbatch m; ++ struct mm_struct *mm = current->mm; ++ struct vm_area_struct *vma; ++ unsigned long nr_pages; ++ LIST_HEAD(pagelist); ++ struct mmap_batch_state state; ++ ++ if (!xen_initial_domain()) ++ return -EPERM; ++ ++ if (copy_from_user(&m, udata, sizeof(m))) ++ return -EFAULT; ++ ++ nr_pages = m.num; ++ if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) ++ return -EINVAL; ++ ++ ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), ++ m.arr); ++ ++ if (ret || list_empty(&pagelist)) ++ goto out; ++ ++ down_write(&mm->mmap_sem); ++ ++ vma = find_vma(mm, m.addr); ++ ret = -EINVAL; ++ if (!vma || ++ vma->vm_ops != &privcmd_vm_ops || ++ (m.addr != vma->vm_start) || ++ ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || ++ !privcmd_enforce_singleshot_mapping(vma)) { ++ up_write(&mm->mmap_sem); ++ goto out; ++ } ++ ++ state.domain = m.dom; ++ state.vma = vma; ++ state.va = m.addr; ++ state.err = 0; ++ ++ ret = traverse_pages(m.num, sizeof(xen_pfn_t), ++ &pagelist, mmap_batch_fn, &state); ++ ++ up_write(&mm->mmap_sem); ++ ++ if (state.err > 0) { ++ state.user = m.arr; ++ ret = traverse_pages(m.num, sizeof(xen_pfn_t), ++ &pagelist, ++ mmap_return_errors, &state); ++ } ++ ++out: ++ free_page_list(&pagelist); ++ ++ return ret; ++} ++ ++static long privcmd_ioctl(struct file *file, ++ unsigned int cmd, unsigned long data) ++{ ++ int ret = -ENOSYS; ++ void __user *udata = (void __user *) data; ++ ++ switch (cmd) { ++ case IOCTL_PRIVCMD_HYPERCALL: ++ ret = privcmd_ioctl_hypercall(udata); ++ break; ++ ++ case IOCTL_PRIVCMD_MMAP: ++ ret = privcmd_ioctl_mmap(udata); ++ break; ++ ++ case IOCTL_PRIVCMD_MMAPBATCH: ++ ret = privcmd_ioctl_mmap_batch(udata); ++ break; ++ ++ default: ++ ret = -EINVAL; ++ break; ++ } ++ ++ return ret; ++} ++ ++#ifndef HAVE_ARCH_PRIVCMD_MMAP ++static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf) ++{ ++ printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n", ++ vma, vma->vm_start, vma->vm_end, ++ vmf->pgoff, vmf->virtual_address); ++ ++ return VM_FAULT_SIGBUS; ++} ++ ++static struct vm_operations_struct privcmd_vm_ops = { ++ .fault = privcmd_fault ++}; ++ ++static int privcmd_mmap(struct file *file, struct vm_area_struct *vma) ++{ ++ /* Unsupported for auto-translate guests. */ ++ if (xen_feature(XENFEAT_auto_translated_physmap)) ++ return -ENOSYS; ++ ++ /* DONTCOPY is essential for Xen because copy_page_range doesn't know ++ * how to recreate these mappings */ ++ vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP; ++ vma->vm_ops = &privcmd_vm_ops; ++ vma->vm_private_data = NULL; ++ ++ return 0; ++} ++ ++static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma) ++{ ++ return (xchg(&vma->vm_private_data, (void *)1) == NULL); ++} ++#endif ++ ++const struct file_operations xen_privcmd_fops = { ++ .owner = THIS_MODULE, ++ .unlocked_ioctl = privcmd_ioctl, ++ .mmap = privcmd_mmap, ++}; ++EXPORT_SYMBOL_GPL(xen_privcmd_fops); ++ ++static struct miscdevice privcmd_dev = { ++ .minor = MISC_DYNAMIC_MINOR, ++ .name = "xen/privcmd", ++ .fops = &xen_privcmd_fops, ++}; ++ ++static int __init privcmd_init(void) ++{ ++ int err; ++ ++ if (!xen_domain()) ++ return -ENODEV; ++ ++ err = misc_register(&privcmd_dev); ++ if (err != 0) { ++ printk(KERN_ERR "Could not register Xen privcmd device\n"); ++ return err; ++ } ++ return 0; ++} ++ ++static void __exit privcmd_exit(void) ++{ ++ misc_deregister(&privcmd_dev); ++} ++ ++module_init(privcmd_init); ++module_exit(privcmd_exit); +diff --git a/drivers/xen/privcmd.h b/drivers/xen/privcmd.h +new file mode 100644 +index 0000000..14facae +--- /dev/null ++++ b/drivers/xen/privcmd.h +@@ -0,0 +1,3 @@ ++#include ++ ++extern const struct file_operations xen_privcmd_fops; +diff --git a/drivers/xen/xenfs/Makefile b/drivers/xen/xenfs/Makefile +index 4fde944..5d45ff1 100644 +--- a/drivers/xen/xenfs/Makefile ++++ b/drivers/xen/xenfs/Makefile +@@ -1,4 +1,4 @@ + obj-$(CONFIG_XENFS) += xenfs.o + +-xenfs-y = super.o xenbus.o privcmd.o ++xenfs-y = super.o xenbus.o + xenfs-$(CONFIG_XEN_DOM0) += xenstored.o +diff --git a/drivers/xen/xenfs/privcmd.c b/drivers/xen/xenfs/privcmd.c +deleted file mode 100644 +index dbd3b16..0000000 +--- a/drivers/xen/xenfs/privcmd.c ++++ /dev/null +@@ -1,400 +0,0 @@ +-/****************************************************************************** +- * privcmd.c +- * +- * Interface to privileged domain-0 commands. +- * +- * Copyright (c) 2002-2004, K A Fraser, B Dragovic +- */ +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +-#include +-#include +-#include +-#include +- +-#ifndef HAVE_ARCH_PRIVCMD_MMAP +-static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma); +-#endif +- +-static long privcmd_ioctl_hypercall(void __user *udata) +-{ +- struct privcmd_hypercall hypercall; +- long ret; +- +- if (copy_from_user(&hypercall, udata, sizeof(hypercall))) +- return -EFAULT; +- +- ret = privcmd_call(hypercall.op, +- hypercall.arg[0], hypercall.arg[1], +- hypercall.arg[2], hypercall.arg[3], +- hypercall.arg[4]); +- +- return ret; +-} +- +-static void free_page_list(struct list_head *pages) +-{ +- struct page *p, *n; +- +- list_for_each_entry_safe(p, n, pages, lru) +- __free_page(p); +- +- INIT_LIST_HEAD(pages); +-} +- +-/* +- * Given an array of items in userspace, return a list of pages +- * containing the data. If copying fails, either because of memory +- * allocation failure or a problem reading user memory, return an +- * error code; its up to the caller to dispose of any partial list. +- */ +-static int gather_array(struct list_head *pagelist, +- unsigned nelem, size_t size, +- void __user *data) +-{ +- unsigned pageidx; +- void *pagedata; +- int ret; +- +- if (size > PAGE_SIZE) +- return 0; +- +- pageidx = PAGE_SIZE; +- pagedata = NULL; /* quiet, gcc */ +- while (nelem--) { +- if (pageidx > PAGE_SIZE-size) { +- struct page *page = alloc_page(GFP_KERNEL); +- +- ret = -ENOMEM; +- if (page == NULL) +- goto fail; +- +- pagedata = page_address(page); +- +- list_add_tail(&page->lru, pagelist); +- pageidx = 0; +- } +- +- ret = -EFAULT; +- if (copy_from_user(pagedata + pageidx, data, size)) +- goto fail; +- +- data += size; +- pageidx += size; +- } +- +- ret = 0; +- +-fail: +- return ret; +-} +- +-/* +- * Call function "fn" on each element of the array fragmented +- * over a list of pages. +- */ +-static int traverse_pages(unsigned nelem, size_t size, +- struct list_head *pos, +- int (*fn)(void *data, void *state), +- void *state) +-{ +- void *pagedata; +- unsigned pageidx; +- int ret = 0; +- +- BUG_ON(size > PAGE_SIZE); +- +- pageidx = PAGE_SIZE; +- pagedata = NULL; /* hush, gcc */ +- +- while (nelem--) { +- if (pageidx > PAGE_SIZE-size) { +- struct page *page; +- pos = pos->next; +- page = list_entry(pos, struct page, lru); +- pagedata = page_address(page); +- pageidx = 0; +- } +- +- ret = (*fn)(pagedata + pageidx, state); +- if (ret) +- break; +- pageidx += size; +- } +- +- return ret; +-} +- +-struct mmap_mfn_state { +- unsigned long va; +- struct vm_area_struct *vma; +- domid_t domain; +-}; +- +-static int mmap_mfn_range(void *data, void *state) +-{ +- struct privcmd_mmap_entry *msg = data; +- struct mmap_mfn_state *st = state; +- struct vm_area_struct *vma = st->vma; +- int rc; +- +- /* Do not allow range to wrap the address space. */ +- if ((msg->npages > (LONG_MAX >> PAGE_SHIFT)) || +- ((unsigned long)(msg->npages << PAGE_SHIFT) >= -st->va)) +- return -EINVAL; +- +- /* Range chunks must be contiguous in va space. */ +- if ((msg->va != st->va) || +- ((msg->va+(msg->npages< vma->vm_end)) +- return -EINVAL; +- +- rc = xen_remap_domain_mfn_range(vma, +- msg->va & PAGE_MASK, +- msg->mfn, msg->npages, +- vma->vm_page_prot, +- st->domain); +- if (rc < 0) +- return rc; +- +- st->va += msg->npages << PAGE_SHIFT; +- +- return 0; +-} +- +-static long privcmd_ioctl_mmap(void __user *udata) +-{ +- struct privcmd_mmap mmapcmd; +- struct mm_struct *mm = current->mm; +- struct vm_area_struct *vma; +- int rc; +- LIST_HEAD(pagelist); +- struct mmap_mfn_state state; +- +- if (!xen_initial_domain()) +- return -EPERM; +- +- if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd))) +- return -EFAULT; +- +- rc = gather_array(&pagelist, +- mmapcmd.num, sizeof(struct privcmd_mmap_entry), +- mmapcmd.entry); +- +- if (rc || list_empty(&pagelist)) +- goto out; +- +- down_write(&mm->mmap_sem); +- +- { +- struct page *page = list_first_entry(&pagelist, +- struct page, lru); +- struct privcmd_mmap_entry *msg = page_address(page); +- +- vma = find_vma(mm, msg->va); +- rc = -EINVAL; +- +- if (!vma || (msg->va != vma->vm_start) || +- !privcmd_enforce_singleshot_mapping(vma)) +- goto out_up; +- } +- +- state.va = vma->vm_start; +- state.vma = vma; +- state.domain = mmapcmd.dom; +- +- rc = traverse_pages(mmapcmd.num, sizeof(struct privcmd_mmap_entry), +- &pagelist, +- mmap_mfn_range, &state); +- +- +-out_up: +- up_write(&mm->mmap_sem); +- +-out: +- free_page_list(&pagelist); +- +- return rc; +-} +- +-struct mmap_batch_state { +- domid_t domain; +- unsigned long va; +- struct vm_area_struct *vma; +- int err; +- +- xen_pfn_t __user *user; +-}; +- +-static int mmap_batch_fn(void *data, void *state) +-{ +- xen_pfn_t *mfnp = data; +- struct mmap_batch_state *st = state; +- +- if (xen_remap_domain_mfn_range(st->vma, st->va & PAGE_MASK, *mfnp, 1, +- st->vma->vm_page_prot, st->domain) < 0) { +- *mfnp |= 0xf0000000U; +- st->err++; +- } +- st->va += PAGE_SIZE; +- +- return 0; +-} +- +-static int mmap_return_errors(void *data, void *state) +-{ +- xen_pfn_t *mfnp = data; +- struct mmap_batch_state *st = state; +- +- return put_user(*mfnp, st->user++); +-} +- +-static struct vm_operations_struct privcmd_vm_ops; +- +-static long privcmd_ioctl_mmap_batch(void __user *udata) +-{ +- int ret; +- struct privcmd_mmapbatch m; +- struct mm_struct *mm = current->mm; +- struct vm_area_struct *vma; +- unsigned long nr_pages; +- LIST_HEAD(pagelist); +- struct mmap_batch_state state; +- +- if (!xen_initial_domain()) +- return -EPERM; +- +- if (copy_from_user(&m, udata, sizeof(m))) +- return -EFAULT; +- +- nr_pages = m.num; +- if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT))) +- return -EINVAL; +- +- ret = gather_array(&pagelist, m.num, sizeof(xen_pfn_t), +- m.arr); +- +- if (ret || list_empty(&pagelist)) +- goto out; +- +- down_write(&mm->mmap_sem); +- +- vma = find_vma(mm, m.addr); +- ret = -EINVAL; +- if (!vma || +- vma->vm_ops != &privcmd_vm_ops || +- (m.addr != vma->vm_start) || +- ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) || +- !privcmd_enforce_singleshot_mapping(vma)) { +- up_write(&mm->mmap_sem); +- goto out; +- } +- +- state.domain = m.dom; +- state.vma = vma; +- state.va = m.addr; +- state.err = 0; +- +- ret = traverse_pages(m.num, sizeof(xen_pfn_t), +- &pagelist, mmap_batch_fn, &state); +- +- up_write(&mm->mmap_sem); +- +- if (state.err > 0) { +- state.user = m.arr; +- ret = traverse_pages(m.num, sizeof(xen_pfn_t), +- &pagelist, +- mmap_return_errors, &state); +- } +- +-out: +- free_page_list(&pagelist); +- +- return ret; +-} +- +-static long privcmd_ioctl(struct file *file, +- unsigned int cmd, unsigned long data) +-{ +- int ret = -ENOSYS; +- void __user *udata = (void __user *) data; +- +- switch (cmd) { +- case IOCTL_PRIVCMD_HYPERCALL: +- ret = privcmd_ioctl_hypercall(udata); +- break; +- +- case IOCTL_PRIVCMD_MMAP: +- ret = privcmd_ioctl_mmap(udata); +- break; +- +- case IOCTL_PRIVCMD_MMAPBATCH: +- ret = privcmd_ioctl_mmap_batch(udata); +- break; +- +- default: +- ret = -EINVAL; +- break; +- } +- +- return ret; +-} +- +-#ifndef HAVE_ARCH_PRIVCMD_MMAP +-static int privcmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +-{ +- printk(KERN_DEBUG "privcmd_fault: vma=%p %lx-%lx, pgoff=%lx, uv=%p\n", +- vma, vma->vm_start, vma->vm_end, +- vmf->pgoff, vmf->virtual_address); +- +- return VM_FAULT_SIGBUS; +-} +- +-static struct vm_operations_struct privcmd_vm_ops = { +- .fault = privcmd_fault +-}; +- +-static int privcmd_mmap(struct file *file, struct vm_area_struct *vma) +-{ +- /* Unsupported for auto-translate guests. */ +- if (xen_feature(XENFEAT_auto_translated_physmap)) +- return -ENOSYS; +- +- /* DONTCOPY is essential for Xen because copy_page_range doesn't know +- * how to recreate these mappings */ +- vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP; +- vma->vm_ops = &privcmd_vm_ops; +- vma->vm_private_data = NULL; +- +- return 0; +-} +- +-static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma) +-{ +- return (xchg(&vma->vm_private_data, (void *)1) == NULL); +-} +-#endif +- +-const struct file_operations privcmd_file_ops = { +- .unlocked_ioctl = privcmd_ioctl, +- .mmap = privcmd_mmap, +-}; +diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c +index 1aa3897..a55fbf9 100644 +--- a/drivers/xen/xenfs/super.c ++++ b/drivers/xen/xenfs/super.c +@@ -16,6 +16,7 @@ + #include + + #include "xenfs.h" ++#include "../privcmd.h" + + #include + +@@ -84,7 +85,7 @@ static int xenfs_fill_super(struct super_block *sb, void *data, int silent) + [1] = {}, + { "xenbus", &xenbus_file_ops, S_IRUSR|S_IWUSR }, + { "capabilities", &capabilities_file_ops, S_IRUGO }, +- { "privcmd", &privcmd_file_ops, S_IRUSR|S_IWUSR }, ++ { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR }, + {""}, + }; + int rc; +diff --git a/drivers/xen/xenfs/xenfs.h b/drivers/xen/xenfs/xenfs.h +index b68aa62..5056306 100644 +--- a/drivers/xen/xenfs/xenfs.h ++++ b/drivers/xen/xenfs/xenfs.h +@@ -2,7 +2,6 @@ + #define _XENFS_XENBUS_H + + extern const struct file_operations xenbus_file_ops; +-extern const struct file_operations privcmd_file_ops; + extern const struct file_operations xsd_kva_file_ops; + extern const struct file_operations xsd_port_file_ops; + +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch b/patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch new file mode 100644 index 0000000..1a9eecb --- /dev/null +++ b/patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch @@ -0,0 +1,177 @@ +From 8fd04efb7e41da12d85ad382b7c7092fe832bebb Mon Sep 17 00:00:00 2001 +From: Tang Liang +Date: Fri, 9 Dec 2011 10:05:54 +0800 +Subject: x86, acpi, tboot: Have a ACPI os prepare sleep instead of calling + tboot_sleep. + +The ACPI suspend path makes a call to tboot_sleep right before +it writes the PM1A, PM1B values. We replace the direct call to +tboot via an registration callback similar to __acpi_register_gsi. + +CC: Thomas Gleixner +CC: "H. Peter Anvin" +CC: x86@kernel.org +CC: Len Brown +Acked-by: Joseph Cihula +CC: Shane Wang +CC: xen-devel@lists.xensource.com +CC: linux-pm@lists.linux-foundation.org +CC: tboot-devel@lists.sourceforge.net +CC: linux-acpi@vger.kernel.org +[v1: Added __attribute__ ((unused))] +[v2: Introduced a wrapper instead of changing tboot_sleep return values] +[v3: Added return value AE_CTRL_SKIP for acpi_os_sleep_prepare] +Signed-off-by: Tang Liang +[v1: Fix compile issues on IA64 and PPC64] +[v2: Fix where __acpi_os_prepare_sleep==NULL and did not go in sleep properly] +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/kernel/tboot.c | 8 ++++++++ + drivers/acpi/acpica/hwsleep.c | 10 +++++++--- + drivers/acpi/osl.c | 24 ++++++++++++++++++++++++ + include/acpi/acexcep.h | 1 + + include/linux/acpi.h | 10 ++++++++++ + include/linux/tboot.h | 1 - + 6 files changed, 50 insertions(+), 4 deletions(-) + +diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c +index e2410e2..1a4ab7d 100644 +--- a/arch/x86/kernel/tboot.c ++++ b/arch/x86/kernel/tboot.c +@@ -297,6 +297,12 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) + + tboot_shutdown(acpi_shutdown_map[sleep_state]); + } ++static int tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control, ++ u32 pm1b_control) ++{ ++ tboot_sleep(sleep_state, pm1a_control, pm1b_control); ++ return 0; ++} + + static atomic_t ap_wfs_count; + +@@ -345,6 +351,8 @@ static __init int tboot_late_init(void) + + atomic_set(&ap_wfs_count, 0); + register_hotcpu_notifier(&tboot_cpu_notifier); ++ ++ acpi_os_set_prepare_sleep(&tboot_sleep_wrapper); + return 0; + } + +diff --git a/drivers/acpi/acpica/hwsleep.c b/drivers/acpi/acpica/hwsleep.c +index d52da30..992359a 100644 +--- a/drivers/acpi/acpica/hwsleep.c ++++ b/drivers/acpi/acpica/hwsleep.c +@@ -43,9 +43,9 @@ + */ + + #include ++#include + #include "accommon.h" + #include "actables.h" +-#include + #include + + #define _COMPONENT ACPI_HARDWARE +@@ -344,8 +344,12 @@ acpi_status asmlinkage acpi_enter_sleep_state(u8 sleep_state) + + ACPI_FLUSH_CPU_CACHE(); + +- tboot_sleep(sleep_state, pm1a_control, pm1b_control); +- ++ status = acpi_os_prepare_sleep(sleep_state, pm1a_control, ++ pm1b_control); ++ if (ACPI_SKIP(status)) ++ return_ACPI_STATUS(AE_OK); ++ if (ACPI_FAILURE(status)) ++ return_ACPI_STATUS(status); + /* Write #2: Write both SLP_TYP + SLP_EN */ + + status = acpi_hw_write_pm1_control(pm1a_control, pm1b_control); +diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c +index f31c5c5..f3aae4b 100644 +--- a/drivers/acpi/osl.c ++++ b/drivers/acpi/osl.c +@@ -76,6 +76,9 @@ EXPORT_SYMBOL(acpi_in_debugger); + extern char line_buf[80]; + #endif /*ENABLE_DEBUGGER */ + ++static int (*__acpi_os_prepare_sleep)(u8 sleep_state, u32 pm1a_ctrl, ++ u32 pm1b_ctrl); ++ + static acpi_osd_handler acpi_irq_handler; + static void *acpi_irq_context; + static struct workqueue_struct *kacpid_wq; +@@ -1659,3 +1662,24 @@ acpi_status acpi_os_terminate(void) + + return AE_OK; + } ++ ++acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control, ++ u32 pm1b_control) ++{ ++ int rc = 0; ++ if (__acpi_os_prepare_sleep) ++ rc = __acpi_os_prepare_sleep(sleep_state, ++ pm1a_control, pm1b_control); ++ if (rc < 0) ++ return AE_ERROR; ++ else if (rc > 0) ++ return AE_CTRL_SKIP; ++ ++ return AE_OK; ++} ++ ++void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state, ++ u32 pm1a_ctrl, u32 pm1b_ctrl)) ++{ ++ __acpi_os_prepare_sleep = func; ++} +diff --git a/include/acpi/acexcep.h b/include/acpi/acexcep.h +index 5b6c391..fa0d22c 100644 +--- a/include/acpi/acexcep.h ++++ b/include/acpi/acexcep.h +@@ -57,6 +57,7 @@ + #define ACPI_SUCCESS(a) (!(a)) + #define ACPI_FAILURE(a) (a) + ++#define ACPI_SKIP(a) (a == AE_CTRL_SKIP) + #define AE_OK (acpi_status) 0x0000 + + /* +diff --git a/include/linux/acpi.h b/include/linux/acpi.h +index 627a3a4..9393f73 100644 +--- a/include/linux/acpi.h ++++ b/include/linux/acpi.h +@@ -363,4 +363,14 @@ static inline int suspend_nvs_register(unsigned long a, unsigned long b) + } + #endif + ++#ifdef CONFIG_ACPI ++void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state, ++ u32 pm1a_ctrl, u32 pm1b_ctrl)); ++ ++acpi_status acpi_os_prepare_sleep(u8 sleep_state, ++ u32 pm1a_control, u32 pm1b_control); ++#else ++#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0) ++#endif ++ + #endif /*_LINUX_ACPI_H*/ +diff --git a/include/linux/tboot.h b/include/linux/tboot.h +index 1dba6ee..c75128b 100644 +--- a/include/linux/tboot.h ++++ b/include/linux/tboot.h +@@ -143,7 +143,6 @@ static inline int tboot_enabled(void) + + extern void tboot_probe(void); + extern void tboot_shutdown(u32 shutdown_type); +-extern void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control); + extern struct acpi_table_header *tboot_get_dmar_table( + struct acpi_table_header *dmar_tbl); + extern int tboot_force_iommu(void); +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch b/patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch new file mode 100644 index 0000000..86f2196 --- /dev/null +++ b/patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch @@ -0,0 +1,67 @@ +From 6f327383cd7ebef1fcc092e2d759ceb9d90dfb36 Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Thu, 8 Dec 2011 17:14:08 +0800 +Subject: tboot: Add return values for tboot_sleep + +.. as appropiately. As tboot_sleep now returns values. +remove tboot_sleep_wrapper. + +Suggested-by: "Rafael J. Wysocki" +Acked-by: Joseph Cihula +[v1: Return -1/0/+1 instead of ACPI_xx values] +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/kernel/tboot.c | 13 ++++--------- + 1 files changed, 4 insertions(+), 9 deletions(-) + +diff --git a/arch/x86/kernel/tboot.c b/arch/x86/kernel/tboot.c +index 1a4ab7d..6410744 100644 +--- a/arch/x86/kernel/tboot.c ++++ b/arch/x86/kernel/tboot.c +@@ -272,7 +272,7 @@ static void tboot_copy_fadt(const struct acpi_table_fadt *fadt) + offsetof(struct acpi_table_facs, firmware_waking_vector); + } + +-void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) ++static int tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) + { + static u32 acpi_shutdown_map[ACPI_S_STATE_COUNT] = { + /* S0,1,2: */ -1, -1, -1, +@@ -281,7 +281,7 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) + /* S5: */ TB_SHUTDOWN_S5 }; + + if (!tboot_enabled()) +- return; ++ return 0; + + tboot_copy_fadt(&acpi_gbl_FADT); + tboot->acpi_sinfo.pm1a_cnt_val = pm1a_control; +@@ -292,15 +292,10 @@ void tboot_sleep(u8 sleep_state, u32 pm1a_control, u32 pm1b_control) + if (sleep_state >= ACPI_S_STATE_COUNT || + acpi_shutdown_map[sleep_state] == -1) { + pr_warning("unsupported sleep state 0x%x\n", sleep_state); +- return; ++ return -1; + } + + tboot_shutdown(acpi_shutdown_map[sleep_state]); +-} +-static int tboot_sleep_wrapper(u8 sleep_state, u32 pm1a_control, +- u32 pm1b_control) +-{ +- tboot_sleep(sleep_state, pm1a_control, pm1b_control); + return 0; + } + +@@ -352,7 +347,7 @@ static __init int tboot_late_init(void) + atomic_set(&ap_wfs_count, 0); + register_hotcpu_notifier(&tboot_cpu_notifier); + +- acpi_os_set_prepare_sleep(&tboot_sleep_wrapper); ++ acpi_os_set_prepare_sleep(&tboot_sleep); + return 0; + } + +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch b/patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch new file mode 100644 index 0000000..a403093 --- /dev/null +++ b/patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch @@ -0,0 +1,112 @@ +From b2ed886e43ec90bae86d6cae6582b457e76d1fd8 Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Thu, 8 Dec 2011 17:16:43 +0800 +Subject: x86/acpi/sleep: Provide registration for acpi_suspend_lowlevel. + +Which by default will be x86_acpi_suspend_lowlevel. +This registration allows us to register another callback +if there is a need to use another platform specific callback. + +CC: Thomas Gleixner +CC: "H. Peter Anvin" +CC: x86@kernel.org +CC: Len Brown +CC: Joseph Cihula +CC: Shane Wang +CC: linux-pm@lists.linux-foundation.org +CC: linux-acpi@vger.kernel.org +CC: Len Brown +Signed-off-by: Liang Tang +[v1: Fix when CONFIG_ACPI_SLEEP is not set] +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/include/asm/acpi.h | 2 +- + arch/x86/kernel/acpi/boot.c | 7 +++++++ + arch/x86/kernel/acpi/sleep.c | 4 ++-- + arch/x86/kernel/acpi/sleep.h | 2 ++ + drivers/acpi/sleep.c | 2 ++ + 5 files changed, 14 insertions(+), 3 deletions(-) + +diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h +index 610001d..68cf060 100644 +--- a/arch/x86/include/asm/acpi.h ++++ b/arch/x86/include/asm/acpi.h +@@ -115,7 +115,7 @@ static inline void acpi_disable_pci(void) + } + + /* Low-level suspend routine. */ +-extern int acpi_suspend_lowlevel(void); ++extern int (*acpi_suspend_lowlevel)(void); + + extern const unsigned char acpi_wakeup_code[]; + #define acpi_wakeup_address (__pa(TRAMPOLINE_SYM(acpi_wakeup_code))) +diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c +index ce664f3..c3a5b95 100644 +--- a/arch/x86/kernel/acpi/boot.c ++++ b/arch/x86/kernel/acpi/boot.c +@@ -44,6 +44,7 @@ + #include + #include + ++#include "sleep.h" /* To include x86_acpi_suspend_lowlevel */ + static int __initdata acpi_force = 0; + u32 acpi_rsdt_forced; + int acpi_disabled; +@@ -558,6 +559,12 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi, + int (*__acpi_register_gsi)(struct device *dev, u32 gsi, + int trigger, int polarity) = acpi_register_gsi_pic; + ++#ifdef CONFIG_ACPI_SLEEP ++int (*acpi_suspend_lowlevel)(void) = x86_acpi_suspend_lowlevel; ++#else ++int (*acpi_suspend_lowlevel)(void); ++#endif ++ + /* + * success: return IRQ number (>=0) + * failure: return < 0 +diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c +index 103b6ab..4d2d0b1 100644 +--- a/arch/x86/kernel/acpi/sleep.c ++++ b/arch/x86/kernel/acpi/sleep.c +@@ -25,12 +25,12 @@ static char temp_stack[4096]; + #endif + + /** +- * acpi_suspend_lowlevel - save kernel state ++ * x86_acpi_suspend_lowlevel - save kernel state + * + * Create an identity mapped page table and copy the wakeup routine to + * low memory. + */ +-int acpi_suspend_lowlevel(void) ++int x86_acpi_suspend_lowlevel(void) + { + struct wakeup_header *header; + /* address in low memory of the wakeup routine. */ +diff --git a/arch/x86/kernel/acpi/sleep.h b/arch/x86/kernel/acpi/sleep.h +index 416d4be..4d3feb5 100644 +--- a/arch/x86/kernel/acpi/sleep.h ++++ b/arch/x86/kernel/acpi/sleep.h +@@ -13,3 +13,5 @@ extern unsigned long acpi_copy_wakeup_routine(unsigned long); + extern void wakeup_long64(void); + + extern void do_suspend_lowlevel(void); ++ ++extern int x86_acpi_suspend_lowlevel(void); +diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c +index 0a7ed69..44dbdde 100644 +--- a/drivers/acpi/sleep.c ++++ b/drivers/acpi/sleep.c +@@ -254,6 +254,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state) + break; + + case ACPI_STATE_S3: ++ if (!acpi_suspend_lowlevel) ++ return -ENOSYS; + error = acpi_suspend_lowlevel(); + if (error) + return error; +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch b/patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch new file mode 100644 index 0000000..29e1cb8 --- /dev/null +++ b/patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch @@ -0,0 +1,197 @@ +From 9b10575276a220543b8791f2cb8268fbd4a0bc2e Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Thu, 8 Dec 2011 17:32:23 +0800 +Subject: xen/acpi/sleep: Enable ACPI sleep via the __acpi_os_prepare_sleep + +Provide the registration callback to call in the Xen's +ACPI sleep functionality. This means that during S3/S5 +we make a hypercall XENPF_enter_acpi_sleep with the +proper PM1A/PM1B registers. + +Based of Ke Yu's initial idea. +[ From http://xenbits.xensource.com/linux-2.6.18-xen.hg +change c68699484a65 ] + +[v1: Added Copyright and license] +[v2: Added check if PM1A/B the 16-bits MSB contain something. The spec + only uses 16-bits but might have more in future] +Signed-off-by: Liang Tang +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/xen/enlighten.c | 3 ++ + drivers/xen/Makefile | 2 +- + drivers/xen/acpi.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++ + include/xen/acpi.h | 58 +++++++++++++++++++++++++++++++++++++++++++ + 4 files changed, 124 insertions(+), 1 deletions(-) + create mode 100644 drivers/xen/acpi.c + create mode 100644 include/xen/acpi.h + +diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c +index 12eb07b..a5277c2 100644 +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -42,6 +42,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1275,6 +1276,8 @@ asmlinkage void __init xen_start_kernel(void) + + /* Make sure ACS will be enabled */ + pci_request_acs(); ++ ++ xen_acpi_sleep_register(); + } + + +diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile +index aa31337..77a845f 100644 +--- a/drivers/xen/Makefile ++++ b/drivers/xen/Makefile +@@ -17,7 +17,7 @@ obj-$(CONFIG_XEN_SYS_HYPERVISOR) += sys-hypervisor.o + obj-$(CONFIG_XEN_PVHVM) += platform-pci.o + obj-$(CONFIG_XEN_TMEM) += tmem.o + obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o +-obj-$(CONFIG_XEN_DOM0) += pci.o ++obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o + obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ + obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o + +diff --git a/drivers/xen/acpi.c b/drivers/xen/acpi.c +new file mode 100644 +index 0000000..119d42a +--- /dev/null ++++ b/drivers/xen/acpi.c +@@ -0,0 +1,62 @@ ++/****************************************************************************** ++ * acpi.c ++ * acpi file for domain 0 kernel ++ * ++ * Copyright (c) 2011 Konrad Rzeszutek Wilk ++ * Copyright (c) 2011 Yu Ke ke.yu@intel.com ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License version 2 ++ * as published by the Free Software Foundation; or, when distributed ++ * separately from the Linux kernel or incorporated into other ++ * software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this source file (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, copy, modify, ++ * merge, publish, distribute, sublicense, and/or sell copies of the Software, ++ * and to permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ++ * IN THE SOFTWARE. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++int xen_acpi_notify_hypervisor_state(u8 sleep_state, ++ u32 pm1a_cnt, u32 pm1b_cnt) ++{ ++ struct xen_platform_op op = { ++ .cmd = XENPF_enter_acpi_sleep, ++ .interface_version = XENPF_INTERFACE_VERSION, ++ .u = { ++ .enter_acpi_sleep = { ++ .pm1a_cnt_val = (u16)pm1a_cnt, ++ .pm1b_cnt_val = (u16)pm1b_cnt, ++ .sleep_state = sleep_state, ++ }, ++ }, ++ }; ++ ++ if ((pm1a_cnt & 0xffff0000) || (pm1b_cnt & 0xffff0000)) { ++ WARN(1, "Using more than 16bits of PM1A/B 0x%x/0x%x!" ++ "Email xen-devel@lists.xensource.com Thank you.\n", \ ++ pm1a_cnt, pm1b_cnt); ++ return -1; ++ } ++ ++ HYPERVISOR_dom0_op(&op); ++ return 1; ++} +diff --git a/include/xen/acpi.h b/include/xen/acpi.h +new file mode 100644 +index 0000000..48a9c01 +--- /dev/null ++++ b/include/xen/acpi.h +@@ -0,0 +1,58 @@ ++/****************************************************************************** ++ * acpi.h ++ * acpi file for domain 0 kernel ++ * ++ * Copyright (c) 2011 Konrad Rzeszutek Wilk ++ * Copyright (c) 2011 Yu Ke ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU General Public License version 2 ++ * as published by the Free Software Foundation; or, when distributed ++ * separately from the Linux kernel or incorporated into other ++ * software packages, subject to the following license: ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a copy ++ * of this source file (the "Software"), to deal in the Software without ++ * restriction, including without limitation the rights to use, copy, modify, ++ * merge, publish, distribute, sublicense, and/or sell copies of the Software, ++ * and to permit persons to whom the Software is furnished to do so, subject to ++ * the following conditions: ++ * ++ * The above copyright notice and this permission notice shall be included in ++ * all copies or substantial portions of the Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE ++ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ++ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ++ * IN THE SOFTWARE. ++ */ ++ ++#ifndef _XEN_ACPI_H ++#define _XEN_ACPI_H ++ ++#include ++ ++#ifdef CONFIG_XEN_DOM0 ++#include ++#include ++#include ++ ++int xen_acpi_notify_hypervisor_state(u8 sleep_state, ++ u32 pm1a_cnt, u32 pm1b_cnd); ++ ++static inline void xen_acpi_sleep_register(void) ++{ ++ if (xen_initial_domain()) ++ acpi_os_set_prepare_sleep( ++ &xen_acpi_notify_hypervisor_state); ++} ++#else ++static inline void xen_acpi_sleep_register(void) ++{ ++} ++#endif ++ ++#endif /* _XEN_ACPI_H */ +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch b/patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch new file mode 100644 index 0000000..c8a4ba1 --- /dev/null +++ b/patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch @@ -0,0 +1,53 @@ +From 5000cd48f33e3e4d31cdeda0751188794f8bebf4 Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Thu, 8 Dec 2011 17:34:58 +0800 +Subject: xen/acpi/sleep: Register to the acpi_suspend_lowlevel a callback. + +We piggyback on "x86/acpi: Provide registration for acpi_suspend_lowlevel." +to register a Xen version of the callback. The callback does not +do anything special - except it omits the x86_acpi_suspend_lowlevel. +It does that b/c during suspend it tries to save cr8 values (which +the hypervisor does not support), and then on resume path the +cr3, cr8, idt, and gdt are all resumed which clashes with what +the hypervisor has set up for the guest. + +Signed-off-by: Liang Tang +Signed-off-by: Konrad Rzeszutek Wilk +--- + include/xen/acpi.h | 16 +++++++++++++++- + 1 files changed, 15 insertions(+), 1 deletions(-) + +diff --git a/include/xen/acpi.h b/include/xen/acpi.h +index 48a9c01..ebaabbb 100644 +--- a/include/xen/acpi.h ++++ b/include/xen/acpi.h +@@ -43,11 +43,25 @@ + int xen_acpi_notify_hypervisor_state(u8 sleep_state, + u32 pm1a_cnt, u32 pm1b_cnd); + ++static inline int xen_acpi_suspend_lowlevel(void) ++{ ++ /* ++ * Xen will save and restore CPU context, so ++ * we can skip that and just go straight to ++ * the suspend. ++ */ ++ acpi_enter_sleep_state(ACPI_STATE_S3); ++ return 0; ++} ++ + static inline void xen_acpi_sleep_register(void) + { +- if (xen_initial_domain()) ++ if (xen_initial_domain()) { + acpi_os_set_prepare_sleep( + &xen_acpi_notify_hypervisor_state); ++ ++ acpi_suspend_lowlevel = xen_acpi_suspend_lowlevel; ++ } + } + #else + static inline void xen_acpi_sleep_register(void) +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch b/patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch new file mode 100644 index 0000000..a138f7d --- /dev/null +++ b/patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch @@ -0,0 +1,81 @@ +From 86ceafdf50d67bcb2a5196122797a6972bedd279 Mon Sep 17 00:00:00 2001 +From: Tang Liang +Date: Thu, 8 Dec 2011 17:36:39 +0800 +Subject: xen: Utilize the restore_msi_irqs hook. + +to make a hypercall to restore the vectors in the MSI/MSI-X +configuration space. + +Signed-off-by: Tang Liang +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/pci/xen.c | 27 +++++++++++++++++++++++++++ + include/xen/interface/physdev.h | 7 +++++++ + 2 files changed, 34 insertions(+), 0 deletions(-) + +diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c +index 492ade8..249a5ae 100644 +--- a/arch/x86/pci/xen.c ++++ b/arch/x86/pci/xen.c +@@ -324,6 +324,32 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) + out: + return ret; + } ++ ++static void xen_initdom_restore_msi_irqs(struct pci_dev *dev, int irq) ++{ ++ int ret = 0; ++ ++ if (pci_seg_supported) { ++ struct physdev_pci_device restore_ext; ++ ++ restore_ext.seg = pci_domain_nr(dev->bus); ++ restore_ext.bus = dev->bus->number; ++ restore_ext.devfn = dev->devfn; ++ ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi_ext, ++ &restore_ext); ++ if (ret == -ENOSYS) ++ pci_seg_supported = false; ++ WARN(ret && ret != -ENOSYS, "restore_msi_ext -> %d\n", ret); ++ } ++ if (!pci_seg_supported) { ++ struct physdev_restore_msi restore; ++ ++ restore.bus = dev->bus->number; ++ restore.devfn = dev->devfn; ++ ret = HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi, &restore); ++ WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret); ++ } ++} + #endif + + static void xen_teardown_msi_irqs(struct pci_dev *dev) +@@ -446,6 +472,7 @@ int __init pci_xen_initial_domain(void) + #ifdef CONFIG_PCI_MSI + x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs; + x86_msi.teardown_msi_irq = xen_teardown_msi_irq; ++ x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; + #endif + xen_setup_acpi_sci(); + __acpi_register_gsi = acpi_register_gsi_xen; +diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h +index c1080d9..0c28989 100644 +--- a/include/xen/interface/physdev.h ++++ b/include/xen/interface/physdev.h +@@ -145,6 +145,13 @@ struct physdev_manage_pci { + uint8_t devfn; + }; + ++#define PHYSDEVOP_restore_msi 19 ++struct physdev_restore_msi { ++ /* IN */ ++ uint8_t bus; ++ uint8_t devfn; ++}; ++ + #define PHYSDEVOP_manage_pci_add_ext 20 + struct physdev_manage_pci_ext { + /* IN */ +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch b/patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch new file mode 100644 index 0000000..02739ed --- /dev/null +++ b/patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch @@ -0,0 +1,31 @@ +From cfb37553f53f993c22aad05c219581dfbc726bcc Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Mon, 23 Jan 2012 10:53:57 -0500 +Subject: xen/setup/pm/acpi: Remove the call to boot_option_idle_override. + +We needed that call in the past to force the kernel to use +default_idle (which called safe_halt, which called xen_safe_halt). + +But set_pm_idle_to_default() does now that, so there is no need +to use this boot option operand. + +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/xen/setup.c | 1 - + 1 files changed, 0 insertions(+), 1 deletions(-) + +diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c +index e03c636..1236623 100644 +--- a/arch/x86/xen/setup.c ++++ b/arch/x86/xen/setup.c +@@ -420,7 +420,6 @@ void __init xen_arch_setup(void) + boot_cpu_data.hlt_works_ok = 1; + #endif + disable_cpuidle(); +- boot_option_idle_override = IDLE_HALT; + WARN_ON(set_pm_idle_to_default()); + fiddle_vdso(); + } +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch b/patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch new file mode 100644 index 0000000..2653c38 --- /dev/null +++ b/patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch @@ -0,0 +1,216 @@ +From d281ee8c6d58a7f5d1f4241238daa315fb959e31 Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Mon, 13 Feb 2012 22:26:32 -0500 +Subject: xen/enlighten: Expose MWAIT and MWAIT_LEAF if hypervisor OKs it. + +For the hypervisor to take advantage of the MWAIT support it needs +to extract from the ACPI _CST the register address. But the +hypervisor does not have the support to parse DSDT so it relies on +the initial domain (dom0) to parse the ACPI Power Management information +and push it up to the hypervisor. The pushing of the data is done +by the processor_harveset_xen module which parses the information that +the ACPI parser has graciously exposed in 'struct acpi_processor'. + +For the ACPI parser to also expose the Cx states for MWAIT, we need +to expose the MWAIT capability (leaf 1). Furthermore we also need to +expose the MWAIT_LEAF capability (leaf 5) for cstate.c to properly +function. + +The hypervisor could expose these flags when it traps the XEN_EMULATE_PREFIX +operations, but it can't do it since it needs to be backwards compatible. +Instead we choose to use the native CPUID to figure out if the MWAIT +capability exists and use the XEN_SET_PDC query hypercall to figure out +if the hypervisor wants us to expose the MWAIT_LEAF capability or not. + +Note: The XEN_SET_PDC query was implemented in c/s 23783: +"ACPI: add _PDC input override mechanism". + +With this in place, instead of + C3 ACPI IOPORT 415 +we get now + C3:ACPI FFH INTEL MWAIT 0x20 + +Note: The cpu_idle which would be calling the mwait variants for idling +never gets set b/c we set the default pm_idle to be the hypercall variant. + +Signed-off-by: Konrad Rzeszutek Wilk +--- + arch/x86/xen/enlighten.c | 92 +++++++++++++++++++++++++++++++++++++- + include/xen/interface/platform.h | 4 +- + 2 files changed, 94 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c +index 12eb07b..4c82936 100644 +--- a/arch/x86/xen/enlighten.c ++++ b/arch/x86/xen/enlighten.c +@@ -62,6 +62,14 @@ + #include + #include + #include ++#include ++ ++#ifdef CONFIG_ACPI ++#include ++#include ++#include ++#include ++#endif + + #include "xen-ops.h" + #include "mmu.h" +@@ -200,13 +208,17 @@ static void __init xen_banner(void) + static __read_mostly unsigned int cpuid_leaf1_edx_mask = ~0; + static __read_mostly unsigned int cpuid_leaf1_ecx_mask = ~0; + ++static __read_mostly unsigned int cpuid_leaf1_ecx_set_mask; ++static __read_mostly unsigned int cpuid_leaf5_ecx_val; ++static __read_mostly unsigned int cpuid_leaf5_edx_val; ++ + static void xen_cpuid(unsigned int *ax, unsigned int *bx, + unsigned int *cx, unsigned int *dx) + { + unsigned maskebx = ~0; + unsigned maskecx = ~0; + unsigned maskedx = ~0; +- ++ unsigned setecx = 0; + /* + * Mask out inconvenient features, to try and disable as many + * unsupported kernel subsystems as possible. +@@ -214,9 +226,18 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, + switch (*ax) { + case 1: + maskecx = cpuid_leaf1_ecx_mask; ++ setecx = cpuid_leaf1_ecx_set_mask; + maskedx = cpuid_leaf1_edx_mask; + break; + ++ case CPUID_MWAIT_LEAF: ++ /* Synthesize the values.. */ ++ *ax = 0; ++ *bx = 0; ++ *cx = cpuid_leaf5_ecx_val; ++ *dx = cpuid_leaf5_edx_val; ++ return; ++ + case 0xb: + /* Suppress extended topology stuff */ + maskebx = 0; +@@ -232,9 +253,75 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, + + *bx &= maskebx; + *cx &= maskecx; ++ *cx |= setecx; + *dx &= maskedx; ++ + } + ++static bool __init xen_check_mwait(void) ++{ ++#if CONFIG_ACPI ++ struct xen_platform_op op = { ++ .cmd = XENPF_set_processor_pminfo, ++ .u.set_pminfo.id = -1, ++ .u.set_pminfo.type = XEN_PM_PDC, ++ }; ++ uint32_t buf[3]; ++ unsigned int ax, bx, cx, dx; ++ unsigned int mwait_mask; ++ ++ /* We need to determine whether it is OK to expose the MWAIT ++ * capability to the kernel to harvest deeper than C3 states from ACPI ++ * _CST using the processor_harvest_xen.c module. For this to work, we ++ * need to gather the MWAIT_LEAF values (which the cstate.c code ++ * checks against). The hypervisor won't expose the MWAIT flag because ++ * it would break backwards compatibility; so we will find out directly ++ * from the hardware and hypercall. ++ */ ++ if (!xen_initial_domain()) ++ return false; ++ ++ ax = 1; ++ cx = 0; ++ ++ native_cpuid(&ax, &bx, &cx, &dx); ++ ++ mwait_mask = (1 << (X86_FEATURE_EST % 32)) | ++ (1 << (X86_FEATURE_MWAIT % 32)); ++ ++ if ((cx & mwait_mask) != mwait_mask) ++ return false; ++ ++ /* We need to emulate the MWAIT_LEAF and for that we need both ++ * ecx and edx. The hypercall provides only partial information. ++ */ ++ ++ ax = CPUID_MWAIT_LEAF; ++ bx = 0; ++ cx = 0; ++ dx = 0; ++ ++ native_cpuid(&ax, &bx, &cx, &dx); ++ ++ /* Ask the Hypervisor whether to clear ACPI_PDC_C_C2C3_FFH. If so, ++ * don't expose MWAIT_LEAF and let ACPI pick the IOPORT version of C3. ++ */ ++ buf[0] = ACPI_PDC_REVISION_ID; ++ buf[1] = 1; ++ buf[2] = (ACPI_PDC_C_CAPABILITY_SMP | ACPI_PDC_EST_CAPABILITY_SWSMP); ++ ++ set_xen_guest_handle(op.u.set_pminfo.pdc, buf); ++ ++ if ((HYPERVISOR_dom0_op(&op) == 0) && ++ (buf[2] & (ACPI_PDC_C_C1_FFH | ACPI_PDC_C_C2C3_FFH))) { ++ cpuid_leaf5_ecx_val = cx; ++ cpuid_leaf5_edx_val = dx; ++ } ++ return true; ++#else ++ return false; ++#endif ++} + static void __init xen_init_cpuid_mask(void) + { + unsigned int ax, bx, cx, dx; +@@ -261,6 +348,9 @@ static void __init xen_init_cpuid_mask(void) + /* Xen will set CR4.OSXSAVE if supported and not disabled by force */ + if ((cx & xsave_mask) != xsave_mask) + cpuid_leaf1_ecx_mask &= ~xsave_mask; /* disable XSAVE & OSXSAVE */ ++ ++ if (xen_check_mwait()) ++ cpuid_leaf1_ecx_set_mask = (1 << (X86_FEATURE_MWAIT % 32)); + } + + static void xen_set_debugreg(int reg, unsigned long val) +diff --git a/include/xen/interface/platform.h b/include/xen/interface/platform.h +index c168468..6220b98 100644 +--- a/include/xen/interface/platform.h ++++ b/include/xen/interface/platform.h +@@ -200,7 +200,7 @@ DEFINE_GUEST_HANDLE_STRUCT(xenpf_getidletime_t); + #define XEN_PM_CX 0 + #define XEN_PM_PX 1 + #define XEN_PM_TX 2 +- ++#define XEN_PM_PDC 3 + /* Px sub info type */ + #define XEN_PX_PCT 1 + #define XEN_PX_PSS 2 +@@ -286,6 +286,7 @@ struct xen_processor_performance { + }; + DEFINE_GUEST_HANDLE_STRUCT(xen_processor_performance); + ++DEFINE_GUEST_HANDLE(uint32_t); + struct xenpf_set_processor_pminfo { + /* IN variables */ + uint32_t id; /* ACPI CPU ID */ +@@ -293,6 +294,7 @@ struct xenpf_set_processor_pminfo { + union { + struct xen_processor_power power;/* Cx: _CST/_CSD */ + struct xen_processor_performance perf; /* Px: _PPC/_PCT/_PSS/_PSD */ ++ GUEST_HANDLE(uint32_t) pdc; + }; + }; + DEFINE_GUEST_HANDLE_STRUCT(xenpf_set_processor_pminfo); +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch b/patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch new file mode 100644 index 0000000..1b16c78 --- /dev/null +++ b/patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch @@ -0,0 +1,529 @@ +From 20e7a07fa0f8a0dbe30a0f732686d78849d29d96 Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Fri, 3 Feb 2012 16:03:20 -0500 +Subject: [CPUFREQ] xen: governor for Xen hypervisor frequency scaling. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This CPU freq governor leaves the frequency decision to the Xen hypervisor. + +To do that the driver parses the Power Management data and uploads said +information to the Xen hypervisor. Then the Xen hypervisor can select the +proper Cx and Pxx states for the initial domain and all other domains. + +To upload the information, this CPU frequency driver reads Power Management (PM) +(_Pxx and _Cx) which are populated in the 'struct acpi_processor' structure. +It simply reads the contents of that structure and pass it up the Xen hypervisor. +For that to work we depend on the appropriate CPU frequency scaling driver +to do the heavy-lifting - so that the contents is correct. + +The CPU frequency governor it has been loaded also sets up a timer +to check if the ACPI IDs count is different from the APIC ID count - which +can happen if the user choose to use dom0_max_vcpu argument. In such a case +a backup of the PM structure is used and uploaded to the hypervisor. + +[v1-v2: Initial RFC implementations that were posted] +[v3: Changed the name to passthru suggested by Pasi Kärkkäinen ] +[v4: Added vCPU != pCPU support - aka dom0_max_vcpus support] +[v5: Cleaned up the driver, fix bug under Athlon XP] +[v6: Changed the driver to a CPU frequency governor] +Signed-off-by: Konrad Rzeszutek Wilk +--- + drivers/xen/Kconfig | 15 ++ + drivers/xen/Makefile | 2 +- + drivers/xen/cpufreq_xen.c | 445 +++++++++++++++++++++++++++++++++++++++++++++ + 3 files changed, 461 insertions(+), 1 deletions(-) + create mode 100644 drivers/xen/cpufreq_xen.c + +diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig +index a1ced52..28ba371 100644 +--- a/drivers/xen/Kconfig ++++ b/drivers/xen/Kconfig +@@ -178,4 +178,19 @@ config XEN_PRIVCMD + depends on XEN + default m + ++config CPU_FREQ_GOV_XEN ++ tristate "'xen' governor for hypervisor scaling" ++ depends on XEN && X86 && ACPI_PROCESSOR && CPU_FREQ ++ default m ++ help ++ This cpufreq governor leaves the frequency decision to the Xen hypervisor. ++ ++ To do that the driver parses the Power Management data and uploads said ++ information to the Xen hypervisor. Then the Xen hypervisor can select the ++ proper Cx and Pxx states. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called cpufreq_xen. If you do not know what to choose, ++ select M here. ++ + endmenu +diff --git a/drivers/xen/Makefile b/drivers/xen/Makefile +index aa31337..5802220 100644 +--- a/drivers/xen/Makefile ++++ b/drivers/xen/Makefile +@@ -20,7 +20,7 @@ obj-$(CONFIG_SWIOTLB_XEN) += swiotlb-xen.o + obj-$(CONFIG_XEN_DOM0) += pci.o acpi.o + obj-$(CONFIG_XEN_PCIDEV_BACKEND) += xen-pciback/ + obj-$(CONFIG_XEN_PRIVCMD) += xen-privcmd.o +- ++obj-$(CONFIG_CPU_FREQ_GOV_XEN) += cpufreq_xen.o + xen-evtchn-y := evtchn.o + xen-gntdev-y := gntdev.o + xen-gntalloc-y := gntalloc.o +diff --git a/drivers/xen/cpufreq_xen.c b/drivers/xen/cpufreq_xen.c +new file mode 100644 +index 0000000..1b709bf +--- /dev/null ++++ b/drivers/xen/cpufreq_xen.c +@@ -0,0 +1,445 @@ ++/* ++ * Copyright 2012 by Oracle Inc ++ * Author: Konrad Rzeszutek Wilk ++ * ++ * This code borrows ideas from https://lkml.org/lkml/2011/11/30/249 ++ * so many thanks go to Kevin Tian ++ * and Yu Ke . ++ * ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms and conditions of the GNU General Public License, ++ * version 2, as published by the Free Software Foundation. ++ * ++ * This program is distributed in the hope 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 ++ ++#define DRV_NAME "cpufreq-xen" ++ ++static int no_hypercall; ++MODULE_PARM_DESC(off, "Inhibit the hypercall."); ++module_param_named(off, no_hypercall, int, 0400); ++ ++/* ++ * Mutex to protect the acpi_ids_done. ++ */ ++static DEFINE_MUTEX(acpi_ids_mutex); ++/* ++ * Don't think convert this to cpumask_var_t or use cpumask_bit - as those ++ * shrink to nr_cpu_bits (which is dependent on possible_cpu), which can be ++ * less than what we want to put in. ++ */ ++#define NR_ACPI_CPUS NR_CPUS ++#define MAX_ACPI_BITS (BITS_TO_LONGS(NR_ACPI_CPUS)) ++static unsigned long *acpi_ids_done; ++/* ++ * Again, don't convert to cpumask - as we are reading the raw ACPI CPU ids ++ * which can go beyond what we presently see. ++ */ ++static unsigned long *acpi_id_present; ++ ++/* ++ * Pertient data for the timer to be launched to check if the # of ++ * ACPI CPU ids is different from the one we have processed. ++ */ ++#define DELAY_TIMER msecs_to_jiffies(5000 /* 5 sec */) ++static struct acpi_processor *pr_backup; ++static struct delayed_work work; ++ ++static int push_cxx_to_hypervisor(struct acpi_processor *_pr) ++{ ++ struct xen_platform_op op = { ++ .cmd = XENPF_set_processor_pminfo, ++ .interface_version = XENPF_INTERFACE_VERSION, ++ .u.set_pminfo.id = _pr->acpi_id, ++ .u.set_pminfo.type = XEN_PM_CX, ++ }; ++ struct xen_processor_cx *dst_cx, *dst_cx_states = NULL; ++ struct acpi_processor_cx *cx; ++ int i, ok, ret = 0; ++ ++ dst_cx_states = kcalloc(_pr->power.count, ++ sizeof(struct xen_processor_cx), GFP_KERNEL); ++ if (!dst_cx_states) ++ return -ENOMEM; ++ ++ for (ok = 0, i = 1; i <= _pr->power.count; i++) { ++ cx = &_pr->power.states[i]; ++ if (!cx->valid) ++ continue; ++ ++ dst_cx = &(dst_cx_states[ok++]); ++ ++ dst_cx->reg.space_id = ACPI_ADR_SPACE_SYSTEM_IO; ++ if (cx->entry_method == ACPI_CSTATE_SYSTEMIO) { ++ dst_cx->reg.bit_width = 8; ++ dst_cx->reg.bit_offset = 0; ++ dst_cx->reg.access_size = 1; ++ } else { ++ dst_cx->reg.space_id = ACPI_ADR_SPACE_FIXED_HARDWARE; ++ if (cx->entry_method == ACPI_CSTATE_FFH) { ++ /* NATIVE_CSTATE_BEYOND_HALT */ ++ dst_cx->reg.bit_offset = 2; ++ dst_cx->reg.bit_width = 1; /* VENDOR_INTEL */ ++ } ++ dst_cx->reg.access_size = 0; ++ } ++ dst_cx->reg.address = cx->address; ++ ++ dst_cx->type = cx->type; ++ dst_cx->latency = cx->latency; ++ dst_cx->power = cx->power; ++ ++ dst_cx->dpcnt = 0; ++ set_xen_guest_handle(dst_cx->dp, NULL); ++#ifdef DEBUG ++ pr_debug(DRV_NAME ": CX: ID:%d [C%d:%s] entry:%d\n", ++ _pr->acpi_id, cx->type, cx->desc, cx->entry_method); ++#endif ++ } ++ if (!ok) { ++ pr_err(DRV_NAME ": No _Cx for CPU %d\n", _pr->acpi_id); ++ kfree(dst_cx_states); ++ return -EINVAL; ++ } ++ op.u.set_pminfo.power.count = ok; ++ op.u.set_pminfo.power.flags.bm_control = _pr->flags.bm_control; ++ op.u.set_pminfo.power.flags.bm_check = _pr->flags.bm_check; ++ op.u.set_pminfo.power.flags.has_cst = _pr->flags.has_cst; ++ op.u.set_pminfo.power.flags.power_setup_done = ++ _pr->flags.power_setup_done; ++ ++ set_xen_guest_handle(op.u.set_pminfo.power.states, dst_cx_states); ++ ++ if (!no_hypercall) ++ ret = HYPERVISOR_dom0_op(&op); ++ ++ if (ret) ++ pr_err(DRV_NAME "(CX): Hypervisor error (%d) for ACPI ID: %d\n", ++ ret, _pr->acpi_id); ++ ++ kfree(dst_cx_states); ++ ++ return ret; ++} ++static struct xen_processor_px * ++xen_copy_pss_data(struct acpi_processor *_pr, ++ struct xen_processor_performance *dst_perf) ++{ ++ struct xen_processor_px *dst_states = NULL; ++ int i; ++ ++ BUILD_BUG_ON(sizeof(struct xen_processor_px) != ++ sizeof(struct acpi_processor_px)); ++ ++ dst_states = kcalloc(_pr->performance->state_count, ++ sizeof(struct xen_processor_px), GFP_KERNEL); ++ if (!dst_states) ++ return ERR_PTR(-ENOMEM); ++ ++ dst_perf->state_count = _pr->performance->state_count; ++ for (i = 0; i < _pr->performance->state_count; i++) { ++ /* Fortunatly for us, they are both the same size */ ++ memcpy(&(dst_states[i]), &(_pr->performance->states[i]), ++ sizeof(struct acpi_processor_px)); ++ } ++ return dst_states; ++} ++static int xen_copy_psd_data(struct acpi_processor *_pr, ++ struct xen_processor_performance *dst) ++{ ++ BUILD_BUG_ON(sizeof(struct xen_psd_package) != ++ sizeof(struct acpi_psd_package)); ++ ++ if (_pr->performance->shared_type != CPUFREQ_SHARED_TYPE_NONE) { ++ dst->shared_type = _pr->performance->shared_type; ++ ++ memcpy(&(dst->domain_info), &(_pr->performance->domain_info), ++ sizeof(struct acpi_psd_package)); ++ } else { ++ if ((&cpu_data(0))->x86_vendor != X86_VENDOR_AMD) ++ return -EINVAL; ++ ++ /* On AMD, the powernow-k8 is loaded before acpi_cpufreq ++ * meaning that acpi_processor_preregister_performance never ++ * gets called which would parse the _PSD. The only relevant ++ * information from _PSD we need is whether it is HW_ALL or any ++ * other type. AMD K8 >= are SW_ALL or SW_ANY, AMD K7<= HW_ANY. ++ * This driver checks at the start whether it is K8 so it ++ * if we get here it can only be K8. ++ */ ++ dst->shared_type = CPUFREQ_SHARED_TYPE_ANY; ++ dst->domain_info.coord_type = DOMAIN_COORD_TYPE_SW_ANY; ++ dst->domain_info.num_processors = num_online_cpus(); ++ } ++ return 0; ++} ++static int xen_copy_pct_data(struct acpi_pct_register *pct, ++ struct xen_pct_register *dst_pct) ++{ ++ /* It would be nice if you could just do 'memcpy(pct, dst_pct') but ++ * sadly the Xen structure did not have the proper padding so the ++ * descriptor field takes two (dst_pct) bytes instead of one (pct). ++ */ ++ dst_pct->descriptor = pct->descriptor; ++ dst_pct->length = pct->length; ++ dst_pct->space_id = pct->space_id; ++ dst_pct->bit_width = pct->bit_width; ++ dst_pct->bit_offset = pct->bit_offset; ++ dst_pct->reserved = pct->reserved; ++ dst_pct->address = pct->address; ++ return 0; ++} ++static int push_pxx_to_hypervisor(struct acpi_processor *_pr) ++{ ++ int ret = 0; ++ struct xen_platform_op op = { ++ .cmd = XENPF_set_processor_pminfo, ++ .interface_version = XENPF_INTERFACE_VERSION, ++ .u.set_pminfo.id = _pr->acpi_id, ++ .u.set_pminfo.type = XEN_PM_PX, ++ }; ++ struct xen_processor_performance *dst_perf; ++ struct xen_processor_px *dst_states = NULL; ++ ++ dst_perf = &op.u.set_pminfo.perf; ++ ++ dst_perf->platform_limit = _pr->performance_platform_limit; ++ dst_perf->flags |= XEN_PX_PPC; ++ xen_copy_pct_data(&(_pr->performance->control_register), ++ &dst_perf->control_register); ++ xen_copy_pct_data(&(_pr->performance->status_register), ++ &dst_perf->status_register); ++ dst_perf->flags |= XEN_PX_PCT; ++ dst_states = xen_copy_pss_data(_pr, dst_perf); ++ if (!IS_ERR_OR_NULL(dst_states)) { ++ set_xen_guest_handle(dst_perf->states, dst_states); ++ dst_perf->flags |= XEN_PX_PSS; ++ } ++ if (!xen_copy_psd_data(_pr, dst_perf)) ++ dst_perf->flags |= XEN_PX_PSD; ++ ++ if (!no_hypercall) ++ ret = HYPERVISOR_dom0_op(&op); ++ ++ if (ret) ++ pr_err(DRV_NAME "(_PXX): Hypervisor error (%d) for ACPI ID %d\n", ++ ret, _pr->acpi_id); ++ ++ if (!IS_ERR_OR_NULL(dst_states)) ++ kfree(dst_states); ++ ++ return ret; ++} ++static int upload_pm_data(struct acpi_processor *_pr) ++{ ++ int err = 0; ++ ++ if (__test_and_set_bit(_pr->acpi_id, acpi_ids_done)) ++ return -EBUSY; ++ ++ if (_pr->flags.power) ++ err = push_cxx_to_hypervisor(_pr); ++ ++ if (_pr->performance && _pr->performance->states) ++ err |= push_pxx_to_hypervisor(_pr); ++ ++ return err; ++} ++static acpi_status ++read_acpi_id(acpi_handle handle, u32 lvl, void *context, void **rv) ++{ ++ u32 acpi_id; ++ acpi_status status; ++ acpi_object_type acpi_type; ++ unsigned long long tmp; ++ union acpi_object object = { 0 }; ++ struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; ++ ++ status = acpi_get_type(handle, &acpi_type); ++ if (ACPI_FAILURE(status)) ++ return AE_OK; ++ ++ switch (acpi_type) { ++ case ACPI_TYPE_PROCESSOR: ++ status = acpi_evaluate_object(handle, NULL, NULL, &buffer); ++ if (ACPI_FAILURE(status)) ++ return AE_OK; ++ acpi_id = object.processor.proc_id; ++ break; ++ case ACPI_TYPE_DEVICE: ++ status = acpi_evaluate_integer(handle, "_UID", NULL, &tmp); ++ if (ACPI_FAILURE(status)) ++ return AE_OK; ++ acpi_id = tmp; ++ break; ++ default: ++ return AE_OK; ++ } ++ if (acpi_id > NR_ACPI_CPUS) { ++ WARN_ONCE(1, "There are %d ACPI processors, but kernel can only do %d!\n", ++ acpi_id, NR_ACPI_CPUS); ++ return AE_OK; ++ } ++ __set_bit(acpi_id, acpi_id_present); ++ ++ return AE_OK; ++} ++static unsigned int more_acpi_ids(void) ++{ ++ unsigned int n = 0; ++ ++ acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, ++ ACPI_UINT32_MAX, ++ read_acpi_id, NULL, NULL, NULL); ++ acpi_get_devices("ACPI0007", read_acpi_id, NULL, NULL); ++ ++ mutex_lock(&acpi_ids_mutex); ++ if (!bitmap_equal(acpi_id_present, acpi_ids_done, MAX_ACPI_BITS)) ++ n = bitmap_weight(acpi_id_present, MAX_ACPI_BITS); ++ mutex_unlock(&acpi_ids_mutex); ++ ++ return n; ++} ++static void do_check_acpi_id_timer(struct work_struct *_work) ++{ ++ /* All online CPUs have been processed at this stage. Now verify ++ * whether in fact "online CPUs" == physical CPUs. ++ */ ++ acpi_id_present = kcalloc(MAX_ACPI_BITS, sizeof(unsigned long), GFP_KERNEL); ++ if (!acpi_id_present) ++ return; ++ memset(acpi_id_present, 0, MAX_ACPI_BITS * sizeof(unsigned long)); ++ ++ if (more_acpi_ids()) { ++ int cpu; ++ if (!pr_backup) { ++ schedule_delayed_work(&work, DELAY_TIMER); ++ return; ++ } ++ for_each_set_bit(cpu, acpi_id_present, MAX_ACPI_BITS) { ++ pr_backup->acpi_id = cpu; ++ mutex_lock(&acpi_ids_mutex); ++ (void)upload_pm_data(pr_backup); ++ mutex_unlock(&acpi_ids_mutex); ++ } ++ } ++ kfree(acpi_id_present); ++ acpi_id_present = NULL; ++} ++ ++static int cpufreq_governor_xen(struct cpufreq_policy *policy, ++ unsigned int event) ++{ ++ struct acpi_processor *_pr; ++ ++ switch (event) { ++ case CPUFREQ_GOV_START: ++ case CPUFREQ_GOV_LIMITS: ++ /* Set it to max and let the hypervisor take over */ ++ __cpufreq_driver_target(policy, policy->max, CPUFREQ_RELATION_H); ++ ++ _pr = per_cpu(processors, policy->cpu /* APIC ID */); ++ if (!_pr) ++ break; ++ ++ mutex_lock(&acpi_ids_mutex); ++ if (!pr_backup) { ++ pr_backup = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL); ++ memcpy(pr_backup, _pr, sizeof(struct acpi_processor)); ++ ++ INIT_DELAYED_WORK_DEFERRABLE(&work, do_check_acpi_id_timer); ++ schedule_delayed_work(&work, DELAY_TIMER); ++ } ++ (void)upload_pm_data(_pr); ++ mutex_unlock(&acpi_ids_mutex); ++ break; ++ default: ++ break; ++ } ++ return 0; ++} ++static struct cpufreq_governor cpufreq_gov_xen = { ++ .name = "xen", ++ .governor = cpufreq_governor_xen, ++ .owner = THIS_MODULE, ++}; ++static int __init check_prereq(void) ++{ ++ struct cpuinfo_x86 *c = &cpu_data(0); ++ ++ if (!xen_initial_domain()) ++ return -ENODEV; ++ ++ if (!acpi_gbl_FADT.smi_command) ++ return -ENODEV; ++ ++ if (c->x86_vendor == X86_VENDOR_INTEL) { ++ if (!cpu_has(c, X86_FEATURE_EST)) ++ return -ENODEV; ++ ++ return 0; ++ } ++ if (c->x86_vendor == X86_VENDOR_AMD) { ++ u32 hi = 0, lo = 0; ++ /* Copied from powernow-k8.h, can't include ../cpufreq/powernow ++ * as we get compile warnings for the static functions. ++ */ ++#define MSR_PSTATE_CUR_LIMIT 0xc0010061 /* pstate current limit MSR */ ++ rdmsr(MSR_PSTATE_CUR_LIMIT, lo, hi); ++ ++ /* If the MSR cannot provide the data, the powernow-k8 ++ * won't process the data properly either. ++ */ ++ if (hi || lo) ++ return 0; ++ } ++ return -ENODEV; ++} ++ ++static int __init xen_processor_passthru_init(void) ++{ ++ int rc = check_prereq(); ++ ++ if (rc) ++ return rc; ++ ++ acpi_ids_done = kcalloc(MAX_ACPI_BITS, sizeof(unsigned long), GFP_KERNEL); ++ if (!acpi_ids_done) ++ return -ENOMEM; ++ memset(acpi_ids_done, 0, MAX_ACPI_BITS * sizeof(unsigned long)); ++ ++ return cpufreq_register_governor(&cpufreq_gov_xen); ++} ++static void __exit xen_processor_passthru_exit(void) ++{ ++ cpufreq_unregister_governor(&cpufreq_gov_xen); ++ cancel_delayed_work_sync(&work); ++ kfree(acpi_ids_done); ++ kfree(pr_backup); ++} ++ ++MODULE_AUTHOR("Konrad Rzeszutek Wilk "); ++MODULE_DESCRIPTION("CPUfreq policy governor 'xen' which uploads PM data to Xen hypervisor"); ++MODULE_LICENSE("GPL"); ++ ++late_initcall(xen_processor_passthru_init); ++module_exit(xen_processor_passthru_exit); +-- +1.7.6.4 + diff --git a/patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch b/patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch new file mode 100644 index 0000000..1ecc16c --- /dev/null +++ b/patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch @@ -0,0 +1,135 @@ +From 76ccc297018d25d55b789bbd508861ef1e2cdb0c Mon Sep 17 00:00:00 2001 +From: Konrad Rzeszutek Wilk +Date: Fri, 16 Dec 2011 17:38:18 -0500 +Subject: x86/PCI: Expand the x86_msi_ops to have a restore MSIs. + +The MSI restore function will become a function pointer in an +x86_msi_ops struct. It defaults to the implementation in the +io_apic.c and msi.c. We piggyback on the indirection mechanism +introduced by "x86: Introduce x86_msi_ops". + +Cc: x86@kernel.org +Cc: Thomas Gleixner +Cc: "H. Peter Anvin" +Cc: linux-pci@vger.kernel.org +Signed-off-by: Konrad Rzeszutek Wilk +Signed-off-by: Jesse Barnes +--- + arch/x86/include/asm/pci.h | 9 +++++++++ + arch/x86/include/asm/x86_init.h | 1 + + arch/x86/kernel/x86_init.c | 1 + + drivers/pci/msi.c | 29 +++++++++++++++++++++++++++-- + 4 files changed, 38 insertions(+), 2 deletions(-) + +diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h +index d498943..df75d07 100644 +--- a/arch/x86/include/asm/pci.h ++++ b/arch/x86/include/asm/pci.h +@@ -112,19 +112,28 @@ static inline void x86_teardown_msi_irq(unsigned int irq) + { + x86_msi.teardown_msi_irq(irq); + } ++static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq) ++{ ++ x86_msi.restore_msi_irqs(dev, irq); ++} + #define arch_setup_msi_irqs x86_setup_msi_irqs + #define arch_teardown_msi_irqs x86_teardown_msi_irqs + #define arch_teardown_msi_irq x86_teardown_msi_irq ++#define arch_restore_msi_irqs x86_restore_msi_irqs + /* implemented in arch/x86/kernel/apic/io_apic. */ + int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); + void native_teardown_msi_irq(unsigned int irq); ++void native_restore_msi_irqs(struct pci_dev *dev, int irq); + /* default to the implementation in drivers/lib/msi.c */ + #define HAVE_DEFAULT_MSI_TEARDOWN_IRQS ++#define HAVE_DEFAULT_MSI_RESTORE_IRQS + void default_teardown_msi_irqs(struct pci_dev *dev); ++void default_restore_msi_irqs(struct pci_dev *dev, int irq); + #else + #define native_setup_msi_irqs NULL + #define native_teardown_msi_irq NULL + #define default_teardown_msi_irqs NULL ++#define default_restore_msi_irqs NULL + #endif + + #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) +diff --git a/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h +index 1971e65..cd52084 100644 +--- a/arch/x86/include/asm/x86_init.h ++++ b/arch/x86/include/asm/x86_init.h +@@ -177,6 +177,7 @@ struct x86_msi_ops { + int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); + void (*teardown_msi_irq)(unsigned int irq); + void (*teardown_msi_irqs)(struct pci_dev *dev); ++ void (*restore_msi_irqs)(struct pci_dev *dev, int irq); + }; + + extern struct x86_init_ops x86_init; +diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c +index c1d6cd5..83b05ad 100644 +--- a/arch/x86/kernel/x86_init.c ++++ b/arch/x86/kernel/x86_init.c +@@ -114,4 +114,5 @@ struct x86_msi_ops x86_msi = { + .setup_msi_irqs = native_setup_msi_irqs, + .teardown_msi_irq = native_teardown_msi_irq, + .teardown_msi_irqs = default_teardown_msi_irqs, ++ .restore_msi_irqs = default_restore_msi_irqs, + }; +diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c +index 82de95e..a825d78 100644 +--- a/drivers/pci/msi.c ++++ b/drivers/pci/msi.c +@@ -86,6 +86,31 @@ void default_teardown_msi_irqs(struct pci_dev *dev) + } + #endif + ++#ifndef arch_restore_msi_irqs ++# define arch_restore_msi_irqs default_restore_msi_irqs ++# define HAVE_DEFAULT_MSI_RESTORE_IRQS ++#endif ++ ++#ifdef HAVE_DEFAULT_MSI_RESTORE_IRQS ++void default_restore_msi_irqs(struct pci_dev *dev, int irq) ++{ ++ struct msi_desc *entry; ++ ++ entry = NULL; ++ if (dev->msix_enabled) { ++ list_for_each_entry(entry, &dev->msi_list, list) { ++ if (irq == entry->irq) ++ break; ++ } ++ } else if (dev->msi_enabled) { ++ entry = irq_get_msi_desc(irq); ++ } ++ ++ if (entry) ++ write_msi_msg(irq, &entry->msg); ++} ++#endif ++ + static void msi_set_enable(struct pci_dev *dev, int pos, int enable) + { + u16 control; +@@ -372,7 +397,7 @@ static void __pci_restore_msi_state(struct pci_dev *dev) + + pci_intx_for_msi(dev, 0); + msi_set_enable(dev, pos, 0); +- write_msi_msg(dev->irq, &entry->msg); ++ arch_restore_msi_irqs(dev, dev->irq); + + pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); + msi_mask_irq(entry, msi_capable_mask(control), entry->masked); +@@ -400,7 +425,7 @@ static void __pci_restore_msix_state(struct pci_dev *dev) + pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); + + list_for_each_entry(entry, &dev->msi_list, list) { +- write_msi_msg(entry->irq, &entry->msg); ++ arch_restore_msi_irqs(dev, entry->irq); + msix_mask_irq(entry, entry->masked); + } + +-- +1.7.6.4 + diff --git a/series-pvops.conf b/series-pvops.conf index e69de29..940e093 100644 --- a/series-pvops.conf +++ b/series-pvops.conf @@ -0,0 +1,11 @@ +patches.xen/pvops-0001-xen-Add-privcmd-device-driver.patch +patches.xen/pvops-0002-x86-acpi-tboot-Have-a-ACPI-os-prepare-sleep-instead-.patch +patches.xen/pvops-0003-tboot-Add-return-values-for-tboot_sleep.patch +patches.xen/pvops-0004-x86-acpi-sleep-Provide-registration-for-acpi_suspend.patch +patches.xen/pvops-0005-xen-acpi-sleep-Enable-ACPI-sleep-via-the-__acpi_os_p.patch +patches.xen/pvops-0006-xen-acpi-sleep-Register-to-the-acpi_suspend_lowlevel.patch +patches.xen/pvops-0007-xen-Utilize-the-restore_msi_irqs-hook.patch +patches.xen/pvops-0008-xen-setup-pm-acpi-Remove-the-call-to-boot_option_idl.patch +patches.xen/pvops-0009-xen-enlighten-Expose-MWAIT-and-MWAIT_LEAF-if-hypervi.patch +patches.xen/pvops-0010-CPUFREQ-xen-governor-for-Xen-hypervisor-frequency-sc.patch +patches.xen/pvops-0011-x86-PCI-Expand-the-x86_msi_ops-to-have-a-restore-MSI.patch