diff mbox series

[v5,04/12] arm: mvebu: clearfog: initial ClearFog Base variant

Message ID 20200127200156.15173-5-mrjoel@lixil.net
State New
Headers show
Series ClearFog Base static variant support | expand

Commit Message

Joel Johnson Jan. 27, 2020, 8:01 p.m. UTC
Add a unique entry for ClearFog Base variant, reflected in the board
name and adjusted SerDes topology.

Signed-off-by: Joel Johnson <mrjoel at lixil.net>

---

v2 changes:
  - reworked based on Baruch's run-time TLV EEPROM detection series
v3 changes:
  - rebased on mvebu merged run-time TLV EEPROM detection series
  - minor update to help test regarding runtime detection failures
v4 changes:
  - use runtime static config adjust instead of #ifdef in cases where
    hardware EEPROM detection fails or is disabled in build
    SPL size change for defconfig increases 36 bytes (122893 to 122929)
    SPL size change for defconfig+Base increases 60 bytes (122893 to 122953)
  - add placeholder support for EEPROM based Clearfog Pro, based on
    initial name confirmation from Baruch. I wanted to include the check
    at least in the patch for review to indicate expected usage to
    ensure that a Clearfog Pro EEPROM device boots correctly even if the
    image is built with Base static configuration. If there are other
    prerelease concerns and this should be added separately later, I'd
    be fine with that too.
  - Note that this approach *does not* currently provide any mechanism
    for EEPROM detected boards to have their SFP speed changed or switch
    between PCIE/SATA signalling. I'm assuming that will be done based on
    hardware detection, but confirmation/acceptance in review would be
    appreciated so it can be revisited if needed.
v5 changes:
  - only make Base variant adjustment based on runtime configuration

---
 arch/arm/mach-mvebu/Kconfig        |  2 ++
 board/solidrun/clearfog/Kconfig    | 18 ++++++++++++++++++
 board/solidrun/clearfog/clearfog.c | 29 +++++++++++++++++++++++------
 3 files changed, 43 insertions(+), 6 deletions(-)
 create mode 100644 board/solidrun/clearfog/Kconfig

Comments

Stefan Roese March 23, 2020, 9:11 a.m. UTC | #1
On 27.01.20 21:01, Joel Johnson wrote:
> Add a unique entry for ClearFog Base variant, reflected in the board
> name and adjusted SerDes topology.
> 
> Signed-off-by: Joel Johnson <mrjoel at lixil.net>
> 
> ---
> 
> v2 changes:
>    - reworked based on Baruch's run-time TLV EEPROM detection series
> v3 changes:
>    - rebased on mvebu merged run-time TLV EEPROM detection series
>    - minor update to help test regarding runtime detection failures
> v4 changes:
>    - use runtime static config adjust instead of #ifdef in cases where
>      hardware EEPROM detection fails or is disabled in build
>      SPL size change for defconfig increases 36 bytes (122893 to 122929)
>      SPL size change for defconfig+Base increases 60 bytes (122893 to 122953)
>    - add placeholder support for EEPROM based Clearfog Pro, based on
>      initial name confirmation from Baruch. I wanted to include the check
>      at least in the patch for review to indicate expected usage to
>      ensure that a Clearfog Pro EEPROM device boots correctly even if the
>      image is built with Base static configuration. If there are other
>      prerelease concerns and this should be added separately later, I'd
>      be fine with that too.
>    - Note that this approach *does not* currently provide any mechanism
>      for EEPROM detected boards to have their SFP speed changed or switch
>      between PCIE/SATA signalling. I'm assuming that will be done based on
>      hardware detection, but confirmation/acceptance in review would be
>      appreciated so it can be revisited if needed.
> v5 changes:
>    - only make Base variant adjustment based on runtime configuration
> 
> ---
>   arch/arm/mach-mvebu/Kconfig        |  2 ++
>   board/solidrun/clearfog/Kconfig    | 18 ++++++++++++++++++
>   board/solidrun/clearfog/clearfog.c | 29 +++++++++++++++++++++++------
>   3 files changed, 43 insertions(+), 6 deletions(-)
>   create mode 100644 board/solidrun/clearfog/Kconfig
> 
> diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
> index bc5eaa5a76..161dee937f 100644
> --- a/arch/arm/mach-mvebu/Kconfig
> +++ b/arch/arm/mach-mvebu/Kconfig
> @@ -280,4 +280,6 @@ config SECURED_MODE_CSK_INDEX
>   	default 0
>   	depends on SECURED_MODE_IMAGE
>   
> +source "board/solidrun/clearfog/Kconfig"
> +
>   endif
> diff --git a/board/solidrun/clearfog/Kconfig b/board/solidrun/clearfog/Kconfig
> new file mode 100644
> index 0000000000..936d5918f8
> --- /dev/null
> +++ b/board/solidrun/clearfog/Kconfig
> @@ -0,0 +1,18 @@
> +menu "ClearFog configuration"
> +	depends on TARGET_CLEARFOG
> +
> +config TARGET_CLEARFOG_BASE
> +	bool "Use ClearFog Base static configuration"
> +	help
> +	  Use the ClearFog Base as the static configuration instead of the
> +	  default which uses the ClearFog Pro.
> +
> +	  Runtime board detection is always attempted and used if available. The
> +	  static configuration is used as a fallback in cases where runtime
> +	  detection is disabled, is not available in hardware, or otherwise fails.
> +
> +	  Only newer revisions of the ClearFog product line support runtime
> +	  detection via additional EEPROM hardware. This option enables selecting
> +	  the Base variant for older hardware revisions.
> +
> +endmenu
> diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c
> index 9b31902c70..c873d00905 100644
> --- a/board/solidrun/clearfog/clearfog.c
> +++ b/board/solidrun/clearfog/clearfog.c
> @@ -42,6 +42,7 @@ static void cf_read_tlv_data(void)
>   	read_tlv_data(&cf_tlv_data);
>   }
>   
> +/* The starting board_serdes_map reflects original Clearfog Pro usage */
>   static struct serdes_map board_serdes_map[] = {
>   	{SATA0, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
>   	{SGMII1, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
> @@ -51,6 +52,13 @@ static struct serdes_map board_serdes_map[] = {
>   	{SGMII2, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
>   };
>   
> +void config_cfbase_serdes_map(void)
> +{
> +	board_serdes_map[4].serdes_type = USB3_HOST0;
> +	board_serdes_map[4].serdes_speed = SERDES_SPEED_5_GBPS;
> +	board_serdes_map[4].serdes_mode = SERDES_DEFAULT_MODE;
> +}
> +
>   int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
>   {
>   	cf_read_tlv_data();
> @@ -59,12 +67,17 @@ int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
>   		board_serdes_map[0].serdes_type = PEX0;
>   		board_serdes_map[0].serdes_speed = SERDES_SPEED_5_GBPS;
>   		board_serdes_map[0].serdes_mode = PEX_ROOT_COMPLEX_X1;
> -	}
> -
> -	if (sr_product_is(&cf_tlv_data, "Clearfog Base")) {
> -		board_serdes_map[4].serdes_type = USB3_HOST0;
> -		board_serdes_map[4].serdes_speed = SERDES_SPEED_5_GBPS;
> -		board_serdes_map[4].serdes_mode = SERDES_DEFAULT_MODE;
> +	} else if (sr_product_is(&cf_tlv_data, "Clearfog Pro")) {
> +		/* handle recognized product as noop, no adjustment required */
> +	} else if (sr_product_is(&cf_tlv_data, "Clearfog Base")) {
> +		config_cfbase_serdes_map();
> +	} else if (IS_ENABLED(CONFIG_TARGET_CLEARFOG_BASE)) {
> +		/*
> +		 * Fallback to static default. Runtime detection failed,
> +		 * hardware support is not present, EEPROM is corrupt,
> +		 * or an unrecognized product name is present.
> +		 */
> +		config_cfbase_serdes_map();
>   	}

Would it make sense to add a message, if no board type has been
"detected" here at all (else case)?

Thanks,
Stefan
Joel Johnson March 23, 2020, 3:27 p.m. UTC | #2
On 2020-03-23 03:11, Stefan Roese wrote:
> On 27.01.20 21:01, Joel Johnson wrote:
>> Add a unique entry for ClearFog Base variant, reflected in the board
>> name and adjusted SerDes topology.
>> 
>> Signed-off-by: Joel Johnson <mrjoel at lixil.net>
>> 
>> ---
>> 
>> v2 changes:
>>    - reworked based on Baruch's run-time TLV EEPROM detection series
>> v3 changes:
>>    - rebased on mvebu merged run-time TLV EEPROM detection series
>>    - minor update to help test regarding runtime detection failures
>> v4 changes:
>>    - use runtime static config adjust instead of #ifdef in cases where
>>      hardware EEPROM detection fails or is disabled in build
>>      SPL size change for defconfig increases 36 bytes (122893 to 
>> 122929)
>>      SPL size change for defconfig+Base increases 60 bytes (122893 to 
>> 122953)
>>    - add placeholder support for EEPROM based Clearfog Pro, based on
>>      initial name confirmation from Baruch. I wanted to include the 
>> check
>>      at least in the patch for review to indicate expected usage to
>>      ensure that a Clearfog Pro EEPROM device boots correctly even if 
>> the
>>      image is built with Base static configuration. If there are other
>>      prerelease concerns and this should be added separately later, 
>> I'd
>>      be fine with that too.
>>    - Note that this approach *does not* currently provide any 
>> mechanism
>>      for EEPROM detected boards to have their SFP speed changed or 
>> switch
>>      between PCIE/SATA signalling. I'm assuming that will be done 
>> based on
>>      hardware detection, but confirmation/acceptance in review would 
>> be
>>      appreciated so it can be revisited if needed.
>> v5 changes:
>>    - only make Base variant adjustment based on runtime configuration
>> 
>> ---
>>   arch/arm/mach-mvebu/Kconfig        |  2 ++
>>   board/solidrun/clearfog/Kconfig    | 18 ++++++++++++++++++
>>   board/solidrun/clearfog/clearfog.c | 29 
>> +++++++++++++++++++++++------
>>   3 files changed, 43 insertions(+), 6 deletions(-)
>>   create mode 100644 board/solidrun/clearfog/Kconfig
>> 
>> diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
>> index bc5eaa5a76..161dee937f 100644
>> --- a/arch/arm/mach-mvebu/Kconfig
>> +++ b/arch/arm/mach-mvebu/Kconfig
>> @@ -280,4 +280,6 @@ config SECURED_MODE_CSK_INDEX
>>   	default 0
>>   	depends on SECURED_MODE_IMAGE
>>   +source "board/solidrun/clearfog/Kconfig"
>> +
>>   endif
>> diff --git a/board/solidrun/clearfog/Kconfig 
>> b/board/solidrun/clearfog/Kconfig
>> new file mode 100644
>> index 0000000000..936d5918f8
>> --- /dev/null
>> +++ b/board/solidrun/clearfog/Kconfig
>> @@ -0,0 +1,18 @@
>> +menu "ClearFog configuration"
>> +	depends on TARGET_CLEARFOG
>> +
>> +config TARGET_CLEARFOG_BASE
>> +	bool "Use ClearFog Base static configuration"
>> +	help
>> +	  Use the ClearFog Base as the static configuration instead of the
>> +	  default which uses the ClearFog Pro.
>> +
>> +	  Runtime board detection is always attempted and used if available. 
>> The
>> +	  static configuration is used as a fallback in cases where runtime
>> +	  detection is disabled, is not available in hardware, or otherwise 
>> fails.
>> +
>> +	  Only newer revisions of the ClearFog product line support runtime
>> +	  detection via additional EEPROM hardware. This option enables 
>> selecting
>> +	  the Base variant for older hardware revisions.
>> +
>> +endmenu
>> diff --git a/board/solidrun/clearfog/clearfog.c 
>> b/board/solidrun/clearfog/clearfog.c
>> index 9b31902c70..c873d00905 100644
>> --- a/board/solidrun/clearfog/clearfog.c
>> +++ b/board/solidrun/clearfog/clearfog.c
>> @@ -42,6 +42,7 @@ static void cf_read_tlv_data(void)
>>   	read_tlv_data(&cf_tlv_data);
>>   }
>>   +/* The starting board_serdes_map reflects original Clearfog Pro 
>> usage */
>>   static struct serdes_map board_serdes_map[] = {
>>   	{SATA0, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
>>   	{SGMII1, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
>> @@ -51,6 +52,13 @@ static struct serdes_map board_serdes_map[] = {
>>   	{SGMII2, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
>>   };
>>   +void config_cfbase_serdes_map(void)
>> +{
>> +	board_serdes_map[4].serdes_type = USB3_HOST0;
>> +	board_serdes_map[4].serdes_speed = SERDES_SPEED_5_GBPS;
>> +	board_serdes_map[4].serdes_mode = SERDES_DEFAULT_MODE;
>> +}
>> +
>>   int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 
>> *count)
>>   {
>>   	cf_read_tlv_data();
>> @@ -59,12 +67,17 @@ int hws_board_topology_load(struct serdes_map 
>> **serdes_map_array, u8 *count)
>>   		board_serdes_map[0].serdes_type = PEX0;
>>   		board_serdes_map[0].serdes_speed = SERDES_SPEED_5_GBPS;
>>   		board_serdes_map[0].serdes_mode = PEX_ROOT_COMPLEX_X1;
>> -	}
>> -
>> -	if (sr_product_is(&cf_tlv_data, "Clearfog Base")) {
>> -		board_serdes_map[4].serdes_type = USB3_HOST0;
>> -		board_serdes_map[4].serdes_speed = SERDES_SPEED_5_GBPS;
>> -		board_serdes_map[4].serdes_mode = SERDES_DEFAULT_MODE;
>> +	} else if (sr_product_is(&cf_tlv_data, "Clearfog Pro")) {
>> +		/* handle recognized product as noop, no adjustment required */
>> +	} else if (sr_product_is(&cf_tlv_data, "Clearfog Base")) {
>> +		config_cfbase_serdes_map();
>> +	} else if (IS_ENABLED(CONFIG_TARGET_CLEARFOG_BASE)) {
>> +		/*
>> +		 * Fallback to static default. Runtime detection failed,
>> +		 * hardware support is not present, EEPROM is corrupt,
>> +		 * or an unrecognized product name is present.
>> +		 */
>> +		config_cfbase_serdes_map();
>>   	}
> 
> Would it make sense to add a message, if no board type has been
> "detected" here at all (else case)?
> 
> Thanks,
> Stefan

I suppose it could, I was using the printed board model but that itself 
isn't enough to distinguish between an EEPROM detected unit and a static 
fallback.

Joel
diff mbox series

Patch

diff --git a/arch/arm/mach-mvebu/Kconfig b/arch/arm/mach-mvebu/Kconfig
index bc5eaa5a76..161dee937f 100644
--- a/arch/arm/mach-mvebu/Kconfig
+++ b/arch/arm/mach-mvebu/Kconfig
@@ -280,4 +280,6 @@  config SECURED_MODE_CSK_INDEX
 	default 0
 	depends on SECURED_MODE_IMAGE
 
+source "board/solidrun/clearfog/Kconfig"
+
 endif
diff --git a/board/solidrun/clearfog/Kconfig b/board/solidrun/clearfog/Kconfig
new file mode 100644
index 0000000000..936d5918f8
--- /dev/null
+++ b/board/solidrun/clearfog/Kconfig
@@ -0,0 +1,18 @@ 
+menu "ClearFog configuration"
+	depends on TARGET_CLEARFOG
+
+config TARGET_CLEARFOG_BASE
+	bool "Use ClearFog Base static configuration"
+	help
+	  Use the ClearFog Base as the static configuration instead of the
+	  default which uses the ClearFog Pro.
+
+	  Runtime board detection is always attempted and used if available. The
+	  static configuration is used as a fallback in cases where runtime
+	  detection is disabled, is not available in hardware, or otherwise fails.
+
+	  Only newer revisions of the ClearFog product line support runtime
+	  detection via additional EEPROM hardware. This option enables selecting
+	  the Base variant for older hardware revisions.
+
+endmenu
diff --git a/board/solidrun/clearfog/clearfog.c b/board/solidrun/clearfog/clearfog.c
index 9b31902c70..c873d00905 100644
--- a/board/solidrun/clearfog/clearfog.c
+++ b/board/solidrun/clearfog/clearfog.c
@@ -42,6 +42,7 @@  static void cf_read_tlv_data(void)
 	read_tlv_data(&cf_tlv_data);
 }
 
+/* The starting board_serdes_map reflects original Clearfog Pro usage */
 static struct serdes_map board_serdes_map[] = {
 	{SATA0, SERDES_SPEED_3_GBPS, SERDES_DEFAULT_MODE, 0, 0},
 	{SGMII1, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
@@ -51,6 +52,13 @@  static struct serdes_map board_serdes_map[] = {
 	{SGMII2, SERDES_SPEED_1_25_GBPS, SERDES_DEFAULT_MODE, 0, 0},
 };
 
+void config_cfbase_serdes_map(void)
+{
+	board_serdes_map[4].serdes_type = USB3_HOST0;
+	board_serdes_map[4].serdes_speed = SERDES_SPEED_5_GBPS;
+	board_serdes_map[4].serdes_mode = SERDES_DEFAULT_MODE;
+}
+
 int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
 {
 	cf_read_tlv_data();
@@ -59,12 +67,17 @@  int hws_board_topology_load(struct serdes_map **serdes_map_array, u8 *count)
 		board_serdes_map[0].serdes_type = PEX0;
 		board_serdes_map[0].serdes_speed = SERDES_SPEED_5_GBPS;
 		board_serdes_map[0].serdes_mode = PEX_ROOT_COMPLEX_X1;
-	}
-
-	if (sr_product_is(&cf_tlv_data, "Clearfog Base")) {
-		board_serdes_map[4].serdes_type = USB3_HOST0;
-		board_serdes_map[4].serdes_speed = SERDES_SPEED_5_GBPS;
-		board_serdes_map[4].serdes_mode = SERDES_DEFAULT_MODE;
+	} else if (sr_product_is(&cf_tlv_data, "Clearfog Pro")) {
+		/* handle recognized product as noop, no adjustment required */
+	} else if (sr_product_is(&cf_tlv_data, "Clearfog Base")) {
+		config_cfbase_serdes_map();
+	} else if (IS_ENABLED(CONFIG_TARGET_CLEARFOG_BASE)) {
+		/*
+		 * Fallback to static default. Runtime detection failed,
+		 * hardware support is not present, EEPROM is corrupt,
+		 * or an unrecognized product name is present.
+		 */
+		config_cfbase_serdes_map();
 	}
 
 	*serdes_map_array = board_serdes_map;
@@ -171,6 +184,8 @@  int board_init(void)
 int checkboard(void)
 {
 	char *board = "Clearfog Pro";
+	if (IS_ENABLED(CONFIG_TARGET_CLEARFOG_BASE))
+		board = "Clearfog Base";
 
 	cf_read_tlv_data();
 	if (strlen(cf_tlv_data.tlv_product_name[0]) > 0)
@@ -200,6 +215,8 @@  int board_late_init(void)
 		env_set("fdtfile", "armada-385-clearfog-gtr-s4.dtb");
 	else if (sr_product_is(&cf_tlv_data, "Clearfog GTR L8"))
 		env_set("fdtfile", "armada-385-clearfog-gtr-l8.dtb");
+	else if (IS_ENABLED(CONFIG_TARGET_CLEARFOG_BASE))
+		env_set("fdtfile", "armada-388-clearfog-base.dtb");
 
 	return 0;
 }