* [PATCH v9 0/1] MCTP Over PCC Transport
@ 2024-12-17 18:25 admiyo
2024-12-17 18:25 ` [PATCH v9 1/1] mctp pcc: Implement MCTP over " admiyo
0 siblings, 1 reply; 6+ messages in thread
From: admiyo @ 2024-12-17 18:25 UTC (permalink / raw)
Cc: netdev, linux-kernel, Jeremy Kerr, Matt Johnston,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Sudeep Holla, Jonathan Cameron, Huisong Li
From: Adam Young <admiyo@os.amperecomputing.com>
This series adds support for the Management Control Transport Protocol (MCTP)
over the Platform Communication Channel (PCC) mechanism.
DMTF DSP:0292
https://www.dmtf.org/sites/default/files/standards/documents/DSP0292_1.0.0WIP50.pdf
MCTP defines a communication model intended to
facilitate communication between Management controllers
and other management controllers, and between Management
controllers and management devices
PCC is a mechanism for communication between components within
the Platform. It is a composed of shared memory regions,
interrupt registers, and status registers.
The MCTP over PCC driver makes use of two PCC channels. For
sending messages, it uses a Type 3 channel, and for receiving
messages it uses the paired Type 4 channel. The device
and corresponding channels are specified via ACPI.
The first patch in the series implements a mechanism to allow the driver
to indicate whether an ACK should be sent back to the caller
after processing the interrupt. This is an optional feature in
the PCC code, but has been made explicitly required in another driver.
The implementation here maintains the backwards compatibility of that
driver.
MCTP is a general purpose protocol so it would be impossible to enumerate
all the use cases, but some of the ones that are most topical are attestation
and RAS support. There are a handful of protocols built on top of MCTP, to
include PLDM and SPDM, both specified by the DMTF.
https://www.dmtf.org/sites/default/files/standards/documents/DSP0240_1.0.0.pdf
https://www.dmtf.org/sites/default/files/standards/documents/DSP0274_1.3.0.pd
SPDM entails various usages, including device identity collection, device
authentication, measurement collection, and device secure session establishment.
PLDM is more likely to be used for hardware support: temperature, voltage, or
fan sensor control.
At least two companies have devices that can make use of the mechanism. One is
Ampere Computing, my employer.
The mechanism it uses is called Platform Communication Channels is part of the
ACPI spec: https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/14_Platform_Communications_Channel/Platform_Comm_Channel.html
Since it is a socket interface, the system administrator also has the ability
to ignore an MCTP link that they do not want to enable. This link would be visible
to the end user, but would not be usable.
If MCTP support is disabled in the Kernel, this driver would also be disabled.
PCC is based on a shared buffer and a set of I/O mapped memory locations that the
Spec calls registers. This mechanism exists regardless of the existence of the
driver. Thus, if the user has the ability to map these physical location to
virtual locations, they have the ability to drive the hardware. Thus, there
is a security aspect to this mechanism that extends beyond the responsibilities
of the operating system.
If the hardware does not expose the PCC in the ACPI table, this device will never
be enabled. Thus it is only an issue on hard that does support PCC. In that case,
it is up to the remote controller to sanitize communication; MCTP will be exposed
as a socket interface, and userland can send any crafted packet it wants. It would
thus also be incumbent on the hardware manufacturer to allow the end user to disable
MCTP over PCC communication if they did not want to expose it.
Previous Version:
https://lore.kernel.org/all/20241029165414.58746-1-admiyo@os.amperecomputing.com/
Changes in V9:
- Prerequisite patch for PCC mailbox has been merged
- Stats collection now use helper functions
- many double spaces reduced to single
Changes in V8:
- change 0 to NULL for pointer check of shmem
- add semi for static version of pcc_mbox_ioremap
- convert pcc_mbox_ioremap function to static inline when client code is not being built
- remove shmem comment from struct pcc_chan_info descriptor
- copy rx_dropped in mctp_pcc_net_stats
- removed trailing newline on error message
- removed double space in dev_dbg string
- use big endian for header members
- Fix use full spec ID in description
- Fix typo in file description
- Form the complete outbound message in the sk_buff
Changes in V7:
- Removed the Hardware address as specification is not published.
- Map the shared buffer in the mailbox and share the mapped region with the driver
- Use the sk_buff memory to prepare the message before copying to shared region
Changes in V6:
- Removed patch for ACPICA code that has merged
- Includes the hardware address in the network device
- Converted all device resources to devm resources
- Removed mctp_pcc_driver_remove function
- uses acpi_driver_module for initialization
- created helper structure for in and out mailboxes
- Consolidated code for initializing mailboxes in the add_device function
- Added specification references
- Removed duplicate constant PCC_ACK_FLAG_MASK
- Use the MCTP_SIGNATURE_LENGTH define
- made naming of header structs consistent
- use sizeof local variables for offset calculations
- prefix structure name to avoid potential clash
- removed unnecessary null initialization from acpi_device_id
Changes in V5
- Removed Owner field from ACPI module declaration
- removed unused next field from struct mctp_pcc_ndev
- Corrected logic reading RX ACK flag.
- Added comment for struct pcc_chan_info field shmem_base_addr
- check against current mtu instead of max mtu for packet length\
- removed unnecessary lookups of pnd->mdev.dev
Changes in V4
- Read flags out of shared buffer to trigger ACK for Type 4 RX
- Remove list of netdevs and cleanup from devices only
- tag PCCT protocol headers as little endian
- Remove unused constants
Changes in V3
- removed unused header
- removed spurious space
- removed spurious semis after functiomns
- removed null assignment for init
- remove redundant set of device on skb
- tabify constant declarations
- added rtnl_link_stats64 function
- set MTU to minimum to start
- clean up logic on driver removal
- remove cast on void * assignment
- call cleanup function directly
- check received length before allocating skb
- introduce symbolic constatn for ACK FLAG MASK
- symbolic constant for PCC header flag.
- Add namespace ID to PCC magic
- replaced readls with copy from io of PCC header
- replaced custom modules init and cleanup with ACPI version
Changes in V2
- All Variable Declarations are in reverse Xmass Tree Format
- All Checkpatch Warnings Are Fixed
- Removed Dead code
- Added packet tx/rx stats
- Removed network physical address. This is still in
disucssion in the spec, and will be added once there
is consensus. The protocol can be used with out it.
This also lead to the removal of the Big Endian
conversions.
- Avoided using non volatile pointers in copy to and from io space
- Reorderd the patches to put the ACK check for the PCC Mailbox
as a pre-requisite. The corresponding change for the MCTP
driver has been inlined in the main patch.
- Replaced magic numbers with constants, fixed typos, and other
minor changes from code review.
Adam Young (1):
mctp pcc: Implement MCTP over PCC Transport
drivers/net/mctp/Kconfig | 13 ++
drivers/net/mctp/Makefile | 1 +
drivers/net/mctp/mctp-pcc.c | 320 ++++++++++++++++++++++++++++++++++++
3 files changed, 334 insertions(+)
create mode 100644 drivers/net/mctp/mctp-pcc.c
--
2.43.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v9 1/1] mctp pcc: Implement MCTP over PCC Transport
2024-12-17 18:25 [PATCH v9 0/1] MCTP Over PCC Transport admiyo
@ 2024-12-17 18:25 ` admiyo
2024-12-17 19:04 ` Joe Damato
0 siblings, 1 reply; 6+ messages in thread
From: admiyo @ 2024-12-17 18:25 UTC (permalink / raw)
To: Jeremy Kerr, Matt Johnston, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni
Cc: netdev, linux-kernel, Sudeep Holla, Jonathan Cameron, Huisong Li
From: Adam Young <admiyo@os.amperecomputing.com>
Implementation of network driver for
Management Control Transport Protocol(MCTP) over
Platform Communication Channel(PCC)
DMTF DSP:0292
https://www.dmtf.org/sites/default/files/standards/documents/DSP0292_1.0.0WIP50.pdf
MCTP devices are specified by entries in DSDT/SDST and
reference channels specified in the PCCT.
Communication with other devices use the PCC based
doorbell mechanism.
Signed-off-by: Adam Young <admiyo@os.amperecomputing.com>
---
drivers/net/mctp/Kconfig | 13 ++
drivers/net/mctp/Makefile | 1 +
drivers/net/mctp/mctp-pcc.c | 320 ++++++++++++++++++++++++++++++++++++
3 files changed, 334 insertions(+)
create mode 100644 drivers/net/mctp/mctp-pcc.c
diff --git a/drivers/net/mctp/Kconfig b/drivers/net/mctp/Kconfig
index 15860d6ac39f..073eb2a21841 100644
--- a/drivers/net/mctp/Kconfig
+++ b/drivers/net/mctp/Kconfig
@@ -47,6 +47,19 @@ config MCTP_TRANSPORT_I3C
A MCTP protocol network device is created for each I3C bus
having a "mctp-controller" devicetree property.
+config MCTP_TRANSPORT_PCC
+ tristate "MCTP PCC transport"
+ depends on ACPI
+ help
+ Provides a driver to access MCTP devices over PCC transport,
+ A MCTP protocol network device is created via ACPI for each
+ entry in the DST/SDST that matches the identifier. The Platform
+ communication channels are selected from the corresponding
+ entries in the PCCT.
+
+ Say y here if you need to connect to MCTP endpoints over PCC. To
+ compile as a module, use m; the module will be called mctp-pcc.
+
endmenu
endif
diff --git a/drivers/net/mctp/Makefile b/drivers/net/mctp/Makefile
index e1cb99ced54a..492a9e47638f 100644
--- a/drivers/net/mctp/Makefile
+++ b/drivers/net/mctp/Makefile
@@ -1,3 +1,4 @@
+obj-$(CONFIG_MCTP_TRANSPORT_PCC) += mctp-pcc.o
obj-$(CONFIG_MCTP_SERIAL) += mctp-serial.o
obj-$(CONFIG_MCTP_TRANSPORT_I2C) += mctp-i2c.o
obj-$(CONFIG_MCTP_TRANSPORT_I3C) += mctp-i3c.o
diff --git a/drivers/net/mctp/mctp-pcc.c b/drivers/net/mctp/mctp-pcc.c
new file mode 100644
index 000000000000..6a29b164f208
--- /dev/null
+++ b/drivers/net/mctp/mctp-pcc.c
@@ -0,0 +1,320 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * mctp-pcc.c - Driver for MCTP over PCC.
+ * Copyright (c) 2024, Ampere Computing LLC
+ */
+
+/* Implementation of MCTP over PCC DMTF Specification DSP0256
+ * https://www.dmtf.org/sites/default/files/standards/documents/DSP0256_2.0.0WIP50.pdf
+ */
+
+#include <linux/acpi.h>
+#include <linux/if_arp.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/platform_device.h>
+#include <linux/string.h>
+
+#include <acpi/acpi_bus.h>
+#include <acpi/acpi_drivers.h>
+#include <acpi/acrestyp.h>
+#include <acpi/actbl.h>
+#include <net/mctp.h>
+#include <net/mctpdevice.h>
+#include <acpi/pcc.h>
+
+#define MCTP_PAYLOAD_LENGTH 256
+#define MCTP_CMD_LENGTH 4
+#define MCTP_PCC_VERSION 0x1 /* DSP0253 defines a single version: 1 */
+#define MCTP_SIGNATURE "MCTP"
+#define MCTP_SIGNATURE_LENGTH (sizeof(MCTP_SIGNATURE) - 1)
+#define MCTP_HEADER_LENGTH 12
+#define MCTP_MIN_MTU 68
+#define PCC_MAGIC 0x50434300
+#define PCC_HEADER_FLAG_REQ_INT 0x1
+#define PCC_HEADER_FLAGS PCC_HEADER_FLAG_REQ_INT
+#define PCC_DWORD_TYPE 0x0c
+
+struct mctp_pcc_hdr {
+ __be32 signature;
+ __be32 flags;
+ __be32 length;
+ char mctp_signature[MCTP_SIGNATURE_LENGTH];
+};
+
+struct mctp_pcc_mailbox {
+ u32 index;
+ struct pcc_mbox_chan *chan;
+ struct mbox_client client;
+};
+
+/* The netdev structure. One of these per PCC adapter. */
+struct mctp_pcc_ndev {
+ /* spinlock to serialize access to PCC outbox buffer and registers
+ * Note that what PCC calls registers are memory locations, not CPU
+ * Registers. They include the fields used to synchronize access
+ * between the OS and remote endpoints.
+ *
+ * Only the Outbox needs a spinlock, to prevent multiple
+ * sent packets triggering multiple attempts to over write
+ * the outbox. The Inbox buffer is controlled by the remote
+ * service and a spinlock would have no effect.
+ */
+ spinlock_t lock;
+ struct mctp_dev mdev;
+ struct acpi_device *acpi_device;
+ struct mctp_pcc_mailbox inbox;
+ struct mctp_pcc_mailbox outbox;
+};
+
+static void mctp_pcc_client_rx_callback(struct mbox_client *c, void *buffer)
+{
+ struct mctp_pcc_ndev *mctp_pcc_ndev;
+ struct mctp_pcc_hdr mctp_pcc_hdr;
+ struct pcpu_dstats *dstats;
+ struct mctp_skb_cb *cb;
+ struct sk_buff *skb;
+ void *skb_buf;
+ u32 data_len;
+
+ mctp_pcc_ndev = container_of(c, struct mctp_pcc_ndev, inbox.client);
+ memcpy_fromio(&mctp_pcc_hdr, mctp_pcc_ndev->inbox.chan->shmem,
+ sizeof(struct mctp_pcc_hdr));
+ data_len = mctp_pcc_hdr.length + MCTP_HEADER_LENGTH;
+ skb = netdev_alloc_skb(mctp_pcc_ndev->mdev.dev, data_len);
+
+ dstats = this_cpu_ptr(mctp_pcc_ndev->mdev.dev->dstats);
+ u64_stats_update_begin(&dstats->syncp);
+ if (data_len > mctp_pcc_ndev->mdev.dev->mtu) {
+ u64_stats_inc(&dstats->rx_drops);
+ u64_stats_inc(&dstats->rx_drops);
+ u64_stats_update_end(&dstats->syncp);
+ return;
+ }
+ if (!skb) {
+ u64_stats_inc(&dstats->rx_drops);
+ u64_stats_update_end(&dstats->syncp);
+ return;
+ }
+ u64_stats_inc(&dstats->rx_packets);
+ u64_stats_add(&dstats->rx_bytes, data_len);
+ u64_stats_update_end(&dstats->syncp);
+
+ skb->protocol = htons(ETH_P_MCTP);
+ skb_buf = skb_put(skb, data_len);
+ memcpy_fromio(skb_buf, mctp_pcc_ndev->inbox.chan->shmem, data_len);
+
+ skb_reset_mac_header(skb);
+ skb_pull(skb, sizeof(struct mctp_pcc_hdr));
+ skb_reset_network_header(skb);
+ cb = __mctp_cb(skb);
+ cb->halen = 0;
+ netif_rx(skb);
+}
+
+static netdev_tx_t mctp_pcc_tx(struct sk_buff *skb, struct net_device *ndev)
+{
+ struct mctp_pcc_ndev *mpnd = netdev_priv(ndev);
+ struct mctp_pcc_hdr *mctp_pcc_header;
+ struct pcpu_dstats *dstats;
+ void __iomem *buffer;
+ unsigned long flags;
+ int len = skb->len;
+
+ dstats = this_cpu_ptr(ndev->dstats);
+ u64_stats_update_begin(&dstats->syncp);
+ u64_stats_inc(&dstats->tx_packets);
+ u64_stats_add(&dstats->tx_bytes, skb->len);
+ u64_stats_update_end(&dstats->syncp);
+
+ spin_lock_irqsave(&mpnd->lock, flags);
+ mctp_pcc_header = skb_push(skb, sizeof(struct mctp_pcc_hdr));
+ buffer = mpnd->outbox.chan->shmem;
+ mctp_pcc_header->signature = PCC_MAGIC | mpnd->outbox.index;
+ mctp_pcc_header->flags = PCC_HEADER_FLAGS;
+ memcpy(mctp_pcc_header->mctp_signature, MCTP_SIGNATURE,
+ MCTP_SIGNATURE_LENGTH);
+ mctp_pcc_header->length = len + MCTP_SIGNATURE_LENGTH;
+
+ memcpy_toio(buffer, skb->data, skb->len);
+ mpnd->outbox.chan->mchan->mbox->ops->send_data(mpnd->outbox.chan->mchan,
+ NULL);
+ spin_unlock_irqrestore(&mpnd->lock, flags);
+
+ dev_consume_skb_any(skb);
+ return NETDEV_TX_OK;
+}
+
+static const struct net_device_ops mctp_pcc_netdev_ops = {
+ .ndo_start_xmit = mctp_pcc_tx,
+};
+
+static void mctp_pcc_setup(struct net_device *ndev)
+{
+ ndev->type = ARPHRD_MCTP;
+ ndev->hard_header_len = 0;
+ ndev->tx_queue_len = 0;
+ ndev->flags = IFF_NOARP;
+ ndev->netdev_ops = &mctp_pcc_netdev_ops;
+ ndev->needs_free_netdev = true;
+ ndev->pcpu_stat_type = NETDEV_PCPU_STAT_DSTATS;
+}
+
+struct mctp_pcc_lookup_context {
+ int index;
+ u32 inbox_index;
+ u32 outbox_index;
+};
+
+static acpi_status lookup_pcct_indices(struct acpi_resource *ares,
+ void *context)
+{
+ struct mctp_pcc_lookup_context *luc = context;
+ struct acpi_resource_address32 *addr;
+
+ switch (ares->type) {
+ case PCC_DWORD_TYPE:
+ break;
+ default:
+ return AE_OK;
+ }
+
+ addr = ACPI_CAST_PTR(struct acpi_resource_address32, &ares->data);
+ switch (luc->index) {
+ case 0:
+ luc->outbox_index = addr[0].address.minimum;
+ break;
+ case 1:
+ luc->inbox_index = addr[0].address.minimum;
+ break;
+ }
+ luc->index++;
+ return AE_OK;
+}
+
+static void mctp_cleanup_netdev(void *data)
+{
+ struct net_device *ndev = data;
+
+ mctp_unregister_netdev(ndev);
+}
+
+static void mctp_cleanup_channel(void *data)
+{
+ struct pcc_mbox_chan *chan = data;
+
+ pcc_mbox_free_channel(chan);
+}
+
+static int mctp_pcc_initialize_mailbox(struct device *dev,
+ struct mctp_pcc_mailbox *box, u32 index)
+{
+ int ret;
+
+ box->index = index;
+ box->chan = pcc_mbox_request_channel(&box->client, index);
+ if (IS_ERR(box->chan))
+ return PTR_ERR(box->chan);
+ devm_add_action_or_reset(dev, mctp_cleanup_channel, box->chan);
+ ret = pcc_mbox_ioremap(box->chan->mchan);
+ if (ret)
+ return -EINVAL;
+ return 0;
+}
+
+static int mctp_pcc_driver_add(struct acpi_device *acpi_dev)
+{
+ struct mctp_pcc_lookup_context context = {0, 0, 0};
+ struct mctp_pcc_ndev *mctp_pcc_ndev;
+ struct device *dev = &acpi_dev->dev;
+ struct net_device *ndev;
+ acpi_handle dev_handle;
+ acpi_status status;
+ int mctp_pcc_mtu;
+ char name[32];
+ int rc;
+
+ dev_dbg(dev, "Adding mctp_pcc device for HID %s\n",
+ acpi_device_hid(acpi_dev));
+ dev_handle = acpi_device_handle(acpi_dev);
+ status = acpi_walk_resources(dev_handle, "_CRS", lookup_pcct_indices,
+ &context);
+ if (!ACPI_SUCCESS(status)) {
+ dev_err(dev, "FAILURE to lookup PCC indexes from CRS\n");
+ return -EINVAL;
+ }
+
+ //inbox initialization
+ snprintf(name, sizeof(name), "mctpipcc%d", context.inbox_index);
+ ndev = alloc_netdev(sizeof(struct mctp_pcc_ndev), name, NET_NAME_ENUM,
+ mctp_pcc_setup);
+ if (!ndev)
+ return -ENOMEM;
+
+ mctp_pcc_ndev = netdev_priv(ndev);
+ rc = devm_add_action_or_reset(dev, mctp_cleanup_netdev, ndev);
+ if (rc)
+ goto cleanup_netdev;
+ spin_lock_init(&mctp_pcc_ndev->lock);
+
+ rc = mctp_pcc_initialize_mailbox(dev, &mctp_pcc_ndev->inbox,
+ context.inbox_index);
+ if (rc)
+ goto cleanup_netdev;
+ mctp_pcc_ndev->inbox.client.rx_callback = mctp_pcc_client_rx_callback;
+
+ //outbox initialization
+ rc = mctp_pcc_initialize_mailbox(dev, &mctp_pcc_ndev->outbox,
+ context.outbox_index);
+ if (rc)
+ goto cleanup_netdev;
+
+ mctp_pcc_ndev->acpi_device = acpi_dev;
+ mctp_pcc_ndev->inbox.client.dev = dev;
+ mctp_pcc_ndev->outbox.client.dev = dev;
+ mctp_pcc_ndev->mdev.dev = ndev;
+ acpi_dev->driver_data = mctp_pcc_ndev;
+
+ /* There is no clean way to pass the MTU to the callback function
+ * used for registration, so set the values ahead of time.
+ */
+ mctp_pcc_mtu = mctp_pcc_ndev->outbox.chan->shmem_size -
+ sizeof(struct mctp_pcc_hdr);
+ ndev->mtu = MCTP_MIN_MTU;
+ ndev->max_mtu = mctp_pcc_mtu;
+ ndev->min_mtu = MCTP_MIN_MTU;
+
+ /* ndev needs to be freed before the iomemory (mapped above) gets
+ * unmapped, devm resources get freed in reverse to the order they
+ * are added.
+ */
+ rc = register_netdev(ndev);
+ return rc;
+cleanup_netdev:
+ free_netdev(ndev);
+ return rc;
+}
+
+static const struct acpi_device_id mctp_pcc_device_ids[] = {
+ { "DMT0001"},
+ {}
+};
+
+static struct acpi_driver mctp_pcc_driver = {
+ .name = "mctp_pcc",
+ .class = "Unknown",
+ .ids = mctp_pcc_device_ids,
+ .ops = {
+ .add = mctp_pcc_driver_add,
+ },
+};
+
+module_acpi_driver(mctp_pcc_driver);
+
+MODULE_DEVICE_TABLE(acpi, mctp_pcc_device_ids);
+
+MODULE_DESCRIPTION("MCTP PCC ACPI device");
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Adam Young <admiyo@os.amperecomputing.com>");
--
2.43.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v9 1/1] mctp pcc: Implement MCTP over PCC Transport
2024-12-17 18:25 ` [PATCH v9 1/1] mctp pcc: Implement MCTP over " admiyo
@ 2024-12-17 19:04 ` Joe Damato
2024-12-18 0:09 ` Jeremy Kerr
2024-12-18 16:23 ` Adam Young
0 siblings, 2 replies; 6+ messages in thread
From: Joe Damato @ 2024-12-17 19:04 UTC (permalink / raw)
To: admiyo
Cc: Jeremy Kerr, Matt Johnston, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, netdev, linux-kernel,
Sudeep Holla, Jonathan Cameron, Huisong Li
On Tue, Dec 17, 2024 at 01:25:28PM -0500, admiyo@os.amperecomputing.com wrote:
> From: Adam Young <admiyo@os.amperecomputing.com>
>
> Implementation of network driver for
> Management Control Transport Protocol(MCTP) over
> Platform Communication Channel(PCC)
>
> DMTF DSP:0292
> https://www.dmtf.org/sites/default/files/standards/documents/DSP0292_1.0.0WIP50.pdf
>
> MCTP devices are specified by entries in DSDT/SDST and
> reference channels specified in the PCCT.
>
> Communication with other devices use the PCC based
> doorbell mechanism.
>
> Signed-off-by: Adam Young <admiyo@os.amperecomputing.com>
> ---
> drivers/net/mctp/Kconfig | 13 ++
> drivers/net/mctp/Makefile | 1 +
> drivers/net/mctp/mctp-pcc.c | 320 ++++++++++++++++++++++++++++++++++++
> 3 files changed, 334 insertions(+)
> create mode 100644 drivers/net/mctp/mctp-pcc.c
[...]
> --- /dev/null
> +++ b/drivers/net/mctp/mctp-pcc.c
> @@ -0,0 +1,320 @@
[...]
> +static void mctp_pcc_client_rx_callback(struct mbox_client *c, void *buffer)
> +{
> + struct mctp_pcc_ndev *mctp_pcc_ndev;
> + struct mctp_pcc_hdr mctp_pcc_hdr;
> + struct pcpu_dstats *dstats;
> + struct mctp_skb_cb *cb;
> + struct sk_buff *skb;
> + void *skb_buf;
> + u32 data_len;
> +
> + mctp_pcc_ndev = container_of(c, struct mctp_pcc_ndev, inbox.client);
> + memcpy_fromio(&mctp_pcc_hdr, mctp_pcc_ndev->inbox.chan->shmem,
> + sizeof(struct mctp_pcc_hdr));
> + data_len = mctp_pcc_hdr.length + MCTP_HEADER_LENGTH;
> + skb = netdev_alloc_skb(mctp_pcc_ndev->mdev.dev, data_len);
> +
> + dstats = this_cpu_ptr(mctp_pcc_ndev->mdev.dev->dstats);
> + u64_stats_update_begin(&dstats->syncp);
> + if (data_len > mctp_pcc_ndev->mdev.dev->mtu) {
> + u64_stats_inc(&dstats->rx_drops);
> + u64_stats_inc(&dstats->rx_drops);
Double counting rx_drops ?
> + u64_stats_update_end(&dstats->syncp);
> + return;
> + }
> + if (!skb) {
> + u64_stats_inc(&dstats->rx_drops);
> + u64_stats_update_end(&dstats->syncp);
> + return;
> + }
> + u64_stats_inc(&dstats->rx_packets);
> + u64_stats_add(&dstats->rx_bytes, data_len);
> + u64_stats_update_end(&dstats->syncp);
I suspect what Jeremy meant (but please feel free to correct me if
I'm mistaken, Jeremy) was that you may want to use the helpers in:
include/linux/netdevice.h
e.g.
dev_dstats_rx_add(mctp_pcc_ndev->mdev.dev, data_len);
dev_dstats_rx_dropped(mctp_pcc_ndev->mdev.dev);
etc.
[...]
> +
> +static netdev_tx_t mctp_pcc_tx(struct sk_buff *skb, struct net_device *ndev)
> +{
> + struct mctp_pcc_ndev *mpnd = netdev_priv(ndev);
> + struct mctp_pcc_hdr *mctp_pcc_header;
> + struct pcpu_dstats *dstats;
> + void __iomem *buffer;
> + unsigned long flags;
> + int len = skb->len;
> +
> + dstats = this_cpu_ptr(ndev->dstats);
> + u64_stats_update_begin(&dstats->syncp);
> + u64_stats_inc(&dstats->tx_packets);
> + u64_stats_add(&dstats->tx_bytes, skb->len);
> + u64_stats_update_end(&dstats->syncp);
Likewise, as above with the helpers from include/linux/netdevice.h:
dev_dstats_tx_add( ... );
dev_dstats_tx_dropped( ... );
But, I'll let Jeremy weigh-in to make sure I've not misspoken.
[...]
> +
> +static void mctp_pcc_setup(struct net_device *ndev)
^^ nit: double space ?
[...]
> +static acpi_status lookup_pcct_indices(struct acpi_resource *ares,
> + void *context)
> +{
> + struct mctp_pcc_lookup_context *luc = context;
^^ nit: double space?
[...]
> +static int mctp_pcc_driver_add(struct acpi_device *acpi_dev)
> +{
[...]
> +
> + rc = devm_add_action_or_reset(dev, mctp_cleanup_netdev, ndev);
^^ nit: double space
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v9 1/1] mctp pcc: Implement MCTP over PCC Transport
2024-12-17 19:04 ` Joe Damato
@ 2024-12-18 0:09 ` Jeremy Kerr
2024-12-18 16:23 ` Adam Young
1 sibling, 0 replies; 6+ messages in thread
From: Jeremy Kerr @ 2024-12-18 0:09 UTC (permalink / raw)
To: Joe Damato, admiyo
Cc: Matt Johnston, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, netdev, linux-kernel, Sudeep Holla,
Jonathan Cameron, Huisong Li
Hi Joe,
> I suspect what Jeremy meant (but please feel free to correct me if
> I'm mistaken, Jeremy) was that you may want to use the helpers in:
>
> include/linux/netdevice.h
No, I was just referring to the new(-ish) dstats infrastructure in the
core, with dstats collection in rtnl_link_stats64() as of 94b601bc.
However, your suggestion of:
> dev_dstats_rx_add(mctp_pcc_ndev->mdev.dev, data_len);
> dev_dstats_rx_dropped(mctp_pcc_ndev->mdev.dev);
make it even simpler! I would agree with the recommendation there.
Cheers,
Jeremy
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v9 1/1] mctp pcc: Implement MCTP over PCC Transport
2024-12-17 19:04 ` Joe Damato
2024-12-18 0:09 ` Jeremy Kerr
@ 2024-12-18 16:23 ` Adam Young
2024-12-18 18:17 ` Joe Damato
1 sibling, 1 reply; 6+ messages in thread
From: Adam Young @ 2024-12-18 16:23 UTC (permalink / raw)
To: Joe Damato, admiyo, Jeremy Kerr, Matt Johnston, Andrew Lunn,
David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
netdev, linux-kernel, Sudeep Holla, Jonathan Cameron, Huisong Li
On 12/17/24 14:04, Joe Damato wrote:
>> +static void mctp_pcc_client_rx_callback(struct mbox_client *c, void *buffer)
>> +{
>> + struct mctp_pcc_ndev *mctp_pcc_ndev;
>> + struct mctp_pcc_hdr mctp_pcc_hdr;
>> + struct pcpu_dstats *dstats;
>> + struct mctp_skb_cb *cb;
>> + struct sk_buff *skb;
>> + void *skb_buf;
>> + u32 data_len;
>> +
>> + mctp_pcc_ndev = container_of(c, struct mctp_pcc_ndev, inbox.client);
>> + memcpy_fromio(&mctp_pcc_hdr, mctp_pcc_ndev->inbox.chan->shmem,
>> + sizeof(struct mctp_pcc_hdr));
>> + data_len = mctp_pcc_hdr.length + MCTP_HEADER_LENGTH;
>> + skb = netdev_alloc_skb(mctp_pcc_ndev->mdev.dev, data_len);
>> +
>> + dstats = this_cpu_ptr(mctp_pcc_ndev->mdev.dev->dstats);
>> + u64_stats_update_begin(&dstats->syncp);
>> + if (data_len > mctp_pcc_ndev->mdev.dev->mtu) {
>> + u64_stats_inc(&dstats->rx_drops);
>> + u64_stats_inc(&dstats->rx_drops);
> Double counting rx_drops ?
Oops. Yes I was. Thanks.
>
>> + u64_stats_update_end(&dstats->syncp);
>> + return;
>> + }
>> + if (!skb) {
>> + u64_stats_inc(&dstats->rx_drops);
>> + u64_stats_update_end(&dstats->syncp);
>> + return;
>> + }
>> + u64_stats_inc(&dstats->rx_packets);
>> + u64_stats_add(&dstats->rx_bytes, data_len);
>> + u64_stats_update_end(&dstats->syncp);
> I suspect what Jeremy meant (but please feel free to correct me if
> I'm mistaken, Jeremy) was that you may want to use the helpers in:
>
> include/linux/netdevice.h
>
> e.g.
>
> dev_dstats_rx_add(mctp_pcc_ndev->mdev.dev, data_len);
> dev_dstats_rx_dropped(mctp_pcc_ndev->mdev.dev);
>
> etc.
I don't see those function calls in the 6.13-rc3 tree I am working
with. Are they coming later?
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v9 1/1] mctp pcc: Implement MCTP over PCC Transport
2024-12-18 16:23 ` Adam Young
@ 2024-12-18 18:17 ` Joe Damato
0 siblings, 0 replies; 6+ messages in thread
From: Joe Damato @ 2024-12-18 18:17 UTC (permalink / raw)
To: Adam Young
Cc: admiyo, Jeremy Kerr, Matt Johnston, Andrew Lunn, David S. Miller,
Eric Dumazet, Jakub Kicinski, Paolo Abeni, netdev, linux-kernel,
Sudeep Holla, Jonathan Cameron, Huisong Li
On Wed, Dec 18, 2024 at 11:23:06AM -0500, Adam Young wrote:
>
> On 12/17/24 14:04, Joe Damato wrote:
[...]
> >
> > > + u64_stats_update_end(&dstats->syncp);
> > > + return;
> > > + }
> > > + if (!skb) {
> > > + u64_stats_inc(&dstats->rx_drops);
> > > + u64_stats_update_end(&dstats->syncp);
> > > + return;
> > > + }
> > > + u64_stats_inc(&dstats->rx_packets);
> > > + u64_stats_add(&dstats->rx_bytes, data_len);
> > > + u64_stats_update_end(&dstats->syncp);
> > I suspect what Jeremy meant (but please feel free to correct me if
> > I'm mistaken, Jeremy) was that you may want to use the helpers in:
> >
> > include/linux/netdevice.h
> >
> > e.g.
> >
> > dev_dstats_rx_add(mctp_pcc_ndev->mdev.dev, data_len);
> > dev_dstats_rx_dropped(mctp_pcc_ndev->mdev.dev);
> >
> > etc.
>
> I don't see those function calls in the 6.13-rc3 tree I am working with.
> Are they coming later?
If you are adding new code you should target net-next/main, which
has commit 18eabadd73ae ("vrf: Make pcpu_dstats update functions
available to other modules.") which adds those functions.
Have you rebased recently? Maybe your local clone of the tree is
stale?
FWIW: you can use `git format-patch --base=auto ...` to include base
tree information which can be helpful for identifying issues like
the above.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-12-18 18:17 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-17 18:25 [PATCH v9 0/1] MCTP Over PCC Transport admiyo
2024-12-17 18:25 ` [PATCH v9 1/1] mctp pcc: Implement MCTP over " admiyo
2024-12-17 19:04 ` Joe Damato
2024-12-18 0:09 ` Jeremy Kerr
2024-12-18 16:23 ` Adam Young
2024-12-18 18:17 ` Joe Damato
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).