Merge tag 'powerpc-4.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 Dec 2016 17:26:42 +0000 (09:26 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 16 Dec 2016 17:26:42 +0000 (09:26 -0800)
Pull powerpc updates from Michael Ellerman:
 "Highlights include:

   - Support for the kexec_file_load() syscall, which is a prereq for
     secure and trusted boot.

   - Prevent kernel execution of userspace on P9 Radix (similar to
     SMEP/PXN).

   - Sort the exception tables at build time, to save time at boot, and
     store them as relative offsets to save space in the kernel image &
     memory.

   - Allow building the kernel with thin archives, which should allow us
     to build an allyesconfig once some other fixes land.

   - Build fixes to allow us to correctly rebuild when changing the
     kernel endian from big to little or vice versa.

   - Plumbing so that we can avoid doing a full mm TLB flush on P9
     Radix.

   - Initial stack protector support (-fstack-protector).

   - Support for dumping the radix (aka. Linux) and hash page tables via
     debugfs.

   - Fix an oops in cxl coredump generation when cxl_get_fd() is used.

   - Freescale updates from Scott: "Highlights include 8xx hugepage
     support, qbman fixes/cleanup, device tree updates, and some misc
     cleanup."

   - Many and varied fixes and minor enhancements as always.

  Thanks to:
    Alexey Kardashevskiy, Andrew Donnellan, Aneesh Kumar K.V, Anshuman
    Khandual, Anton Blanchard, Balbir Singh, Bartlomiej Zolnierkiewicz,
    Christophe Jaillet, Christophe Leroy, Denis Kirjanov, Elimar
    Riesebieter, Frederic Barrat, Gautham R. Shenoy, Geliang Tang, Geoff
    Levand, Jack Miller, Johan Hovold, Lars-Peter Clausen, Libin,
    Madhavan Srinivasan, Michael Neuling, Nathan Fontenot, Naveen N.
    Rao, Nicholas Piggin, Pan Xinhui, Peter Senna Tschudin, Rashmica
    Gupta, Rui Teng, Russell Currey, Scott Wood, Simon Guo, Suraj
    Jitindar Singh, Thiago Jung Bauermann, Tobias Klauser, Vaibhav Jain"

[ And thanks to Michael, who took time off from a new baby to get this
  pull request done.   - Linus ]

* tag 'powerpc-4.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: (174 commits)
  powerpc/fsl/dts: add FMan node for t1042d4rdb
  powerpc/fsl/dts: add sg_2500_aqr105_phy4 alias on t1024rdb
  powerpc/fsl/dts: add QMan and BMan nodes on t1024
  powerpc/fsl/dts: add QMan and BMan nodes on t1023
  soc/fsl/qman: test: use DEFINE_SPINLOCK()
  powerpc/fsl-lbc: use DEFINE_SPINLOCK()
  powerpc/8xx: Implement support of hugepages
  powerpc: get hugetlbpage handling more generic
  powerpc: port 64 bits pgtable_cache to 32 bits
  powerpc/boot: Request no dynamic linker for boot wrapper
  soc/fsl/bman: Use resource_size instead of computation
  soc/fsl/qe: use builtin_platform_driver
  powerpc/fsl_pmc: use builtin_platform_driver
  powerpc/83xx/suspend: use builtin_platform_driver
  powerpc/ftrace: Fix the comments for ftrace_modify_code
  powerpc/perf: macros for power9 format encoding
  powerpc/perf: power9 raw event format encoding
  powerpc/perf: update attribute_group data structure
  powerpc/perf: factor out the event format field
  powerpc/mm/iommu, vfio/spapr: Put pages on VFIO container shutdown
  ...

22 files changed:
1  2 
Documentation/devicetree/bindings/i2c/trivial-devices.txt
arch/powerpc/Kconfig
arch/powerpc/boot/Makefile
arch/powerpc/include/asm/asm-prototypes.h
arch/powerpc/include/asm/book3s/64/pgtable.h
arch/powerpc/include/asm/mmu.h
arch/powerpc/include/asm/processor.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kernel/cpu_setup_power.S
arch/powerpc/kernel/eeh_driver.c
arch/powerpc/kernel/exceptions-64s.S
arch/powerpc/kernel/process.c
arch/powerpc/kernel/setup_64.c
arch/powerpc/mm/pgtable-radix.c
arch/powerpc/mm/tlb-radix.c
arch/powerpc/platforms/40x/Kconfig
arch/powerpc/platforms/44x/Kconfig
arch/powerpc/platforms/pseries/lpar.c
drivers/misc/cxl/context.c
drivers/soc/fsl/qbman/bman_portal.c
drivers/soc/fsl/qbman/qman_portal.c
include/linux/kexec.h

@@@ -39,13 -39,11 +39,13 @@@ dallas,ds75                Digital Thermometer and Th
  dlg,da9053            DA9053: flexible system level PMIC with multicore support
  dlg,da9063            DA9063: system PMIC for quad-core application processors
  domintech,dmard09     DMARD09: 3-axis Accelerometer
 +domintech,dmard10     DMARD10: 3-axis Accelerometer
  epson,rx8010          I2C-BUS INTERFACE REAL TIME CLOCK MODULE
  epson,rx8025          High-Stability. I2C-Bus INTERFACE REAL TIME CLOCK MODULE
  epson,rx8581          I2C-BUS INTERFACE REAL TIME CLOCK MODULE
  fsl,mag3110           MAG3110: Xtrinsic High Accuracy, 3D Magnetometer
  fsl,mc13892           MC13892: Power Management Integrated Circuit (PMIC) for i.MX35/51
 +fsl,mma7660           MMA7660FC: 3-Axis Orientation/Motion Detection Sensor
  fsl,mma8450           MMA8450Q: Xtrinsic Low-power, 3-axis Xtrinsic Accelerometer
  fsl,mpl3115           MPL3115: Absolute Digital Pressure Sensor
  fsl,mpr121            MPR121: Proximity Capacitive Touch Sensor Controller
@@@ -59,7 -57,6 +59,7 @@@ maxim,max1237         Low-Power, 4-/12-Channel
  maxim,max6625         9-Bit/12-Bit Temperature Sensors with I²C-Compatible Serial Interface
  mc,rv3029c2           Real Time Clock Module with I2C-Bus
  mcube,mc3230          mCube 3-axis 8-bit digital accelerometer
 +memsic,mxc6225                MEMSIC 2-axis 8-bit digital accelerometer
  microchip,mcp4531-502 Microchip 7-bit Single I2C Digital Potentiometer (5k)
  microchip,mcp4531-103 Microchip 7-bit Single I2C Digital Potentiometer (10k)
  microchip,mcp4531-503 Microchip 7-bit Single I2C Digital Potentiometer (50k)
@@@ -124,11 -121,6 +124,11 @@@ microchip,mcp4662-502    Microchip 8-bit D
  microchip,mcp4662-103 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (10k)
  microchip,mcp4662-503 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (50k)
  microchip,mcp4662-104 Microchip 8-bit Dual I2C Digital Potentiometer with NV Memory (100k)
 +microchip,tc654               PWM Fan Speed Controller With Fan Fault Detection
 +microchip,tc655               PWM Fan Speed Controller With Fan Fault Detection
 +miramems,da226                MiraMEMS DA226 2-axis 14-bit digital accelerometer
 +miramems,da280                MiraMEMS DA280 3-axis 14-bit digital accelerometer
 +miramems,da311                MiraMEMS DA311 3-axis 12-bit digital accelerometer
  national,lm63         Temperature sensor with integrated fan control
  national,lm75         I2C TEMP SENSOR
  national,lm80         Serial Interface ACPI-Compatible Microprocessor System Hardware Monitor
@@@ -138,8 -130,6 +138,8 @@@ nuvoton,npct501            i2c trusted platform m
  nuvoton,npct601               i2c trusted platform module (TPM2)
  nxp,pca9556           Octal SMBus and I2C registered interface
  nxp,pca9557           8-bit I2C-bus and SMBus I/O port with reset
 +nxp,pcf2127           Real-time clock
 +nxp,pcf2129           Real-time clock
  nxp,pcf8563           Real-time clock/calendar
  nxp,pcf85063          Tiny Real-Time Clock
  oki,ml86v7667         OKI ML86V7667 video decoder
@@@ -156,7 -146,6 +156,7 @@@ ricoh,rv5c387a             I2C bus SERIAL INTERFAC
  samsung,24ad0xd1      S524AD0XF1 (128K/256K-bit Serial EEPROM for Low Power)
  sgx,vz89x             SGX Sensortech VZ89X Sensors
  sii,s35390a           2-wire CMOS real-time clock
 +silabs,si7020         Relative Humidity and Temperature Sensors
  skyworks,sky81452     Skyworks SKY81452: Six-Channel White LED Driver with Touch Panel Bias Supply
  st,24c256             i2c serial eeprom  (24cxx)
  st,m41t00             Serial real-time clock (RTC)
@@@ -169,4 -158,5 +169,5 @@@ ti,tsc2003         I2C Touch-Screen Controlle
  ti,tmp102             Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
  ti,tmp103             Low Power Digital Temperature Sensor with SMBUS/Two Wire Serial Interface
  ti,tmp275             Digital Temperature Sensor
+ winbond,w83793                Winbond/Nuvoton H/W Monitor
  winbond,wpct301               i2c trusted platform module (TPM)
diff --combined arch/powerpc/Kconfig
@@@ -80,6 -80,7 +80,7 @@@ config ARCH_HAS_DMA_SET_COHERENT_MAS
  config PPC
        bool
        default y
+       select BUILDTIME_EXTABLE_SORT
        select ARCH_MIGHT_HAVE_PC_PARPORT
        select ARCH_MIGHT_HAVE_PC_SERIO
        select BINFMT_ELF
        select HAVE_LIVEPATCH if HAVE_DYNAMIC_FTRACE_WITH_REGS
        select GENERIC_CPU_AUTOPROBE
        select HAVE_VIRT_CPU_ACCOUNTING
 +      select ARCH_HAS_SCALED_CPUTIME if VIRT_CPU_ACCOUNTING_NATIVE
        select HAVE_ARCH_HARDENED_USERCOPY
        select HAVE_KERNEL_GZIP
+       select HAVE_CC_STACKPROTECTOR
  
  config GENERIC_CSUM
        def_bool CPU_LITTLE_ENDIAN
@@@ -396,6 -397,14 +398,14 @@@ config MPROFILE_KERNE
        depends on PPC64 && CPU_LITTLE_ENDIAN
        def_bool !DISABLE_MPROFILE_KERNEL
  
+ config USE_THIN_ARCHIVES
+       bool "Build the kernel using thin archives"
+       default n
+       select THIN_ARCHIVES
+       help
+         Build the kernel using thin archives.
+         If you're unsure say N.
  config IOMMU_HELPER
        def_bool PPC64
  
@@@ -456,6 -465,19 +466,19 @@@ config KEXE
          interface is strongly in flux, so no good recommendation can be
          made.
  
+ config KEXEC_FILE
+       bool "kexec file based system call"
+       select KEXEC_CORE
+       select BUILD_BIN2C
+       depends on PPC64
+       depends on CRYPTO=y
+       depends on CRYPTO_SHA256=y
+       help
+         This is a new version of the kexec system call. This call is
+         file based and takes in file descriptors as system call arguments
+         for kernel and initramfs as opposed to a list of segments as is the
+         case for the older kexec call.
  config RELOCATABLE
        bool "Build a relocatable kernel"
        depends on (PPC64 && !COMPILE_TEST) || (FLATMEM && (44x || FSL_BOOKE))
          setting can still be useful to bootwrappers that need to know the
          load address of the kernel (eg. u-boot/mkimage).
  
+ config RELOCATABLE_TEST
+       bool "Test relocatable kernel"
+       depends on (PPC64 && RELOCATABLE)
+       default n
+       help
+         This runs the relocatable kernel at the address it was initially
+         loaded at, which tends to be non-zero and therefore test the
+         relocation code.
  config CRASH_DUMP
        bool "Build a kdump crash kernel"
        depends on PPC64 || 6xx || FSL_BOOKE || (44x && !SMP)
  
  config FA_DUMP
        bool "Firmware-assisted dump"
-       depends on PPC64 && PPC_RTAS && CRASH_DUMP && KEXEC
+       depends on PPC64 && PPC_RTAS && CRASH_DUMP && KEXEC_CORE
        help
          A robust mechanism to get reliable kernel crash dump with
          assistance from firmware. This approach does not use kexec,
@@@ -549,6 -580,13 +581,13 @@@ config ARCH_SPARSEMEM_DEFAUL
  config SYS_SUPPORTS_HUGETLBFS
        bool
  
+ config ILLEGAL_POINTER_VALUE
+       hex
+       # This is roughly half way between the top of user space and the bottom
+       # of kernel space, which seems about as good as we can get.
+       default 0x5deadbeef0000000 if PPC64
+       default 0
  source "mm/Kconfig"
  
  config ARCH_MEMORY_PROBE
@@@ -100,8 -100,7 +100,8 @@@ src-wlib-y := string.S crt0.S crtsavres
                ns16550.c serial.c simple_alloc.c div64.S util.S \
                elf_util.c $(zlib-y) devtree.c stdlib.c \
                oflib.c ofconsole.c cuboot.c mpsc.c cpm-serial.c \
 -              uartlite.c mpc52xx-psc.c opal.c opal-calls.S
 +              uartlite.c mpc52xx-psc.c opal.c
 +src-wlib-$(CONFIG_PPC64_BOOT_WRAPPER) +=  opal-calls.S
  src-wlib-$(CONFIG_40x) += 4xx.c planetcore.c
  src-wlib-$(CONFIG_44x) += 4xx.c ebony.c bamboo.c
  src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c fsl-soc.c
@@@ -172,10 -171,6 +172,6 @@@ $(addprefix $(obj)/,$(libfdt) $(libfdth
  $(obj)/empty.c:
        $(Q)touch $@
  
- $(obj)/zImage.lds: $(obj)/%: $(srctree)/$(src)/%.S
-       $(CROSS32CC) $(cpp_flags) -E -Wp,-MD,$(depfile) -P -Upowerpc \
-               -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
  $(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds : $(obj)/%: $(srctree)/$(src)/%.S
        $(Q)cp $< $@
  
@@@ -357,17 -352,17 +353,17 @@@ $(addprefix $(obj)/, $(initrd-y)): $(ob
  # Don't put the ramdisk on the pattern rule; when its missing make will try
  # the pattern rule with less dependencies that also matches (even with the
  # hard dependency listed).
- $(obj)/zImage.initrd.%: vmlinux $(wrapperbits)
+ $(obj)/zImage.initrd.%: vmlinux $(wrapperbits) FORCE
        $(call if_changed,wrap,$*,,,$(obj)/ramdisk.image.gz)
  
- $(addprefix $(obj)/, $(sort $(filter zImage.%, $(image-y)))): vmlinux $(wrapperbits)
+ $(addprefix $(obj)/, $(sort $(filter zImage.%, $(image-y)))): vmlinux $(wrapperbits) FORCE
        $(call if_changed,wrap,$(subst $(obj)/zImage.,,$@))
  
  # dtbImage% - a dtbImage is a zImage with an embedded device tree blob
- $(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb
+ $(obj)/dtbImage.initrd.%: vmlinux $(wrapperbits) $(obj)/%.dtb FORCE
        $(call if_changed,wrap,$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
  
- $(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb
+ $(obj)/dtbImage.%: vmlinux $(wrapperbits) $(obj)/%.dtb FORCE
        $(call if_changed,wrap,$*,,$(obj)/$*.dtb)
  
  # This cannot be in the root of $(src) as the zImage rule always adds a $(obj)
  $(obj)/vmlinux.strip: vmlinux
        $(STRIP) -s -R .comment $< -o $@
  
- $(obj)/uImage: vmlinux $(wrapperbits)
+ $(obj)/uImage: vmlinux $(wrapperbits) FORCE
        $(call if_changed,wrap,uboot)
  
- $(obj)/uImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/uImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,uboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
  
- $(obj)/uImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/uImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,uboot-$*,,$(obj)/$*.dtb)
  
- $(obj)/cuImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/cuImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
  
- $(obj)/cuImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/cuImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,cuboot-$*,,$(obj)/$*.dtb)
  
- $(obj)/simpleImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/simpleImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
  
- $(obj)/simpleImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/simpleImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,simpleboot-$*,,$(obj)/$*.dtb)
  
- $(obj)/treeImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/treeImage.initrd.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb,$(obj)/ramdisk.image.gz)
  
- $(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits)
+ $(obj)/treeImage.%: vmlinux $(obj)/%.dtb $(wrapperbits) FORCE
        $(call if_changed,wrap,treeboot-$*,,$(obj)/$*.dtb)
  
  # Rule to build device tree blobs
   */
  
  #include <linux/threads.h>
- #include <linux/kprobes.h>
 +#include <asm/cacheflush.h>
 +#include <asm/checksum.h>
 +#include <asm/uaccess.h>
 +#include <asm/epapr_hcalls.h>
 +
  #include <uapi/asm/ucontext.h>
  
  /* SMP */
@@@ -113,12 -107,4 +112,12 @@@ void early_setup_secondary(void)
  /* time */
  void accumulate_stolen_time(void);
  
 +/* misc runtime */
 +extern u64 __bswapdi2(u64);
 +extern s64 __lshrdi3(s64, int);
 +extern s64 __ashldi3(s64, int);
 +extern s64 __ashrdi3(s64, int);
 +extern int __cmpdi2(s64, s64);
 +extern int __ucmpdi2(u64, u64);
 +
  #endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */
  #define _RPAGE_SW1            0x00800
  #define _RPAGE_SW2            0x00400
  #define _RPAGE_SW3            0x00200
+ #define _RPAGE_RSV1           0x1000000000000000UL
+ #define _RPAGE_RSV2           0x0800000000000000UL
+ #define _RPAGE_RSV3           0x0400000000000000UL
+ #define _RPAGE_RSV4           0x0200000000000000UL
  #ifdef CONFIG_MEM_SOFT_DIRTY
  #define _PAGE_SOFT_DIRTY      _RPAGE_SW3 /* software: software dirty tracking */
  #else
  #endif
  #define _PAGE_SPECIAL         _RPAGE_SW2 /* software: special page */
  
+ /*
+  * For P9 DD1 only, we need to track whether the pte's huge.
+  */
+ #define _PAGE_LARGE   _RPAGE_RSV1
  
  #define _PAGE_PTE             (1ul << 62)     /* distinguishes PTEs from pointers */
  #define _PAGE_PRESENT         (1ul << 63)     /* pte contains a translation */
@@@ -568,10 -578,11 +578,11 @@@ static inline bool check_pte_access(uns
   */
  
  static inline void __ptep_set_access_flags(struct mm_struct *mm,
-                                          pte_t *ptep, pte_t entry)
+                                          pte_t *ptep, pte_t entry,
+                                          unsigned long address)
  {
        if (radix_enabled())
-               return radix__ptep_set_access_flags(mm, ptep, entry);
+               return radix__ptep_set_access_flags(mm, ptep, entry, address);
        return hash__ptep_set_access_flags(ptep, entry);
  }
  
@@@ -789,9 -800,6 +800,6 @@@ extern struct page *pgd_page(pgd_t pgd)
  #define pgd_ERROR(e) \
        pr_err("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e))
  
- void pgtable_cache_add(unsigned shift, void (*ctor)(void *));
- void pgtable_cache_init(void);
  static inline int map_kernel_page(unsigned long ea, unsigned long pa,
                                  unsigned long flags)
  {
@@@ -1009,8 -1017,7 +1017,8 @@@ static inline void pmdp_huge_split_prep
  #define pmd_move_must_withdraw pmd_move_must_withdraw
  struct spinlock;
  static inline int pmd_move_must_withdraw(struct spinlock *new_pmd_ptl,
 -                                       struct spinlock *old_pmd_ptl)
 +                                       struct spinlock *old_pmd_ptl,
 +                                       struct vm_area_struct *vma)
  {
        if (radix_enabled())
                return false;
         */
        return true;
  }
 +
 +
 +#define arch_needs_pgtable_deposit arch_needs_pgtable_deposit
 +static inline bool arch_needs_pgtable_deposit(void)
 +{
 +      if (radix_enabled())
 +              return false;
 +      return true;
 +}
 +
  #endif /* CONFIG_TRANSPARENT_HUGEPAGE */
  #endif /* __ASSEMBLY__ */
  #endif /* _ASM_POWERPC_BOOK3S_64_PGTABLE_H_ */
   */
  
  /*
 + * Kernel read only support.
 + * We added the ppp value 0b110 in ISA 2.04.
 + */
 +#define MMU_FTR_KERNEL_RO             ASM_CONST(0x00004000)
 +
 +/*
   * We need to clear top 16bits of va (from the remaining 64 bits )in
   * tlbie* instructions
   */
  #define MMU_FTRS_POWER4               MMU_FTRS_DEFAULT_HPTE_ARCH_V2
  #define MMU_FTRS_PPC970               MMU_FTRS_POWER4 | MMU_FTR_TLBIE_CROP_VA
  #define MMU_FTRS_POWER5               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
 -#define MMU_FTRS_POWER6               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
 -#define MMU_FTRS_POWER7               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
 -#define MMU_FTRS_POWER8               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
 -#define MMU_FTRS_POWER9               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
 +#define MMU_FTRS_POWER6               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
 +#define MMU_FTRS_POWER7               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
 +#define MMU_FTRS_POWER8               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
 +#define MMU_FTRS_POWER9               MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
  #define MMU_FTRS_CELL         MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
                                MMU_FTR_CI_LARGE_PAGE
  #define MMU_FTRS_PA6T         MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
@@@ -275,19 -269,20 +275,20 @@@ static inline bool early_radix_enabled(
  #define MMU_PAGE_64K  2
  #define MMU_PAGE_64K_AP       3       /* "Admixed pages" (hash64 only) */
  #define MMU_PAGE_256K 4
- #define MMU_PAGE_1M   5
- #define MMU_PAGE_2M   6
- #define MMU_PAGE_4M   7
- #define MMU_PAGE_8M   8
- #define MMU_PAGE_16M  9
- #define MMU_PAGE_64M  10
- #define MMU_PAGE_256M 11
- #define MMU_PAGE_1G   12
- #define MMU_PAGE_16G  13
- #define MMU_PAGE_64G  14
+ #define MMU_PAGE_512K 5
+ #define MMU_PAGE_1M   6
+ #define MMU_PAGE_2M   7
+ #define MMU_PAGE_4M   8
+ #define MMU_PAGE_8M   9
+ #define MMU_PAGE_16M  10
+ #define MMU_PAGE_64M  11
+ #define MMU_PAGE_256M 12
+ #define MMU_PAGE_1G   13
+ #define MMU_PAGE_16G  14
+ #define MMU_PAGE_64G  15
  
  /* N.B. we need to change the type of hpte_page_sizes if this gets to be > 16 */
- #define MMU_PAGE_COUNT        15
+ #define MMU_PAGE_COUNT        16
  
  #ifdef CONFIG_PPC_BOOK3S_64
  #include <asm/book3s/64/mmu.h>
@@@ -312,8 -312,6 +312,6 @@@ struct thread_struct 
        unsigned long   mmcr2;
        unsigned        mmcr0;
        unsigned        used_ebb;
-       unsigned long   lmrr;
-       unsigned long   lmser;
  #endif
  };
  
@@@ -404,6 -402,8 +402,6 @@@ static inline unsigned long __pack_fe01
  #define cpu_relax()   barrier()
  #endif
  
 -#define cpu_relax_lowlatency() cpu_relax()
 -
  /* Check that a certain kernel stack pointer is valid in task_struct p */
  int validate_sp(unsigned long sp, struct task_struct *p,
                         unsigned long nbytes);
@@@ -91,6 -91,9 +91,9 @@@ int main(void
        DEFINE(TI_livepatch_sp, offsetof(struct thread_info, livepatch_sp));
  #endif
  
+ #ifdef CONFIG_CC_STACKPROTECTOR
+       DEFINE(TSK_STACK_CANARY, offsetof(struct task_struct, stack_canary));
+ #endif
        DEFINE(KSP, offsetof(struct thread_struct, ksp));
        DEFINE(PT_REGS, offsetof(struct thread_struct, regs));
  #ifdef CONFIG_BOOKE
  
        /* book3s */
  #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE
 +      DEFINE(KVM_TLB_SETS, offsetof(struct kvm, arch.tlb_sets));
        DEFINE(KVM_SDR1, offsetof(struct kvm, arch.sdr1));
        DEFINE(KVM_HOST_LPID, offsetof(struct kvm, arch.host_lpid));
        DEFINE(KVM_HOST_LPCR, offsetof(struct kvm, arch.host_lpcr));
        DEFINE(VCPU_TCSCR, offsetof(struct kvm_vcpu, arch.tcscr));
        DEFINE(VCPU_ACOP, offsetof(struct kvm_vcpu, arch.acop));
        DEFINE(VCPU_WORT, offsetof(struct kvm_vcpu, arch.wort));
 +      DEFINE(VCPU_TID, offsetof(struct kvm_vcpu, arch.tid));
 +      DEFINE(VCPU_PSSCR, offsetof(struct kvm_vcpu, arch.psscr));
        DEFINE(VCORE_ENTRY_EXIT, offsetof(struct kvmppc_vcore, entry_exit_map));
        DEFINE(VCORE_IN_GUEST, offsetof(struct kvmppc_vcore, in_guest));
        DEFINE(VCORE_NAPPING_THREADS, offsetof(struct kvmppc_vcore, napping_threads));
        DEFINE(VCPU_VRS_TM, offsetof(struct kvm_vcpu, arch.vr_tm.vr));
        DEFINE(VCPU_VRSAVE_TM, offsetof(struct kvm_vcpu, arch.vrsave_tm));
        DEFINE(VCPU_CR_TM, offsetof(struct kvm_vcpu, arch.cr_tm));
 +      DEFINE(VCPU_XER_TM, offsetof(struct kvm_vcpu, arch.xer_tm));
        DEFINE(VCPU_LR_TM, offsetof(struct kvm_vcpu, arch.lr_tm));
        DEFINE(VCPU_CTR_TM, offsetof(struct kvm_vcpu, arch.ctr_tm));
        DEFINE(VCPU_AMR_TM, offsetof(struct kvm_vcpu, arch.amr_tm));
@@@ -96,10 -96,11 +96,11 @@@ _GLOBAL(__setup_cpu_power9
        mtlr    r11
        beqlr
        li      r0,0
+       mtspr   SPRN_PSSCR,r0
        mtspr   SPRN_LPID,r0
        mfspr   r3,SPRN_LPCR
 -      ori     r3, r3, LPCR_PECEDH
 -      ori     r3, r3, LPCR_HVICE
 +      LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
 +      or      r3, r3, r4
        bl      __init_LPCR
        bl      __init_HFSCR
        bl      __init_tlb_power9
@@@ -116,10 -117,11 +117,11 @@@ _GLOBAL(__restore_cpu_power9
        mtlr    r11
        beqlr
        li      r0,0
+       mtspr   SPRN_PSSCR,r0
        mtspr   SPRN_LPID,r0
        mfspr   r3,SPRN_LPCR
 -      ori     r3, r3, LPCR_PECEDH
 -      ori     r3, r3, LPCR_HVICE
 +      LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
 +      or      r3, r3, r4
        bl      __init_LPCR
        bl      __init_HFSCR
        bl      __init_tlb_power9
@@@ -588,7 -588,7 +588,7 @@@ int eeh_pe_reset_and_recover(struct eeh
        eeh_pe_dev_traverse(pe, eeh_dev_save_state, NULL);
  
        /* Issue reset */
-       ret = eeh_reset_pe(pe);
+       ret = eeh_pe_reset_full(pe);
        if (ret) {
                eeh_pe_state_clear(pe, EEH_PE_RECOVERING);
                return ret;
@@@ -659,7 -659,7 +659,7 @@@ static int eeh_reset_device(struct eeh_
         * config accesses. So we prefer to block them. However, controlled
         * PCI config accesses initiated from EEH itself are allowed.
         */
-       rc = eeh_reset_pe(pe);
+       rc = eeh_pe_reset_full(pe);
        if (rc)
                return rc;
  
  
        /* Clear frozen state */
        rc = eeh_clear_pe_frozen_state(pe, false);
 -      if (rc)
 +      if (rc) {
 +              pci_unlock_rescan_remove();
                return rc;
 +      }
  
        /* Give the system 5 seconds to finish running the user-space
         * hotplug shutdown scripts, e.g. ifdown for ethernet.  Yes,
@@@ -734,7 -732,7 +734,7 @@@ static void eeh_handle_normal_event(str
  
        frozen_bus = eeh_pe_bus_get(pe);
        if (!frozen_bus) {
-               pr_err("%s: Cannot find PCI bus for PHB#%d-PE#%x\n",
+               pr_err("%s: Cannot find PCI bus for PHB#%x-PE#%x\n",
                        __func__, pe->phb->global_number, pe->addr);
                return;
        }
@@@ -878,7 -876,7 +878,7 @@@ excess_failures
         * are due to poorly seated PCI cards. Only 10% or so are
         * due to actual, failed cards.
         */
-       pr_err("EEH: PHB#%d-PE#%x has failed %d times in the\n"
+       pr_err("EEH: PHB#%x-PE#%x has failed %d times in the\n"
               "last hour and has been permanently disabled.\n"
               "Please try reseating or replacing it.\n",
                pe->phb->global_number, pe->addr,
        goto perm_error;
  
  hard_fail:
-       pr_err("EEH: Unable to recover from failure from PHB#%d-PE#%x.\n"
+       pr_err("EEH: Unable to recover from failure from PHB#%x-PE#%x.\n"
               "Please try reseating or replacing it\n",
                pe->phb->global_number, pe->addr);
  
@@@ -1000,7 -998,7 +1000,7 @@@ static void eeh_handle_special_event(vo
                                bus = eeh_pe_bus_get(phb_pe);
                                if (!bus) {
                                        pr_err("%s: Cannot find PCI bus for "
-                                              "PHB#%d-PE#%x\n",
+                                              "PHB#%x-PE#%x\n",
                                               __func__,
                                               pe->phb->global_number,
                                               pe->addr);
@@@ -116,9 -116,7 +116,9 @@@ EXC_VIRT_NONE(0x4000, 0x4100
  
  EXC_REAL_BEGIN(system_reset, 0x100, 0x200)
        SET_SCRATCH0(r13)
 -      EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD,
 +      GET_PACA(r13)
 +      clrrdi  r13,r13,1 /* Last bit of HSPRG0 is set if waking from winkle */
 +      EXCEPTION_PROLOG_PSERIES_PACA(PACA_EXGEN, system_reset_common, EXC_STD,
                                 IDLETEST, 0x100)
  
  EXC_REAL_END(system_reset, 0x100, 0x200)
@@@ -126,9 -124,6 +126,9 @@@ EXC_VIRT_NONE(0x4100, 0x4200
  
  #ifdef CONFIG_PPC_P7_NAP
  EXC_COMMON_BEGIN(system_reset_idle_common)
 +BEGIN_FTR_SECTION
 +      GET_PACA(r13) /* Restore HSPRG0 to get the winkle bit in r13 */
 +END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
        bl      pnv_restore_hyp_resource
  
        li      r0,PNV_THREAD_RUNNING
@@@ -174,7 -169,7 +174,7 @@@ EXC_REAL_BEGIN(machine_check, 0x200, 0x
        SET_SCRATCH0(r13)               /* save r13 */
        /*
         * Running native on arch 2.06 or later, we may wakeup from winkle
 -       * inside machine check. If yes, then last bit of HSPGR0 would be set
 +       * inside machine check. If yes, then last bit of HSPRG0 would be set
         * to 1. Hence clear it unconditionally.
         */
        GET_PACA(r13)
@@@ -393,7 -388,7 +393,7 @@@ EXC_COMMON_BEGIN(machine_check_handle_e
        /*
         * Go back to winkle. Please note that this thread was woken up in
         * machine check from winkle and have not restored the per-subcore
 -       * state. Hence before going back to winkle, set last bit of HSPGR0
 +       * state. Hence before going back to winkle, set last bit of HSPRG0
         * to 1. This will make sure that if this thread gets woken up
         * again at reset vector 0x100 then it will get chance to restore
         * the subcore state.
@@@ -1408,7 -1403,7 +1408,7 @@@ USE_TEXT_SECTION(
  /*
   * Hash table stuff
   */
-       .align  7
+       .balign IFETCH_ALIGN_BYTES
  do_hash_page:
  #ifdef CONFIG_PPC_STD_MMU_64
        andis.  r0,r4,0xa410            /* weird error? */
  #include <linux/kprobes.h>
  #include <linux/kdebug.h>
  
+ #ifdef CONFIG_CC_STACKPROTECTOR
+ #include <linux/stackprotector.h>
+ unsigned long __stack_chk_guard __read_mostly;
+ EXPORT_SYMBOL(__stack_chk_guard);
+ #endif
  /* Transactional Memory debug */
  #ifdef TM_DEBUG_SW
  #define TM_DEBUG(x...) printk(KERN_INFO x)
@@@ -1051,14 -1057,6 +1057,6 @@@ static inline void save_sprs(struct thr
                 */
                t->tar = mfspr(SPRN_TAR);
        }
-       if (cpu_has_feature(CPU_FTR_ARCH_300)) {
-               /* Conditionally save Load Monitor registers, if enabled */
-               if (t->fscr & FSCR_LM) {
-                       t->lmrr = mfspr(SPRN_LMRR);
-                       t->lmser = mfspr(SPRN_LMSER);
-               }
-       }
  #endif
  }
  
@@@ -1094,16 -1092,6 +1092,6 @@@ static inline void restore_sprs(struct 
                if (old_thread->tar != new_thread->tar)
                        mtspr(SPRN_TAR, new_thread->tar);
        }
-       if (cpu_has_feature(CPU_FTR_ARCH_300)) {
-               /* Conditionally restore Load Monitor registers, if enabled */
-               if (new_thread->fscr & FSCR_LM) {
-                       if (old_thread->lmrr != new_thread->lmrr)
-                               mtspr(SPRN_LMRR, new_thread->lmrr);
-                       if (old_thread->lmser != new_thread->lmser)
-                               mtspr(SPRN_LMSER, new_thread->lmser);
-               }
-       }
  #endif
  }
  
@@@ -1215,7 -1203,7 +1203,7 @@@ static void show_instructions(struct pt
                int instr;
  
                if (!(i % 8))
 -                      printk("\n");
 +                      pr_cont("\n");
  
  #if !defined(CONFIG_BOOKE)
                /* If executing with the IMMU off, adjust pc rather
  
                if (!__kernel_text_address(pc) ||
                     probe_kernel_address((unsigned int __user *)pc, instr)) {
 -                      printk(KERN_CONT "XXXXXXXX ");
 +                      pr_cont("XXXXXXXX ");
                } else {
                        if (regs->nip == pc)
 -                              printk(KERN_CONT "<%08x> ", instr);
 +                              pr_cont("<%08x> ", instr);
                        else
 -                              printk(KERN_CONT "%08x ", instr);
 +                              pr_cont("%08x ", instr);
                }
  
                pc += sizeof(int);
        }
  
 -      printk("\n");
 +      pr_cont("\n");
  }
  
  struct regbit {
@@@ -1282,7 -1270,7 +1270,7 @@@ static void print_bits(unsigned long va
  
        for (; bits->bit; ++bits)
                if (val & bits->bit) {
 -                      printk("%s%s", s, bits->name);
 +                      pr_cont("%s%s", s, bits->name);
                        s = sep;
                }
  }
@@@ -1305,9 -1293,9 +1293,9 @@@ static void print_tm_bits(unsigned lon
   *   T: Transactional (bit 34)
   */
        if (val & (MSR_TM | MSR_TS_S | MSR_TS_T)) {
 -              printk(",TM[");
 +              pr_cont(",TM[");
                print_bits(val, msr_tm_bits, "");
 -              printk("]");
 +              pr_cont("]");
        }
  }
  #else
@@@ -1316,10 -1304,10 +1304,10 @@@ static void print_tm_bits(unsigned lon
  
  static void print_msr_bits(unsigned long val)
  {
 -      printk("<");
 +      pr_cont("<");
        print_bits(val, msr_bits, ",");
        print_tm_bits(val);
 -      printk(">");
 +      pr_cont(">");
  }
  
  #ifdef CONFIG_PPC64
@@@ -1347,29 -1335,29 +1335,29 @@@ void show_regs(struct pt_regs * regs
        printk("  CR: %08lx  XER: %08lx\n", regs->ccr, regs->xer);
        trap = TRAP(regs);
        if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
 -              printk("CFAR: "REG" ", regs->orig_gpr3);
 +              pr_cont("CFAR: "REG" ", regs->orig_gpr3);
        if (trap == 0x200 || trap == 0x300 || trap == 0x600)
  #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
 -              printk("DEAR: "REG" ESR: "REG" ", regs->dar, regs->dsisr);
 +              pr_cont("DEAR: "REG" ESR: "REG" ", regs->dar, regs->dsisr);
  #else
 -              printk("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr);
 +              pr_cont("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr);
  #endif
  #ifdef CONFIG_PPC64
 -      printk("SOFTE: %ld ", regs->softe);
 +      pr_cont("SOFTE: %ld ", regs->softe);
  #endif
  #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
        if (MSR_TM_ACTIVE(regs->msr))
 -              printk("\nPACATMSCRATCH: %016llx ", get_paca()->tm_scratch);
 +              pr_cont("\nPACATMSCRATCH: %016llx ", get_paca()->tm_scratch);
  #endif
  
        for (i = 0;  i < 32;  i++) {
                if ((i % REGS_PER_LINE) == 0)
 -                      printk("\nGPR%02d: ", i);
 -              printk(REG " ", regs->gpr[i]);
 +                      pr_cont("\nGPR%02d: ", i);
 +              pr_cont(REG " ", regs->gpr[i]);
                if (i == LAST_VOLATILE && !FULL_REGS(regs))
                        break;
        }
 -      printk("\n");
 +      pr_cont("\n");
  #ifdef CONFIG_KALLSYMS
        /*
         * Lookup NIP late so we have the best change of getting the
@@@ -1900,14 -1888,14 +1888,14 @@@ void show_stack(struct task_struct *tsk
                        printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip);
  #ifdef CONFIG_FUNCTION_GRAPH_TRACER
                        if ((ip == rth) && curr_frame >= 0) {
 -                              printk(" (%pS)",
 +                              pr_cont(" (%pS)",
                                       (void *)current->ret_stack[curr_frame].ret);
                                curr_frame--;
                        }
  #endif
                        if (firstframe)
 -                              printk(" (unreliable)");
 -                      printk("\n");
 +                              pr_cont(" (unreliable)");
 +                      pr_cont("\n");
                }
                firstframe = 0;
  
@@@ -226,25 -226,17 +226,25 @@@ static void __init configure_exceptions
                if (firmware_has_feature(FW_FEATURE_OPAL))
                        opal_configure_cores();
  
 -              /* Enable AIL if supported, and we are in hypervisor mode */
 -              if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
 -                  early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
 -                      unsigned long lpcr = mfspr(SPRN_LPCR);
 -                      mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
 -              }
 +              /* AIL on native is done in cpu_ready_for_interrupts() */
        }
  }
  
  static void cpu_ready_for_interrupts(void)
  {
 +      /*
 +       * Enable AIL if supported, and we are in hypervisor mode. This
 +       * is called once for every processor.
 +       *
 +       * If we are not in hypervisor mode the job is done once for
 +       * the whole partition in configure_exceptions().
 +       */
 +      if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
 +          early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
 +              unsigned long lpcr = mfspr(SPRN_LPCR);
 +              mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
 +      }
 +
        /* Set IR and DR in PACA MSR */
        get_paca()->kernel_msr = MSR_KERNEL;
  }
@@@ -354,7 -346,7 +354,7 @@@ void early_setup_secondary(void
  
  #endif /* CONFIG_SMP */
  
- #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC)
+ #if defined(CONFIG_SMP) || defined(CONFIG_KEXEC_CORE)
  static bool use_spinloop(void)
  {
        if (!IS_ENABLED(CONFIG_PPC_BOOK3E))
@@@ -399,7 -391,7 +399,7 @@@ void smp_release_cpus(void
  
        DBG(" <- smp_release_cpus()\n");
  }
- #endif /* CONFIG_SMP || CONFIG_KEXEC */
+ #endif /* CONFIG_SMP || CONFIG_KEXEC_CORE */
  
  /*
   * Initialize some remaining members of the ppc64_caches and systemcfg
@@@ -159,7 -159,7 +159,7 @@@ redo
         * Allocate Partition table and process table for the
         * host.
         */
-       BUILD_BUG_ON_MSG((PRTB_SIZE_SHIFT > 23), "Process table size too large.");
+       BUILD_BUG_ON_MSG((PRTB_SIZE_SHIFT > 36), "Process table size too large.");
        process_tb = early_alloc_pgtable(1UL << PRTB_SIZE_SHIFT);
        /*
         * Fill in the process table.
@@@ -240,7 -240,7 +240,7 @@@ static int __init radix_dt_scan_page_si
                /* top 3 bit is AP encoding */
                shift = be32_to_cpu(prop[0]) & ~(0xe << 28);
                ap = be32_to_cpu(prop[0]) >> 29;
-               pr_info("Page size sift = %d AP=0x%x\n", shift, ap);
+               pr_info("Page size shift = %d AP=0x%x\n", shift, ap);
  
                idx = get_idx_from_shift(shift);
                if (idx < 0)
@@@ -312,6 -312,38 +312,38 @@@ static void update_hid_for_radix(void
                cpu_relax();
  }
  
+ static void radix_init_amor(void)
+ {
+       /*
+       * In HV mode, we init AMOR (Authority Mask Override Register) so that
+       * the hypervisor and guest can setup IAMR (Instruction Authority Mask
+       * Register), enable key 0 and set it to 1.
+       *
+       * AMOR = 0b1100 .... 0000 (Mask for key 0 is 11)
+       */
+       mtspr(SPRN_AMOR, (3ul << 62));
+ }
+ static void radix_init_iamr(void)
+ {
+       unsigned long iamr;
+       /*
+        * The IAMR should set to 0 on DD1.
+        */
+       if (cpu_has_feature(CPU_FTR_POWER9_DD1))
+               iamr = 0;
+       else
+               iamr = (1ul << 62);
+       /*
+        * Radix always uses key0 of the IAMR to determine if an access is
+        * allowed. We set bit 0 (IBM bit 1) of key0, to prevent instruction
+        * fetch.
+        */
+       mtspr(SPRN_IAMR, iamr);
+ }
  void __init radix__early_init_mmu(void)
  {
        unsigned long lpcr;
                lpcr = mfspr(SPRN_LPCR);
                mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR);
                radix_init_partition_table();
+               radix_init_amor();
        }
  
        memblock_set_current_limit(MEMBLOCK_ALLOC_ANYWHERE);
  
+       radix_init_iamr();
        radix_init_pgtable();
  }
  
@@@ -382,16 -416,14 +416,18 @@@ void radix__early_init_mmu_secondary(vo
         * update partition table control register and UPRT
         */
        if (!firmware_has_feature(FW_FEATURE_LPAR)) {
 +
 +              if (cpu_has_feature(CPU_FTR_POWER9_DD1))
 +                      update_hid_for_radix();
 +
                lpcr = mfspr(SPRN_LPCR);
                mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR);
  
                mtspr(SPRN_PTCR,
                      __pa(partition_tb) | (PATB_SIZE_SHIFT - 12));
+               radix_init_amor();
        }
+       radix_init_iamr();
  }
  
  void radix__mmu_cleanup_all(void)
@@@ -50,8 -50,6 +50,8 @@@ static inline void _tlbiel_pid(unsigne
        for (set = 0; set < POWER9_TLB_SETS_RADIX ; set++) {
                __tlbiel_pid(pid, set, ric);
        }
 +      if (cpu_has_feature(CPU_FTR_POWER9_DD1))
 +              asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
        return;
  }
  
@@@ -85,8 -83,6 +85,8 @@@ static inline void _tlbiel_va(unsigned 
        asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1)
                     : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
        asm volatile("ptesync": : :"memory");
 +      if (cpu_has_feature(CPU_FTR_POWER9_DD1))
 +              asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
  }
  
  static inline void _tlbie_va(unsigned long va, unsigned long pid,
@@@ -428,3 -424,21 +428,21 @@@ void radix__flush_tlb_all(void
                     : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(0) : "memory");
        asm volatile("eieio; tlbsync; ptesync": : :"memory");
  }
+ void radix__flush_tlb_pte_p9_dd1(unsigned long old_pte, struct mm_struct *mm,
+                                unsigned long address)
+ {
+       /*
+        * We track page size in pte only for DD1, So we can
+        * call this only on DD1.
+        */
+       if (!cpu_has_feature(CPU_FTR_POWER9_DD1)) {
+               VM_WARN_ON(1);
+               return;
+       }
+       if (old_pte & _PAGE_LARGE)
+               radix__flush_tlb_page_psize(mm, address, MMU_PAGE_2M);
+       else
+               radix__flush_tlb_page_psize(mm, address, mmu_virtual_psize);
+ }
@@@ -64,7 -64,6 +64,7 @@@ config XILINX_VIRTEX_GENERIC_BOAR
        default n
        select XILINX_VIRTEX_II_PRO
        select XILINX_VIRTEX_4_FX
 +      select XILINX_INTC
        help
          This option enables generic support for Xilinx Virtex based boards.
  
@@@ -103,18 -102,18 +103,18 @@@ config 405G
        bool
        select IBM405_ERR77
        select IBM405_ERR51
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_ZMII if IBM_EMAC
  
  config 405EX
        bool
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_RGMII
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_RGMII if IBM_EMAC
  
  config 405EZ
        bool
-       select IBM_EMAC_NO_FLOW_CTRL
-       select IBM_EMAC_MAL_CLR_ICINTSTAT
-       select IBM_EMAC_MAL_COMMON_ERR
+       select IBM_EMAC_NO_FLOW_CTRL if IBM_EMAC
+       select IBM_EMAC_MAL_CLR_ICINTSTAT if IBM_EMAC
+       select IBM_EMAC_MAL_COMMON_ERR if IBM_EMAC
  
  config XILINX_VIRTEX
        bool
@@@ -26,7 -26,7 +26,7 @@@ config BLUESTON
        select PCI_MSI
        select PPC4xx_MSI
        select PPC4xx_PCI_EXPRESS
-       select IBM_EMAC_RGMII
+       select IBM_EMAC_RGMII if IBM_EMAC
        help
          This option enables support for the APM APM821xx Evaluation board.
  
@@@ -125,8 -125,8 +125,8 @@@ config CANYONLAND
        select PPC4xx_PCI_EXPRESS
        select PCI_MSI
        select PPC4xx_MSI
-       select IBM_EMAC_RGMII
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_RGMII if IBM_EMAC
+       select IBM_EMAC_ZMII if IBM_EMAC
        help
          This option enables support for the AMCC PPC460EX evaluation board.
  
@@@ -138,8 -138,8 +138,8 @@@ config GLACIE
        select 460EX # Odd since it uses 460GT but the effects are the same
        select PCI
        select PPC4xx_PCI_EXPRESS
-       select IBM_EMAC_RGMII
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_RGMII if IBM_EMAC
+       select IBM_EMAC_ZMII if IBM_EMAC
        help
          This option enables support for the AMCC PPC460GT evaluation board.
  
@@@ -164,7 -164,7 +164,7 @@@ config EIGE
        select 460SX
        select PCI
        select PPC4xx_PCI_EXPRESS
-       select IBM_EMAC_RGMII
+       select IBM_EMAC_RGMII if IBM_EMAC
        help
          This option enables support for the AMCC PPC460SX evaluation board.
  
@@@ -213,7 -213,7 +213,7 @@@ config AKEBON
        select NETDEVICES
        select ETHERNET
        select NET_VENDOR_IBM
-       select IBM_EMAC_EMAC4
+       select IBM_EMAC_EMAC4 if IBM_EMAC
        select USB if USB_SUPPORT
        select USB_OHCI_HCD_PLATFORM if USB_OHCI_HCD
        select USB_EHCI_HCD_PLATFORM if USB_EHCI_HCD
@@@ -241,7 -241,6 +241,7 @@@ config XILINX_VIRTEX440_GENERIC_BOAR
        depends on 44x
        default n
        select XILINX_VIRTEX_5_FXT
 +      select XILINX_INTC
        help
          This option enables generic support for Xilinx Virtex based boards
          that use a 440 based processor in the Virtex 5 FXT FPGA architecture.
@@@ -291,54 -290,54 +291,54 @@@ config 440E
        bool
        select PPC_FPU
        select IBM440EP_ERR42
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_ZMII if IBM_EMAC
  
  config 440EPX
        bool
        select PPC_FPU
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_RGMII
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_RGMII if IBM_EMAC
+       select IBM_EMAC_ZMII if IBM_EMAC
        select USB_EHCI_BIG_ENDIAN_MMIO
        select USB_EHCI_BIG_ENDIAN_DESC
  
  config 440GRX
        bool
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_RGMII
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_RGMII if IBM_EMAC
+       select IBM_EMAC_ZMII if IBM_EMAC
  
  config 440GP
        bool
-       select IBM_EMAC_ZMII
+       select IBM_EMAC_ZMII if IBM_EMAC
  
  config 440GX
        bool
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_RGMII
-       select IBM_EMAC_ZMII #test only
-       select IBM_EMAC_TAH  #test only
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_RGMII if IBM_EMAC
+       select IBM_EMAC_ZMII if IBM_EMAC #test only
+       select IBM_EMAC_TAH if IBM_EMAC  #test only
  
  config 440SP
        bool
  
  config 440SPe
        bool
-       select IBM_EMAC_EMAC4
+       select IBM_EMAC_EMAC4 if IBM_EMAC
  
  config 460EX
        bool
        select PPC_FPU
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_TAH
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_TAH if IBM_EMAC
  
  config 460SX
        bool
        select PPC_FPU
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_RGMII
-       select IBM_EMAC_ZMII
-       select IBM_EMAC_TAH
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_RGMII if IBM_EMAC
+       select IBM_EMAC_ZMII if IBM_EMAC
+       select IBM_EMAC_TAH if IBM_EMAC
  
  config 476FPE
        bool
  config APM821xx
        bool
        select PPC_FPU
-       select IBM_EMAC_EMAC4
-       select IBM_EMAC_TAH
+       select IBM_EMAC_EMAC4 if IBM_EMAC
+       select IBM_EMAC_TAH if IBM_EMAC
  
  config 476FPE_ERR46
        depends on 476FPE
@@@ -221,7 -221,7 +221,7 @@@ static long pSeries_lpar_hpte_remove(un
        return -1;
  }
  
- static void pSeries_lpar_hptab_clear(void)
+ static void manual_hpte_clear_all(void)
  {
        unsigned long size_bytes = 1UL << ppc64_pft_size;
        unsigned long hpte_count = size_bytes >> 4;
                                        &(ptes[j].pteh), &(ptes[j].ptel));
                }
        }
+ }
+ static int hcall_hpte_clear_all(void)
+ {
+       int rc;
+       do {
+               rc = plpar_hcall_norets(H_CLEAR_HPT);
+       } while (rc == H_CONTINUE);
+       return rc;
+ }
+ static void pseries_hpte_clear_all(void)
+ {
+       int rc;
+       rc = hcall_hpte_clear_all();
+       if (rc != H_SUCCESS)
+               manual_hpte_clear_all();
  
  #ifdef __LITTLE_ENDIAN__
        /*
@@@ -598,7 -618,7 +618,7 @@@ void __init hpte_init_pseries(void
        mmu_hash_ops.hpte_remove         = pSeries_lpar_hpte_remove;
        mmu_hash_ops.hpte_removebolted   = pSeries_lpar_hpte_removebolted;
        mmu_hash_ops.flush_hash_range    = pSeries_lpar_flush_hash_range;
-       mmu_hash_ops.hpte_clear_all      = pSeries_lpar_hptab_clear;
+       mmu_hash_ops.hpte_clear_all      = pseries_hpte_clear_all;
        mmu_hash_ops.hugepage_invalidate = pSeries_lpar_hugepage_invalidate;
  }
  
@@@ -661,10 -681,9 +681,10 @@@ EXPORT_SYMBOL(arch_free_page)
  #ifdef HAVE_JUMP_LABEL
  struct static_key hcall_tracepoint_key = STATIC_KEY_INIT;
  
 -void hcall_tracepoint_regfunc(void)
 +int hcall_tracepoint_regfunc(void)
  {
        static_key_slow_inc(&hcall_tracepoint_key);
 +      return 0;
  }
  
  void hcall_tracepoint_unregfunc(void)
  /* NB: reg/unreg are called while guarded with the tracepoints_mutex */
  extern long hcall_tracepoint_refcount;
  
 -void hcall_tracepoint_regfunc(void)
 +int hcall_tracepoint_regfunc(void)
  {
        hcall_tracepoint_refcount++;
 +      return 0;
  }
  
  void hcall_tracepoint_unregfunc(void)
@@@ -34,8 -34,7 +34,7 @@@ struct cxl_context *cxl_context_alloc(v
  /*
   * Initialises a CXL context.
   */
- int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master,
-                    struct address_space *mapping)
+ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master)
  {
        int i;
  
@@@ -44,7 -43,7 +43,7 @@@
        ctx->master = master;
        ctx->pid = ctx->glpid = NULL; /* Set in start work ioctl */
        mutex_init(&ctx->mapping_lock);
-       ctx->mapping = mapping;
+       ctx->mapping = NULL;
  
        /*
         * Allocate the segment table before we put it in the IDR so that we
        return 0;
  }
  
+ void cxl_context_set_mapping(struct cxl_context *ctx,
+                       struct address_space *mapping)
+ {
+       mutex_lock(&ctx->mapping_lock);
+       ctx->mapping = mapping;
+       mutex_unlock(&ctx->mapping_lock);
+ }
  static int cxl_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
  {
        struct cxl_context *ctx = vma->vm_file->private_data;
 -      unsigned long address = (unsigned long)vmf->virtual_address;
        u64 area, offset;
  
        offset = vmf->pgoff << PAGE_SHIFT;
  
        pr_devel("%s: pe: %i address: 0x%lx offset: 0x%llx\n",
 -                      __func__, ctx->pe, address, offset);
 +                      __func__, ctx->pe, vmf->address, offset);
  
        if (ctx->afu->current_mode == CXL_MODE_DEDICATED) {
                area = ctx->afu->psn_phys;
                return VM_FAULT_SIGBUS;
        }
  
 -      vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT);
 +      vm_insert_pfn(vma, vmf->address, (area + offset) >> PAGE_SHIFT);
  
        mutex_unlock(&ctx->status_mutex);
  
@@@ -299,8 -307,6 +306,6 @@@ static void reclaim_ctx(struct rcu_hea
        if (ctx->ff_page)
                __free_page(ctx->ff_page);
        ctx->sstp = NULL;
-       if (ctx->kernelapi)
-               kfree(ctx->mapping);
  
        kfree(ctx->irq_bitmap);
  
  
  void cxl_context_free(struct cxl_context *ctx)
  {
+       if (ctx->kernelapi && ctx->mapping)
+               cxl_release_mapping(ctx);
        mutex_lock(&ctx->afu->contexts_lock);
        idr_remove(&ctx->afu->contexts_idr, ctx->pe);
        mutex_unlock(&ctx->afu->contexts_lock);
@@@ -53,38 -53,58 +53,38 @@@ static struct bman_portal *init_pcfg(st
        return p;
  }
  
 -static void bman_offline_cpu(unsigned int cpu)
 +static int bman_offline_cpu(unsigned int cpu)
  {
        struct bman_portal *p = affine_bportals[cpu];
        const struct bm_portal_config *pcfg;
  
        if (!p)
 -              return;
 +              return 0;
  
        pcfg = bman_get_bm_portal_config(p);
        if (!pcfg)
 -              return;
 +              return 0;
  
        irq_set_affinity(pcfg->irq, cpumask_of(0));
 +      return 0;
  }
  
 -static void bman_online_cpu(unsigned int cpu)
 +static int bman_online_cpu(unsigned int cpu)
  {
        struct bman_portal *p = affine_bportals[cpu];
        const struct bm_portal_config *pcfg;
  
        if (!p)
 -              return;
 +              return 0;
  
        pcfg = bman_get_bm_portal_config(p);
        if (!pcfg)
 -              return;
 +              return 0;
  
        irq_set_affinity(pcfg->irq, cpumask_of(cpu));
 +      return 0;
  }
  
 -static int bman_hotplug_cpu_callback(struct notifier_block *nfb,
 -                                   unsigned long action, void *hcpu)
 -{
 -      unsigned int cpu = (unsigned long)hcpu;
 -
 -      switch (action) {
 -      case CPU_ONLINE:
 -      case CPU_ONLINE_FROZEN:
 -              bman_online_cpu(cpu);
 -              break;
 -      case CPU_DOWN_PREPARE:
 -      case CPU_DOWN_PREPARE_FROZEN:
 -              bman_offline_cpu(cpu);
 -      }
 -
 -      return NOTIFY_OK;
 -}
 -
 -static struct notifier_block bman_hotplug_cpu_notifier = {
 -      .notifier_call = bman_hotplug_cpu_callback,
 -};
 -
  static int bman_portal_probe(struct platform_device *pdev)
  {
        struct device *dev = &pdev->dev;
        pcfg->irq = irq;
  
        va = ioremap_prot(addr_phys[0]->start, resource_size(addr_phys[0]), 0);
-       if (!va)
+       if (!va) {
+               dev_err(dev, "ioremap::CE failed\n");
                goto err_ioremap1;
+       }
  
        pcfg->addr_virt[DPAA_PORTAL_CE] = va;
  
        va = ioremap_prot(addr_phys[1]->start, resource_size(addr_phys[1]),
                          _PAGE_GUARDED | _PAGE_NO_CACHE);
-       if (!va)
+       if (!va) {
+               dev_err(dev, "ioremap::CI failed\n");
                goto err_ioremap2;
+       }
  
        pcfg->addr_virt[DPAA_PORTAL_CI] = va;
  
        spin_unlock(&bman_lock);
        pcfg->cpu = cpu;
  
-       if (!init_pcfg(pcfg))
-               goto err_ioremap2;
+       if (!init_pcfg(pcfg)) {
+               dev_err(dev, "portal init failed\n");
+               goto err_portal_init;
+       }
  
        /* clear irq affinity if assigned cpu is offline */
        if (!cpu_online(cpu))
  
        return 0;
  
+ err_portal_init:
+       iounmap(pcfg->addr_virt[DPAA_PORTAL_CI]);
  err_ioremap2:
        iounmap(pcfg->addr_virt[DPAA_PORTAL_CE]);
  err_ioremap1:
-       dev_err(dev, "ioremap failed\n");
        return -ENXIO;
  }
  
@@@ -190,14 -217,8 +197,14 @@@ static int __init bman_portal_driver_re
        if (ret < 0)
                return ret;
  
 -      register_hotcpu_notifier(&bman_hotplug_cpu_notifier);
 -
 +      ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
 +                                      "soc/qbman_portal:online",
 +                                      bman_online_cpu, bman_offline_cpu);
 +      if (ret < 0) {
 +              pr_err("bman: failed to register hotplug callbacks.\n");
 +              platform_driver_unregister(drv);
 +              return ret;
 +      }
        return 0;
  }
  
@@@ -30,6 -30,9 +30,9 @@@
  
  #include "qman_priv.h"
  
+ struct qman_portal *qman_dma_portal;
+ EXPORT_SYMBOL(qman_dma_portal);
  /* Enable portal interupts (as opposed to polling mode) */
  #define CONFIG_FSL_DPA_PIRQ_SLOW  1
  #define CONFIG_FSL_DPA_PIRQ_FAST  1
@@@ -150,6 -153,10 +153,10 @@@ static struct qman_portal *init_pcfg(st
                /* all assigned portals are initialized now */
                qman_init_cgr_all();
        }
+       if (!qman_dma_portal)
+               qman_dma_portal = p;
        spin_unlock(&qman_lock);
  
        dev_info(pcfg->dev, "Portal initialised, cpu %d\n", pcfg->cpu);
@@@ -179,7 -186,7 +186,7 @@@ static void qman_portal_update_sdest(co
        qman_set_sdest(pcfg->channel, cpu);
  }
  
 -static void qman_offline_cpu(unsigned int cpu)
 +static int qman_offline_cpu(unsigned int cpu)
  {
        struct qman_portal *p;
        const struct qm_portal_config *pcfg;
                        qman_portal_update_sdest(pcfg, 0);
                }
        }
 +      return 0;
  }
  
 -static void qman_online_cpu(unsigned int cpu)
 +static int qman_online_cpu(unsigned int cpu)
  {
        struct qman_portal *p;
        const struct qm_portal_config *pcfg;
                        qman_portal_update_sdest(pcfg, cpu);
                }
        }
 +      return 0;
  }
  
 -static int qman_hotplug_cpu_callback(struct notifier_block *nfb,
 -                                   unsigned long action, void *hcpu)
 -{
 -      unsigned int cpu = (unsigned long)hcpu;
 -
 -      switch (action) {
 -      case CPU_ONLINE:
 -      case CPU_ONLINE_FROZEN:
 -              qman_online_cpu(cpu);
 -              break;
 -      case CPU_DOWN_PREPARE:
 -      case CPU_DOWN_PREPARE_FROZEN:
 -              qman_offline_cpu(cpu);
 -      default:
 -              break;
 -      }
 -      return NOTIFY_OK;
 -}
 -
 -static struct notifier_block qman_hotplug_cpu_notifier = {
 -      .notifier_call = qman_hotplug_cpu_callback,
 -};
 -
  static int qman_portal_probe(struct platform_device *pdev)
  {
        struct device *dev = &pdev->dev;
        struct device_node *node = dev->of_node;
        struct qm_portal_config *pcfg;
        struct resource *addr_phys[2];
-       const u32 *channel;
        void __iomem *va;
-       int irq, len, cpu;
+       int irq, cpu, err;
+       u32 val;
  
        pcfg = devm_kmalloc(dev, sizeof(*pcfg), GFP_KERNEL);
        if (!pcfg)
                return -ENXIO;
        }
  
-       channel = of_get_property(node, "cell-index", &len);
-       if (!channel || (len != 4)) {
+       err = of_property_read_u32(node, "cell-index", &val);
+       if (err) {
                dev_err(dev, "Can't get %s property 'cell-index'\n",
                        node->full_name);
-               return -ENXIO;
+               return err;
        }
-       pcfg->channel = *channel;
+       pcfg->channel = val;
        pcfg->cpu = -1;
        irq = platform_get_irq(pdev, 0);
        if (irq <= 0) {
        pcfg->irq = irq;
  
        va = ioremap_prot(addr_phys[0]->start, resource_size(addr_phys[0]), 0);
-       if (!va)
+       if (!va) {
+               dev_err(dev, "ioremap::CE failed\n");
                goto err_ioremap1;
+       }
  
        pcfg->addr_virt[DPAA_PORTAL_CE] = va;
  
        va = ioremap_prot(addr_phys[1]->start, resource_size(addr_phys[1]),
                          _PAGE_GUARDED | _PAGE_NO_CACHE);
-       if (!va)
+       if (!va) {
+               dev_err(dev, "ioremap::CI failed\n");
                goto err_ioremap2;
+       }
  
        pcfg->addr_virt[DPAA_PORTAL_CI] = va;
  
        spin_unlock(&qman_lock);
        pcfg->cpu = cpu;
  
-       if (!init_pcfg(pcfg))
-               goto err_ioremap2;
+       if (dma_set_mask(dev, DMA_BIT_MASK(40))) {
+               dev_err(dev, "dma_set_mask() failed\n");
+               goto err_portal_init;
+       }
+       if (!init_pcfg(pcfg)) {
+               dev_err(dev, "portal init failed\n");
+               goto err_portal_init;
+       }
  
        /* clear irq affinity if assigned cpu is offline */
        if (!cpu_online(cpu))
  
        return 0;
  
+ err_portal_init:
+       iounmap(pcfg->addr_virt[DPAA_PORTAL_CI]);
  err_ioremap2:
        iounmap(pcfg->addr_virt[DPAA_PORTAL_CE]);
  err_ioremap1:
-       dev_err(dev, "ioremap failed\n");
        return -ENXIO;
  }
  
@@@ -325,14 -365,8 +344,14 @@@ static int __init qman_portal_driver_re
        if (ret < 0)
                return ret;
  
 -      register_hotcpu_notifier(&qman_hotplug_cpu_notifier);
 -
 +      ret = cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN,
 +                                      "soc/qman_portal:online",
 +                                      qman_online_cpu, qman_offline_cpu);
 +      if (ret < 0) {
 +              pr_err("qman: failed to register hotplug callbacks.\n");
 +              platform_driver_unregister(drv);
 +              return ret;
 +      }
        return 0;
  }
  
diff --combined include/linux/kexec.h
@@@ -148,7 -148,36 +148,36 @@@ struct kexec_file_ops 
        kexec_verify_sig_t *verify_sig;
  #endif
  };
- #endif
+ /**
+  * struct kexec_buf - parameters for finding a place for a buffer in memory
+  * @image:    kexec image in which memory to search.
+  * @buffer:   Contents which will be copied to the allocated memory.
+  * @bufsz:    Size of @buffer.
+  * @mem:      On return will have address of the buffer in memory.
+  * @memsz:    Size for the buffer in memory.
+  * @buf_align:        Minimum alignment needed.
+  * @buf_min:  The buffer can't be placed below this address.
+  * @buf_max:  The buffer can't be placed above this address.
+  * @top_down: Allocate from top of memory.
+  */
+ struct kexec_buf {
+       struct kimage *image;
+       void *buffer;
+       unsigned long bufsz;
+       unsigned long mem;
+       unsigned long memsz;
+       unsigned long buf_align;
+       unsigned long buf_min;
+       unsigned long buf_max;
+       bool top_down;
+ };
+ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf,
+                              int (*func)(u64, u64, void *));
+ extern int kexec_add_buffer(struct kexec_buf *kbuf);
+ int kexec_locate_mem_hole(struct kexec_buf *kbuf);
+ #endif /* CONFIG_KEXEC_FILE */
  
  struct kimage {
        kimage_entry_t head;
@@@ -212,11 -241,6 +241,6 @@@ extern asmlinkage long sys_kexec_load(u
                                        struct kexec_segment __user *segments,
                                        unsigned long flags);
  extern int kernel_kexec(void);
- extern int kexec_add_buffer(struct kimage *image, char *buffer,
-                           unsigned long bufsz, unsigned long memsz,
-                           unsigned long buf_align, unsigned long buf_min,
-                           unsigned long buf_max, bool top_down,
-                           unsigned long *load_addr);
  extern struct page *kimage_alloc_control_pages(struct kimage *image,
                                                unsigned int order);
  extern int kexec_load_purgatory(struct kimage *image, unsigned long min,
@@@ -259,6 -283,12 +283,6 @@@ phys_addr_t paddr_vmcoreinfo_note(void)
        vmcoreinfo_append_str("NUMBER(%s)=%ld\n", #name, (long)name)
  #define VMCOREINFO_CONFIG(name) \
        vmcoreinfo_append_str("CONFIG_%s=y\n", #name)
 -#define VMCOREINFO_PAGE_OFFSET(value) \
 -      vmcoreinfo_append_str("PAGE_OFFSET=%lx\n", (unsigned long)value)
 -#define VMCOREINFO_VMALLOC_START(value) \
 -      vmcoreinfo_append_str("VMALLOC_START=%lx\n", (unsigned long)value)
 -#define VMCOREINFO_VMEMMAP_START(value) \
 -      vmcoreinfo_append_str("VMEMMAP_START=%lx\n", (unsigned long)value)
  
  extern struct kimage *kexec_image;
  extern struct kimage *kexec_crash_image;