fsi: Add IBM I2C Responder virtual FSI master
Subsystems (3)
Eddie James
maintainerv4 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
Eddie James
maintainerPATCH 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
@@ -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
Eddie James
maintainerPATCH v4 2/2 fsi: Add IBM I2C Responder virtual FSI master
In reply to Eddie JamesThe 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
@@ -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
@@ -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
Steven Rostedt
maintainerinclude/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) +); +