[9/9] platforms: Add OpenCAPI platform data and device tree nodes

Message ID 1984256e1dda723c36f624667a1af535a216083f.1513579137.git-series.andrew.donnellan@au1.ibm.com
State Changes Requested
Headers show
Series
  • Initial OpenCAPI 3.0 Support for P9
Related show

Commit Message

Andrew Donnellan Dec. 18, 2017, 7:08 a.m.
Add OpenCAPI platform data for the zaius and zz platforms, as well as the
generic platform that's used for BML boots. Currently, all three platforms
are identical, but that won't always be the case (e.g. Witherspoon).

Additionally, for Zaius, hardcode link information and the I2C bus that's
required to reset OpenCAPI devices, because this currently can't be
extracted from HDAT. Eventually this will go away once Hostboot adds the
relevant data in HDAT. A later patch will add this for ZZ once we've done
more testing.

Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
---
 core/platform.c          | 13 ++++++-
 platforms/astbmc/zaius.c | 89 +++++++++++++++++++++++++++++++++++++++++-
 platforms/ibm-fsp/zz.c   | 13 ++++++-
 3 files changed, 115 insertions(+)

Comments

Frederic Barrat Jan. 11, 2018, 3:08 p.m. | #1
Le 18/12/2017 à 08:08, Andrew Donnellan a écrit :
> Add OpenCAPI platform data for the zaius and zz platforms, as well as the
> generic platform that's used for BML boots. Currently, all three platforms
> are identical, but that won't always be the case (e.g. Witherspoon).
> 
> Additionally, for Zaius, hardcode link information and the I2C bus that's
> required to reset OpenCAPI devices, because this currently can't be
> extracted from HDAT. Eventually this will go away once Hostboot adds the
> relevant data in HDAT. A later patch will add this for ZZ once we've done
> more testing.
> 
> Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
> ---
>   core/platform.c          | 13 ++++++-
>   platforms/astbmc/zaius.c | 89 +++++++++++++++++++++++++++++++++++++++++-
>   platforms/ibm-fsp/zz.c   | 13 ++++++-
>   3 files changed, 115 insertions(+)
> 
> diff --git a/core/platform.c b/core/platform.c
> index 6816fe5..8f2bf0a 100644
> --- a/core/platform.c
> +++ b/core/platform.c
> @@ -168,6 +168,18 @@ static int generic_start_preload_resource(enum resource_id id, uint32_t subid,
>   	return OPAL_EMPTY;
>   }
> 
> +/* These values will work for a ZZ booted using BML */
> +const struct platform_ocapi generic_ocapi = {
> +	.i2c_voltage_18	= false,
> +	.i2c_engine	= 1,
> +	.i2c_port	= 4,
> +	.i2c_offset	= { 0x3, 0x1, 0x1 },
> +	.i2c_odl0_data	= { 0xFD, 0xFD, 0xFF },
> +	.i2c_odl1_data	= { 0xBF, 0xBF, 0xFF },
> +	.i2c_odl01_data	= { 0xBD, 0xBD, 0xFF },
> +	.odl_phy_swap	= true,
> +};
> +
>   static struct bmc_platform generic_bmc = {
>   	.name = "generic",
>   };
> @@ -183,6 +195,7 @@ static struct platform generic_platform = {
>   	.cec_power_down	= generic_cec_power_down,
>   	.start_preload_resource	= generic_start_preload_resource,
>   	.resource_loaded	= generic_resource_loaded,
> +	.ocapi		= &generic_ocapi,
>   };
> 
>   const struct bmc_platform *bmc_platform = &generic_bmc;
> diff --git a/platforms/astbmc/zaius.c b/platforms/astbmc/zaius.c
> index 74c7f13..307b57d 100644
> --- a/platforms/astbmc/zaius.c
> +++ b/platforms/astbmc/zaius.c
> @@ -24,6 +24,91 @@
> 
>   #include "astbmc.h"
> 
> +const struct platform_ocapi zaius_ocapi = {
> +	.i2c_voltage_18	= false,
> +	.i2c_engine	= 1,
> +	.i2c_port	= 4,
> +	.i2c_offset	= { 0x3, 0x1, 0x1 },
> +	.i2c_odl0_data	= { 0xFD, 0xFD, 0xFF },
> +	.i2c_odl1_data	= { 0xBF, 0xBF, 0xFF },
> +	.i2c_odl01_data	= { 0xBD, 0xBD, 0xFF },
> +	.odl_phy_swap	= true,
> +};
> +
> +#define NPU_BASE 0x5011000
> +#define NPU_SIZE 0x2c
> +#define NPU_INDIRECT0	0x8000000009010c3f /* OB0 - no OB3 on Zaius */
> +
> +/* OpenCAPI only */
> +static void create_link(struct dt_node *npu, int group, int index)
> +{
> +	struct dt_node *link;
> +	uint32_t lane_mask;
> +	char namebuf[32];
> +
> +	snprintf(namebuf, sizeof(namebuf), "link@%x", index);
> +	link = dt_new(npu, namebuf);
> +
> +	dt_add_property_string(link, "compatible", "ibm,npu-link-opencapi");
> +	dt_add_property_cells(link, "ibm,npu-link-index", index);
> +
> +	switch (index) {
> +	case 2:
> +		lane_mask = 0x00078f;
> +		break;
> +	case 3:
> +		lane_mask = 0xf1e000;
> +		break;
> +	default:
> +		assert(0);
> +	}
> +
> +	dt_add_property_u64s(link, "ibm,npu-phy", NPU_INDIRECT0);
> +	dt_add_property_cells(link, "ibm,npu-lane-mask", lane_mask);
> +	dt_add_property_cells(link, "ibm,npu-group-id", group);
> +}
> +
> +static void zaius_create_npu(void)
> +{
> +	struct dt_node *xscom, *npu;
> +	int npu_index = 0;
> +	int phb_index = 7;
> +	char namebuf[32];
> +	prlog(PR_DEBUG, "OCAPI: Adding NPU device nodes\n");
> +	dt_for_each_compatible(dt_root, xscom, "ibm,xscom") {
> +		snprintf(namebuf, sizeof(namebuf), "npu@%x", NPU_BASE);
> +		npu = dt_new(xscom, namebuf);


Maybe we should test for its existence before adding it, to prepare for 
when it will be added by hostboot/HDAT. If not, running an old skiboot 
on a newer hostboot will lead to... I'm not sure what, but likely 
nothing good.

Same applies for the i2c port below.

   Fred

> +		dt_add_property_cells(npu, "reg", NPU_BASE, NPU_SIZE);
> +		dt_add_property_strings(npu, "compatible", "ibm,power9-npu");
> +		dt_add_property_cells(npu, "ibm,npu-index", npu_index++);
> +		dt_add_property_cells(npu, "ibm,phb-index", phb_index++);
> +		dt_add_property_cells(npu, "ibm,npu-links", 2);
> +		create_link(npu, 1, 2);
> +		create_link(npu, 2, 3);
> +		break;
> +	}
> +}
> +
> +/* FIXME: Get rid of this once hostboot/MRW gives us correct i2c details */
> +static void zaius_create_ocapi_i2c_bus(void)
> +{
> +	struct dt_node *xscom, *i2cm, *i2c_bus;
> +	prlog(PR_DEBUG, "OCAPI: Adding I2C bus device node for OCAPI reset\n");
> +	dt_for_each_compatible(dt_root, xscom, "ibm,xscom") {
> +		i2cm = dt_find_by_name(xscom, "i2cm@a1000");
> +		if (!i2cm) {
> +			prlog(PR_ERR, "OCAPI: Failed to add I2C bus device node\n");
> +			continue;
> +		}
> +		i2c_bus = dt_new_addr(i2cm, "i2c-bus", 4);
> +		dt_add_property_cells(i2c_bus, "reg", 4);
> +		dt_add_property_cells(i2c_bus, "bus-frequency", 0x61a80);
> +		dt_add_property_strings(i2c_bus, "compatible",
> +					"ibm,opal-i2c", "ibm,power8-i2c-port",
> +					"ibm,power9-i2c-port");
> +	}
> +}
> +
>   static bool zaius_probe(void)
>   {
>   	if (!dt_node_is_compatible(dt_root, "ingrasys,zaius"))
> @@ -35,6 +120,9 @@ static bool zaius_probe(void)
>   	/* Setup UART for direct use by Linux */
>   	uart_set_console_policy(UART_CONSOLE_OS);
> 
> +	zaius_create_npu();
> +	zaius_create_ocapi_i2c_bus();
> +
>   	return true;
>   }
> 
> @@ -52,4 +140,5 @@ DECLARE_PLATFORM(zaius) = {
>   	.elog_commit		= ipmi_elog_commit,
>   	.exit			= ipmi_wdt_final_reset,
>   	.terminate		= ipmi_terminate,
> +	.ocapi			= &zaius_ocapi,
>   };
> diff --git a/platforms/ibm-fsp/zz.c b/platforms/ibm-fsp/zz.c
> index a8150b8..5a8a3c4 100644
> --- a/platforms/ibm-fsp/zz.c
> +++ b/platforms/ibm-fsp/zz.c
> @@ -27,6 +27,18 @@
>   #include "ibm-fsp.h"
>   #include "lxvpd.h"
> 
> +/* We don't yet create NPU device nodes on ZZ, but these values are correct */
> +const struct platform_ocapi zz_ocapi = {
> +	.i2c_voltage_18	= false,
> +	.i2c_engine	= 1,
> +	.i2c_port	= 4,
> +	.i2c_offset	= { 0x3, 0x1, 0x1 },
> +	.i2c_odl0_data	= { 0xFD, 0xFD, 0xFF },
> +	.i2c_odl1_data	= { 0xBF, 0xBF, 0xFF },
> +	.i2c_odl01_data	= { 0xBD, 0xBD, 0xFF },
> +	.odl_phy_swap	= true,
> +};
> +
>   static bool zz_probe(void)
>   {
>   	/* FIXME: make this neater when the dust settles */
> @@ -71,4 +83,5 @@ DECLARE_PLATFORM(zz) = {
>   	.resource_loaded	= fsp_resource_loaded,
>   	.sensor_read		= ibm_fsp_sensor_read,
>   	.terminate		= ibm_fsp_terminate,
> +	.ocapi			= &zz_ocapi,
>   };
>
Andrew Donnellan Jan. 12, 2018, 2:53 a.m. | #2
On 12/01/18 02:08, Frederic Barrat wrote:
>> +static void zaius_create_npu(void)
>> +{
>> +    struct dt_node *xscom, *npu;
>> +    int npu_index = 0;
>> +    int phb_index = 7;
>> +    char namebuf[32];
>> +    prlog(PR_DEBUG, "OCAPI: Adding NPU device nodes\n");
>> +    dt_for_each_compatible(dt_root, xscom, "ibm,xscom") {
>> +        snprintf(namebuf, sizeof(namebuf), "npu@%x", NPU_BASE);
>> +        npu = dt_new(xscom, namebuf);
> 
> 
> Maybe we should test for its existence before adding it, to prepare for 
> when it will be added by hostboot/HDAT. If not, running an old skiboot 
> on a newer hostboot will lead to... I'm not sure what, but likely 
> nothing good.
> 
> Same applies for the i2c port below.

ACK
Stewart Smith Jan. 16, 2018, 3:37 a.m. | #3
Andrew Donnellan <andrew.donnellan@au1.ibm.com> writes:
> Add OpenCAPI platform data for the zaius and zz platforms, as well as the
> generic platform that's used for BML boots. Currently, all three platforms
> are identical, but that won't always be the case (e.g. Witherspoon).
>
> Additionally, for Zaius, hardcode link information and the I2C bus that's
> required to reset OpenCAPI devices, because this currently can't be
> extracted from HDAT. Eventually this will go away once Hostboot adds the
> relevant data in HDAT. A later patch will add this for ZZ once we've done
> more testing.
>
> Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>

Are these device tree entries adequately covered by what's in
doc/device-tree ?
Andrew Donnellan Jan. 16, 2018, 3:40 a.m. | #4
On 16/01/18 14:37, Stewart Smith wrote:
> Andrew Donnellan <andrew.donnellan@au1.ibm.com> writes:
>> Add OpenCAPI platform data for the zaius and zz platforms, as well as the
>> generic platform that's used for BML boots. Currently, all three platforms
>> are identical, but that won't always be the case (e.g. Witherspoon).
>>
>> Additionally, for Zaius, hardcode link information and the I2C bus that's
>> required to reset OpenCAPI devices, because this currently can't be
>> extracted from HDAT. Eventually this will go away once Hostboot adds the
>> relevant data in HDAT. A later patch will add this for ZZ once we've done
>> more testing.
>>
>> Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
> 
> Are these device tree entries adequately covered by what's in
> doc/device-tree ?
> 

Good catch, will fix in v2
Andrew Donnellan Jan. 19, 2018, 3:47 a.m. | #5
On 16/01/18 14:40, Andrew Donnellan wrote:
>> Are these device tree entries adequately covered by what's in
>> doc/device-tree ?
>>
> 
> Good catch, will fix in v2

Which I then neglected to do, sigh. I'll do it for v3, I promise!

Patch

diff --git a/core/platform.c b/core/platform.c
index 6816fe5..8f2bf0a 100644
--- a/core/platform.c
+++ b/core/platform.c
@@ -168,6 +168,18 @@  static int generic_start_preload_resource(enum resource_id id, uint32_t subid,
 	return OPAL_EMPTY;
 }
 
+/* These values will work for a ZZ booted using BML */
+const struct platform_ocapi generic_ocapi = {
+	.i2c_voltage_18	= false,
+	.i2c_engine	= 1,
+	.i2c_port	= 4,
+	.i2c_offset	= { 0x3, 0x1, 0x1 },
+	.i2c_odl0_data	= { 0xFD, 0xFD, 0xFF },
+	.i2c_odl1_data	= { 0xBF, 0xBF, 0xFF },
+	.i2c_odl01_data	= { 0xBD, 0xBD, 0xFF },
+	.odl_phy_swap	= true,
+};
+
 static struct bmc_platform generic_bmc = {
 	.name = "generic",
 };
@@ -183,6 +195,7 @@  static struct platform generic_platform = {
 	.cec_power_down	= generic_cec_power_down,
 	.start_preload_resource	= generic_start_preload_resource,
 	.resource_loaded	= generic_resource_loaded,
+	.ocapi		= &generic_ocapi,
 };
 
 const struct bmc_platform *bmc_platform = &generic_bmc;
diff --git a/platforms/astbmc/zaius.c b/platforms/astbmc/zaius.c
index 74c7f13..307b57d 100644
--- a/platforms/astbmc/zaius.c
+++ b/platforms/astbmc/zaius.c
@@ -24,6 +24,91 @@ 
 
 #include "astbmc.h"
 
+const struct platform_ocapi zaius_ocapi = {
+	.i2c_voltage_18	= false,
+	.i2c_engine	= 1,
+	.i2c_port	= 4,
+	.i2c_offset	= { 0x3, 0x1, 0x1 },
+	.i2c_odl0_data	= { 0xFD, 0xFD, 0xFF },
+	.i2c_odl1_data	= { 0xBF, 0xBF, 0xFF },
+	.i2c_odl01_data	= { 0xBD, 0xBD, 0xFF },
+	.odl_phy_swap	= true,
+};
+
+#define NPU_BASE 0x5011000
+#define NPU_SIZE 0x2c
+#define NPU_INDIRECT0	0x8000000009010c3f /* OB0 - no OB3 on Zaius */
+
+/* OpenCAPI only */
+static void create_link(struct dt_node *npu, int group, int index)
+{
+	struct dt_node *link;
+	uint32_t lane_mask;
+	char namebuf[32];
+
+	snprintf(namebuf, sizeof(namebuf), "link@%x", index);
+	link = dt_new(npu, namebuf);
+
+	dt_add_property_string(link, "compatible", "ibm,npu-link-opencapi");
+	dt_add_property_cells(link, "ibm,npu-link-index", index);
+
+	switch (index) {
+	case 2:
+		lane_mask = 0x00078f;
+		break;
+	case 3:
+		lane_mask = 0xf1e000;
+		break;
+	default:
+		assert(0);
+	}
+
+	dt_add_property_u64s(link, "ibm,npu-phy", NPU_INDIRECT0);
+	dt_add_property_cells(link, "ibm,npu-lane-mask", lane_mask);
+	dt_add_property_cells(link, "ibm,npu-group-id", group);
+}
+
+static void zaius_create_npu(void)
+{
+	struct dt_node *xscom, *npu;
+	int npu_index = 0;
+	int phb_index = 7;
+	char namebuf[32];
+	prlog(PR_DEBUG, "OCAPI: Adding NPU device nodes\n");
+	dt_for_each_compatible(dt_root, xscom, "ibm,xscom") {
+		snprintf(namebuf, sizeof(namebuf), "npu@%x", NPU_BASE);
+		npu = dt_new(xscom, namebuf);
+		dt_add_property_cells(npu, "reg", NPU_BASE, NPU_SIZE);
+		dt_add_property_strings(npu, "compatible", "ibm,power9-npu");
+		dt_add_property_cells(npu, "ibm,npu-index", npu_index++);
+		dt_add_property_cells(npu, "ibm,phb-index", phb_index++);
+		dt_add_property_cells(npu, "ibm,npu-links", 2);
+		create_link(npu, 1, 2);
+		create_link(npu, 2, 3);
+		break;
+	}
+}
+
+/* FIXME: Get rid of this once hostboot/MRW gives us correct i2c details */
+static void zaius_create_ocapi_i2c_bus(void)
+{
+	struct dt_node *xscom, *i2cm, *i2c_bus;
+	prlog(PR_DEBUG, "OCAPI: Adding I2C bus device node for OCAPI reset\n");
+	dt_for_each_compatible(dt_root, xscom, "ibm,xscom") {
+		i2cm = dt_find_by_name(xscom, "i2cm@a1000");
+		if (!i2cm) {
+			prlog(PR_ERR, "OCAPI: Failed to add I2C bus device node\n");
+			continue;
+		}
+		i2c_bus = dt_new_addr(i2cm, "i2c-bus", 4);
+		dt_add_property_cells(i2c_bus, "reg", 4);
+		dt_add_property_cells(i2c_bus, "bus-frequency", 0x61a80);
+		dt_add_property_strings(i2c_bus, "compatible",
+					"ibm,opal-i2c", "ibm,power8-i2c-port",
+					"ibm,power9-i2c-port");
+	}
+}
+
 static bool zaius_probe(void)
 {
 	if (!dt_node_is_compatible(dt_root, "ingrasys,zaius"))
@@ -35,6 +120,9 @@  static bool zaius_probe(void)
 	/* Setup UART for direct use by Linux */
 	uart_set_console_policy(UART_CONSOLE_OS);
 
+	zaius_create_npu();
+	zaius_create_ocapi_i2c_bus();
+
 	return true;
 }
 
@@ -52,4 +140,5 @@  DECLARE_PLATFORM(zaius) = {
 	.elog_commit		= ipmi_elog_commit,
 	.exit			= ipmi_wdt_final_reset,
 	.terminate		= ipmi_terminate,
+	.ocapi			= &zaius_ocapi,
 };
diff --git a/platforms/ibm-fsp/zz.c b/platforms/ibm-fsp/zz.c
index a8150b8..5a8a3c4 100644
--- a/platforms/ibm-fsp/zz.c
+++ b/platforms/ibm-fsp/zz.c
@@ -27,6 +27,18 @@ 
 #include "ibm-fsp.h"
 #include "lxvpd.h"
 
+/* We don't yet create NPU device nodes on ZZ, but these values are correct */
+const struct platform_ocapi zz_ocapi = {
+	.i2c_voltage_18	= false,
+	.i2c_engine	= 1,
+	.i2c_port	= 4,
+	.i2c_offset	= { 0x3, 0x1, 0x1 },
+	.i2c_odl0_data	= { 0xFD, 0xFD, 0xFF },
+	.i2c_odl1_data	= { 0xBF, 0xBF, 0xFF },
+	.i2c_odl01_data	= { 0xBD, 0xBD, 0xFF },
+	.odl_phy_swap	= true,
+};
+
 static bool zz_probe(void)
 {
 	/* FIXME: make this neater when the dust settles */
@@ -71,4 +83,5 @@  DECLARE_PLATFORM(zz) = {
 	.resource_loaded	= fsp_resource_loaded,
 	.sensor_read		= ibm_fsp_sensor_read,
 	.terminate		= ibm_fsp_terminate,
+	.ocapi			= &zz_ocapi,
 };