Merge branch 'kernel-4.4'
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/x86_64 4.3.2 Kernel Configuration
|
||||
# Linux/x86_64 4.4.0 Kernel Configuration
|
||||
#
|
||||
CONFIG_64BIT=y
|
||||
CONFIG_X86_64=y
|
||||
@@ -311,7 +311,6 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
||||
# CONFIG_MODULE_SIG is not set
|
||||
# CONFIG_MODULE_COMPRESS is not set
|
||||
CONFIG_MODULES_TREE_LOOKUP=y
|
||||
CONFIG_STOP_MACHINE=y
|
||||
CONFIG_BLOCK=y
|
||||
CONFIG_BLK_DEV_BSG=y
|
||||
CONFIG_BLK_DEV_BSGLIB=y
|
||||
@@ -449,7 +448,7 @@ CONFIG_X86_16BIT=y
|
||||
CONFIG_X86_ESPFIX64=y
|
||||
CONFIG_X86_VSYSCALL_EMULATION=y
|
||||
CONFIG_I8K=m
|
||||
CONFIG_MICROCODE=m
|
||||
CONFIG_MICROCODE=y
|
||||
CONFIG_MICROCODE_INTEL=y
|
||||
CONFIG_MICROCODE_AMD=y
|
||||
CONFIG_MICROCODE_OLD_INTERFACE=y
|
||||
@@ -488,7 +487,6 @@ CONFIG_HAVE_BOOTMEM_INFO_NODE=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTPLUG_SPARSE=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_ARCH_ENABLE_SPLIT_PMD_PTLOCK=y
|
||||
CONFIG_MEMORY_BALLOON=y
|
||||
@@ -557,6 +555,9 @@ CONFIG_HOTPLUG_CPU=y
|
||||
# CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set
|
||||
# CONFIG_DEBUG_HOTPLUG_CPU0 is not set
|
||||
# CONFIG_COMPAT_VDSO is not set
|
||||
# CONFIG_LEGACY_VSYSCALL_NATIVE is not set
|
||||
CONFIG_LEGACY_VSYSCALL_EMULATE=y
|
||||
# CONFIG_LEGACY_VSYSCALL_NONE is not set
|
||||
# CONFIG_CMDLINE_BOOL is not set
|
||||
CONFIG_MODIFY_LDT_SYSCALL=y
|
||||
CONFIG_HAVE_LIVEPATCH=y
|
||||
@@ -591,6 +592,7 @@ CONFIG_ACPI=y
|
||||
CONFIG_ACPI_LEGACY_TABLES_LOOKUP=y
|
||||
CONFIG_ARCH_MIGHT_HAVE_ACPI_PDC=y
|
||||
CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT=y
|
||||
# CONFIG_ACPI_DEBUGGER is not set
|
||||
CONFIG_ACPI_SLEEP=y
|
||||
# CONFIG_ACPI_PROCFS_POWER is not set
|
||||
CONFIG_ACPI_REV_OVERRIDE_POSSIBLE=y
|
||||
@@ -910,8 +912,7 @@ CONFIG_NF_CONNTRACK_SIP=m
|
||||
CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_CT_NETLINK=m
|
||||
# CONFIG_NF_CT_NETLINK_TIMEOUT is not set
|
||||
# CONFIG_NF_CT_NETLINK_HELPER is not set
|
||||
CONFIG_NETFILTER_NETLINK_QUEUE_CT=y
|
||||
# CONFIG_NETFILTER_NETLINK_GLUE_CT is not set
|
||||
CONFIG_NF_NAT=m
|
||||
CONFIG_NF_NAT_NEEDED=y
|
||||
CONFIG_NF_NAT_PROTO_DCCP=m
|
||||
@@ -1262,6 +1263,7 @@ CONFIG_6LOWPAN_NHC_MOBILITY=m
|
||||
CONFIG_6LOWPAN_NHC_ROUTING=m
|
||||
CONFIG_6LOWPAN_NHC_UDP=m
|
||||
CONFIG_IEEE802154=m
|
||||
# CONFIG_IEEE802154_NL802154_EXPERIMENTAL is not set
|
||||
CONFIG_IEEE802154_SOCKET=m
|
||||
CONFIG_IEEE802154_6LOWPAN=m
|
||||
CONFIG_MAC802154=m
|
||||
@@ -1359,6 +1361,7 @@ CONFIG_MPLS_ROUTING=m
|
||||
CONFIG_MPLS_IPTUNNEL=m
|
||||
CONFIG_HSR=m
|
||||
# CONFIG_NET_SWITCHDEV is not set
|
||||
# CONFIG_NET_L3_MASTER_DEV is not set
|
||||
CONFIG_RPS=y
|
||||
CONFIG_RFS_ACCEL=y
|
||||
CONFIG_XPS=y
|
||||
@@ -1513,6 +1516,7 @@ CONFIG_CFG80211=m
|
||||
# CONFIG_CFG80211_DEFAULT_PS is not set
|
||||
CONFIG_CFG80211_DEBUGFS=y
|
||||
# CONFIG_CFG80211_INTERNAL_REGDB is not set
|
||||
CONFIG_CFG80211_CRDA_SUPPORT=y
|
||||
CONFIG_CFG80211_WEXT=y
|
||||
CONFIG_CFG80211_WEXT_EXPORT=y
|
||||
CONFIG_LIB80211=m
|
||||
@@ -1562,6 +1566,8 @@ CONFIG_NFC_WILINK=m
|
||||
CONFIG_NFC_MEI_PHY=m
|
||||
# CONFIG_NFC_SIM is not set
|
||||
CONFIG_NFC_PORT100=m
|
||||
CONFIG_NFC_FDP=m
|
||||
CONFIG_NFC_FDP_I2C=m
|
||||
CONFIG_NFC_PN544=m
|
||||
CONFIG_NFC_PN544_I2C=m
|
||||
CONFIG_NFC_PN544_MEI=m
|
||||
@@ -1570,6 +1576,7 @@ CONFIG_NFC_MICROREAD_I2C=m
|
||||
CONFIG_NFC_MICROREAD_MEI=m
|
||||
CONFIG_NFC_MRVL=m
|
||||
CONFIG_NFC_MRVL_USB=m
|
||||
CONFIG_NFC_MRVL_I2C=m
|
||||
CONFIG_NFC_ST21NFCA=m
|
||||
CONFIG_NFC_ST21NFCA_I2C=m
|
||||
# CONFIG_NFC_ST_NCI is not set
|
||||
@@ -1724,7 +1731,6 @@ CONFIG_BLK_DEV_CRYPTOLOOP=m
|
||||
CONFIG_BLK_DEV_DRBD=m
|
||||
# CONFIG_DRBD_FAULT_INJECTION is not set
|
||||
CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_NVME=m
|
||||
CONFIG_BLK_DEV_SKD=m
|
||||
CONFIG_BLK_DEV_OSD=m
|
||||
CONFIG_BLK_DEV_SX8=m
|
||||
@@ -1742,6 +1748,7 @@ CONFIG_VIRTIO_BLK=m
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
CONFIG_BLK_DEV_RBD=m
|
||||
CONFIG_BLK_DEV_RSXX=m
|
||||
CONFIG_BLK_DEV_NVME=m
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
@@ -1819,6 +1826,10 @@ CONFIG_INTEL_MIC_BUS=m
|
||||
#
|
||||
# SCIF Driver
|
||||
#
|
||||
|
||||
#
|
||||
# Intel MIC Coprocessor State Management (COSM) Drivers
|
||||
#
|
||||
CONFIG_GENWQE=m
|
||||
CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=1
|
||||
# CONFIG_ECHO is not set
|
||||
@@ -1906,12 +1917,10 @@ CONFIG_MEGARAID_MM=m
|
||||
CONFIG_MEGARAID_MAILBOX=m
|
||||
CONFIG_MEGARAID_LEGACY=m
|
||||
CONFIG_MEGARAID_SAS=m
|
||||
CONFIG_SCSI_MPT2SAS=m
|
||||
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
|
||||
CONFIG_SCSI_MPT2SAS_LOGGING=y
|
||||
CONFIG_SCSI_MPT3SAS=m
|
||||
CONFIG_SCSI_MPT2SAS_MAX_SGE=128
|
||||
CONFIG_SCSI_MPT3SAS_MAX_SGE=128
|
||||
CONFIG_SCSI_MPT3SAS_LOGGING=y
|
||||
CONFIG_SCSI_MPT2SAS=m
|
||||
CONFIG_SCSI_UFSHCD=m
|
||||
CONFIG_SCSI_UFSHCD_PCI=m
|
||||
CONFIG_SCSI_UFSHCD_PLATFORM=m
|
||||
@@ -2160,7 +2169,6 @@ CONFIG_TUN=m
|
||||
CONFIG_VETH=m
|
||||
CONFIG_VIRTIO_NET=m
|
||||
# CONFIG_NLMON is not set
|
||||
CONFIG_NET_VRF=m
|
||||
CONFIG_SUNGEM_PHY=m
|
||||
# CONFIG_ARCNET is not set
|
||||
CONFIG_ATM_DRIVERS=y
|
||||
@@ -2224,6 +2232,7 @@ CONFIG_ATL1=m
|
||||
CONFIG_ATL1E=m
|
||||
CONFIG_ATL1C=m
|
||||
CONFIG_ALX=m
|
||||
# CONFIG_NET_VENDOR_AURORA is not set
|
||||
CONFIG_NET_CADENCE=y
|
||||
CONFIG_MACB=m
|
||||
CONFIG_NET_VENDOR_BROADCOM=y
|
||||
@@ -2238,6 +2247,8 @@ CONFIG_TIGON3=m
|
||||
CONFIG_BNX2X=m
|
||||
CONFIG_BNX2X_SRIOV=y
|
||||
CONFIG_BNX2X_VXLAN=y
|
||||
CONFIG_BNXT=m
|
||||
CONFIG_BNXT_SRIOV=y
|
||||
CONFIG_NET_VENDOR_BROCADE=y
|
||||
CONFIG_BNA=m
|
||||
CONFIG_NET_VENDOR_CAVIUM=y
|
||||
@@ -2307,7 +2318,6 @@ CONFIG_I40E_DCB=y
|
||||
CONFIG_I40EVF=m
|
||||
# CONFIG_FM10K is not set
|
||||
# CONFIG_NET_VENDOR_I825XX is not set
|
||||
CONFIG_IP1000=m
|
||||
CONFIG_JME=m
|
||||
CONFIG_NET_VENDOR_MARVELL=y
|
||||
CONFIG_MVMDIO=m
|
||||
@@ -2356,6 +2366,8 @@ CONFIG_QLCNIC_VXLAN=y
|
||||
CONFIG_QLCNIC_HWMON=y
|
||||
CONFIG_QLGE=m
|
||||
CONFIG_NETXEN_NIC=m
|
||||
CONFIG_QED=m
|
||||
CONFIG_QEDE=m
|
||||
CONFIG_NET_VENDOR_QUALCOMM=y
|
||||
CONFIG_NET_VENDOR_REALTEK=y
|
||||
CONFIG_ATP=m
|
||||
@@ -2435,6 +2447,7 @@ CONFIG_CICADA_PHY=m
|
||||
CONFIG_VITESSE_PHY=m
|
||||
CONFIG_TERANETICS_PHY=m
|
||||
CONFIG_SMSC_PHY=m
|
||||
CONFIG_BCM_NET_PHYLIB=m
|
||||
CONFIG_BROADCOM_PHY=m
|
||||
CONFIG_BCM7XXX_PHY=m
|
||||
CONFIG_BCM87XX_PHY=m
|
||||
@@ -2523,10 +2536,10 @@ CONFIG_AT76C50X_USB=m
|
||||
# CONFIG_PRISM54 is not set
|
||||
# CONFIG_USB_ZD1201 is not set
|
||||
CONFIG_USB_NET_RNDIS_WLAN=m
|
||||
# CONFIG_ADM8211 is not set
|
||||
CONFIG_RTL8180=m
|
||||
CONFIG_RTL8187=m
|
||||
CONFIG_RTL8187_LEDS=y
|
||||
# CONFIG_ADM8211 is not set
|
||||
CONFIG_MAC80211_HWSIM=m
|
||||
CONFIG_MWL8K=m
|
||||
CONFIG_ATH_COMMON=m
|
||||
@@ -2580,7 +2593,6 @@ CONFIG_B43_BUSES_BCMA_AND_SSB=y
|
||||
# CONFIG_B43_BUSES_SSB is not set
|
||||
CONFIG_B43_PCI_AUTOSELECT=y
|
||||
CONFIG_B43_PCICORE_AUTOSELECT=y
|
||||
CONFIG_B43_PCMCIA=y
|
||||
CONFIG_B43_SDIO=y
|
||||
CONFIG_B43_BCMA_PIO=y
|
||||
CONFIG_B43_PIO=y
|
||||
@@ -2696,8 +2708,8 @@ CONFIG_RTL8192DE=m
|
||||
CONFIG_RTL8723AE=m
|
||||
CONFIG_RTL8723BE=m
|
||||
CONFIG_RTL8188EE=m
|
||||
# CONFIG_RTL8192EE is not set
|
||||
# CONFIG_RTL8821AE is not set
|
||||
CONFIG_RTL8192EE=m
|
||||
CONFIG_RTL8821AE=m
|
||||
CONFIG_RTL8192CU=m
|
||||
CONFIG_RTLWIFI=m
|
||||
CONFIG_RTLWIFI_PCI=m
|
||||
@@ -2706,6 +2718,8 @@ CONFIG_RTLWIFI_USB=m
|
||||
CONFIG_RTL8192C_COMMON=m
|
||||
CONFIG_RTL8723_COMMON=m
|
||||
CONFIG_RTLBTCOEXIST=m
|
||||
CONFIG_RTL8XXXU=m
|
||||
# CONFIG_RTL8XXXU_UNTESTED is not set
|
||||
# CONFIG_WL_TI is not set
|
||||
CONFIG_ZD1211RW=m
|
||||
# CONFIG_ZD1211RW_DEBUG is not set
|
||||
@@ -2865,6 +2879,7 @@ CONFIG_MISDN_NETJET=m
|
||||
CONFIG_MISDN_IPAC=m
|
||||
CONFIG_MISDN_ISAR=m
|
||||
CONFIG_ISDN_HDLC=m
|
||||
# CONFIG_NVM is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
@@ -2989,6 +3004,7 @@ CONFIG_TOUCHSCREEN_CYTTSP4_I2C=m
|
||||
CONFIG_TOUCHSCREEN_DYNAPRO=m
|
||||
CONFIG_TOUCHSCREEN_HAMPSHIRE=m
|
||||
CONFIG_TOUCHSCREEN_EETI=m
|
||||
CONFIG_TOUCHSCREEN_FT6236=m
|
||||
CONFIG_TOUCHSCREEN_FUJITSU=m
|
||||
# CONFIG_TOUCHSCREEN_GOODIX is not set
|
||||
CONFIG_TOUCHSCREEN_ILI210X=m
|
||||
@@ -3036,12 +3052,15 @@ CONFIG_TOUCHSCREEN_USB_NEXIO=y
|
||||
CONFIG_TOUCHSCREEN_USB_EASYTOUCH=y
|
||||
CONFIG_TOUCHSCREEN_TOUCHIT213=m
|
||||
CONFIG_TOUCHSCREEN_TSC_SERIO=m
|
||||
CONFIG_TOUCHSCREEN_TSC200X_CORE=m
|
||||
CONFIG_TOUCHSCREEN_TSC2004=m
|
||||
CONFIG_TOUCHSCREEN_TSC2007=m
|
||||
CONFIG_TOUCHSCREEN_ST1232=m
|
||||
CONFIG_TOUCHSCREEN_SUR40=m
|
||||
CONFIG_TOUCHSCREEN_SX8654=m
|
||||
CONFIG_TOUCHSCREEN_TPS6507X=m
|
||||
CONFIG_TOUCHSCREEN_ZFORCE=m
|
||||
CONFIG_TOUCHSCREEN_ROHM_BU21023=m
|
||||
CONFIG_INPUT_MISC=y
|
||||
# CONFIG_INPUT_AD714X is not set
|
||||
# CONFIG_INPUT_BMA150 is not set
|
||||
@@ -3094,6 +3113,7 @@ CONFIG_SERIO_ALTERA_PS2=m
|
||||
CONFIG_SERIO_PS2MULT=m
|
||||
CONFIG_SERIO_ARC_PS2=m
|
||||
CONFIG_HYPERV_KEYBOARD=m
|
||||
CONFIG_USERIO=m
|
||||
CONFIG_GAMEPORT=m
|
||||
CONFIG_GAMEPORT_NS558=m
|
||||
CONFIG_GAMEPORT_L4=m
|
||||
@@ -3148,8 +3168,11 @@ CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
|
||||
CONFIG_SERIAL_8250_RSA=y
|
||||
# CONFIG_SERIAL_8250_FSL is not set
|
||||
CONFIG_SERIAL_8250_DW=m
|
||||
# CONFIG_SERIAL_8250_RT288X is not set
|
||||
# CONFIG_SERIAL_8250_FINTEK is not set
|
||||
CONFIG_SERIAL_8250_MID=m
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
@@ -3354,6 +3377,7 @@ CONFIG_PINCTRL_AMD=y
|
||||
CONFIG_PINCTRL_BAYTRAIL=y
|
||||
CONFIG_PINCTRL_CHERRYVIEW=m
|
||||
CONFIG_PINCTRL_INTEL=m
|
||||
CONFIG_PINCTRL_BROXTON=m
|
||||
CONFIG_PINCTRL_SUNRISEPOINT=m
|
||||
CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
|
||||
CONFIG_GPIOLIB=y
|
||||
@@ -3367,15 +3391,22 @@ CONFIG_GPIO_MAX730X=m
|
||||
#
|
||||
# Memory mapped GPIO drivers
|
||||
#
|
||||
CONFIG_GPIO_AMDPT=m
|
||||
CONFIG_GPIO_DWAPB=m
|
||||
CONFIG_GPIO_F7188X=m
|
||||
CONFIG_GPIO_GENERIC_PLATFORM=y
|
||||
CONFIG_GPIO_ICH=m
|
||||
CONFIG_GPIO_IT8761E=m
|
||||
CONFIG_GPIO_LYNXPOINT=m
|
||||
CONFIG_GPIO_VX855=m
|
||||
# CONFIG_GPIO_ZX is not set
|
||||
|
||||
#
|
||||
# Port-mapped I/O GPIO drivers
|
||||
#
|
||||
CONFIG_GPIO_104_IDIO_16=m
|
||||
CONFIG_GPIO_F7188X=m
|
||||
CONFIG_GPIO_IT87=m
|
||||
CONFIG_GPIO_SCH=m
|
||||
CONFIG_GPIO_SCH311X=m
|
||||
CONFIG_GPIO_VX855=m
|
||||
|
||||
#
|
||||
# I2C GPIO expanders
|
||||
@@ -3400,6 +3431,11 @@ CONFIG_GPIO_INTEL_MID=y
|
||||
CONFIG_GPIO_ML_IOH=m
|
||||
CONFIG_GPIO_RDC321X=m
|
||||
|
||||
#
|
||||
# SPI or I2C GPIO expanders
|
||||
#
|
||||
CONFIG_GPIO_MCP23S08=m
|
||||
|
||||
#
|
||||
# USB GPIO expanders
|
||||
#
|
||||
@@ -3443,7 +3479,9 @@ CONFIG_POWER_SUPPLY=y
|
||||
# CONFIG_BATTERY_DS2781 is not set
|
||||
# CONFIG_BATTERY_DS2782 is not set
|
||||
# CONFIG_BATTERY_SBS is not set
|
||||
# CONFIG_BATTERY_BQ27x00 is not set
|
||||
CONFIG_BATTERY_BQ27XXX=m
|
||||
CONFIG_BATTERY_BQ27XXX_I2C=y
|
||||
CONFIG_BATTERY_BQ27XXX_PLATFORM=y
|
||||
# CONFIG_BATTERY_MAX17040 is not set
|
||||
# CONFIG_BATTERY_MAX17042 is not set
|
||||
# CONFIG_CHARGER_ISP1704 is not set
|
||||
@@ -3527,6 +3565,7 @@ CONFIG_SENSORS_MAX6639=m
|
||||
CONFIG_SENSORS_MAX6642=m
|
||||
CONFIG_SENSORS_MAX6650=m
|
||||
CONFIG_SENSORS_MAX6697=m
|
||||
CONFIG_SENSORS_MAX31790=m
|
||||
CONFIG_SENSORS_HTU21=m
|
||||
CONFIG_SENSORS_MCP3021=m
|
||||
CONFIG_SENSORS_LM63=m
|
||||
@@ -3614,7 +3653,7 @@ CONFIG_SENSORS_ACPI_POWER=m
|
||||
CONFIG_SENSORS_ATK0110=m
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_THERMAL_HWMON=y
|
||||
# CONFIG_THERMAL_WRITABLE_TRIPS is not set
|
||||
CONFIG_THERMAL_WRITABLE_TRIPS=y
|
||||
CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE=y
|
||||
# CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE is not set
|
||||
# CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE is not set
|
||||
@@ -3676,6 +3715,7 @@ CONFIG_W83877F_WDT=m
|
||||
CONFIG_W83977F_WDT=m
|
||||
CONFIG_MACHZ_WDT=m
|
||||
# CONFIG_SBC_EPX_C3_WATCHDOG is not set
|
||||
CONFIG_BCM7038_WDT=m
|
||||
CONFIG_MEN_A21_WDT=m
|
||||
CONFIG_XEN_WDT=m
|
||||
|
||||
@@ -3704,6 +3744,7 @@ CONFIG_SSB_PCMCIAHOST_POSSIBLE=y
|
||||
CONFIG_SSB_PCMCIAHOST=y
|
||||
CONFIG_SSB_SDIOHOST_POSSIBLE=y
|
||||
CONFIG_SSB_SDIOHOST=y
|
||||
# CONFIG_SSB_HOST_SOC is not set
|
||||
# CONFIG_SSB_DEBUG is not set
|
||||
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
|
||||
CONFIG_SSB_DRIVER_PCICORE=y
|
||||
@@ -4527,6 +4568,7 @@ CONFIG_FB_VOODOO1=m
|
||||
# CONFIG_FB_SM501 is not set
|
||||
# CONFIG_FB_SMSCUFX is not set
|
||||
# CONFIG_FB_UDL is not set
|
||||
CONFIG_FB_IBM_GXT4500=m
|
||||
CONFIG_FB_VIRTUAL=m
|
||||
CONFIG_XEN_FBDEV_FRONTEND=y
|
||||
# CONFIG_FB_METRONOME is not set
|
||||
@@ -4585,6 +4627,7 @@ CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||
CONFIG_SND_PCM_TIMER=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
CONFIG_SND_HRTIMER=m
|
||||
CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
|
||||
@@ -4743,6 +4786,8 @@ CONFIG_SND_ISIGHT=m
|
||||
CONFIG_SND_SCS1X=m
|
||||
CONFIG_SND_FIREWORKS=m
|
||||
CONFIG_SND_BEBOB=m
|
||||
CONFIG_SND_FIREWIRE_DIGI00X=m
|
||||
CONFIG_SND_FIREWIRE_TASCAM=m
|
||||
# CONFIG_SND_PCMCIA is not set
|
||||
# CONFIG_SND_SOC is not set
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
@@ -4770,6 +4815,7 @@ CONFIG_HID_BELKIN=y
|
||||
CONFIG_HID_BETOP_FF=m
|
||||
CONFIG_HID_CHERRY=y
|
||||
CONFIG_HID_CHICONY=y
|
||||
CONFIG_HID_CORSAIR=m
|
||||
CONFIG_HID_PRODIKEYS=m
|
||||
CONFIG_HID_CP2112=m
|
||||
CONFIG_HID_CYPRESS=y
|
||||
@@ -4780,6 +4826,7 @@ CONFIG_HID_ELECOM=m
|
||||
CONFIG_HID_ELO=m
|
||||
CONFIG_HID_EZKEY=y
|
||||
CONFIG_HID_GEMBIRD=m
|
||||
CONFIG_HID_GFRM=m
|
||||
CONFIG_HID_HOLTEK=m
|
||||
CONFIG_HOLTEK_FF=y
|
||||
CONFIG_HID_GT683R=m
|
||||
@@ -4894,7 +4941,6 @@ CONFIG_USB_EHCI_PCI=y
|
||||
# CONFIG_USB_OXU210HP_HCD is not set
|
||||
# CONFIG_USB_ISP116X_HCD is not set
|
||||
CONFIG_USB_ISP1362_HCD=m
|
||||
CONFIG_USB_FUSBH200_HCD=m
|
||||
CONFIG_USB_FOTG210_HCD=m
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_OHCI_HCD_PCI=y
|
||||
@@ -5092,7 +5138,6 @@ CONFIG_UWB_WHCI=m
|
||||
CONFIG_UWB_I1480U=m
|
||||
CONFIG_MMC=m
|
||||
# CONFIG_MMC_DEBUG is not set
|
||||
# CONFIG_MMC_CLKGATE is not set
|
||||
|
||||
#
|
||||
# MMC/SD/SDIO Card Drivers
|
||||
@@ -5290,6 +5335,7 @@ CONFIG_RTC_DRV_RX8581=m
|
||||
CONFIG_RTC_DRV_RX8025=m
|
||||
CONFIG_RTC_DRV_EM3027=m
|
||||
CONFIG_RTC_DRV_RV3029C2=m
|
||||
CONFIG_RTC_DRV_RV8803=m
|
||||
|
||||
#
|
||||
# SPI RTC drivers
|
||||
@@ -5339,13 +5385,12 @@ CONFIG_DMADEVICES=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
CONFIG_DMA_VIRTUAL_CHANNELS=m
|
||||
CONFIG_DMA_ACPI=y
|
||||
CONFIG_IDMA64=m
|
||||
CONFIG_INTEL_IDMA64=m
|
||||
CONFIG_INTEL_IOATDMA=m
|
||||
CONFIG_INTEL_MIC_X100_DMA=m
|
||||
# CONFIG_DW_DMAC is not set
|
||||
# CONFIG_DW_DMAC_PCI is not set
|
||||
CONFIG_HSU_DMA=m
|
||||
CONFIG_HSU_DMA_PCI=m
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
@@ -5377,6 +5422,7 @@ CONFIG_VFIO_PCI=y
|
||||
CONFIG_VFIO_PCI_VGA=y
|
||||
CONFIG_VFIO_PCI_MMAP=y
|
||||
CONFIG_VFIO_PCI_INTX=y
|
||||
CONFIG_IRQ_BYPASS_MANAGER=y
|
||||
# CONFIG_VIRT_DRIVERS is not set
|
||||
CONFIG_VIRTIO=y
|
||||
|
||||
@@ -5443,7 +5489,6 @@ CONFIG_RTS5208=m
|
||||
# CONFIG_VT6656 is not set
|
||||
CONFIG_FB_SM750=m
|
||||
# CONFIG_FB_XGI is not set
|
||||
# CONFIG_FT1000 is not set
|
||||
|
||||
#
|
||||
# Speakup console speech
|
||||
@@ -5464,7 +5509,7 @@ CONFIG_LIRC_SERIAL=m
|
||||
CONFIG_LIRC_SERIAL_TRANSMITTER=y
|
||||
CONFIG_LIRC_SIR=m
|
||||
CONFIG_LIRC_ZILOG=m
|
||||
CONFIG_STAGING_RDMA=y
|
||||
CONFIG_STAGING_RDMA=m
|
||||
CONFIG_INFINIBAND_AMSO1100=m
|
||||
# CONFIG_INFINIBAND_AMSO1100_DEBUG is not set
|
||||
CONFIG_INFINIBAND_HFI1=m
|
||||
@@ -5503,6 +5548,7 @@ CONFIG_DGAP=m
|
||||
# CONFIG_CRYPTO_SKEIN is not set
|
||||
CONFIG_UNISYSSPAR=y
|
||||
# CONFIG_UNISYS_VISORBUS is not set
|
||||
# CONFIG_WILC1000_DRIVER is not set
|
||||
CONFIG_MOST=m
|
||||
CONFIG_MOSTCORE=m
|
||||
CONFIG_AIM_CDEV=m
|
||||
@@ -5554,6 +5600,7 @@ CONFIG_TOPSTAR_LAPTOP=m
|
||||
CONFIG_ACPI_TOSHIBA=m
|
||||
CONFIG_TOSHIBA_BT_RFKILL=m
|
||||
CONFIG_TOSHIBA_HAPS=m
|
||||
CONFIG_TOSHIBA_WMI=m
|
||||
CONFIG_ACPI_CMPC=m
|
||||
CONFIG_INTEL_IPS=m
|
||||
# CONFIG_IBM_RTL is not set
|
||||
@@ -5616,6 +5663,7 @@ CONFIG_AMD_IOMMU_STATS=y
|
||||
CONFIG_AMD_IOMMU_V2=m
|
||||
CONFIG_DMAR_TABLE=y
|
||||
CONFIG_INTEL_IOMMU=y
|
||||
# CONFIG_INTEL_IOMMU_SVM is not set
|
||||
# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set
|
||||
CONFIG_INTEL_IOMMU_FLOPPY_WA=y
|
||||
CONFIG_IRQ_REMAP=y
|
||||
@@ -5664,6 +5712,7 @@ CONFIG_PWM_LP3943=m
|
||||
CONFIG_PWM_LPSS=m
|
||||
# CONFIG_PWM_LPSS_PCI is not set
|
||||
# CONFIG_PWM_LPSS_PLATFORM is not set
|
||||
CONFIG_PWM_PCA9685=m
|
||||
# CONFIG_IPACK_BUS is not set
|
||||
CONFIG_RESET_CONTROLLER=y
|
||||
# CONFIG_FMC is not set
|
||||
@@ -5697,6 +5746,22 @@ CONFIG_ANDROID=y
|
||||
CONFIG_ANDROID_BINDER_IPC=y
|
||||
# CONFIG_LIBNVDIMM is not set
|
||||
CONFIG_NVMEM=m
|
||||
CONFIG_STM=m
|
||||
CONFIG_STM_DUMMY=m
|
||||
CONFIG_STM_SOURCE_CONSOLE=m
|
||||
CONFIG_INTEL_TH=m
|
||||
CONFIG_INTEL_TH_PCI=m
|
||||
CONFIG_INTEL_TH_GTH=m
|
||||
CONFIG_INTEL_TH_STH=m
|
||||
CONFIG_INTEL_TH_MSU=m
|
||||
CONFIG_INTEL_TH_PTI=m
|
||||
# CONFIG_INTEL_TH_DEBUG is not set
|
||||
|
||||
#
|
||||
# FPGA Configuration Support
|
||||
#
|
||||
CONFIG_FPGA=m
|
||||
CONFIG_FPGA_MGR_ZYNQ_FPGA=m
|
||||
|
||||
#
|
||||
# Firmware Drivers
|
||||
@@ -5727,6 +5792,7 @@ CONFIG_EFI_ESRT=y
|
||||
CONFIG_EFI_VARS_PSTORE=y
|
||||
# CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set
|
||||
CONFIG_EFI_RUNTIME_MAP=y
|
||||
# CONFIG_EFI_FAKE_MEMMAP is not set
|
||||
CONFIG_EFI_RUNTIME_WRAPPERS=y
|
||||
CONFIG_UEFI_CPER=y
|
||||
|
||||
@@ -5879,6 +5945,7 @@ CONFIG_UBIFS_FS=m
|
||||
# CONFIG_UBIFS_FS_ADVANCED_COMPR is not set
|
||||
CONFIG_UBIFS_FS_LZO=y
|
||||
CONFIG_UBIFS_FS_ZLIB=y
|
||||
# CONFIG_UBIFS_ATIME_SUPPORT is not set
|
||||
# CONFIG_LOGFS is not set
|
||||
CONFIG_CRAMFS=m
|
||||
CONFIG_SQUASHFS=m
|
||||
@@ -6083,6 +6150,7 @@ CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_HEADERS_CHECK=y
|
||||
CONFIG_DEBUG_SECTION_MISMATCH=y
|
||||
CONFIG_SECTION_MISMATCH_WARN_ONLY=y
|
||||
CONFIG_ARCH_WANT_FRAME_POINTERS=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
@@ -6168,6 +6236,7 @@ CONFIG_FTRACE_MCOUNT_RECORD=y
|
||||
CONFIG_RING_BUFFER_BENCHMARK=m
|
||||
# CONFIG_RING_BUFFER_STARTUP_TEST is not set
|
||||
CONFIG_TRACE_ENUM_MAP_FILE=y
|
||||
CONFIG_TRACING_EVENTS_GPIO=y
|
||||
|
||||
#
|
||||
# Runtime Testing
|
||||
@@ -6178,6 +6247,7 @@ CONFIG_ASYNC_RAID6_TEST=m
|
||||
CONFIG_TEST_HEXDUMP=m
|
||||
# CONFIG_TEST_STRING_HELPERS is not set
|
||||
CONFIG_TEST_KSTRTOX=y
|
||||
CONFIG_TEST_PRINTF=m
|
||||
# CONFIG_TEST_RHASHTABLE is not set
|
||||
# CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
|
||||
# CONFIG_BUILD_DOCSRC is not set
|
||||
@@ -6196,6 +6266,8 @@ CONFIG_STRICT_DEVMEM=y
|
||||
CONFIG_EARLY_PRINTK=y
|
||||
CONFIG_EARLY_PRINTK_DBGP=y
|
||||
# CONFIG_EARLY_PRINTK_EFI is not set
|
||||
# CONFIG_X86_PTDUMP_CORE is not set
|
||||
# CONFIG_EFI_PGT_DUMP is not set
|
||||
CONFIG_DEBUG_SET_MODULE_RONX=y
|
||||
CONFIG_DOUBLEFAULT=y
|
||||
# CONFIG_IOMMU_STRESS is not set
|
||||
@@ -6310,6 +6382,7 @@ CONFIG_CRYPTO_ECB=y
|
||||
CONFIG_CRYPTO_LRW=y
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=y
|
||||
CONFIG_CRYPTO_KEYWRAP=m
|
||||
|
||||
#
|
||||
# Hash modes
|
||||
@@ -6448,6 +6521,7 @@ CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
|
||||
CONFIG_KVM_VFIO=y
|
||||
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
|
||||
CONFIG_KVM_COMPAT=y
|
||||
CONFIG_HAVE_KVM_IRQ_BYPASS=y
|
||||
CONFIG_VIRTUALIZATION=y
|
||||
CONFIG_KVM=m
|
||||
CONFIG_KVM_INTEL=m
|
||||
|
||||
@@ -83,9 +83,9 @@ diff -Nurp linux-4.2.2/Makefile linux-4.2.2-3rd/Makefile
|
||||
net-y := net/
|
||||
libs-y := lib/
|
||||
core-y := usr/
|
||||
diff -Nurp linux-4.2.2/scripts/kconfig/Makefile linux-4.2.2-3rd/scripts/kconfig/Makefile
|
||||
--- linux-4.2.2/scripts/kconfig/Makefile 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/scripts/kconfig/Makefile 2015-09-29 23:04:06.298700940 +0300
|
||||
diff -Nurp linux-4.4.0/scripts/kconfig/Makefile linux-4.4.0-3rd/scripts/kconfig/Makefile
|
||||
--- linux-4.4.0/scripts/kconfig/Makefile
|
||||
+++ linux-4.4.0-3rd/scripts/kconfig/Makefile
|
||||
@@ -18,26 +18,26 @@ endif
|
||||
# We need this, in case the user has it in its environment
|
||||
unexport CONFIG_
|
||||
@@ -144,9 +144,9 @@ diff -Nurp linux-4.2.2/scripts/kconfig/Makefile linux-4.2.2-3rd/scripts/kconfig/
|
||||
+defconfig: $(obj)/conf 3rdparty/Makefile
|
||||
ifeq ($(KBUILD_DEFCONFIG),)
|
||||
$< $(silent) --defconfig $(Kconfig)
|
||||
else
|
||||
@@ -101,7 +101,7 @@ else
|
||||
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
|
||||
else ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
|
||||
@@ -104,26 +104,26 @@ else
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
|
||||
endif
|
||||
|
||||
-%_defconfig: $(obj)/conf
|
||||
@@ -154,7 +154,11 @@ diff -Nurp linux-4.2.2/scripts/kconfig/Makefile linux-4.2.2-3rd/scripts/kconfig/
|
||||
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
||||
|
||||
configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@)
|
||||
@@ -112,14 +112,14 @@ configfiles=$(wildcard $(srctree)/kernel
|
||||
|
||||
-%.config: $(obj)/conf
|
||||
+%.config: $(obj)/conf 3rdparty/Makefile
|
||||
$(if $(call configfiles),, $(error No configuration exists for this target on this architecture))
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles)
|
||||
+$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
|
||||
|
||||
PHONY += kvmconfig
|
||||
@@ -167,12 +171,13 @@ diff -Nurp linux-4.2.2/scripts/kconfig/Makefile linux-4.2.2-3rd/scripts/kconfig/
|
||||
+xenconfig: xen.config 3rdparty/Makefile
|
||||
@:
|
||||
|
||||
-PHONY += tinyconfig
|
||||
+PHONY += tinyconfig 3rdparty/Makefile
|
||||
tinyconfig:
|
||||
PHONY += tinyconfig
|
||||
-tinyconfig:
|
||||
+tinyconfig: 3rdparty/Makefile
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config
|
||||
|
||||
@@ -183,6 +183,9 @@ gconf-objs := gconf.o zconf.tab.o
|
||||
# Help text used by make help
|
||||
@@ -186,6 +186,9 @@ gconf-objs := gconf.o zconf.tab.o
|
||||
|
||||
hostprogs-y := conf nconf mconf kxgettext qconf gconf
|
||||
|
||||
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
From 584d8d1eb123b8be1274bf69f3ce07cee848d40d Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 21 Oct 2015 13:45:03 +0200
|
||||
Subject: [PATCH] ACPI / video: Add a quirk to force native backlight on Lenovo
|
||||
IdeaPad S405
|
||||
|
||||
The Lenovo IdeaPad S405 is a not "Windows8 ready" machine which still has
|
||||
a broken ACPI video backlight implementation. Add a quirk to force use
|
||||
of native backlight on this machine.
|
||||
|
||||
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1201530
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
---
|
||||
drivers/acpi/video_detect.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
|
||||
index 2922f1f..0d3a384 100644
|
||||
--- a/drivers/acpi/video_detect.c
|
||||
+++ b/drivers/acpi/video_detect.c
|
||||
@@ -244,6 +244,15 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
|
||||
/* Non win8 machines which need native backlight nevertheless */
|
||||
{
|
||||
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1201530 */
|
||||
+ .callback = video_detect_force_native,
|
||||
+ .ident = "Lenovo Ideapad S405",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
+ DMI_MATCH(DMI_BOARD_NAME, "Lenovo IdeaPad S405"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
|
||||
.callback = video_detect_force_native,
|
||||
.ident = "Lenovo Ideapad Z570",
|
||||
--
|
||||
2.3.10
|
||||
|
||||
-51
@@ -1,51 +0,0 @@
|
||||
From fa5c35011a8d5f3d0c597a6336107eafd1b6046c Mon Sep 17 00:00:00 2001
|
||||
From: Matt Fleming <matt.fleming@intel.com>
|
||||
Date: Fri, 7 Aug 2015 09:36:56 +0100
|
||||
Subject: [PATCH] Revert "x86/efi: Request desired alignment via the PE/COFF
|
||||
headers"
|
||||
|
||||
This reverts commit:
|
||||
|
||||
aeffc4928ea2 ("x86/efi: Request desired alignment via the PE/COFF headers")
|
||||
|
||||
Linn reports that Signtool complains that kernels built with
|
||||
CONFIG_EFI_STUB=y are violating the PE/COFF specification because
|
||||
the 'SizeOfImage' field is not a multiple of 'SectionAlignment'.
|
||||
|
||||
This violation was introduced as an optimisation to skip having
|
||||
the kernel relocate itself during boot and instead have the
|
||||
firmware place it at a correctly aligned address.
|
||||
|
||||
No one else has complained and I'm not aware of any firmware
|
||||
implementations that refuse to boot with commit aeffc4928ea2,
|
||||
but it's a real bug, so revert the offending commit.
|
||||
|
||||
Reported-by: Linn Crosetto <linn@hp.com>
|
||||
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
|
||||
Cc: H. Peter Anvin <hpa@zytor.com>
|
||||
Cc: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Cc: Michael Brown <mbrown@fensystems.co.uk>
|
||||
Cc: Peter Zijlstra <peterz@infradead.org>
|
||||
Cc: Thomas Gleixner <tglx@linutronix.de>
|
||||
Link: http://lkml.kernel.org/r/1438936621-5215-3-git-send-email-matt@codeblueprint.co.uk
|
||||
Signed-off-by: Ingo Molnar <mingo@kernel.org>
|
||||
---
|
||||
arch/x86/boot/header.S | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/x86/boot/header.S b/arch/x86/boot/header.S
|
||||
index 16ef025..7a6d43a 100644
|
||||
--- a/arch/x86/boot/header.S
|
||||
+++ b/arch/x86/boot/header.S
|
||||
@@ -154,7 +154,7 @@ extra_header_fields:
|
||||
#else
|
||||
.quad 0 # ImageBase
|
||||
#endif
|
||||
- .long CONFIG_PHYSICAL_ALIGN # SectionAlignment
|
||||
+ .long 0x20 # SectionAlignment
|
||||
.long 0x20 # FileAlignment
|
||||
.word 0 # MajorOperatingSystemVersion
|
||||
.word 0 # MinorOperatingSystemVersion
|
||||
--
|
||||
2.3.10
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
From a40cf3f38881ce8543ceb9667150b4f2ead4c437 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
Date: Tue, 20 Oct 2015 09:31:22 +0200
|
||||
Subject: [PATCH] ahci: Add Marvell 88se91a2 device id
|
||||
|
||||
Add device id for Marvell 88se91a2
|
||||
|
||||
Signed-off-by: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||
---
|
||||
drivers/ata/ahci.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||
index a466602..ff343c4 100644
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -489,6 +489,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
.driver_data = board_ahci_yes_fbs }, /* 88se9172 on some Gigabyte */
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a0),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a2), /* 88se91a2 */
|
||||
+ .driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x91a3),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
From 57e5c6d95b2cde884634586d833b02f54ba1c79d Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Tue, 21 Apr 2015 09:42:21 -0700
|
||||
Subject: [PATCH 1/3] dt-bindings: Add root properties for Raspberry Pi 2
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
|
||||
index c78576b..11d3056 100644
|
||||
--- a/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
|
||||
+++ b/Documentation/devicetree/bindings/arm/bcm/brcm,bcm2835.txt
|
||||
@@ -26,6 +26,10 @@ Raspberry Pi Model B+
|
||||
Required root node properties:
|
||||
compatible = "raspberrypi,model-b-plus", "brcm,bcm2835";
|
||||
|
||||
+Raspberry Pi 2 Model B
|
||||
+Required root node properties:
|
||||
+compatible = "raspberrypi,2-model-b", "brcm,bcm2836";
|
||||
+
|
||||
Raspberry Pi Compute Module
|
||||
Required root node properties:
|
||||
compatible = "raspberrypi,compute-module", "brcm,bcm2835";
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
From c1be3c1fc6178ca48750b4e66f1acb7c22b64997 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 16 Dec 2015 15:55:14 -0800
|
||||
Subject: [PATCH 2/3] ARM: bcm2835: Add a compat string for bcm2836 machine
|
||||
probe
|
||||
|
||||
Supporting the 2836 requires using the new interrupt controller, which
|
||||
we have support for.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/mach-bcm/board_bcm2835.c | 5 +++++
|
||||
1 file changed, 5 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/mach-bcm/board_bcm2835.c b/arch/arm/mach-bcm/board_bcm2835.c
|
||||
index 0f7b9ea..834d676 100644
|
||||
--- a/arch/arm/mach-bcm/board_bcm2835.c
|
||||
+++ b/arch/arm/mach-bcm/board_bcm2835.c
|
||||
@@ -36,7 +36,12 @@ static void __init bcm2835_init(void)
|
||||
}
|
||||
|
||||
static const char * const bcm2835_compat[] = {
|
||||
+#ifdef CONFIG_ARCH_MULTI_V6
|
||||
"brcm,bcm2835",
|
||||
+#endif
|
||||
+#ifdef CONFIG_ARCH_MULTI_V7
|
||||
+ "brcm,bcm2836",
|
||||
+#endif
|
||||
NULL
|
||||
};
|
||||
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
From 5234c34e4cd7695647ccc1cabb50c3e7720dd3fb Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Tue, 24 Feb 2015 15:07:55 +0000
|
||||
Subject: [PATCH 3/3] ARM: bcm2835: Add Kconfig support for bcm2836
|
||||
|
||||
This should be a complete port of bcm2835 functionality to bcm2836
|
||||
(Raspberry Pi 2).
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/Kconfig.debug | 10 ++++++++--
|
||||
arch/arm/mach-bcm/Kconfig | 9 +++++----
|
||||
2 files changed, 13 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug
|
||||
index 259c0ca..957b876 100644
|
||||
--- a/arch/arm/Kconfig.debug
|
||||
+++ b/arch/arm/Kconfig.debug
|
||||
@@ -143,7 +143,12 @@ choice
|
||||
|
||||
config DEBUG_BCM2835
|
||||
bool "Kernel low-level debugging on BCM2835 PL011 UART"
|
||||
- depends on ARCH_BCM2835
|
||||
+ depends on ARCH_BCM2835 && ARCH_MULTI_V6
|
||||
+ select DEBUG_UART_PL01X
|
||||
+
|
||||
+ config DEBUG_BCM2836
|
||||
+ bool "Kernel low-level debugging on BCM2836 PL011 UART"
|
||||
+ depends on ARCH_BCM2835 && ARCH_MULTI_V7
|
||||
select DEBUG_UART_PL01X
|
||||
|
||||
config DEBUG_BCM_5301X
|
||||
@@ -1402,6 +1407,7 @@ config DEBUG_UART_PHYS
|
||||
default 0x20064000 if DEBUG_RK29_UART1 || DEBUG_RK3X_UART2
|
||||
default 0x20068000 if DEBUG_RK29_UART2 || DEBUG_RK3X_UART3
|
||||
default 0x20201000 if DEBUG_BCM2835
|
||||
+ default 0x3f201000 if DEBUG_BCM2836
|
||||
default 0x3e000000 if DEBUG_BCM_KONA_UART
|
||||
default 0x4000e400 if DEBUG_LL_UART_EFM32
|
||||
default 0x40081000 if DEBUG_LPC18XX_UART0
|
||||
@@ -1485,7 +1491,7 @@ config DEBUG_UART_VIRT
|
||||
default 0xf0000be0 if ARCH_EBSA110
|
||||
default 0xf0010000 if DEBUG_ASM9260_UART
|
||||
default 0xf01fb000 if DEBUG_NOMADIK_UART
|
||||
- default 0xf0201000 if DEBUG_BCM2835
|
||||
+ default 0xf0201000 if DEBUG_BCM2835 || DEBUG_BCM2836
|
||||
default 0xf1000300 if DEBUG_BCM_5301X
|
||||
default 0xf1002000 if DEBUG_MT8127_UART0
|
||||
default 0xf1006000 if DEBUG_MT6589_UART0
|
||||
diff --git a/arch/arm/mach-bcm/Kconfig b/arch/arm/mach-bcm/Kconfig
|
||||
index 8c53c55..3b2acf4 100644
|
||||
--- a/arch/arm/mach-bcm/Kconfig
|
||||
+++ b/arch/arm/mach-bcm/Kconfig
|
||||
@@ -122,17 +122,18 @@ config ARCH_BCM_MOBILE_SMP
|
||||
comment "Other Architectures"
|
||||
|
||||
config ARCH_BCM2835
|
||||
- bool "Broadcom BCM2835 family" if ARCH_MULTI_V6
|
||||
+ bool "Broadcom BCM2835 family" if ARCH_MULTI_V6 || ARCH_MULTI_V7
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select ARM_AMBA
|
||||
- select ARM_ERRATA_411920
|
||||
+ select ARM_ERRATA_411920 if ARCH_MULTI_V6
|
||||
select ARM_TIMER_SP804
|
||||
+ select HAVE_ARM_ARCH_TIMER if ARCH_MULTI_V7
|
||||
select CLKSRC_OF
|
||||
select PINCTRL
|
||||
select PINCTRL_BCM2835
|
||||
help
|
||||
- This enables support for the Broadcom BCM2835 SoC. This SoC is
|
||||
- used in the Raspberry Pi and Roku 2 devices.
|
||||
+ This enables support for the Broadcom BCM2835 and BCM2836 SoCs.
|
||||
+ This SoC is used in the Raspberry Pi and Roku 2 devices.
|
||||
|
||||
config ARCH_BCM_63XX
|
||||
bool "Broadcom BCM63xx DSL SoC" if ARCH_MULTI_V7
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+36
@@ -0,0 +1,36 @@
|
||||
From 60d56333e869be6ad6926cdba3ba974512b2183b Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Tue, 1 Dec 2015 16:49:12 -0800
|
||||
Subject: [PATCH 1/3] ARM: bcm2835: Define two new packets from the latest
|
||||
firmware.
|
||||
|
||||
These packets give us direct access to the firmware's power management
|
||||
code, as opposed to GET/SET_POWER_STATE packets that only had a couple
|
||||
of domains implemented.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Reviewed-by: Kevin Hilman <khilman@linaro.org>
|
||||
---
|
||||
include/soc/bcm2835/raspberrypi-firmware.h | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/include/soc/bcm2835/raspberrypi-firmware.h b/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
index c07d74a..3fb3571 100644
|
||||
--- a/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
+++ b/include/soc/bcm2835/raspberrypi-firmware.h
|
||||
@@ -72,10 +72,12 @@ enum rpi_firmware_property_tag {
|
||||
RPI_FIRMWARE_SET_ENABLE_QPU = 0x00030012,
|
||||
RPI_FIRMWARE_GET_DISPMANX_RESOURCE_MEM_HANDLE = 0x00030014,
|
||||
RPI_FIRMWARE_GET_EDID_BLOCK = 0x00030020,
|
||||
+ RPI_FIRMWARE_GET_DOMAIN_STATE = 0x00030030,
|
||||
RPI_FIRMWARE_SET_CLOCK_STATE = 0x00038001,
|
||||
RPI_FIRMWARE_SET_CLOCK_RATE = 0x00038002,
|
||||
RPI_FIRMWARE_SET_VOLTAGE = 0x00038003,
|
||||
RPI_FIRMWARE_SET_TURBO = 0x00038009,
|
||||
+ RPI_FIRMWARE_SET_DOMAIN_STATE = 0x00038030,
|
||||
|
||||
/* Dispmanx TAGS */
|
||||
RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE = 0x00040001,
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
From 4c8b338f9ae38dee9c77bda023babc7f7543f52c Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Aring <alex.aring@gmail.com>
|
||||
Date: Wed, 16 Dec 2015 16:26:48 -0800
|
||||
Subject: [PATCH 2/3] dt-bindings: add rpi power domain driver bindings
|
||||
|
||||
This patch adds devicetree tree bindings for the Raspberry Pi power
|
||||
domain driver.
|
||||
|
||||
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
Reviewed-by: Kevin Hilman <khilman@linaro.org>
|
||||
---
|
||||
.../bindings/soc/bcm/raspberrypi,bcm2835-power.txt | 47 ++++++++++++++++++++++
|
||||
1 file changed, 47 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/soc/bcm/raspberrypi,bcm2835-power.txt
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/soc/bcm/raspberrypi,bcm2835-power.txt b/Documentation/devicetree/bindings/soc/bcm/raspberrypi,bcm2835-power.txt
|
||||
new file mode 100644
|
||||
index 0000000..30942cf
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/soc/bcm/raspberrypi,bcm2835-power.txt
|
||||
@@ -0,0 +1,47 @@
|
||||
+Raspberry Pi power domain driver
|
||||
+
|
||||
+Required properties:
|
||||
+
|
||||
+- compatible: Should be "raspberrypi,bcm2835-power".
|
||||
+- firmware: Reference to the RPi firmware device node.
|
||||
+- #power-domain-cells: Should be <1>, we providing multiple power domains.
|
||||
+
|
||||
+The valid defines for power domain are:
|
||||
+
|
||||
+ RPI_POWER_DOMAIN_I2C0
|
||||
+ RPI_POWER_DOMAIN_I2C1
|
||||
+ RPI_POWER_DOMAIN_I2C2
|
||||
+ RPI_POWER_DOMAIN_VIDEO_SCALER
|
||||
+ RPI_POWER_DOMAIN_VPU1
|
||||
+ RPI_POWER_DOMAIN_HDMI
|
||||
+ RPI_POWER_DOMAIN_USB
|
||||
+ RPI_POWER_DOMAIN_VEC
|
||||
+ RPI_POWER_DOMAIN_JPEG
|
||||
+ RPI_POWER_DOMAIN_H264
|
||||
+ RPI_POWER_DOMAIN_V3D
|
||||
+ RPI_POWER_DOMAIN_ISP
|
||||
+ RPI_POWER_DOMAIN_UNICAM0
|
||||
+ RPI_POWER_DOMAIN_UNICAM1
|
||||
+ RPI_POWER_DOMAIN_CCP2RX
|
||||
+ RPI_POWER_DOMAIN_CSI2
|
||||
+ RPI_POWER_DOMAIN_CPI
|
||||
+ RPI_POWER_DOMAIN_DSI0
|
||||
+ RPI_POWER_DOMAIN_DSI1
|
||||
+ RPI_POWER_DOMAIN_TRANSPOSER
|
||||
+ RPI_POWER_DOMAIN_CCP2TX
|
||||
+ RPI_POWER_DOMAIN_CDP
|
||||
+ RPI_POWER_DOMAIN_ARM
|
||||
+
|
||||
+Example:
|
||||
+
|
||||
+power: power {
|
||||
+ compatible = "raspberrypi,bcm2835-power";
|
||||
+ firmware = <&firmware>;
|
||||
+ #power-domain-cells = <1>;
|
||||
+};
|
||||
+
|
||||
+Example for using power domain:
|
||||
+
|
||||
+&usb {
|
||||
+ power-domains = <&power RPI_POWER_DOMAIN_USB>;
|
||||
+};
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+379
@@ -0,0 +1,379 @@
|
||||
From a09cd356586d33f64cbe64ee4f5c1a7c4a6abee5 Mon Sep 17 00:00:00 2001
|
||||
From: Alexander Aring <alex.aring@gmail.com>
|
||||
Date: Wed, 16 Dec 2015 16:26:47 -0800
|
||||
Subject: [PATCH 3/3] ARM: bcm2835: add rpi power domain driver
|
||||
|
||||
This patch adds support for several power domains on Raspberry Pi,
|
||||
including USB (so it can be enabled even if the bootloader didn't do
|
||||
it), and graphics.
|
||||
|
||||
This patch is the combined work of Eric Anholt (who wrote USB support
|
||||
inside of the Raspberry Pi firmware driver, and wrote the non-USB
|
||||
domain support) and Alexander Aring (who separated the original USB
|
||||
work out from the firmware driver).
|
||||
|
||||
Signed-off-by: Alexander Aring <alex.aring@gmail.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
Reviewed-by: Kevin Hilman <khilman@linaro.org>
|
||||
---
|
||||
drivers/soc/Kconfig | 1 +
|
||||
drivers/soc/Makefile | 1 +
|
||||
drivers/soc/bcm/Kconfig | 9 +
|
||||
drivers/soc/bcm/Makefile | 1 +
|
||||
drivers/soc/bcm/raspberrypi-power.c | 247 ++++++++++++++++++++++++++
|
||||
include/dt-bindings/power/raspberrypi-power.h | 41 +++++
|
||||
6 files changed, 300 insertions(+)
|
||||
create mode 100644 drivers/soc/bcm/Kconfig
|
||||
create mode 100644 drivers/soc/bcm/Makefile
|
||||
create mode 100644 drivers/soc/bcm/raspberrypi-power.c
|
||||
create mode 100644 include/dt-bindings/power/raspberrypi-power.h
|
||||
|
||||
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
|
||||
index 4e853ed..8441426 100644
|
||||
--- a/drivers/soc/Kconfig
|
||||
+++ b/drivers/soc/Kconfig
|
||||
@@ -1,5 +1,6 @@
|
||||
menu "SOC (System On Chip) specific Drivers"
|
||||
|
||||
+source "drivers/soc/bcm/Kconfig"
|
||||
source "drivers/soc/brcmstb/Kconfig"
|
||||
source "drivers/soc/mediatek/Kconfig"
|
||||
source "drivers/soc/qcom/Kconfig"
|
||||
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
|
||||
index f2ba2e9..f3f955c 100644
|
||||
--- a/drivers/soc/Makefile
|
||||
+++ b/drivers/soc/Makefile
|
||||
@@ -2,6 +2,7 @@
|
||||
# Makefile for the Linux Kernel SOC specific device drivers.
|
||||
#
|
||||
|
||||
+obj-y += bcm/
|
||||
obj-$(CONFIG_SOC_BRCMSTB) += brcmstb/
|
||||
obj-$(CONFIG_MACH_DOVE) += dove/
|
||||
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
|
||||
diff --git a/drivers/soc/bcm/Kconfig b/drivers/soc/bcm/Kconfig
|
||||
new file mode 100644
|
||||
index 0000000..5ba1827
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/bcm/Kconfig
|
||||
@@ -0,0 +1,9 @@
|
||||
+config RASPBERRYPI_POWER
|
||||
+ bool "Raspberry Pi power domain driver"
|
||||
+ depends on ARCH_BCM2835 || COMPILE_TEST
|
||||
+ depends on RASPBERRYPI_FIRMWARE
|
||||
+ select PM_GENERIC_DOMAINS if PM
|
||||
+ select PM_GENERIC_DOMAINS_OF if PM
|
||||
+ help
|
||||
+ This enables support for the RPi power domains which can be enabled
|
||||
+ or disabled via the RPi firmware.
|
||||
diff --git a/drivers/soc/bcm/Makefile b/drivers/soc/bcm/Makefile
|
||||
new file mode 100644
|
||||
index 0000000..63aa3eb
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/bcm/Makefile
|
||||
@@ -0,0 +1 @@
|
||||
+obj-$(CONFIG_RASPBERRYPI_POWER) += raspberrypi-power.o
|
||||
diff --git a/drivers/soc/bcm/raspberrypi-power.c b/drivers/soc/bcm/raspberrypi-power.c
|
||||
new file mode 100644
|
||||
index 0000000..fe96a8b
|
||||
--- /dev/null
|
||||
+++ b/drivers/soc/bcm/raspberrypi-power.c
|
||||
@@ -0,0 +1,247 @@
|
||||
+/* (C) 2015 Pengutronix, Alexander Aring <aar@pengutronix.de>
|
||||
+ *
|
||||
+ * 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.
|
||||
+ *
|
||||
+ * Authors:
|
||||
+ * Alexander Aring <aar@pengutronix.de>
|
||||
+ * Eric Anholt <eric@anholt.net>
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/of_platform.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/pm_domain.h>
|
||||
+#include <dt-bindings/power/raspberrypi-power.h>
|
||||
+#include <soc/bcm2835/raspberrypi-firmware.h>
|
||||
+
|
||||
+/*
|
||||
+ * Firmware indices for the old power domains interface. Only a few
|
||||
+ * of them were actually implemented.
|
||||
+ */
|
||||
+#define RPI_OLD_POWER_DOMAIN_USB 3
|
||||
+#define RPI_OLD_POWER_DOMAIN_V3D 10
|
||||
+
|
||||
+struct rpi_power_domain {
|
||||
+ u32 domain;
|
||||
+ bool enabled;
|
||||
+ bool old_interface;
|
||||
+ struct generic_pm_domain base;
|
||||
+ struct rpi_firmware *fw;
|
||||
+};
|
||||
+
|
||||
+struct rpi_power_domains {
|
||||
+ bool has_new_interface;
|
||||
+ struct genpd_onecell_data xlate;
|
||||
+ struct rpi_firmware *fw;
|
||||
+ struct rpi_power_domain domains[RPI_POWER_DOMAIN_COUNT];
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * Packet definition used by RPI_FIRMWARE_SET_POWER_STATE and
|
||||
+ * RPI_FIRMWARE_SET_DOMAIN_STATE
|
||||
+ */
|
||||
+struct rpi_power_domain_packet {
|
||||
+ u32 domain;
|
||||
+ u32 on;
|
||||
+} __packet;
|
||||
+
|
||||
+/*
|
||||
+ * Asks the firmware to enable or disable power on a specific power
|
||||
+ * domain.
|
||||
+ */
|
||||
+static int rpi_firmware_set_power(struct rpi_power_domain *rpi_domain, bool on)
|
||||
+{
|
||||
+ struct rpi_power_domain_packet packet;
|
||||
+
|
||||
+ packet.domain = rpi_domain->domain;
|
||||
+ packet.on = on;
|
||||
+ return rpi_firmware_property(rpi_domain->fw,
|
||||
+ rpi_domain->old_interface ?
|
||||
+ RPI_FIRMWARE_SET_POWER_STATE :
|
||||
+ RPI_FIRMWARE_SET_DOMAIN_STATE,
|
||||
+ &packet, sizeof(packet));
|
||||
+}
|
||||
+
|
||||
+static int rpi_domain_off(struct generic_pm_domain *domain)
|
||||
+{
|
||||
+ struct rpi_power_domain *rpi_domain =
|
||||
+ container_of(domain, struct rpi_power_domain, base);
|
||||
+
|
||||
+ return rpi_firmware_set_power(rpi_domain, false);
|
||||
+}
|
||||
+
|
||||
+static int rpi_domain_on(struct generic_pm_domain *domain)
|
||||
+{
|
||||
+ struct rpi_power_domain *rpi_domain =
|
||||
+ container_of(domain, struct rpi_power_domain, base);
|
||||
+
|
||||
+ return rpi_firmware_set_power(rpi_domain, true);
|
||||
+}
|
||||
+
|
||||
+static void rpi_common_init_power_domain(struct rpi_power_domains *rpi_domains,
|
||||
+ int xlate_index, const char *name)
|
||||
+{
|
||||
+ struct rpi_power_domain *dom = &rpi_domains->domains[xlate_index];
|
||||
+
|
||||
+ dom->fw = rpi_domains->fw;
|
||||
+
|
||||
+ dom->base.name = name;
|
||||
+ dom->base.power_on = rpi_domain_on;
|
||||
+ dom->base.power_off = rpi_domain_off;
|
||||
+
|
||||
+ /*
|
||||
+ * Treat all power domains as off at boot.
|
||||
+ *
|
||||
+ * The firmware itself may be keeping some domains on, but
|
||||
+ * from Linux's perspective all we control is the refcounts
|
||||
+ * that we give to the firmware, and we can't ask the firmware
|
||||
+ * to turn off something that we haven't ourselves turned on.
|
||||
+ */
|
||||
+ pm_genpd_init(&dom->base, NULL, true);
|
||||
+
|
||||
+ rpi_domains->xlate.domains[xlate_index] = &dom->base;
|
||||
+}
|
||||
+
|
||||
+static void rpi_init_power_domain(struct rpi_power_domains *rpi_domains,
|
||||
+ int xlate_index, const char *name)
|
||||
+{
|
||||
+ struct rpi_power_domain *dom = &rpi_domains->domains[xlate_index];
|
||||
+
|
||||
+ if (!rpi_domains->has_new_interface)
|
||||
+ return;
|
||||
+
|
||||
+ /* The DT binding index is the firmware's domain index minus one. */
|
||||
+ dom->domain = xlate_index + 1;
|
||||
+
|
||||
+ rpi_common_init_power_domain(rpi_domains, xlate_index, name);
|
||||
+}
|
||||
+
|
||||
+static void rpi_init_old_power_domain(struct rpi_power_domains *rpi_domains,
|
||||
+ int xlate_index, int domain,
|
||||
+ const char *name)
|
||||
+{
|
||||
+ struct rpi_power_domain *dom = &rpi_domains->domains[xlate_index];
|
||||
+
|
||||
+ dom->old_interface = true;
|
||||
+ dom->domain = domain;
|
||||
+
|
||||
+ rpi_common_init_power_domain(rpi_domains, xlate_index, name);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Detects whether the firmware supports the new power domains interface.
|
||||
+ *
|
||||
+ * The firmware doesn't actually return an error on an unknown tag,
|
||||
+ * and just skips over it, so we do the detection by putting an
|
||||
+ * unexpected value in the return field and checking if it was
|
||||
+ * unchanged.
|
||||
+ */
|
||||
+static bool
|
||||
+rpi_has_new_domain_support(struct rpi_power_domains *rpi_domains)
|
||||
+{
|
||||
+ struct rpi_power_domain_packet packet;
|
||||
+ int ret;
|
||||
+
|
||||
+ packet.domain = RPI_POWER_DOMAIN_ARM;
|
||||
+ packet.on = ~0;
|
||||
+
|
||||
+ ret = rpi_firmware_property(rpi_domains->fw,
|
||||
+ RPI_FIRMWARE_GET_DOMAIN_STATE,
|
||||
+ &packet, sizeof(packet));
|
||||
+
|
||||
+ return ret == 0 && packet.on != ~0;
|
||||
+}
|
||||
+
|
||||
+static int rpi_power_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ struct device_node *fw_np;
|
||||
+ struct device *dev = &pdev->dev;
|
||||
+ struct rpi_power_domains *rpi_domains;
|
||||
+
|
||||
+ rpi_domains = devm_kzalloc(dev, sizeof(*rpi_domains), GFP_KERNEL);
|
||||
+ if (!rpi_domains)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ rpi_domains->xlate.domains =
|
||||
+ devm_kzalloc(dev, sizeof(*rpi_domains->xlate.domains) *
|
||||
+ RPI_POWER_DOMAIN_COUNT, GFP_KERNEL);
|
||||
+ if (!rpi_domains->xlate.domains)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ rpi_domains->xlate.num_domains = RPI_POWER_DOMAIN_COUNT;
|
||||
+
|
||||
+ fw_np = of_parse_phandle(pdev->dev.of_node, "firmware", 0);
|
||||
+ if (!fw_np) {
|
||||
+ dev_err(&pdev->dev, "no firmware node\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ rpi_domains->fw = rpi_firmware_get(fw_np);
|
||||
+ of_node_put(fw_np);
|
||||
+ if (!rpi_domains->fw)
|
||||
+ return -EPROBE_DEFER;
|
||||
+
|
||||
+ rpi_domains->has_new_interface =
|
||||
+ rpi_has_new_domain_support(rpi_domains);
|
||||
+
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_I2C0, "I2C0");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_I2C1, "I2C1");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_I2C2, "I2C2");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_VIDEO_SCALER,
|
||||
+ "VIDEO_SCALER");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_VPU1, "VPU1");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_HDMI, "HDMI");
|
||||
+
|
||||
+ /*
|
||||
+ * Use the old firmware interface for USB power, so that we
|
||||
+ * can turn it on even if the firmware hasn't been updated.
|
||||
+ */
|
||||
+ rpi_init_old_power_domain(rpi_domains, RPI_POWER_DOMAIN_USB,
|
||||
+ RPI_OLD_POWER_DOMAIN_USB, "USB");
|
||||
+
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_VEC, "VEC");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_JPEG, "JPEG");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_H264, "H264");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_V3D, "V3D");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_ISP, "ISP");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_UNICAM0, "UNICAM0");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_UNICAM1, "UNICAM1");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CCP2RX, "CCP2RX");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CSI2, "CSI2");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CPI, "CPI");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_DSI0, "DSI0");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_DSI1, "DSI1");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_TRANSPOSER,
|
||||
+ "TRANSPOSER");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CCP2TX, "CCP2TX");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_CDP, "CDP");
|
||||
+ rpi_init_power_domain(rpi_domains, RPI_POWER_DOMAIN_ARM, "ARM");
|
||||
+
|
||||
+ of_genpd_add_provider_onecell(dev->of_node, &rpi_domains->xlate);
|
||||
+
|
||||
+ platform_set_drvdata(pdev, rpi_domains);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id rpi_power_of_match[] = {
|
||||
+ { .compatible = "raspberrypi,bcm2835-power", },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(of, rpi_power_of_match);
|
||||
+
|
||||
+static struct platform_driver rpi_power_driver = {
|
||||
+ .driver = {
|
||||
+ .name = "raspberrypi-power",
|
||||
+ .of_match_table = rpi_power_of_match,
|
||||
+ },
|
||||
+ .probe = rpi_power_probe,
|
||||
+};
|
||||
+builtin_platform_driver(rpi_power_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Alexander Aring <aar@pengutronix.de>");
|
||||
+MODULE_AUTHOR("Eric Anholt <eric@anholt.net>");
|
||||
+MODULE_DESCRIPTION("Raspberry Pi power domain driver");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
diff --git a/include/dt-bindings/power/raspberrypi-power.h b/include/dt-bindings/power/raspberrypi-power.h
|
||||
new file mode 100644
|
||||
index 0000000..b3ff8e0
|
||||
--- /dev/null
|
||||
+++ b/include/dt-bindings/power/raspberrypi-power.h
|
||||
@@ -0,0 +1,41 @@
|
||||
+/*
|
||||
+ * Copyright © 2015 Broadcom
|
||||
+ *
|
||||
+ * 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.
|
||||
+ */
|
||||
+
|
||||
+#ifndef _DT_BINDINGS_ARM_BCM2835_RPI_POWER_H
|
||||
+#define _DT_BINDINGS_ARM_BCM2835_RPI_POWER_H
|
||||
+
|
||||
+/* These power domain indices are the firmware interface's indices
|
||||
+ * minus one.
|
||||
+ */
|
||||
+#define RPI_POWER_DOMAIN_I2C0 0
|
||||
+#define RPI_POWER_DOMAIN_I2C1 1
|
||||
+#define RPI_POWER_DOMAIN_I2C2 2
|
||||
+#define RPI_POWER_DOMAIN_VIDEO_SCALER 3
|
||||
+#define RPI_POWER_DOMAIN_VPU1 4
|
||||
+#define RPI_POWER_DOMAIN_HDMI 5
|
||||
+#define RPI_POWER_DOMAIN_USB 6
|
||||
+#define RPI_POWER_DOMAIN_VEC 7
|
||||
+#define RPI_POWER_DOMAIN_JPEG 8
|
||||
+#define RPI_POWER_DOMAIN_H264 9
|
||||
+#define RPI_POWER_DOMAIN_V3D 10
|
||||
+#define RPI_POWER_DOMAIN_ISP 11
|
||||
+#define RPI_POWER_DOMAIN_UNICAM0 12
|
||||
+#define RPI_POWER_DOMAIN_UNICAM1 13
|
||||
+#define RPI_POWER_DOMAIN_CCP2RX 14
|
||||
+#define RPI_POWER_DOMAIN_CSI2 15
|
||||
+#define RPI_POWER_DOMAIN_CPI 16
|
||||
+#define RPI_POWER_DOMAIN_DSI0 17
|
||||
+#define RPI_POWER_DOMAIN_DSI1 18
|
||||
+#define RPI_POWER_DOMAIN_TRANSPOSER 19
|
||||
+#define RPI_POWER_DOMAIN_CCP2TX 20
|
||||
+#define RPI_POWER_DOMAIN_CDP 21
|
||||
+#define RPI_POWER_DOMAIN_ARM 22
|
||||
+
|
||||
+#define RPI_POWER_DOMAIN_COUNT 23
|
||||
+
|
||||
+#endif /* _DT_BINDINGS_ARM_BCM2835_RPI_POWER_H */
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+443
@@ -0,0 +1,443 @@
|
||||
From 482626063d446eac1809e025a79ad0a7d45bc22d Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 16 Dec 2015 13:24:40 -0800
|
||||
Subject: [PATCH 1/4] ARM: bcm2835: Split the DT for peripherals from the DT
|
||||
for the CPU
|
||||
|
||||
The set of peripherals remained constant across bcm2835 (Raspberry Pi
|
||||
1) and bcm2836 (Raspberry Pi 2), but the CPU was swapped out. Split
|
||||
the files so that we can include just peripheral setup in 2836.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835.dtsi | 194 +-------------------------------------
|
||||
arch/arm/boot/dts/bcm283x.dtsi | 205 +++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 206 insertions(+), 193 deletions(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm283x.dtsi
|
||||
|
||||
diff --git a/arch/arm/boot/dts/bcm2835.dtsi b/arch/arm/boot/dts/bcm2835.dtsi
|
||||
index aef64de..b83b326 100644
|
||||
--- a/arch/arm/boot/dts/bcm2835.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835.dtsi
|
||||
@@ -1,206 +1,14 @@
|
||||
-#include <dt-bindings/pinctrl/bcm2835.h>
|
||||
-#include <dt-bindings/clock/bcm2835.h>
|
||||
-#include "skeleton.dtsi"
|
||||
+#include "bcm283x.dtsi"
|
||||
|
||||
/ {
|
||||
compatible = "brcm,bcm2835";
|
||||
- model = "BCM2835";
|
||||
- interrupt-parent = <&intc>;
|
||||
-
|
||||
- chosen {
|
||||
- bootargs = "earlyprintk console=ttyAMA0";
|
||||
- };
|
||||
|
||||
soc {
|
||||
- compatible = "simple-bus";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <1>;
|
||||
ranges = <0x7e000000 0x20000000 0x02000000>;
|
||||
dma-ranges = <0x40000000 0x00000000 0x20000000>;
|
||||
|
||||
- timer@7e003000 {
|
||||
- compatible = "brcm,bcm2835-system-timer";
|
||||
- reg = <0x7e003000 0x1000>;
|
||||
- interrupts = <1 0>, <1 1>, <1 2>, <1 3>;
|
||||
- /* This could be a reference to BCM2835_CLOCK_TIMER,
|
||||
- * but we don't have the driver using the common clock
|
||||
- * support yet.
|
||||
- */
|
||||
- clock-frequency = <1000000>;
|
||||
- };
|
||||
-
|
||||
- dma: dma@7e007000 {
|
||||
- compatible = "brcm,bcm2835-dma";
|
||||
- reg = <0x7e007000 0xf00>;
|
||||
- interrupts = <1 16>,
|
||||
- <1 17>,
|
||||
- <1 18>,
|
||||
- <1 19>,
|
||||
- <1 20>,
|
||||
- <1 21>,
|
||||
- <1 22>,
|
||||
- <1 23>,
|
||||
- <1 24>,
|
||||
- <1 25>,
|
||||
- <1 26>,
|
||||
- <1 27>,
|
||||
- <1 28>;
|
||||
-
|
||||
- #dma-cells = <1>;
|
||||
- brcm,dma-channel-mask = <0x7f35>;
|
||||
- };
|
||||
-
|
||||
- intc: interrupt-controller@7e00b200 {
|
||||
- compatible = "brcm,bcm2835-armctrl-ic";
|
||||
- reg = <0x7e00b200 0x200>;
|
||||
- interrupt-controller;
|
||||
- #interrupt-cells = <2>;
|
||||
- };
|
||||
-
|
||||
- watchdog@7e100000 {
|
||||
- compatible = "brcm,bcm2835-pm-wdt";
|
||||
- reg = <0x7e100000 0x28>;
|
||||
- };
|
||||
-
|
||||
- clocks: cprman@7e101000 {
|
||||
- compatible = "brcm,bcm2835-cprman";
|
||||
- #clock-cells = <1>;
|
||||
- reg = <0x7e101000 0x2000>;
|
||||
-
|
||||
- /* CPRMAN derives everything from the platform's
|
||||
- * oscillator.
|
||||
- */
|
||||
- clocks = <&clk_osc>;
|
||||
- };
|
||||
-
|
||||
- rng@7e104000 {
|
||||
- compatible = "brcm,bcm2835-rng";
|
||||
- reg = <0x7e104000 0x10>;
|
||||
- };
|
||||
-
|
||||
- mailbox: mailbox@7e00b800 {
|
||||
- compatible = "brcm,bcm2835-mbox";
|
||||
- reg = <0x7e00b880 0x40>;
|
||||
- interrupts = <0 1>;
|
||||
- #mbox-cells = <0>;
|
||||
- };
|
||||
-
|
||||
- gpio: gpio@7e200000 {
|
||||
- compatible = "brcm,bcm2835-gpio";
|
||||
- reg = <0x7e200000 0xb4>;
|
||||
- /*
|
||||
- * The GPIO IP block is designed for 3 banks of GPIOs.
|
||||
- * Each bank has a GPIO interrupt for itself.
|
||||
- * There is an overall "any bank" interrupt.
|
||||
- * In order, these are GIC interrupts 17, 18, 19, 20.
|
||||
- * Since the BCM2835 only has 2 banks, the 2nd bank
|
||||
- * interrupt output appears to be mirrored onto the
|
||||
- * 3rd bank's interrupt signal.
|
||||
- * So, a bank0 interrupt shows up on 17, 20, and
|
||||
- * a bank1 interrupt shows up on 18, 19, 20!
|
||||
- */
|
||||
- interrupts = <2 17>, <2 18>, <2 19>, <2 20>;
|
||||
-
|
||||
- gpio-controller;
|
||||
- #gpio-cells = <2>;
|
||||
-
|
||||
- interrupt-controller;
|
||||
- #interrupt-cells = <2>;
|
||||
- };
|
||||
-
|
||||
- uart0: uart@7e201000 {
|
||||
- compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell";
|
||||
- reg = <0x7e201000 0x1000>;
|
||||
- interrupts = <2 25>;
|
||||
- clocks = <&clocks BCM2835_CLOCK_UART>,
|
||||
- <&clocks BCM2835_CLOCK_VPU>;
|
||||
- clock-names = "uartclk", "apb_pclk";
|
||||
- arm,primecell-periphid = <0x00241011>;
|
||||
- };
|
||||
-
|
||||
- i2s: i2s@7e203000 {
|
||||
- compatible = "brcm,bcm2835-i2s";
|
||||
- reg = <0x7e203000 0x20>,
|
||||
- <0x7e101098 0x02>;
|
||||
-
|
||||
- dmas = <&dma 2>,
|
||||
- <&dma 3>;
|
||||
- dma-names = "tx", "rx";
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- spi: spi@7e204000 {
|
||||
- compatible = "brcm,bcm2835-spi";
|
||||
- reg = <0x7e204000 0x1000>;
|
||||
- interrupts = <2 22>;
|
||||
- clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- i2c0: i2c@7e205000 {
|
||||
- compatible = "brcm,bcm2835-i2c";
|
||||
- reg = <0x7e205000 0x1000>;
|
||||
- interrupts = <2 21>;
|
||||
- clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- sdhci: sdhci@7e300000 {
|
||||
- compatible = "brcm,bcm2835-sdhci";
|
||||
- reg = <0x7e300000 0x100>;
|
||||
- interrupts = <2 30>;
|
||||
- clocks = <&clocks BCM2835_CLOCK_EMMC>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- i2c1: i2c@7e804000 {
|
||||
- compatible = "brcm,bcm2835-i2c";
|
||||
- reg = <0x7e804000 0x1000>;
|
||||
- interrupts = <2 21>;
|
||||
- clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- i2c2: i2c@7e805000 {
|
||||
- compatible = "brcm,bcm2835-i2c";
|
||||
- reg = <0x7e805000 0x1000>;
|
||||
- interrupts = <2 21>;
|
||||
- clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
- status = "disabled";
|
||||
- };
|
||||
-
|
||||
- usb@7e980000 {
|
||||
- compatible = "brcm,bcm2835-usb";
|
||||
- reg = <0x7e980000 0x10000>;
|
||||
- interrupts = <1 9>;
|
||||
- };
|
||||
-
|
||||
arm-pmu {
|
||||
compatible = "arm,arm1176-pmu";
|
||||
};
|
||||
};
|
||||
-
|
||||
- clocks {
|
||||
- compatible = "simple-bus";
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
-
|
||||
- /* The oscillator is the root of the clock tree. */
|
||||
- clk_osc: clock@3 {
|
||||
- compatible = "fixed-clock";
|
||||
- reg = <3>;
|
||||
- #clock-cells = <0>;
|
||||
- clock-output-names = "osc";
|
||||
- clock-frequency = <19200000>;
|
||||
- };
|
||||
-
|
||||
- };
|
||||
};
|
||||
diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
new file mode 100644
|
||||
index 0000000..8a7e727
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
@@ -0,0 +1,205 @@
|
||||
+#include <dt-bindings/pinctrl/bcm2835.h>
|
||||
+#include <dt-bindings/clock/bcm2835.h>
|
||||
+#include "skeleton.dtsi"
|
||||
+
|
||||
+/* This include file covers the common peripherals and configuration between
|
||||
+ * bcm2835 and bcm2836 implementations, leaving the CPU configuration to
|
||||
+ * bcm2835.dtsi and bcm2836.dtsi.
|
||||
+ */
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "brcm,bcm2835";
|
||||
+ model = "BCM2835";
|
||||
+ interrupt-parent = <&intc>;
|
||||
+
|
||||
+ chosen {
|
||||
+ bootargs = "earlyprintk console=ttyAMA0";
|
||||
+ };
|
||||
+
|
||||
+ soc {
|
||||
+ compatible = "simple-bus";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <1>;
|
||||
+
|
||||
+ timer@7e003000 {
|
||||
+ compatible = "brcm,bcm2835-system-timer";
|
||||
+ reg = <0x7e003000 0x1000>;
|
||||
+ interrupts = <1 0>, <1 1>, <1 2>, <1 3>;
|
||||
+ /* This could be a reference to BCM2835_CLOCK_TIMER,
|
||||
+ * but we don't have the driver using the common clock
|
||||
+ * support yet.
|
||||
+ */
|
||||
+ clock-frequency = <1000000>;
|
||||
+ };
|
||||
+
|
||||
+ dma: dma@7e007000 {
|
||||
+ compatible = "brcm,bcm2835-dma";
|
||||
+ reg = <0x7e007000 0xf00>;
|
||||
+ interrupts = <1 16>,
|
||||
+ <1 17>,
|
||||
+ <1 18>,
|
||||
+ <1 19>,
|
||||
+ <1 20>,
|
||||
+ <1 21>,
|
||||
+ <1 22>,
|
||||
+ <1 23>,
|
||||
+ <1 24>,
|
||||
+ <1 25>,
|
||||
+ <1 26>,
|
||||
+ <1 27>,
|
||||
+ <1 28>;
|
||||
+
|
||||
+ #dma-cells = <1>;
|
||||
+ brcm,dma-channel-mask = <0x7f35>;
|
||||
+ };
|
||||
+
|
||||
+ intc: interrupt-controller@7e00b200 {
|
||||
+ compatible = "brcm,bcm2835-armctrl-ic";
|
||||
+ reg = <0x7e00b200 0x200>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ watchdog@7e100000 {
|
||||
+ compatible = "brcm,bcm2835-pm-wdt";
|
||||
+ reg = <0x7e100000 0x28>;
|
||||
+ };
|
||||
+
|
||||
+ clocks: cprman@7e101000 {
|
||||
+ compatible = "brcm,bcm2835-cprman";
|
||||
+ #clock-cells = <1>;
|
||||
+ reg = <0x7e101000 0x2000>;
|
||||
+
|
||||
+ /* CPRMAN derives everything from the platform's
|
||||
+ * oscillator.
|
||||
+ */
|
||||
+ clocks = <&clk_osc>;
|
||||
+ };
|
||||
+
|
||||
+ rng@7e104000 {
|
||||
+ compatible = "brcm,bcm2835-rng";
|
||||
+ reg = <0x7e104000 0x10>;
|
||||
+ };
|
||||
+
|
||||
+ mailbox: mailbox@7e00b800 {
|
||||
+ compatible = "brcm,bcm2835-mbox";
|
||||
+ reg = <0x7e00b880 0x40>;
|
||||
+ interrupts = <0 1>;
|
||||
+ #mbox-cells = <0>;
|
||||
+ };
|
||||
+
|
||||
+ gpio: gpio@7e200000 {
|
||||
+ compatible = "brcm,bcm2835-gpio";
|
||||
+ reg = <0x7e200000 0xb4>;
|
||||
+ /*
|
||||
+ * The GPIO IP block is designed for 3 banks of GPIOs.
|
||||
+ * Each bank has a GPIO interrupt for itself.
|
||||
+ * There is an overall "any bank" interrupt.
|
||||
+ * In order, these are GIC interrupts 17, 18, 19, 20.
|
||||
+ * Since the BCM2835 only has 2 banks, the 2nd bank
|
||||
+ * interrupt output appears to be mirrored onto the
|
||||
+ * 3rd bank's interrupt signal.
|
||||
+ * So, a bank0 interrupt shows up on 17, 20, and
|
||||
+ * a bank1 interrupt shows up on 18, 19, 20!
|
||||
+ */
|
||||
+ interrupts = <2 17>, <2 18>, <2 19>, <2 20>;
|
||||
+
|
||||
+ gpio-controller;
|
||||
+ #gpio-cells = <2>;
|
||||
+
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <2>;
|
||||
+ };
|
||||
+
|
||||
+ uart0: uart@7e201000 {
|
||||
+ compatible = "brcm,bcm2835-pl011", "arm,pl011", "arm,primecell";
|
||||
+ reg = <0x7e201000 0x1000>;
|
||||
+ interrupts = <2 25>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_UART>,
|
||||
+ <&clocks BCM2835_CLOCK_VPU>;
|
||||
+ clock-names = "uartclk", "apb_pclk";
|
||||
+ arm,primecell-periphid = <0x00241011>;
|
||||
+ };
|
||||
+
|
||||
+ i2s: i2s@7e203000 {
|
||||
+ compatible = "brcm,bcm2835-i2s";
|
||||
+ reg = <0x7e203000 0x20>,
|
||||
+ <0x7e101098 0x02>;
|
||||
+
|
||||
+ dmas = <&dma 2>,
|
||||
+ <&dma 3>;
|
||||
+ dma-names = "tx", "rx";
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ spi: spi@7e204000 {
|
||||
+ compatible = "brcm,bcm2835-spi";
|
||||
+ reg = <0x7e204000 0x1000>;
|
||||
+ interrupts = <2 22>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c0: i2c@7e205000 {
|
||||
+ compatible = "brcm,bcm2835-i2c";
|
||||
+ reg = <0x7e205000 0x1000>;
|
||||
+ interrupts = <2 21>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ sdhci: sdhci@7e300000 {
|
||||
+ compatible = "brcm,bcm2835-sdhci";
|
||||
+ reg = <0x7e300000 0x100>;
|
||||
+ interrupts = <2 30>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_EMMC>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c1: i2c@7e804000 {
|
||||
+ compatible = "brcm,bcm2835-i2c";
|
||||
+ reg = <0x7e804000 0x1000>;
|
||||
+ interrupts = <2 21>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ i2c2: i2c@7e805000 {
|
||||
+ compatible = "brcm,bcm2835-i2c";
|
||||
+ reg = <0x7e805000 0x1000>;
|
||||
+ interrupts = <2 21>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+ status = "disabled";
|
||||
+ };
|
||||
+
|
||||
+ usb@7e980000 {
|
||||
+ compatible = "brcm,bcm2835-usb";
|
||||
+ reg = <0x7e980000 0x10000>;
|
||||
+ interrupts = <1 9>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ clocks {
|
||||
+ compatible = "simple-bus";
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ /* The oscillator is the root of the clock tree. */
|
||||
+ clk_osc: clock@3 {
|
||||
+ compatible = "fixed-clock";
|
||||
+ reg = <3>;
|
||||
+ #clock-cells = <0>;
|
||||
+ clock-output-names = "osc";
|
||||
+ clock-frequency = <19200000>;
|
||||
+ };
|
||||
+
|
||||
+ };
|
||||
+};
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
From bafa68c08c33ddde3bc10d2d7e5d3b77b4a6c8ed Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Wed, 16 Dec 2015 15:55:12 -0800
|
||||
Subject: [PATCH 2/4] ARM: bcm2835: Move the CPU/peripheral include out of
|
||||
common RPi DT.
|
||||
|
||||
For Raspberry Pi 2, we want to use the same general pin assignment
|
||||
bits, but need to use bcm2836.dtsi for the CPU instead.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm2835-rpi-a-plus.dts | 1 +
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-plus.dts | 1 +
|
||||
arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts | 1 +
|
||||
arch/arm/boot/dts/bcm2835-rpi-b.dts | 1 +
|
||||
arch/arm/boot/dts/bcm2835-rpi.dtsi | 2 --
|
||||
5 files changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
index b2bff43..228614f 100644
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-a-plus.dts
|
||||
@@ -1,4 +1,5 @@
|
||||
/dts-v1/;
|
||||
+#include "bcm2835.dtsi"
|
||||
#include "bcm2835-rpi.dtsi"
|
||||
|
||||
/ {
|
||||
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
index 668442b..ef54050 100644
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-plus.dts
|
||||
@@ -1,4 +1,5 @@
|
||||
/dts-v1/;
|
||||
+#include "bcm2835.dtsi"
|
||||
#include "bcm2835-rpi.dtsi"
|
||||
|
||||
/ {
|
||||
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
index eab8b591..86f1f2f 100644
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b-rev2.dts
|
||||
@@ -1,4 +1,5 @@
|
||||
/dts-v1/;
|
||||
+#include "bcm2835.dtsi"
|
||||
#include "bcm2835-rpi.dtsi"
|
||||
|
||||
/ {
|
||||
diff --git a/arch/arm/boot/dts/bcm2835-rpi-b.dts b/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
index ff6b2d1..4859e9d 100644
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi-b.dts
|
||||
@@ -1,4 +1,5 @@
|
||||
/dts-v1/;
|
||||
+#include "bcm2835.dtsi"
|
||||
#include "bcm2835-rpi.dtsi"
|
||||
|
||||
/ {
|
||||
diff --git a/arch/arm/boot/dts/bcm2835-rpi.dtsi b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
index 3572f03..3afb9fe 100644
|
||||
--- a/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm2835-rpi.dtsi
|
||||
@@ -1,5 +1,3 @@
|
||||
-#include "bcm2835.dtsi"
|
||||
-
|
||||
/ {
|
||||
memory {
|
||||
reg = <0 0x10000000>;
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+160
@@ -0,0 +1,160 @@
|
||||
From c33319cd945001741d1b381655c8b7310d756163 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Thu, 16 Apr 2015 15:26:45 -0700
|
||||
Subject: [PATCH 3/4] ARM: bcm2835: Add devicetree for bcm2836 and Raspberry Pi
|
||||
2 B
|
||||
|
||||
The Pi 2 B ends up like a Pi 1 B+, with the same peripherals and
|
||||
pinout, but the CPU and memory layout changed to use the 2836.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 3 +-
|
||||
arch/arm/boot/dts/bcm2836-rpi-2-b.dts | 35 ++++++++++++++++
|
||||
arch/arm/boot/dts/bcm2836.dtsi | 78 +++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 115 insertions(+), 1 deletion(-)
|
||||
create mode 100644 arch/arm/boot/dts/bcm2836-rpi-2-b.dts
|
||||
create mode 100644 arch/arm/boot/dts/bcm2836.dtsi
|
||||
|
||||
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
|
||||
index 30bbc37..54e8f6b 100644
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -60,7 +60,8 @@ dtb-$(CONFIG_ARCH_BCM2835) += \
|
||||
bcm2835-rpi-b.dtb \
|
||||
bcm2835-rpi-b-rev2.dtb \
|
||||
bcm2835-rpi-b-plus.dtb \
|
||||
- bcm2835-rpi-a-plus.dtb
|
||||
+ bcm2835-rpi-a-plus.dtb \
|
||||
+ bcm2836-rpi-2-b.dtb
|
||||
dtb-$(CONFIG_ARCH_BCM_5301X) += \
|
||||
bcm4708-asus-rt-ac56u.dtb \
|
||||
bcm4708-asus-rt-ac68u.dtb \
|
||||
diff --git a/arch/arm/boot/dts/bcm2836-rpi-2-b.dts b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
|
||||
new file mode 100644
|
||||
index 0000000..ff94666
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm2836-rpi-2-b.dts
|
||||
@@ -0,0 +1,35 @@
|
||||
+/dts-v1/;
|
||||
+#include "bcm2836.dtsi"
|
||||
+#include "bcm2835-rpi.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "raspberrypi,2-model-b", "brcm,bcm2836";
|
||||
+ model = "Raspberry Pi 2 Model B";
|
||||
+
|
||||
+ memory {
|
||||
+ reg = <0 0x40000000>;
|
||||
+ };
|
||||
+
|
||||
+ leds {
|
||||
+ act {
|
||||
+ gpios = <&gpio 47 0>;
|
||||
+ };
|
||||
+
|
||||
+ pwr {
|
||||
+ label = "PWR";
|
||||
+ gpios = <&gpio 35 0>;
|
||||
+ default-state = "keep";
|
||||
+ linux,default-trigger = "default-on";
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&gpio {
|
||||
+ pinctrl-0 = <&gpioout &alt0 &i2s_alt0 &alt3>;
|
||||
+
|
||||
+ /* I2S interface */
|
||||
+ i2s_alt0: i2s_alt0 {
|
||||
+ brcm,pins = <18 19 20 21>;
|
||||
+ brcm,function = <BCM2835_FSEL_ALT0>;
|
||||
+ };
|
||||
+};
|
||||
diff --git a/arch/arm/boot/dts/bcm2836.dtsi b/arch/arm/boot/dts/bcm2836.dtsi
|
||||
new file mode 100644
|
||||
index 0000000..9d0651d
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/bcm2836.dtsi
|
||||
@@ -0,0 +1,78 @@
|
||||
+#include "bcm283x.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ compatible = "brcm,bcm2836";
|
||||
+
|
||||
+ soc {
|
||||
+ ranges = <0x7e000000 0x3f000000 0x1000000>,
|
||||
+ <0x40000000 0x40000000 0x00001000>;
|
||||
+ dma-ranges = <0xc0000000 0x00000000 0x3f000000>;
|
||||
+
|
||||
+ local_intc: local_intc {
|
||||
+ compatible = "brcm,bcm2836-l1-intc";
|
||||
+ reg = <0x40000000 0x100>;
|
||||
+ interrupt-controller;
|
||||
+ #interrupt-cells = <1>;
|
||||
+ interrupt-parent = <&local_intc>;
|
||||
+ };
|
||||
+
|
||||
+ arm-pmu {
|
||||
+ compatible = "arm,cortex-a7-pmu";
|
||||
+ interrupt-parent = <&local_intc>;
|
||||
+ interrupts = <9>;
|
||||
+ };
|
||||
+ };
|
||||
+
|
||||
+ timer {
|
||||
+ compatible = "arm,armv7-timer";
|
||||
+ interrupt-parent = <&local_intc>;
|
||||
+ interrupts = <0>, // PHYS_SECURE_PPI
|
||||
+ <1>, // PHYS_NONSECURE_PPI
|
||||
+ <3>, // VIRT_PPI
|
||||
+ <2>; // HYP_PPI
|
||||
+ always-on;
|
||||
+ };
|
||||
+
|
||||
+ cpus: cpus {
|
||||
+ #address-cells = <1>;
|
||||
+ #size-cells = <0>;
|
||||
+
|
||||
+ v7_cpu0: cpu@0 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a7";
|
||||
+ reg = <0xf00>;
|
||||
+ clock-frequency = <800000000>;
|
||||
+ };
|
||||
+
|
||||
+ v7_cpu1: cpu@1 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a7";
|
||||
+ reg = <0xf01>;
|
||||
+ clock-frequency = <800000000>;
|
||||
+ };
|
||||
+
|
||||
+ v7_cpu2: cpu@2 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a7";
|
||||
+ reg = <0xf02>;
|
||||
+ clock-frequency = <800000000>;
|
||||
+ };
|
||||
+
|
||||
+ v7_cpu3: cpu@3 {
|
||||
+ device_type = "cpu";
|
||||
+ compatible = "arm,cortex-a7";
|
||||
+ reg = <0xf03>;
|
||||
+ clock-frequency = <800000000>;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+/* Make the BCM2835-style global interrupt controller be a child of the
|
||||
+ * CPU-local interrupt controller.
|
||||
+ */
|
||||
+&intc {
|
||||
+ compatible = "brcm,bcm2836-armctrl-ic";
|
||||
+ reg = <0x7e00b200 0x200>;
|
||||
+ interrupt-parent = <&local_intc>;
|
||||
+ interrupts = <8>;
|
||||
+};
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
From 53b6084357a44d7c34044504e1bf149d9156934f Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Tue, 15 Dec 2015 15:35:59 -0800
|
||||
Subject: [PATCH 4/4] ARM: bcm2835: Add the auxiliary clocks to the device
|
||||
tree.
|
||||
|
||||
These will be used for enabling UART1, SPI1, and SPI2.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/boot/dts/bcm283x.dtsi | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
index 8a7e727..971e741 100644
|
||||
--- a/arch/arm/boot/dts/bcm283x.dtsi
|
||||
+++ b/arch/arm/boot/dts/bcm283x.dtsi
|
||||
@@ -152,6 +152,13 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
+ aux: aux@0x7e215000 {
|
||||
+ compatible = "brcm,bcm2835-aux";
|
||||
+ #clock-cells = <1>;
|
||||
+ reg = <0x7e215000 0x8>;
|
||||
+ clocks = <&clocks BCM2835_CLOCK_VPU>;
|
||||
+ };
|
||||
+
|
||||
sdhci: sdhci@7e300000 {
|
||||
compatible = "brcm,bcm2835-sdhci";
|
||||
reg = <0x7e300000 0x100>;
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
From 8c821c590f791ade672609c2f59b1ce0af750653 Mon Sep 17 00:00:00 2001
|
||||
From: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Date: Tue, 27 Oct 2015 19:08:58 +0100
|
||||
Subject: [PATCH 1/2] ARM: bcm2835: enable all bcm2835-relevant in defconfig
|
||||
|
||||
Rebuild bcm2835_defconfig using "make bcm2835_defconfig;
|
||||
make savedefconfig", and enable manually the following features:
|
||||
|
||||
* all bcm2835-relevant drivers (MBOX, WDT, DMA, PWM, SND)
|
||||
* enable regular stackprotector because CONFIG_CC_STACKPROTECTOR
|
||||
disappear
|
||||
* enable some new dependencies in order to keep LED heartbeat
|
||||
( CONFIG_NEW_LEDS, CONFIG_LEDS_CLASS, CONFIG_LEDS_TRIGGERS )
|
||||
|
||||
The following options were removed, because they are enabled implicit:
|
||||
|
||||
CONFIG_RD_BZIP2, CONFIG_RD_LZMA, CONFIG_RD_XZ, CONFIG_RD_LZO,
|
||||
CONFIG_USB_DWC2_HOST, CONFIG_EXT4_FS, CONFIG_EXT4_FS_POSIX_ACL
|
||||
|
||||
These options became obsolete:
|
||||
|
||||
CONFIG_RESOURCE_COUNTERS, CONFIG_SCSI_MULTI_LUN
|
||||
|
||||
Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Acked-by: Stephen Warren <swarren@wwwdotorg.org>
|
||||
---
|
||||
arch/arm/configs/bcm2835_defconfig | 28 +++++++++++++++++-----------
|
||||
1 file changed, 17 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig
|
||||
index 31cb073..0fda844 100644
|
||||
--- a/arch/arm/configs/bcm2835_defconfig
|
||||
+++ b/arch/arm/configs/bcm2835_defconfig
|
||||
@@ -10,7 +10,6 @@ CONFIG_CGROUP_FREEZER=y
|
||||
CONFIG_CGROUP_DEVICE=y
|
||||
CONFIG_CPUSETS=y
|
||||
CONFIG_CGROUP_CPUACCT=y
|
||||
-CONFIG_RESOURCE_COUNTERS=y
|
||||
CONFIG_CGROUP_PERF=y
|
||||
CONFIG_CFS_BANDWIDTH=y
|
||||
CONFIG_RT_GROUP_SCHED=y
|
||||
@@ -18,10 +17,6 @@ CONFIG_NAMESPACES=y
|
||||
CONFIG_SCHED_AUTOGROUP=y
|
||||
CONFIG_RELAY=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
-CONFIG_RD_BZIP2=y
|
||||
-CONFIG_RD_LZMA=y
|
||||
-CONFIG_RD_XZ=y
|
||||
-CONFIG_RD_LZO=y
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_EMBEDDED=y
|
||||
@@ -29,6 +24,7 @@ CONFIG_EMBEDDED=y
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_OPROFILE=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
+CONFIG_CC_STACKPROTECTOR_REGULAR=y
|
||||
CONFIG_ARCH_MULTI_V6=y
|
||||
# CONFIG_ARCH_MULTI_V7 is not set
|
||||
CONFIG_ARCH_BCM=y
|
||||
@@ -38,7 +34,6 @@ CONFIG_AEABI=y
|
||||
CONFIG_KSM=y
|
||||
CONFIG_CLEANCACHE=y
|
||||
CONFIG_SECCOMP=y
|
||||
-CONFIG_CC_STACKPROTECTOR=y
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_VFP=y
|
||||
@@ -57,7 +52,6 @@ CONFIG_DEVTMPFS_MOUNT=y
|
||||
# CONFIG_STANDALONE is not set
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
-CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
CONFIG_NETDEVICES=y
|
||||
@@ -77,17 +71,27 @@ CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM2835=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
# CONFIG_HWMON is not set
|
||||
+CONFIG_WATCHDOG=y
|
||||
+CONFIG_BCM2835_WDT=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_SIMPLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
+CONFIG_SOUND=y
|
||||
+CONFIG_SND=y
|
||||
+CONFIG_SND_SOC=y
|
||||
+CONFIG_SND_BCM2835_SOC_I2S=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
+CONFIG_USB_DWC2=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMC_SDHCI_BCM2835=y
|
||||
+CONFIG_NEW_LEDS=y
|
||||
+CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
+CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_ONESHOT=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
@@ -96,17 +100,19 @@ CONFIG_LEDS_TRIGGER_GPIO=y
|
||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
|
||||
CONFIG_LEDS_TRIGGER_TRANSIENT=y
|
||||
CONFIG_LEDS_TRIGGER_CAMERA=y
|
||||
+CONFIG_DMADEVICES=y
|
||||
+CONFIG_DMA_BCM2835=y
|
||||
CONFIG_STAGING=y
|
||||
-CONFIG_USB_DWC2=y
|
||||
-CONFIG_USB_DWC2_HOST=y
|
||||
+CONFIG_MAILBOX=y
|
||||
+CONFIG_BCM2835_MBOX=y
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
+CONFIG_PWM=y
|
||||
+CONFIG_PWM_BCM2835=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_POSIX_ACL=y
|
||||
-CONFIG_EXT4_FS=y
|
||||
-CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_FANOTIFY=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
From b63074fccbeb81e46b2553a200de54ff3bfadd10 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Sperl <kernel@martin.sperl.org>
|
||||
Date: Fri, 11 Sep 2015 11:22:06 +0000
|
||||
Subject: [PATCH 2/2] ARM: bcm2835: enable auxiliary spi driver in defconfig
|
||||
|
||||
add the auxiliary spi driver to the default config
|
||||
|
||||
Signed-off-by: Martin Sperl <kernel@martin.sperl.org>
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
arch/arm/configs/bcm2835_defconfig | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/arch/arm/configs/bcm2835_defconfig b/arch/arm/configs/bcm2835_defconfig
|
||||
index 0fda844..72def20 100644
|
||||
--- a/arch/arm/configs/bcm2835_defconfig
|
||||
+++ b/arch/arm/configs/bcm2835_defconfig
|
||||
@@ -69,6 +69,7 @@ CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_BCM2835=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_BCM2835=y
|
||||
+CONFIG_SPI_BCM2835AUX=y
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
--
|
||||
2.3.10
|
||||
|
||||
+2
-1
@@ -20,12 +20,13 @@ diff --git a/drivers/Makefile b/drivers/Makefile
|
||||
index 932e8bf..e8df3d0 100644
|
||||
--- a/drivers/Makefile
|
||||
+++ b/drivers/Makefile
|
||||
@@ -64,9 +64,9 @@ obj-y += base/ block/ misc/ mfd/ nfc/
|
||||
@@ -69,10 +69,10 @@ obj-$(CONFIG_LIBNVDIMM) += nvdimm/
|
||||
obj-$(CONFIG_DMA_SHARED_BUFFER) += dma-buf/
|
||||
obj-$(CONFIG_NUBUS) += nubus/
|
||||
obj-y += macintosh/
|
||||
-obj-$(CONFIG_IDE) += ide/
|
||||
obj-$(CONFIG_SCSI) += scsi/
|
||||
obj-y += nvme/
|
||||
obj-$(CONFIG_ATA) += ata/
|
||||
+obj-$(CONFIG_IDE) += ide/
|
||||
obj-$(CONFIG_TARGET_CORE) += target/
|
||||
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
From 48dbc164b40dd9195dea8cd966e394819e420b64 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gortmaker <paul.gortmaker@windriver.com>
|
||||
Date: Wed, 21 Oct 2015 14:04:47 +0100
|
||||
Subject: [PATCH] certs: add .gitignore to stop git nagging about
|
||||
x509_certificate_list
|
||||
|
||||
Currently we see this in "git status" if we build in the source dir:
|
||||
|
||||
Untracked files:
|
||||
(use "git add <file>..." to include in what will be committed)
|
||||
|
||||
certs/x509_certificate_list
|
||||
|
||||
It looks like it used to live in kernel/ so we squash that .gitignore
|
||||
entry at the same time. I didn't bother to dig through git history to
|
||||
see when it moved, since it is just a minor annoyance at most.
|
||||
|
||||
Cc: David Woodhouse <dwmw2@infradead.org>
|
||||
Cc: keyrings@linux-nfs.org
|
||||
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
|
||||
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||
---
|
||||
certs/.gitignore | 4 ++++
|
||||
kernel/.gitignore | 1 -
|
||||
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||
create mode 100644 certs/.gitignore
|
||||
|
||||
diff --git a/certs/.gitignore b/certs/.gitignore
|
||||
new file mode 100644
|
||||
index 0000000..f51aea4
|
||||
--- /dev/null
|
||||
+++ b/certs/.gitignore
|
||||
@@ -0,0 +1,4 @@
|
||||
+#
|
||||
+# Generated files
|
||||
+#
|
||||
+x509_certificate_list
|
||||
diff --git a/kernel/.gitignore b/kernel/.gitignore
|
||||
index 790d83c..b3097bd 100644
|
||||
--- a/kernel/.gitignore
|
||||
+++ b/kernel/.gitignore
|
||||
@@ -5,4 +5,3 @@ config_data.h
|
||||
config_data.gz
|
||||
timeconst.h
|
||||
hz.bc
|
||||
-x509_certificate_list
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+41
-41
@@ -14,9 +14,9 @@
|
||||
security/security.c | 10 ++++++++++
|
||||
13 files changed, 35 insertions(+), 1 deletion(-)
|
||||
|
||||
diff -Nurp linux-4.3.aufs/fs/aufs/Kconfig linux-4.3.aufs.mod/fs/aufs/Kconfig
|
||||
--- linux-4.3.aufs/fs/aufs/Kconfig 2015-11-19 22:31:36.517207700 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/aufs/Kconfig 2015-11-19 22:32:42.497511385 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/aufs/Kconfig linux-4.4-rc6.aufs.mod/fs/aufs/Kconfig
|
||||
--- linux-4.4-rc6.aufs/fs/aufs/Kconfig 2015-12-21 19:54:42.973923445 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/aufs/Kconfig 2015-12-21 19:55:29.522275768 +0200
|
||||
@@ -1,5 +1,5 @@
|
||||
config AUFS_FS
|
||||
- bool "Aufs (Advanced multi layered unification filesystem) support"
|
||||
@@ -24,9 +24,9 @@ diff -Nurp linux-4.3.aufs/fs/aufs/Kconfig linux-4.3.aufs.mod/fs/aufs/Kconfig
|
||||
help
|
||||
Aufs is a stackable unification filesystem such as Unionfs,
|
||||
which unifies several directories and provides a merged single
|
||||
diff -Nurp linux-4.3.aufs/fs/dcache.c linux-4.3.aufs.mod/fs/dcache.c
|
||||
--- linux-4.3.aufs/fs/dcache.c 2015-11-19 22:31:36.529207756 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/dcache.c 2015-11-19 22:32:42.497511385 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/dcache.c linux-4.4-rc6.aufs.mod/fs/dcache.c
|
||||
--- linux-4.4-rc6.aufs/fs/dcache.c 2015-12-21 19:54:42.986923543 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/dcache.c 2015-12-21 19:55:29.523275775 +0200
|
||||
@@ -1272,6 +1272,7 @@ rename_retry:
|
||||
seq = 1;
|
||||
goto again;
|
||||
@@ -35,9 +35,9 @@ diff -Nurp linux-4.3.aufs/fs/dcache.c linux-4.3.aufs.mod/fs/dcache.c
|
||||
|
||||
/*
|
||||
* Search for at least 1 mount point in the dentry's subdirs.
|
||||
diff -Nurp linux-4.3.aufs/fs/file_table.c linux-4.3.aufs.mod/fs/file_table.c
|
||||
--- linux-4.3.aufs/fs/file_table.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/file_table.c 2015-11-19 22:32:42.497511385 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/file_table.c linux-4.4-rc6.aufs.mod/fs/file_table.c
|
||||
--- linux-4.4-rc6.aufs/fs/file_table.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/file_table.c 2015-12-21 19:55:29.523275775 +0200
|
||||
@@ -147,6 +147,7 @@ over:
|
||||
}
|
||||
return ERR_PTR(-ENFILE);
|
||||
@@ -54,9 +54,9 @@ diff -Nurp linux-4.3.aufs/fs/file_table.c linux-4.3.aufs.mod/fs/file_table.c
|
||||
|
||||
void __init files_init(void)
|
||||
{
|
||||
diff -Nurp linux-4.3.aufs/fs/inode.c linux-4.3.aufs.mod/fs/inode.c
|
||||
--- linux-4.3.aufs/fs/inode.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/inode.c 2015-11-19 22:32:42.498511390 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/inode.c linux-4.4-rc6.aufs.mod/fs/inode.c
|
||||
--- linux-4.4-rc6.aufs/fs/inode.c 2015-12-21 13:06:55.265034468 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/inode.c 2015-12-21 19:55:29.524275783 +0200
|
||||
@@ -1593,6 +1593,7 @@ static int update_time(struct inode *ino
|
||||
|
||||
return update_time(inode, time, flags);
|
||||
@@ -65,9 +65,9 @@ diff -Nurp linux-4.3.aufs/fs/inode.c linux-4.3.aufs.mod/fs/inode.c
|
||||
|
||||
/**
|
||||
* touch_atime - update the access time
|
||||
diff -Nurp linux-4.3.aufs/fs/namespace.c linux-4.3.aufs.mod/fs/namespace.c
|
||||
--- linux-4.3.aufs/fs/namespace.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/namespace.c 2015-11-19 22:32:42.499511394 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/namespace.c linux-4.4-rc6.aufs.mod/fs/namespace.c
|
||||
--- linux-4.4-rc6.aufs/fs/namespace.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/namespace.c 2015-12-21 19:55:29.525275790 +0200
|
||||
@@ -463,6 +463,7 @@ void __mnt_drop_write(struct vfsmount *m
|
||||
mnt_dec_writers(real_mount(mnt));
|
||||
preempt_enable();
|
||||
@@ -84,9 +84,9 @@ diff -Nurp linux-4.3.aufs/fs/namespace.c linux-4.3.aufs.mod/fs/namespace.c
|
||||
|
||||
static void cleanup_group_ids(struct mount *mnt, struct mount *end)
|
||||
{
|
||||
diff -Nurp linux-4.3.aufs/fs/notify/group.c linux-4.3.aufs.mod/fs/notify/group.c
|
||||
--- linux-4.3.aufs/fs/notify/group.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/notify/group.c 2015-11-19 22:32:42.500511399 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/notify/group.c linux-4.4-rc6.aufs.mod/fs/notify/group.c
|
||||
--- linux-4.4-rc6.aufs/fs/notify/group.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/notify/group.c 2015-12-21 19:55:29.525275790 +0200
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/srcu.h>
|
||||
#include <linux/rculist.h>
|
||||
@@ -119,9 +119,9 @@ diff -Nurp linux-4.3.aufs/fs/notify/group.c linux-4.3.aufs.mod/fs/notify/group.c
|
||||
|
||||
int fsnotify_fasync(int fd, struct file *file, int on)
|
||||
{
|
||||
diff -Nurp linux-4.3.aufs/fs/notify/mark.c linux-4.3.aufs.mod/fs/notify/mark.c
|
||||
--- linux-4.3.aufs/fs/notify/mark.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/notify/mark.c 2015-11-19 22:32:42.500511399 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/notify/mark.c linux-4.4-rc6.aufs.mod/fs/notify/mark.c
|
||||
--- linux-4.4-rc6.aufs/fs/notify/mark.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/notify/mark.c 2015-12-21 19:55:29.525275790 +0200
|
||||
@@ -109,6 +109,7 @@ void fsnotify_put_mark(struct fsnotify_m
|
||||
mark->free_mark(mark);
|
||||
}
|
||||
@@ -154,9 +154,9 @@ diff -Nurp linux-4.3.aufs/fs/notify/mark.c linux-4.3.aufs.mod/fs/notify/mark.c
|
||||
|
||||
static int fsnotify_mark_destroy(void *ignored)
|
||||
{
|
||||
diff -Nurp linux-4.3.aufs/fs/open.c linux-4.3.aufs.mod/fs/open.c
|
||||
--- linux-4.3.aufs/fs/open.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/open.c 2015-11-19 22:32:42.500511399 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/open.c linux-4.4-rc6.aufs.mod/fs/open.c
|
||||
--- linux-4.4-rc6.aufs/fs/open.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/open.c 2015-12-21 19:55:29.526275798 +0200
|
||||
@@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, l
|
||||
mutex_unlock(&dentry->d_inode->i_mutex);
|
||||
return ret;
|
||||
@@ -173,9 +173,9 @@ diff -Nurp linux-4.3.aufs/fs/open.c linux-4.3.aufs.mod/fs/open.c
|
||||
|
||||
static int do_dentry_open(struct file *f,
|
||||
struct inode *inode,
|
||||
diff -Nurp linux-4.3.aufs/fs/read_write.c linux-4.3.aufs.mod/fs/read_write.c
|
||||
--- linux-4.3.aufs/fs/read_write.c 2015-11-19 22:31:36.530207761 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/read_write.c 2015-11-19 22:32:42.501511403 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/read_write.c linux-4.4-rc6.aufs.mod/fs/read_write.c
|
||||
--- linux-4.4-rc6.aufs/fs/read_write.c 2015-12-21 19:54:42.987923551 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/read_write.c 2015-12-21 19:55:29.526275798 +0200
|
||||
@@ -504,6 +504,7 @@ vfs_readf_t vfs_readf(struct file *file)
|
||||
return new_sync_read;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
@@ -192,10 +192,10 @@ diff -Nurp linux-4.3.aufs/fs/read_write.c linux-4.3.aufs.mod/fs/read_write.c
|
||||
|
||||
ssize_t __kernel_write(struct file *file, const char *buf, size_t count, loff_t *pos)
|
||||
{
|
||||
diff -Nurp linux-4.3.aufs/fs/splice.c linux-4.3.aufs.mod/fs/splice.c
|
||||
--- linux-4.3.aufs/fs/splice.c 2015-11-19 22:31:36.531207765 +0200
|
||||
+++ linux-4.3.aufs.mod/fs/splice.c 2015-11-19 22:32:42.501511403 +0200
|
||||
@@ -1115,6 +1115,7 @@ long do_splice_from(struct pipe_inode_in
|
||||
diff -Nurp linux-4.4-rc6.aufs/fs/splice.c linux-4.4-rc6.aufs.mod/fs/splice.c
|
||||
--- linux-4.4-rc6.aufs/fs/splice.c 2015-12-21 19:54:42.987923551 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/fs/splice.c 2015-12-21 19:55:29.526275798 +0200
|
||||
@@ -1123,6 +1123,7 @@ long do_splice_from(struct pipe_inode_in
|
||||
|
||||
return splice_write(pipe, out, ppos, len, flags);
|
||||
}
|
||||
@@ -203,7 +203,7 @@ diff -Nurp linux-4.3.aufs/fs/splice.c linux-4.3.aufs.mod/fs/splice.c
|
||||
|
||||
/*
|
||||
* Attempt to initiate a splice from a file to a pipe.
|
||||
@@ -1141,6 +1142,7 @@ long do_splice_to(struct file *in, loff_
|
||||
@@ -1149,6 +1150,7 @@ long do_splice_to(struct file *in, loff_
|
||||
|
||||
return splice_read(in, ppos, pipe, len, flags);
|
||||
}
|
||||
@@ -211,9 +211,9 @@ diff -Nurp linux-4.3.aufs/fs/splice.c linux-4.3.aufs.mod/fs/splice.c
|
||||
|
||||
/**
|
||||
* splice_direct_to_actor - splices data directly between two non-pipes
|
||||
diff -Nurp linux-4.3.aufs/security/commoncap.c linux-4.3.aufs.mod/security/commoncap.c
|
||||
--- linux-4.3.aufs/security/commoncap.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/security/commoncap.c 2015-11-19 22:32:42.501511403 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/security/commoncap.c linux-4.4-rc6.aufs.mod/security/commoncap.c
|
||||
--- linux-4.4-rc6.aufs/security/commoncap.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/security/commoncap.c 2015-12-21 19:55:29.527275805 +0200
|
||||
@@ -1053,12 +1053,14 @@ int cap_mmap_addr(unsigned long addr)
|
||||
}
|
||||
return ret;
|
||||
@@ -229,9 +229,9 @@ diff -Nurp linux-4.3.aufs/security/commoncap.c linux-4.3.aufs.mod/security/commo
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
|
||||
diff -Nurp linux-4.3.aufs/security/device_cgroup.c linux-4.3.aufs.mod/security/device_cgroup.c
|
||||
--- linux-4.3.aufs/security/device_cgroup.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/security/device_cgroup.c 2015-11-19 22:32:42.502511407 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/security/device_cgroup.c linux-4.4-rc6.aufs.mod/security/device_cgroup.c
|
||||
--- linux-4.4-rc6.aufs/security/device_cgroup.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/security/device_cgroup.c 2015-12-21 19:55:29.527275805 +0200
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/device_cgroup.h>
|
||||
#include <linux/cgroup.h>
|
||||
@@ -248,9 +248,9 @@ diff -Nurp linux-4.3.aufs/security/device_cgroup.c linux-4.3.aufs.mod/security/d
|
||||
|
||||
int devcgroup_inode_mknod(int mode, dev_t dev)
|
||||
{
|
||||
diff -Nurp linux-4.3.aufs/security/security.c linux-4.3.aufs.mod/security/security.c
|
||||
--- linux-4.3.aufs/security/security.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.3.aufs.mod/security/security.c 2015-11-19 22:32:42.503511412 +0200
|
||||
diff -Nurp linux-4.4-rc6.aufs/security/security.c linux-4.4-rc6.aufs.mod/security/security.c
|
||||
--- linux-4.4-rc6.aufs/security/security.c 2015-11-02 02:05:25.000000000 +0200
|
||||
+++ linux-4.4-rc6.aufs.mod/security/security.c 2015-12-21 19:55:29.528275813 +0200
|
||||
@@ -433,6 +433,7 @@ int security_path_rmdir(struct path *dir
|
||||
return 0;
|
||||
return call_int_hook(path_rmdir, 0, dir, dentry);
|
||||
+98
-130
@@ -1,4 +1,3 @@
|
||||
|
||||
Documentation/ABI/testing/debugfs-aufs | 50 +
|
||||
Documentation/ABI/testing/sysfs-aufs | 31 +
|
||||
Documentation/filesystems/aufs/README | 383 ++++
|
||||
@@ -21,7 +20,7 @@
|
||||
fs/aufs/Kconfig | 185 ++
|
||||
fs/aufs/Makefile | 36 +
|
||||
fs/aufs/aufs.h | 46 +
|
||||
fs/aufs/branch.c | 1400 +++++++++++++++
|
||||
fs/aufs/branch.c | 1394 +++++++++++++++
|
||||
fs/aufs/branch.h | 266 +++
|
||||
fs/aufs/cpup.c | 1306 ++++++++++++++
|
||||
fs/aufs/cpup.h | 81 +
|
||||
@@ -29,7 +28,7 @@
|
||||
fs/aufs/dbgaufs.h | 35 +
|
||||
fs/aufs/dcsub.c | 211 +++
|
||||
fs/aufs/dcsub.h | 123 ++
|
||||
fs/aufs/debug.c | 427 +++++
|
||||
fs/aufs/debug.c | 425 +++++
|
||||
fs/aufs/debug.h | 212 +++
|
||||
fs/aufs/dentry.c | 1123 ++++++++++++
|
||||
fs/aufs/dentry.h | 221 +++
|
||||
@@ -43,7 +42,7 @@
|
||||
fs/aufs/fhsm.c | 412 +++++
|
||||
fs/aufs/file.c | 831 +++++++++
|
||||
fs/aufs/file.h | 278 +++
|
||||
fs/aufs/finfo.c | 144 ++
|
||||
fs/aufs/finfo.c | 143 ++
|
||||
fs/aufs/fstype.h | 387 ++++
|
||||
fs/aufs/hfsnotify.c | 275 +++
|
||||
fs/aufs/hfsplus.c | 43 +
|
||||
@@ -54,7 +53,7 @@
|
||||
fs/aufs/i_op_ren.c | 1002 +++++++++++
|
||||
fs/aufs/iinfo.c | 264 +++
|
||||
fs/aufs/inode.c | 515 ++++++
|
||||
fs/aufs/inode.h | 668 +++++++
|
||||
fs/aufs/inode.h | 672 +++++++
|
||||
fs/aufs/ioctl.c | 206 +++
|
||||
fs/aufs/loop.c | 133 ++
|
||||
fs/aufs/loop.h | 39 +
|
||||
@@ -72,8 +71,8 @@
|
||||
fs/aufs/rwsem.h | 178 ++
|
||||
fs/aufs/sbinfo.c | 353 ++++
|
||||
fs/aufs/spl.h | 98 ++
|
||||
fs/aufs/super.c | 1034 +++++++++++
|
||||
fs/aufs/super.h | 629 +++++++
|
||||
fs/aufs/super.c | 1026 +++++++++++
|
||||
fs/aufs/super.h | 628 +++++++
|
||||
fs/aufs/sysaufs.c | 91 +
|
||||
fs/aufs/sysaufs.h | 88 +
|
||||
fs/aufs/sysfs.c | 340 ++++
|
||||
@@ -82,13 +81,12 @@
|
||||
fs/aufs/vfsub.c | 835 +++++++++
|
||||
fs/aufs/vfsub.h | 274 +++
|
||||
fs/aufs/wbr_policy.c | 752 ++++++++
|
||||
fs/aufs/whout.c | 1050 +++++++++++
|
||||
fs/aufs/whout.c | 1047 +++++++++++
|
||||
fs/aufs/whout.h | 72 +
|
||||
fs/aufs/wkq.c | 200 +++
|
||||
fs/aufs/wkq.h | 78 +
|
||||
fs/aufs/xattr.c | 331 ++++
|
||||
fs/aufs/xino.c | 1283 ++++++++++++++
|
||||
fs/buffer.c | 2 +-
|
||||
fs/dcache.c | 2 +-
|
||||
fs/proc/base.c | 2 +-
|
||||
fs/proc/nommu.c | 5 +-
|
||||
@@ -110,7 +108,7 @@
|
||||
mm/mmap.c | 17 +-
|
||||
mm/nommu.c | 10 +-
|
||||
mm/prfile.c | 86 +
|
||||
111 files changed, 33302 insertions(+), 30 deletions(-)
|
||||
110 files changed, 33284 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/Documentation/ABI/testing/debugfs-aufs b/Documentation/ABI/testing/debugfs-aufs
|
||||
new file mode 100644
|
||||
@@ -1716,10 +1714,10 @@ index 0000000..9d502b5
|
||||
+Currently this approach is applied to address_space_operations for
|
||||
+regular files only.
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index 747c653..53ecc33 100644
|
||||
index 9bff63c..093dd5b 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -1985,6 +1985,19 @@ F: include/linux/audit.h
|
||||
@@ -2029,6 +2029,19 @@ F: include/linux/audit.h
|
||||
F: include/uapi/linux/audit.h
|
||||
F: kernel/audit*
|
||||
|
||||
@@ -1740,10 +1738,10 @@ index 747c653..53ecc33 100644
|
||||
M: Miguel Ojeda Sandonis <miguel.ojeda.sandonis@gmail.com>
|
||||
W: http://miguelojeda.es/auxdisplay.htm
|
||||
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
|
||||
index 674f800..291ec9e 100644
|
||||
index 423f4ca..abfdd2b 100644
|
||||
--- a/drivers/block/loop.c
|
||||
+++ b/drivers/block/loop.c
|
||||
@@ -560,6 +560,24 @@ static inline int is_loop_device(struct file *file)
|
||||
@@ -706,6 +706,24 @@ static inline int is_loop_device(struct file *file)
|
||||
return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
|
||||
}
|
||||
|
||||
@@ -1769,10 +1767,10 @@ index 674f800..291ec9e 100644
|
||||
|
||||
static ssize_t loop_attr_show(struct device *dev, char *page,
|
||||
diff --git a/fs/Kconfig b/fs/Kconfig
|
||||
index da3f32f..b9879fe 100644
|
||||
index 6ce72d8..4aa31ea 100644
|
||||
--- a/fs/Kconfig
|
||||
+++ b/fs/Kconfig
|
||||
@@ -215,6 +215,7 @@ source "fs/pstore/Kconfig"
|
||||
@@ -221,6 +221,7 @@ source "fs/pstore/Kconfig"
|
||||
source "fs/sysv/Kconfig"
|
||||
source "fs/ufs/Kconfig"
|
||||
source "fs/exofs/Kconfig"
|
||||
@@ -1781,10 +1779,10 @@ index da3f32f..b9879fe 100644
|
||||
endif # MISC_FILESYSTEMS
|
||||
|
||||
diff --git a/fs/Makefile b/fs/Makefile
|
||||
index f79cf40..7562a4d 100644
|
||||
index 79f5225..a7c7f16 100644
|
||||
--- a/fs/Makefile
|
||||
+++ b/fs/Makefile
|
||||
@@ -125,3 +125,4 @@ obj-y += exofs/ # Multiple modules
|
||||
@@ -126,3 +126,4 @@ obj-y += exofs/ # Multiple modules
|
||||
obj-$(CONFIG_CEPH_FS) += ceph/
|
||||
obj-$(CONFIG_PSTORE) += pstore/
|
||||
obj-$(CONFIG_EFIVAR_FS) += efivarfs/
|
||||
@@ -2076,10 +2074,10 @@ index 0000000..75290bd
|
||||
+#endif /* __AUFS_H__ */
|
||||
diff --git a/fs/aufs/branch.c b/fs/aufs/branch.c
|
||||
new file mode 100644
|
||||
index 0000000..72a8ee6
|
||||
index 0000000..f491422
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/branch.c
|
||||
@@ -0,0 +1,1400 @@
|
||||
@@ -0,0 +1,1394 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -2199,7 +2197,7 @@ index 0000000..72a8ee6
|
||||
+
|
||||
+ err = -ENOMEM;
|
||||
+ root = sb->s_root;
|
||||
+ add_branch = kmalloc(sizeof(*add_branch), GFP_NOFS);
|
||||
+ add_branch = kzalloc(sizeof(*add_branch), GFP_NOFS);
|
||||
+ if (unlikely(!add_branch))
|
||||
+ goto out;
|
||||
+
|
||||
@@ -2207,16 +2205,14 @@ index 0000000..72a8ee6
|
||||
+ if (unlikely(err))
|
||||
+ goto out_br;
|
||||
+
|
||||
+ add_branch->br_wbr = NULL;
|
||||
+ if (au_br_writable(perm)) {
|
||||
+ /* may be freed separately at changing the branch permission */
|
||||
+ add_branch->br_wbr = kmalloc(sizeof(*add_branch->br_wbr),
|
||||
+ add_branch->br_wbr = kzalloc(sizeof(*add_branch->br_wbr),
|
||||
+ GFP_NOFS);
|
||||
+ if (unlikely(!add_branch->br_wbr))
|
||||
+ goto out_hnotify;
|
||||
+ }
|
||||
+
|
||||
+ add_branch->br_fhsm = NULL;
|
||||
+ if (au_br_fhsm(perm)) {
|
||||
+ err = au_fhsm_br_alloc(add_branch);
|
||||
+ if (unlikely(err))
|
||||
@@ -2421,9 +2417,7 @@ index 0000000..72a8ee6
|
||||
+
|
||||
+ wbr = br->br_wbr;
|
||||
+ au_rw_init(&wbr->wbr_wh_rwsem);
|
||||
+ memset(wbr->wbr_wh, 0, sizeof(wbr->wbr_wh));
|
||||
+ atomic_set(&wbr->wbr_wh_running, 0);
|
||||
+ wbr->wbr_bytes = 0;
|
||||
+
|
||||
+ /*
|
||||
+ * a limit for rmdir/rename a dir
|
||||
@@ -2452,12 +2446,10 @@ index 0000000..72a8ee6
|
||||
+ struct inode *h_inode;
|
||||
+
|
||||
+ err = 0;
|
||||
+ memset(&br->br_xino, 0, sizeof(br->br_xino));
|
||||
+ mutex_init(&br->br_xino.xi_nondir_mtx);
|
||||
+ br->br_perm = add->perm;
|
||||
+ br->br_path = add->path; /* set first, path_get() later */
|
||||
+ spin_lock_init(&br->br_dykey_lock);
|
||||
+ memset(br->br_dykey, 0, sizeof(br->br_dykey));
|
||||
+ atomic_set(&br->br_count, 0);
|
||||
+ atomic_set(&br->br_xino_running, 0);
|
||||
+ br->br_id = au_new_br_id(sb);
|
||||
@@ -2665,7 +2657,7 @@ index 0000000..72a8ee6
|
||||
+ for (ull = 0; ull < max; ull++)
|
||||
+ if (a[ull])
|
||||
+ fput(a[ull]);
|
||||
+ au_array_free(a);
|
||||
+ kvfree(a);
|
||||
+}
|
||||
+
|
||||
+/* ---------------------------------------------------------------------- */
|
||||
@@ -3415,7 +3407,7 @@ index 0000000..72a8ee6
|
||||
+
|
||||
+ if (unlikely(err)) {
|
||||
+ rerr = -ENOMEM;
|
||||
+ br->br_wbr = kmalloc(sizeof(*br->br_wbr),
|
||||
+ br->br_wbr = kzalloc(sizeof(*br->br_wbr),
|
||||
+ GFP_NOFS);
|
||||
+ if (br->br_wbr)
|
||||
+ rerr = au_wbr_init(br, sb, br->br_perm);
|
||||
@@ -3429,7 +3421,7 @@ index 0000000..72a8ee6
|
||||
+ } else if (au_br_writable(mod->perm)) {
|
||||
+ /* ro --> rw */
|
||||
+ err = -ENOMEM;
|
||||
+ br->br_wbr = kmalloc(sizeof(*br->br_wbr), GFP_NOFS);
|
||||
+ br->br_wbr = kzalloc(sizeof(*br->br_wbr), GFP_NOFS);
|
||||
+ if (br->br_wbr) {
|
||||
+ err = au_wbr_init(br, sb, mod->perm);
|
||||
+ if (unlikely(err)) {
|
||||
@@ -5965,10 +5957,10 @@ index 0000000..2aa87ac
|
||||
+#endif /* __AUFS_DCSUB_H__ */
|
||||
diff --git a/fs/aufs/debug.c b/fs/aufs/debug.c
|
||||
new file mode 100644
|
||||
index 0000000..e553cef
|
||||
index 0000000..42053aa
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/debug.c
|
||||
@@ -0,0 +1,427 @@
|
||||
@@ -0,0 +1,425 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -6288,9 +6280,7 @@ index 0000000..e553cef
|
||||
+ }
|
||||
+
|
||||
+ a->mnt.mnt_sb = sb;
|
||||
+ a->fake.br_perm = 0;
|
||||
+ a->fake.br_path.mnt = &a->mnt;
|
||||
+ a->fake.br_xino.xi_file = NULL;
|
||||
+ atomic_set(&a->fake.br_count, 0);
|
||||
+ smp_mb(); /* atomic_set */
|
||||
+ err = do_pri_br(-1, &a->fake);
|
||||
@@ -6616,7 +6606,7 @@ index 0000000..0a2e7e7
|
||||
+#endif /* __AUFS_DEBUG_H__ */
|
||||
diff --git a/fs/aufs/dentry.c b/fs/aufs/dentry.c
|
||||
new file mode 100644
|
||||
index 0000000..c33fb83
|
||||
index 0000000..aad25be
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/dentry.c
|
||||
@@ -0,0 +1,1123 @@
|
||||
@@ -7176,7 +7166,9 @@ index 0000000..c33fb83
|
||||
+ struct dentry *dentry;
|
||||
+ struct inode *inode;
|
||||
+ mode_t mode;
|
||||
+ } orig_h, tmp_h;
|
||||
+ } orig_h, tmp_h = {
|
||||
+ .dentry = NULL
|
||||
+ };
|
||||
+ struct au_hdentry *hd;
|
||||
+ struct inode *inode, *h_inode;
|
||||
+ struct dentry *h_dentry;
|
||||
@@ -7190,10 +7182,8 @@ index 0000000..c33fb83
|
||||
+ orig_h.inode = d_inode(orig_h.dentry);
|
||||
+ orig_h.mode = orig_h.inode->i_mode & S_IFMT;
|
||||
+ }
|
||||
+ memset(&tmp_h, 0, sizeof(tmp_h));
|
||||
+ if (tmp->di_bstart >= 0) {
|
||||
+ tmp_h.dentry = tmp->di_hdentry[tmp->di_bstart].hd_dentry;
|
||||
+ tmp_h.inode = NULL;
|
||||
+ if (d_is_positive(tmp_h.dentry)) {
|
||||
+ tmp_h.inode = d_inode(tmp_h.dentry);
|
||||
+ tmp_h.mode = tmp_h.inode->i_mode & S_IFMT;
|
||||
@@ -12909,10 +12899,10 @@ index 0000000..488473e
|
||||
+#endif /* __AUFS_FILE_H__ */
|
||||
diff --git a/fs/aufs/finfo.c b/fs/aufs/finfo.c
|
||||
new file mode 100644
|
||||
index 0000000..05732c9
|
||||
index 0000000..e709205
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/finfo.c
|
||||
@@ -0,0 +1,144 @@
|
||||
@@ -0,0 +1,143 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -12977,7 +12967,6 @@ index 0000000..05732c9
|
||||
+ if (fidir) {
|
||||
+ fidir->fd_bbot = -1;
|
||||
+ fidir->fd_nent = nbr;
|
||||
+ fidir->fd_vdir_cache = NULL;
|
||||
+ }
|
||||
+
|
||||
+ return fidir;
|
||||
@@ -18398,7 +18387,7 @@ index 0000000..fd815fd
|
||||
+}
|
||||
diff --git a/fs/aufs/iinfo.c b/fs/aufs/iinfo.c
|
||||
new file mode 100644
|
||||
index 0000000..b8efd45
|
||||
index 0000000..c604f69
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/iinfo.c
|
||||
@@ -0,0 +1,264 @@
|
||||
@@ -18509,13 +18498,13 @@ index 0000000..b8efd45
|
||||
+ sigen = au_sigen(inode->i_sb);
|
||||
+ iinfo = au_ii(inode);
|
||||
+ iigen = &iinfo->ii_generation;
|
||||
+ spin_lock(&iinfo->ii_genspin);
|
||||
+ spin_lock(&iigen->ig_spin);
|
||||
+ iigen->ig_generation = sigen;
|
||||
+ if (half)
|
||||
+ au_ig_fset(iigen->ig_flags, HALF_REFRESHED);
|
||||
+ else
|
||||
+ au_ig_fclr(iigen->ig_flags, HALF_REFRESHED);
|
||||
+ spin_unlock(&iinfo->ii_genspin);
|
||||
+ spin_unlock(&iigen->ig_spin);
|
||||
+}
|
||||
+
|
||||
+/* it may be called at remount time, too */
|
||||
@@ -18568,7 +18557,7 @@ index 0000000..b8efd45
|
||||
+ struct au_iinfo *iinfo = &c->iinfo;
|
||||
+ static struct lock_class_key aufs_ii;
|
||||
+
|
||||
+ spin_lock_init(&iinfo->ii_genspin);
|
||||
+ spin_lock_init(&iinfo->ii_generation.ig_spin);
|
||||
+ au_rw_init(&iinfo->ii_rwsem);
|
||||
+ au_rw_class(&iinfo->ii_rwsem, &aufs_ii);
|
||||
+ inode_init_once(&c->vfs_inode);
|
||||
@@ -19189,10 +19178,10 @@ index 0000000..6db3d6f
|
||||
+}
|
||||
diff --git a/fs/aufs/inode.h b/fs/aufs/inode.h
|
||||
new file mode 100644
|
||||
index 0000000..a3a1876
|
||||
index 0000000..31e31f4
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/inode.h
|
||||
@@ -0,0 +1,668 @@
|
||||
@@ -0,0 +1,672 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -19241,12 +19230,12 @@ index 0000000..a3a1876
|
||||
+ do { (flags) &= ~AuIG_##name; } while (0)
|
||||
+
|
||||
+struct au_iigen {
|
||||
+ spinlock_t ig_spin;
|
||||
+ __u32 ig_generation, ig_flags;
|
||||
+};
|
||||
+
|
||||
+struct au_vdir;
|
||||
+struct au_iinfo {
|
||||
+ spinlock_t ii_genspin;
|
||||
+ struct au_iigen ii_generation;
|
||||
+ struct super_block *ii_hsb1; /* no get/put */
|
||||
+
|
||||
@@ -19604,17 +19593,19 @@ index 0000000..a3a1876
|
||||
+#endif
|
||||
+}
|
||||
+
|
||||
+static inline unsigned int au_iigen(struct inode *inode, struct au_iigen *iigen)
|
||||
+static inline unsigned int au_iigen(struct inode *inode, struct au_iigen *iigen_arg)
|
||||
+{
|
||||
+ unsigned int gen;
|
||||
+ struct au_iinfo *iinfo;
|
||||
+ struct au_iigen *iigen;
|
||||
+
|
||||
+ iinfo = au_ii(inode);
|
||||
+ spin_lock(&iinfo->ii_genspin);
|
||||
+ if (iigen)
|
||||
+ *iigen = iinfo->ii_generation;
|
||||
+ gen = iinfo->ii_generation.ig_generation;
|
||||
+ spin_unlock(&iinfo->ii_genspin);
|
||||
+ iigen = &iinfo->ii_generation;
|
||||
+ spin_lock(&iigen->ig_spin);
|
||||
+ if (iigen_arg)
|
||||
+ *iigen_arg = *iigen;
|
||||
+ gen = iigen->ig_generation;
|
||||
+ spin_unlock(&iigen->ig_spin);
|
||||
+
|
||||
+ return gen;
|
||||
+}
|
||||
@@ -19634,11 +19625,13 @@ index 0000000..a3a1876
|
||||
+static inline void au_iigen_dec(struct inode *inode)
|
||||
+{
|
||||
+ struct au_iinfo *iinfo;
|
||||
+ struct au_iigen *iigen;
|
||||
+
|
||||
+ iinfo = au_ii(inode);
|
||||
+ spin_lock(&iinfo->ii_genspin);
|
||||
+ iinfo->ii_generation.ig_generation--;
|
||||
+ spin_unlock(&iinfo->ii_genspin);
|
||||
+ iigen = &iinfo->ii_generation;
|
||||
+ spin_lock(&iigen->ig_spin);
|
||||
+ iigen->ig_generation--;
|
||||
+ spin_unlock(&iigen->ig_spin);
|
||||
+}
|
||||
+
|
||||
+static inline int au_iigen_test(struct inode *inode, unsigned int sigen)
|
||||
@@ -25205,10 +25198,10 @@ index 0000000..a66d39e
|
||||
+#endif /* __AUFS_SPL_H__ */
|
||||
diff --git a/fs/aufs/super.c b/fs/aufs/super.c
|
||||
new file mode 100644
|
||||
index 0000000..3fe10d3
|
||||
index 0000000..98cfd64
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/super.c
|
||||
@@ -0,0 +1,1034 @@
|
||||
@@ -0,0 +1,1026 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -25667,16 +25660,6 @@ index 0000000..3fe10d3
|
||||
+
|
||||
+/* ---------------------------------------------------------------------- */
|
||||
+
|
||||
+void au_array_free(void *array)
|
||||
+{
|
||||
+ if (array) {
|
||||
+ if (!is_vmalloc_addr(array))
|
||||
+ kfree(array);
|
||||
+ else
|
||||
+ vfree(array);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb,
|
||||
+ struct super_block *sb, void *arg)
|
||||
+{
|
||||
@@ -25753,7 +25736,7 @@ index 0000000..3fe10d3
|
||||
+
|
||||
+ for (ull = 0; ull < max; ull++)
|
||||
+ iput(a[ull]);
|
||||
+ au_array_free(a);
|
||||
+ kvfree(a);
|
||||
+}
|
||||
+
|
||||
+/* ---------------------------------------------------------------------- */
|
||||
@@ -25978,7 +25961,9 @@ index 0000000..3fe10d3
|
||||
+{
|
||||
+ int err, do_dx;
|
||||
+ unsigned int mntflags;
|
||||
+ struct au_opts opts;
|
||||
+ struct au_opts opts = {
|
||||
+ .opt = NULL
|
||||
+ };
|
||||
+ struct dentry *root;
|
||||
+ struct inode *inode;
|
||||
+ struct au_sbinfo *sbinfo;
|
||||
@@ -25996,7 +25981,6 @@ index 0000000..3fe10d3
|
||||
+ }
|
||||
+
|
||||
+ err = -ENOMEM;
|
||||
+ memset(&opts, 0, sizeof(opts));
|
||||
+ opts.opt = (void *)__get_free_page(GFP_NOFS);
|
||||
+ if (unlikely(!opts.opt))
|
||||
+ goto out;
|
||||
@@ -26097,7 +26081,9 @@ index 0000000..3fe10d3
|
||||
+ int silent __maybe_unused)
|
||||
+{
|
||||
+ int err;
|
||||
+ struct au_opts opts;
|
||||
+ struct au_opts opts = {
|
||||
+ .opt = NULL
|
||||
+ };
|
||||
+ struct au_sbinfo *sbinfo;
|
||||
+ struct dentry *root;
|
||||
+ struct inode *inode;
|
||||
@@ -26110,7 +26096,6 @@ index 0000000..3fe10d3
|
||||
+ }
|
||||
+
|
||||
+ err = -ENOMEM;
|
||||
+ memset(&opts, 0, sizeof(opts));
|
||||
+ opts.opt = (void *)__get_free_page(GFP_NOFS);
|
||||
+ if (unlikely(!opts.opt))
|
||||
+ goto out;
|
||||
@@ -26245,10 +26230,10 @@ index 0000000..3fe10d3
|
||||
+};
|
||||
diff --git a/fs/aufs/super.h b/fs/aufs/super.h
|
||||
new file mode 100644
|
||||
index 0000000..e0f588e
|
||||
index 0000000..d151729
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/super.h
|
||||
@@ -0,0 +1,629 @@
|
||||
@@ -0,0 +1,628 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -26517,7 +26502,6 @@ index 0000000..e0f588e
|
||||
+struct inode *au_iget_locked(struct super_block *sb, ino_t ino);
|
||||
+typedef unsigned long long (*au_arraycb_t)(struct super_block *sb, void *array,
|
||||
+ unsigned long long max, void *arg);
|
||||
+void au_array_free(void *array);
|
||||
+void *au_array_alloc(unsigned long long *hint, au_arraycb_t cb,
|
||||
+ struct super_block *sb, void *arg);
|
||||
+struct inode **au_iarray_alloc(struct super_block *sb, unsigned long long *max);
|
||||
@@ -30327,10 +30311,10 @@ index 0000000..53a01fb
|
||||
+};
|
||||
diff --git a/fs/aufs/whout.c b/fs/aufs/whout.c
|
||||
new file mode 100644
|
||||
index 0000000..a7f160e
|
||||
index 0000000..05ba085
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/whout.c
|
||||
@@ -0,0 +1,1050 @@
|
||||
@@ -0,0 +1,1047 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2005-2015 Junjiro R. Okajima
|
||||
+ */
|
||||
@@ -31214,15 +31198,12 @@ index 0000000..a7f160e
|
||||
+
|
||||
+ SiMustAnyLock(sb);
|
||||
+
|
||||
+ whtmp = kmalloc(sizeof(*whtmp), gfp);
|
||||
+ whtmp = kzalloc(sizeof(*whtmp), gfp);
|
||||
+ if (unlikely(!whtmp)) {
|
||||
+ whtmp = ERR_PTR(-ENOMEM);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ whtmp->dir = NULL;
|
||||
+ whtmp->br = NULL;
|
||||
+ whtmp->wh_dentry = NULL;
|
||||
+ /* no estimation for dir size */
|
||||
+ rdhash = au_sbi(sb)->si_rdhash;
|
||||
+ if (!rdhash)
|
||||
@@ -32088,7 +32069,7 @@ index 0000000..c1695b3
|
||||
+#endif
|
||||
diff --git a/fs/aufs/xino.c b/fs/aufs/xino.c
|
||||
new file mode 100644
|
||||
index 0000000..f377ce5
|
||||
index 0000000..90de8c5
|
||||
--- /dev/null
|
||||
+++ b/fs/aufs/xino.c
|
||||
@@ -0,0 +1,1283 @@
|
||||
@@ -32339,7 +32320,7 @@ index 0000000..f377ce5
|
||||
+ struct au_xino_lock_dir ldir;
|
||||
+
|
||||
+ err = -ENOMEM;
|
||||
+ st = kzalloc(sizeof(*st), GFP_NOFS);
|
||||
+ st = kmalloc(sizeof(*st), GFP_NOFS);
|
||||
+ if (unlikely(!st))
|
||||
+ goto out;
|
||||
+
|
||||
@@ -33375,19 +33356,6 @@ index 0000000..f377ce5
|
||||
+out:
|
||||
+ return err;
|
||||
+}
|
||||
diff --git a/fs/buffer.c b/fs/buffer.c
|
||||
index 82283ab..477e5f3 100644
|
||||
--- a/fs/buffer.c
|
||||
+++ b/fs/buffer.c
|
||||
@@ -2473,7 +2473,7 @@ int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
|
||||
* Update file times before taking page lock. We may end up failing the
|
||||
* fault so this update may be superfluous but who really cares...
|
||||
*/
|
||||
- file_update_time(vma->vm_file);
|
||||
+ vma_file_update_time(vma);
|
||||
|
||||
ret = __block_page_mkwrite(vma, vmf, get_block);
|
||||
sb_end_pagefault(sb);
|
||||
diff --git a/fs/dcache.c b/fs/dcache.c
|
||||
index 5c33aeb..8aa7f26 100644
|
||||
--- a/fs/dcache.c
|
||||
@@ -33402,10 +33370,10 @@ index 5c33aeb..8aa7f26 100644
|
||||
void (*finish)(void *))
|
||||
{
|
||||
diff --git a/fs/proc/base.c b/fs/proc/base.c
|
||||
index b25eee4..c83d588 100644
|
||||
index bd3e9e6..fc42216 100644
|
||||
--- a/fs/proc/base.c
|
||||
+++ b/fs/proc/base.c
|
||||
@@ -1914,7 +1914,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
|
||||
@@ -1921,7 +1921,7 @@ static int proc_map_files_get_link(struct dentry *dentry, struct path *path)
|
||||
down_read(&mm->mmap_sem);
|
||||
vma = find_exact_vma(mm, vm_start, vm_end);
|
||||
if (vma && vma->vm_file) {
|
||||
@@ -33431,10 +33399,10 @@ index f8595e8..cb8eda0 100644
|
||||
ino = inode->i_ino;
|
||||
}
|
||||
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
|
||||
index e2d46ad..5e7e631 100644
|
||||
index 187b3b5..e03793e 100644
|
||||
--- a/fs/proc/task_mmu.c
|
||||
+++ b/fs/proc/task_mmu.c
|
||||
@@ -280,7 +280,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
|
||||
@@ -281,7 +281,10 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
|
||||
const char *name = NULL;
|
||||
|
||||
if (file) {
|
||||
@@ -33446,7 +33414,7 @@ index e2d46ad..5e7e631 100644
|
||||
dev = inode->i_sb->s_dev;
|
||||
ino = inode->i_ino;
|
||||
pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
|
||||
@@ -1465,7 +1468,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
|
||||
@@ -1505,7 +1508,7 @@ static int show_numa_map(struct seq_file *m, void *v, int is_pid)
|
||||
struct proc_maps_private *proc_priv = &numa_priv->proc_maps;
|
||||
struct vm_area_struct *vma = v;
|
||||
struct numa_maps *md = &numa_priv->md;
|
||||
@@ -33505,10 +33473,10 @@ index 819ef3f..fd0414e 100644
|
||||
{
|
||||
mm_segment_t old_fs;
|
||||
diff --git a/fs/splice.c b/fs/splice.c
|
||||
index 5fc1e50..5f8385a 100644
|
||||
index 4cf700d..30a091d 100644
|
||||
--- a/fs/splice.c
|
||||
+++ b/fs/splice.c
|
||||
@@ -1102,8 +1102,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
|
||||
@@ -1110,8 +1110,8 @@ EXPORT_SYMBOL(generic_splice_sendpage);
|
||||
/*
|
||||
* Attempt to initiate a splice from pipe to file.
|
||||
*/
|
||||
@@ -33519,7 +33487,7 @@ index 5fc1e50..5f8385a 100644
|
||||
{
|
||||
ssize_t (*splice_write)(struct pipe_inode_info *, struct file *,
|
||||
loff_t *, size_t, unsigned int);
|
||||
@@ -1119,9 +1119,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
|
||||
@@ -1127,9 +1127,9 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
|
||||
/*
|
||||
* Attempt to initiate a splice from a file to a pipe.
|
||||
*/
|
||||
@@ -33545,10 +33513,10 @@ index f87d308..9a290b3 100644
|
||||
static inline void fput_light(struct file *file, int fput_needed)
|
||||
{
|
||||
diff --git a/include/linux/fs.h b/include/linux/fs.h
|
||||
index 72d8a84..fabd9d7a 100644
|
||||
index 3aa5142..8d48506 100644
|
||||
--- a/include/linux/fs.h
|
||||
+++ b/include/linux/fs.h
|
||||
@@ -1687,6 +1687,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
||||
@@ -1672,6 +1672,12 @@ ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector,
|
||||
struct iovec *fast_pointer,
|
||||
struct iovec **ret_pointer);
|
||||
|
||||
@@ -33562,10 +33530,10 @@ index 72d8a84..fabd9d7a 100644
|
||||
extern ssize_t __vfs_write(struct file *, const char __user *, size_t, loff_t *);
|
||||
extern ssize_t vfs_read(struct file *, char __user *, size_t, loff_t *);
|
||||
diff --git a/include/linux/mm.h b/include/linux/mm.h
|
||||
index 80001de..9248b97 100644
|
||||
index 00bad77..cc616b0 100644
|
||||
--- a/include/linux/mm.h
|
||||
+++ b/include/linux/mm.h
|
||||
@@ -1211,6 +1211,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
|
||||
@@ -1183,6 +1183,28 @@ static inline int fixup_user_fault(struct task_struct *tsk,
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -33595,10 +33563,10 @@ index 80001de..9248b97 100644
|
||||
extern int access_remote_vm(struct mm_struct *mm, unsigned long addr,
|
||||
void *buf, int len, int write);
|
||||
diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h
|
||||
index 3d6baa7..750ca95 100644
|
||||
index f8d1492..c3a3760 100644
|
||||
--- a/include/linux/mm_types.h
|
||||
+++ b/include/linux/mm_types.h
|
||||
@@ -250,6 +250,7 @@ struct vm_region {
|
||||
@@ -272,6 +272,7 @@ struct vm_region {
|
||||
unsigned long vm_top; /* region allocated to here */
|
||||
unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */
|
||||
struct file *vm_file; /* the backing file or NULL */
|
||||
@@ -33606,7 +33574,7 @@ index 3d6baa7..750ca95 100644
|
||||
|
||||
int vm_usage; /* region usage count (access under nommu_region_sem) */
|
||||
bool vm_icache_flushed : 1; /* true if the icache has been flushed for
|
||||
@@ -324,6 +325,7 @@ struct vm_area_struct {
|
||||
@@ -346,6 +347,7 @@ struct vm_area_struct {
|
||||
unsigned long vm_pgoff; /* Offset (within vm_file) in PAGE_SIZE
|
||||
units, *not* PAGE_CACHE_SIZE */
|
||||
struct file * vm_file; /* File we map to (can be NULL). */
|
||||
@@ -33630,7 +33598,7 @@ index da2751d..2e0fca6 100644
|
||||
+ unsigned int flags);
|
||||
#endif
|
||||
diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
|
||||
index f7b2db4..47098ae 100644
|
||||
index 628e6e6..6dd5765 100644
|
||||
--- a/include/uapi/linux/Kbuild
|
||||
+++ b/include/uapi/linux/Kbuild
|
||||
@@ -59,6 +59,7 @@ header-y += atmsvc.h
|
||||
@@ -33643,7 +33611,7 @@ index f7b2db4..47098ae 100644
|
||||
header-y += auxvec.h
|
||||
diff --git a/include/uapi/linux/aufs_type.h b/include/uapi/linux/aufs_type.h
|
||||
new file mode 100644
|
||||
index 0000000..0eb09ee
|
||||
index 0000000..a06c985
|
||||
--- /dev/null
|
||||
+++ b/include/uapi/linux/aufs_type.h
|
||||
@@ -0,0 +1,406 @@
|
||||
@@ -33675,7 +33643,7 @@ index 0000000..0eb09ee
|
||||
+
|
||||
+#include <linux/limits.h>
|
||||
+
|
||||
+#define AUFS_VERSION "4.3"
|
||||
+#define AUFS_VERSION "4.x-rcN"
|
||||
+
|
||||
+/* todo? move this to linux-2.6.19/include/magic.h */
|
||||
+#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
|
||||
@@ -34054,10 +34022,10 @@ index 0000000..0eb09ee
|
||||
+
|
||||
+#endif /* __AUFS_TYPE_H__ */
|
||||
diff --git a/kernel/fork.c b/kernel/fork.c
|
||||
index 2845623..71004bd 100644
|
||||
index fce002e..2230a0f 100644
|
||||
--- a/kernel/fork.c
|
||||
+++ b/kernel/fork.c
|
||||
@@ -462,7 +462,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||
@@ -464,7 +464,7 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
|
||||
struct inode *inode = file_inode(file);
|
||||
struct address_space *mapping = file->f_mapping;
|
||||
|
||||
@@ -34080,10 +34048,10 @@ index 2ed4319..e3a53f5 100644
|
||||
obj-y += init-mm.o
|
||||
|
||||
diff --git a/mm/filemap.c b/mm/filemap.c
|
||||
index 327910c..7bbc372 100644
|
||||
index 1bb0076..8eaece8 100644
|
||||
--- a/mm/filemap.c
|
||||
+++ b/mm/filemap.c
|
||||
@@ -2089,7 +2089,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
@@ -2128,7 +2128,7 @@ int filemap_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
int ret = VM_FAULT_LOCKED;
|
||||
|
||||
sb_start_pagefault(inode->i_sb);
|
||||
@@ -34093,7 +34061,7 @@ index 327910c..7bbc372 100644
|
||||
if (page->mapping != inode->i_mapping) {
|
||||
unlock_page(page);
|
||||
diff --git a/mm/memory.c b/mm/memory.c
|
||||
index deb679c..df2ce3e 100644
|
||||
index c387430..d434404 100644
|
||||
--- a/mm/memory.c
|
||||
+++ b/mm/memory.c
|
||||
@@ -2035,7 +2035,7 @@ static inline int wp_page_reuse(struct mm_struct *mm,
|
||||
@@ -34106,7 +34074,7 @@ index deb679c..df2ce3e 100644
|
||||
|
||||
return VM_FAULT_WRITE;
|
||||
diff --git a/mm/mmap.c b/mm/mmap.c
|
||||
index 79bcc9f..da28c8a 100644
|
||||
index 2ce04a6..f555c0a 100644
|
||||
--- a/mm/mmap.c
|
||||
+++ b/mm/mmap.c
|
||||
@@ -275,7 +275,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
|
||||
@@ -34127,7 +34095,7 @@ index 79bcc9f..da28c8a 100644
|
||||
}
|
||||
if (next->anon_vma)
|
||||
anon_vma_merge(vma, next);
|
||||
@@ -1683,8 +1683,8 @@ out:
|
||||
@@ -1681,8 +1681,8 @@ out:
|
||||
return addr;
|
||||
|
||||
unmap_and_free_vma:
|
||||
@@ -34137,7 +34105,7 @@ index 79bcc9f..da28c8a 100644
|
||||
|
||||
/* Undo any partial mapping done by a device driver. */
|
||||
unmap_region(mm, vma, prev, vma->vm_start, vma->vm_end);
|
||||
@@ -2485,7 +2485,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
@@ -2488,7 +2488,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
goto out_free_mpol;
|
||||
|
||||
if (new->vm_file)
|
||||
@@ -34146,7 +34114,7 @@ index 79bcc9f..da28c8a 100644
|
||||
|
||||
if (new->vm_ops && new->vm_ops->open)
|
||||
new->vm_ops->open(new);
|
||||
@@ -2504,7 +2504,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
@@ -2507,7 +2507,7 @@ static int __split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
if (new->vm_ops && new->vm_ops->close)
|
||||
new->vm_ops->close(new);
|
||||
if (new->vm_file)
|
||||
@@ -34155,7 +34123,7 @@ index 79bcc9f..da28c8a 100644
|
||||
unlink_anon_vmas(new);
|
||||
out_free_mpol:
|
||||
mpol_put(vma_policy(new));
|
||||
@@ -2646,7 +2646,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
||||
@@ -2649,7 +2649,6 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
||||
struct vm_area_struct *vma;
|
||||
unsigned long populate = 0;
|
||||
unsigned long ret = -EINVAL;
|
||||
@@ -34163,7 +34131,7 @@ index 79bcc9f..da28c8a 100644
|
||||
|
||||
pr_warn_once("%s (%d) uses deprecated remap_file_pages() syscall. "
|
||||
"See Documentation/vm/remap_file_pages.txt.\n",
|
||||
@@ -2690,10 +2689,10 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
||||
@@ -2693,10 +2692,10 @@ SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
|
||||
munlock_vma_pages_range(vma, start, start + size);
|
||||
}
|
||||
|
||||
@@ -34176,7 +34144,7 @@ index 79bcc9f..da28c8a 100644
|
||||
out:
|
||||
up_write(&mm->mmap_sem);
|
||||
if (populate)
|
||||
@@ -2963,7 +2962,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
|
||||
@@ -2966,7 +2965,7 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap,
|
||||
if (anon_vma_clone(new_vma, vma))
|
||||
goto out_free_mempol;
|
||||
if (new_vma->vm_file)
|
||||
@@ -34186,7 +34154,7 @@ index 79bcc9f..da28c8a 100644
|
||||
new_vma->vm_ops->open(new_vma);
|
||||
vma_link(mm, new_vma, prev, rb_link, rb_parent);
|
||||
diff --git a/mm/nommu.c b/mm/nommu.c
|
||||
index ab14a20..fffc566 100644
|
||||
index 92be862..29179f7 100644
|
||||
--- a/mm/nommu.c
|
||||
+++ b/mm/nommu.c
|
||||
@@ -671,7 +671,7 @@ static void __put_nommu_region(struct vm_region *region)
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
From a6351c68fe1ea89ebb39e8c405d622464bcb339e Mon Sep 17 00:00:00 2001
|
||||
From: Philipp Zabel <philipp.zabel@gmail.com>
|
||||
Date: Thu, 2 Apr 2015 17:29:03 +0200
|
||||
Subject: [PATCH 1/4] devicetree: add vendor prefix for Vivante Corporation
|
||||
|
||||
Trivial patch to add Vivante Corporation to the list of
|
||||
devicetree vendor prefixes.
|
||||
|
||||
Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
|
||||
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt b/Documentation/devicetree/bindings/vendor-prefixes.txt
|
||||
index 55df1d4..c2767a7 100644
|
||||
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
|
||||
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
|
||||
@@ -238,6 +238,7 @@ v3 V3 Semiconductor
|
||||
variscite Variscite Ltd.
|
||||
via VIA Technologies, Inc.
|
||||
virtio Virtual I/O Device Specification, developed by the OASIS consortium
|
||||
+vivante Vivante Corporation
|
||||
voipac Voipac Technologies s.r.o.
|
||||
wexler Wexler
|
||||
winbond Winbond Electronics corp.
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+79
@@ -0,0 +1,79 @@
|
||||
From f04b205ac143413831b193f39fd9592665111d4b Mon Sep 17 00:00:00 2001
|
||||
From: Lucas Stach <l.stach@pengutronix.de>
|
||||
Date: Thu, 2 Apr 2015 17:29:04 +0200
|
||||
Subject: [PATCH 2/4] drm/etnaviv: add devicetree bindings
|
||||
|
||||
Etnaviv follows the same priciple as imx-drm to have a virtual
|
||||
master device node to bind all the individual GPU cores together
|
||||
into one DRM device.
|
||||
|
||||
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
Acked-by: Rob Herring <robh@kernel.org>
|
||||
---
|
||||
.../bindings/display/etnaviv/etnaviv-drm.txt | 54 ++++++++++++++++++++++
|
||||
1 file changed, 54 insertions(+)
|
||||
create mode 100644 Documentation/devicetree/bindings/display/etnaviv/etnaviv-drm.txt
|
||||
|
||||
diff --git a/Documentation/devicetree/bindings/display/etnaviv/etnaviv-drm.txt b/Documentation/devicetree/bindings/display/etnaviv/etnaviv-drm.txt
|
||||
new file mode 100644
|
||||
index 0000000..ed5e0a7
|
||||
--- /dev/null
|
||||
+++ b/Documentation/devicetree/bindings/display/etnaviv/etnaviv-drm.txt
|
||||
@@ -0,0 +1,54 @@
|
||||
+Etnaviv DRM master device
|
||||
+=========================
|
||||
+
|
||||
+The Etnaviv DRM master device is a virtual device needed to list all
|
||||
+Vivante GPU cores that comprise the GPU subsystem.
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: Should be one of
|
||||
+ "fsl,imx-gpu-subsystem"
|
||||
+ "marvell,dove-gpu-subsystem"
|
||||
+- cores: Should contain a list of phandles pointing to Vivante GPU devices
|
||||
+
|
||||
+example:
|
||||
+
|
||||
+gpu-subsystem {
|
||||
+ compatible = "fsl,imx-gpu-subsystem";
|
||||
+ cores = <&gpu_2d>, <&gpu_3d>;
|
||||
+};
|
||||
+
|
||||
+
|
||||
+Vivante GPU core devices
|
||||
+========================
|
||||
+
|
||||
+Required properties:
|
||||
+- compatible: Should be "vivante,gc"
|
||||
+ A more specific compatible is not needed, as the cores contain chip
|
||||
+ identification registers at fixed locations, which provide all the
|
||||
+ necessary information to the driver.
|
||||
+- reg: should be register base and length as documented in the
|
||||
+ datasheet
|
||||
+- interrupts: Should contain the cores interrupt line
|
||||
+- clocks: should contain one clock for entry in clock-names
|
||||
+ see Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
+- clock-names:
|
||||
+ - "bus": AXI/register clock
|
||||
+ - "core": GPU core clock
|
||||
+ - "shader": Shader clock (only required if GPU has feature PIPE_3D)
|
||||
+
|
||||
+Optional properties:
|
||||
+- power-domains: a power domain consumer specifier according to
|
||||
+ Documentation/devicetree/bindings/power/power_domain.txt
|
||||
+
|
||||
+example:
|
||||
+
|
||||
+gpu_3d: gpu@00130000 {
|
||||
+ compatible = "vivante,gc";
|
||||
+ reg = <0x00130000 0x4000>;
|
||||
+ interrupts = <0 9 IRQ_TYPE_LEVEL_HIGH>;
|
||||
+ clocks = <&clks IMX6QDL_CLK_GPU3D_AXI>,
|
||||
+ <&clks IMX6QDL_CLK_GPU3D_CORE>,
|
||||
+ <&clks IMX6QDL_CLK_GPU3D_SHADER>;
|
||||
+ clock-names = "bus", "core", "shader";
|
||||
+ power-domains = <&gpc 1>;
|
||||
+};
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+7474
File diff suppressed because it is too large
Load Diff
+36
@@ -0,0 +1,36 @@
|
||||
From 8bb0bce92ec9330b0ea931df90f719fb5c4a5224 Mon Sep 17 00:00:00 2001
|
||||
From: Lucas Stach <l.stach@pengutronix.de>
|
||||
Date: Thu, 3 Dec 2015 17:12:07 +0100
|
||||
Subject: [PATCH 4/4] MAINTAINERS: add maintainer and reviewers for the etnaviv
|
||||
DRM driver
|
||||
|
||||
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
Acked-by: Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||
---
|
||||
MAINTAINERS | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/MAINTAINERS b/MAINTAINERS
|
||||
index e9caa4b..9990a3b 100644
|
||||
--- a/MAINTAINERS
|
||||
+++ b/MAINTAINERS
|
||||
@@ -3741,6 +3741,15 @@ S: Maintained
|
||||
F: drivers/gpu/drm/sti
|
||||
F: Documentation/devicetree/bindings/display/st,stih4xx.txt
|
||||
|
||||
+DRM DRIVERS FOR VIVANTE GPU IP
|
||||
+M: Lucas Stach <l.stach@pengutronix.de>
|
||||
+R: Russell King <linux+etnaviv@arm.linux.org.uk>
|
||||
+R: Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||
+L: dri-devel@lists.freedesktop.org
|
||||
+S: Maintained
|
||||
+F: drivers/gpu/drm/etnaviv
|
||||
+F: Documentation/devicetree/bindings/display/etnaviv
|
||||
+
|
||||
DSBR100 USB FM RADIO DRIVER
|
||||
M: Alexey Klimov <klimov.linux@gmail.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
From ed94add00e290e675c36cef6767d7d1f51a02f28 Mon Sep 17 00:00:00 2001
|
||||
From: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Date: Mon, 4 Jan 2016 16:10:24 +0300
|
||||
Subject: [PATCH 1/2] drm/etnaviv: unlock on error in etnaviv_gem_get_iova()
|
||||
|
||||
We have to drop a lock before returning -ENOMEM here.
|
||||
|
||||
Fixes: a8c21a5451d8 ('drm/etnaviv: add initial etnaviv DRM driver')
|
||||
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Acked-by: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
---
|
||||
drivers/gpu/drm/etnaviv/etnaviv_gem.c | 6 ++++--
|
||||
1 file changed, 4 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
|
||||
index 8d6f859..9f77c3b 100644
|
||||
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
|
||||
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
|
||||
@@ -305,8 +305,10 @@ int etnaviv_gem_get_iova(struct etnaviv_gpu *gpu,
|
||||
mapping = etnaviv_gem_get_vram_mapping(etnaviv_obj, NULL);
|
||||
if (!mapping) {
|
||||
mapping = kzalloc(sizeof(*mapping), GFP_KERNEL);
|
||||
- if (!mapping)
|
||||
- return -ENOMEM;
|
||||
+ if (!mapping) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto out;
|
||||
+ }
|
||||
|
||||
INIT_LIST_HEAD(&mapping->scan_node);
|
||||
mapping->object = etnaviv_obj;
|
||||
--
|
||||
2.7.0
|
||||
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
From c33246d793b5bb9d8be7c67918136c310185c23d Mon Sep 17 00:00:00 2001
|
||||
From: Lucas Stach <l.stach@pengutronix.de>
|
||||
Date: Wed, 6 Jan 2016 14:36:40 +0100
|
||||
Subject: [PATCH 2/2] drm/etnaviv: fix workaround for GC500
|
||||
|
||||
The hardware description macros define the mask and shifts the wrong
|
||||
way around for the intended use, leading to the condition never being
|
||||
true and the chip revision ending up with the wrong value.
|
||||
|
||||
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
|
||||
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
|
||||
Acked-by: Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||
---
|
||||
drivers/gpu/drm/etnaviv/etnaviv_gpu.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
|
||||
index d39093d..056a72e 100644
|
||||
--- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
|
||||
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c
|
||||
@@ -251,9 +251,12 @@ static void etnaviv_hw_identify(struct etnaviv_gpu *gpu)
|
||||
chipIdentity = gpu_read(gpu, VIVS_HI_CHIP_IDENTITY);
|
||||
|
||||
/* Special case for older graphic cores. */
|
||||
- if (VIVS_HI_CHIP_IDENTITY_FAMILY(chipIdentity) == 0x01) {
|
||||
+ if (((chipIdentity & VIVS_HI_CHIP_IDENTITY_FAMILY__MASK)
|
||||
+ >> VIVS_HI_CHIP_IDENTITY_FAMILY__SHIFT) == 0x01) {
|
||||
gpu->identity.model = 0x500; /* gc500 */
|
||||
- gpu->identity.revision = VIVS_HI_CHIP_IDENTITY_REVISION(chipIdentity);
|
||||
+ gpu->identity.revision =
|
||||
+ (chipIdentity & VIVS_HI_CHIP_IDENTITY_REVISION__MASK)
|
||||
+ >> VIVS_HI_CHIP_IDENTITY_REVISION__SHIFT;
|
||||
} else {
|
||||
|
||||
gpu->identity.model = gpu_read(gpu, VIVS_HI_CHIP_MODEL);
|
||||
--
|
||||
2.7.0
|
||||
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
From 10028c5ab107d3765c7fc282b6c45324d1602155 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Mon, 30 Nov 2015 10:55:13 -0800
|
||||
Subject: [PATCH 1/9] drm: Create a driver hook for allocating GEM object
|
||||
structs.
|
||||
|
||||
The CMA helpers had no way for a driver to extend the struct with its
|
||||
own fields. Since the CMA helpers are mostly "Allocate a
|
||||
drm_gem_cma_object, then fill in a few fields", it's hard to write as
|
||||
pure helpers without passing in a driver callback for the allocate
|
||||
step.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
|
||||
---
|
||||
drivers/gpu/drm/drm_gem_cma_helper.c | 10 ++++++----
|
||||
include/drm/drmP.h | 7 +++++++
|
||||
2 files changed, 13 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c
|
||||
index e109b49..0f7b00b 100644
|
||||
--- a/drivers/gpu/drm/drm_gem_cma_helper.c
|
||||
+++ b/drivers/gpu/drm/drm_gem_cma_helper.c
|
||||
@@ -59,11 +59,13 @@ __drm_gem_cma_create(struct drm_device *drm, size_t size)
|
||||
struct drm_gem_object *gem_obj;
|
||||
int ret;
|
||||
|
||||
- cma_obj = kzalloc(sizeof(*cma_obj), GFP_KERNEL);
|
||||
- if (!cma_obj)
|
||||
+ if (drm->driver->gem_create_object)
|
||||
+ gem_obj = drm->driver->gem_create_object(drm, size);
|
||||
+ else
|
||||
+ gem_obj = kzalloc(sizeof(*cma_obj), GFP_KERNEL);
|
||||
+ if (!gem_obj)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
-
|
||||
- gem_obj = &cma_obj->base;
|
||||
+ cma_obj = container_of(gem_obj, struct drm_gem_cma_object, base);
|
||||
|
||||
ret = drm_gem_object_init(drm, gem_obj, size);
|
||||
if (ret)
|
||||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
|
||||
index 0b921ae..22ff162 100644
|
||||
--- a/include/drm/drmP.h
|
||||
+++ b/include/drm/drmP.h
|
||||
@@ -580,6 +580,13 @@ struct drm_driver {
|
||||
int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
|
||||
void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
|
||||
|
||||
+ /**
|
||||
+ * Hook for allocating the GEM object struct, for use by core
|
||||
+ * helpers.
|
||||
+ */
|
||||
+ struct drm_gem_object *(*gem_create_object)(struct drm_device *dev,
|
||||
+ size_t size);
|
||||
+
|
||||
/* prime: */
|
||||
/* export handle -> fd (see drm_gem_prime_handle_to_fd() helper) */
|
||||
int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv,
|
||||
--
|
||||
2.6.4
|
||||
|
||||
@@ -0,0 +1,512 @@
|
||||
From c826a6e1064419f78855463cf29ce9e8b9d25bf4 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Fri, 9 Oct 2015 20:25:07 -0700
|
||||
Subject: [PATCH 2/9] drm/vc4: Add a BO cache.
|
||||
|
||||
We need to allocate new BOs in the kernel as part of each frame, but
|
||||
the CMA allocator is way too slow for that. As an optimization, keep
|
||||
track of recently-freed BOs and reuse them, with a 1 second timeout to
|
||||
fully free them back to the system.
|
||||
|
||||
This improves 3D performance by about 15%.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_bo.c | 336 +++++++++++++++++++++++++++++++++++++-
|
||||
drivers/gpu/drm/vc4/vc4_debugfs.c | 1 +
|
||||
drivers/gpu/drm/vc4/vc4_drv.c | 6 +-
|
||||
drivers/gpu/drm/vc4/vc4_drv.h | 49 +++++-
|
||||
4 files changed, 384 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
|
||||
index ab9f510..18faa5b 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_bo.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_bo.c
|
||||
@@ -12,19 +12,229 @@
|
||||
* access to system memory with no MMU in between. To support it, we
|
||||
* use the GEM CMA helper functions to allocate contiguous ranges of
|
||||
* physical memory for our BOs.
|
||||
+ *
|
||||
+ * Since the CMA allocator is very slow, we keep a cache of recently
|
||||
+ * freed BOs around so that the kernel's allocation of objects for 3D
|
||||
+ * rendering can return quickly.
|
||||
*/
|
||||
|
||||
#include "vc4_drv.h"
|
||||
|
||||
-struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t size)
|
||||
+static void vc4_bo_stats_dump(struct vc4_dev *vc4)
|
||||
+{
|
||||
+ DRM_INFO("num bos allocated: %d\n",
|
||||
+ vc4->bo_stats.num_allocated);
|
||||
+ DRM_INFO("size bos allocated: %dkb\n",
|
||||
+ vc4->bo_stats.size_allocated / 1024);
|
||||
+ DRM_INFO("num bos used: %d\n",
|
||||
+ vc4->bo_stats.num_allocated - vc4->bo_stats.num_cached);
|
||||
+ DRM_INFO("size bos used: %dkb\n",
|
||||
+ (vc4->bo_stats.size_allocated -
|
||||
+ vc4->bo_stats.size_cached) / 1024);
|
||||
+ DRM_INFO("num bos cached: %d\n",
|
||||
+ vc4->bo_stats.num_cached);
|
||||
+ DRM_INFO("size bos cached: %dkb\n",
|
||||
+ vc4->bo_stats.size_cached / 1024);
|
||||
+}
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_FS
|
||||
+int vc4_bo_stats_debugfs(struct seq_file *m, void *unused)
|
||||
+{
|
||||
+ struct drm_info_node *node = (struct drm_info_node *)m->private;
|
||||
+ struct drm_device *dev = node->minor->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ struct vc4_bo_stats stats;
|
||||
+
|
||||
+ /* Take a snapshot of the current stats with the lock held. */
|
||||
+ mutex_lock(&vc4->bo_lock);
|
||||
+ stats = vc4->bo_stats;
|
||||
+ mutex_unlock(&vc4->bo_lock);
|
||||
+
|
||||
+ seq_printf(m, "num bos allocated: %d\n",
|
||||
+ stats.num_allocated);
|
||||
+ seq_printf(m, "size bos allocated: %dkb\n",
|
||||
+ stats.size_allocated / 1024);
|
||||
+ seq_printf(m, "num bos used: %d\n",
|
||||
+ stats.num_allocated - stats.num_cached);
|
||||
+ seq_printf(m, "size bos used: %dkb\n",
|
||||
+ (stats.size_allocated - stats.size_cached) / 1024);
|
||||
+ seq_printf(m, "num bos cached: %d\n",
|
||||
+ stats.num_cached);
|
||||
+ seq_printf(m, "size bos cached: %dkb\n",
|
||||
+ stats.size_cached / 1024);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif
|
||||
+
|
||||
+static uint32_t bo_page_index(size_t size)
|
||||
+{
|
||||
+ return (size / PAGE_SIZE) - 1;
|
||||
+}
|
||||
+
|
||||
+/* Must be called with bo_lock held. */
|
||||
+static void vc4_bo_destroy(struct vc4_bo *bo)
|
||||
{
|
||||
+ struct drm_gem_object *obj = &bo->base.base;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(obj->dev);
|
||||
+
|
||||
+ vc4->bo_stats.num_allocated--;
|
||||
+ vc4->bo_stats.size_allocated -= obj->size;
|
||||
+ drm_gem_cma_free_object(obj);
|
||||
+}
|
||||
+
|
||||
+/* Must be called with bo_lock held. */
|
||||
+static void vc4_bo_remove_from_cache(struct vc4_bo *bo)
|
||||
+{
|
||||
+ struct drm_gem_object *obj = &bo->base.base;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(obj->dev);
|
||||
+
|
||||
+ vc4->bo_stats.num_cached--;
|
||||
+ vc4->bo_stats.size_cached -= obj->size;
|
||||
+
|
||||
+ list_del(&bo->unref_head);
|
||||
+ list_del(&bo->size_head);
|
||||
+}
|
||||
+
|
||||
+static struct list_head *vc4_get_cache_list_for_size(struct drm_device *dev,
|
||||
+ size_t size)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ uint32_t page_index = bo_page_index(size);
|
||||
+
|
||||
+ if (vc4->bo_cache.size_list_size <= page_index) {
|
||||
+ uint32_t new_size = max(vc4->bo_cache.size_list_size * 2,
|
||||
+ page_index + 1);
|
||||
+ struct list_head *new_list;
|
||||
+ uint32_t i;
|
||||
+
|
||||
+ new_list = kmalloc_array(new_size, sizeof(struct list_head),
|
||||
+ GFP_KERNEL);
|
||||
+ if (!new_list)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* Rebase the old cached BO lists to their new list
|
||||
+ * head locations.
|
||||
+ */
|
||||
+ for (i = 0; i < vc4->bo_cache.size_list_size; i++) {
|
||||
+ struct list_head *old_list =
|
||||
+ &vc4->bo_cache.size_list[i];
|
||||
+
|
||||
+ if (list_empty(old_list))
|
||||
+ INIT_LIST_HEAD(&new_list[i]);
|
||||
+ else
|
||||
+ list_replace(old_list, &new_list[i]);
|
||||
+ }
|
||||
+ /* And initialize the brand new BO list heads. */
|
||||
+ for (i = vc4->bo_cache.size_list_size; i < new_size; i++)
|
||||
+ INIT_LIST_HEAD(&new_list[i]);
|
||||
+
|
||||
+ kfree(vc4->bo_cache.size_list);
|
||||
+ vc4->bo_cache.size_list = new_list;
|
||||
+ vc4->bo_cache.size_list_size = new_size;
|
||||
+ }
|
||||
+
|
||||
+ return &vc4->bo_cache.size_list[page_index];
|
||||
+}
|
||||
+
|
||||
+void vc4_bo_cache_purge(struct drm_device *dev)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+
|
||||
+ mutex_lock(&vc4->bo_lock);
|
||||
+ while (!list_empty(&vc4->bo_cache.time_list)) {
|
||||
+ struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list,
|
||||
+ struct vc4_bo, unref_head);
|
||||
+ vc4_bo_remove_from_cache(bo);
|
||||
+ vc4_bo_destroy(bo);
|
||||
+ }
|
||||
+ mutex_unlock(&vc4->bo_lock);
|
||||
+}
|
||||
+
|
||||
+static struct vc4_bo *vc4_bo_get_from_cache(struct drm_device *dev,
|
||||
+ uint32_t size)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ uint32_t page_index = bo_page_index(size);
|
||||
+ struct vc4_bo *bo = NULL;
|
||||
+
|
||||
+ size = roundup(size, PAGE_SIZE);
|
||||
+
|
||||
+ mutex_lock(&vc4->bo_lock);
|
||||
+ if (page_index >= vc4->bo_cache.size_list_size)
|
||||
+ goto out;
|
||||
+
|
||||
+ if (list_empty(&vc4->bo_cache.size_list[page_index]))
|
||||
+ goto out;
|
||||
+
|
||||
+ bo = list_first_entry(&vc4->bo_cache.size_list[page_index],
|
||||
+ struct vc4_bo, size_head);
|
||||
+ vc4_bo_remove_from_cache(bo);
|
||||
+ kref_init(&bo->base.base.refcount);
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&vc4->bo_lock);
|
||||
+ return bo;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * vc4_gem_create_object - Implementation of driver->gem_create_object.
|
||||
+ *
|
||||
+ * This lets the CMA helpers allocate object structs for us, and keep
|
||||
+ * our BO stats correct.
|
||||
+ */
|
||||
+struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ struct vc4_bo *bo;
|
||||
+
|
||||
+ bo = kzalloc(sizeof(*bo), GFP_KERNEL);
|
||||
+ if (!bo)
|
||||
+ return ERR_PTR(-ENOMEM);
|
||||
+
|
||||
+ mutex_lock(&vc4->bo_lock);
|
||||
+ vc4->bo_stats.num_allocated++;
|
||||
+ vc4->bo_stats.size_allocated += size;
|
||||
+ mutex_unlock(&vc4->bo_lock);
|
||||
+
|
||||
+ return &bo->base.base;
|
||||
+}
|
||||
+
|
||||
+struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size,
|
||||
+ bool from_cache)
|
||||
+{
|
||||
+ size_t size = roundup(unaligned_size, PAGE_SIZE);
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
struct drm_gem_cma_object *cma_obj;
|
||||
|
||||
- cma_obj = drm_gem_cma_create(dev, size);
|
||||
- if (IS_ERR(cma_obj))
|
||||
+ if (size == 0)
|
||||
return NULL;
|
||||
- else
|
||||
- return to_vc4_bo(&cma_obj->base);
|
||||
+
|
||||
+ /* First, try to get a vc4_bo from the kernel BO cache. */
|
||||
+ if (from_cache) {
|
||||
+ struct vc4_bo *bo = vc4_bo_get_from_cache(dev, size);
|
||||
+
|
||||
+ if (bo)
|
||||
+ return bo;
|
||||
+ }
|
||||
+
|
||||
+ cma_obj = drm_gem_cma_create(dev, size);
|
||||
+ if (IS_ERR(cma_obj)) {
|
||||
+ /*
|
||||
+ * If we've run out of CMA memory, kill the cache of
|
||||
+ * CMA allocations we've got laying around and try again.
|
||||
+ */
|
||||
+ vc4_bo_cache_purge(dev);
|
||||
+
|
||||
+ cma_obj = drm_gem_cma_create(dev, size);
|
||||
+ if (IS_ERR(cma_obj)) {
|
||||
+ DRM_ERROR("Failed to allocate from CMA:\n");
|
||||
+ vc4_bo_stats_dump(vc4);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return to_vc4_bo(&cma_obj->base);
|
||||
}
|
||||
|
||||
int vc4_dumb_create(struct drm_file *file_priv,
|
||||
@@ -41,7 +251,7 @@ int vc4_dumb_create(struct drm_file *file_priv,
|
||||
if (args->size < args->pitch * args->height)
|
||||
args->size = args->pitch * args->height;
|
||||
|
||||
- bo = vc4_bo_create(dev, roundup(args->size, PAGE_SIZE));
|
||||
+ bo = vc4_bo_create(dev, args->size, false);
|
||||
if (!bo)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -50,3 +260,117 @@ int vc4_dumb_create(struct drm_file *file_priv,
|
||||
|
||||
return ret;
|
||||
}
|
||||
+
|
||||
+/* Must be called with bo_lock held. */
|
||||
+static void vc4_bo_cache_free_old(struct drm_device *dev)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ unsigned long expire_time = jiffies - msecs_to_jiffies(1000);
|
||||
+
|
||||
+ while (!list_empty(&vc4->bo_cache.time_list)) {
|
||||
+ struct vc4_bo *bo = list_last_entry(&vc4->bo_cache.time_list,
|
||||
+ struct vc4_bo, unref_head);
|
||||
+ if (time_before(expire_time, bo->free_time)) {
|
||||
+ mod_timer(&vc4->bo_cache.time_timer,
|
||||
+ round_jiffies_up(jiffies +
|
||||
+ msecs_to_jiffies(1000)));
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ vc4_bo_remove_from_cache(bo);
|
||||
+ vc4_bo_destroy(bo);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+/* Called on the last userspace/kernel unreference of the BO. Returns
|
||||
+ * it to the BO cache if possible, otherwise frees it.
|
||||
+ *
|
||||
+ * Note that this is called with the struct_mutex held.
|
||||
+ */
|
||||
+void vc4_free_object(struct drm_gem_object *gem_bo)
|
||||
+{
|
||||
+ struct drm_device *dev = gem_bo->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ struct vc4_bo *bo = to_vc4_bo(gem_bo);
|
||||
+ struct list_head *cache_list;
|
||||
+
|
||||
+ mutex_lock(&vc4->bo_lock);
|
||||
+ /* If the object references someone else's memory, we can't cache it.
|
||||
+ */
|
||||
+ if (gem_bo->import_attach) {
|
||||
+ vc4_bo_destroy(bo);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ /* Don't cache if it was publicly named. */
|
||||
+ if (gem_bo->name) {
|
||||
+ vc4_bo_destroy(bo);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ cache_list = vc4_get_cache_list_for_size(dev, gem_bo->size);
|
||||
+ if (!cache_list) {
|
||||
+ vc4_bo_destroy(bo);
|
||||
+ goto out;
|
||||
+ }
|
||||
+
|
||||
+ bo->free_time = jiffies;
|
||||
+ list_add(&bo->size_head, cache_list);
|
||||
+ list_add(&bo->unref_head, &vc4->bo_cache.time_list);
|
||||
+
|
||||
+ vc4->bo_stats.num_cached++;
|
||||
+ vc4->bo_stats.size_cached += gem_bo->size;
|
||||
+
|
||||
+ vc4_bo_cache_free_old(dev);
|
||||
+
|
||||
+out:
|
||||
+ mutex_unlock(&vc4->bo_lock);
|
||||
+}
|
||||
+
|
||||
+static void vc4_bo_cache_time_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 =
|
||||
+ container_of(work, struct vc4_dev, bo_cache.time_work);
|
||||
+ struct drm_device *dev = vc4->dev;
|
||||
+
|
||||
+ mutex_lock(&vc4->bo_lock);
|
||||
+ vc4_bo_cache_free_old(dev);
|
||||
+ mutex_unlock(&vc4->bo_lock);
|
||||
+}
|
||||
+
|
||||
+static void vc4_bo_cache_time_timer(unsigned long data)
|
||||
+{
|
||||
+ struct drm_device *dev = (struct drm_device *)data;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+
|
||||
+ schedule_work(&vc4->bo_cache.time_work);
|
||||
+}
|
||||
+
|
||||
+void vc4_bo_cache_init(struct drm_device *dev)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+
|
||||
+ mutex_init(&vc4->bo_lock);
|
||||
+
|
||||
+ INIT_LIST_HEAD(&vc4->bo_cache.time_list);
|
||||
+
|
||||
+ INIT_WORK(&vc4->bo_cache.time_work, vc4_bo_cache_time_work);
|
||||
+ setup_timer(&vc4->bo_cache.time_timer,
|
||||
+ vc4_bo_cache_time_timer,
|
||||
+ (unsigned long)dev);
|
||||
+}
|
||||
+
|
||||
+void vc4_bo_cache_destroy(struct drm_device *dev)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+
|
||||
+ del_timer(&vc4->bo_cache.time_timer);
|
||||
+ cancel_work_sync(&vc4->bo_cache.time_work);
|
||||
+
|
||||
+ vc4_bo_cache_purge(dev);
|
||||
+
|
||||
+ if (vc4->bo_stats.num_allocated) {
|
||||
+ DRM_ERROR("Destroying BO cache while BOs still allocated:\n");
|
||||
+ vc4_bo_stats_dump(vc4);
|
||||
+ }
|
||||
+}
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_debugfs.c b/drivers/gpu/drm/vc4/vc4_debugfs.c
|
||||
index 4297b0a5..6bcf96e 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_debugfs.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_debugfs.c
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "vc4_regs.h"
|
||||
|
||||
static const struct drm_info_list vc4_debugfs_list[] = {
|
||||
+ {"bo_stats", vc4_bo_stats_debugfs, 0},
|
||||
{"hdmi_regs", vc4_hdmi_debugfs_regs, 0},
|
||||
{"hvs_regs", vc4_hvs_debugfs_regs, 0},
|
||||
{"crtc0_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)0},
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
index 6e73060..da041fa 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
@@ -92,7 +92,8 @@ static struct drm_driver vc4_drm_driver = {
|
||||
.debugfs_cleanup = vc4_debugfs_cleanup,
|
||||
#endif
|
||||
|
||||
- .gem_free_object = drm_gem_cma_free_object,
|
||||
+ .gem_create_object = vc4_create_object,
|
||||
+ .gem_free_object = vc4_free_object,
|
||||
.gem_vm_ops = &drm_gem_cma_vm_ops,
|
||||
|
||||
.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
|
||||
@@ -170,6 +171,8 @@ static int vc4_drm_bind(struct device *dev)
|
||||
|
||||
drm_dev_set_unique(drm, dev_name(dev));
|
||||
|
||||
+ vc4_bo_cache_init(drm);
|
||||
+
|
||||
drm_mode_config_init(drm);
|
||||
if (ret)
|
||||
goto unref;
|
||||
@@ -202,6 +205,7 @@ unbind_all:
|
||||
component_unbind_all(dev, drm);
|
||||
unref:
|
||||
drm_dev_unref(drm);
|
||||
+ vc4_bo_cache_destroy(drm);
|
||||
return ret;
|
||||
}
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
index fd8319f..39a1ff5 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
@@ -17,6 +17,37 @@ struct vc4_dev {
|
||||
struct vc4_crtc *crtc[3];
|
||||
|
||||
struct drm_fbdev_cma *fbdev;
|
||||
+
|
||||
+ /* The kernel-space BO cache. Tracks buffers that have been
|
||||
+ * unreferenced by all other users (refcounts of 0!) but not
|
||||
+ * yet freed, so we can do cheap allocations.
|
||||
+ */
|
||||
+ struct vc4_bo_cache {
|
||||
+ /* Array of list heads for entries in the BO cache,
|
||||
+ * based on number of pages, so we can do O(1) lookups
|
||||
+ * in the cache when allocating.
|
||||
+ */
|
||||
+ struct list_head *size_list;
|
||||
+ uint32_t size_list_size;
|
||||
+
|
||||
+ /* List of all BOs in the cache, ordered by age, so we
|
||||
+ * can do O(1) lookups when trying to free old
|
||||
+ * buffers.
|
||||
+ */
|
||||
+ struct list_head time_list;
|
||||
+ struct work_struct time_work;
|
||||
+ struct timer_list time_timer;
|
||||
+ } bo_cache;
|
||||
+
|
||||
+ struct vc4_bo_stats {
|
||||
+ u32 num_allocated;
|
||||
+ u32 size_allocated;
|
||||
+ u32 num_cached;
|
||||
+ u32 size_cached;
|
||||
+ } bo_stats;
|
||||
+
|
||||
+ /* Protects bo_cache and the BO stats. */
|
||||
+ struct mutex bo_lock;
|
||||
};
|
||||
|
||||
static inline struct vc4_dev *
|
||||
@@ -27,6 +58,17 @@ to_vc4_dev(struct drm_device *dev)
|
||||
|
||||
struct vc4_bo {
|
||||
struct drm_gem_cma_object base;
|
||||
+
|
||||
+ /* List entry for the BO's position in either
|
||||
+ * vc4_exec_info->unref_list or vc4_dev->bo_cache.time_list
|
||||
+ */
|
||||
+ struct list_head unref_head;
|
||||
+
|
||||
+ /* Time in jiffies when the BO was put in vc4->bo_cache. */
|
||||
+ unsigned long free_time;
|
||||
+
|
||||
+ /* List entry for the BO's position in vc4_dev->bo_cache.size_list */
|
||||
+ struct list_head size_head;
|
||||
};
|
||||
|
||||
static inline struct vc4_bo *
|
||||
@@ -104,13 +146,18 @@ to_vc4_encoder(struct drm_encoder *encoder)
|
||||
#define wait_for(COND, MS) _wait_for(COND, MS, 1)
|
||||
|
||||
/* vc4_bo.c */
|
||||
+struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size);
|
||||
void vc4_free_object(struct drm_gem_object *gem_obj);
|
||||
-struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t size);
|
||||
+struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t size,
|
||||
+ bool from_cache);
|
||||
int vc4_dumb_create(struct drm_file *file_priv,
|
||||
struct drm_device *dev,
|
||||
struct drm_mode_create_dumb *args);
|
||||
struct dma_buf *vc4_prime_export(struct drm_device *dev,
|
||||
struct drm_gem_object *obj, int flags);
|
||||
+void vc4_bo_cache_init(struct drm_device *dev);
|
||||
+void vc4_bo_cache_destroy(struct drm_device *dev);
|
||||
+int vc4_bo_stats_debugfs(struct seq_file *m, void *arg);
|
||||
|
||||
/* vc4_crtc.c */
|
||||
extern struct platform_driver vc4_crtc_driver;
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+204
@@ -0,0 +1,204 @@
|
||||
From d5bc60f6ad05b3c676b057bec662cfafc3ee24dd Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Sun, 18 Jan 2015 09:33:17 +1300
|
||||
Subject: [PATCH 3/9] drm/vc4: Add create and map BO ioctls.
|
||||
|
||||
While there exist dumb APIs for creating and mapping BOs, one of the
|
||||
rules is that drivers doing 3D acceleration have to provide their own
|
||||
APIs for buffer allocation (besides, the pitch/height parameters of
|
||||
the dumb alloc don't really make sense for a lot of 3D allocations).
|
||||
|
||||
v2: Use __u32-style types, use "drm.h" instead of <drm/drm.h>.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_bo.c | 41 ++++++++++++++++++++++++++
|
||||
drivers/gpu/drm/vc4/vc4_drv.c | 3 ++
|
||||
drivers/gpu/drm/vc4/vc4_drv.h | 4 +++
|
||||
include/uapi/drm/Kbuild | 1 +
|
||||
include/uapi/drm/vc4_drm.h | 68 +++++++++++++++++++++++++++++++++++++++++++
|
||||
5 files changed, 117 insertions(+)
|
||||
create mode 100644 include/uapi/drm/vc4_drm.h
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c
|
||||
index 18faa5b..06cba26 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_bo.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_bo.c
|
||||
@@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "vc4_drv.h"
|
||||
+#include "uapi/drm/vc4_drm.h"
|
||||
|
||||
static void vc4_bo_stats_dump(struct vc4_dev *vc4)
|
||||
{
|
||||
@@ -346,6 +347,46 @@ static void vc4_bo_cache_time_timer(unsigned long data)
|
||||
schedule_work(&vc4->bo_cache.time_work);
|
||||
}
|
||||
|
||||
+int vc4_create_bo_ioctl(struct drm_device *dev, void *data,
|
||||
+ struct drm_file *file_priv)
|
||||
+{
|
||||
+ struct drm_vc4_create_bo *args = data;
|
||||
+ struct vc4_bo *bo = NULL;
|
||||
+ int ret;
|
||||
+
|
||||
+ /*
|
||||
+ * We can't allocate from the BO cache, because the BOs don't
|
||||
+ * get zeroed, and that might leak data between users.
|
||||
+ */
|
||||
+ bo = vc4_bo_create(dev, args->size, false);
|
||||
+ if (!bo)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle);
|
||||
+ drm_gem_object_unreference_unlocked(&bo->base.base);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+int vc4_mmap_bo_ioctl(struct drm_device *dev, void *data,
|
||||
+ struct drm_file *file_priv)
|
||||
+{
|
||||
+ struct drm_vc4_mmap_bo *args = data;
|
||||
+ struct drm_gem_object *gem_obj;
|
||||
+
|
||||
+ gem_obj = drm_gem_object_lookup(dev, file_priv, args->handle);
|
||||
+ if (!gem_obj) {
|
||||
+ DRM_ERROR("Failed to look up GEM BO %d\n", args->handle);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ /* The mmap offset was set up at BO allocation time. */
|
||||
+ args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node);
|
||||
+
|
||||
+ drm_gem_object_unreference_unlocked(gem_obj);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
void vc4_bo_cache_init(struct drm_device *dev)
|
||||
{
|
||||
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
index da041fa..5fa4688 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
@@ -16,6 +16,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include "drm_fb_cma_helper.h"
|
||||
|
||||
+#include "uapi/drm/vc4_drm.h"
|
||||
#include "vc4_drv.h"
|
||||
#include "vc4_regs.h"
|
||||
|
||||
@@ -73,6 +74,8 @@ static const struct file_operations vc4_drm_fops = {
|
||||
};
|
||||
|
||||
static const struct drm_ioctl_desc vc4_drm_ioctls[] = {
|
||||
+ DRM_IOCTL_DEF_DRV(VC4_CREATE_BO, vc4_create_bo_ioctl, 0),
|
||||
+ DRM_IOCTL_DEF_DRV(VC4_MMAP_BO, vc4_mmap_bo_ioctl, 0),
|
||||
};
|
||||
|
||||
static struct drm_driver vc4_drm_driver = {
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
index 39a1ff5..fddb0a0 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
@@ -155,6 +155,10 @@ int vc4_dumb_create(struct drm_file *file_priv,
|
||||
struct drm_mode_create_dumb *args);
|
||||
struct dma_buf *vc4_prime_export(struct drm_device *dev,
|
||||
struct drm_gem_object *obj, int flags);
|
||||
+int vc4_create_bo_ioctl(struct drm_device *dev, void *data,
|
||||
+ struct drm_file *file_priv);
|
||||
+int vc4_mmap_bo_ioctl(struct drm_device *dev, void *data,
|
||||
+ struct drm_file *file_priv);
|
||||
void vc4_bo_cache_init(struct drm_device *dev);
|
||||
void vc4_bo_cache_destroy(struct drm_device *dev);
|
||||
int vc4_bo_stats_debugfs(struct seq_file *m, void *arg);
|
||||
diff --git a/include/uapi/drm/Kbuild b/include/uapi/drm/Kbuild
|
||||
index 38d4370..974fcd5 100644
|
||||
--- a/include/uapi/drm/Kbuild
|
||||
+++ b/include/uapi/drm/Kbuild
|
||||
@@ -17,4 +17,5 @@ header-y += tegra_drm.h
|
||||
header-y += via_drm.h
|
||||
header-y += vmwgfx_drm.h
|
||||
header-y += msm_drm.h
|
||||
+header-y += vc4_drm.h
|
||||
header-y += virtgpu_drm.h
|
||||
diff --git a/include/uapi/drm/vc4_drm.h b/include/uapi/drm/vc4_drm.h
|
||||
new file mode 100644
|
||||
index 0000000..219d34c
|
||||
--- /dev/null
|
||||
+++ b/include/uapi/drm/vc4_drm.h
|
||||
@@ -0,0 +1,68 @@
|
||||
+/*
|
||||
+ * Copyright © 2014-2015 Broadcom
|
||||
+ *
|
||||
+ * Permission is hereby granted, free of charge, to any person obtaining a
|
||||
+ * copy of this software and associated documentation files (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 (including the next
|
||||
+ * paragraph) 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 _UAPI_VC4_DRM_H_
|
||||
+#define _UAPI_VC4_DRM_H_
|
||||
+
|
||||
+#include "drm.h"
|
||||
+
|
||||
+#define DRM_VC4_CREATE_BO 0x03
|
||||
+#define DRM_VC4_MMAP_BO 0x04
|
||||
+
|
||||
+#define DRM_IOCTL_VC4_CREATE_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_BO, struct drm_vc4_create_bo)
|
||||
+#define DRM_IOCTL_VC4_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_MMAP_BO, struct drm_vc4_mmap_bo)
|
||||
+
|
||||
+/**
|
||||
+ * struct drm_vc4_create_bo - ioctl argument for creating VC4 BOs.
|
||||
+ *
|
||||
+ * There are currently no values for the flags argument, but it may be
|
||||
+ * used in a future extension.
|
||||
+ */
|
||||
+struct drm_vc4_create_bo {
|
||||
+ __u32 size;
|
||||
+ __u32 flags;
|
||||
+ /** Returned GEM handle for the BO. */
|
||||
+ __u32 handle;
|
||||
+ __u32 pad;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * struct drm_vc4_mmap_bo - ioctl argument for mapping VC4 BOs.
|
||||
+ *
|
||||
+ * This doesn't actually perform an mmap. Instead, it returns the
|
||||
+ * offset you need to use in an mmap on the DRM device node. This
|
||||
+ * means that tools like valgrind end up knowing about the mapped
|
||||
+ * memory.
|
||||
+ *
|
||||
+ * There are currently no values for the flags argument, but it may be
|
||||
+ * used in a future extension.
|
||||
+ */
|
||||
+struct drm_vc4_mmap_bo {
|
||||
+ /** Handle for the object being mapped. */
|
||||
+ __u32 handle;
|
||||
+ __u32 flags;
|
||||
+ /** offset into the drm node to use for subsequent mmap call. */
|
||||
+ __u64 offset;
|
||||
+};
|
||||
+
|
||||
+#endif /* _UAPI_VC4_DRM_H_ */
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+1168
File diff suppressed because it is too large
Load Diff
+26
@@ -0,0 +1,26 @@
|
||||
From 1fa81589bbac16af6baf153ccc9b3f38fb16a498 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Fri, 23 Oct 2015 14:57:22 +0100
|
||||
Subject: [PATCH 5/9] drm/vc4: Fix a typo in a V3D debug register.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_regs.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_regs.h b/drivers/gpu/drm/vc4/vc4_regs.h
|
||||
index 9e4e904..4e52a0a 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_regs.h
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_regs.h
|
||||
@@ -154,7 +154,7 @@
|
||||
#define V3D_PCTRS14 0x006f4
|
||||
#define V3D_PCTR15 0x006f8
|
||||
#define V3D_PCTRS15 0x006fc
|
||||
-#define V3D_BGE 0x00f00
|
||||
+#define V3D_DBGE 0x00f00
|
||||
#define V3D_FDBGO 0x00f04
|
||||
#define V3D_FDBGB 0x00f08
|
||||
#define V3D_FDBGR 0x00f0c
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+333
@@ -0,0 +1,333 @@
|
||||
From d3f5168a0810005920e7a3d5ba83e249bd9a750c Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Mon, 2 Mar 2015 13:01:12 -0800
|
||||
Subject: [PATCH 6/9] drm/vc4: Bind and initialize the V3D engine.
|
||||
|
||||
This is the component of the GPU that does 3D rendering.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/gpu/drm/vc4/Makefile | 1 +
|
||||
drivers/gpu/drm/vc4/vc4_debugfs.c | 2 +
|
||||
drivers/gpu/drm/vc4/vc4_drv.c | 1 +
|
||||
drivers/gpu/drm/vc4/vc4_drv.h | 13 +++
|
||||
drivers/gpu/drm/vc4/vc4_v3d.c | 225 ++++++++++++++++++++++++++++++++++++++
|
||||
5 files changed, 242 insertions(+)
|
||||
create mode 100644 drivers/gpu/drm/vc4/vc4_v3d.c
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/Makefile b/drivers/gpu/drm/vc4/Makefile
|
||||
index eb776a6..e87a6f2 100644
|
||||
--- a/drivers/gpu/drm/vc4/Makefile
|
||||
+++ b/drivers/gpu/drm/vc4/Makefile
|
||||
@@ -11,6 +11,7 @@ vc4-y := \
|
||||
vc4_hdmi.o \
|
||||
vc4_hvs.o \
|
||||
vc4_plane.o \
|
||||
+ vc4_v3d.o \
|
||||
vc4_validate_shaders.o
|
||||
|
||||
vc4-$(CONFIG_DEBUG_FS) += vc4_debugfs.o
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_debugfs.c b/drivers/gpu/drm/vc4/vc4_debugfs.c
|
||||
index 6bcf96e..d76ad10 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_debugfs.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_debugfs.c
|
||||
@@ -22,6 +22,8 @@ static const struct drm_info_list vc4_debugfs_list[] = {
|
||||
{"crtc0_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)0},
|
||||
{"crtc1_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)1},
|
||||
{"crtc2_regs", vc4_crtc_debugfs_regs, 0, (void *)(uintptr_t)2},
|
||||
+ {"v3d_ident", vc4_v3d_debugfs_ident, 0},
|
||||
+ {"v3d_regs", vc4_v3d_debugfs_regs, 0},
|
||||
};
|
||||
|
||||
#define VC4_DEBUGFS_ENTRIES ARRAY_SIZE(vc4_debugfs_list)
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
index da4be9c..db58d74 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
@@ -236,6 +236,7 @@ static struct platform_driver *const component_drivers[] = {
|
||||
&vc4_hdmi_driver,
|
||||
&vc4_crtc_driver,
|
||||
&vc4_hvs_driver,
|
||||
+ &vc4_v3d_driver,
|
||||
};
|
||||
|
||||
static int vc4_platform_drm_probe(struct platform_device *pdev)
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
index bd77d55..8945463 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
@@ -15,6 +15,7 @@ struct vc4_dev {
|
||||
struct vc4_hdmi *hdmi;
|
||||
struct vc4_hvs *hvs;
|
||||
struct vc4_crtc *crtc[3];
|
||||
+ struct vc4_v3d *v3d;
|
||||
|
||||
struct drm_fbdev_cma *fbdev;
|
||||
|
||||
@@ -82,6 +83,11 @@ to_vc4_bo(struct drm_gem_object *bo)
|
||||
return (struct vc4_bo *)bo;
|
||||
}
|
||||
|
||||
+struct vc4_v3d {
|
||||
+ struct platform_device *pdev;
|
||||
+ void __iomem *regs;
|
||||
+};
|
||||
+
|
||||
struct vc4_hvs {
|
||||
struct platform_device *pdev;
|
||||
void __iomem *regs;
|
||||
@@ -119,6 +125,8 @@ to_vc4_encoder(struct drm_encoder *encoder)
|
||||
return container_of(encoder, struct vc4_encoder, base);
|
||||
}
|
||||
|
||||
+#define V3D_READ(offset) readl(vc4->v3d->regs + offset)
|
||||
+#define V3D_WRITE(offset, val) writel(val, vc4->v3d->regs + offset)
|
||||
#define HVS_READ(offset) readl(vc4->hvs->regs + offset)
|
||||
#define HVS_WRITE(offset, val) writel(val, vc4->hvs->regs + offset)
|
||||
|
||||
@@ -241,6 +249,11 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
|
||||
u32 vc4_plane_write_dlist(struct drm_plane *plane, u32 __iomem *dlist);
|
||||
u32 vc4_plane_dlist_size(struct drm_plane_state *state);
|
||||
|
||||
+/* vc4_v3d.c */
|
||||
+extern struct platform_driver vc4_v3d_driver;
|
||||
+int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused);
|
||||
+int vc4_v3d_debugfs_regs(struct seq_file *m, void *unused);
|
||||
+
|
||||
/* vc4_validate_shader.c */
|
||||
struct vc4_validated_shader_info *
|
||||
vc4_validate_shader(struct drm_gem_cma_object *shader_obj);
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_v3d.c b/drivers/gpu/drm/vc4/vc4_v3d.c
|
||||
new file mode 100644
|
||||
index 0000000..040ad0d
|
||||
--- /dev/null
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_v3d.c
|
||||
@@ -0,0 +1,225 @@
|
||||
+/*
|
||||
+ * Copyright (c) 2014 The Linux Foundation. All rights reserved.
|
||||
+ * Copyright (C) 2013 Red Hat
|
||||
+ * Author: Rob Clark <robdclark@gmail.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.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+ * more details.
|
||||
+ *
|
||||
+ * You should have received a copy of the GNU General Public License along with
|
||||
+ * this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+ */
|
||||
+
|
||||
+#include "linux/component.h"
|
||||
+#include "vc4_drv.h"
|
||||
+#include "vc4_regs.h"
|
||||
+
|
||||
+#ifdef CONFIG_DEBUG_FS
|
||||
+#define REGDEF(reg) { reg, #reg }
|
||||
+static const struct {
|
||||
+ uint32_t reg;
|
||||
+ const char *name;
|
||||
+} vc4_reg_defs[] = {
|
||||
+ REGDEF(V3D_IDENT0),
|
||||
+ REGDEF(V3D_IDENT1),
|
||||
+ REGDEF(V3D_IDENT2),
|
||||
+ REGDEF(V3D_SCRATCH),
|
||||
+ REGDEF(V3D_L2CACTL),
|
||||
+ REGDEF(V3D_SLCACTL),
|
||||
+ REGDEF(V3D_INTCTL),
|
||||
+ REGDEF(V3D_INTENA),
|
||||
+ REGDEF(V3D_INTDIS),
|
||||
+ REGDEF(V3D_CT0CS),
|
||||
+ REGDEF(V3D_CT1CS),
|
||||
+ REGDEF(V3D_CT0EA),
|
||||
+ REGDEF(V3D_CT1EA),
|
||||
+ REGDEF(V3D_CT0CA),
|
||||
+ REGDEF(V3D_CT1CA),
|
||||
+ REGDEF(V3D_CT00RA0),
|
||||
+ REGDEF(V3D_CT01RA0),
|
||||
+ REGDEF(V3D_CT0LC),
|
||||
+ REGDEF(V3D_CT1LC),
|
||||
+ REGDEF(V3D_CT0PC),
|
||||
+ REGDEF(V3D_CT1PC),
|
||||
+ REGDEF(V3D_PCS),
|
||||
+ REGDEF(V3D_BFC),
|
||||
+ REGDEF(V3D_RFC),
|
||||
+ REGDEF(V3D_BPCA),
|
||||
+ REGDEF(V3D_BPCS),
|
||||
+ REGDEF(V3D_BPOA),
|
||||
+ REGDEF(V3D_BPOS),
|
||||
+ REGDEF(V3D_BXCF),
|
||||
+ REGDEF(V3D_SQRSV0),
|
||||
+ REGDEF(V3D_SQRSV1),
|
||||
+ REGDEF(V3D_SQCNTL),
|
||||
+ REGDEF(V3D_SRQPC),
|
||||
+ REGDEF(V3D_SRQUA),
|
||||
+ REGDEF(V3D_SRQUL),
|
||||
+ REGDEF(V3D_SRQCS),
|
||||
+ REGDEF(V3D_VPACNTL),
|
||||
+ REGDEF(V3D_VPMBASE),
|
||||
+ REGDEF(V3D_PCTRC),
|
||||
+ REGDEF(V3D_PCTRE),
|
||||
+ REGDEF(V3D_PCTR0),
|
||||
+ REGDEF(V3D_PCTRS0),
|
||||
+ REGDEF(V3D_PCTR1),
|
||||
+ REGDEF(V3D_PCTRS1),
|
||||
+ REGDEF(V3D_PCTR2),
|
||||
+ REGDEF(V3D_PCTRS2),
|
||||
+ REGDEF(V3D_PCTR3),
|
||||
+ REGDEF(V3D_PCTRS3),
|
||||
+ REGDEF(V3D_PCTR4),
|
||||
+ REGDEF(V3D_PCTRS4),
|
||||
+ REGDEF(V3D_PCTR5),
|
||||
+ REGDEF(V3D_PCTRS5),
|
||||
+ REGDEF(V3D_PCTR6),
|
||||
+ REGDEF(V3D_PCTRS6),
|
||||
+ REGDEF(V3D_PCTR7),
|
||||
+ REGDEF(V3D_PCTRS7),
|
||||
+ REGDEF(V3D_PCTR8),
|
||||
+ REGDEF(V3D_PCTRS8),
|
||||
+ REGDEF(V3D_PCTR9),
|
||||
+ REGDEF(V3D_PCTRS9),
|
||||
+ REGDEF(V3D_PCTR10),
|
||||
+ REGDEF(V3D_PCTRS10),
|
||||
+ REGDEF(V3D_PCTR11),
|
||||
+ REGDEF(V3D_PCTRS11),
|
||||
+ REGDEF(V3D_PCTR12),
|
||||
+ REGDEF(V3D_PCTRS12),
|
||||
+ REGDEF(V3D_PCTR13),
|
||||
+ REGDEF(V3D_PCTRS13),
|
||||
+ REGDEF(V3D_PCTR14),
|
||||
+ REGDEF(V3D_PCTRS14),
|
||||
+ REGDEF(V3D_PCTR15),
|
||||
+ REGDEF(V3D_PCTRS15),
|
||||
+ REGDEF(V3D_DBGE),
|
||||
+ REGDEF(V3D_FDBGO),
|
||||
+ REGDEF(V3D_FDBGB),
|
||||
+ REGDEF(V3D_FDBGR),
|
||||
+ REGDEF(V3D_FDBGS),
|
||||
+ REGDEF(V3D_ERRSTAT),
|
||||
+};
|
||||
+
|
||||
+int vc4_v3d_debugfs_regs(struct seq_file *m, void *unused)
|
||||
+{
|
||||
+ struct drm_info_node *node = (struct drm_info_node *)m->private;
|
||||
+ struct drm_device *dev = node->minor->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < ARRAY_SIZE(vc4_reg_defs); i++) {
|
||||
+ seq_printf(m, "%s (0x%04x): 0x%08x\n",
|
||||
+ vc4_reg_defs[i].name, vc4_reg_defs[i].reg,
|
||||
+ V3D_READ(vc4_reg_defs[i].reg));
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+int vc4_v3d_debugfs_ident(struct seq_file *m, void *unused)
|
||||
+{
|
||||
+ struct drm_info_node *node = (struct drm_info_node *)m->private;
|
||||
+ struct drm_device *dev = node->minor->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ uint32_t ident1 = V3D_READ(V3D_IDENT1);
|
||||
+ uint32_t nslc = VC4_GET_FIELD(ident1, V3D_IDENT1_NSLC);
|
||||
+ uint32_t tups = VC4_GET_FIELD(ident1, V3D_IDENT1_TUPS);
|
||||
+ uint32_t qups = VC4_GET_FIELD(ident1, V3D_IDENT1_QUPS);
|
||||
+
|
||||
+ seq_printf(m, "Revision: %d\n",
|
||||
+ VC4_GET_FIELD(ident1, V3D_IDENT1_REV));
|
||||
+ seq_printf(m, "Slices: %d\n", nslc);
|
||||
+ seq_printf(m, "TMUs: %d\n", nslc * tups);
|
||||
+ seq_printf(m, "QPUs: %d\n", nslc * qups);
|
||||
+ seq_printf(m, "Semaphores: %d\n",
|
||||
+ VC4_GET_FIELD(ident1, V3D_IDENT1_NSEM));
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+#endif /* CONFIG_DEBUG_FS */
|
||||
+
|
||||
+static void vc4_v3d_init_hw(struct drm_device *dev)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+
|
||||
+ /* Take all the memory that would have been reserved for user
|
||||
+ * QPU programs, since we don't have an interface for running
|
||||
+ * them, anyway.
|
||||
+ */
|
||||
+ V3D_WRITE(V3D_VPMBASE, 0);
|
||||
+}
|
||||
+
|
||||
+static int vc4_v3d_bind(struct device *dev, struct device *master, void *data)
|
||||
+{
|
||||
+ struct platform_device *pdev = to_platform_device(dev);
|
||||
+ struct drm_device *drm = dev_get_drvdata(master);
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(drm);
|
||||
+ struct vc4_v3d *v3d = NULL;
|
||||
+
|
||||
+ v3d = devm_kzalloc(&pdev->dev, sizeof(*v3d), GFP_KERNEL);
|
||||
+ if (!v3d)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ v3d->pdev = pdev;
|
||||
+
|
||||
+ v3d->regs = vc4_ioremap_regs(pdev, 0);
|
||||
+ if (IS_ERR(v3d->regs))
|
||||
+ return PTR_ERR(v3d->regs);
|
||||
+
|
||||
+ vc4->v3d = v3d;
|
||||
+
|
||||
+ if (V3D_READ(V3D_IDENT0) != V3D_EXPECTED_IDENT0) {
|
||||
+ DRM_ERROR("V3D_IDENT0 read 0x%08x instead of 0x%08x\n",
|
||||
+ V3D_READ(V3D_IDENT0), V3D_EXPECTED_IDENT0);
|
||||
+ return -EINVAL;
|
||||
+ }
|
||||
+
|
||||
+ vc4_v3d_init_hw(drm);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void vc4_v3d_unbind(struct device *dev, struct device *master,
|
||||
+ void *data)
|
||||
+{
|
||||
+ struct drm_device *drm = dev_get_drvdata(master);
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(drm);
|
||||
+
|
||||
+ vc4->v3d = NULL;
|
||||
+}
|
||||
+
|
||||
+static const struct component_ops vc4_v3d_ops = {
|
||||
+ .bind = vc4_v3d_bind,
|
||||
+ .unbind = vc4_v3d_unbind,
|
||||
+};
|
||||
+
|
||||
+static int vc4_v3d_dev_probe(struct platform_device *pdev)
|
||||
+{
|
||||
+ return component_add(&pdev->dev, &vc4_v3d_ops);
|
||||
+}
|
||||
+
|
||||
+static int vc4_v3d_dev_remove(struct platform_device *pdev)
|
||||
+{
|
||||
+ component_del(&pdev->dev, &vc4_v3d_ops);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static const struct of_device_id vc4_v3d_dt_match[] = {
|
||||
+ { .compatible = "brcm,vc4-v3d" },
|
||||
+ {}
|
||||
+};
|
||||
+
|
||||
+struct platform_driver vc4_v3d_driver = {
|
||||
+ .probe = vc4_v3d_dev_probe,
|
||||
+ .remove = vc4_v3d_dev_remove,
|
||||
+ .driver = {
|
||||
+ .name = "vc4_v3d",
|
||||
+ .of_match_table = vc4_v3d_dt_match,
|
||||
+ },
|
||||
+};
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+3477
File diff suppressed because it is too large
Load Diff
+511
@@ -0,0 +1,511 @@
|
||||
From b501bacc6060fd62654b756469cc3091eb53de3a Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Mon, 30 Nov 2015 12:34:01 -0800
|
||||
Subject: [PATCH 8/9] drm/vc4: Add support for async pageflips.
|
||||
|
||||
An async pageflip stores the modeset to be done and executes it once
|
||||
the BOs are ready to be displayed. This gets us about 3x performance
|
||||
in full screen rendering with pageflipping.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_crtc.c | 99 +++++++++++++++++++++++++-
|
||||
drivers/gpu/drm/vc4/vc4_drv.h | 16 +++++
|
||||
drivers/gpu/drm/vc4/vc4_gem.c | 40 +++++++++++
|
||||
drivers/gpu/drm/vc4/vc4_kms.c | 149 +++++++++++++++++++++++++++++++++++++++-
|
||||
drivers/gpu/drm/vc4/vc4_plane.c | 40 +++++++++++
|
||||
5 files changed, 342 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_crtc.c b/drivers/gpu/drm/vc4/vc4_crtc.c
|
||||
index 7a9f476..a319332 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_crtc.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_crtc.c
|
||||
@@ -35,6 +35,7 @@
|
||||
#include "drm_atomic_helper.h"
|
||||
#include "drm_crtc_helper.h"
|
||||
#include "linux/clk.h"
|
||||
+#include "drm_fb_cma_helper.h"
|
||||
#include "linux/component.h"
|
||||
#include "linux/of_device.h"
|
||||
#include "vc4_drv.h"
|
||||
@@ -475,10 +476,106 @@ static irqreturn_t vc4_crtc_irq_handler(int irq, void *data)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+struct vc4_async_flip_state {
|
||||
+ struct drm_crtc *crtc;
|
||||
+ struct drm_framebuffer *fb;
|
||||
+ struct drm_pending_vblank_event *event;
|
||||
+
|
||||
+ struct vc4_seqno_cb cb;
|
||||
+};
|
||||
+
|
||||
+/* Called when the V3D execution for the BO being flipped to is done, so that
|
||||
+ * we can actually update the plane's address to point to it.
|
||||
+ */
|
||||
+static void
|
||||
+vc4_async_page_flip_complete(struct vc4_seqno_cb *cb)
|
||||
+{
|
||||
+ struct vc4_async_flip_state *flip_state =
|
||||
+ container_of(cb, struct vc4_async_flip_state, cb);
|
||||
+ struct drm_crtc *crtc = flip_state->crtc;
|
||||
+ struct drm_device *dev = crtc->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ struct drm_plane *plane = crtc->primary;
|
||||
+
|
||||
+ vc4_plane_async_set_fb(plane, flip_state->fb);
|
||||
+ if (flip_state->event) {
|
||||
+ unsigned long flags;
|
||||
+
|
||||
+ spin_lock_irqsave(&dev->event_lock, flags);
|
||||
+ drm_crtc_send_vblank_event(crtc, flip_state->event);
|
||||
+ spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
+ }
|
||||
+
|
||||
+ drm_framebuffer_unreference(flip_state->fb);
|
||||
+ kfree(flip_state);
|
||||
+
|
||||
+ up(&vc4->async_modeset);
|
||||
+}
|
||||
+
|
||||
+/* Implements async (non-vblank-synced) page flips.
|
||||
+ *
|
||||
+ * The page flip ioctl needs to return immediately, so we grab the
|
||||
+ * modeset semaphore on the pipe, and queue the address update for
|
||||
+ * when V3D is done with the BO being flipped to.
|
||||
+ */
|
||||
+static int vc4_async_page_flip(struct drm_crtc *crtc,
|
||||
+ struct drm_framebuffer *fb,
|
||||
+ struct drm_pending_vblank_event *event,
|
||||
+ uint32_t flags)
|
||||
+{
|
||||
+ struct drm_device *dev = crtc->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ struct drm_plane *plane = crtc->primary;
|
||||
+ int ret = 0;
|
||||
+ struct vc4_async_flip_state *flip_state;
|
||||
+ struct drm_gem_cma_object *cma_bo = drm_fb_cma_get_gem_obj(fb, 0);
|
||||
+ struct vc4_bo *bo = to_vc4_bo(&cma_bo->base);
|
||||
+
|
||||
+ flip_state = kzalloc(sizeof(*flip_state), GFP_KERNEL);
|
||||
+ if (!flip_state)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ drm_framebuffer_reference(fb);
|
||||
+ flip_state->fb = fb;
|
||||
+ flip_state->crtc = crtc;
|
||||
+ flip_state->event = event;
|
||||
+
|
||||
+ /* Make sure all other async modesetes have landed. */
|
||||
+ ret = down_interruptible(&vc4->async_modeset);
|
||||
+ if (ret) {
|
||||
+ kfree(flip_state);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /* Immediately update the plane's legacy fb pointer, so that later
|
||||
+ * modeset prep sees the state that will be present when the semaphore
|
||||
+ * is released.
|
||||
+ */
|
||||
+ drm_atomic_set_fb_for_plane(plane->state, fb);
|
||||
+ plane->fb = fb;
|
||||
+
|
||||
+ vc4_queue_seqno_cb(dev, &flip_state->cb, bo->seqno,
|
||||
+ vc4_async_page_flip_complete);
|
||||
+
|
||||
+ /* Driver takes ownership of state on successful async commit. */
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int vc4_page_flip(struct drm_crtc *crtc,
|
||||
+ struct drm_framebuffer *fb,
|
||||
+ struct drm_pending_vblank_event *event,
|
||||
+ uint32_t flags)
|
||||
+{
|
||||
+ if (flags & DRM_MODE_PAGE_FLIP_ASYNC)
|
||||
+ return vc4_async_page_flip(crtc, fb, event, flags);
|
||||
+ else
|
||||
+ return drm_atomic_helper_page_flip(crtc, fb, event, flags);
|
||||
+}
|
||||
+
|
||||
static const struct drm_crtc_funcs vc4_crtc_funcs = {
|
||||
.set_config = drm_atomic_helper_set_config,
|
||||
.destroy = vc4_crtc_destroy,
|
||||
- .page_flip = drm_atomic_helper_page_flip,
|
||||
+ .page_flip = vc4_page_flip,
|
||||
.set_property = NULL,
|
||||
.cursor_set = NULL, /* handled by drm_mode_cursor_universal */
|
||||
.cursor_move = NULL, /* handled by drm_mode_cursor_universal */
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
index 0bc8c57..f9927d8 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
@@ -76,6 +76,11 @@ struct vc4_dev {
|
||||
wait_queue_head_t job_wait_queue;
|
||||
struct work_struct job_done_work;
|
||||
|
||||
+ /* List of struct vc4_seqno_cb for callbacks to be made from a
|
||||
+ * workqueue when the given seqno is passed.
|
||||
+ */
|
||||
+ struct list_head seqno_cb_list;
|
||||
+
|
||||
/* The binner overflow memory that's currently set up in
|
||||
* BPOA/BPOS registers. When overflow occurs and a new one is
|
||||
* allocated, the previous one will be moved to
|
||||
@@ -128,6 +133,12 @@ to_vc4_bo(struct drm_gem_object *bo)
|
||||
return (struct vc4_bo *)bo;
|
||||
}
|
||||
|
||||
+struct vc4_seqno_cb {
|
||||
+ struct work_struct work;
|
||||
+ uint64_t seqno;
|
||||
+ void (*func)(struct vc4_seqno_cb *cb);
|
||||
+};
|
||||
+
|
||||
struct vc4_v3d {
|
||||
struct platform_device *pdev;
|
||||
void __iomem *regs;
|
||||
@@ -384,6 +395,9 @@ void vc4_submit_next_job(struct drm_device *dev);
|
||||
int vc4_wait_for_seqno(struct drm_device *dev, uint64_t seqno,
|
||||
uint64_t timeout_ns, bool interruptible);
|
||||
void vc4_job_handle_completed(struct vc4_dev *vc4);
|
||||
+int vc4_queue_seqno_cb(struct drm_device *dev,
|
||||
+ struct vc4_seqno_cb *cb, uint64_t seqno,
|
||||
+ void (*func)(struct vc4_seqno_cb *cb));
|
||||
|
||||
/* vc4_hdmi.c */
|
||||
extern struct platform_driver vc4_hdmi_driver;
|
||||
@@ -409,6 +423,8 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev,
|
||||
enum drm_plane_type type);
|
||||
u32 vc4_plane_write_dlist(struct drm_plane *plane, u32 __iomem *dlist);
|
||||
u32 vc4_plane_dlist_size(struct drm_plane_state *state);
|
||||
+void vc4_plane_async_set_fb(struct drm_plane *plane,
|
||||
+ struct drm_framebuffer *fb);
|
||||
|
||||
/* vc4_v3d.c */
|
||||
extern struct platform_driver vc4_v3d_driver;
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
|
||||
index 936dddf..5fb0556 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_gem.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
|
||||
@@ -461,6 +461,7 @@ void
|
||||
vc4_job_handle_completed(struct vc4_dev *vc4)
|
||||
{
|
||||
unsigned long irqflags;
|
||||
+ struct vc4_seqno_cb *cb, *cb_temp;
|
||||
|
||||
spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
while (!list_empty(&vc4->job_done_list)) {
|
||||
@@ -473,7 +474,45 @@ vc4_job_handle_completed(struct vc4_dev *vc4)
|
||||
vc4_complete_exec(vc4->dev, exec);
|
||||
spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
}
|
||||
+
|
||||
+ list_for_each_entry_safe(cb, cb_temp, &vc4->seqno_cb_list, work.entry) {
|
||||
+ if (cb->seqno <= vc4->finished_seqno) {
|
||||
+ list_del_init(&cb->work.entry);
|
||||
+ schedule_work(&cb->work);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+}
|
||||
+
|
||||
+static void vc4_seqno_cb_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct vc4_seqno_cb *cb = container_of(work, struct vc4_seqno_cb, work);
|
||||
+
|
||||
+ cb->func(cb);
|
||||
+}
|
||||
+
|
||||
+int vc4_queue_seqno_cb(struct drm_device *dev,
|
||||
+ struct vc4_seqno_cb *cb, uint64_t seqno,
|
||||
+ void (*func)(struct vc4_seqno_cb *cb))
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ int ret = 0;
|
||||
+ unsigned long irqflags;
|
||||
+
|
||||
+ cb->func = func;
|
||||
+ INIT_WORK(&cb->work, vc4_seqno_cb_work);
|
||||
+
|
||||
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
+ if (seqno > vc4->finished_seqno) {
|
||||
+ cb->seqno = seqno;
|
||||
+ list_add_tail(&cb->work.entry, &vc4->seqno_cb_list);
|
||||
+ } else {
|
||||
+ schedule_work(&cb->work);
|
||||
+ }
|
||||
spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
/* Scheduled when any job has been completed, this walks the list of
|
||||
@@ -610,6 +649,7 @@ vc4_gem_init(struct drm_device *dev)
|
||||
|
||||
INIT_LIST_HEAD(&vc4->job_list);
|
||||
INIT_LIST_HEAD(&vc4->job_done_list);
|
||||
+ INIT_LIST_HEAD(&vc4->seqno_cb_list);
|
||||
spin_lock_init(&vc4->job_lock);
|
||||
|
||||
INIT_WORK(&vc4->hangcheck.reset_work, vc4_reset_work);
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_kms.c b/drivers/gpu/drm/vc4/vc4_kms.c
|
||||
index 2e5597d..f95f2df 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_kms.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_kms.c
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include "drm_crtc.h"
|
||||
+#include "drm_atomic.h"
|
||||
#include "drm_atomic_helper.h"
|
||||
#include "drm_crtc_helper.h"
|
||||
#include "drm_plane_helper.h"
|
||||
@@ -29,10 +30,152 @@ static void vc4_output_poll_changed(struct drm_device *dev)
|
||||
drm_fbdev_cma_hotplug_event(vc4->fbdev);
|
||||
}
|
||||
|
||||
+struct vc4_commit {
|
||||
+ struct drm_device *dev;
|
||||
+ struct drm_atomic_state *state;
|
||||
+ struct vc4_seqno_cb cb;
|
||||
+};
|
||||
+
|
||||
+static void
|
||||
+vc4_atomic_complete_commit(struct vc4_commit *c)
|
||||
+{
|
||||
+ struct drm_atomic_state *state = c->state;
|
||||
+ struct drm_device *dev = state->dev;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+
|
||||
+ drm_atomic_helper_commit_modeset_disables(dev, state);
|
||||
+
|
||||
+ drm_atomic_helper_commit_planes(dev, state, false);
|
||||
+
|
||||
+ drm_atomic_helper_commit_modeset_enables(dev, state);
|
||||
+
|
||||
+ drm_atomic_helper_wait_for_vblanks(dev, state);
|
||||
+
|
||||
+ drm_atomic_helper_cleanup_planes(dev, state);
|
||||
+
|
||||
+ drm_atomic_state_free(state);
|
||||
+
|
||||
+ up(&vc4->async_modeset);
|
||||
+
|
||||
+ kfree(c);
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+vc4_atomic_complete_commit_seqno_cb(struct vc4_seqno_cb *cb)
|
||||
+{
|
||||
+ struct vc4_commit *c = container_of(cb, struct vc4_commit, cb);
|
||||
+
|
||||
+ vc4_atomic_complete_commit(c);
|
||||
+}
|
||||
+
|
||||
+static struct vc4_commit *commit_init(struct drm_atomic_state *state)
|
||||
+{
|
||||
+ struct vc4_commit *c = kzalloc(sizeof(*c), GFP_KERNEL);
|
||||
+
|
||||
+ if (!c)
|
||||
+ return NULL;
|
||||
+ c->dev = state->dev;
|
||||
+ c->state = state;
|
||||
+
|
||||
+ return c;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
+ * vc4_atomic_commit - commit validated state object
|
||||
+ * @dev: DRM device
|
||||
+ * @state: the driver state object
|
||||
+ * @async: asynchronous commit
|
||||
+ *
|
||||
+ * This function commits a with drm_atomic_helper_check() pre-validated state
|
||||
+ * object. This can still fail when e.g. the framebuffer reservation fails. For
|
||||
+ * now this doesn't implement asynchronous commits.
|
||||
+ *
|
||||
+ * RETURNS
|
||||
+ * Zero for success or -errno.
|
||||
+ */
|
||||
+static int vc4_atomic_commit(struct drm_device *dev,
|
||||
+ struct drm_atomic_state *state,
|
||||
+ bool async)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ int ret;
|
||||
+ int i;
|
||||
+ uint64_t wait_seqno = 0;
|
||||
+ struct vc4_commit *c;
|
||||
+
|
||||
+ c = commit_init(state);
|
||||
+ if (!c)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ /* Make sure that any outstanding modesets have finished. */
|
||||
+ ret = down_interruptible(&vc4->async_modeset);
|
||||
+ if (ret) {
|
||||
+ kfree(c);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ ret = drm_atomic_helper_prepare_planes(dev, state);
|
||||
+ if (ret) {
|
||||
+ kfree(c);
|
||||
+ up(&vc4->async_modeset);
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < dev->mode_config.num_total_plane; i++) {
|
||||
+ struct drm_plane *plane = state->planes[i];
|
||||
+ struct drm_plane_state *new_state = state->plane_states[i];
|
||||
+
|
||||
+ if (!plane)
|
||||
+ continue;
|
||||
+
|
||||
+ if ((plane->state->fb != new_state->fb) && new_state->fb) {
|
||||
+ struct drm_gem_cma_object *cma_bo =
|
||||
+ drm_fb_cma_get_gem_obj(new_state->fb, 0);
|
||||
+ struct vc4_bo *bo = to_vc4_bo(&cma_bo->base);
|
||||
+
|
||||
+ wait_seqno = max(bo->seqno, wait_seqno);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * This is the point of no return - everything below never fails except
|
||||
+ * when the hw goes bonghits. Which means we can commit the new state on
|
||||
+ * the software side now.
|
||||
+ */
|
||||
+
|
||||
+ drm_atomic_helper_swap_state(dev, state);
|
||||
+
|
||||
+ /*
|
||||
+ * Everything below can be run asynchronously without the need to grab
|
||||
+ * any modeset locks at all under one condition: It must be guaranteed
|
||||
+ * that the asynchronous work has either been cancelled (if the driver
|
||||
+ * supports it, which at least requires that the framebuffers get
|
||||
+ * cleaned up with drm_atomic_helper_cleanup_planes()) or completed
|
||||
+ * before the new state gets committed on the software side with
|
||||
+ * drm_atomic_helper_swap_state().
|
||||
+ *
|
||||
+ * This scheme allows new atomic state updates to be prepared and
|
||||
+ * checked in parallel to the asynchronous completion of the previous
|
||||
+ * update. Which is important since compositors need to figure out the
|
||||
+ * composition of the next frame right after having submitted the
|
||||
+ * current layout.
|
||||
+ */
|
||||
+
|
||||
+ if (async) {
|
||||
+ vc4_queue_seqno_cb(dev, &c->cb, wait_seqno,
|
||||
+ vc4_atomic_complete_commit_seqno_cb);
|
||||
+ } else {
|
||||
+ vc4_wait_for_seqno(dev, wait_seqno, ~0ull, false);
|
||||
+ vc4_atomic_complete_commit(c);
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static const struct drm_mode_config_funcs vc4_mode_funcs = {
|
||||
.output_poll_changed = vc4_output_poll_changed,
|
||||
.atomic_check = drm_atomic_helper_check,
|
||||
- .atomic_commit = drm_atomic_helper_commit,
|
||||
+ .atomic_commit = vc4_atomic_commit,
|
||||
.fb_create = drm_fb_cma_create,
|
||||
};
|
||||
|
||||
@@ -41,6 +184,8 @@ int vc4_kms_load(struct drm_device *dev)
|
||||
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
int ret;
|
||||
|
||||
+ sema_init(&vc4->async_modeset, 1);
|
||||
+
|
||||
ret = drm_vblank_init(dev, dev->mode_config.num_crtc);
|
||||
if (ret < 0) {
|
||||
dev_err(dev->dev, "failed to initialize vblank\n");
|
||||
@@ -51,6 +196,8 @@ int vc4_kms_load(struct drm_device *dev)
|
||||
dev->mode_config.max_height = 2048;
|
||||
dev->mode_config.funcs = &vc4_mode_funcs;
|
||||
dev->mode_config.preferred_depth = 24;
|
||||
+ dev->mode_config.async_page_flip = true;
|
||||
+
|
||||
dev->vblank_disable_allowed = true;
|
||||
|
||||
drm_mode_config_reset(dev);
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
index cdd8b10..db32c373 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_plane.c
|
||||
@@ -29,6 +29,14 @@ struct vc4_plane_state {
|
||||
u32 *dlist;
|
||||
u32 dlist_size; /* Number of dwords in allocated for the display list */
|
||||
u32 dlist_count; /* Number of used dwords in the display list. */
|
||||
+
|
||||
+ /* Offset in the dlist to pointer word 0. */
|
||||
+ u32 pw0_offset;
|
||||
+
|
||||
+ /* Offset where the plane's dlist was last stored in the
|
||||
+ hardware at vc4_crtc_atomic_flush() time.
|
||||
+ */
|
||||
+ u32 *hw_dlist;
|
||||
};
|
||||
|
||||
static inline struct vc4_plane_state *
|
||||
@@ -197,6 +205,8 @@ static int vc4_plane_mode_set(struct drm_plane *plane,
|
||||
/* Position Word 3: Context. Written by the HVS. */
|
||||
vc4_dlist_write(vc4_state, 0xc0c0c0c0);
|
||||
|
||||
+ vc4_state->pw0_offset = vc4_state->dlist_count;
|
||||
+
|
||||
/* Pointer Word 0: RGB / Y Pointer */
|
||||
vc4_dlist_write(vc4_state, bo->paddr + offset);
|
||||
|
||||
@@ -248,6 +258,8 @@ u32 vc4_plane_write_dlist(struct drm_plane *plane, u32 __iomem *dlist)
|
||||
struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state);
|
||||
int i;
|
||||
|
||||
+ vc4_state->hw_dlist = dlist;
|
||||
+
|
||||
/* Can't memcpy_toio() because it needs to be 32-bit writes. */
|
||||
for (i = 0; i < vc4_state->dlist_count; i++)
|
||||
writel(vc4_state->dlist[i], &dlist[i]);
|
||||
@@ -262,6 +274,34 @@ u32 vc4_plane_dlist_size(struct drm_plane_state *state)
|
||||
return vc4_state->dlist_count;
|
||||
}
|
||||
|
||||
+/* Updates the plane to immediately (well, once the FIFO needs
|
||||
+ * refilling) scan out from at a new framebuffer.
|
||||
+ */
|
||||
+void vc4_plane_async_set_fb(struct drm_plane *plane, struct drm_framebuffer *fb)
|
||||
+{
|
||||
+ struct vc4_plane_state *vc4_state = to_vc4_plane_state(plane->state);
|
||||
+ struct drm_gem_cma_object *bo = drm_fb_cma_get_gem_obj(fb, 0);
|
||||
+ uint32_t addr;
|
||||
+
|
||||
+ /* We're skipping the address adjustment for negative origin,
|
||||
+ * because this is only called on the primary plane.
|
||||
+ */
|
||||
+ WARN_ON_ONCE(plane->state->crtc_x < 0 || plane->state->crtc_y < 0);
|
||||
+ addr = bo->paddr + fb->offsets[0];
|
||||
+
|
||||
+ /* Write the new address into the hardware immediately. The
|
||||
+ * scanout will start from this address as soon as the FIFO
|
||||
+ * needs to refill with pixels.
|
||||
+ */
|
||||
+ writel(addr, &vc4_state->hw_dlist[vc4_state->pw0_offset]);
|
||||
+
|
||||
+ /* Also update the CPU-side dlist copy, so that any later
|
||||
+ * atomic updates that don't do a new modeset on our plane
|
||||
+ * also use our updated address.
|
||||
+ */
|
||||
+ vc4_state->dlist[vc4_state->pw0_offset] = addr;
|
||||
+}
|
||||
+
|
||||
static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = {
|
||||
.prepare_fb = NULL,
|
||||
.cleanup_fb = NULL,
|
||||
--
|
||||
2.6.4
|
||||
|
||||
+333
@@ -0,0 +1,333 @@
|
||||
From 214613656b5179f0daab6e0a080814b5100d45f0 Mon Sep 17 00:00:00 2001
|
||||
From: Eric Anholt <eric@anholt.net>
|
||||
Date: Fri, 30 Oct 2015 10:09:02 -0700
|
||||
Subject: [PATCH 9/9] drm/vc4: Add an interface for capturing the GPU state
|
||||
after a hang.
|
||||
|
||||
This can be parsed with vc4-gpu-tools tools for trying to figure out
|
||||
what was going on.
|
||||
|
||||
v2: Use __u32-style types.
|
||||
|
||||
Signed-off-by: Eric Anholt <eric@anholt.net>
|
||||
---
|
||||
drivers/gpu/drm/vc4/vc4_drv.c | 2 +
|
||||
drivers/gpu/drm/vc4/vc4_drv.h | 4 +
|
||||
drivers/gpu/drm/vc4/vc4_gem.c | 185 ++++++++++++++++++++++++++++++++++++++++++
|
||||
include/uapi/drm/vc4_drm.h | 45 ++++++++++
|
||||
4 files changed, 236 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
index 2cfee59..97226b6 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.c
|
||||
@@ -80,6 +80,8 @@ static const struct drm_ioctl_desc vc4_drm_ioctls[] = {
|
||||
DRM_IOCTL_DEF_DRV(VC4_CREATE_BO, vc4_create_bo_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(VC4_MMAP_BO, vc4_mmap_bo_ioctl, 0),
|
||||
DRM_IOCTL_DEF_DRV(VC4_CREATE_SHADER_BO, vc4_create_shader_bo_ioctl, 0),
|
||||
+ DRM_IOCTL_DEF_DRV(VC4_GET_HANG_STATE, vc4_get_hang_state_ioctl,
|
||||
+ DRM_ROOT_ONLY),
|
||||
};
|
||||
|
||||
static struct drm_driver vc4_drm_driver = {
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
index f9927d8..080865e 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_drv.h
|
||||
@@ -19,6 +19,8 @@ struct vc4_dev {
|
||||
|
||||
struct drm_fbdev_cma *fbdev;
|
||||
|
||||
+ struct vc4_hang_state *hang_state;
|
||||
+
|
||||
/* The kernel-space BO cache. Tracks buffers that have been
|
||||
* unreferenced by all other users (refcounts of 0!) but not
|
||||
* yet freed, so we can do cheap allocations.
|
||||
@@ -361,6 +363,8 @@ int vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
int vc4_mmap_bo_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv);
|
||||
+int vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
|
||||
+ struct drm_file *file_priv);
|
||||
int vc4_mmap(struct file *filp, struct vm_area_struct *vma);
|
||||
int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
|
||||
void *vc4_prime_vmap(struct drm_gem_object *obj);
|
||||
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c
|
||||
index 5fb0556..39f29e7 100644
|
||||
--- a/drivers/gpu/drm/vc4/vc4_gem.c
|
||||
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
|
||||
@@ -40,6 +40,186 @@ vc4_queue_hangcheck(struct drm_device *dev)
|
||||
round_jiffies_up(jiffies + msecs_to_jiffies(100)));
|
||||
}
|
||||
|
||||
+struct vc4_hang_state {
|
||||
+ struct drm_vc4_get_hang_state user_state;
|
||||
+
|
||||
+ u32 bo_count;
|
||||
+ struct drm_gem_object **bo;
|
||||
+};
|
||||
+
|
||||
+static void
|
||||
+vc4_free_hang_state(struct drm_device *dev, struct vc4_hang_state *state)
|
||||
+{
|
||||
+ unsigned int i;
|
||||
+
|
||||
+ mutex_lock(&dev->struct_mutex);
|
||||
+ for (i = 0; i < state->user_state.bo_count; i++)
|
||||
+ drm_gem_object_unreference(state->bo[i]);
|
||||
+ mutex_unlock(&dev->struct_mutex);
|
||||
+
|
||||
+ kfree(state);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+vc4_get_hang_state_ioctl(struct drm_device *dev, void *data,
|
||||
+ struct drm_file *file_priv)
|
||||
+{
|
||||
+ struct drm_vc4_get_hang_state *get_state = data;
|
||||
+ struct drm_vc4_get_hang_state_bo *bo_state;
|
||||
+ struct vc4_hang_state *kernel_state;
|
||||
+ struct drm_vc4_get_hang_state *state;
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ unsigned long irqflags;
|
||||
+ u32 i;
|
||||
+ int ret;
|
||||
+
|
||||
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
+ kernel_state = vc4->hang_state;
|
||||
+ if (!kernel_state) {
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+ state = &kernel_state->user_state;
|
||||
+
|
||||
+ /* If the user's array isn't big enough, just return the
|
||||
+ * required array size.
|
||||
+ */
|
||||
+ if (get_state->bo_count < state->bo_count) {
|
||||
+ get_state->bo_count = state->bo_count;
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ vc4->hang_state = NULL;
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+
|
||||
+ /* Save the user's BO pointer, so we don't stomp it with the memcpy. */
|
||||
+ state->bo = get_state->bo;
|
||||
+ memcpy(get_state, state, sizeof(*state));
|
||||
+
|
||||
+ bo_state = kcalloc(state->bo_count, sizeof(*bo_state), GFP_KERNEL);
|
||||
+ if (!bo_state) {
|
||||
+ ret = -ENOMEM;
|
||||
+ goto err_free;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < state->bo_count; i++) {
|
||||
+ struct vc4_bo *vc4_bo = to_vc4_bo(kernel_state->bo[i]);
|
||||
+ u32 handle;
|
||||
+
|
||||
+ ret = drm_gem_handle_create(file_priv, kernel_state->bo[i],
|
||||
+ &handle);
|
||||
+
|
||||
+ if (ret) {
|
||||
+ state->bo_count = i - 1;
|
||||
+ goto err;
|
||||
+ }
|
||||
+ bo_state[i].handle = handle;
|
||||
+ bo_state[i].paddr = vc4_bo->base.paddr;
|
||||
+ bo_state[i].size = vc4_bo->base.base.size;
|
||||
+ }
|
||||
+
|
||||
+ ret = copy_to_user((void __user *)(uintptr_t)get_state->bo,
|
||||
+ bo_state,
|
||||
+ state->bo_count * sizeof(*bo_state));
|
||||
+ kfree(bo_state);
|
||||
+
|
||||
+err_free:
|
||||
+
|
||||
+ vc4_free_hang_state(dev, kernel_state);
|
||||
+
|
||||
+err:
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+vc4_save_hang_state(struct drm_device *dev)
|
||||
+{
|
||||
+ struct vc4_dev *vc4 = to_vc4_dev(dev);
|
||||
+ struct drm_vc4_get_hang_state *state;
|
||||
+ struct vc4_hang_state *kernel_state;
|
||||
+ struct vc4_exec_info *exec;
|
||||
+ struct vc4_bo *bo;
|
||||
+ unsigned long irqflags;
|
||||
+ unsigned int i, unref_list_count;
|
||||
+
|
||||
+ kernel_state = kcalloc(1, sizeof(*state), GFP_KERNEL);
|
||||
+ if (!kernel_state)
|
||||
+ return;
|
||||
+
|
||||
+ state = &kernel_state->user_state;
|
||||
+
|
||||
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
+ exec = vc4_first_job(vc4);
|
||||
+ if (!exec) {
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ unref_list_count = 0;
|
||||
+ list_for_each_entry(bo, &exec->unref_list, unref_head)
|
||||
+ unref_list_count++;
|
||||
+
|
||||
+ state->bo_count = exec->bo_count + unref_list_count;
|
||||
+ kernel_state->bo = kcalloc(state->bo_count, sizeof(*kernel_state->bo),
|
||||
+ GFP_ATOMIC);
|
||||
+ if (!kernel_state->bo) {
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ for (i = 0; i < exec->bo_count; i++) {
|
||||
+ drm_gem_object_reference(&exec->bo[i]->base);
|
||||
+ kernel_state->bo[i] = &exec->bo[i]->base;
|
||||
+ }
|
||||
+
|
||||
+ list_for_each_entry(bo, &exec->unref_list, unref_head) {
|
||||
+ drm_gem_object_reference(&bo->base.base);
|
||||
+ kernel_state->bo[i] = &bo->base.base;
|
||||
+ i++;
|
||||
+ }
|
||||
+
|
||||
+ state->start_bin = exec->ct0ca;
|
||||
+ state->start_render = exec->ct1ca;
|
||||
+
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+
|
||||
+ state->ct0ca = V3D_READ(V3D_CTNCA(0));
|
||||
+ state->ct0ea = V3D_READ(V3D_CTNEA(0));
|
||||
+
|
||||
+ state->ct1ca = V3D_READ(V3D_CTNCA(1));
|
||||
+ state->ct1ea = V3D_READ(V3D_CTNEA(1));
|
||||
+
|
||||
+ state->ct0cs = V3D_READ(V3D_CTNCS(0));
|
||||
+ state->ct1cs = V3D_READ(V3D_CTNCS(1));
|
||||
+
|
||||
+ state->ct0ra0 = V3D_READ(V3D_CT00RA0);
|
||||
+ state->ct1ra0 = V3D_READ(V3D_CT01RA0);
|
||||
+
|
||||
+ state->bpca = V3D_READ(V3D_BPCA);
|
||||
+ state->bpcs = V3D_READ(V3D_BPCS);
|
||||
+ state->bpoa = V3D_READ(V3D_BPOA);
|
||||
+ state->bpos = V3D_READ(V3D_BPOS);
|
||||
+
|
||||
+ state->vpmbase = V3D_READ(V3D_VPMBASE);
|
||||
+
|
||||
+ state->dbge = V3D_READ(V3D_DBGE);
|
||||
+ state->fdbgo = V3D_READ(V3D_FDBGO);
|
||||
+ state->fdbgb = V3D_READ(V3D_FDBGB);
|
||||
+ state->fdbgr = V3D_READ(V3D_FDBGR);
|
||||
+ state->fdbgs = V3D_READ(V3D_FDBGS);
|
||||
+ state->errstat = V3D_READ(V3D_ERRSTAT);
|
||||
+
|
||||
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
|
||||
+ if (vc4->hang_state) {
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+ vc4_free_hang_state(dev, kernel_state);
|
||||
+ } else {
|
||||
+ vc4->hang_state = kernel_state;
|
||||
+ spin_unlock_irqrestore(&vc4->job_lock, irqflags);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void
|
||||
vc4_reset(struct drm_device *dev)
|
||||
{
|
||||
@@ -64,6 +244,8 @@ vc4_reset_work(struct work_struct *work)
|
||||
struct vc4_dev *vc4 =
|
||||
container_of(work, struct vc4_dev, hangcheck.reset_work);
|
||||
|
||||
+ vc4_save_hang_state(vc4->dev);
|
||||
+
|
||||
vc4_reset(vc4->dev);
|
||||
}
|
||||
|
||||
@@ -679,4 +861,7 @@ vc4_gem_destroy(struct drm_device *dev)
|
||||
}
|
||||
|
||||
vc4_bo_cache_destroy(dev);
|
||||
+
|
||||
+ if (vc4->hang_state)
|
||||
+ vc4_free_hang_state(dev, vc4->hang_state);
|
||||
}
|
||||
diff --git a/include/uapi/drm/vc4_drm.h b/include/uapi/drm/vc4_drm.h
|
||||
index fe4161b..eeb37e3 100644
|
||||
--- a/include/uapi/drm/vc4_drm.h
|
||||
+++ b/include/uapi/drm/vc4_drm.h
|
||||
@@ -32,6 +32,7 @@
|
||||
#define DRM_VC4_CREATE_BO 0x03
|
||||
#define DRM_VC4_MMAP_BO 0x04
|
||||
#define DRM_VC4_CREATE_SHADER_BO 0x05
|
||||
+#define DRM_VC4_GET_HANG_STATE 0x06
|
||||
|
||||
#define DRM_IOCTL_VC4_SUBMIT_CL DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SUBMIT_CL, struct drm_vc4_submit_cl)
|
||||
#define DRM_IOCTL_VC4_WAIT_SEQNO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_WAIT_SEQNO, struct drm_vc4_wait_seqno)
|
||||
@@ -39,6 +40,7 @@
|
||||
#define DRM_IOCTL_VC4_CREATE_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_BO, struct drm_vc4_create_bo)
|
||||
#define DRM_IOCTL_VC4_MMAP_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_MMAP_BO, struct drm_vc4_mmap_bo)
|
||||
#define DRM_IOCTL_VC4_CREATE_SHADER_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_CREATE_SHADER_BO, struct drm_vc4_create_shader_bo)
|
||||
+#define DRM_IOCTL_VC4_GET_HANG_STATE DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_HANG_STATE, struct drm_vc4_get_hang_state)
|
||||
|
||||
struct drm_vc4_submit_rcl_surface {
|
||||
__u32 hindex; /* Handle index, or ~0 if not present. */
|
||||
@@ -231,4 +233,47 @@ struct drm_vc4_create_shader_bo {
|
||||
__u32 pad;
|
||||
};
|
||||
|
||||
+struct drm_vc4_get_hang_state_bo {
|
||||
+ __u32 handle;
|
||||
+ __u32 paddr;
|
||||
+ __u32 size;
|
||||
+ __u32 pad;
|
||||
+};
|
||||
+
|
||||
+/**
|
||||
+ * struct drm_vc4_hang_state - ioctl argument for collecting state
|
||||
+ * from a GPU hang for analysis.
|
||||
+*/
|
||||
+struct drm_vc4_get_hang_state {
|
||||
+ /** Pointer to array of struct drm_vc4_get_hang_state_bo. */
|
||||
+ __u64 bo;
|
||||
+ /**
|
||||
+ * On input, the size of the bo array. Output is the number
|
||||
+ * of bos to be returned.
|
||||
+ */
|
||||
+ __u32 bo_count;
|
||||
+
|
||||
+ __u32 start_bin, start_render;
|
||||
+
|
||||
+ __u32 ct0ca, ct0ea;
|
||||
+ __u32 ct1ca, ct1ea;
|
||||
+ __u32 ct0cs, ct1cs;
|
||||
+ __u32 ct0ra0, ct1ra0;
|
||||
+
|
||||
+ __u32 bpca, bpcs;
|
||||
+ __u32 bpoa, bpos;
|
||||
+
|
||||
+ __u32 vpmbase;
|
||||
+
|
||||
+ __u32 dbge;
|
||||
+ __u32 fdbgo;
|
||||
+ __u32 fdbgb;
|
||||
+ __u32 fdbgr;
|
||||
+ __u32 fdbgs;
|
||||
+ __u32 errstat;
|
||||
+
|
||||
+ /* Pad that we may save more registers into in the future. */
|
||||
+ __u32 pad[16];
|
||||
+};
|
||||
+
|
||||
#endif /* _UAPI_VC4_DRM_H_ */
|
||||
--
|
||||
2.6.4
|
||||
|
||||
-163
@@ -1,163 +0,0 @@
|
||||
From a0af2e538c80f3e47f1d6ddf120a153ad909e8ad Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Hellstrom <thellstrom@vmware.com>
|
||||
Date: Wed, 2 Dec 2015 09:24:46 -0800
|
||||
Subject: drm: Fix an unwanted master inheritance v2
|
||||
|
||||
A client calling drmSetMaster() using a file descriptor that was opened
|
||||
when another client was master would inherit the latter client's master
|
||||
object and all its authenticated clients.
|
||||
|
||||
This is unwanted behaviour, and when this happens, instead allocate a
|
||||
brand new master object for the client calling drmSetMaster().
|
||||
|
||||
Fixes a BUG() throw in vmw_master_set().
|
||||
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
|
||||
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||||
|
||||
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
|
||||
index 9362609..7dd6728 100644
|
||||
--- a/drivers/gpu/drm/drm_drv.c
|
||||
+++ b/drivers/gpu/drm/drm_drv.c
|
||||
@@ -160,6 +160,11 @@ int drm_setmaster_ioctl(struct drm_device *dev, void *data,
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
+ if (!file_priv->allowed_master) {
|
||||
+ ret = drm_new_set_master(dev, file_priv);
|
||||
+ goto out_unlock;
|
||||
+ }
|
||||
+
|
||||
file_priv->minor->master = drm_master_get(file_priv->master);
|
||||
file_priv->is_master = 1;
|
||||
if (dev->driver->master_set) {
|
||||
diff --git a/drivers/gpu/drm/drm_fops.c b/drivers/gpu/drm/drm_fops.c
|
||||
index c59ce4d..6b5625e 100644
|
||||
--- a/drivers/gpu/drm/drm_fops.c
|
||||
+++ b/drivers/gpu/drm/drm_fops.c
|
||||
@@ -126,6 +126,60 @@ static int drm_cpu_valid(void)
|
||||
}
|
||||
|
||||
/**
|
||||
+ * drm_new_set_master - Allocate a new master object and become master for the
|
||||
+ * associated master realm.
|
||||
+ *
|
||||
+ * @dev: The associated device.
|
||||
+ * @fpriv: File private identifying the client.
|
||||
+ *
|
||||
+ * This function must be called with dev::struct_mutex held.
|
||||
+ * Returns negative error code on failure. Zero on success.
|
||||
+ */
|
||||
+int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv)
|
||||
+{
|
||||
+ struct drm_master *old_master;
|
||||
+ int ret;
|
||||
+
|
||||
+ lockdep_assert_held_once(&dev->master_mutex);
|
||||
+
|
||||
+ /* create a new master */
|
||||
+ fpriv->minor->master = drm_master_create(fpriv->minor);
|
||||
+ if (!fpriv->minor->master)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ /* take another reference for the copy in the local file priv */
|
||||
+ old_master = fpriv->master;
|
||||
+ fpriv->master = drm_master_get(fpriv->minor->master);
|
||||
+
|
||||
+ if (dev->driver->master_create) {
|
||||
+ ret = dev->driver->master_create(dev, fpriv->master);
|
||||
+ if (ret)
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+ if (dev->driver->master_set) {
|
||||
+ ret = dev->driver->master_set(dev, fpriv, true);
|
||||
+ if (ret)
|
||||
+ goto out_err;
|
||||
+ }
|
||||
+
|
||||
+ fpriv->is_master = 1;
|
||||
+ fpriv->allowed_master = 1;
|
||||
+ fpriv->authenticated = 1;
|
||||
+ if (old_master)
|
||||
+ drm_master_put(&old_master);
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+out_err:
|
||||
+ /* drop both references and restore old master on failure */
|
||||
+ drm_master_put(&fpriv->minor->master);
|
||||
+ drm_master_put(&fpriv->master);
|
||||
+ fpriv->master = old_master;
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/**
|
||||
* Called whenever a process opens /dev/drm.
|
||||
*
|
||||
* \param filp file pointer.
|
||||
@@ -189,35 +243,9 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
|
||||
mutex_lock(&dev->master_mutex);
|
||||
if (drm_is_primary_client(priv) && !priv->minor->master) {
|
||||
/* create a new master */
|
||||
- priv->minor->master = drm_master_create(priv->minor);
|
||||
- if (!priv->minor->master) {
|
||||
- ret = -ENOMEM;
|
||||
+ ret = drm_new_set_master(dev, priv);
|
||||
+ if (ret)
|
||||
goto out_close;
|
||||
- }
|
||||
-
|
||||
- priv->is_master = 1;
|
||||
- /* take another reference for the copy in the local file priv */
|
||||
- priv->master = drm_master_get(priv->minor->master);
|
||||
- priv->authenticated = 1;
|
||||
-
|
||||
- if (dev->driver->master_create) {
|
||||
- ret = dev->driver->master_create(dev, priv->master);
|
||||
- if (ret) {
|
||||
- /* drop both references if this fails */
|
||||
- drm_master_put(&priv->minor->master);
|
||||
- drm_master_put(&priv->master);
|
||||
- goto out_close;
|
||||
- }
|
||||
- }
|
||||
- if (dev->driver->master_set) {
|
||||
- ret = dev->driver->master_set(dev, priv, true);
|
||||
- if (ret) {
|
||||
- /* drop both references if this fails */
|
||||
- drm_master_put(&priv->minor->master);
|
||||
- drm_master_put(&priv->master);
|
||||
- goto out_close;
|
||||
- }
|
||||
- }
|
||||
} else if (drm_is_primary_client(priv)) {
|
||||
/* get a reference to the master */
|
||||
priv->master = drm_master_get(priv->minor->master);
|
||||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
|
||||
index 0b921ae..441b26e 100644
|
||||
--- a/include/drm/drmP.h
|
||||
+++ b/include/drm/drmP.h
|
||||
@@ -309,6 +309,11 @@ struct drm_file {
|
||||
unsigned universal_planes:1;
|
||||
/* true if client understands atomic properties */
|
||||
unsigned atomic:1;
|
||||
+ /*
|
||||
+ * This client is allowed to gain master privileges for @master.
|
||||
+ * Protected by struct drm_device::master_mutex.
|
||||
+ */
|
||||
+ unsigned allowed_master:1;
|
||||
|
||||
struct pid *pid;
|
||||
kuid_t uid;
|
||||
@@ -910,6 +915,7 @@ extern int drm_open(struct inode *inode, struct file *filp);
|
||||
extern ssize_t drm_read(struct file *filp, char __user *buffer,
|
||||
size_t count, loff_t *offset);
|
||||
extern int drm_release(struct inode *inode, struct file *filp);
|
||||
+extern int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv);
|
||||
|
||||
/* Mapping support (drm_vm.h) */
|
||||
extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
|
||||
--
|
||||
cgit v0.10.2
|
||||
-31
@@ -1,31 +0,0 @@
|
||||
From c255cb2ed3c7960b2c68f45de1dc0ac2197c8f78 Mon Sep 17 00:00:00 2001
|
||||
From: Anthony Lineham <anthony.lineham@alliedtelesis.co.nz>
|
||||
Date: Thu, 22 Oct 2015 11:17:03 +1300
|
||||
Subject: netfilter: Fix removal of GRE expectation entries created by PPTP
|
||||
|
||||
The uninitialized tuple structure caused incorrect hash calculation
|
||||
and the lookup failed.
|
||||
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=106441
|
||||
Signed-off-by: Anthony Lineham <anthony.lineham@alliedtelesis.co.nz>
|
||||
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
|
||||
---
|
||||
net/ipv4/netfilter/nf_nat_pptp.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/ipv4/netfilter/nf_nat_pptp.c b/net/ipv4/netfilter/nf_nat_pptp.c
|
||||
index 657d230..b3ca21b 100644
|
||||
--- a/net/ipv4/netfilter/nf_nat_pptp.c
|
||||
+++ b/net/ipv4/netfilter/nf_nat_pptp.c
|
||||
@@ -45,7 +45,7 @@ static void pptp_nat_expected(struct nf_conn *ct,
|
||||
struct net *net = nf_ct_net(ct);
|
||||
const struct nf_conn *master = ct->master;
|
||||
struct nf_conntrack_expect *other_exp;
|
||||
- struct nf_conntrack_tuple t;
|
||||
+ struct nf_conntrack_tuple t = {};
|
||||
const struct nf_ct_pptp_master *ct_pptp_info;
|
||||
const struct nf_nat_pptp *nat_pptp_info;
|
||||
struct nf_nat_range range;
|
||||
--
|
||||
cgit v0.11.2
|
||||
|
||||
@@ -1,481 +0,0 @@
|
||||
From 95ad1f4a9358dff1dcf84bf5c9cc84caa9215f7f Mon Sep 17 00:00:00 2001
|
||||
From: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
Date: Sat, 7 Nov 2015 11:21:47 +0100
|
||||
Subject: netfilter: ipset: Fix extension alignment
|
||||
|
||||
The data extensions in ipset lacked the proper memory alignment and
|
||||
thus could lead to kernel crash on several architectures. Therefore
|
||||
the structures have been reorganized and alignment attributes added
|
||||
where needed. The patch was tested on armv7h by Gerhard Wiesinger and
|
||||
on x86_64, sparc64 by Jozsef Kadlecsik.
|
||||
|
||||
Reported-by: Gerhard Wiesinger <lists@wiesinger.com>
|
||||
Tested-by: Gerhard Wiesinger <lists@wiesinger.com>
|
||||
Tested-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
---
|
||||
include/linux/netfilter/ipset/ip_set.h | 2 +-
|
||||
net/netfilter/ipset/ip_set_bitmap_gen.h | 17 +++-----
|
||||
net/netfilter/ipset/ip_set_bitmap_ip.c | 14 ++-----
|
||||
net/netfilter/ipset/ip_set_bitmap_ipmac.c | 64 ++++++++++++++-----------------
|
||||
net/netfilter/ipset/ip_set_bitmap_port.c | 18 ++++-----
|
||||
net/netfilter/ipset/ip_set_core.c | 14 ++++---
|
||||
net/netfilter/ipset/ip_set_hash_gen.h | 11 ++++--
|
||||
net/netfilter/ipset/ip_set_list_set.c | 5 ++-
|
||||
8 files changed, 65 insertions(+), 80 deletions(-)
|
||||
|
||||
diff --git a/include/linux/netfilter/ipset/ip_set.h b/include/linux/netfilter/ipset/ip_set.h
|
||||
index 48bb01e..0e1f433 100644
|
||||
--- a/include/linux/netfilter/ipset/ip_set.h
|
||||
+++ b/include/linux/netfilter/ipset/ip_set.h
|
||||
@@ -421,7 +421,7 @@ extern void ip_set_free(void *members);
|
||||
extern int ip_set_get_ipaddr4(struct nlattr *nla, __be32 *ipaddr);
|
||||
extern int ip_set_get_ipaddr6(struct nlattr *nla, union nf_inet_addr *ipaddr);
|
||||
extern size_t ip_set_elem_len(struct ip_set *set, struct nlattr *tb[],
|
||||
- size_t len);
|
||||
+ size_t len, size_t align);
|
||||
extern int ip_set_get_extensions(struct ip_set *set, struct nlattr *tb[],
|
||||
struct ip_set_ext *ext);
|
||||
|
||||
diff --git a/net/netfilter/ipset/ip_set_bitmap_gen.h b/net/netfilter/ipset/ip_set_bitmap_gen.h
|
||||
index d05e759..b0bc475 100644
|
||||
--- a/net/netfilter/ipset/ip_set_bitmap_gen.h
|
||||
+++ b/net/netfilter/ipset/ip_set_bitmap_gen.h
|
||||
@@ -33,7 +33,7 @@
|
||||
#define mtype_gc IPSET_TOKEN(MTYPE, _gc)
|
||||
#define mtype MTYPE
|
||||
|
||||
-#define get_ext(set, map, id) ((map)->extensions + (set)->dsize * (id))
|
||||
+#define get_ext(set, map, id) ((map)->extensions + ((set)->dsize * (id)))
|
||||
|
||||
static void
|
||||
mtype_gc_init(struct ip_set *set, void (*gc)(unsigned long ul_set))
|
||||
@@ -67,12 +67,9 @@ mtype_destroy(struct ip_set *set)
|
||||
del_timer_sync(&map->gc);
|
||||
|
||||
ip_set_free(map->members);
|
||||
- if (set->dsize) {
|
||||
- if (set->extensions & IPSET_EXT_DESTROY)
|
||||
- mtype_ext_cleanup(set);
|
||||
- ip_set_free(map->extensions);
|
||||
- }
|
||||
- kfree(map);
|
||||
+ if (set->dsize && set->extensions & IPSET_EXT_DESTROY)
|
||||
+ mtype_ext_cleanup(set);
|
||||
+ ip_set_free(map);
|
||||
|
||||
set->data = NULL;
|
||||
}
|
||||
@@ -92,16 +89,14 @@ mtype_head(struct ip_set *set, struct sk_buff *skb)
|
||||
{
|
||||
const struct mtype *map = set->data;
|
||||
struct nlattr *nested;
|
||||
+ size_t memsize = sizeof(*map) + map->memsize;
|
||||
|
||||
nested = ipset_nest_start(skb, IPSET_ATTR_DATA);
|
||||
if (!nested)
|
||||
goto nla_put_failure;
|
||||
if (mtype_do_head(skb, map) ||
|
||||
nla_put_net32(skb, IPSET_ATTR_REFERENCES, htonl(set->ref - 1)) ||
|
||||
- nla_put_net32(skb, IPSET_ATTR_MEMSIZE,
|
||||
- htonl(sizeof(*map) +
|
||||
- map->memsize +
|
||||
- set->dsize * map->elements)))
|
||||
+ nla_put_net32(skb, IPSET_ATTR_MEMSIZE, htonl(memsize)))
|
||||
goto nla_put_failure;
|
||||
if (unlikely(ip_set_put_flags(skb, set)))
|
||||
goto nla_put_failure;
|
||||
diff --git a/net/netfilter/ipset/ip_set_bitmap_ip.c b/net/netfilter/ipset/ip_set_bitmap_ip.c
|
||||
index 64a5643..4783eff 100644
|
||||
--- a/net/netfilter/ipset/ip_set_bitmap_ip.c
|
||||
+++ b/net/netfilter/ipset/ip_set_bitmap_ip.c
|
||||
@@ -41,7 +41,6 @@ MODULE_ALIAS("ip_set_bitmap:ip");
|
||||
/* Type structure */
|
||||
struct bitmap_ip {
|
||||
void *members; /* the set members */
|
||||
- void *extensions; /* data extensions */
|
||||
u32 first_ip; /* host byte order, included in range */
|
||||
u32 last_ip; /* host byte order, included in range */
|
||||
u32 elements; /* number of max elements in the set */
|
||||
@@ -49,6 +48,8 @@ struct bitmap_ip {
|
||||
size_t memsize; /* members size */
|
||||
u8 netmask; /* subnet netmask */
|
||||
struct timer_list gc; /* garbage collection */
|
||||
+ unsigned char extensions[0] /* data extensions */
|
||||
+ __aligned(__alignof__(u64));
|
||||
};
|
||||
|
||||
/* ADT structure for generic function args */
|
||||
@@ -224,13 +225,6 @@ init_map_ip(struct ip_set *set, struct bitmap_ip *map,
|
||||
map->members = ip_set_alloc(map->memsize);
|
||||
if (!map->members)
|
||||
return false;
|
||||
- if (set->dsize) {
|
||||
- map->extensions = ip_set_alloc(set->dsize * elements);
|
||||
- if (!map->extensions) {
|
||||
- kfree(map->members);
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
map->first_ip = first_ip;
|
||||
map->last_ip = last_ip;
|
||||
map->elements = elements;
|
||||
@@ -316,13 +310,13 @@ bitmap_ip_create(struct net *net, struct ip_set *set, struct nlattr *tb[],
|
||||
pr_debug("hosts %u, elements %llu\n",
|
||||
hosts, (unsigned long long)elements);
|
||||
|
||||
- map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
+ set->dsize = ip_set_elem_len(set, tb, 0, 0);
|
||||
+ map = ip_set_alloc(sizeof(*map) + elements * set->dsize);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
|
||||
map->memsize = bitmap_bytes(0, elements - 1);
|
||||
set->variant = &bitmap_ip;
|
||||
- set->dsize = ip_set_elem_len(set, tb, 0);
|
||||
if (!init_map_ip(set, map, first_ip, last_ip,
|
||||
elements, hosts, netmask)) {
|
||||
kfree(map);
|
||||
diff --git a/net/netfilter/ipset/ip_set_bitmap_ipmac.c b/net/netfilter/ipset/ip_set_bitmap_ipmac.c
|
||||
index 1430535..29dde20 100644
|
||||
--- a/net/netfilter/ipset/ip_set_bitmap_ipmac.c
|
||||
+++ b/net/netfilter/ipset/ip_set_bitmap_ipmac.c
|
||||
@@ -47,24 +47,26 @@ enum {
|
||||
/* Type structure */
|
||||
struct bitmap_ipmac {
|
||||
void *members; /* the set members */
|
||||
- void *extensions; /* MAC + data extensions */
|
||||
u32 first_ip; /* host byte order, included in range */
|
||||
u32 last_ip; /* host byte order, included in range */
|
||||
u32 elements; /* number of max elements in the set */
|
||||
size_t memsize; /* members size */
|
||||
struct timer_list gc; /* garbage collector */
|
||||
+ unsigned char extensions[0] /* MAC + data extensions */
|
||||
+ __aligned(__alignof__(u64));
|
||||
};
|
||||
|
||||
/* ADT structure for generic function args */
|
||||
struct bitmap_ipmac_adt_elem {
|
||||
+ unsigned char ether[ETH_ALEN] __aligned(2);
|
||||
u16 id;
|
||||
- unsigned char *ether;
|
||||
+ u16 add_mac;
|
||||
};
|
||||
|
||||
struct bitmap_ipmac_elem {
|
||||
unsigned char ether[ETH_ALEN];
|
||||
unsigned char filled;
|
||||
-} __attribute__ ((aligned));
|
||||
+} __aligned(__alignof__(u64));
|
||||
|
||||
static inline u32
|
||||
ip_to_id(const struct bitmap_ipmac *m, u32 ip)
|
||||
@@ -72,11 +74,11 @@ ip_to_id(const struct bitmap_ipmac *m, u32 ip)
|
||||
return ip - m->first_ip;
|
||||
}
|
||||
|
||||
-static inline struct bitmap_ipmac_elem *
|
||||
-get_elem(void *extensions, u16 id, size_t dsize)
|
||||
-{
|
||||
- return (struct bitmap_ipmac_elem *)(extensions + id * dsize);
|
||||
-}
|
||||
+#define get_elem(extensions, id, dsize) \
|
||||
+ (struct bitmap_ipmac_elem *)(extensions + (id) * (dsize))
|
||||
+
|
||||
+#define get_const_elem(extensions, id, dsize) \
|
||||
+ (const struct bitmap_ipmac_elem *)(extensions + (id) * (dsize))
|
||||
|
||||
/* Common functions */
|
||||
|
||||
@@ -88,10 +90,9 @@ bitmap_ipmac_do_test(const struct bitmap_ipmac_adt_elem *e,
|
||||
|
||||
if (!test_bit(e->id, map->members))
|
||||
return 0;
|
||||
- elem = get_elem(map->extensions, e->id, dsize);
|
||||
- if (elem->filled == MAC_FILLED)
|
||||
- return !e->ether ||
|
||||
- ether_addr_equal(e->ether, elem->ether);
|
||||
+ elem = get_const_elem(map->extensions, e->id, dsize);
|
||||
+ if (e->add_mac && elem->filled == MAC_FILLED)
|
||||
+ return ether_addr_equal(e->ether, elem->ether);
|
||||
/* Trigger kernel to fill out the ethernet address */
|
||||
return -EAGAIN;
|
||||
}
|
||||
@@ -103,7 +104,7 @@ bitmap_ipmac_gc_test(u16 id, const struct bitmap_ipmac *map, size_t dsize)
|
||||
|
||||
if (!test_bit(id, map->members))
|
||||
return 0;
|
||||
- elem = get_elem(map->extensions, id, dsize);
|
||||
+ elem = get_const_elem(map->extensions, id, dsize);
|
||||
/* Timer not started for the incomplete elements */
|
||||
return elem->filled == MAC_FILLED;
|
||||
}
|
||||
@@ -133,7 +134,7 @@ bitmap_ipmac_add_timeout(unsigned long *timeout,
|
||||
* and we can reuse it later when MAC is filled out,
|
||||
* possibly by the kernel
|
||||
*/
|
||||
- if (e->ether)
|
||||
+ if (e->add_mac)
|
||||
ip_set_timeout_set(timeout, t);
|
||||
else
|
||||
*timeout = t;
|
||||
@@ -150,7 +151,7 @@ bitmap_ipmac_do_add(const struct bitmap_ipmac_adt_elem *e,
|
||||
elem = get_elem(map->extensions, e->id, dsize);
|
||||
if (test_bit(e->id, map->members)) {
|
||||
if (elem->filled == MAC_FILLED) {
|
||||
- if (e->ether &&
|
||||
+ if (e->add_mac &&
|
||||
(flags & IPSET_FLAG_EXIST) &&
|
||||
!ether_addr_equal(e->ether, elem->ether)) {
|
||||
/* memcpy isn't atomic */
|
||||
@@ -159,7 +160,7 @@ bitmap_ipmac_do_add(const struct bitmap_ipmac_adt_elem *e,
|
||||
ether_addr_copy(elem->ether, e->ether);
|
||||
}
|
||||
return IPSET_ADD_FAILED;
|
||||
- } else if (!e->ether)
|
||||
+ } else if (!e->add_mac)
|
||||
/* Already added without ethernet address */
|
||||
return IPSET_ADD_FAILED;
|
||||
/* Fill the MAC address and trigger the timer activation */
|
||||
@@ -168,7 +169,7 @@ bitmap_ipmac_do_add(const struct bitmap_ipmac_adt_elem *e,
|
||||
ether_addr_copy(elem->ether, e->ether);
|
||||
elem->filled = MAC_FILLED;
|
||||
return IPSET_ADD_START_STORED_TIMEOUT;
|
||||
- } else if (e->ether) {
|
||||
+ } else if (e->add_mac) {
|
||||
/* We can store MAC too */
|
||||
ether_addr_copy(elem->ether, e->ether);
|
||||
elem->filled = MAC_FILLED;
|
||||
@@ -191,7 +192,7 @@ bitmap_ipmac_do_list(struct sk_buff *skb, const struct bitmap_ipmac *map,
|
||||
u32 id, size_t dsize)
|
||||
{
|
||||
const struct bitmap_ipmac_elem *elem =
|
||||
- get_elem(map->extensions, id, dsize);
|
||||
+ get_const_elem(map->extensions, id, dsize);
|
||||
|
||||
return nla_put_ipaddr4(skb, IPSET_ATTR_IP,
|
||||
htonl(map->first_ip + id)) ||
|
||||
@@ -213,7 +214,7 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,
|
||||
{
|
||||
struct bitmap_ipmac *map = set->data;
|
||||
ipset_adtfn adtfn = set->variant->adt[adt];
|
||||
- struct bitmap_ipmac_adt_elem e = { .id = 0 };
|
||||
+ struct bitmap_ipmac_adt_elem e = { .id = 0, .add_mac = 1 };
|
||||
struct ip_set_ext ext = IP_SET_INIT_KEXT(skb, opt, set);
|
||||
u32 ip;
|
||||
|
||||
@@ -231,7 +232,7 @@ bitmap_ipmac_kadt(struct ip_set *set, const struct sk_buff *skb,
|
||||
return -EINVAL;
|
||||
|
||||
e.id = ip_to_id(map, ip);
|
||||
- e.ether = eth_hdr(skb)->h_source;
|
||||
+ memcpy(e.ether, eth_hdr(skb)->h_source, ETH_ALEN);
|
||||
|
||||
return adtfn(set, &e, &ext, &opt->ext, opt->cmdflags);
|
||||
}
|
||||
@@ -265,11 +266,10 @@ bitmap_ipmac_uadt(struct ip_set *set, struct nlattr *tb[],
|
||||
return -IPSET_ERR_BITMAP_RANGE;
|
||||
|
||||
e.id = ip_to_id(map, ip);
|
||||
- if (tb[IPSET_ATTR_ETHER])
|
||||
- e.ether = nla_data(tb[IPSET_ATTR_ETHER]);
|
||||
- else
|
||||
- e.ether = NULL;
|
||||
-
|
||||
+ if (tb[IPSET_ATTR_ETHER]) {
|
||||
+ memcpy(e.ether, nla_data(tb[IPSET_ATTR_ETHER]), ETH_ALEN);
|
||||
+ e.add_mac = 1;
|
||||
+ }
|
||||
ret = adtfn(set, &e, &ext, &ext, flags);
|
||||
|
||||
return ip_set_eexist(ret, flags) ? 0 : ret;
|
||||
@@ -300,13 +300,6 @@ init_map_ipmac(struct ip_set *set, struct bitmap_ipmac *map,
|
||||
map->members = ip_set_alloc(map->memsize);
|
||||
if (!map->members)
|
||||
return false;
|
||||
- if (set->dsize) {
|
||||
- map->extensions = ip_set_alloc(set->dsize * elements);
|
||||
- if (!map->extensions) {
|
||||
- kfree(map->members);
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
map->first_ip = first_ip;
|
||||
map->last_ip = last_ip;
|
||||
map->elements = elements;
|
||||
@@ -361,14 +354,15 @@ bitmap_ipmac_create(struct net *net, struct ip_set *set, struct nlattr *tb[],
|
||||
if (elements > IPSET_BITMAP_MAX_RANGE + 1)
|
||||
return -IPSET_ERR_BITMAP_RANGE_SIZE;
|
||||
|
||||
- map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
+ set->dsize = ip_set_elem_len(set, tb,
|
||||
+ sizeof(struct bitmap_ipmac_elem),
|
||||
+ __alignof__(struct bitmap_ipmac_elem));
|
||||
+ map = ip_set_alloc(sizeof(*map) + elements * set->dsize);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
|
||||
map->memsize = bitmap_bytes(0, elements - 1);
|
||||
set->variant = &bitmap_ipmac;
|
||||
- set->dsize = ip_set_elem_len(set, tb,
|
||||
- sizeof(struct bitmap_ipmac_elem));
|
||||
if (!init_map_ipmac(set, map, first_ip, last_ip, elements)) {
|
||||
kfree(map);
|
||||
return -ENOMEM;
|
||||
diff --git a/net/netfilter/ipset/ip_set_bitmap_port.c b/net/netfilter/ipset/ip_set_bitmap_port.c
|
||||
index 5338ccd..7f0c733 100644
|
||||
--- a/net/netfilter/ipset/ip_set_bitmap_port.c
|
||||
+++ b/net/netfilter/ipset/ip_set_bitmap_port.c
|
||||
@@ -35,12 +35,13 @@ MODULE_ALIAS("ip_set_bitmap:port");
|
||||
/* Type structure */
|
||||
struct bitmap_port {
|
||||
void *members; /* the set members */
|
||||
- void *extensions; /* data extensions */
|
||||
u16 first_port; /* host byte order, included in range */
|
||||
u16 last_port; /* host byte order, included in range */
|
||||
u32 elements; /* number of max elements in the set */
|
||||
size_t memsize; /* members size */
|
||||
struct timer_list gc; /* garbage collection */
|
||||
+ unsigned char extensions[0] /* data extensions */
|
||||
+ __aligned(__alignof__(u64));
|
||||
};
|
||||
|
||||
/* ADT structure for generic function args */
|
||||
@@ -209,13 +210,6 @@ init_map_port(struct ip_set *set, struct bitmap_port *map,
|
||||
map->members = ip_set_alloc(map->memsize);
|
||||
if (!map->members)
|
||||
return false;
|
||||
- if (set->dsize) {
|
||||
- map->extensions = ip_set_alloc(set->dsize * map->elements);
|
||||
- if (!map->extensions) {
|
||||
- kfree(map->members);
|
||||
- return false;
|
||||
- }
|
||||
- }
|
||||
map->first_port = first_port;
|
||||
map->last_port = last_port;
|
||||
set->timeout = IPSET_NO_TIMEOUT;
|
||||
@@ -232,6 +226,7 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[],
|
||||
{
|
||||
struct bitmap_port *map;
|
||||
u16 first_port, last_port;
|
||||
+ u32 elements;
|
||||
|
||||
if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_PORT) ||
|
||||
!ip_set_attr_netorder(tb, IPSET_ATTR_PORT_TO) ||
|
||||
@@ -248,14 +243,15 @@ bitmap_port_create(struct net *net, struct ip_set *set, struct nlattr *tb[],
|
||||
last_port = tmp;
|
||||
}
|
||||
|
||||
- map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
+ elements = last_port - first_port + 1;
|
||||
+ set->dsize = ip_set_elem_len(set, tb, 0, 0);
|
||||
+ map = ip_set_alloc(sizeof(*map) + elements * set->dsize);
|
||||
if (!map)
|
||||
return -ENOMEM;
|
||||
|
||||
- map->elements = last_port - first_port + 1;
|
||||
+ map->elements = elements;
|
||||
map->memsize = bitmap_bytes(0, map->elements);
|
||||
set->variant = &bitmap_port;
|
||||
- set->dsize = ip_set_elem_len(set, tb, 0);
|
||||
if (!init_map_port(set, map, first_port, last_port)) {
|
||||
kfree(map);
|
||||
return -ENOMEM;
|
||||
diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c
|
||||
index 69ab9c26..54f3d7c 100644
|
||||
--- a/net/netfilter/ipset/ip_set_core.c
|
||||
+++ b/net/netfilter/ipset/ip_set_core.c
|
||||
@@ -364,25 +364,27 @@ add_extension(enum ip_set_ext_id id, u32 flags, struct nlattr *tb[])
|
||||
}
|
||||
|
||||
size_t
|
||||
-ip_set_elem_len(struct ip_set *set, struct nlattr *tb[], size_t len)
|
||||
+ip_set_elem_len(struct ip_set *set, struct nlattr *tb[], size_t len,
|
||||
+ size_t align)
|
||||
{
|
||||
enum ip_set_ext_id id;
|
||||
- size_t offset = len;
|
||||
u32 cadt_flags = 0;
|
||||
|
||||
if (tb[IPSET_ATTR_CADT_FLAGS])
|
||||
cadt_flags = ip_set_get_h32(tb[IPSET_ATTR_CADT_FLAGS]);
|
||||
if (cadt_flags & IPSET_FLAG_WITH_FORCEADD)
|
||||
set->flags |= IPSET_CREATE_FLAG_FORCEADD;
|
||||
+ if (!align)
|
||||
+ align = 1;
|
||||
for (id = 0; id < IPSET_EXT_ID_MAX; id++) {
|
||||
if (!add_extension(id, cadt_flags, tb))
|
||||
continue;
|
||||
- offset = ALIGN(offset, ip_set_extensions[id].align);
|
||||
- set->offset[id] = offset;
|
||||
+ len = ALIGN(len, ip_set_extensions[id].align);
|
||||
+ set->offset[id] = len;
|
||||
set->extensions |= ip_set_extensions[id].type;
|
||||
- offset += ip_set_extensions[id].len;
|
||||
+ len += ip_set_extensions[id].len;
|
||||
}
|
||||
- return offset;
|
||||
+ return ALIGN(len, align);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ip_set_elem_len);
|
||||
|
||||
diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
index 691b54f..4ff2219 100644
|
||||
--- a/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
@@ -72,8 +72,9 @@ struct hbucket {
|
||||
DECLARE_BITMAP(used, AHASH_MAX_TUNED);
|
||||
u8 size; /* size of the array */
|
||||
u8 pos; /* position of the first free entry */
|
||||
- unsigned char value[0]; /* the array of the values */
|
||||
-} __attribute__ ((aligned));
|
||||
+ unsigned char value[0] /* the array of the values */
|
||||
+ __aligned(__alignof__(u64));
|
||||
+};
|
||||
|
||||
/* The hash table: the table size stored here in order to make resizing easy */
|
||||
struct htable {
|
||||
@@ -1323,12 +1324,14 @@ IPSET_TOKEN(HTYPE, _create)(struct net *net, struct ip_set *set,
|
||||
#endif
|
||||
set->variant = &IPSET_TOKEN(HTYPE, 4_variant);
|
||||
set->dsize = ip_set_elem_len(set, tb,
|
||||
- sizeof(struct IPSET_TOKEN(HTYPE, 4_elem)));
|
||||
+ sizeof(struct IPSET_TOKEN(HTYPE, 4_elem)),
|
||||
+ __alignof__(struct IPSET_TOKEN(HTYPE, 4_elem)));
|
||||
#ifndef IP_SET_PROTO_UNDEF
|
||||
} else {
|
||||
set->variant = &IPSET_TOKEN(HTYPE, 6_variant);
|
||||
set->dsize = ip_set_elem_len(set, tb,
|
||||
- sizeof(struct IPSET_TOKEN(HTYPE, 6_elem)));
|
||||
+ sizeof(struct IPSET_TOKEN(HTYPE, 6_elem)),
|
||||
+ __alignof__(struct IPSET_TOKEN(HTYPE, 6_elem)));
|
||||
}
|
||||
#endif
|
||||
if (tb[IPSET_ATTR_TIMEOUT]) {
|
||||
diff --git a/net/netfilter/ipset/ip_set_list_set.c b/net/netfilter/ipset/ip_set_list_set.c
|
||||
index 5a30ce6..bbede95 100644
|
||||
--- a/net/netfilter/ipset/ip_set_list_set.c
|
||||
+++ b/net/netfilter/ipset/ip_set_list_set.c
|
||||
@@ -31,7 +31,7 @@ struct set_elem {
|
||||
struct rcu_head rcu;
|
||||
struct list_head list;
|
||||
ip_set_id_t id;
|
||||
-};
|
||||
+} __aligned(__alignof__(u64));
|
||||
|
||||
struct set_adt_elem {
|
||||
ip_set_id_t id;
|
||||
@@ -618,7 +618,8 @@ list_set_create(struct net *net, struct ip_set *set, struct nlattr *tb[],
|
||||
size = IP_SET_LIST_MIN_SIZE;
|
||||
|
||||
set->variant = &set_variant;
|
||||
- set->dsize = ip_set_elem_len(set, tb, sizeof(struct set_elem));
|
||||
+ set->dsize = ip_set_elem_len(set, tb, sizeof(struct set_elem),
|
||||
+ __alignof__(struct set_elem));
|
||||
if (!init_list_set(net, set, size))
|
||||
return -ENOMEM;
|
||||
if (tb[IPSET_ATTR_TIMEOUT]) {
|
||||
--
|
||||
cgit v0.11.2
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
From e9dfdc052d018268926ab769d5b7598226713d5a Mon Sep 17 00:00:00 2001
|
||||
From: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
Date: Sat, 7 Nov 2015 11:23:34 +0100
|
||||
Subject: netfilter: ipset: Fix hash:* type expiration
|
||||
|
||||
Incorrect index was used when the data blob was shrinked at expiration,
|
||||
which could lead to falsely expired entries and memory leak when
|
||||
the comment extension was used too.
|
||||
|
||||
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
---
|
||||
net/netfilter/ipset/ip_set_hash_gen.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
index 4ff2219..fa4f637 100644
|
||||
--- a/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
@@ -523,7 +523,7 @@ mtype_expire(struct ip_set *set, struct htype *h, u8 nets_length, size_t dsize)
|
||||
continue;
|
||||
data = ahash_data(n, j, dsize);
|
||||
memcpy(tmp->value + d * dsize, data, dsize);
|
||||
- set_bit(j, tmp->used);
|
||||
+ set_bit(d, tmp->used);
|
||||
d++;
|
||||
}
|
||||
tmp->pos = d;
|
||||
--
|
||||
cgit v0.11.2
|
||||
|
||||
-47
@@ -1,47 +0,0 @@
|
||||
From 0aae24eb409fc429f54ca3809f904f1b91e295e0 Mon Sep 17 00:00:00 2001
|
||||
From: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
Date: Sat, 7 Nov 2015 11:24:51 +0100
|
||||
Subject: netfilter: ipset: Fix hash type expire: release empty hash bucket
|
||||
block
|
||||
|
||||
When all entries are expired/all slots are empty, release the bucket.
|
||||
|
||||
Signed-off-by: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||
---
|
||||
net/netfilter/ipset/ip_set_hash_gen.h | 13 +++++++++----
|
||||
1 file changed, 9 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
index fa4f637..e5336ab 100644
|
||||
--- a/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
+++ b/net/netfilter/ipset/ip_set_hash_gen.h
|
||||
@@ -476,7 +476,7 @@ static void
|
||||
mtype_expire(struct ip_set *set, struct htype *h, u8 nets_length, size_t dsize)
|
||||
{
|
||||
struct htable *t;
|
||||
- struct hbucket *n;
|
||||
+ struct hbucket *n, *tmp;
|
||||
struct mtype_elem *data;
|
||||
u32 i, j, d;
|
||||
#ifdef IP_SET_HASH_WITH_NETS
|
||||
@@ -511,9 +511,14 @@ mtype_expire(struct ip_set *set, struct htype *h, u8 nets_length, size_t dsize)
|
||||
}
|
||||
}
|
||||
if (d >= AHASH_INIT_SIZE) {
|
||||
- struct hbucket *tmp = kzalloc(sizeof(*tmp) +
|
||||
- (n->size - AHASH_INIT_SIZE) * dsize,
|
||||
- GFP_ATOMIC);
|
||||
+ if (d >= n->size) {
|
||||
+ rcu_assign_pointer(hbucket(t, i), NULL);
|
||||
+ kfree_rcu(n, rcu);
|
||||
+ continue;
|
||||
+ }
|
||||
+ tmp = kzalloc(sizeof(*tmp) +
|
||||
+ (n->size - AHASH_INIT_SIZE) * dsize,
|
||||
+ GFP_ATOMIC);
|
||||
if (!tmp)
|
||||
/* Still try to delete expired elements */
|
||||
continue;
|
||||
--
|
||||
cgit v0.11.2
|
||||
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
From: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Subject: [PATCH] realtek: rtlwifi: rtl8821ae: Fix lockups on boot
|
||||
Date: Tue, 10 Nov 2015 10:46:11 -0600
|
||||
|
||||
In commit 54328e64047a5 ("rtlwifi: rtl8821ae: Fix system lockups on boot"),
|
||||
an attempt was made to fix a regression introduced in commit 1277fa2ab2f9
|
||||
("rtlwifi: Remove the clear interrupt routine from all drivers").
|
||||
Unfortunately, there were logic errors in that patch that prevented
|
||||
affected boxes from booting even after that patch was applied.
|
||||
|
||||
The actual cause of the original problem is unknown as none of the
|
||||
developers have systems that are affected.
|
||||
|
||||
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Cc: Stable <stable@vger.kernel.org> [V4.1+]
|
||||
---
|
||||
|
||||
Kalle,
|
||||
|
||||
I hope this patch can be applied to 4.4.
|
||||
|
||||
Thanks,
|
||||
|
||||
Larry
|
||||
|
||||
drivers/net/wireless/rtlwifi/rtl8821ae/hw.c | 2 +-
|
||||
drivers/net/wireless/rtlwifi/rtl8821ae/sw.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
|
||||
index 6e9418e..bbb789f 100644
|
||||
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
|
||||
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
|
||||
@@ -2272,7 +2272,7 @@ void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
|
||||
- if (!rtlpci->int_clear)
|
||||
+ if (rtlpci->int_clear)
|
||||
rtl8821ae_clear_interrupt(hw);/*clear it here first*/
|
||||
|
||||
rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
|
||||
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
|
||||
index 8ee141a..142bdff 100644
|
||||
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
|
||||
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
|
||||
@@ -448,7 +448,7 @@ MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
|
||||
MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
|
||||
MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
|
||||
MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
|
||||
-MODULE_PARM_DESC(int_clear, "Set to 1 to disable interrupt clear before set (default 0)\n");
|
||||
+MODULE_PARM_DESC(int_clear, "Set to 0 to disable interrupt clear before set (default 1)\n");
|
||||
|
||||
static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
|
||||
|
||||
--
|
||||
2.1.4
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
-74
@@ -1,74 +0,0 @@
|
||||
SCSI: Fix NULL pointer dereference in RTPM of block layer
|
||||
|
||||
The routines in scsi_pm.c assume that if a runtime-PM callback is
|
||||
invoked for a SCSI device, it can only mean that the device's driver
|
||||
has asked the block layer to handle the runtime power management (by
|
||||
calling blk_pm_runtime_init(), which among other things sets q->dev).
|
||||
|
||||
However, this assumption turns out to be wrong for things like the ses
|
||||
driver. Normally ses devices are not allowed to do runtime PM, but
|
||||
userspace can override this setting. If this happens, the kernel gets
|
||||
a NULL pointer dereference when blk_post_runtime_resume() tries to use
|
||||
the uninitialized q->dev pointer.
|
||||
|
||||
This patch fixes the problem by checking q->dev in block layer before
|
||||
handle runtime PM. Since ses doesn't define any PM callbacks and call
|
||||
blk_pm_runtime_init(), the crash won't occur.
|
||||
|
||||
This fixes Bugzilla #101371.
|
||||
https://bugzilla.kernel.org/show_bug.cgi?id=101371
|
||||
|
||||
Signed-off-by: Ken Xue <Ken.Xue@amd.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Cc: stable@vger.kernel.org
|
||||
|
||||
---
|
||||
block/blk-core.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/block/blk-core.c b/block/blk-core.c
|
||||
index 60912e9..a07ab18 100644
|
||||
--- a/block/blk-core.c
|
||||
+++ b/block/blk-core.c
|
||||
@@ -3280,6 +3280,9 @@ int blk_pre_runtime_suspend(struct request_queue *q)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
+ if (!q->dev)
|
||||
+ return ret;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (q->nr_pending) {
|
||||
ret = -EBUSY;
|
||||
@@ -3307,6 +3310,9 @@ EXPORT_SYMBOL(blk_pre_runtime_suspend);
|
||||
*/
|
||||
void blk_post_runtime_suspend(struct request_queue *q, int err)
|
||||
{
|
||||
+ if (!q->dev)
|
||||
+ return;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (!err) {
|
||||
q->rpm_status = RPM_SUSPENDED;
|
||||
@@ -3331,6 +3337,9 @@ EXPORT_SYMBOL(blk_post_runtime_suspend);
|
||||
*/
|
||||
void blk_pre_runtime_resume(struct request_queue *q)
|
||||
{
|
||||
+ if (!q->dev)
|
||||
+ return;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
q->rpm_status = RPM_RESUMING;
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
@@ -3353,6 +3362,9 @@ EXPORT_SYMBOL(blk_pre_runtime_resume);
|
||||
*/
|
||||
void blk_post_runtime_resume(struct request_queue *q, int err)
|
||||
{
|
||||
+ if (!q->dev)
|
||||
+ return;
|
||||
+
|
||||
spin_lock_irq(q->queue_lock);
|
||||
if (!err) {
|
||||
q->rpm_status = RPM_ACTIVE;
|
||||
--
|
||||
1.9.1
|
||||
-64
@@ -1,64 +0,0 @@
|
||||
Revert "SCSI: Fix NULL pointer dereference in runtime PM"
|
||||
|
||||
This reverts commit 49718f0fb8c9 ("SCSI: Fix NULL pointer dereference in
|
||||
runtime PM")
|
||||
|
||||
The old commit may lead to a issue that blk_{pre|post}_runtime_suspend and
|
||||
blk_{pre|post}_runtime_resume can not be called in pairs.
|
||||
|
||||
Take sr device as example, when sr device goes to runtime suspend,
|
||||
blk_{pre|post}_runtime_suspend will be called since sr device defined
|
||||
pm->runtime_suspend. But blk_{pre|post}_runtime_resume will not be called
|
||||
since sr device doesn't have pm->runtime_resume. Then sr device can not
|
||||
resume correctly anymore.
|
||||
|
||||
Signed-off-by: Ken Xue <Ken.Xue@amd.com>
|
||||
Acked-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Cc: stable@vger.kernel.org
|
||||
|
||||
---
|
||||
drivers/scsi/scsi_pm.c | 20 ++++++++++----------
|
||||
1 file changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
|
||||
index e4b7998..459abe1 100644
|
||||
--- a/drivers/scsi/scsi_pm.c
|
||||
+++ b/drivers/scsi/scsi_pm.c
|
||||
@@ -219,13 +219,13 @@ static int sdev_runtime_suspend(struct device *dev)
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
int err = 0;
|
||||
|
||||
- if (pm && pm->runtime_suspend) {
|
||||
- err = blk_pre_runtime_suspend(sdev->request_queue);
|
||||
- if (err)
|
||||
- return err;
|
||||
+ err = blk_pre_runtime_suspend(sdev->request_queue);
|
||||
+ if (err)
|
||||
+ return err;
|
||||
+ if (pm && pm->runtime_suspend)
|
||||
err = pm->runtime_suspend(dev);
|
||||
- blk_post_runtime_suspend(sdev->request_queue, err);
|
||||
- }
|
||||
+ blk_post_runtime_suspend(sdev->request_queue, err);
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -248,11 +248,11 @@ static int sdev_runtime_resume(struct device *dev)
|
||||
const struct dev_pm_ops *pm = dev->driver ? dev->driver->pm : NULL;
|
||||
int err = 0;
|
||||
|
||||
- if (pm && pm->runtime_resume) {
|
||||
- blk_pre_runtime_resume(sdev->request_queue);
|
||||
+ blk_pre_runtime_resume(sdev->request_queue);
|
||||
+ if (pm && pm->runtime_resume)
|
||||
err = pm->runtime_resume(dev);
|
||||
- blk_post_runtime_resume(sdev->request_queue, err);
|
||||
- }
|
||||
+ blk_post_runtime_resume(sdev->request_queue, err);
|
||||
+
|
||||
return err;
|
||||
}
|
||||
|
||||
--
|
||||
1.9.1
|
||||
@@ -38,12 +38,6 @@ x86-increase-default-minimum-vmalloc-area-by-64MB-to-192MB.patch
|
||||
# slows down boot
|
||||
Revert-cpufreq-pcc-Enable-autoload-of-pcc-cpufreq-fo.patch
|
||||
|
||||
# (CVE-2015-8104)
|
||||
x86-KVM-svm-unconditionally-intercept-DB.patch
|
||||
|
||||
# efi borkage
|
||||
Revert-x86-efi-Request-desired-alignment-via-the-PE-.patch
|
||||
|
||||
# breaks nvidia304
|
||||
Revert-x86-mm-mtrr-Remove-kernel-internal-MTRR-inter.patch
|
||||
|
||||
@@ -52,9 +46,6 @@ Revert-x86-mm-mtrr-Remove-kernel-internal-MTRR-inter.patch
|
||||
###
|
||||
base-cacheinfo-silence-DT-warnings.patch
|
||||
|
||||
# git fix
|
||||
certs-add-.gitignore-to-stop-git-nagging-about-x509_.patch
|
||||
|
||||
###
|
||||
### i2c
|
||||
###
|
||||
@@ -85,7 +76,6 @@ acpi-processor-M720SR-limit-to-C2.patch
|
||||
|
||||
# backlight fixes
|
||||
ACPI-video-Add-a-quirk-to-force-acpi-video-backlight.patch
|
||||
ACPI-video-Add-a-quirk-to-force-native-backlight-on-.patch
|
||||
|
||||
###
|
||||
### Block
|
||||
@@ -129,12 +119,7 @@ ata-prefer-ata-drivers-over-ide-drivers-when-both-are-built.patch
|
||||
# Nice SSD speedup
|
||||
block-Make-CFQ-default-to-IOPS-mode-on-SSDs.patch
|
||||
|
||||
# properly fix null pointer deref introduced in 4.1.7
|
||||
scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch
|
||||
scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch
|
||||
|
||||
# ahci ids
|
||||
ahci-Add-Marvell-88se91a2-device-id.patch
|
||||
ahci-add-new-Intel-device-IDs.patch
|
||||
|
||||
###
|
||||
@@ -142,8 +127,8 @@ ahci-add-new-Intel-device-IDs.patch
|
||||
###
|
||||
|
||||
# aufs from: http://aufs.sourceforge.net/ (mga#8314)
|
||||
fs-aufs-4.3.patch
|
||||
fs-aufs-4.3-modular.patch
|
||||
fs-aufs-4.4.patch
|
||||
fs-aufs-4.4-modular.patch
|
||||
|
||||
###
|
||||
### FireWire
|
||||
@@ -179,9 +164,27 @@ gpu-drm-mach64-3.17-buildfix.patch
|
||||
gpu-drm-mach64-3.18-buildfix.patch
|
||||
|
||||
# drm fixes
|
||||
gpu-drm-Fix-an-unwanted-master-inheritance-v2.patch
|
||||
gpu-drm-i915-Fix-RPS-pointer-passed-from-wait_ioctl-to-i915_wait_request.patch
|
||||
|
||||
# etnaviv / vivante gpu
|
||||
gpu-drm-0001-devicetree-add-vendor-prefix-for-Vivante-Corporation.patch
|
||||
gpu-drm-0002-drm-etnaviv-add-devicetree-bindings.patch
|
||||
gpu-drm-0003-drm-etnaviv-add-initial-etnaviv-DRM-driver.patch
|
||||
gpu-drm-0004-MAINTAINERS-add-maintainer-and-reviewers-for-the-etn.patch
|
||||
gpu-drm-0005-drm-etnaviv-unlock-on-error-in-etnaviv_gem_get_iova.patch
|
||||
gpu-drm-0006-drm-etnaviv-fix-workaround-for-GC500.patch
|
||||
|
||||
# vc4 3d accel support
|
||||
gpu-drm-0101-drm-Create-a-driver-hook-for-allocating-GEM-object-s.patch
|
||||
gpu-drm-0102-drm-vc4-Add-a-BO-cache.patch
|
||||
gpu-drm-0103-drm-vc4-Add-create-and-map-BO-ioctls.patch
|
||||
gpu-drm-0104-drm-vc4-Add-an-API-for-creating-GPU-shaders-in-GEM-B.patch
|
||||
gpu-drm-0105-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch
|
||||
gpu-drm-0106-drm-vc4-Bind-and-initialize-the-V3D-engine.patch
|
||||
gpu-drm-0107-drm-vc4-Add-support-for-drawing-3D-frames.patch
|
||||
gpu-drm-0108-drm-vc4-Add-support-for-async-pageflips.patch
|
||||
gpu-drm-0109-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch
|
||||
|
||||
###
|
||||
### Hardware Monitoring
|
||||
###
|
||||
@@ -232,18 +235,6 @@ net-netfilter-psd.patch
|
||||
net-netfilter-psd-mdv.patch
|
||||
net-netfilter-psd-2.6.35-buildfix.patch
|
||||
|
||||
# netfilter fixes
|
||||
net-netfilter-ipset-Fix-extension-alignment.patch
|
||||
net-netfilter-ipset-Fix-hash-type-expiration.patch
|
||||
net-netfilter-ipset-Fix-hash-type-expire-release-empty-hash-bucket-block.patch
|
||||
net-netfilter-Fix-removal-of-GRE-expectation-entries-created-by-PPTP.patch
|
||||
|
||||
# rtlwifi hang fix
|
||||
net-wireless-rtlwifi-rtl8821ae-Fix-lockups-on-boot.patch
|
||||
|
||||
# net stable fixes from DaveM
|
||||
net_43.mbox.patch
|
||||
|
||||
###
|
||||
### Platform drivers
|
||||
###
|
||||
@@ -367,6 +358,20 @@ video-mageia-logo.patch
|
||||
### ARM
|
||||
###
|
||||
|
||||
# RPi2 support
|
||||
arm-0001-dt-bindings-Add-root-properties-for-Raspberry-Pi-2.patch
|
||||
arm-0002-ARM-bcm2835-Add-a-compat-string-for-bcm2836-machine-.patch
|
||||
arm-0003-ARM-bcm2835-Add-Kconfig-support-for-bcm2836.patch
|
||||
arm-0011-ARM-bcm2835-Define-two-new-packets-from-the-latest-f.patch
|
||||
arm-0012-dt-bindings-add-rpi-power-domain-driver-bindings.patch
|
||||
arm-0013-ARM-bcm2835-add-rpi-power-domain-driver.patch
|
||||
arm-0021-ARM-bcm2835-Split-the-DT-for-peripherals-from-the-DT.patch
|
||||
arm-0022-ARM-bcm2835-Move-the-CPU-peripheral-include-out-of-c.patch
|
||||
arm-0023-ARM-bcm2835-Add-devicetree-for-bcm2836-and-Raspberry.patch
|
||||
arm-0024-ARM-bcm2835-Add-the-auxiliary-clocks-to-the-device-t.patch
|
||||
arm-0031-ARM-bcm2835-enable-all-bcm2835-relevant-in-defconfig.patch
|
||||
arm-0032-ARM-bcm2835-enable-auxiliary-spi-driver-in-defconfig.patch
|
||||
|
||||
###
|
||||
### IA64
|
||||
###
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
From: Paolo Bonzini <pbonzini@redhat.com>
|
||||
Subject: [PATCH 2/3] KVM: svm: unconditionally intercept #DB
|
||||
Date: Tue, 10 Nov 2015 13:22:53 +0100
|
||||
|
||||
This is needed to avoid the possibility that the guest triggers
|
||||
an infinite stream of #DB exceptions (CVE-2015-8104).
|
||||
|
||||
VMX is not affected: because it does not save DR6 in the VMCS,
|
||||
it already intercepts #DB unconditionally.
|
||||
|
||||
Reported-by: Jan Beulich <jbeulich@suse.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
arch/x86/kvm/svm.c | 14 +++-----------
|
||||
1 file changed, 3 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
|
||||
index 183926483c3a..1cc1ffca0d8c 100644
|
||||
--- a/arch/x86/kvm/svm.c
|
||||
+++ b/arch/x86/kvm/svm.c
|
||||
@@ -1020,6 +1020,7 @@ static void init_vmcb(struct vcpu_svm *svm)
|
||||
set_exception_intercept(svm, UD_VECTOR);
|
||||
set_exception_intercept(svm, MC_VECTOR);
|
||||
set_exception_intercept(svm, AC_VECTOR);
|
||||
+ set_exception_intercept(svm, DB_VECTOR);
|
||||
|
||||
set_intercept(svm, INTERCEPT_INTR);
|
||||
set_intercept(svm, INTERCEPT_NMI);
|
||||
@@ -1554,20 +1555,13 @@ static void svm_set_segment(struct kvm_vcpu *vcpu,
|
||||
mark_dirty(svm->vmcb, VMCB_SEG);
|
||||
}
|
||||
|
||||
-static void update_db_bp_intercept(struct kvm_vcpu *vcpu)
|
||||
+static void update_bp_intercept(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct vcpu_svm *svm = to_svm(vcpu);
|
||||
|
||||
- clr_exception_intercept(svm, DB_VECTOR);
|
||||
clr_exception_intercept(svm, BP_VECTOR);
|
||||
|
||||
- if (svm->nmi_singlestep)
|
||||
- set_exception_intercept(svm, DB_VECTOR);
|
||||
-
|
||||
if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) {
|
||||
- if (vcpu->guest_debug &
|
||||
- (KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))
|
||||
- set_exception_intercept(svm, DB_VECTOR);
|
||||
if (vcpu->guest_debug & KVM_GUESTDBG_USE_SW_BP)
|
||||
set_exception_intercept(svm, BP_VECTOR);
|
||||
} else
|
||||
@@ -1673,7 +1667,6 @@ static int db_interception(struct vcpu_svm *svm)
|
||||
if (!(svm->vcpu.guest_debug & KVM_GUESTDBG_SINGLESTEP))
|
||||
svm->vmcb->save.rflags &=
|
||||
~(X86_EFLAGS_TF | X86_EFLAGS_RF);
|
||||
- update_db_bp_intercept(&svm->vcpu);
|
||||
}
|
||||
|
||||
if (svm->vcpu.guest_debug &
|
||||
@@ -3661,7 +3654,6 @@ static void enable_nmi_window(struct kvm_vcpu *vcpu)
|
||||
*/
|
||||
svm->nmi_singlestep = true;
|
||||
svm->vmcb->save.rflags |= (X86_EFLAGS_TF | X86_EFLAGS_RF);
|
||||
- update_db_bp_intercept(vcpu);
|
||||
}
|
||||
|
||||
static int svm_set_tss_addr(struct kvm *kvm, unsigned int addr)
|
||||
@@ -4287,7 +4279,7 @@ static struct kvm_x86_ops svm_x86_ops = {
|
||||
.vcpu_load = svm_vcpu_load,
|
||||
.vcpu_put = svm_vcpu_put,
|
||||
|
||||
- .update_db_bp_intercept = update_db_bp_intercept,
|
||||
+ .update_db_bp_intercept = update_bp_intercept,
|
||||
.get_msr = svm_get_msr,
|
||||
.set_msr = svm_set_msr,
|
||||
.get_segment_base = svm_get_segment_base,
|
||||
--
|
||||
1.8.3.1
|
||||
|
||||
|
||||
+45
-21
@@ -12,7 +12,7 @@
|
||||
<IsA>kernel</IsA>
|
||||
<Summary>The Linux kernel (the core of the Linux operating system) for Pisi Linux</Summary>
|
||||
<Description>kernel contains the Linux kernel, the core of any Linux operating system. The kernel handles the basic functions of the operating system: memory allocation, process allocation, device input and output, etc.</Description>
|
||||
<Archive sha1sum="309d9bedd8c9ef4a79695f04dcf65c0b551d784c" type="targz">https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.3.tar.gz</Archive>
|
||||
<Archive sha1sum="180ab617036593212274177eff3a67f437c1b5ea" type="targz">https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.tar.gz</Archive>
|
||||
<AdditionalFiles>
|
||||
<AdditionalFile target="configs/kernel-i686-config">configs/kernel-i686-config</AdditionalFile>
|
||||
<AdditionalFile target="configs/kernel-x86_64-config">configs/kernel-x86_64-config</AdditionalFile>
|
||||
@@ -28,8 +28,8 @@
|
||||
</BuildDependencies>
|
||||
<Patches>
|
||||
<!-- Linux patches -->
|
||||
<Patch level="1" compressionType="xz">patches/linux/patch-4.3.2.xz</Patch>
|
||||
<!-- Mageia Linux patches // compatible with http://svnweb.mageia.org/packages/cauldron/kernel/releases/4.3.2/1.mga6/PATCHES/patches/series-->
|
||||
<!--Patch level="1" compressionType="xz">patches/linux/patch-4.3.2.xz</Patch-->
|
||||
<!-- Mageia Linux patches // compatible with http://svnweb.mageia.org/packages/cauldron/kernel/releases/4.4.0/1.mga6/PATCHES/patches/series-->
|
||||
<!--stable patches-->
|
||||
<!--other patches-->
|
||||
<Patch level="1">patches/mageia/x86-pci-toshiba-equium-a60-assign-busses.patch</Patch>
|
||||
@@ -37,17 +37,13 @@
|
||||
<Patch level="1">patches/mageia/x86-default_poweroff_up_machines.patch</Patch>
|
||||
<Patch level="1">patches/mageia/x86-increase-default-minimum-vmalloc-area-by-64MB-to-192MB.patch</Patch>
|
||||
<Patch level="1">patches/mageia/Revert-cpufreq-pcc-Enable-autoload-of-pcc-cpufreq-fo.patch</Patch>
|
||||
<Patch level="1">patches/mageia/x86-KVM-svm-unconditionally-intercept-DB.patch</Patch>
|
||||
<Patch level="1">patches/mageia/Revert-x86-efi-Request-desired-alignment-via-the-PE-.patch</Patch>
|
||||
<Patch level="1">patches/mageia/Revert-x86-mm-mtrr-Remove-kernel-internal-MTRR-inter.patch</Patch>
|
||||
<Patch level="1">patches/mageia/base-cacheinfo-silence-DT-warnings.patch</Patch>
|
||||
<Patch level="1">patches/mageia/certs-add-.gitignore-to-stop-git-nagging-about-x509_.patch</Patch>
|
||||
<Patch level="1">patches/mageia/pci-add-ALI-M5229-ide-compatibility-mode-quirk.patch</Patch>
|
||||
<Patch level="1">patches/mageia/pci-quirks-drop-devinit-exit.patch</Patch>
|
||||
<Patch level="1">patches/mageia/acpi-CLEVO-M360S-disable_acpi_irq.patch</Patch>
|
||||
<Patch level="1">patches/mageia/acpi-processor-M720SR-limit-to-C2.patch</Patch>
|
||||
<Patch level="1">patches/mageia/ACPI-video-Add-a-quirk-to-force-acpi-video-backlight.patch</Patch>
|
||||
<Patch level="1">patches/mageia/ACPI-video-Add-a-quirk-to-force-native-backlight-on-.patch</Patch>
|
||||
<!--Patch level="1">patches/mageia/scsi-ppscsi-2.6.2.patch</Patch>
|
||||
<Patch level="1">patches/mageia/scsi-ppscsi_fixes.patch</Patch>
|
||||
<Patch level="1">patches/mageia/scsi-ppscsi-sg-helper-update.patch</Patch>
|
||||
@@ -61,8 +57,8 @@
|
||||
<Patch level="1">patches/mageia/block-floppy-disable-pnp-modalias.patch</Patch>
|
||||
<Patch level="1">patches/mageia/ata-prefer-ata-drivers-over-ide-drivers-when-both-are-built.patch</Patch>
|
||||
<Patch level="1">patches/mageia/block-Make-CFQ-default-to-IOPS-mode-on-SSDs.patch</Patch>
|
||||
<Patch level="1">patches/mageia/fs-aufs-4.3.patch</Patch>
|
||||
<Patch level="1">patches/mageia/fs-aufs-4.3-modular.patch</Patch>
|
||||
<Patch level="1">patches/mageia/fs-aufs-4.4.patch</Patch>
|
||||
<Patch level="1">patches/mageia/fs-aufs-4.4-modular.patch</Patch>
|
||||
<Patch level="1">patches/mageia/firewire-ieee1394-module-aliases.patch</Patch>
|
||||
<Patch level="1">patches/mageia/char-agp-intel-new-Q57-id.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-mach64.patch</Patch>
|
||||
@@ -82,8 +78,22 @@
|
||||
<Patch level="1">patches/mageia/gpu-drm-mach64-linux-3.14-buildfix.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-mach64-3.17-buildfix.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-mach64-3.18-buildfix.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-Fix-an-unwanted-master-inheritance-v2.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-i915-Fix-RPS-pointer-passed-from-wait_ioctl-to-i915_wait_request.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0001-devicetree-add-vendor-prefix-for-Vivante-Corporation.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0002-drm-etnaviv-add-devicetree-bindings.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0003-drm-etnaviv-add-initial-etnaviv-DRM-driver.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0004-MAINTAINERS-add-maintainer-and-reviewers-for-the-etn.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0005-drm-etnaviv-unlock-on-error-in-etnaviv_gem_get_iova.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0006-drm-etnaviv-fix-workaround-for-GC500.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0101-drm-Create-a-driver-hook-for-allocating-GEM-object-s.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0102-drm-vc4-Add-a-BO-cache.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0103-drm-vc4-Add-create-and-map-BO-ioctls.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0104-drm-vc4-Add-an-API-for-creating-GPU-shaders-in-GEM-B.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0105-drm-vc4-Fix-a-typo-in-a-V3D-debug-register.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0106-drm-vc4-Bind-and-initialize-the-V3D-engine.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0107-drm-vc4-Add-support-for-drawing-3D-frames.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0108-drm-vc4-Add-support-for-async-pageflips.patch</Patch>
|
||||
<Patch level="1">patches/mageia/gpu-drm-0109-drm-vc4-Add-an-interface-for-capturing-the-GPU-state.patch</Patch>
|
||||
<Patch level="1">patches/mageia/input-i8042-quirks-for-Fujitsu-Lifebook-A544-and-Lif.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-sis190-fix-list-usage.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-IFWLOG.patch</Patch>
|
||||
@@ -95,12 +105,6 @@
|
||||
<Patch level="1">patches/mageia/net-netfilter-psd.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-psd-mdv.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-psd-2.6.35-buildfix.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-ipset-Fix-extension-alignment.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-ipset-Fix-hash-type-expiration.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-ipset-Fix-hash-type-expire-release-empty-hash-bucket-block.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-netfilter-Fix-removal-of-GRE-expectation-entries-created-by-PPTP.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net-wireless-rtlwifi-rtl8821ae-Fix-lockups-on-boot.patch</Patch>
|
||||
<Patch level="1">patches/mageia/net_43.mbox.patch</Patch>
|
||||
<Patch level="1">patches/mageia/platform-x86-add-shuttle-wmi-driver.patch</Patch>
|
||||
<Patch level="1">patches/mageia/platform-x86-shuttle-wmi-drop-devinit-exit.patch</Patch>
|
||||
<Patch level="1">patches/mageia/platform-x86-shuttle-wmi-4.2-buildfix.patch</Patch>
|
||||
@@ -136,10 +140,19 @@
|
||||
<Patch level="1">patches/mageia/3rd-viahss-2.6.35-buildfix.patch</Patch>
|
||||
<Patch level="1">patches/mageia/3rd-viahss-3.0-buildfix.patch</Patch>
|
||||
<Patch level="1">patches/mageia/3rd-rtl8723bs.patch</Patch>
|
||||
<Patch level="1">patches/mageia/scsi-Fix-NULL-pointer-dereference-in-RTPM-of-block-layer.patch</Patch>
|
||||
<Patch level="1">patches/mageia/scsi-Revert-SCSI-Fix-NULL-pointer-dereference-in-runtime-PM.patch</Patch>
|
||||
<Patch level="1">patches/mageia/ahci-Add-Marvell-88se91a2-device-id.patch</Patch>
|
||||
<Patch level="1">patches/mageia/ahci-add-new-Intel-device-IDs.patch</Patch>
|
||||
<Patch level="1">patches/mageia/ahci-add-new-Intel-device-IDs.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0001-dt-bindings-Add-root-properties-for-Raspberry-Pi-2.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0002-ARM-bcm2835-Add-a-compat-string-for-bcm2836-machine-.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0003-ARM-bcm2835-Add-Kconfig-support-for-bcm2836.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0011-ARM-bcm2835-Define-two-new-packets-from-the-latest-f.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0012-dt-bindings-add-rpi-power-domain-driver-bindings.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0013-ARM-bcm2835-add-rpi-power-domain-driver.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0021-ARM-bcm2835-Split-the-DT-for-peripherals-from-the-DT.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0022-ARM-bcm2835-Move-the-CPU-peripheral-include-out-of-c.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0023-ARM-bcm2835-Add-devicetree-for-bcm2836-and-Raspberry.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0024-ARM-bcm2835-Add-the-auxiliary-clocks-to-the-device-t.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0031-ARM-bcm2835-enable-all-bcm2835-relevant-in-defconfig.patch</Patch>
|
||||
<Patch level="1">patches/mageia/arm-0032-ARM-bcm2835-enable-auxiliary-spi-driver-in-defconfig.patch</Patch>
|
||||
</Patches>
|
||||
</Source>
|
||||
|
||||
@@ -194,6 +207,17 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="69">
|
||||
<Date>2016-01-11</Date>
|
||||
<Version>4.4.0</Version>
|
||||
<Comment>Version bump to 4.4.0</Comment>
|
||||
<Type package="kernel">security</Type>
|
||||
<Requires>
|
||||
<Action package="kernel">systemRestart</Action>
|
||||
</Requires>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="68">
|
||||
<Date>2015-12-12</Date>
|
||||
<Version>4.3.2</Version>
|
||||
@@ -204,7 +228,7 @@
|
||||
</Requires>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
</Update>
|
||||
<Update release="67">
|
||||
<Date>2015-12-01</Date>
|
||||
<Version>4.3.0</Version>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<IsA>console</IsA>
|
||||
<Summary>eudev is a fork of system-udev</Summary>
|
||||
<Description>eudev is a fork of system-udev with the goal of obtaining better compatibility with existing software such as OpenRC and Upstart, older kernels, various toolchains and anything else required by users and various distributions.</Description>
|
||||
<Archive sha1sum="af5d5703c3aa9253897b034c561796ef796aab83" type="targz">https://github.com/gentoo/eudev/archive/v3.1.2.tar.gz</Archive>
|
||||
<Archive sha1sum="6d4973a0bf66e5ead4d047d2605d2141da36b335" type="targz">https://github.com/gentoo/eudev/archive/v3.1.5.tar.gz</Archive>
|
||||
<AdditionalFiles>
|
||||
<!-- http://www.linuxfromscratch.org/lfs/view/development/chapter06/eudev.html -->
|
||||
<AdditionalFile target="config.cache">config.cache</AdditionalFile>
|
||||
@@ -21,7 +21,7 @@
|
||||
<Dependency>glibc-devel</Dependency>
|
||||
<Dependency>libkmod-devel</Dependency>
|
||||
<!--<Dependency>libutil-linux-devel</Dependency>--><!-- alert circle dep.-->
|
||||
<Dependency>glib2-devel</Dependency>
|
||||
<!--Dependency>glib2-devel</Dependency-->
|
||||
<Dependency>libpcre-devel</Dependency>
|
||||
<!--<Dependency>libxslt</Dependency>--><!--disable manpages-->
|
||||
<Dependency>gperf</Dependency>
|
||||
@@ -33,7 +33,7 @@
|
||||
<RuntimeDependencies>
|
||||
<Dependency>libkmod</Dependency>
|
||||
<!--<Dependency>libutil-linux</Dependency>-->
|
||||
<Dependency>glib2</Dependency>
|
||||
<!--Dependency>glib2</Dependency-->
|
||||
</RuntimeDependencies>
|
||||
<Conflicts>
|
||||
<Package releaseTo="16">udev</Package>
|
||||
@@ -78,7 +78,7 @@
|
||||
<Summary>Development files for eudev</Summary>
|
||||
<RuntimeDependencies>
|
||||
<Dependency release="current">eudev</Dependency>
|
||||
<Dependency>glib2-devel</Dependency>
|
||||
<!--Dependency>glib2-devel</Dependency-->
|
||||
</RuntimeDependencies>
|
||||
<Conflicts>
|
||||
<Package releaseTo="16">udev-devel</Package>
|
||||
@@ -108,11 +108,11 @@
|
||||
<BuildDependencies>
|
||||
<Dependency>glibc-32bit</Dependency>
|
||||
<Dependency>libkmod-32bit</Dependency>
|
||||
<Dependency>glib2-32bit</Dependency>
|
||||
<!--Dependency>glib2-32bit</Dependency-->
|
||||
</BuildDependencies>
|
||||
<RuntimeDependencies>
|
||||
<Dependency>glibc-32bit</Dependency>
|
||||
<Dependency>glib2-32bit</Dependency>
|
||||
<!--Dependency>glib2-32bit</Dependency-->
|
||||
</RuntimeDependencies>
|
||||
<Files>
|
||||
<Path fileType="library">/lib32</Path>
|
||||
@@ -121,6 +121,14 @@
|
||||
</Package>
|
||||
|
||||
<History>
|
||||
<Update release="7">
|
||||
<Date>2016-01-03</Date>
|
||||
<Version>3.1.5</Version>
|
||||
<Comment>Version bump.</Comment>
|
||||
<Comment>Add rules for mount storage.</Comment>
|
||||
<Name>Ertuğrul Erata</Name>
|
||||
<Email>ertugrulerata@gmail.com</Email>
|
||||
</Update>
|
||||
<Update release="6">
|
||||
<Date>2016-01-04</Date>
|
||||
<Version>3.1.2</Version>
|
||||
|
||||
Reference in New Issue
Block a user