]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge tag 'pci-v4.12-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaa...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 May 2017 02:03:25 +0000 (19:03 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 May 2017 02:03:25 +0000 (19:03 -0700)
Pull PCI updates from Bjorn Helgaas:

 - add framework for supporting PCIe devices in Endpoint mode (Kishon
   Vijay Abraham I)

 - use non-postable PCI config space mappings when possible (Lorenzo
   Pieralisi)

 - clean up and unify mmap of PCI BARs (David Woodhouse)

 - export and unify Function Level Reset support (Christoph Hellwig)

 - avoid FLR for Intel 82579 NICs (Sasha Neftin)

 - add pci_request_irq() and pci_free_irq() helpers (Christoph Hellwig)

 - short-circuit config access failures for disconnected devices (Keith
   Busch)

 - remove D3 sleep delay when possible (Adrian Hunter)

 - freeze PME scan before suspending devices (Lukas Wunner)

 - stop disabling MSI/MSI-X in pci_device_shutdown() (Prarit Bhargava)

 - disable boot interrupt quirk for ASUS M2N-LR (Stefan Assmann)

 - add arch-specific alignment control to improve device passthrough by
   avoiding multiple BARs in a page (Yongji Xie)

 - add sysfs sriov_drivers_autoprobe to control VF driver binding
   (Bodong Wang)

 - allow slots below PCI-to-PCIe "reverse bridges" (Bjorn Helgaas)

 - fix crashes when unbinding host controllers that don't support
   removal (Brian Norris)

 - add driver for MicroSemi Switchtec management interface (Logan
   Gunthorpe)

 - add driver for Faraday Technology FTPCI100 host bridge (Linus
   Walleij)

 - add i.MX7D support (Andrey Smirnov)

 - use generic MSI support for Aardvark (Thomas Petazzoni)

 - make Rockchip driver modular (Brian Norris)

 - advertise 128-byte Read Completion Boundary support for Rockchip
   (Shawn Lin)

 - advertise PCI_EXP_LNKSTA_SLC for Rockchip root port (Shawn Lin)

 - convert atomic_t to refcount_t in HV driver (Elena Reshetova)

 - add CPU IRQ affinity in HV driver (K. Y. Srinivasan)

 - fix PCI bus removal in HV driver (Long Li)

 - add support for ThunderX2 DMA alias topology (Jayachandran C)

 - add ThunderX pass2.x 2nd node MCFG quirk (Tomasz Nowicki)

 - add ITE 8893 bridge DMA alias quirk (Jarod Wilson)

 - restrict Cavium ACS quirk only to CN81xx/CN83xx/CN88xx devices
   (Manish Jaggi)

* tag 'pci-v4.12-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (146 commits)
  PCI: Don't allow unbinding host controllers that aren't prepared
  ARM: DRA7: clockdomain: Change the CLKTRCTRL of CM_PCIE_CLKSTCTRL to SW_WKUP
  MAINTAINERS: Add PCI Endpoint maintainer
  Documentation: PCI: Add userguide for PCI endpoint test function
  tools: PCI: Add sample test script to invoke pcitest
  tools: PCI: Add a userspace tool to test PCI endpoint
  Documentation: misc-devices: Add Documentation for pci-endpoint-test driver
  misc: Add host side PCI driver for PCI test function device
  PCI: Add device IDs for DRA74x and DRA72x
  dt-bindings: PCI: dra7xx: Add DT bindings to enable unaligned access
  PCI: dwc: dra7xx: Workaround for errata id i870
  dt-bindings: PCI: dra7xx: Add DT bindings for PCI dra7xx EP mode
  PCI: dwc: dra7xx: Add EP mode support
  PCI: dwc: dra7xx: Facilitate wrapper and MSI interrupts to be enabled independently
  dt-bindings: PCI: Add DT bindings for PCI designware EP mode
  PCI: dwc: designware: Add EP mode support
  Documentation: PCI: Add binding documentation for pci-test endpoint function
  ixgbe: Use pcie_flr() instead of duplicating it
  IB/hfi1: Use pcie_flr() instead of duplicating it
  PCI: imx6: Fix spelling mistake: "contol" -> "control"
  ...

23 files changed:
1  2 
Documentation/ABI/testing/sysfs-bus-pci
Documentation/ioctl/ioctl-number.txt
MAINTAINERS
arch/arm/mm/nommu.c
arch/powerpc/platforms/powernv/pci-ioda.c
arch/x86/pci/i386.c
drivers/Makefile
drivers/infiniband/hw/hfi1/chip.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/pcie.c
drivers/misc/Kconfig
drivers/misc/Makefile
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/nvme/host/pci.c
drivers/pci/dwc/pcie-hisi.c
drivers/pci/irq.c
drivers/pci/msi.c
drivers/pci/pci.h
drivers/pci/probe.c
include/linux/pci.h
include/uapi/linux/Kbuild
include/uapi/linux/pci_regs.h
kernel/irq/manage.c

index e4e90104d7c38ff89bae718df7485337ee3e9108,b728f700340d0021c2f3a562e49dacdeac5fb02b..44d4b2be92fd4a56ab2420944f76669a2466a304
@@@ -299,5 -299,27 +299,27 @@@ What:            /sys/bus/pci/devices/.../revisio
  Date:         November 2016
  Contact:      Emil Velikov <emil.l.velikov@gmail.com>
  Description:
 -              This file contains the revision field of the the PCI device.
 +              This file contains the revision field of the PCI device.
                The value comes from device config space. The file is read only.
+ What:         /sys/bus/pci/devices/.../sriov_drivers_autoprobe
+ Date:         April 2017
+ Contact:      Bodong Wang<bodong@mellanox.com>
+ Description:
+               This file is associated with the PF of a device that
+               supports SR-IOV.  It determines whether newly-enabled VFs
+               are immediately bound to a driver.  It initially contains
+               1, which means the kernel automatically binds VFs to a
+               compatible driver immediately after they are enabled.  If
+               an application writes 0 to the file before enabling VFs,
+               the kernel will not bind VFs to a driver.
+               A typical use case is to write 0 to this file, then enable
+               VFs, then assign the newly-created VFs to virtual machines.
+               Note that changing this file does not affect already-
+               enabled VFs.  In this scenario, the user must first disable
+               the VFs, write 0 to sriov_drivers_autoprobe, then re-enable
+               the VFs.
+               This is similar to /sys/bus/pci/drivers_autoprobe, but
+               affects only the VFs associated with a specific PF.
Simple merge
diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 39d1acb2745263d361306e0aeb9672e6d68ce310,527b115c4e232b165be1d4b801f6e0cd70e598ec..2cba76e6fa3cb0bd8b2148bdd472c44f5abaf0d7
@@@ -482,14 -492,292 +482,21 @@@ config VEXPRESS_SYSCF
          bus. System Configuration interface is one of the possible means
          of generating transactions on this bus.
  
 -config PANEL
 -      tristate "Parallel port LCD/Keypad Panel support"
 -      depends on PARPORT
 -      ---help---
 -        Say Y here if you have an HD44780 or KS-0074 LCD connected to your
 -        parallel port. This driver also features 4 and 6-key keypads. The LCD
 -        is accessible through the /dev/lcd char device (10, 156), and the
 -        keypad through /dev/keypad (10, 185). This code can either be
 -        compiled as a module, or linked into the kernel and started at boot.
 -        If you don't understand what all this is about, say N.
 -
 -if PANEL
 -
 -config PANEL_PARPORT
 -      int "Default parallel port number (0=LPT1)"
 -      range 0 255
 -      default "0"
 -      ---help---
 -        This is the index of the parallel port the panel is connected to. One
 -        driver instance only supports one parallel port, so if your keypad
 -        and LCD are connected to two separate ports, you have to start two
 -        modules with different arguments. Numbering starts with '0' for LPT1,
 -        and so on.
 -
 -config PANEL_PROFILE
 -      int "Default panel profile (0-5, 0=custom)"
 -      range 0 5
 -      default "5"
 -      ---help---
 -        To ease configuration, the driver supports different configuration
 -        profiles for past and recent wirings. These profiles can also be
 -        used to define an approximative configuration, completed by a few
 -        other options. Here are the profiles :
 -
 -          0 = custom (see further)
 -          1 = 2x16 parallel LCD, old keypad
 -          2 = 2x16 serial LCD (KS-0074), new keypad
 -          3 = 2x16 parallel LCD (Hantronix), no keypad
 -          4 = 2x16 parallel LCD (Nexcom NSA1045) with Nexcom's keypad
 -          5 = 2x40 parallel LCD (old one), with old keypad
 -
 -        Custom configurations allow you to define how your display is
 -        wired to the parallel port, and how it works. This is only intended
 -        for experts.
 -
 -config PANEL_KEYPAD
 -      depends on PANEL_PROFILE="0"
 -      int "Keypad type (0=none, 1=old 6 keys, 2=new 6 keys, 3=Nexcom 4 keys)"
 -      range 0 3
 -      default 0
 -      ---help---
 -        This enables and configures a keypad connected to the parallel port.
 -        The keys will be read from character device 10,185. Valid values are :
 -
 -          0 : do not enable this driver
 -          1 : old 6 keys keypad
 -          2 : new 6 keys keypad, as used on the server at www.ant-computing.com
 -          3 : Nexcom NSA1045's 4 keys keypad
 -
 -        New profiles can be described in the driver source. The driver also
 -        supports simultaneous keys pressed when the keypad supports them.
 -
 -config PANEL_LCD
 -      depends on PANEL_PROFILE="0"
 -      int "LCD type (0=none, 1=custom, 2=old //, 3=ks0074, 4=hantronix, 5=Nexcom)"
 -      range 0 5
 -      default 0
 -      ---help---
 -         This enables and configures an LCD connected to the parallel port.
 -         The driver includes an interpreter for escape codes starting with
 -         '\e[L' which are specific to the LCD, and a few ANSI codes. The
 -         driver will be registered as character device 10,156, usually
 -         under the name '/dev/lcd'. There are a total of 6 supported types :
 -
 -           0 : do not enable the driver
 -           1 : custom configuration and wiring (see further)
 -           2 : 2x16 & 2x40 parallel LCD (old wiring)
 -           3 : 2x16 serial LCD (KS-0074 based)
 -           4 : 2x16 parallel LCD (Hantronix wiring)
 -           5 : 2x16 parallel LCD (Nexcom wiring)
 -
 -         When type '1' is specified, other options will appear to configure
 -         more precise aspects (wiring, dimensions, protocol, ...). Please note
 -         that those values changed from the 2.4 driver for better consistency.
 -
 -config PANEL_LCD_HEIGHT
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -      int "Number of lines on the LCD (1-2)"
 -      range 1 2
 -      default 2
 -      ---help---
 -        This is the number of visible character lines on the LCD in custom profile.
 -        It can either be 1 or 2.
 -
 -config PANEL_LCD_WIDTH
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -      int "Number of characters per line on the LCD (1-40)"
 -      range 1 40
 -      default 40
 -      ---help---
 -        This is the number of characters per line on the LCD in custom profile.
 -        Common values are 16,20,24,40.
 -
 -config PANEL_LCD_BWIDTH
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -      int "Internal LCD line width (1-40, 40 by default)"
 -      range 1 40
 -      default 40
 -      ---help---
 -        Most LCDs use a standard controller which supports hardware lines of 40
 -        characters, although sometimes only 16, 20 or 24 of them are really wired
 -        to the terminal. This results in some non-visible but addressable characters,
 -        and is the case for most parallel LCDs. Other LCDs, and some serial ones,
 -        however, use the same line width internally as what is visible. The KS0074
 -        for example, uses 16 characters per line for 16 visible characters per line.
 -
 -        This option lets you configure the value used by your LCD in 'custom' profile.
 -        If you don't know, put '40' here.
 -
 -config PANEL_LCD_HWIDTH
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -      int "Hardware LCD line width (1-64, 64 by default)"
 -      range 1 64
 -      default 64
 -      ---help---
 -        Most LCDs use a single address bit to differentiate line 0 and line 1. Since
 -        some of them need to be able to address 40 chars with the lower bits, they
 -        often use the immediately superior power of 2, which is 64, to address the
 -        next line.
 -
 -        If you don't know what your LCD uses, in doubt let 16 here for a 2x16, and
 -        64 here for a 2x40.
 -
 -config PANEL_LCD_CHARSET
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -      int "LCD character set (0=normal, 1=KS0074)"
 -      range 0 1
 -      default 0
 -      ---help---
 -        Some controllers such as the KS0074 use a somewhat strange character set
 -        where many symbols are at unusual places. The driver knows how to map
 -        'standard' ASCII characters to the character sets used by these controllers.
 -        Valid values are :
 -
 -           0 : normal (untranslated) character set
 -           1 : KS0074 character set
 -
 -        If you don't know, use the normal one (0).
 -
 -config PANEL_LCD_PROTO
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -      int "LCD communication mode (0=parallel 8 bits, 1=serial)"
 -      range 0 1
 -      default 0
 -      ---help---
 -        This driver now supports any serial or parallel LCD wired to a parallel
 -        port. But before assigning signals, the driver needs to know if it will
 -        be driving a serial LCD or a parallel one. Serial LCDs only use 2 wires
 -        (SDA/SCL), while parallel ones use 2 or 3 wires for the control signals
 -        (E, RS, sometimes RW), and 4 or 8 for the data. Use 0 here for a 8 bits
 -        parallel LCD, and 1 for a serial LCD.
 -
 -config PANEL_LCD_PIN_E
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0"
 -        int "Parallel port pin number & polarity connected to the LCD E signal (-17...17) "
 -      range -17 17
 -      default 14
 +config ASPEED_LPC_CTRL
 +      depends on (ARCH_ASPEED || COMPILE_TEST) && REGMAP && MFD_SYSCON
 +      tristate "Aspeed ast2400/2500 HOST LPC to BMC bridge control"
        ---help---
 -        This describes the number of the parallel port pin to which the LCD 'E'
 -        signal has been connected. It can be :
 -
 -                0 : no connection (eg: connected to ground)
 -            1..17 : directly connected to any of these pins on the DB25 plug
 -          -1..-17 : connected to the same pin through an inverter (eg: transistor).
 -
 -        Default for the 'E' pin in custom profile is '14' (AUTOFEED).
 -
 -config PANEL_LCD_PIN_RS
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0"
 -        int "Parallel port pin number & polarity connected to the LCD RS signal (-17...17) "
 -      range -17 17
 -      default 17
 -      ---help---
 -        This describes the number of the parallel port pin to which the LCD 'RS'
 -        signal has been connected. It can be :
 -
 -                0 : no connection (eg: connected to ground)
 -            1..17 : directly connected to any of these pins on the DB25 plug
 -          -1..-17 : connected to the same pin through an inverter (eg: transistor).
 -
 -        Default for the 'RS' pin in custom profile is '17' (SELECT IN).
 -
 -config PANEL_LCD_PIN_RW
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO="0"
 -        int "Parallel port pin number & polarity connected to the LCD RW signal (-17...17) "
 -      range -17 17
 -      default 16
 -      ---help---
 -        This describes the number of the parallel port pin to which the LCD 'RW'
 -        signal has been connected. It can be :
 -
 -                0 : no connection (eg: connected to ground)
 -            1..17 : directly connected to any of these pins on the DB25 plug
 -          -1..-17 : connected to the same pin through an inverter (eg: transistor).
 -
 -        Default for the 'RW' pin in custom profile is '16' (INIT).
 -
 -config PANEL_LCD_PIN_SCL
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0"
 -        int "Parallel port pin number & polarity connected to the LCD SCL signal (-17...17) "
 -      range -17 17
 -      default 1
 -      ---help---
 -        This describes the number of the parallel port pin to which the serial
 -        LCD 'SCL' signal has been connected. It can be :
 -
 -                0 : no connection (eg: connected to ground)
 -            1..17 : directly connected to any of these pins on the DB25 plug
 -          -1..-17 : connected to the same pin through an inverter (eg: transistor).
 -
 -        Default for the 'SCL' pin in custom profile is '1' (STROBE).
 -
 -config PANEL_LCD_PIN_SDA
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1" && PANEL_LCD_PROTO!="0"
 -        int "Parallel port pin number & polarity connected to the LCD SDA signal (-17...17) "
 -      range -17 17
 -      default 2
 -      ---help---
 -        This describes the number of the parallel port pin to which the serial
 -        LCD 'SDA' signal has been connected. It can be :
 -
 -                0 : no connection (eg: connected to ground)
 -            1..17 : directly connected to any of these pins on the DB25 plug
 -          -1..-17 : connected to the same pin through an inverter (eg: transistor).
 -
 -        Default for the 'SDA' pin in custom profile is '2' (D0).
 -
 -config PANEL_LCD_PIN_BL
 -      depends on PANEL_PROFILE="0" && PANEL_LCD="1"
 -        int "Parallel port pin number & polarity connected to the LCD backlight signal (-17...17) "
 -      range -17 17
 -      default 0
 -      ---help---
 -        This describes the number of the parallel port pin to which the LCD 'BL' signal
 -          has been connected. It can be :
 -
 -                0 : no connection (eg: connected to ground)
 -            1..17 : directly connected to any of these pins on the DB25 plug
 -          -1..-17 : connected to the same pin through an inverter (eg: transistor).
 -
 -        Default for the 'BL' pin in custom profile is '0' (uncontrolled).
 -
 -config PANEL_CHANGE_MESSAGE
 -      bool "Change LCD initialization message ?"
 -      default "n"
 -      ---help---
 -        This allows you to replace the boot message indicating the kernel version
 -        and the driver version with a custom message. This is useful on appliances
 -        where a simple 'Starting system' message can be enough to stop a customer
 -        from worrying.
 -
 -        If you say 'Y' here, you'll be able to choose a message yourself. Otherwise,
 -        say 'N' and keep the default message with the version.
 -
 -config PANEL_BOOT_MESSAGE
 -      depends on PANEL_CHANGE_MESSAGE="y"
 -      string "New initialization message"
 -      default ""
 -      ---help---
 -        This allows you to replace the boot message indicating the kernel version
 -        and the driver version with a custom message. This is useful on appliances
 -        where a simple 'Starting system' message can be enough to stop a customer
 -        from worrying.
 -
 -        An empty message will only clear the display at driver init time. Any other
 -        printf()-formatted message is valid with newline and escape codes.
 -
 -endif # PANEL
 +        Control Aspeed ast2400/2500 HOST LPC to BMC mappings through
 +        ioctl()s, the driver also provides a read/write interface to a BMC ram
 +        region where the host LPC read/write region can be buffered.
  
+ config PCI_ENDPOINT_TEST
+       depends on PCI
+       tristate "PCI Endpoint Test driver"
+       ---help---
+            Enable this configuration option to enable the host side test driver
+            for PCI Endpoint.
  source "drivers/misc/c2port/Kconfig"
  source "drivers/misc/eeprom/Kconfig"
  source "drivers/misc/cb710/Kconfig"
index 4fb10af2ea1c635bf2096590b9a994500484579c,6e139cd704212e297968f004a17f90adb3a8360e..81ef3e67acc96a6dde7d5a0227760f399bb902ad
@@@ -52,7 -53,8 +52,8 @@@ obj-$(CONFIG_GENWQE)          += genwqe
  obj-$(CONFIG_ECHO)            += echo/
  obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o
  obj-$(CONFIG_CXL_BASE)                += cxl/
 -obj-$(CONFIG_PANEL)             += panel.o
 +obj-$(CONFIG_ASPEED_LPC_CTRL) += aspeed-lpc-ctrl.o
+ obj-$(CONFIG_PCI_ENDPOINT_TEST)       += pci_endpoint_test.o
  
  lkdtm-$(CONFIG_LKDTM)         += lkdtm_core.o
  lkdtm-$(CONFIG_LKDTM)         += lkdtm_bugs.o
Simple merge
Simple merge
Simple merge
index 0042c365b29b9b94c791ca99d00dc7263354bb71,6b5eaf500a2462a65d381c8b0b6ea358820562f4..ba44fdfda66bb5caba6c74d9ad056b34a2d01068
@@@ -973,7 -975,28 +975,7 @@@ static int __pci_enable_msix(struct pci
        return msix_capability_init(dev, entries, nvec, affd);
  }
  
- void pci_msix_shutdown(struct pci_dev *dev)
 -/**
 - * pci_enable_msix - configure device's MSI-X capability structure
 - * @dev: pointer to the pci_dev data structure of MSI-X device function
 - * @entries: pointer to an array of MSI-X entries (optional)
 - * @nvec: number of MSI-X irqs requested for allocation by device driver
 - *
 - * Setup the MSI-X capability structure of device function with the number
 - * of requested irqs upon its software driver call to request for
 - * MSI-X mode enabled on its hardware device function. A return of zero
 - * indicates the successful configuration of MSI-X capability structure
 - * with new allocated MSI-X irqs. A return of < 0 indicates a failure.
 - * Or a return of > 0 indicates that driver request is exceeding the number
 - * of irqs or MSI-X vectors available. Driver should use the returned value to
 - * re-send its request.
 - **/
 -int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec)
 -{
 -      return __pci_enable_msix(dev, entries, nvec, NULL);
 -}
 -EXPORT_SYMBOL(pci_enable_msix);
 -
+ static void pci_msix_shutdown(struct pci_dev *dev)
  {
        struct msi_desc *entry;
  
Simple merge
Simple merge
index f27be8432e82b3a76c1fa58e30321cd48a28b91c,88185ffcbf47c18756aba77915066d3413fd10bd..33c2b0b77429d09aaa31cb9735458db5762e08a7
@@@ -1298,10 -1295,9 +1296,8 @@@ struct msix_entry 
  
  #ifdef CONFIG_PCI_MSI
  int pci_msi_vec_count(struct pci_dev *dev);
- void pci_msi_shutdown(struct pci_dev *dev);
  void pci_disable_msi(struct pci_dev *dev);
  int pci_msix_vec_count(struct pci_dev *dev);
- void pci_msix_shutdown(struct pci_dev *dev);
 -int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec);
  void pci_disable_msix(struct pci_dev *dev);
  void pci_restore_msi_state(struct pci_dev *dev);
  int pci_msi_enabled(void);
@@@ -1327,10 -1323,11 +1323,8 @@@ int pci_irq_get_node(struct pci_dev *pd
  
  #else
  static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; }
- static inline void pci_msi_shutdown(struct pci_dev *dev) { }
  static inline void pci_disable_msi(struct pci_dev *dev) { }
  static inline int pci_msix_vec_count(struct pci_dev *dev) { return -ENOSYS; }
- static inline void pci_msix_shutdown(struct pci_dev *dev) { }
 -static inline int pci_enable_msix(struct pci_dev *dev,
 -                                struct msix_entry *entries, int nvec)
 -{ return -ENOSYS; }
  static inline void pci_disable_msix(struct pci_dev *dev) { }
  static inline void pci_restore_msi_state(struct pci_dev *dev) { }
  static inline int pci_msi_enabled(void) { return 0; }
Simple merge
Simple merge
Simple merge