Skip to contentSkip to conversation

fsi: Add IBM I2C Responder virtual FSI master

PATCH Superseded Eddie James 2 participants 4 messages Feb 2, 2023

Subsystems (3)

v4 of 8 Superseded Latest is v8 →

lore
Share & tools
lore

Eddie James

author maintainer
#0 lore raw

v4 cover fsi: Add IBM I2C Responder virtual FSI master

The I2C Responder (I2CR) is an I2C device that translates I2C commands to CFAM or SCOM operations, effectively implementing an FSI master and bus.

Changes since v3:
- Rework the endian-ness in i2cr_write
- Rework the tracing to include the i2c bus and device address

Changes since v2:
- Fix the bindings again, sorry for the spam

Changes since v1:
- Fix the binding document
- Change the binding name
- Clean up the size argument checking
- Reduce __force by using packed struct for the command

Eddie James (2):
dt-bindings: fsi: Document the IBM I2C Responder virtual FSI master
fsi: Add IBM I2C Responder virtual FSI master

 .../bindings/fsi/ibm,i2cr-fsi-master.yaml     |  41 ++++
 drivers/fsi/Kconfig                           |   9 +
 drivers/fsi/Makefile                          |   1 +
 drivers/fsi/fsi-master-i2cr.c                 | 218 ++++++++++++++++++
 include/trace/events/fsi_master_i2cr.h        | 109 +++++++++
 5 files changed, 378 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/fsi/ibm,i2cr-fsi-master.yaml
 create mode 100644 drivers/fsi/fsi-master-i2cr.c
 create mode 100644 include/trace/events/fsi_master_i2cr.h
Signature · 1 line
2.31.1
author maintainer
#1 lore raw

PATCH v4 1/2 dt-bindings: fsi: Document the IBM I2C Responder virtual FSI master

The I2C Responder translates I2C commands to CFAM or SCOM operations, effectively implementing an FSI master.

---
 .../bindings/fsi/ibm,i2cr-fsi-master.yaml     | 41 +++++++++++++++++++
 1 file changed, 41 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/fsi/ibm,i2cr-fsi-master.yaml
Documentation/devicetree/bindings/fsi/ibm,i2cr-fsi-master.yaml new file +41 -0
new file mode 100644
index 000000000000..442cecdc57cb
@@ -0,0 +1,41 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/fsi/ibm,i2cr-fsi-master.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: IBM I2C Responder virtual FSI master
+
+maintainers:
+  - Eddie James <[email protected]>
+
+description: |
+  The I2C Responder (I2CR) is a an I2C device that's connected to an FSI CFAM
+  (see fsi.txt). The I2CR translates I2C bus operations to FSI CFAM reads and
+  writes or SCOM operations, thereby acting as an FSI master.
+
+properties:
+  compatible:
+    enum:
+      - ibm,i2cr-fsi-master
+
+  reg:
+    maxItems: 1
+
+required:
+  - compatible
+  - reg
+
+additionalProperties: false
+
+examples:
+  - |
+    i2c {
+      #address-cells = <1>;
+      #size-cells = <0>;
+
+      i2cr@20 {
+        compatible = "ibm,i2cr-fsi-master";
+        reg = <0x20>;
+      };
+    };
Signature · 1 line
2.31.1
author maintainer
#2 lore raw

PATCH v4 2/2 fsi: Add IBM I2C Responder virtual FSI master

In reply to Eddie James

The I2C Responder (I2CR) is an I2C device that translates I2C commands to CFAM or SCOM operations, effectively implementing an FSI master and bus.

---
Changes since v3:
- Rework the endian-ness in i2cr_write
- Rework the tracing to include the i2c bus and device address

 drivers/fsi/Kconfig                    |   9 +
 drivers/fsi/Makefile                   |   1 +
 drivers/fsi/fsi-master-i2cr.c          | 218 +++++++++++++++++++++++++
 include/trace/events/fsi_master_i2cr.h | 109 +++++++++++++
 4 files changed, 337 insertions(+)
 create mode 100644 drivers/fsi/fsi-master-i2cr.c
 create mode 100644 include/trace/events/fsi_master_i2cr.h
drivers/fsi/Kconfig +9 -0
index e6668a869913..999be82720c5 100644
@@ -62,6 +62,15 @@ config FSI_MASTER_ASPEED
 
 	 Enable it for your BMC kernel in an OpenPower or IBM Power system.
 
+config FSI_MASTER_I2CR
+	tristate "IBM I2C Responder virtual FSI master"
+	depends on I2C
+	help
+	  This option enables a virtual FSI master in order to access a CFAM
+	  behind an IBM I2C Responder (I2CR) chip. The I2CR is an I2C device
+	  that translates I2C commands to CFAM or SCOM operations, effectively
+	  implementing an FSI master and bus.
+
 config FSI_SCOM
 	tristate "SCOM FSI client device driver"
 	help
drivers/fsi/Makefile +1 -0
index da218a1ad8e1..34dbaa1c452e 100644
@@ -4,6 +4,7 @@ obj-$(CONFIG_FSI) += fsi-core.o
 obj-$(CONFIG_FSI_MASTER_HUB) += fsi-master-hub.o
 obj-$(CONFIG_FSI_MASTER_ASPEED) += fsi-master-aspeed.o
 obj-$(CONFIG_FSI_MASTER_GPIO) += fsi-master-gpio.o
+obj-$(CONFIG_FSI_MASTER_I2CR) += fsi-master-i2cr.o
 obj-$(CONFIG_FSI_MASTER_AST_CF) += fsi-master-ast-cf.o
 obj-$(CONFIG_FSI_SCOM) += fsi-scom.o
 obj-$(CONFIG_FSI_SBEFIFO) += fsi-sbefifo.o
drivers/fsi/fsi-master-i2cr.c new file +218 -0

218 lines not on this page · raw message

include/trace/events/fsi_master_i2cr.h new file +109 -0

109 lines not on this page · raw message

Signature · 1 line
2.31.1
maintainer
#3 lore raw

include/trace/events/fsi_master_i2cr.h line 16

Quoted 8 lines · On Thu, 2 Feb 2023 13:19:26 -0600 Eddie James <[email protected]> wrote:
include/trace/events/fsi_master_i2cr.h new file +8 -0
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(i2cr_i2c_error,
+	TP_PROTO(const struct i2c_client *client, __be32 command, int rc),
+	TP_ARGS(client, command, rc),
+	TP_STRUCT__entry(
+		__field(int, bus)
+		__field(unsigned short, addr)

For all of these, I would put the "unsigned short addr" at the end of the TP_STRUCT__entry(). That's because you will inject two wasted bytes in the structure that is generated. Granted, the tracing will likely word align the result anyway, but still, we don't want holes in the middle of the structure.

-- Steve

Quoted 34 lines
include/trace/events/fsi_master_i2cr.h new file +34 -0
+		__array(unsigned char, command, sizeof(__be32))
+		__field(int, rc)
+	),
+	TP_fast_assign(
+		__entry->bus = client->adapter->nr;
+		__entry->addr = client->addr;
+		memcpy(__entry->command, &command, sizeof(__be32));
+		__entry->rc = rc;
+	),
+	TP_printk("%d-%02x command:{ %*ph } rc:%d", __entry->bus, __entry->addr,
+		  (int)sizeof(__be32), __entry->command, __entry->rc)
+);
+
+TRACE_EVENT(i2cr_read,
+	TP_PROTO(const struct i2c_client *client, uint32_t address, size_t size, __be64 result),
+	TP_ARGS(client, address, size, result),
+	TP_STRUCT__entry(
+		__field(int, bus)
+		__field(unsigned short, addr)
+		__field(uint32_t, address)
+		__field(size_t, size)
+		__array(unsigned char, result, sizeof(__be64))
+	),
+	TP_fast_assign(
+		__entry->bus = client->adapter->nr;
+		__entry->addr = client->addr;
+		__entry->address = address;
+		__entry->size = size;
+		memcpy(__entry->result, &result, sizeof(__be64));
+	),
+	TP_printk("%d-%02x address:%08x size:%zu { %*ph }", __entry->bus, __entry->addr,
+		  __entry->address, __entry->size, (int)__entry->size, __entry->result)
+);
+