Subject: [RFC PATCH 1/3] arm: mvebu: add new dts file for old variant of Openblocks AX3-4

From: [email-masked] (Gregory CLEMENT)
Date: Thu, 02 Jan 2014 17:17:41 +0100

Hi Jason,

I have just send a new series which I hope will supersede this one.
However I will answer on some points:

On 01/01/2014 22:41, Jason Cooper wrote:
> Gregory,
> 
> Sorry, but we seem to have a fundamental mis-understanding here.  First,
> whatever we end up deciding for the compatible strings needs to be
> documented.  Which seems to have not made it into this series.
> 
> Second, I'm having trouble explaining this (in my head), so I'm adding
> the DT ml so hopefully someone there can chime in.
> 
> AFAICT, the marvell,mv78230-i2c compatible string, added in v3.12, refers
> to the IP block on the A0 revision of the SoC.  Since we have set that,

Actually in v3.12 the marvell,mv78230-i2c refer to the B0 revision as I
only worked on it on board using this revision. That's why I proposed
to introduced the marvell,mv78230-a0-i2c compatible string. My concerns was
to not break the existing behavior.

Currently with the marvell,mv78230-i2c compatible string the kernel use
offload on B0 version and hang on A0 version.

If we introduce the marvell,mv78230-a0-i2c compatible string, then the new
kernel with the same dtb will have the same behavior. People using the A0
version are aware that there is a problem (the kernel hang) so they will
be willing to switch to marvell,mv78230-a0-i2c and to change their dtb.

If we introduce the marvell,mv78230-b0-i2c compatible string, then the new
kernel with the same dtb will have different behavior. People using the A0
will have a booting kernel, but I fear that people using B0 revision won't
be aware of the regression.

Gregory

> we've discovered that the A0 revision has an errata where offloading
> doesn't work.  The B0 revision of the SoC has fixed offloading for i2c.
> 
> In my mind, this means that we should create a fix for the driver to
> disable offloading unless it can determine it's running B0 or newer.
> This is easy once we nail down the compatible strings.
> 
> The second thing we need to do is update the binding documentation so
> that the devicetree can describe the hardware accurately.  I think we
> should keep 'marvell,mv78230-i2c' as it is (the driver fix mentioned
> above will disable offloading), and add a new compatible
> string, 'marvell,mv78230-b0-i2c'.  The driver can then be updated to
> enable offloading when it sees this compatible string, or it can
> determine the SoC revision itself (via mach code).
> 
> Third, we need to be able to differentiate between the two shipped
> AX3-4 boards by openblocks.  I think this should follow the same pattern
> we decide for the i2c compatible string.  So, if we go with my proposal,
> we would have plathome,openblocks-ax3-4 and
> plathome,openblocks-ax3-4-b0.
> 
> Basically, I'm really uneasy about dropping marvell,mv78230-i2c and
> essentially re-defining it to marvell,mv78230-a0-i2c.  It feels like
> it's breaking backwards compatibility.  But I'm having trouble clearly
> describing how Gregory's proposed change exactly does break backwards
> compatibility.  Can a DT maintainer explain it more clearly than I?
> 
> thx,
> 
> Jason.
> 
> PS- Well, this ended up being a toppost.  Oops.  Sorry.
> 
> On Tue, Dec 31, 2013 at 05:44:51PM +0100, Gregory CLEMENT wrote:
>> The first variants of Openblocks AX3-4 used the revision A0 of the
>> Armada XP SoCs. These early variants have issues related to the i2c
>> controller which prevent to use the offload mechanism and lead to a
>> kernel hang during boot.
>>
>> The new dts file uses the compatible string marvell,mv78230-a0-i2c for
>> the i2c controller, thanks to this the driver disable the offload
>> mechanism and the kernel no more hangs on these boards.
>>
>> Signed-off-by: Gregory CLEMENT <[email-masked]>
>> ---
>>  .../arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts |  40 +++++
>>  .../dts/armada-xp-common-openblocks-ax3-4.dtsi     | 177 +++++++++++++++++++++
>>  arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts   | 164 +------------------
>>  3 files changed, 218 insertions(+), 163 deletions(-)
>>  create mode 100644 arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
>>  create mode 100644 arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi
>>
>> diff --git a/arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
>> new file mode 100644
>> index 000000000000..b3ea65255c19
>> --- /dev/null
>> +++ b/arch/arm/boot/dts/armada-xp-a0-openblocks-ax3-4.dts
>> @@ -0,0 +1,40 @@
>> +/*
>> + * Device Tree file for OpenBlocks AX3-4 board with A0 SoC
>> + *
>> + * Copyright (C) 2012 Marvell
>> + *
>> + * Gregory CLEMENT <[email-masked]>
>> + *
>> + * This file is licensed under the terms of the GNU General Public
>> + * License version 2.  This program is licensed "as is" without any
>> + * warranty of any kind, whether express or implied.
>> + */
>> +
>> +/dts-v1/;
>> +#include "armada-xp-common-openblocks-ax3-4.dtsi"
>> +
>> +/ {
>> +	model = "PlatHome OpenBlocks AX3-4 board (A0 SoC)";
>> +	compatible = "plathome,openblocks-ax3-4", "marvell,armadaxp-mv78260", "marvell,armadaxp", "marvell,armada-370-xp";
>> +
>> +	chosen {
>> +		bootargs = "console=ttyS0,115200 earlyprintk";
>> +	};
>> +
>> +	memory {
>> +		device_type = "memory";
>> +		reg = <0 0x00000000 0 0xC0000000>; /* 3 GB */
>> +	};
>> +
>> +	soc {
>> +
>> +		internal-regs {
>> +			i2c at 11000 {
>> +				compatible = "marvell,mv78230-a0-i2c", "marvell,mv64xxx-i2c";
>> +			};
>> +			i2c at 11100 {
>> +				compatible = "marvell,mv78230-a0-i2c", "marvell,mv64xxx-i2c";
>> +			};
>> +		};
>> +	};
>> +};
>> diff --git a/arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi b/arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi
>> new file mode 100644
>> index 000000000000..0d452b07baf5
>> --- /dev/null
>> +++ b/arch/arm/boot/dts/armada-xp-common-openblocks-ax3-4.dtsi
>> @@ -0,0 +1,177 @@
>> +/*
>> + * Device Tree file for OpenBlocks AX3-4 board
>> + *
>> + * Copyright (C) 2012 Marvell
>> + *
>> + * Thomas Petazzoni <[email-masked]>
>> + *
>> + * This file is licensed under the terms of the GNU General Public
>> + * License version 2.  This program is licensed "as is" without any
>> + * warranty of any kind, whether express or implied.
>> + */
>> +
>> +#include "armada-xp-mv78260.dtsi"
>> +
>> +/ {
>> +	soc {
>> +		ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
>> +			  MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
>> +			  MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
>> +
>> +		devbus-bootcs {
>> +			status = "okay";
>> +
>> +			/* Device Bus parameters are required */
>> +
>> +			/* Read parameters */
>> +			devbus,bus-width    = <8>;
>> +			devbus,turn-off-ps  = <60000>;
>> +			devbus,badr-skew-ps = <0>;
>> +			devbus,acc-first-ps = <124000>;
>> +			devbus,acc-next-ps  = <248000>;
>> +			devbus,rd-setup-ps  = <0>;
>> +			devbus,rd-hold-ps   = <0>;
>> +
>> +			/* Write parameters */
>> +			devbus,sync-enable = <0>;
>> +			devbus,wr-high-ps  = <60000>;
>> +			devbus,wr-low-ps   = <60000>;
>> +			devbus,ale-wr-ps   = <60000>;
>> +
>> +			/* NOR 128 MiB */
>> +			nor at 0 {
>> +				compatible = "cfi-flash";
>> +				reg = <0 0x8000000>;
>> +				bank-width = <2>;
>> +			};
>> +		};
>> +
>> +		pcie-controller {
>> +			status = "okay";
>> +			/* Internal mini-PCIe connector */
>> +			pcie at 1,0 {
>> +				/* Port 0, Lane 0 */
>> +				status = "okay";
>> +			};
>> +		};
>> +
>> +		internal-regs {
>> +			serial at 12000 {
>> +				clock-frequency = <250000000>;
>> +				status = "okay";
>> +			};
>> +			serial at 12100 {
>> +				clock-frequency = <250000000>;
>> +				status = "okay";
>> +			};
>> +			pinctrl {
>> +				led_pins: led-pins-0 {
>> +					marvell,pins = "mpp49", "mpp51", "mpp53";
>> +					marvell,function = "gpio";
>> +				};
>> +			};
>> +			leds {
>> +				compatible = "gpio-leds";
>> +				pinctrl-names = "default";
>> +				pinctrl-0 = <&led_pins>;
>> +
>> +				red_led {
>> +					label = "red_led";
>> +					gpios = <&gpio1 17 1>;
>> +					default-state = "off";
>> +				};
>> +
>> +				yellow_led {
>> +					label = "yellow_led";
>> +					gpios = <&gpio1 19 1>;
>> +					default-state = "off";
>> +				};
>> +
>> +				green_led {
>> +					label = "green_led";
>> +					gpios = <&gpio1 21 1>;
>> +					default-state = "off";
>> +					linux,default-trigger = "heartbeat";
>> +				};
>> +			};
>> +
>> +			gpio_keys {
>> +				compatible = "gpio-keys";
>> +				#address-cells = <1>;
>> +				#size-cells = <0>;
>> +
>> +				button at 1 {
>> +					label = "Init Button";
>> +					linux,code = <116>;
>> +					gpios = <&gpio1 28 0>;
>> +				};
>> +			};
>> +
>> +			mdio {
>> +				phy0: ethernet-phy at 0 {
>> +					reg = <0>;
>> +				};
>> +
>> +				phy1: ethernet-phy at 1 {
>> +					reg = <1>;
>> +				};
>> +
>> +				phy2: ethernet-phy at 2 {
>> +					reg = <2>;
>> +				};
>> +
>> +				phy3: ethernet-phy at 3 {
>> +					reg = <3>;
>> +				};
>> +			};
>> +
>> +			ethernet at 70000 {
>> +				status = "okay";
>> +				phy = <&phy0>;
>> +				phy-mode = "sgmii";
>> +			};
>> +			ethernet at 74000 {
>> +				status = "okay";
>> +				phy = <&phy1>;
>> +				phy-mode = "sgmii";
>> +			};
>> +			ethernet at 30000 {
>> +				status = "okay";
>> +				phy = <&phy2>;
>> +				phy-mode = "sgmii";
>> +			};
>> +			ethernet at 34000 {
>> +				status = "okay";
>> +				phy = <&phy3>;
>> +				phy-mode = "sgmii";
>> +			};
>> +			i2c at 11000 {
>> +				status = "okay";
>> +				clock-frequency = <400000>;
>> +			};
>> +			i2c at 11100 {
>> +				status = "okay";
>> +				clock-frequency = <400000>;
>> +
>> +				s35390a: s35390a at 30 {
>> +					compatible = "s35390a";
>> +					reg = <0x30>;
>> +				};
>> +			};
>> +			sata at a0000 {
>> +				nr-ports = <2>;
>> +				status = "okay";
>> +			};
>> +
>> +			/* Front side USB 0 */
>> +			usb at 50000 {
>> +				status = "okay";
>> +			};
>> +
>> +			/* Front side USB 1 */
>> +			usb at 51000 {
>> +				status = "okay";
>> +			};
>> +		};
>> +	};
>> +};
>> diff --git a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
>> index 5695afcc04bf..1983de77c3ff 100644
>> --- a/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
>> +++ b/arch/arm/boot/dts/armada-xp-openblocks-ax3-4.dts
>> @@ -11,7 +11,7 @@
>>   */
>>  
>>  /dts-v1/;
>> -#include "armada-xp-mv78260.dtsi"
>> +#include "armada-xp-common-openblocks-ax3-4.dtsi"
>>  
>>  / {
>>  	model = "PlatHome OpenBlocks AX3-4 board";
>> @@ -25,166 +25,4 @@
>>  		device_type = "memory";
>>  		reg = <0 0x00000000 0 0xC0000000>; /* 3 GB */
>>  	};
>> -
>> -	soc {
>> -		ranges = <MBUS_ID(0xf0, 0x01) 0 0 0xd0000000 0x100000
>> -			  MBUS_ID(0x01, 0x1d) 0 0 0xfff00000 0x100000
>> -			  MBUS_ID(0x01, 0x2f) 0 0 0xf0000000 0x8000000>;
>> -
>> -		devbus-bootcs {
>> -			status = "okay";
>> -
>> -			/* Device Bus parameters are required */
>> -
>> -			/* Read parameters */
>> -			devbus,bus-width    = <8>;
>> -			devbus,turn-off-ps  = <60000>;
>> -			devbus,badr-skew-ps = <0>;
>> -			devbus,acc-first-ps = <124000>;
>> -			devbus,acc-next-ps  = <248000>;
>> -			devbus,rd-setup-ps  = <0>;
>> -			devbus,rd-hold-ps   = <0>;
>> -
>> -			/* Write parameters */
>> -			devbus,sync-enable = <0>;
>> -			devbus,wr-high-ps  = <60000>;
>> -			devbus,wr-low-ps   = <60000>;
>> -			devbus,ale-wr-ps   = <60000>;
>> -
>> -			/* NOR 128 MiB */
>> -			nor at 0 {
>> -				compatible = "cfi-flash";
>> -				reg = <0 0x8000000>;
>> -				bank-width = <2>;
>> -			};
>> -		};
>> -
>> -		pcie-controller {
>> -			status = "okay";
>> -			/* Internal mini-PCIe connector */
>> -			pcie at 1,0 {
>> -				/* Port 0, Lane 0 */
>> -				status = "okay";
>> -			};
>> -		};
>> -
>> -		internal-regs {
>> -			serial at 12000 {
>> -				clock-frequency = <250000000>;
>> -				status = "okay";
>> -			};
>> -			serial at 12100 {
>> -				clock-frequency = <250000000>;
>> -				status = "okay";
>> -			};
>> -			pinctrl {
>> -				led_pins: led-pins-0 {
>> -					marvell,pins = "mpp49", "mpp51", "mpp53";
>> -					marvell,function = "gpio";
>> -				};
>> -			};
>> -			leds {
>> -				compatible = "gpio-leds";
>> -				pinctrl-names = "default";
>> -				pinctrl-0 = <&led_pins>;
>> -
>> -				red_led {
>> -					label = "red_led";
>> -					gpios = <&gpio1 17 1>;
>> -					default-state = "off";
>> -				};
>> -
>> -				yellow_led {
>> -					label = "yellow_led";
>> -					gpios = <&gpio1 19 1>;
>> -					default-state = "off";
>> -				};
>> -
>> -				green_led {
>> -					label = "green_led";
>> -					gpios = <&gpio1 21 1>;
>> -					default-state = "off";
>> -					linux,default-trigger = "heartbeat";
>> -				};
>> -			};
>> -
>> -			gpio_keys {
>> -				compatible = "gpio-keys";
>> -				#address-cells = <1>;
>> -				#size-cells = <0>;
>> -
>> -				button at 1 {
>> -					label = "Init Button";
>> -					linux,code = <116>;
>> -					gpios = <&gpio1 28 0>;
>> -				};
>> -			};
>> -
>> -			mdio {
>> -				phy0: ethernet-phy at 0 {
>> -					reg = <0>;
>> -				};
>> -
>> -				phy1: ethernet-phy at 1 {
>> -					reg = <1>;
>> -				};
>> -
>> -				phy2: ethernet-phy at 2 {
>> -					reg = <2>;
>> -				};
>> -
>> -				phy3: ethernet-phy at 3 {
>> -					reg = <3>;
>> -				};
>> -			};
>> -
>> -			ethernet at 70000 {
>> -				status = "okay";
>> -				phy = <&phy0>;
>> -				phy-mode = "sgmii";
>> -			};
>> -			ethernet at 74000 {
>> -				status = "okay";
>> -				phy = <&phy1>;
>> -				phy-mode = "sgmii";
>> -			};
>> -			ethernet at 30000 {
>> -				status = "okay";
>> -				phy = <&phy2>;
>> -				phy-mode = "sgmii";
>> -			};
>> -			ethernet at 34000 {
>> -				status = "okay";
>> -				phy = <&phy3>;
>> -				phy-mode = "sgmii";
>> -			};
>> -			i2c at 11000 {
>> -				status = "okay";
>> -				clock-frequency = <400000>;
>> -			};
>> -			i2c at 11100 {
>> -				status = "okay";
>> -				clock-frequency = <400000>;
>> -
>> -				s35390a: s35390a at 30 {
>> -					compatible = "s35390a";
>> -					reg = <0x30>;
>> -				};
>> -			};
>> -			sata at a0000 {
>> -				nr-ports = <2>;
>> -				status = "okay";
>> -			};
>> -
>> -			/* Front side USB 0 */
>> -			usb at 50000 {
>> -				status = "okay";
>> -			};
>> -
>> -			/* Front side USB 1 */
>> -			usb at 51000 {
>> -				status = "okay";
>> -			};
>> -		};
>> -	};
>>  };
>> -- 
>> 1.8.1.2
>>

-- 
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com