* [PATCH v3 0/3] MCTP over PCC
@ 2024-06-25 18:53 admiyo
2024-06-25 18:53 ` [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK admiyo
` (2 more replies)
0 siblings, 3 replies; 11+ messages in thread
From: admiyo @ 2024-06-25 18:53 UTC (permalink / raw)
Cc: netdev, linux-kernel, Jeremy Kerr, Matt Johnston,
David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni
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.
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.
The second patch in the series is the required change from ACPICA
code that will be imported into the Linux kernel when synchronized
with the ACPICA repository. It ahs already merged there and will
be merged in as is. It is included here so that the patch series
can run and be tested prior to that merge.
Previous Version:
https://lore.kernel.org/20240619200552.119080-1-admiyo@os.amperecomputing.com/
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.
Code Review Change not made
- Did not change the module init unload function to use the
ACPI equivalent as they do not remove all devices prior
to unload, leading to dangling references and seg faults.
Adam Young (3):
mctp pcc: Check before sending MCTP PCC response ACK
mctp pcc: Allow PCC Data Type in MCTP resource.
mctp pcc: Implement MCTP over PCC Transport
drivers/acpi/acpica/rsaddr.c | 2 +-
drivers/mailbox/pcc.c | 6 +-
drivers/net/mctp/Kconfig | 13 ++
drivers/net/mctp/Makefile | 1 +
drivers/net/mctp/mctp-pcc.c | 343 +++++++++++++++++++++++++++++++++++
include/acpi/pcc.h | 1 +
6 files changed, 364 insertions(+), 2 deletions(-)
create mode 100644 drivers/net/mctp/mctp-pcc.c
--
2.34.1
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK 2024-06-25 18:53 [PATCH v3 0/3] MCTP over PCC admiyo @ 2024-06-25 18:53 ` admiyo 2024-06-26 12:27 ` Sudeep Holla 2024-06-25 18:53 ` [PATCH v3 2/3] mctp pcc: Allow PCC Data Type in MCTP resource admiyo 2024-06-25 18:53 ` [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport admiyo 2 siblings, 1 reply; 11+ messages in thread From: admiyo @ 2024-06-25 18:53 UTC (permalink / raw) To: Sudeep Holla, Jassi Brar, Rafael J. Wysocki, Len Brown, Robert Moore Cc: netdev, linux-kernel, Jeremy Kerr, Matt Johnston, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni From: Adam Young <admiyo@amperecomputing.com> Type 4 PCC channels have an option to send back a response to the platform when they are done processing the request. The flag to indicate whether or not to respond is inside the message body, and thus is not available to the pcc mailbox. Since only one message can be processed at once per channel, the value of this flag is checked during message processing and passed back via the channels global structure. Ideally, the mailbox callback function would return a value indicating whether the message requires an ACK, but that would be a change to the mailbox API. That would involve some change to all (about 12) of the mailbox based drivers, and the majority of them would not need to know about the ACK call. Signed-off-by: Adam Young <admiyo@os.amperecomputing.com> --- drivers/mailbox/pcc.c | 6 +++++- include/acpi/pcc.h | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c index 94885e411085..5cf792700d79 100644 --- a/drivers/mailbox/pcc.c +++ b/drivers/mailbox/pcc.c @@ -280,6 +280,7 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) { struct pcc_chan_info *pchan; struct mbox_chan *chan = p; + struct pcc_mbox_chan *pmchan; u64 val; int ret; @@ -304,6 +305,8 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) return IRQ_NONE; + pmchan = &pchan->chan; + pmchan->ack_rx = true; //TODO default to False mbox_chan_received_data(chan, NULL); /* @@ -312,7 +315,8 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) * * The PCC master subspace channel clears chan_in_use to free channel. */ - if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) + if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE && + pmchan->ack_rx) pcc_send_data(chan, NULL); pchan->chan_in_use = false; diff --git a/include/acpi/pcc.h b/include/acpi/pcc.h index 9b373d172a77..297913378c2b 100644 --- a/include/acpi/pcc.h +++ b/include/acpi/pcc.h @@ -16,6 +16,7 @@ struct pcc_mbox_chan { u32 latency; u32 max_access_rate; u16 min_turnaround_time; + bool ack_rx; }; /* Generic Communications Channel Shared Memory Region */ -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK 2024-06-25 18:53 ` [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK admiyo @ 2024-06-26 12:27 ` Sudeep Holla 2024-06-26 17:14 ` Adam Young 2024-06-28 18:13 ` Adam Young 0 siblings, 2 replies; 11+ messages in thread From: Sudeep Holla @ 2024-06-26 12:27 UTC (permalink / raw) To: admiyo Cc: Jassi Brar, Sudeep Holla, Rafael J. Wysocki, Len Brown, Robert Moore, netdev, linux-kernel, Jeremy Kerr, Matt Johnston, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni On Tue, Jun 25, 2024 at 02:53:31PM -0400, admiyo@os.amperecomputing.com wrote: > From: Adam Young <admiyo@amperecomputing.com> > > Type 4 PCC channels have an option to send back a response > to the platform when they are done processing the request. > The flag to indicate whether or not to respond is inside > the message body, and thus is not available to the pcc > mailbox. Since only one message can be processed at once per > channel, the value of this flag is checked during message processing > and passed back via the channels global structure. > > Ideally, the mailbox callback function would return a value > indicating whether the message requires an ACK, but that > would be a change to the mailbox API. That would involve > some change to all (about 12) of the mailbox based drivers, > and the majority of them would not need to know about the > ACK call. > Next time when you post new series, I prefer to be cc-ed in all the patches. So far I ignored v1 and v2 thinking it has landed in my mbox my mistake and deleted them. But just checked the series on lore, sorry for that. > Signed-off-by: Adam Young <admiyo@os.amperecomputing.com> > --- > drivers/mailbox/pcc.c | 6 +++++- > include/acpi/pcc.h | 1 + > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c > index 94885e411085..5cf792700d79 100644 > --- a/drivers/mailbox/pcc.c > +++ b/drivers/mailbox/pcc.c > @@ -280,6 +280,7 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) > { > struct pcc_chan_info *pchan; > struct mbox_chan *chan = p; > + struct pcc_mbox_chan *pmchan; > u64 val; > int ret; > > @@ -304,6 +305,8 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) > if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) > return IRQ_NONE; > > + pmchan = &pchan->chan; > + pmchan->ack_rx = true; //TODO default to False Indeed, default must be false. You need to do this conditionally at runtime otherwise I see no need for this patch as it doesn't change anything as it stands. It needs to be fixed to get this change merged. Also we should set any such flag once at the boot, IRQ handler is not the right place for sure. -- Regards, Sudeep ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK 2024-06-26 12:27 ` Sudeep Holla @ 2024-06-26 17:14 ` Adam Young 2024-06-28 18:13 ` Adam Young 1 sibling, 0 replies; 11+ messages in thread From: Adam Young @ 2024-06-26 17:14 UTC (permalink / raw) To: Sudeep Holla, admiyo Cc: Jassi Brar, Rafael J. Wysocki, Len Brown, Robert Moore, netdev, linux-kernel, Jeremy Kerr, Matt Johnston, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni On 6/26/24 08:27, Sudeep Holla wrote: > On Tue, Jun 25, 2024 at 02:53:31PM -0400, admiyo@os.amperecomputing.com wrote: >> From: Adam Young <admiyo@amperecomputing.com> >> >> Type 4 PCC channels have an option to send back a response >> to the platform when they are done processing the request. >> The flag to indicate whether or not to respond is inside >> the message body, and thus is not available to the pcc >> mailbox. Since only one message can be processed at once per >> channel, the value of this flag is checked during message processing >> and passed back via the channels global structure. >> >> Ideally, the mailbox callback function would return a value >> indicating whether the message requires an ACK, but that >> would be a change to the mailbox API. That would involve >> some change to all (about 12) of the mailbox based drivers, >> and the majority of them would not need to know about the >> ACK call. >> > Next time when you post new series, I prefer to be cc-ed in all the patches. I was using the list of maintainers for each patch as pulled via the Kernel scripts in git send-email for the first two versions. I have started hard coding the list of CCers as a superset of all the maintainers, as this patch series crosses a few boundaries. > So far I ignored v1 and v2 thinking it has landed in my mbox my mistake and > deleted them. But just checked the series on lore, sorry for that. > >> Signed-off-by: Adam Young <admiyo@os.amperecomputing.com> >> --- >> drivers/mailbox/pcc.c | 6 +++++- >> include/acpi/pcc.h | 1 + >> 2 files changed, 6 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c >> index 94885e411085..5cf792700d79 100644 >> --- a/drivers/mailbox/pcc.c >> +++ b/drivers/mailbox/pcc.c >> @@ -280,6 +280,7 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) >> { >> struct pcc_chan_info *pchan; >> struct mbox_chan *chan = p; >> + struct pcc_mbox_chan *pmchan; >> u64 val; >> int ret; >> >> @@ -304,6 +305,8 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) >> if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) >> return IRQ_NONE; >> >> + pmchan = &pchan->chan; >> + pmchan->ack_rx = true; //TODO default to False > Indeed, default must be false. You need to do this conditionally at runtime > otherwise I see no need for this patch as it doesn't change anything as it > stands. It needs to be fixed to get this change merged. > > Also we should set any such flag once at the boot, IRQ handler is not > the right place for sure. Ringing the doorbell to signify that the message is received is optional in the ACPI/PCC spec but was hard coded to always get set. There is currently no way to pass the value from the rx function to here where the code is actually triggering the response. The Mailbox receive callback returns void. Changing that would require changing every module that uses the mailbox code. You can see the spec here: https://uefi.org/htmlspecs/ACPI_Spec_6_4_html/14_Platform_Communications_Channel/Platform_Comm_Channel.html#platform-notification-for-slave-pcc-subspaces-type-4 note in step 2 of the send process, the part that says "The platform can request the OSPM rings the doorbell once it has completed processing the notification command by setting the Generate Signal bit in the flags." The change that made the response mandatory was 60c40b06fa686 and merged in the 6.9 timeframe. The actual check is done at run time, and you can see how it is done in the third patch, at the end of the function mctp_pcc_client_rx_callback + flags = mctp_pcc_hdr.flags; + mctp_pcc_dev->in_chan->ack_rx = (flags & PCC_ACK_FLAG_MASK) > 0; While we don't anticipate our backend requiring the ACK, we did encode the possibility into the driver. I am willing to rework this if we have a viable alternative. > ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK 2024-06-26 12:27 ` Sudeep Holla 2024-06-26 17:14 ` Adam Young @ 2024-06-28 18:13 ` Adam Young 1 sibling, 0 replies; 11+ messages in thread From: Adam Young @ 2024-06-28 18:13 UTC (permalink / raw) To: Sudeep Holla, admiyo, lihuisong Cc: Jassi Brar, Rafael J. Wysocki, Len Brown, Robert Moore, netdev, linux-kernel, Jeremy Kerr, Matt Johnston, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Huisong Li you wrote the original patch that I am working around. What would I break if I disabled the IRQ ACK? It should not be the default behavior as it is an optional feature. There needs to be a mechanism for the driver to trigger the ACK, but it needs to be based on the content of the message buffer. I was thinking it should be in the return code of the callback, but that breaks all of the other mailbox implementations. I suspect a better approach would be to provide a function pointer to the driver and let the driver decide whether or not to trigger the ACK. On 6/26/24 08:27, Sudeep Holla wrote: > On Tue, Jun 25, 2024 at 02:53:31PM -0400, admiyo@os.amperecomputing.com wrote: >> From: Adam Young <admiyo@amperecomputing.com> >> >> Type 4 PCC channels have an option to send back a response >> to the platform when they are done processing the request. >> The flag to indicate whether or not to respond is inside >> the message body, and thus is not available to the pcc >> mailbox. Since only one message can be processed at once per >> channel, the value of this flag is checked during message processing >> and passed back via the channels global structure. >> >> Ideally, the mailbox callback function would return a value >> indicating whether the message requires an ACK, but that >> would be a change to the mailbox API. That would involve >> some change to all (about 12) of the mailbox based drivers, >> and the majority of them would not need to know about the >> ACK call. >> > Next time when you post new series, I prefer to be cc-ed in all the patches. > So far I ignored v1 and v2 thinking it has landed in my mbox my mistake and > deleted them. But just checked the series on lore, sorry for that. > >> Signed-off-by: Adam Young <admiyo@os.amperecomputing.com> >> --- >> drivers/mailbox/pcc.c | 6 +++++- >> include/acpi/pcc.h | 1 + >> 2 files changed, 6 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c >> index 94885e411085..5cf792700d79 100644 >> --- a/drivers/mailbox/pcc.c >> +++ b/drivers/mailbox/pcc.c >> @@ -280,6 +280,7 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) >> { >> struct pcc_chan_info *pchan; >> struct mbox_chan *chan = p; >> + struct pcc_mbox_chan *pmchan; >> u64 val; >> int ret; >> >> @@ -304,6 +305,8 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) >> if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) >> return IRQ_NONE; >> >> + pmchan = &pchan->chan; >> + pmchan->ack_rx = true; //TODO default to False > Indeed, default must be false. You need to do this conditionally at runtime > otherwise I see no need for this patch as it doesn't change anything as it > stands. It needs to be fixed to get this change merged. > > Also we should set any such flag once at the boot, IRQ handler is not > the right place for sure. > ^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v3 2/3] mctp pcc: Allow PCC Data Type in MCTP resource. 2024-06-25 18:53 [PATCH v3 0/3] MCTP over PCC admiyo 2024-06-25 18:53 ` [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK admiyo @ 2024-06-25 18:53 ` admiyo 2024-06-25 18:53 ` [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport admiyo 2 siblings, 0 replies; 11+ messages in thread From: admiyo @ 2024-06-25 18:53 UTC (permalink / raw) To: Robert Moore, Rafael J. Wysocki, Len Brown Cc: netdev, linux-kernel, Jeremy Kerr, Matt Johnston, David S . Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni From: Adam Young <admiyo@amperecomputing.com> Note that this patch is for code that will be merged in via ACPICA changes. The corresponding patch in ACPCA has already merged. Thus, no changes can be made to this patch. Signed-off-by: Adam Young <admiyo@os.amperecomputing.com> --- drivers/acpi/acpica/rsaddr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/acpi/acpica/rsaddr.c b/drivers/acpi/acpica/rsaddr.c index fff48001d7ef..7932c2a6ddde 100644 --- a/drivers/acpi/acpica/rsaddr.c +++ b/drivers/acpi/acpica/rsaddr.c @@ -282,7 +282,7 @@ acpi_rs_get_address_common(struct acpi_resource *resource, /* Validate the Resource Type */ - if ((address.resource_type > 2) && (address.resource_type < 0xC0)) { + if ((address.resource_type > 2) && (address.resource_type < 0xC0) && (address.resource_type != 0x0A)) { return (FALSE); } -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport 2024-06-25 18:53 [PATCH v3 0/3] MCTP over PCC admiyo 2024-06-25 18:53 ` [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK admiyo 2024-06-25 18:53 ` [PATCH v3 2/3] mctp pcc: Allow PCC Data Type in MCTP resource admiyo @ 2024-06-25 18:53 ` admiyo 2024-06-26 17:02 ` kernel test robot ` (2 more replies) 2 siblings, 3 replies; 11+ messages in thread From: admiyo @ 2024-06-25 18:53 UTC (permalink / raw) To: Jeremy Kerr, Matt Johnston, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: netdev, linux-kernel From: Adam Young <admiyo@amperecomputing.com> Implementation of network driver for Management Control Transport Protocol(MCTP) over Platform Communication Channel(PCC) DMTF DSP:0292 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 | 343 ++++++++++++++++++++++++++++++++++++ 3 files changed, 357 insertions(+) create mode 100644 drivers/net/mctp/mctp-pcc.c diff --git a/drivers/net/mctp/Kconfig b/drivers/net/mctp/Kconfig index ce9d2d2ccf3b..ff4effd8e99c 100644 --- a/drivers/net/mctp/Kconfig +++ b/drivers/net/mctp/Kconfig @@ -42,6 +42,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" + select 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 + commuinucation 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..9ef4eefabd58 --- /dev/null +++ b/drivers/net/mctp/mctp-pcc.c @@ -0,0 +1,343 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * mctp-pcc.c - Driver for MCTP over PCC. + * Copyright (c) 2024, Ampere Computing LLC + */ + +#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 SPDM_VERSION_OFFSET 1 +#define SPDM_REQ_RESP_OFFSET 2 +#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 SIGNATURE_LENGTH 4 +#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 +#define PCC_ACK_FLAG_MASK 0x1 + +struct mctp_pcc_hdr { + u32 signature; + u32 flags; + u32 length; + char mctp_signature[4]; +}; + +struct mctp_pcc_hw_addr { + u32 inbox_index; + u32 outbox_index; +}; + +/* The netdev structure. One of these per PCC adapter. */ +struct mctp_pcc_ndev { + struct list_head next; + /* spinlock to serialize access to pcc buffer and registers*/ + spinlock_t lock; + struct mctp_dev mdev; + struct acpi_device *acpi_device; + struct pcc_mbox_chan *in_chan; + struct pcc_mbox_chan *out_chan; + struct mbox_client outbox_client; + struct mbox_client inbox_client; + void __iomem *pcc_comm_inbox_addr; + void __iomem *pcc_comm_outbox_addr; + struct mctp_pcc_hw_addr hw_addr; +}; + +static struct list_head mctp_pcc_ndevs = LIST_HEAD_INIT(mctp_pcc_ndevs); + +static void mctp_pcc_client_rx_callback(struct mbox_client *c, void *buffer) +{ + struct mctp_pcc_ndev *mctp_pcc_dev; + struct mctp_pcc_hdr mctp_pcc_hdr; + struct mctp_skb_cb *cb; + struct sk_buff *skb; + void *skb_buf; + u32 data_len; + u32 flags; + + mctp_pcc_dev = container_of(c, struct mctp_pcc_ndev, inbox_client); + memcpy_fromio(&mctp_pcc_hdr, mctp_pcc_dev->pcc_comm_inbox_addr, + sizeof(struct mctp_pcc_hdr)); + data_len = mctp_pcc_hdr.length + MCTP_HEADER_LENGTH; + + if (data_len > mctp_pcc_dev->mdev.dev->max_mtu) { + mctp_pcc_dev->mdev.dev->stats.rx_dropped++; + return; + } + + skb = netdev_alloc_skb(mctp_pcc_dev->mdev.dev, data_len); + if (!skb) { + mctp_pcc_dev->mdev.dev->stats.rx_dropped++; + return; + } + mctp_pcc_dev->mdev.dev->stats.rx_packets++; + mctp_pcc_dev->mdev.dev->stats.rx_bytes += data_len; + skb->protocol = htons(ETH_P_MCTP); + skb_buf = skb_put(skb, data_len); + memcpy_fromio(skb_buf, mctp_pcc_dev->pcc_comm_inbox_addr, 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); + + flags = mctp_pcc_hdr.flags; + mctp_pcc_dev->in_chan->ack_rx = (flags & PCC_ACK_FLAG_MASK) > 0; +} + +static netdev_tx_t mctp_pcc_tx(struct sk_buff *skb, struct net_device *ndev) +{ + struct mctp_pcc_hdr pcc_header; + struct mctp_pcc_ndev *mpnd; + void __iomem *buffer; + unsigned long flags; + + ndev->stats.tx_bytes += skb->len; + ndev->stats.tx_packets++; + mpnd = netdev_priv(ndev); + + spin_lock_irqsave(&mpnd->lock, flags); + buffer = mpnd->pcc_comm_outbox_addr; + pcc_header.signature = PCC_MAGIC | mpnd->hw_addr.outbox_index; + pcc_header.flags = PCC_HEADER_FLAGS; + memcpy(pcc_header.mctp_signature, MCTP_SIGNATURE, SIGNATURE_LENGTH); + pcc_header.length = skb->len + SIGNATURE_LENGTH; + memcpy_toio(buffer, &pcc_header, sizeof(struct mctp_pcc_hdr)); + memcpy_toio(buffer + sizeof(struct mctp_pcc_hdr), skb->data, skb->len); + mpnd->out_chan->mchan->mbox->ops->send_data(mpnd->out_chan->mchan, + NULL); + spin_unlock_irqrestore(&mpnd->lock, flags); + + dev_consume_skb_any(skb); + return NETDEV_TX_OK; +} + +static void +mctp_pcc_net_stats(struct net_device *net_dev, + struct rtnl_link_stats64 *stats) +{ + struct mctp_pcc_ndev *mpnd; + + mpnd = (struct mctp_pcc_ndev *)netdev_priv(net_dev); + stats->rx_errors = 0; + stats->rx_packets = mpnd->mdev.dev->stats.rx_packets; + stats->tx_packets = mpnd->mdev.dev->stats.tx_packets; + stats->rx_dropped = 0; + stats->tx_bytes = mpnd->mdev.dev->stats.tx_bytes; + stats->rx_bytes = mpnd->mdev.dev->stats.rx_bytes; +} + +static const struct net_device_ops mctp_pcc_netdev_ops = { + .ndo_start_xmit = mctp_pcc_tx, + .ndo_get_stats64 = mctp_pcc_net_stats, +}; + +static void mctp_pcc_setup(struct net_device *ndev) +{ + ndev->type = ARPHRD_MCTP; + ndev->hard_header_len = 0; + ndev->addr_len = 0; + ndev->tx_queue_len = 0; + ndev->flags = IFF_NOARP; + ndev->netdev_ops = &mctp_pcc_netdev_ops; + ndev->needs_free_netdev = true; +} + +struct lookup_context { + int index; + u32 inbox_index; + u32 outbox_index; +}; + +static acpi_status lookup_pcct_indices(struct acpi_resource *ares, + void *context) +{ + struct acpi_resource_address32 *addr; + struct lookup_context *luc = context; + + 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 int mctp_pcc_driver_add(struct acpi_device *acpi_dev) +{ + struct lookup_context context = {0, 0, 0}; + struct mctp_pcc_ndev *mctp_pcc_dev; + struct net_device *ndev; + acpi_handle dev_handle; + acpi_status status; + struct device *dev; + int mctp_pcc_mtu; + int outbox_index; + int inbox_index; + char name[32]; + int rc; + + dev_dbg(&acpi_dev->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(&acpi_dev->dev, "FAILURE to lookup PCC indexes from CRS"); + return -EINVAL; + } + inbox_index = context.inbox_index; + outbox_index = context.outbox_index; + dev = &acpi_dev->dev; + + snprintf(name, sizeof(name), "mctpipcc%d", inbox_index); + ndev = alloc_netdev(sizeof(struct mctp_pcc_ndev), name, NET_NAME_ENUM, + mctp_pcc_setup); + if (!ndev) + return -ENOMEM; + mctp_pcc_dev = (struct mctp_pcc_ndev *)netdev_priv(ndev); + INIT_LIST_HEAD(&mctp_pcc_dev->next); + spin_lock_init(&mctp_pcc_dev->lock); + + mctp_pcc_dev->hw_addr.inbox_index = inbox_index; + mctp_pcc_dev->hw_addr.outbox_index = outbox_index; + mctp_pcc_dev->inbox_client.rx_callback = mctp_pcc_client_rx_callback; + mctp_pcc_dev->out_chan = + pcc_mbox_request_channel(&mctp_pcc_dev->outbox_client, + outbox_index); + if (IS_ERR(mctp_pcc_dev->out_chan)) { + rc = PTR_ERR(mctp_pcc_dev->out_chan); + goto free_netdev; + } + mctp_pcc_dev->in_chan = + pcc_mbox_request_channel(&mctp_pcc_dev->inbox_client, + inbox_index); + if (IS_ERR(mctp_pcc_dev->in_chan)) { + rc = PTR_ERR(mctp_pcc_dev->in_chan); + goto cleanup_out_channel; + } + mctp_pcc_dev->pcc_comm_inbox_addr = + devm_ioremap(dev, mctp_pcc_dev->in_chan->shmem_base_addr, + mctp_pcc_dev->in_chan->shmem_size); + if (!mctp_pcc_dev->pcc_comm_inbox_addr) { + rc = -EINVAL; + goto cleanup_in_channel; + } + mctp_pcc_dev->pcc_comm_outbox_addr = + devm_ioremap(dev, mctp_pcc_dev->out_chan->shmem_base_addr, + mctp_pcc_dev->out_chan->shmem_size); + if (!mctp_pcc_dev->pcc_comm_outbox_addr) { + rc = -EINVAL; + goto cleanup_in_channel; + } + mctp_pcc_dev->acpi_device = acpi_dev; + mctp_pcc_dev->inbox_client.dev = dev; + mctp_pcc_dev->outbox_client.dev = dev; + mctp_pcc_dev->mdev.dev = ndev; + acpi_dev->driver_data = mctp_pcc_dev; + + /* 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_dev->out_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; + + rc = register_netdev(ndev); + if (rc) + goto cleanup_in_channel; + list_add_tail(&mctp_pcc_dev->next, &mctp_pcc_ndevs); + return 0; + +cleanup_in_channel: + pcc_mbox_free_channel(mctp_pcc_dev->in_chan); +cleanup_out_channel: + pcc_mbox_free_channel(mctp_pcc_dev->out_chan); +free_netdev: + unregister_netdev(ndev); + free_netdev(ndev); + return rc; +} + +static void mctp_pcc_driver_remove(struct acpi_device *adev) +{ + struct list_head *ptr; + struct list_head *tmp; + + list_for_each_safe(ptr, tmp, &mctp_pcc_ndevs) { + struct net_device *ndev; + struct mctp_pcc_ndev *mctp_pcc_dev; + + mctp_pcc_dev = list_entry(ptr, struct mctp_pcc_ndev, next); + if (mctp_pcc_dev->acpi_device != adev) + continue; + pcc_mbox_free_channel(mctp_pcc_dev->out_chan); + pcc_mbox_free_channel(mctp_pcc_dev->in_chan); + ndev = mctp_pcc_dev->mdev.dev; + if (ndev) + mctp_unregister_netdev(ndev); + list_del(ptr); + break; + } +} + +static const struct acpi_device_id mctp_pcc_device_ids[] = { + { "DMT0001", 0}, + { "", 0}, +}; + +static struct acpi_driver mctp_pcc_driver = { + .name = "mctp_pcc", + .class = "Unknown", + .ids = mctp_pcc_device_ids, + .ops = { + .add = mctp_pcc_driver_add, + .remove = mctp_pcc_driver_remove, + }, + .owner = THIS_MODULE, +}; + +module_acpi_driver(mctp_pcc_driver); + +MODULE_DEVICE_TABLE(acpi, mctp_pcc_device_ids); + +MODULE_DESCRIPTION("MCTP PCC device"); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Adam Young <admiyo@os.amperecomputing.com>"); -- 2.34.1 ^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport 2024-06-25 18:53 ` [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport admiyo @ 2024-06-26 17:02 ` kernel test robot 2024-06-26 22:42 ` kernel test robot 2024-06-28 8:41 ` Jeremy Kerr 2 siblings, 0 replies; 11+ messages in thread From: kernel test robot @ 2024-06-26 17:02 UTC (permalink / raw) To: admiyo, Jeremy Kerr, Matt Johnston, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: oe-kbuild-all, netdev, linux-kernel Hi, kernel test robot noticed the following build errors: [auto build test ERROR on rafael-pm/linux-next] [also build test ERROR on rafael-pm/bleeding-edge linus/master v6.10-rc5 next-20240625] [cannot apply to horms-ipvs/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/admiyo-os-amperecomputing-com/mctp-pcc-Check-before-sending-MCTP-PCC-response-ACK/20240626-052432 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next patch link: https://lore.kernel.org/r/20240625185333.23211-4-admiyo%40os.amperecomputing.com patch subject: [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport config: parisc-allmodconfig (https://download.01.org/0day-ci/archive/20240627/202406270051.3C6XAHU8-lkp@intel.com/config) compiler: hppa-linux-gcc (GCC) 13.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240627/202406270051.3C6XAHU8-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406270051.3C6XAHU8-lkp@intel.com/ All error/warnings (new ones prefixed by >>): 165 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~~~~~~~~~~~~~ drivers/net/mctp/mctp-pcc.c:214:9: note: in expansion of macro 'dev_dbg' 214 | dev_dbg(&acpi_dev->dev, "Adding mctp_pcc device for HID %s\n", | ^~~~~~~ drivers/net/mctp/mctp-pcc.c:215:17: error: implicit declaration of function 'acpi_device_hid'; did you mean 'acpi_device_dep'? [-Werror=implicit-function-declaration] 215 | acpi_device_hid(acpi_dev)); | ^~~~~~~~~~~~~~~ include/linux/dynamic_debug.h:224:29: note: in definition of macro '__dynamic_func_call_cls' 224 | func(&id, ##__VA_ARGS__); \ | ^~~~~~~~~~~ include/linux/dynamic_debug.h:250:9: note: in expansion of macro '_dynamic_func_call_cls' 250 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__) | ^~~~~~~~~~~~~~~~~~~~~~ include/linux/dynamic_debug.h:273:9: note: in expansion of macro '_dynamic_func_call' 273 | _dynamic_func_call(fmt, __dynamic_dev_dbg, \ | ^~~~~~~~~~~~~~~~~~ include/linux/dev_printk.h:165:9: note: in expansion of macro 'dynamic_dev_dbg' 165 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~~~~~~~~~~~~~ drivers/net/mctp/mctp-pcc.c:214:9: note: in expansion of macro 'dev_dbg' 214 | dev_dbg(&acpi_dev->dev, "Adding mctp_pcc device for HID %s\n", | ^~~~~~~ drivers/net/mctp/mctp-pcc.c:216:22: error: implicit declaration of function 'acpi_device_handle'; did you mean 'acpi_device_dep'? [-Werror=implicit-function-declaration] 216 | dev_handle = acpi_device_handle(acpi_dev); | ^~~~~~~~~~~~~~~~~~ | acpi_device_dep drivers/net/mctp/mctp-pcc.c:216:20: warning: assignment to 'acpi_handle' {aka 'void *'} from 'int' makes pointer from integer without a cast [-Wint-conversion] 216 | dev_handle = acpi_device_handle(acpi_dev); | ^ In file included from include/linux/device.h:15, from include/linux/acpi.h:14: drivers/net/mctp/mctp-pcc.c:220:34: error: invalid use of undefined type 'struct acpi_device' 220 | dev_err(&acpi_dev->dev, "FAILURE to lookup PCC indexes from CRS"); | ^~ include/linux/dev_printk.h:110:25: note: in definition of macro 'dev_printk_index_wrap' 110 | _p_func(dev, fmt, ##__VA_ARGS__); \ | ^~~ drivers/net/mctp/mctp-pcc.c:220:17: note: in expansion of macro 'dev_err' 220 | dev_err(&acpi_dev->dev, "FAILURE to lookup PCC indexes from CRS"); | ^~~~~~~ drivers/net/mctp/mctp-pcc.c:225:24: error: invalid use of undefined type 'struct acpi_device' 225 | dev = &acpi_dev->dev; | ^~ drivers/net/mctp/mctp-pcc.c:271:17: error: invalid use of undefined type 'struct acpi_device' 271 | acpi_dev->driver_data = mctp_pcc_dev; | ^~ drivers/net/mctp/mctp-pcc.c: At top level: drivers/net/mctp/mctp-pcc.c:326:15: error: variable 'mctp_pcc_driver' has initializer but incomplete type 326 | static struct acpi_driver mctp_pcc_driver = { | ^~~~~~~~~~~ drivers/net/mctp/mctp-pcc.c:327:10: error: 'struct acpi_driver' has no member named 'name' 327 | .name = "mctp_pcc", | ^~~~ drivers/net/mctp/mctp-pcc.c:327:17: warning: excess elements in struct initializer 327 | .name = "mctp_pcc", | ^~~~~~~~~~ drivers/net/mctp/mctp-pcc.c:327:17: note: (near initialization for 'mctp_pcc_driver') drivers/net/mctp/mctp-pcc.c:328:10: error: 'struct acpi_driver' has no member named 'class' 328 | .class = "Unknown", | ^~~~~ drivers/net/mctp/mctp-pcc.c:328:18: warning: excess elements in struct initializer 328 | .class = "Unknown", | ^~~~~~~~~ drivers/net/mctp/mctp-pcc.c:328:18: note: (near initialization for 'mctp_pcc_driver') drivers/net/mctp/mctp-pcc.c:329:10: error: 'struct acpi_driver' has no member named 'ids' 329 | .ids = mctp_pcc_device_ids, | ^~~ drivers/net/mctp/mctp-pcc.c:329:16: warning: excess elements in struct initializer 329 | .ids = mctp_pcc_device_ids, | ^~~~~~~~~~~~~~~~~~~ drivers/net/mctp/mctp-pcc.c:329:16: note: (near initialization for 'mctp_pcc_driver') drivers/net/mctp/mctp-pcc.c:330:10: error: 'struct acpi_driver' has no member named 'ops' 330 | .ops = { | ^~~ drivers/net/mctp/mctp-pcc.c:330:16: error: extra brace group at end of initializer 330 | .ops = { | ^ drivers/net/mctp/mctp-pcc.c:330:16: note: (near initialization for 'mctp_pcc_driver') drivers/net/mctp/mctp-pcc.c:330:16: warning: excess elements in struct initializer drivers/net/mctp/mctp-pcc.c:330:16: note: (near initialization for 'mctp_pcc_driver') drivers/net/mctp/mctp-pcc.c:334:10: error: 'struct acpi_driver' has no member named 'owner' 334 | .owner = THIS_MODULE, | ^~~~~ In file included from arch/parisc/include/asm/alternative.h:18, from arch/parisc/include/asm/barrier.h:5, from include/linux/list.h:11, from include/linux/resource_ext.h:9: include/linux/init.h:180:21: warning: excess elements in struct initializer 180 | #define THIS_MODULE (&__this_module) | ^ drivers/net/mctp/mctp-pcc.c:334:18: note: in expansion of macro 'THIS_MODULE' 334 | .owner = THIS_MODULE, | ^~~~~~~~~~~ include/linux/init.h:180:21: note: (near initialization for 'mctp_pcc_driver') 180 | #define THIS_MODULE (&__this_module) | ^ drivers/net/mctp/mctp-pcc.c:334:18: note: in expansion of macro 'THIS_MODULE' 334 | .owner = THIS_MODULE, | ^~~~~~~~~~~ >> drivers/net/mctp/mctp-pcc.c:337:1: warning: data definition has no type or storage class 337 | module_acpi_driver(mctp_pcc_driver); | ^~~~~~~~~~~~~~~~~~ >> drivers/net/mctp/mctp-pcc.c:337:1: error: type defaults to 'int' in declaration of 'module_acpi_driver' [-Werror=implicit-int] >> drivers/net/mctp/mctp-pcc.c:337:1: warning: parameter names (without types) in function declaration drivers/net/mctp/mctp-pcc.c:326:27: error: storage size of 'mctp_pcc_driver' isn't known 326 | static struct acpi_driver mctp_pcc_driver = { | ^~~~~~~~~~~~~~~ >> drivers/net/mctp/mctp-pcc.c:326:27: warning: 'mctp_pcc_driver' defined but not used [-Wunused-variable] cc1: some warnings being treated as errors vim +337 drivers/net/mctp/mctp-pcc.c 325 > 326 static struct acpi_driver mctp_pcc_driver = { 327 .name = "mctp_pcc", 328 .class = "Unknown", 329 .ids = mctp_pcc_device_ids, 330 .ops = { 331 .add = mctp_pcc_driver_add, 332 .remove = mctp_pcc_driver_remove, 333 }, 334 .owner = THIS_MODULE, 335 }; 336 > 337 module_acpi_driver(mctp_pcc_driver); 338 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport 2024-06-25 18:53 ` [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport admiyo 2024-06-26 17:02 ` kernel test robot @ 2024-06-26 22:42 ` kernel test robot 2024-06-28 8:41 ` Jeremy Kerr 2 siblings, 0 replies; 11+ messages in thread From: kernel test robot @ 2024-06-26 22:42 UTC (permalink / raw) To: admiyo, Jeremy Kerr, Matt Johnston, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: llvm, oe-kbuild-all, netdev, linux-kernel Hi, kernel test robot noticed the following build errors: [auto build test ERROR on rafael-pm/linux-next] [also build test ERROR on rafael-pm/bleeding-edge linus/master v6.10-rc5 next-20240625] [cannot apply to horms-ipvs/master] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/admiyo-os-amperecomputing-com/mctp-pcc-Check-before-sending-MCTP-PCC-response-ACK/20240626-052432 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next patch link: https://lore.kernel.org/r/20240625185333.23211-4-admiyo%40os.amperecomputing.com patch subject: [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport config: powerpc-allyesconfig (https://download.01.org/0day-ci/archive/20240627/202406270625.2MuBj55z-lkp@intel.com/config) compiler: clang version 19.0.0git (https://github.com/llvm/llvm-project ad79a14c9e5ec4a369eed4adf567c22cc029863f) reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240627/202406270625.2MuBj55z-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202406270625.2MuBj55z-lkp@intel.com/ All errors (new ones prefixed by >>): In file included from drivers/net/mctp/mctp-pcc.c:8: In file included from include/linux/if_arp.h:22: In file included from include/linux/skbuff.h:17: In file included from include/linux/bvec.h:10: In file included from include/linux/highmem.h:8: In file included from include/linux/cacheflush.h:5: In file included from arch/powerpc/include/asm/cacheflush.h:7: In file included from include/linux/mm.h:2253: include/linux/vmstat.h:500:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 500 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 501 | item]; | ~~~~ include/linux/vmstat.h:507:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 507 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 508 | NR_VM_NUMA_EVENT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~~ include/linux/vmstat.h:514:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion] 514 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_" | ~~~~~~~~~~~ ^ ~~~ include/linux/vmstat.h:519:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 519 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 520 | NR_VM_NUMA_EVENT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~~ include/linux/vmstat.h:528:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion] 528 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~ ^ 529 | NR_VM_NUMA_EVENT_ITEMS + | ~~~~~~~~~~~~~~~~~~~~~~ In file included from drivers/net/mctp/mctp-pcc.c:17: include/acpi/acpi_drivers.h:72:43: warning: declaration of 'struct acpi_pci_root' will not be visible outside of this function [-Wvisibility] 72 | struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root); | ^ drivers/net/mctp/mctp-pcc.c:214:19: error: incomplete definition of type 'struct acpi_device' 214 | dev_dbg(&acpi_dev->dev, "Adding mctp_pcc device for HID %s\n", | ~~~~~~~~^ include/linux/dev_printk.h:165:18: note: expanded from macro 'dev_dbg' 165 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~ include/linux/dynamic_debug.h:274:7: note: expanded from macro 'dynamic_dev_dbg' 274 | dev, fmt, ##__VA_ARGS__) | ^~~ include/linux/dynamic_debug.h:250:59: note: expanded from macro '_dynamic_func_call' 250 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dynamic_debug.h:248:65: note: expanded from macro '_dynamic_func_call_cls' 248 | __dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, ##__VA_ARGS__) | ^~~~~~~~~~~ include/linux/dynamic_debug.h:224:15: note: expanded from macro '__dynamic_func_call_cls' 224 | func(&id, ##__VA_ARGS__); \ | ^~~~~~~~~~~ include/linux/acpi.h:792:8: note: forward declaration of 'struct acpi_device' 792 | struct acpi_device; | ^ drivers/net/mctp/mctp-pcc.c:215:3: error: call to undeclared function 'acpi_device_hid'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 215 | acpi_device_hid(acpi_dev)); | ^ drivers/net/mctp/mctp-pcc.c:215:3: note: did you mean 'acpi_device_dep'? include/acpi/acpi_bus.h:41:6: note: 'acpi_device_dep' declared here 41 | bool acpi_device_dep(acpi_handle target, acpi_handle match); | ^ drivers/net/mctp/mctp-pcc.c:216:15: error: call to undeclared function 'acpi_device_handle'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration] 216 | dev_handle = acpi_device_handle(acpi_dev); | ^ drivers/net/mctp/mctp-pcc.c:216:13: error: incompatible integer to pointer conversion assigning to 'acpi_handle' (aka 'void *') from 'int' [-Wint-conversion] 216 | dev_handle = acpi_device_handle(acpi_dev); | ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/net/mctp/mctp-pcc.c:220:20: error: incomplete definition of type 'struct acpi_device' 220 | dev_err(&acpi_dev->dev, "FAILURE to lookup PCC indexes from CRS"); | ~~~~~~~~^ include/linux/dev_printk.h:154:44: note: expanded from macro 'dev_err' 154 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__) | ^~~ include/linux/dev_printk.h:110:11: note: expanded from macro 'dev_printk_index_wrap' 110 | _p_func(dev, fmt, ##__VA_ARGS__); \ | ^~~ include/linux/acpi.h:792:8: note: forward declaration of 'struct acpi_device' 792 | struct acpi_device; | ^ drivers/net/mctp/mctp-pcc.c:225:17: error: incomplete definition of type 'struct acpi_device' 225 | dev = &acpi_dev->dev; | ~~~~~~~~^ include/linux/acpi.h:792:8: note: forward declaration of 'struct acpi_device' 792 | struct acpi_device; | ^ drivers/net/mctp/mctp-pcc.c:271:10: error: incomplete definition of type 'struct acpi_device' 271 | acpi_dev->driver_data = mctp_pcc_dev; | ~~~~~~~~^ include/linux/acpi.h:792:8: note: forward declaration of 'struct acpi_device' 792 | struct acpi_device; | ^ drivers/net/mctp/mctp-pcc.c:326:27: error: variable has incomplete type 'struct acpi_driver' 326 | static struct acpi_driver mctp_pcc_driver = { | ^ drivers/net/mctp/mctp-pcc.c:326:15: note: forward declaration of 'struct acpi_driver' 326 | static struct acpi_driver mctp_pcc_driver = { | ^ >> drivers/net/mctp/mctp-pcc.c:337:1: error: type specifier missing, defaults to 'int'; ISO C99 and later do not support implicit int [-Wimplicit-int] 337 | module_acpi_driver(mctp_pcc_driver); | ^ | int >> drivers/net/mctp/mctp-pcc.c:337:20: error: a parameter list without types is only allowed in a function definition 337 | module_acpi_driver(mctp_pcc_driver); | ^ 6 warnings and 10 errors generated. vim +/int +337 drivers/net/mctp/mctp-pcc.c 325 > 326 static struct acpi_driver mctp_pcc_driver = { 327 .name = "mctp_pcc", 328 .class = "Unknown", 329 .ids = mctp_pcc_device_ids, 330 .ops = { 331 .add = mctp_pcc_driver_add, 332 .remove = mctp_pcc_driver_remove, 333 }, 334 .owner = THIS_MODULE, 335 }; 336 > 337 module_acpi_driver(mctp_pcc_driver); 338 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport 2024-06-25 18:53 ` [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport admiyo 2024-06-26 17:02 ` kernel test robot 2024-06-26 22:42 ` kernel test robot @ 2024-06-28 8:41 ` Jeremy Kerr 2024-06-28 16:51 ` Adam Young 2 siblings, 1 reply; 11+ messages in thread From: Jeremy Kerr @ 2024-06-28 8:41 UTC (permalink / raw) To: admiyo, Matt Johnston, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: netdev, linux-kernel Hi Adam, Looking good, just a couple of minor things inline, and a query on the new _remove() implementation. > +#define SPDM_VERSION_OFFSET 1 > +#define SPDM_REQ_RESP_OFFSET 2 These seem unrelated, and are unused? > +#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 SIGNATURE_LENGTH 4 > +#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 > +#define PCC_ACK_FLAG_MASK 0x1 > + > +struct mctp_pcc_hdr { > + u32 signature; > + u32 flags; > + u32 length; > + char mctp_signature[4]; > +}; I'd recommend the endian-annotated types for signature, flags & length here, and converting on access. (yes, maybe this will only ever be intended for little-endian, but there's almost always cases where code gets moved around, copied into new drivers, etc) > +struct mctp_pcc_hw_addr { > + u32 inbox_index; > + u32 outbox_index; > +}; > + > +/* The netdev structure. One of these per PCC adapter. */ > +struct mctp_pcc_ndev { > + struct list_head next; > + /* spinlock to serialize access to pcc buffer and registers*/ > + spinlock_t lock; > + struct mctp_dev mdev; > + struct acpi_device *acpi_device; > + struct pcc_mbox_chan *in_chan; > + struct pcc_mbox_chan *out_chan; > + struct mbox_client outbox_client; > + struct mbox_client inbox_client; > + void __iomem *pcc_comm_inbox_addr; > + void __iomem *pcc_comm_outbox_addr; > + struct mctp_pcc_hw_addr hw_addr; > +}; > + > +static struct list_head mctp_pcc_ndevs = LIST_HEAD_INIT(mctp_pcc_ndevs); Saw your changelog entry about needing this, makes sense if that's what the acpi core requires. In which case, you can make this a little more brief with: static LIST_HEAD(mctp_pcc_ndevs); (but more on that below) > +static void mctp_pcc_client_rx_callback(struct mbox_client *c, void *buffer) > +{ > + struct mctp_pcc_ndev *mctp_pcc_dev; > + struct mctp_pcc_hdr mctp_pcc_hdr; > + struct mctp_skb_cb *cb; > + struct sk_buff *skb; > + void *skb_buf; > + u32 data_len; > + u32 flags; > + > + mctp_pcc_dev = container_of(c, struct mctp_pcc_ndev, inbox_client); > + memcpy_fromio(&mctp_pcc_hdr, mctp_pcc_dev->pcc_comm_inbox_addr, > + sizeof(struct mctp_pcc_hdr)); > + data_len = mctp_pcc_hdr.length + MCTP_HEADER_LENGTH; > + > + if (data_len > mctp_pcc_dev->mdev.dev->max_mtu) { > + mctp_pcc_dev->mdev.dev->stats.rx_dropped++; > + return; > + } > + > + skb = netdev_alloc_skb(mctp_pcc_dev->mdev.dev, data_len); > + if (!skb) { > + mctp_pcc_dev->mdev.dev->stats.rx_dropped++; > + return; > + } > + mctp_pcc_dev->mdev.dev->stats.rx_packets++; > + mctp_pcc_dev->mdev.dev->stats.rx_bytes += data_len; > + skb->protocol = htons(ETH_P_MCTP); > + skb_buf = skb_put(skb, data_len); > + memcpy_fromio(skb_buf, mctp_pcc_dev->pcc_comm_inbox_addr, 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); > + > + flags = mctp_pcc_hdr.flags; > + mctp_pcc_dev->in_chan->ack_rx = (flags & PCC_ACK_FLAG_MASK) > 0; The '>' comparison to a bit field is a bit odd, you could just: mctp_pcc_dev->in_chan->ack_rx = !!(flags & PCC_ACK_FLAG_MASK); > +static void > +mctp_pcc_net_stats(struct net_device *net_dev, > + struct rtnl_link_stats64 *stats) > +{ > + struct mctp_pcc_ndev *mpnd; > + > + mpnd = (struct mctp_pcc_ndev *)netdev_priv(net_dev); No need to cast from void *. > +static int mctp_pcc_driver_add(struct acpi_device *acpi_dev) > +{ > + struct lookup_context context = {0, 0, 0}; > + struct mctp_pcc_ndev *mctp_pcc_dev; > + struct net_device *ndev; > + acpi_handle dev_handle; > + acpi_status status; > + struct device *dev; > + int mctp_pcc_mtu; > + int outbox_index; > + int inbox_index; > + char name[32]; > + int rc; > + > + dev_dbg(&acpi_dev->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(&acpi_dev->dev, "FAILURE to lookup PCC indexes from CRS"); > + return -EINVAL; > + } > + inbox_index = context.inbox_index; > + outbox_index = context.outbox_index; > + dev = &acpi_dev->dev; > + > + snprintf(name, sizeof(name), "mctpipcc%d", inbox_index); > + ndev = alloc_netdev(sizeof(struct mctp_pcc_ndev), name, NET_NAME_ENUM, > + mctp_pcc_setup); > + if (!ndev) > + return -ENOMEM; > + mctp_pcc_dev = (struct mctp_pcc_ndev *)netdev_priv(ndev); No need for the cast from void *. > +static void mctp_pcc_driver_remove(struct acpi_device *adev) > +{ > + struct list_head *ptr; > + struct list_head *tmp; > + > + list_for_each_safe(ptr, tmp, &mctp_pcc_ndevs) { You can save the list_entry() below by using list_for_each_entry_safe() here. > + struct net_device *ndev; > + struct mctp_pcc_ndev *mctp_pcc_dev; > + > + mctp_pcc_dev = list_entry(ptr, struct mctp_pcc_ndev, next); > + if (mctp_pcc_dev->acpi_device != adev) > + continue; Wait, you removed the case where you clean up the whole list if adev is NULL? Now this contradicts your section of the changelog: - Did not change the module init unload function to use the ACPI equivalent as they do not remove all devices prior to unload, leading to dangling references and seg faults. Does this mean you no longer need to free all instances on unload? In which case, that sounds great! that probably also means: - all the list is doing is allowing you to find the mctp_pcc_dev from the acpi_device - but: you can turn an acpi_device into a mctp_pcc_dev from adev->driver_data (which you're already setting), so you don't need the list - then, _remove just becomes something like: static void mctp_pcc_driver_remove(struct acpi_device *adev) { struct mctp_pcc_dev *dev = acpi_driver_data(adev); pcc_mbox_free_channel(dev->out_chan); pcc_mbox_free_channel(dev->in_chan); if (dev->mdev.dev) mctp_unregister_netdev(dev->mdev.dev); } (but I can't see how dev->mdev.dev can be null, so you may be able to remove the condition too) > + pcc_mbox_free_channel(mctp_pcc_dev->out_chan); > + pcc_mbox_free_channel(mctp_pcc_dev->in_chan); > + ndev = mctp_pcc_dev->mdev.dev; > + if (ndev) > + mctp_unregister_netdev(ndev); > + list_del(ptr); > + break; Unusual indent here. Cheers, Jeremy ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport 2024-06-28 8:41 ` Jeremy Kerr @ 2024-06-28 16:51 ` Adam Young 0 siblings, 0 replies; 11+ messages in thread From: Adam Young @ 2024-06-28 16:51 UTC (permalink / raw) To: Jeremy Kerr, admiyo, Matt Johnston, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni Cc: netdev, linux-kernel Yep, you are right, and as I continue to mull this over, I realize I can make it much simpler. Sorry about missing the changelog entry, as I had written that prior to realizing that all of this cleanup was a workaround for the error you found in the first iteration: flipping the null meant I was leaving behind devices when I should have been cleaning them up. So, yeah, I think the list can go now. On 6/28/24 04:41, Jeremy Kerr wrote: > You can save the list_entry() below by using list_for_each_entry_safe() > here. > >> + struct net_device *ndev; >> + struct mctp_pcc_ndev *mctp_pcc_dev; >> + >> + mctp_pcc_dev = list_entry(ptr, struct mctp_pcc_ndev, next); >> + if (mctp_pcc_dev->acpi_device != adev) >> + continue; > Wait, you removed the case where you clean up the whole list if adev is > NULL? > > Now this contradicts your section of the changelog: > > - Did not change the module init unload function to use the > ACPI equivalent as they do not remove all devices prior > to unload, leading to dangling references and seg faults. > > Does this mean you no longer need to free all instances on unload? In > which case, that sounds great! that probably also means: > > - all the list is doing is allowing you to find the mctp_pcc_dev from > the acpi_device > > - but: you can turn an acpi_device into a mctp_pcc_dev from > adev->driver_data (which you're already setting), so you don't need > the list > > - then, _remove just becomes something like: > > static void mctp_pcc_driver_remove(struct acpi_device *adev) > { > struct mctp_pcc_dev *dev = acpi_driver_data(adev); > > pcc_mbox_free_channel(dev->out_chan); > pcc_mbox_free_channel(dev->in_chan); > if (dev->mdev.dev) > mctp_unregister_netdev(dev->mdev.dev); > } > > (but I can't see how dev->mdev.dev can be null, so you may be able > to remove the condition too) ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2024-06-28 18:13 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-06-25 18:53 [PATCH v3 0/3] MCTP over PCC admiyo 2024-06-25 18:53 ` [PATCH v3 1/3] mctp pcc: Check before sending MCTP PCC response ACK admiyo 2024-06-26 12:27 ` Sudeep Holla 2024-06-26 17:14 ` Adam Young 2024-06-28 18:13 ` Adam Young 2024-06-25 18:53 ` [PATCH v3 2/3] mctp pcc: Allow PCC Data Type in MCTP resource admiyo 2024-06-25 18:53 ` [PATCH v3 3/3] mctp pcc: Implement MCTP over PCC Transport admiyo 2024-06-26 17:02 ` kernel test robot 2024-06-26 22:42 ` kernel test robot 2024-06-28 8:41 ` Jeremy Kerr 2024-06-28 16:51 ` Adam Young
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).