Skip to contentSkip to conversation

x86/platform changes for v3.4

GIT PULL Ingo Molnar 1 participant 1 message Mar 19, 2012

Subsystems (7)
lore
Share & tools
lore
#0 lore raw

Linus,

Please pull the latest x86-platform-for-linus git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-platform-for-linus

HEAD: fa63030e9c79e37b4d4e63b39ffb09cfb7aa0fe4 x86/platform: Move APIC ID validity check into platform APIC code

out-of-topic modifications in x86-platform-for-linus:
-----------------------------------------------------

drivers/leds/Kconfig               # da4e330: x86/geode/net5501: Add platform d
drivers/leds/Makefile              # da4e330: x86/geode/net5501: Add platform d
drivers/leds/leds-net5501.c        # da4e330: x86/geode/net5501: Add platform d
drivers/platform/x86/Kconfig       # 0f48d34: x86/mid/thermal: Convert to use I
                                   # 33e9970: x86/mid: Kill off Moorestown
drivers/platform/x86/Makefile      # 33e9970: x86/mid: Kill off Moorestown
drivers/platform/x86/intel_mid_powerbtn.c# 8bee7ce: x86/mid/powerbtn: Use MSIC read/w
drivers/platform/x86/intel_mid_thermal.c# 1b7ccab: x86/mid/thermal: Turn off thermis
                                   # 6348307: x86/mid/thermal: Add msic_thermal
                                   # 0f48d34: x86/mid/thermal: Convert to use I

drivers/platform/x86/intel_rar_register.c# 33e9970: x86/mid: Kill off Moorestown drivers/platform/x86/intel_scu_ipc.c# 4707375: x86/mid/scu_ipc: Remove Moorestow drivers/platform/x86/intel_scu_ipcutil.c# 4707375: x86/mid/scu_ipc: Remove Moorestow
include/linux/rar_register.h # 33e9970: x86/mid: Kill off Moorestown

Thanks,

Ingo

------------------>
Alan Cox (3):
x86/mid: Remove Intel Moorestown
x86/mid: Kill off Moorestown
x86/mid/scu_ipc: Remove Moorestown support

Daniel Drake (1):
x86/olpc/xo15/sci: Enable lid close wakeup control

Daniel J Blueman (1):
x86/platform: Move APIC ID validity check into platform APIC code

Jacob Pan (2):
x86/ioapic: Use legacy_pic to set correct gsi-irq mapping x86/mrst: Set ISA bus type for fake MP IRQs

Michael Demeter (1):
x86/mid/powerbtn: Use MSIC read/write instead of ipc_scu

Mika Westerberg (5):
x86/config: Select MSIC MFD driver on Intel Medfield platform x86/mrst: Add msic_thermal platform support x86/mid/thermal: Convert to use Intel MSIC API x86/mid/thermal: Add msic_thermal alias x86/mid/thermal: Turn off thermistor

Philip Prindeville (2):
x86/geode/alix2: Supplement driver to include GPIO button support x86/geode/net5501: Add platform driver for Soekris Engineering net5501

 arch/x86/Kconfig                          |   28 +-
 arch/x86/include/asm/apic.h               |    6 +
 arch/x86/include/asm/mrst.h               |    4 +-
 arch/x86/kernel/apic/apic_flat_64.c       |    2 +
 arch/x86/kernel/apic/apic_noop.c          |    1 +
 arch/x86/kernel/apic/apic_numachip.c      |   10 +-
 arch/x86/kernel/apic/bigsmp_32.c          |    1 +
 arch/x86/kernel/apic/es7000_32.c          |    2 +
 arch/x86/kernel/apic/numaq_32.c           |    1 +
 arch/x86/kernel/apic/probe_32.c           |    1 +
 arch/x86/kernel/apic/summit_32.c          |    1 +
 arch/x86/kernel/apic/x2apic_cluster.c     |    1 +
 arch/x86/kernel/apic/x2apic_phys.c        |    1 +
 arch/x86/kernel/apic/x2apic_uv_x.c        |    1 +
 arch/x86/kernel/smpboot.c                 |    2 +-
 arch/x86/platform/geode/Makefile          |    1 +
 arch/x86/platform/geode/alix.c            |   76 +++-
 arch/x86/platform/geode/net5501.c         |  154 ++++++
 arch/x86/platform/mrst/Makefile           |    1 -
 arch/x86/platform/mrst/mrst.c             |   70 +--
 arch/x86/platform/mrst/pmu.c              |  817 -----------------------------
 arch/x86/platform/mrst/pmu.h              |  234 --------
 arch/x86/platform/olpc/olpc-xo15-sci.c    |   72 +++-
 drivers/leds/Kconfig                      |   10 -
 drivers/leds/Makefile                     |    1 -
 drivers/leds/leds-net5501.c               |   97 ----
 drivers/platform/x86/Kconfig              |   24 +-
 drivers/platform/x86/Makefile             |    1 -
 drivers/platform/x86/intel_mid_powerbtn.c |   32 +-
 drivers/platform/x86/intel_mid_thermal.c  |   47 +-
 drivers/platform/x86/intel_rar_register.c |  669 -----------------------
 drivers/platform/x86/intel_scu_ipc.c      |  208 +-------
 drivers/platform/x86/intel_scu_ipcutil.c  |   32 +-
 include/linux/rar_register.h              |   60 ---
 34 files changed, 442 insertions(+), 2226 deletions(-)
 create mode 100644 arch/x86/platform/geode/net5501.c
 delete mode 100644 arch/x86/platform/mrst/pmu.c
 delete mode 100644 arch/x86/platform/mrst/pmu.h
 delete mode 100644 drivers/leds/leds-net5501.c
 delete mode 100644 drivers/platform/x86/intel_rar_register.c
 delete mode 100644 include/linux/rar_register.h
arch/x86/Kconfig +7 -21
index 5bed94e..7af8a56 100644
@@ -417,27 +417,6 @@ if X86_WANT_INTEL_MID
 config X86_INTEL_MID
 	bool
 
-config X86_MRST
-       bool "Moorestown MID platform"
-	depends on PCI
-	depends on PCI_GOANY
-	depends on X86_IO_APIC
-	select X86_INTEL_MID
-	select SFI
-	select DW_APB_TIMER
-	select APB_TIMER
-	select I2C
-	select SPI
-	select INTEL_SCU_IPC
-	select X86_PLATFORM_DEVICES
-	---help---
-	  Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin
-	  Internet Device(MID) platform. Moorestown consists of two chips:
-	  Lincroft (CPU core, graphics, and memory controller) and Langwell IOH.
-	  Unlike standard x86 PCs, Moorestown does not have many legacy devices
-	  nor standard legacy replacement devices/features. e.g. Moorestown does
-	  not contain i8259, i8254, HPET, legacy BIOS, most of the io ports.
-
 config X86_MDFLD
        bool "Medfield MID platform"
 	depends on PCI
@@ -451,6 +430,7 @@ config X86_MDFLD
 	select SPI
 	select INTEL_SCU_IPC
 	select X86_PLATFORM_DEVICES
+	select MFD_INTEL_MSIC
 	---help---
 	  Medfield is Intel's Low Power Intel Architecture (LPIA) based Moblin
 	  Internet Device(MID) platform. 
@@ -2133,6 +2113,12 @@ config ALIX
 
 	  Note: You have to set alix.force=1 for boards with Award BIOS.
 
+config NET5501
+	bool "Soekris Engineering net5501 System Support (LEDS, GPIO, etc)"
+	select GPIOLIB
+	---help---
+	  This option enables system support for the Soekris Engineering net5501.
+
 endif # X86_32
 
 config AMD_NB
arch/x86/include/asm/apic.h +6 -0
index 3ab9bdd..a9371c9 100644
@@ -288,6 +288,7 @@ struct apic {
 
 	int (*probe)(void);
 	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
+	int (*apic_id_valid)(int apicid);
 	int (*apic_id_registered)(void);
 
 	u32 irq_delivery_mode;
@@ -532,6 +533,11 @@ static inline unsigned int read_apic_id(void)
 	return apic->get_apic_id(reg);
 }
 
+static inline int default_apic_id_valid(int apicid)
+{
+	return x2apic_mode || (apicid < 255);
+}
+
 extern void default_setup_apic_routing(void);
 
 extern struct apic apic_noop;
arch/x86/include/asm/mrst.h +2 -2
index 0a0a954..fc18bf3 100644
@@ -26,8 +26,8 @@ extern struct sfi_rtc_table_entry sfi_mrtc_array[];
  * identified via MSRs.
  */
 enum mrst_cpu_type {
-	MRST_CPU_CHIP_LINCROFT = 1,
-	MRST_CPU_CHIP_PENWELL,
+	/* 1 was Moorestown */
+	MRST_CPU_CHIP_PENWELL = 2,
 };
 
 extern enum mrst_cpu_type __mrst_cpu_chip;
arch/x86/kernel/apic/apic_flat_64.c +2 -0
index 8c3cdde..359b689 100644
@@ -180,6 +180,7 @@ static struct apic apic_flat =  {
 	.name				= "flat",
 	.probe				= flat_probe,
 	.acpi_madt_oem_check		= flat_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= flat_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
@@ -337,6 +338,7 @@ static struct apic apic_physflat =  {
 	.name				= "physical flat",
 	.probe				= physflat_probe,
 	.acpi_madt_oem_check		= physflat_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= flat_apic_id_registered,
 
 	.irq_delivery_mode		= dest_Fixed,
arch/x86/kernel/apic/apic_noop.c +1 -0
index 775b82b..634ae6c 100644
@@ -124,6 +124,7 @@ struct apic apic_noop = {
 	.probe				= noop_probe,
 	.acpi_madt_oem_check		= NULL,
 
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= noop_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
arch/x86/kernel/apic/apic_numachip.c +9 -1
index 09d3d8c..d9ea5f3 100644
@@ -56,6 +56,12 @@ static unsigned int read_xapic_id(void)
 	return get_apic_id(apic_read(APIC_ID));
 }
 
+static int numachip_apic_id_valid(int apicid)
+{
+	/* Trust what bootloader passes in MADT */
+	return 1;
+}
+
 static int numachip_apic_id_registered(void)
 {
 	return physid_isset(read_xapic_id(), phys_cpu_present_map);
@@ -223,10 +229,11 @@ static int __init numachip_system_init(void)
 }
 early_initcall(numachip_system_init);
 
-static int numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
+static int __cpuinit numachip_acpi_madt_oem_check(char *oem_id, char *oem_table_id)
 {
 	if (!strncmp(oem_id, "NUMASC", 6)) {
 		numachip_system = 1;
+		setup_force_cpu_cap(X86_FEATURE_X2APIC);
 		return 1;
 	}
 
@@ -238,6 +245,7 @@ static struct apic apic_numachip __refconst = {
 	.name				= "NumaConnect system",
 	.probe				= numachip_probe,
 	.acpi_madt_oem_check		= numachip_acpi_madt_oem_check,
+	.apic_id_valid			= numachip_apic_id_valid,
 	.apic_id_registered		= numachip_apic_id_registered,
 
 	.irq_delivery_mode		= dest_Fixed,
arch/x86/kernel/apic/bigsmp_32.c +1 -0
index 521bead..0cdec70 100644
@@ -198,6 +198,7 @@ static struct apic apic_bigsmp = {
 	.name				= "bigsmp",
 	.probe				= probe_bigsmp,
 	.acpi_madt_oem_check		= NULL,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= bigsmp_apic_id_registered,
 
 	.irq_delivery_mode		= dest_Fixed,
arch/x86/kernel/apic/es7000_32.c +2 -0
index 5d513bc..e42d1d3b9 100644
@@ -625,6 +625,7 @@ static struct apic __refdata apic_es7000_cluster = {
 	.name				= "es7000",
 	.probe				= probe_es7000,
 	.acpi_madt_oem_check		= es7000_acpi_madt_oem_check_cluster,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= es7000_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
@@ -690,6 +691,7 @@ static struct apic __refdata apic_es7000 = {
 	.name				= "es7000",
 	.probe				= probe_es7000,
 	.acpi_madt_oem_check		= es7000_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= es7000_apic_id_registered,
 
 	.irq_delivery_mode		= dest_Fixed,
arch/x86/kernel/apic/numaq_32.c +1 -0
index c4a61ca..00d2422 100644
@@ -478,6 +478,7 @@ static struct apic __refdata apic_numaq = {
 	.name				= "NUMAQ",
 	.probe				= probe_numaq,
 	.acpi_madt_oem_check		= NULL,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= numaq_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
arch/x86/kernel/apic/probe_32.c +1 -0
index 0787bb3..ff2c1b9 100644
@@ -92,6 +92,7 @@ static struct apic apic_default = {
 	.name				= "default",
 	.probe				= probe_default,
 	.acpi_madt_oem_check		= NULL,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= default_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
arch/x86/kernel/apic/summit_32.c +1 -0
index 1911442..fea000b 100644
@@ -496,6 +496,7 @@ static struct apic apic_summit = {
 	.name				= "summit",
 	.probe				= probe_summit,
 	.acpi_madt_oem_check		= summit_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= summit_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
arch/x86/kernel/apic/x2apic_cluster.c +1 -0
index 5007958..9193713 100644
@@ -213,6 +213,7 @@ static struct apic apic_x2apic_cluster = {
 	.name				= "cluster x2apic",
 	.probe				= x2apic_cluster_probe,
 	.acpi_madt_oem_check		= x2apic_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= x2apic_apic_id_registered,
 
 	.irq_delivery_mode		= dest_LowestPrio,
arch/x86/kernel/apic/x2apic_phys.c +1 -0
index f5373df..bcd1db6 100644
@@ -119,6 +119,7 @@ static struct apic apic_x2apic_phys = {
 	.name				= "physical x2apic",
 	.probe				= x2apic_phys_probe,
 	.acpi_madt_oem_check		= x2apic_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= x2apic_apic_id_registered,
 
 	.irq_delivery_mode		= dest_Fixed,
arch/x86/kernel/apic/x2apic_uv_x.c +1 -0
index 79b05b8..fc47714 100644
@@ -351,6 +351,7 @@ static struct apic __refdata apic_x2apic_uv_x = {
 	.name				= "UV large system",
 	.probe				= uv_probe,
 	.acpi_madt_oem_check		= uv_acpi_madt_oem_check,
+	.apic_id_valid			= default_apic_id_valid,
 	.apic_id_registered		= uv_apic_id_registered,
 
 	.irq_delivery_mode		= dest_Fixed,
arch/x86/kernel/smpboot.c +1 -1
index 66d250c..d279e6e 100644
@@ -847,7 +847,7 @@ int __cpuinit native_cpu_up(unsigned int cpu)
 
 	if (apicid == BAD_APICID || apicid == boot_cpu_physical_apicid ||
 	    !physid_isset(apicid, phys_cpu_present_map) ||
-	    (!x2apic_mode && apicid >= 255)) {
+	    !apic->apic_id_valid(apicid)) {
 		printk(KERN_ERR "%s: bad cpu %d\n", __func__, cpu);
 		return -EINVAL;
 	}
arch/x86/platform/geode/Makefile +1 -0
index 07c9cd0..246b788 100644
@@ -1 +1,2 @@
 obj-$(CONFIG_ALIX)		+= alix.o
+obj-$(CONFIG_NET5501)		+= net5501.o
arch/x86/platform/geode/alix.c +67 -9

134 lines not on this page · raw message

arch/x86/platform/geode/net5501.c new file +154 -0

154 lines not on this page · raw message

arch/x86/platform/mrst/Makefile +0 -1
index 7baed51..af1da7e 100644
@@ -1,4 +1,3 @@
 obj-$(CONFIG_X86_INTEL_MID)	+= mrst.o
 obj-$(CONFIG_X86_INTEL_MID)	+= vrtc.o
 obj-$(CONFIG_EARLY_PRINTK_INTEL_MID)	+= early_printk_mrst.o
-obj-$(CONFIG_X86_MRST)		+= pmu.o
arch/x86/platform/mrst/mrst.c +30 -40

108 lines not on this page · raw message

arch/x86/platform/mrst/pmu.c deleted +0 -817

817 lines not on this page · raw message

arch/x86/platform/mrst/pmu.h deleted +0 -234

234 lines not on this page · raw message

arch/x86/platform/olpc/olpc-xo15-sci.c +71 -1

102 lines not on this page · raw message

drivers/leds/Kconfig +0 -10
index 9ca28fc..8c7a75d 100644
@@ -89,16 +89,6 @@ config LEDS_NET48XX
 	  This option enables support for the Soekris net4801 and net4826 error
 	  LED.
 
-config LEDS_NET5501
-	tristate "LED Support for Soekris net5501 series Error LED"
-	depends on LEDS_TRIGGERS
-	depends on X86 && GPIO_CS5535
-	select LEDS_TRIGGER_DEFAULT_ON
-	default n
-	help
-	  Add support for the Soekris net5501 board (detection, error led
-	  and GPIO).
-
 config LEDS_FSG
 	tristate "LED Support for the Freecom FSG-3"
 	depends on LEDS_CLASS
drivers/leds/Makefile +0 -1
index 1fc6875..6bcf4f6 100644
@@ -14,7 +14,6 @@ obj-$(CONFIG_LEDS_MIKROTIK_RB532)	+= leds-rb532.o
 obj-$(CONFIG_LEDS_S3C24XX)		+= leds-s3c24xx.o
 obj-$(CONFIG_LEDS_AMS_DELTA)		+= leds-ams-delta.o
 obj-$(CONFIG_LEDS_NET48XX)		+= leds-net48xx.o
-obj-$(CONFIG_LEDS_NET5501)		+= leds-net5501.o
 obj-$(CONFIG_LEDS_WRAP)			+= leds-wrap.o
 obj-$(CONFIG_LEDS_COBALT_QUBE)		+= leds-cobalt-qube.o
 obj-$(CONFIG_LEDS_COBALT_RAQ)		+= leds-cobalt-raq.o
drivers/leds/leds-net5501.c deleted +0 -97

97 lines not on this page · raw message

drivers/platform/x86/Kconfig +1 -23
index f995e6e..86720bc 100644
@@ -672,33 +672,11 @@ config INTEL_MID_POWER_BUTTON
 
 config INTEL_MFLD_THERMAL
        tristate "Thermal driver for Intel Medfield platform"
-       depends on INTEL_SCU_IPC && THERMAL
+       depends on MFD_INTEL_MSIC && THERMAL
        help
          Say Y here to enable thermal driver support for the  Intel Medfield
          platform.
 
-config RAR_REGISTER
-	bool "Restricted Access Region Register Driver"
-	depends on PCI && X86_MRST
-	default n
-	---help---
-	  This driver allows other kernel drivers access to the
-	  contents of the restricted access region control registers.
-
-	  The restricted access region control registers
-	  (rar_registers) are used to pass address and
-	  locking information on restricted access regions
-	  to other drivers that use restricted access regions.
-
-	  The restricted access regions are regions of memory
-	  on the Intel MID Platform that are not accessible to
-	  the x86 processor, but are accessible to dedicated
-	  processors on board peripheral devices.
-
-	  The purpose of the restricted access regions is to
-	  protect sensitive data from compromise by unauthorized
-	  programs running on the x86 processor.
-
 config INTEL_IPS
 	tristate "Intel Intelligent Power Sharing"
 	depends on ACPI
drivers/platform/x86/Makefile +0 -1
index 293a320..1b6665e 100644
@@ -34,7 +34,6 @@ obj-$(CONFIG_TOSHIBA_BT_RFKILL)	+= toshiba_bluetooth.o
 obj-$(CONFIG_INTEL_SCU_IPC)	+= intel_scu_ipc.o
 obj-$(CONFIG_INTEL_SCU_IPC_UTIL) += intel_scu_ipcutil.o
 obj-$(CONFIG_INTEL_MFLD_THERMAL) += intel_mid_thermal.o
-obj-$(CONFIG_RAR_REGISTER)	+= intel_rar_register.o
 obj-$(CONFIG_INTEL_IPS)		+= intel_ips.o
 obj-$(CONFIG_GPIO_INTEL_PMIC)	+= intel_pmic_gpio.o
 obj-$(CONFIG_XO1_RFKILL)	+= xo1-rfkill.o
drivers/platform/x86/intel_mid_powerbtn.c +28 -4
index f1ae507..0903a88 100644
@@ -23,21 +23,27 @@
 #include <linux/slab.h>
 #include <linux/platform_device.h>
 #include <linux/input.h>
-
-#include <asm/intel_scu_ipc.h>
+#include <linux/mfd/intel_msic.h>
 
 #define DRIVER_NAME "msic_power_btn"
 
-#define MSIC_PB_STATUS	0x3f
 #define MSIC_PB_LEVEL	(1 << 3) /* 1 - release, 0 - press */
 
+/*
+ * MSIC document ti_datasheet defines the 1st bit reg 0x21 is used to mask
+ * power button interrupt
+ */
+#define MSIC_PWRBTNM    (1 << 0)
+
 static irqreturn_t mfld_pb_isr(int irq, void *dev_id)
 {
 	struct input_dev *input = dev_id;
 	int ret;
 	u8 pbstat;
 
-	ret = intel_scu_ipc_ioread8(MSIC_PB_STATUS, &pbstat);
+	ret = intel_msic_reg_read(INTEL_MSIC_PBSTATUS, &pbstat);
+	dev_dbg(input->dev.parent, "PB_INT status= %d\n", pbstat);
+
 	if (ret < 0) {
 		dev_err(input->dev.parent, "Read error %d while reading"
 			       " MSIC_PB_STATUS\n", ret);
@@ -88,6 +94,24 @@ static int __devinit mfld_pb_probe(struct platform_device *pdev)
 	}
 
 	platform_set_drvdata(pdev, input);
+
+	/*
+	 * SCU firmware might send power button interrupts to IA core before
+	 * kernel boots and doesn't get EOI from IA core. The first bit of
+	 * MSIC reg 0x21 is kept masked, and SCU firmware doesn't send new
+	 * power interrupt to Android kernel. Unmask the bit when probing
+	 * power button in kernel.
+	 * There is a very narrow race between irq handler and power button
+	 * initialization. The race happens rarely. So we needn't worry
+	 * about it.
+	 */
+	error = intel_msic_reg_update(INTEL_MSIC_IRQLVL1MSK, 0, MSIC_PWRBTNM);
+	if (error) {
+		dev_err(&pdev->dev, "Unable to clear power button interrupt, "
+				"error: %d\n", error);
+		goto err_free_irq;
+	}
+
 	return 0;
 
 err_free_irq:
drivers/platform/x86/intel_mid_thermal.c +23 -24

152 lines not on this page · raw message

drivers/platform/x86/intel_rar_register.c deleted +0 -669

669 lines not on this page · raw message

drivers/platform/x86/intel_scu_ipc.c +22 -186

211 lines not on this page · raw message

drivers/platform/x86/intel_scu_ipcutil.c +8 -24
index 2d0f913..02bc5a6 100644

Lines of this file are not shown. View the raw message.

include/linux/rar_register.h deleted +0 -60

60 lines not on this page · raw message

The rest of this diff is not shown. View the raw message.

Part of the diff is not shown here. View the raw message.