All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Winiarska, Iwona" <iwona.winiarska@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>
Cc: "corbet@lwn.net" <corbet@lwn.net>,
	"jae.hyun.yoo@linux.intel.com" <jae.hyun.yoo@linux.intel.com>,
	"d.mueller@elsoft.ch" <d.mueller@elsoft.ch>,
	"linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"andrew@aj.id.au" <andrew@aj.id.au>,
	"Luck, Tony" <tony.luck@intel.com>,
	"Lutomirski, Andy" <luto@kernel.org>,
	"andriy.shevchenko@linux.intel.com"
	<andriy.shevchenko@linux.intel.com>,
	"mchehab@kernel.org" <mchehab@kernel.org>,
	"jdelvare@suse.com" <jdelvare@suse.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"olof@lixom.net" <olof@lixom.net>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux@roeck-us.net" <linux@roeck-us.net>,
	"zweiss@equinix.com" <zweiss@equinix.com>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"joel@jms.id.au" <joel@jms.id.au>,
	"yazen.ghannam@amd.com" <yazen.ghannam@amd.com>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"pierre-louis.bossart@linux.intel.com"
	<pierre-louis.bossart@linux.intel.com>,
	"x86@kernel.org" <x86@kernel.org>, "bp@alien8.de" <bp@alien8.de>
Subject: Re: [PATCH v2 08/15] peci: Add device detection
Date: Mon, 15 Nov 2021 22:18:06 +0000	[thread overview]
Message-ID: <b664e784f2b14ac75693af0982fdcb1af89ef583.camel@intel.com> (raw)
In-Reply-To: <CAPcyv4hPLReB6wGTDBM_tnqRUXxNASFCtgCw0=aDW+PPfSJ57A@mail.gmail.com>

On Fri, 2021-08-27 at 12:01 -0700, Dan Williams wrote:
> On Tue, Aug 3, 2021 at 4:35 AM Iwona Winiarska
> <iwona.winiarska@intel.com> wrote:
> > 
> > Since PECI devices are discoverable, we can dynamically detect devices
> > that are actually available in the system.
> > 
> > This change complements the earlier implementation by rescanning PECI
> > bus to detect available devices. For this purpose, it also introduces the
> > minimal API for PECI requests.
> > 
> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > ---
> >  drivers/peci/Makefile   |   2 +-
> >  drivers/peci/core.c     |  33 ++++++++++++
> >  drivers/peci/device.c   | 114 ++++++++++++++++++++++++++++++++++++++++
> >  drivers/peci/internal.h |  14 +++++
> >  drivers/peci/request.c  |  50 ++++++++++++++++++
> >  5 files changed, 212 insertions(+), 1 deletion(-)
> >  create mode 100644 drivers/peci/device.c
> >  create mode 100644 drivers/peci/request.c
> > 
> > diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile
> > index 926d8df15cbd..c5f9d3fe21bb 100644
> > --- a/drivers/peci/Makefile
> > +++ b/drivers/peci/Makefile
> > @@ -1,7 +1,7 @@
> >  # SPDX-License-Identifier: GPL-2.0-only
> > 
> >  # Core functionality
> > -peci-y := core.o
> > +peci-y := core.o request.o device.o
> >  obj-$(CONFIG_PECI) += peci.o
> > 
> >  # Hardware specific bus drivers
> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c
> > index 7b3938af0396..d143f1a7fe98 100644
> > --- a/drivers/peci/core.c
> > +++ b/drivers/peci/core.c
> > @@ -34,6 +34,20 @@ struct device_type peci_controller_type = {
> >         .release        = peci_controller_dev_release,
> >  };
> > 
> > +static int peci_controller_scan_devices(struct peci_controller *controller)
> > +{
> > +       int ret;
> > +       u8 addr;
> > +
> > +       for (addr = PECI_BASE_ADDR; addr < PECI_BASE_ADDR +
> > PECI_DEVICE_NUM_MAX; addr++) {
> > +               ret = peci_device_create(controller, addr);
> > +               if (ret)
> > +                       return ret;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> >  static struct peci_controller *peci_controller_alloc(struct device *dev,
> >                                                      struct
> > peci_controller_ops *ops)
> >  {
> > @@ -76,10 +90,23 @@ static struct peci_controller
> > *peci_controller_alloc(struct device *dev,
> >         return ERR_PTR(ret);
> >  }
> > 
> > +static int unregister_child(struct device *dev, void *dummy)
> > +{
> > +       peci_device_destroy(to_peci_device(dev));
> > +
> > +       return 0;
> > +}
> > +
> >  static void unregister_controller(void *_controller)
> >  {
> >         struct peci_controller *controller = _controller;
> > 
> > +       /*
> > +        * Detach any active PECI devices. This can't fail, thus we do not
> > +        * check the returned value.
> > +        */
> > +       device_for_each_child_reverse(&controller->dev, NULL,
> > unregister_child);
> > +
> >         device_unregister(&controller->dev);
> >  }
> > 
> > @@ -115,6 +142,12 @@ struct peci_controller *devm_peci_controller_add(struct
> > device *dev,
> >         if (ret)
> >                 return ERR_PTR(ret);
> > 
> > +       /*
> > +        * Ignoring retval since failures during scan are non-critical for
> > +        * controller itself.
> > +        */
> > +       peci_controller_scan_devices(controller);
> > +
> >         return controller;
> > 
> >  err:
> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c
> > new file mode 100644
> > index 000000000000..32811248997b
> > --- /dev/null
> > +++ b/drivers/peci/device.c
> > @@ -0,0 +1,114 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2018-2021 Intel Corporation
> > +
> > +#include <linux/peci.h>
> > +#include <linux/slab.h>
> > +
> > +#include "internal.h"
> > +
> > +static int peci_detect(struct peci_controller *controller, u8 addr)
> > +{
> > +       struct peci_request *req;
> > +       int ret;
> > +
> > +       /*
> > +        * PECI Ping is a command encoded by tx_len = 0, rx_len = 0.
> > +        * We expect correct Write FCS if the device at the target address
> > +        * is able to respond.
> > +        */
> > +       req = peci_request_alloc(NULL, 0, 0);
> > +       if (!req)
> > +               return -ENOMEM;
> 
> Seems a waste to do a heap allocation for this routine. Why not:
> 
>        /*
>         * PECI Ping is a command encoded by tx_len = 0, rx_len = 0.
>         * We expect correct Write FCS if the device at the target address
>         * is able to respond.
>         */
>        struct peci_request req = { 0 };

Done.

> 
> > +
> > +       mutex_lock(&controller->bus_lock);
> > +       ret = controller->ops->xfer(controller, addr, req);
> > +       mutex_unlock(&controller->bus_lock);
> > +
> > +       peci_request_free(req);
> > +
> > +       return ret;
> > +}
> > +
> > +static bool peci_addr_valid(u8 addr)
> > +{
> > +       return addr >= PECI_BASE_ADDR && addr < PECI_BASE_ADDR +
> > PECI_DEVICE_NUM_MAX;
> > +}
> > +
> > +static int peci_dev_exists(struct device *dev, void *data)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +       u8 *addr = data;
> > +
> > +       if (device->addr == *addr)
> > +               return -EBUSY;
> > +
> > +       return 0;
> > +}
> > +
> > +int peci_device_create(struct peci_controller *controller, u8 addr)
> > +{
> > +       struct peci_device *device;
> > +       int ret;
> > +
> > +       if (WARN_ON(!peci_addr_valid(addr)))
> 
> The WARN_ON is overkill, especially as there is only one caller of
> this and it loops through valid addresses.

Done.

> 
> > +               return -EINVAL;
> > +
> > +       /* Check if we have already detected this device before. */
> > +       ret = device_for_each_child(&controller->dev, &addr,
> > peci_dev_exists);
> > +       if (ret)
> > +               return 0;
> > +
> > +       ret = peci_detect(controller, addr);
> > +       if (ret) {
> > +               /*
> > +                * Device not present or host state doesn't allow successful
> > +                * detection at this time.
> > +                */
> > +               if (ret == -EIO || ret == -ETIMEDOUT)
> > +                       return 0;
> > +
> > +               return ret;
> > +       }
> > +
> > +       device = kzalloc(sizeof(*device), GFP_KERNEL);
> > +       if (!device)
> > +               return -ENOMEM;
> > +
> > +       device->addr = addr;
> > +       device->dev.parent = &controller->dev;
> > +       device->dev.bus = &peci_bus_type;
> > +       device->dev.type = &peci_device_type;
> > +
> > +       ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device-
> > >addr);
> > +       if (ret)
> > +               goto err_free;
> 
> It's cleaner to just have one unified error exit using put_device().
> Use the device_initialize() + device_add() pattern, not
> device_register().

Done.

> 
> 
> > +
> > +       ret = device_register(&device->dev);
> > +       if (ret)
> > +               goto err_put;
> > +
> > +       return 0;
> > +
> > +err_put:
> > +       put_device(&device->dev);
> > +err_free:
> > +       kfree(device);
> > +
> > +       return ret;
> > +}
> > +
> > +void peci_device_destroy(struct peci_device *device)
> > +{
> > +       device_unregister(&device->dev);
> 
> No clear value for this wrapper, in fact in one caller it causes it to
> do a to_peci_device() just this helper can undo that up-cast.

It gains value after extending it with kill_device().

> 
> > +}
> > +
> > +static void peci_device_release(struct device *dev)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +
> > +       kfree(device);
> > +}
> > +
> > +struct device_type peci_device_type = {
> > +       .release        = peci_device_release,
> > +};
> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h
> > index 918dea745a86..57d11a902c5d 100644
> > --- a/drivers/peci/internal.h
> > +++ b/drivers/peci/internal.h
> > @@ -8,6 +8,20 @@
> >  #include <linux/types.h>
> > 
> >  struct peci_controller;
> > +struct peci_device;
> > +struct peci_request;
> > +
> > +/* PECI CPU address range 0x30-0x37 */
> > +#define PECI_BASE_ADDR         0x30
> > +#define PECI_DEVICE_NUM_MAX    8
> > +
> > +struct peci_request *peci_request_alloc(struct peci_device *device, u8
> > tx_len, u8 rx_len);
> > +void peci_request_free(struct peci_request *req);
> > +
> > +extern struct device_type peci_device_type;
> > +
> > +int peci_device_create(struct peci_controller *controller, u8 addr);
> > +void peci_device_destroy(struct peci_device *device);
> > 
> >  extern struct bus_type peci_bus_type;
> > 
> > diff --git a/drivers/peci/request.c b/drivers/peci/request.c
> > new file mode 100644
> > index 000000000000..81b567bc7b87
> > --- /dev/null
> > +++ b/drivers/peci/request.c
> > @@ -0,0 +1,50 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2021 Intel Corporation
> > +
> > +#include <linux/export.h>
> > +#include <linux/peci.h>
> > +#include <linux/slab.h>
> > +#include <linux/types.h>
> > +
> > +#include "internal.h"
> > +
> > +/**
> > + * peci_request_alloc() - allocate &struct peci_requests
> > + * @device: PECI device to which request is going to be sent
> > + * @tx_len: TX length
> > + * @rx_len: RX length
> > + *
> > + * Return: A pointer to a newly allocated &struct peci_request on success
> > or NULL otherwise.
> > + */
> > +struct peci_request *peci_request_alloc(struct peci_device *device, u8
> > tx_len, u8 rx_len)
> > +{
> > +       struct peci_request *req;
> > +
> > +       if (WARN_ON_ONCE(tx_len > PECI_REQUEST_MAX_BUF_SIZE || rx_len >
> > PECI_REQUEST_MAX_BUF_SIZE))
> 
> WARN_ON_ONCE() should only be here to help other kernel developers not
> make this mistake However, another way to enforce this is to stop
> exporting peci_request_alloc() and instead export helpers for specific
> command types, and keep this detail internal to the core. If you keep
> this, it needs a comment that it is only here to warn other
> peci-client developers of their bug before it goes upstream.

Added comment.

Thanks
-Iwona

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: "Winiarska, Iwona" <iwona.winiarska@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>
Cc: "corbet@lwn.net" <corbet@lwn.net>,
	"jae.hyun.yoo@linux.intel.com" <jae.hyun.yoo@linux.intel.com>,
	"d.mueller@elsoft.ch" <d.mueller@elsoft.ch>,
	"linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"andrew@aj.id.au" <andrew@aj.id.au>,
	"Luck, Tony" <tony.luck@intel.com>,
	"Lutomirski, Andy" <luto@kernel.org>,
	"andriy.shevchenko@linux.intel.com" 
	<andriy.shevchenko@linux.intel.com>,
	"mchehab@kernel.org" <mchehab@kernel.org>,
	"jdelvare@suse.com" <jdelvare@suse.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"olof@lixom.net" <olof@lixom.net>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux@roeck-us.net" <linux@roeck-us.net>,
	"zweiss@equinix.com" <zweiss@equinix.com>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"joel@jms.id.au" <joel@jms.id.au>,
	"yazen.ghannam@amd.com" <yazen.ghannam@amd.com>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"pierre-louis.bossart@linux.intel.com" 
	<pierre-louis.bossart@linux.intel.com>,
	"x86@kernel.org" <x86@kernel.org>, "bp@alien8.de" <bp@alien8.de>
Subject: Re: [PATCH v2 08/15] peci: Add device detection
Date: Mon, 15 Nov 2021 22:18:06 +0000	[thread overview]
Message-ID: <b664e784f2b14ac75693af0982fdcb1af89ef583.camel@intel.com> (raw)
In-Reply-To: <CAPcyv4hPLReB6wGTDBM_tnqRUXxNASFCtgCw0=aDW+PPfSJ57A@mail.gmail.com>

On Fri, 2021-08-27 at 12:01 -0700, Dan Williams wrote:
> On Tue, Aug 3, 2021 at 4:35 AM Iwona Winiarska
> <iwona.winiarska@intel.com> wrote:
> > 
> > Since PECI devices are discoverable, we can dynamically detect devices
> > that are actually available in the system.
> > 
> > This change complements the earlier implementation by rescanning PECI
> > bus to detect available devices. For this purpose, it also introduces the
> > minimal API for PECI requests.
> > 
> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > ---
> >  drivers/peci/Makefile   |   2 +-
> >  drivers/peci/core.c     |  33 ++++++++++++
> >  drivers/peci/device.c   | 114 ++++++++++++++++++++++++++++++++++++++++
> >  drivers/peci/internal.h |  14 +++++
> >  drivers/peci/request.c  |  50 ++++++++++++++++++
> >  5 files changed, 212 insertions(+), 1 deletion(-)
> >  create mode 100644 drivers/peci/device.c
> >  create mode 100644 drivers/peci/request.c
> > 
> > diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile
> > index 926d8df15cbd..c5f9d3fe21bb 100644
> > --- a/drivers/peci/Makefile
> > +++ b/drivers/peci/Makefile
> > @@ -1,7 +1,7 @@
> >  # SPDX-License-Identifier: GPL-2.0-only
> > 
> >  # Core functionality
> > -peci-y := core.o
> > +peci-y := core.o request.o device.o
> >  obj-$(CONFIG_PECI) += peci.o
> > 
> >  # Hardware specific bus drivers
> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c
> > index 7b3938af0396..d143f1a7fe98 100644
> > --- a/drivers/peci/core.c
> > +++ b/drivers/peci/core.c
> > @@ -34,6 +34,20 @@ struct device_type peci_controller_type = {
> >         .release        = peci_controller_dev_release,
> >  };
> > 
> > +static int peci_controller_scan_devices(struct peci_controller *controller)
> > +{
> > +       int ret;
> > +       u8 addr;
> > +
> > +       for (addr = PECI_BASE_ADDR; addr < PECI_BASE_ADDR +
> > PECI_DEVICE_NUM_MAX; addr++) {
> > +               ret = peci_device_create(controller, addr);
> > +               if (ret)
> > +                       return ret;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> >  static struct peci_controller *peci_controller_alloc(struct device *dev,
> >                                                      struct
> > peci_controller_ops *ops)
> >  {
> > @@ -76,10 +90,23 @@ static struct peci_controller
> > *peci_controller_alloc(struct device *dev,
> >         return ERR_PTR(ret);
> >  }
> > 
> > +static int unregister_child(struct device *dev, void *dummy)
> > +{
> > +       peci_device_destroy(to_peci_device(dev));
> > +
> > +       return 0;
> > +}
> > +
> >  static void unregister_controller(void *_controller)
> >  {
> >         struct peci_controller *controller = _controller;
> > 
> > +       /*
> > +        * Detach any active PECI devices. This can't fail, thus we do not
> > +        * check the returned value.
> > +        */
> > +       device_for_each_child_reverse(&controller->dev, NULL,
> > unregister_child);
> > +
> >         device_unregister(&controller->dev);
> >  }
> > 
> > @@ -115,6 +142,12 @@ struct peci_controller *devm_peci_controller_add(struct
> > device *dev,
> >         if (ret)
> >                 return ERR_PTR(ret);
> > 
> > +       /*
> > +        * Ignoring retval since failures during scan are non-critical for
> > +        * controller itself.
> > +        */
> > +       peci_controller_scan_devices(controller);
> > +
> >         return controller;
> > 
> >  err:
> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c
> > new file mode 100644
> > index 000000000000..32811248997b
> > --- /dev/null
> > +++ b/drivers/peci/device.c
> > @@ -0,0 +1,114 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2018-2021 Intel Corporation
> > +
> > +#include <linux/peci.h>
> > +#include <linux/slab.h>
> > +
> > +#include "internal.h"
> > +
> > +static int peci_detect(struct peci_controller *controller, u8 addr)
> > +{
> > +       struct peci_request *req;
> > +       int ret;
> > +
> > +       /*
> > +        * PECI Ping is a command encoded by tx_len = 0, rx_len = 0.
> > +        * We expect correct Write FCS if the device at the target address
> > +        * is able to respond.
> > +        */
> > +       req = peci_request_alloc(NULL, 0, 0);
> > +       if (!req)
> > +               return -ENOMEM;
> 
> Seems a waste to do a heap allocation for this routine. Why not:
> 
>        /*
>         * PECI Ping is a command encoded by tx_len = 0, rx_len = 0.
>         * We expect correct Write FCS if the device at the target address
>         * is able to respond.
>         */
>        struct peci_request req = { 0 };

Done.

> 
> > +
> > +       mutex_lock(&controller->bus_lock);
> > +       ret = controller->ops->xfer(controller, addr, req);
> > +       mutex_unlock(&controller->bus_lock);
> > +
> > +       peci_request_free(req);
> > +
> > +       return ret;
> > +}
> > +
> > +static bool peci_addr_valid(u8 addr)
> > +{
> > +       return addr >= PECI_BASE_ADDR && addr < PECI_BASE_ADDR +
> > PECI_DEVICE_NUM_MAX;
> > +}
> > +
> > +static int peci_dev_exists(struct device *dev, void *data)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +       u8 *addr = data;
> > +
> > +       if (device->addr == *addr)
> > +               return -EBUSY;
> > +
> > +       return 0;
> > +}
> > +
> > +int peci_device_create(struct peci_controller *controller, u8 addr)
> > +{
> > +       struct peci_device *device;
> > +       int ret;
> > +
> > +       if (WARN_ON(!peci_addr_valid(addr)))
> 
> The WARN_ON is overkill, especially as there is only one caller of
> this and it loops through valid addresses.

Done.

> 
> > +               return -EINVAL;
> > +
> > +       /* Check if we have already detected this device before. */
> > +       ret = device_for_each_child(&controller->dev, &addr,
> > peci_dev_exists);
> > +       if (ret)
> > +               return 0;
> > +
> > +       ret = peci_detect(controller, addr);
> > +       if (ret) {
> > +               /*
> > +                * Device not present or host state doesn't allow successful
> > +                * detection at this time.
> > +                */
> > +               if (ret == -EIO || ret == -ETIMEDOUT)
> > +                       return 0;
> > +
> > +               return ret;
> > +       }
> > +
> > +       device = kzalloc(sizeof(*device), GFP_KERNEL);
> > +       if (!device)
> > +               return -ENOMEM;
> > +
> > +       device->addr = addr;
> > +       device->dev.parent = &controller->dev;
> > +       device->dev.bus = &peci_bus_type;
> > +       device->dev.type = &peci_device_type;
> > +
> > +       ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device-
> > >addr);
> > +       if (ret)
> > +               goto err_free;
> 
> It's cleaner to just have one unified error exit using put_device().
> Use the device_initialize() + device_add() pattern, not
> device_register().

Done.

> 
> 
> > +
> > +       ret = device_register(&device->dev);
> > +       if (ret)
> > +               goto err_put;
> > +
> > +       return 0;
> > +
> > +err_put:
> > +       put_device(&device->dev);
> > +err_free:
> > +       kfree(device);
> > +
> > +       return ret;
> > +}
> > +
> > +void peci_device_destroy(struct peci_device *device)
> > +{
> > +       device_unregister(&device->dev);
> 
> No clear value for this wrapper, in fact in one caller it causes it to
> do a to_peci_device() just this helper can undo that up-cast.

It gains value after extending it with kill_device().

> 
> > +}
> > +
> > +static void peci_device_release(struct device *dev)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +
> > +       kfree(device);
> > +}
> > +
> > +struct device_type peci_device_type = {
> > +       .release        = peci_device_release,
> > +};
> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h
> > index 918dea745a86..57d11a902c5d 100644
> > --- a/drivers/peci/internal.h
> > +++ b/drivers/peci/internal.h
> > @@ -8,6 +8,20 @@
> >  #include <linux/types.h>
> > 
> >  struct peci_controller;
> > +struct peci_device;
> > +struct peci_request;
> > +
> > +/* PECI CPU address range 0x30-0x37 */
> > +#define PECI_BASE_ADDR         0x30
> > +#define PECI_DEVICE_NUM_MAX    8
> > +
> > +struct peci_request *peci_request_alloc(struct peci_device *device, u8
> > tx_len, u8 rx_len);
> > +void peci_request_free(struct peci_request *req);
> > +
> > +extern struct device_type peci_device_type;
> > +
> > +int peci_device_create(struct peci_controller *controller, u8 addr);
> > +void peci_device_destroy(struct peci_device *device);
> > 
> >  extern struct bus_type peci_bus_type;
> > 
> > diff --git a/drivers/peci/request.c b/drivers/peci/request.c
> > new file mode 100644
> > index 000000000000..81b567bc7b87
> > --- /dev/null
> > +++ b/drivers/peci/request.c
> > @@ -0,0 +1,50 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2021 Intel Corporation
> > +
> > +#include <linux/export.h>
> > +#include <linux/peci.h>
> > +#include <linux/slab.h>
> > +#include <linux/types.h>
> > +
> > +#include "internal.h"
> > +
> > +/**
> > + * peci_request_alloc() - allocate &struct peci_requests
> > + * @device: PECI device to which request is going to be sent
> > + * @tx_len: TX length
> > + * @rx_len: RX length
> > + *
> > + * Return: A pointer to a newly allocated &struct peci_request on success
> > or NULL otherwise.
> > + */
> > +struct peci_request *peci_request_alloc(struct peci_device *device, u8
> > tx_len, u8 rx_len)
> > +{
> > +       struct peci_request *req;
> > +
> > +       if (WARN_ON_ONCE(tx_len > PECI_REQUEST_MAX_BUF_SIZE || rx_len >
> > PECI_REQUEST_MAX_BUF_SIZE))
> 
> WARN_ON_ONCE() should only be here to help other kernel developers not
> make this mistake However, another way to enforce this is to stop
> exporting peci_request_alloc() and instead export helpers for specific
> command types, and keep this detail internal to the core. If you keep
> this, it needs a comment that it is only here to warn other
> peci-client developers of their bug before it goes upstream.

Added comment.

Thanks
-Iwona


WARNING: multiple messages have this Message-ID (diff)
From: "Winiarska, Iwona" <iwona.winiarska@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>
Cc: "linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"zweiss@equinix.com" <zweiss@equinix.com>,
	"jae.hyun.yoo@linux.intel.com" <jae.hyun.yoo@linux.intel.com>,
	"andriy.shevchenko@linux.intel.com"
	<andriy.shevchenko@linux.intel.com>,
	"corbet@lwn.net" <corbet@lwn.net>,
	"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
	"x86@kernel.org" <x86@kernel.org>,
	"pierre-louis.bossart@linux.intel.com"
	<pierre-louis.bossart@linux.intel.com>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"linux@roeck-us.net" <linux@roeck-us.net>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"jdelvare@suse.com" <jdelvare@suse.com>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"bp@alien8.de" <bp@alien8.de>,
	"Lutomirski, Andy" <luto@kernel.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"mchehab@kernel.org" <mchehab@kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"Luck, Tony" <tony.luck@intel.com>,
	"andrew@aj.id.au" <andrew@aj.id.au>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"yazen.ghannam@amd.com" <yazen.ghannam@amd.com>,
	"olof@lixom.net" <olof@lixom.net>
Subject: Re: [PATCH v2 08/15] peci: Add device detection
Date: Mon, 15 Nov 2021 22:18:06 +0000	[thread overview]
Message-ID: <b664e784f2b14ac75693af0982fdcb1af89ef583.camel@intel.com> (raw)
In-Reply-To: <CAPcyv4hPLReB6wGTDBM_tnqRUXxNASFCtgCw0=aDW+PPfSJ57A@mail.gmail.com>

On Fri, 2021-08-27 at 12:01 -0700, Dan Williams wrote:
> On Tue, Aug 3, 2021 at 4:35 AM Iwona Winiarska
> <iwona.winiarska@intel.com> wrote:
> > 
> > Since PECI devices are discoverable, we can dynamically detect devices
> > that are actually available in the system.
> > 
> > This change complements the earlier implementation by rescanning PECI
> > bus to detect available devices. For this purpose, it also introduces the
> > minimal API for PECI requests.
> > 
> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
> > Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> > ---
> >  drivers/peci/Makefile   |   2 +-
> >  drivers/peci/core.c     |  33 ++++++++++++
> >  drivers/peci/device.c   | 114 ++++++++++++++++++++++++++++++++++++++++
> >  drivers/peci/internal.h |  14 +++++
> >  drivers/peci/request.c  |  50 ++++++++++++++++++
> >  5 files changed, 212 insertions(+), 1 deletion(-)
> >  create mode 100644 drivers/peci/device.c
> >  create mode 100644 drivers/peci/request.c
> > 
> > diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile
> > index 926d8df15cbd..c5f9d3fe21bb 100644
> > --- a/drivers/peci/Makefile
> > +++ b/drivers/peci/Makefile
> > @@ -1,7 +1,7 @@
> >  # SPDX-License-Identifier: GPL-2.0-only
> > 
> >  # Core functionality
> > -peci-y := core.o
> > +peci-y := core.o request.o device.o
> >  obj-$(CONFIG_PECI) += peci.o
> > 
> >  # Hardware specific bus drivers
> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c
> > index 7b3938af0396..d143f1a7fe98 100644
> > --- a/drivers/peci/core.c
> > +++ b/drivers/peci/core.c
> > @@ -34,6 +34,20 @@ struct device_type peci_controller_type = {
> >         .release        = peci_controller_dev_release,
> >  };
> > 
> > +static int peci_controller_scan_devices(struct peci_controller *controller)
> > +{
> > +       int ret;
> > +       u8 addr;
> > +
> > +       for (addr = PECI_BASE_ADDR; addr < PECI_BASE_ADDR +
> > PECI_DEVICE_NUM_MAX; addr++) {
> > +               ret = peci_device_create(controller, addr);
> > +               if (ret)
> > +                       return ret;
> > +       }
> > +
> > +       return 0;
> > +}
> > +
> >  static struct peci_controller *peci_controller_alloc(struct device *dev,
> >                                                      struct
> > peci_controller_ops *ops)
> >  {
> > @@ -76,10 +90,23 @@ static struct peci_controller
> > *peci_controller_alloc(struct device *dev,
> >         return ERR_PTR(ret);
> >  }
> > 
> > +static int unregister_child(struct device *dev, void *dummy)
> > +{
> > +       peci_device_destroy(to_peci_device(dev));
> > +
> > +       return 0;
> > +}
> > +
> >  static void unregister_controller(void *_controller)
> >  {
> >         struct peci_controller *controller = _controller;
> > 
> > +       /*
> > +        * Detach any active PECI devices. This can't fail, thus we do not
> > +        * check the returned value.
> > +        */
> > +       device_for_each_child_reverse(&controller->dev, NULL,
> > unregister_child);
> > +
> >         device_unregister(&controller->dev);
> >  }
> > 
> > @@ -115,6 +142,12 @@ struct peci_controller *devm_peci_controller_add(struct
> > device *dev,
> >         if (ret)
> >                 return ERR_PTR(ret);
> > 
> > +       /*
> > +        * Ignoring retval since failures during scan are non-critical for
> > +        * controller itself.
> > +        */
> > +       peci_controller_scan_devices(controller);
> > +
> >         return controller;
> > 
> >  err:
> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c
> > new file mode 100644
> > index 000000000000..32811248997b
> > --- /dev/null
> > +++ b/drivers/peci/device.c
> > @@ -0,0 +1,114 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2018-2021 Intel Corporation
> > +
> > +#include <linux/peci.h>
> > +#include <linux/slab.h>
> > +
> > +#include "internal.h"
> > +
> > +static int peci_detect(struct peci_controller *controller, u8 addr)
> > +{
> > +       struct peci_request *req;
> > +       int ret;
> > +
> > +       /*
> > +        * PECI Ping is a command encoded by tx_len = 0, rx_len = 0.
> > +        * We expect correct Write FCS if the device at the target address
> > +        * is able to respond.
> > +        */
> > +       req = peci_request_alloc(NULL, 0, 0);
> > +       if (!req)
> > +               return -ENOMEM;
> 
> Seems a waste to do a heap allocation for this routine. Why not:
> 
>        /*
>         * PECI Ping is a command encoded by tx_len = 0, rx_len = 0.
>         * We expect correct Write FCS if the device at the target address
>         * is able to respond.
>         */
>        struct peci_request req = { 0 };

Done.

> 
> > +
> > +       mutex_lock(&controller->bus_lock);
> > +       ret = controller->ops->xfer(controller, addr, req);
> > +       mutex_unlock(&controller->bus_lock);
> > +
> > +       peci_request_free(req);
> > +
> > +       return ret;
> > +}
> > +
> > +static bool peci_addr_valid(u8 addr)
> > +{
> > +       return addr >= PECI_BASE_ADDR && addr < PECI_BASE_ADDR +
> > PECI_DEVICE_NUM_MAX;
> > +}
> > +
> > +static int peci_dev_exists(struct device *dev, void *data)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +       u8 *addr = data;
> > +
> > +       if (device->addr == *addr)
> > +               return -EBUSY;
> > +
> > +       return 0;
> > +}
> > +
> > +int peci_device_create(struct peci_controller *controller, u8 addr)
> > +{
> > +       struct peci_device *device;
> > +       int ret;
> > +
> > +       if (WARN_ON(!peci_addr_valid(addr)))
> 
> The WARN_ON is overkill, especially as there is only one caller of
> this and it loops through valid addresses.

Done.

> 
> > +               return -EINVAL;
> > +
> > +       /* Check if we have already detected this device before. */
> > +       ret = device_for_each_child(&controller->dev, &addr,
> > peci_dev_exists);
> > +       if (ret)
> > +               return 0;
> > +
> > +       ret = peci_detect(controller, addr);
> > +       if (ret) {
> > +               /*
> > +                * Device not present or host state doesn't allow successful
> > +                * detection at this time.
> > +                */
> > +               if (ret == -EIO || ret == -ETIMEDOUT)
> > +                       return 0;
> > +
> > +               return ret;
> > +       }
> > +
> > +       device = kzalloc(sizeof(*device), GFP_KERNEL);
> > +       if (!device)
> > +               return -ENOMEM;
> > +
> > +       device->addr = addr;
> > +       device->dev.parent = &controller->dev;
> > +       device->dev.bus = &peci_bus_type;
> > +       device->dev.type = &peci_device_type;
> > +
> > +       ret = dev_set_name(&device->dev, "%d-%02x", controller->id, device-
> > >addr);
> > +       if (ret)
> > +               goto err_free;
> 
> It's cleaner to just have one unified error exit using put_device().
> Use the device_initialize() + device_add() pattern, not
> device_register().

Done.

> 
> 
> > +
> > +       ret = device_register(&device->dev);
> > +       if (ret)
> > +               goto err_put;
> > +
> > +       return 0;
> > +
> > +err_put:
> > +       put_device(&device->dev);
> > +err_free:
> > +       kfree(device);
> > +
> > +       return ret;
> > +}
> > +
> > +void peci_device_destroy(struct peci_device *device)
> > +{
> > +       device_unregister(&device->dev);
> 
> No clear value for this wrapper, in fact in one caller it causes it to
> do a to_peci_device() just this helper can undo that up-cast.

It gains value after extending it with kill_device().

> 
> > +}
> > +
> > +static void peci_device_release(struct device *dev)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +
> > +       kfree(device);
> > +}
> > +
> > +struct device_type peci_device_type = {
> > +       .release        = peci_device_release,
> > +};
> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h
> > index 918dea745a86..57d11a902c5d 100644
> > --- a/drivers/peci/internal.h
> > +++ b/drivers/peci/internal.h
> > @@ -8,6 +8,20 @@
> >  #include <linux/types.h>
> > 
> >  struct peci_controller;
> > +struct peci_device;
> > +struct peci_request;
> > +
> > +/* PECI CPU address range 0x30-0x37 */
> > +#define PECI_BASE_ADDR         0x30
> > +#define PECI_DEVICE_NUM_MAX    8
> > +
> > +struct peci_request *peci_request_alloc(struct peci_device *device, u8
> > tx_len, u8 rx_len);
> > +void peci_request_free(struct peci_request *req);
> > +
> > +extern struct device_type peci_device_type;
> > +
> > +int peci_device_create(struct peci_controller *controller, u8 addr);
> > +void peci_device_destroy(struct peci_device *device);
> > 
> >  extern struct bus_type peci_bus_type;
> > 
> > diff --git a/drivers/peci/request.c b/drivers/peci/request.c
> > new file mode 100644
> > index 000000000000..81b567bc7b87
> > --- /dev/null
> > +++ b/drivers/peci/request.c
> > @@ -0,0 +1,50 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2021 Intel Corporation
> > +
> > +#include <linux/export.h>
> > +#include <linux/peci.h>
> > +#include <linux/slab.h>
> > +#include <linux/types.h>
> > +
> > +#include "internal.h"
> > +
> > +/**
> > + * peci_request_alloc() - allocate &struct peci_requests
> > + * @device: PECI device to which request is going to be sent
> > + * @tx_len: TX length
> > + * @rx_len: RX length
> > + *
> > + * Return: A pointer to a newly allocated &struct peci_request on success
> > or NULL otherwise.
> > + */
> > +struct peci_request *peci_request_alloc(struct peci_device *device, u8
> > tx_len, u8 rx_len)
> > +{
> > +       struct peci_request *req;
> > +
> > +       if (WARN_ON_ONCE(tx_len > PECI_REQUEST_MAX_BUF_SIZE || rx_len >
> > PECI_REQUEST_MAX_BUF_SIZE))
> 
> WARN_ON_ONCE() should only be here to help other kernel developers not
> make this mistake However, another way to enforce this is to stop
> exporting peci_request_alloc() and instead export helpers for specific
> command types, and keep this detail internal to the core. If you keep
> this, it needs a comment that it is only here to warn other
> peci-client developers of their bug before it goes upstream.

Added comment.

Thanks
-Iwona


  reply	other threads:[~2021-11-15 22:19 UTC|newest]

Thread overview: 147+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-03 11:31 [PATCH v2 00/15] Introduce PECI subsystem Iwona Winiarska
2021-08-03 11:31 ` Iwona Winiarska
2021-08-03 11:31 ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 01/15] x86/cpu: Move intel-family to arch-independent headers Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-10-04 19:03   ` Borislav Petkov
2021-10-04 19:03     ` Borislav Petkov
2021-10-04 19:03     ` Borislav Petkov
2021-10-11 19:21     ` Winiarska, Iwona
2021-10-11 19:21       ` Winiarska, Iwona
2021-10-11 19:21       ` Winiarska, Iwona
2021-10-11 19:40       ` Dave Hansen
2021-10-11 19:40         ` Dave Hansen
2021-10-11 19:40         ` Dave Hansen
2021-10-11 20:53         ` Winiarska, Iwona
2021-10-11 20:53           ` Winiarska, Iwona
2021-10-11 20:53           ` Winiarska, Iwona
2021-10-11 23:12           ` Dave Hansen
2021-10-11 23:12             ` Dave Hansen
2021-10-11 23:12             ` Dave Hansen
2021-10-11 20:06       ` Borislav Petkov
2021-10-11 20:06         ` Borislav Petkov
2021-10-11 20:06         ` Borislav Petkov
2021-10-11 20:38         ` Winiarska, Iwona
2021-10-11 20:38           ` Winiarska, Iwona
2021-10-11 20:38           ` Winiarska, Iwona
2021-10-11 21:31           ` Borislav Petkov
2021-10-11 21:31             ` Borislav Petkov
2021-10-11 21:31             ` Borislav Petkov
2021-10-12 23:15             ` Winiarska, Iwona
2021-10-12 23:15               ` Winiarska, Iwona
2021-10-12 23:15               ` Winiarska, Iwona
2021-10-13  6:42               ` Borislav Petkov
2021-10-13  6:42                 ` Borislav Petkov
2021-10-13  6:42                 ` Borislav Petkov
2021-08-03 11:31 ` [PATCH v2 02/15] x86/cpu: Extract cpuid helpers to arch-independent Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-10-04 19:08   ` Borislav Petkov
2021-10-04 19:08     ` Borislav Petkov
2021-10-04 19:08     ` Borislav Petkov
2021-10-11 19:32     ` Winiarska, Iwona
2021-10-11 19:32       ` Winiarska, Iwona
2021-10-11 19:32       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 03/15] dt-bindings: Add generic bindings for PECI Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-11 18:11   ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-03 11:31 ` [PATCH v2 04/15] dt-bindings: Add bindings for peci-aspeed Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-11 18:11   ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-03 11:31 ` [PATCH v2 05/15] ARM: dts: aspeed: Add PECI controller nodes Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 06/15] peci: Add core infrastructure Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-25 22:58   ` Dan Williams
2021-08-25 22:58     ` Dan Williams
2021-08-25 22:58     ` Dan Williams
2021-08-26 22:40     ` Winiarska, Iwona
2021-08-26 22:40       ` Winiarska, Iwona
2021-08-26 22:40       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 07/15] peci: Add peci-aspeed controller driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-26  1:35   ` Dan Williams
2021-08-26  1:35     ` Dan Williams
2021-08-26  1:35     ` Dan Williams
2021-08-26 23:54     ` Winiarska, Iwona
2021-08-26 23:54       ` Winiarska, Iwona
2021-08-26 23:54       ` Winiarska, Iwona
2021-08-27 16:24       ` Dan Williams
2021-08-27 16:24         ` Dan Williams
2021-08-27 16:24         ` Dan Williams
2021-08-29 19:42         ` Winiarska, Iwona
2021-08-29 19:42           ` Winiarska, Iwona
2021-08-29 19:42           ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 08/15] peci: Add device detection Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-27 19:01   ` Dan Williams
2021-08-27 19:01     ` Dan Williams
2021-08-27 19:01     ` Dan Williams
2021-11-15 22:18     ` Winiarska, Iwona [this message]
2021-11-15 22:18       ` Winiarska, Iwona
2021-11-15 22:18       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 09/15] peci: Add sysfs interface for PECI bus Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-27 19:11   ` Dan Williams
2021-08-27 19:11     ` Dan Williams
2021-08-27 19:11     ` Dan Williams
2021-11-15 22:19     ` Winiarska, Iwona
2021-11-15 22:19       ` Winiarska, Iwona
2021-11-15 22:19       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 10/15] peci: Add support for PECI device drivers Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-27 21:19   ` Dan Williams
2021-08-27 21:19     ` Dan Williams
2021-08-27 21:19     ` Dan Williams
2021-11-15 22:20     ` Winiarska, Iwona
2021-11-15 22:20       ` Winiarska, Iwona
2021-11-15 22:20       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 11/15] peci: Add peci-cpu driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 12/15] hwmon: peci: Add cputemp driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 15:24   ` Guenter Roeck
2021-08-03 15:24     ` Guenter Roeck
2021-08-03 15:24     ` Guenter Roeck
2021-08-04 10:43     ` Winiarska, Iwona
2021-08-04 10:43       ` Winiarska, Iwona
2021-08-04 10:43       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 13/15] hwmon: peci: Add dimmtemp driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 15:39   ` Guenter Roeck
2021-08-03 15:39     ` Guenter Roeck
2021-08-03 15:39     ` Guenter Roeck
2021-08-04 10:46     ` Winiarska, Iwona
2021-08-04 10:46       ` Winiarska, Iwona
2021-08-04 10:46       ` Winiarska, Iwona
2021-08-04 17:33       ` Guenter Roeck
2021-08-04 17:33         ` Guenter Roeck
2021-08-04 17:33         ` Guenter Roeck
2021-08-05 21:48         ` Winiarska, Iwona
2021-08-05 21:48           ` Winiarska, Iwona
2021-08-05 21:48           ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 14/15] docs: hwmon: Document PECI drivers Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 15/15] docs: Add PECI documentation Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-05 12:17 ` [PATCH v2 00/15] Introduce PECI subsystem Greg Kroah-Hartman
2021-08-05 12:17   ` Greg Kroah-Hartman
2021-08-05 12:17   ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=b664e784f2b14ac75693af0982fdcb1af89ef583.camel@intel.com \
    --to=iwona.winiarska@intel.com \
    --cc=andrew@aj.id.au \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=corbet@lwn.net \
    --cc=d.mueller@elsoft.ch \
    --cc=dan.j.williams@intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jae.hyun.yoo@linux.intel.com \
    --cc=jdelvare@suse.com \
    --cc=joel@jms.id.au \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=luto@kernel.org \
    --cc=mchehab@kernel.org \
    --cc=mingo@redhat.com \
    --cc=olof@lixom.net \
    --cc=openbmc@lists.ozlabs.org \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=rdunlap@infradead.org \
    --cc=robh+dt@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    --cc=yazen.ghannam@amd.com \
    --cc=zweiss@equinix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.