linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
	Darren Hart <dvhart@infradead.org>,
	Lee Jones <lee.jones@linaro.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
	"H . Peter Anvin" <hpa@zytor.com>,
	x86@kernel.org, Zha Qipeng <qipeng.zha@intel.com>,
	"David E . Box" <david.e.box@linux.intel.com>,
	Guenter Roeck <linux@roeck-us.net>,
	Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	Wim Van Sebroeck <wim@linux-watchdog.org>,
	Mark Brown <broonie@kernel.org>,
	platform-driver-x86@vger.kernel.org,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH v4 12/38] platform/x86: intel_scu_ipc: Split out SCU IPC functionality from the SCU driver
Date: Wed, 22 Jan 2020 16:35:36 +0200	[thread overview]
Message-ID: <20200122143536.GT2665@lahna.fi.intel.com> (raw)
In-Reply-To: <20200122134026.GC4963@kroah.com>

On Wed, Jan 22, 2020 at 02:40:26PM +0100, Greg Kroah-Hartman wrote:
> On Tue, Jan 21, 2020 at 07:00:48PM +0300, Mika Westerberg wrote:
> > The SCU IPC functionality is usable outside of Intel MID devices. For
> > example modern Intel CPUs include the same thing but now it is called
> > PMC (Power Management Controller) instead of SCU. To make the IPC
> > available for those split the driver into library part (intel_scu_ipc.c)
> > and the SCU PCI driver part (intel_scu_pcidrv.c) which then calls the
> > former before it goes and creates rest of the SCU devices.
> > 
> > We also split the Kconfig symbols so that INTEL_SCU_IPC enables the SCU
> > IPC library and INTEL_SCU_PCI the SCU driver and convert the users
> > accordingly. While there remove default y from the INTEL_SCU_PCI symbol
> > as it is already selected by X86_INTEL_MID.
> > 
> > Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com>
> > Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> > ---
> >  arch/x86/Kconfig                        |  2 +-
> >  arch/x86/include/asm/intel_scu_ipc.h    | 16 +++++
> >  drivers/mfd/Kconfig                     |  4 +-
> >  drivers/platform/x86/Kconfig            | 26 ++++---
> >  drivers/platform/x86/Makefile           |  1 +
> >  drivers/platform/x86/intel_scu_ipc.c    | 90 ++++++++++++-------------
> >  drivers/platform/x86/intel_scu_pcidrv.c | 54 +++++++++++++++
> >  7 files changed, 135 insertions(+), 58 deletions(-)
> >  create mode 100644 drivers/platform/x86/intel_scu_pcidrv.c
> > 
> > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
> > index 5e8949953660..aca17d1583c4 100644
> > --- a/arch/x86/Kconfig
> > +++ b/arch/x86/Kconfig
> > @@ -594,7 +594,7 @@ config X86_INTEL_MID
> >  	select I2C
> >  	select DW_APB_TIMER
> >  	select APB_TIMER
> > -	select INTEL_SCU_IPC
> > +	select INTEL_SCU_PCI
> >  	select MFD_INTEL_MSIC
> >  	---help---
> >  	  Select to build a kernel capable of supporting Intel MID (Mobile
> > diff --git a/arch/x86/include/asm/intel_scu_ipc.h b/arch/x86/include/asm/intel_scu_ipc.h
> > index 2a1442ba6e78..252ea0046f16 100644
> > --- a/arch/x86/include/asm/intel_scu_ipc.h
> > +++ b/arch/x86/include/asm/intel_scu_ipc.h
> > @@ -2,6 +2,7 @@
> >  #ifndef _ASM_X86_INTEL_SCU_IPC_H_
> >  #define  _ASM_X86_INTEL_SCU_IPC_H_
> >  
> > +#include <linux/ioport.h>
> >  #include <linux/notifier.h>
> >  
> >  #define IPCMSG_INDIRECT_READ	0x02
> > @@ -19,6 +20,21 @@
> >  	#define IPC_CMD_VRTC_SETTIME      1 /* Set time */
> >  	#define IPC_CMD_VRTC_SETALARM     2 /* Set alarm */
> >  
> > +struct device;
> > +
> > +/**
> > + * struct intel_scu_ipc_pdata - Platform data for SCU IPC
> > + * @mem: Base address of SCU IPC MMIO registers
> > + * @irq: The IRQ number used for SCU (optional)
> > + */
> > +struct intel_scu_ipc_pdata {
> > +	struct resource mem;
> > +	int irq;
> > +};
> > +
> > +int intel_scu_ipc_register(struct device *dev,
> > +			   const struct intel_scu_ipc_pdata *pdata);
> > +
> >  /* Read single register */
> >  int intel_scu_ipc_ioread8(u16 addr, u8 *data);
> >  
> > diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
> > index 420900852166..59515142438e 100644
> > --- a/drivers/mfd/Kconfig
> > +++ b/drivers/mfd/Kconfig
> > @@ -593,7 +593,7 @@ config INTEL_SOC_PMIC_MRFLD
> >  	tristate "Support for Intel Merrifield Basin Cove PMIC"
> >  	depends on GPIOLIB
> >  	depends on ACPI
> > -	depends on INTEL_SCU_IPC
> > +	depends on INTEL_SCU
> >  	select MFD_CORE
> >  	select REGMAP_IRQ
> >  	help
> > @@ -625,7 +625,7 @@ config MFD_INTEL_LPSS_PCI
> >  
> >  config MFD_INTEL_MSIC
> >  	bool "Intel MSIC"
> > -	depends on INTEL_SCU_IPC
> > +	depends on INTEL_SCU
> >  	select MFD_CORE
> >  	help
> >  	  Select this option to enable access to Intel MSIC (Avatele
> > diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
> > index dd4326736d11..50deff627b46 100644
> > --- a/drivers/platform/x86/Kconfig
> > +++ b/drivers/platform/x86/Kconfig
> > @@ -986,25 +986,33 @@ config INTEL_VBTN
> >  	  be called intel_vbtn.
> >  
> >  config INTEL_SCU_IPC
> > -	bool "Intel SCU IPC Support"
> > +	bool
> > +
> > +config INTEL_SCU
> > +	bool
> > +	select INTEL_SCU_IPC
> > +
> > +config INTEL_SCU_PCI
> > +	bool "Intel SCU PCI driver"
> >  	depends on X86_INTEL_MID
> > -	default y
> > -	---help---
> > -	  IPC is used to bridge the communications between kernel and SCU on
> > -	  some embedded Intel x86 platforms. This is not needed for PC-type
> > -	  machines.
> > +	select INTEL_SCU
> > +	help
> > +	  This driver is used to bridge the communications between kernel
> > +	  and SCU on some embedded Intel x86 platforms. It also creates
> > +	  devices that are connected to the SoC through the SCU. This is
> > +	  not needed for PC-type machines.
> >  
> >  config INTEL_SCU_IPC_UTIL
> >  	tristate "Intel SCU IPC utility driver"
> > -	depends on INTEL_SCU_IPC
> > -	---help---
> > +	depends on INTEL_SCU
> > +	help
> >  	  The IPC Util driver provides an interface with the SCU enabling
> >  	  low level access for debug work and updating the firmware. Say
> >  	  N unless you will be doing this on an Intel MID platform.
> >  
> >  config INTEL_MID_POWER_BUTTON
> >  	tristate "power button driver for Intel MID platforms"
> > -	depends on INTEL_SCU_IPC && INPUT
> > +	depends on INTEL_SCU && INPUT
> >  	help
> >  	  This driver handles the power button on the Intel MID platforms.
> >  
> > diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
> > index 42d85a00be4e..c7a42feaa521 100644
> > --- a/drivers/platform/x86/Makefile
> > +++ b/drivers/platform/x86/Makefile
> > @@ -68,6 +68,7 @@ intel_cht_int33fe-objs		:= intel_cht_int33fe_common.o \
> >  obj-$(CONFIG_INTEL_INT0002_VGPIO) += intel_int0002_vgpio.o
> >  obj-$(CONFIG_INTEL_HID_EVENT)	+= intel-hid.o
> >  obj-$(CONFIG_INTEL_VBTN)	+= intel-vbtn.o
> > +obj-$(CONFIG_INTEL_SCU_PCI)	+= intel_scu_pcidrv.o
> >  obj-$(CONFIG_INTEL_SCU_IPC)	+= intel_scu_ipc.o
> >  obj-$(CONFIG_INTEL_SCU_IPC_UTIL) += intel_scu_ipcutil.o
> >  obj-$(CONFIG_INTEL_MFLD_THERMAL) += intel_mid_thermal.o
> > diff --git a/drivers/platform/x86/intel_scu_ipc.c b/drivers/platform/x86/intel_scu_ipc.c
> > index 93a810fa6c8a..a5ca1aae9547 100644
> > --- a/drivers/platform/x86/intel_scu_ipc.c
> > +++ b/drivers/platform/x86/intel_scu_ipc.c
> > @@ -18,11 +18,8 @@
> >  #include <linux/errno.h>
> >  #include <linux/init.h>
> >  #include <linux/interrupt.h>
> > -#include <linux/pci.h>
> > -#include <linux/pm.h>
> > -#include <linux/sfi.h>
> > +#include <linux/io.h>
> >  
> > -#include <asm/intel-mid.h>
> >  #include <asm/intel_scu_ipc.h>
> >  
> >  /* IPC defines the following message types */
> > @@ -56,9 +53,10 @@
> >  
> >  struct intel_scu_ipc_dev {
> >  	struct device *dev;
> > +	struct resource mem;
> > +	int irq;
> >  	void __iomem *ipc_base;
> >  	struct completion cmd_complete;
> > -	u8 irq_mode;
> >  };
> >  
> >  static struct intel_scu_ipc_dev  ipcdev; /* Only one for now */
> > @@ -166,7 +164,7 @@ static inline int ipc_wait_for_interrupt(struct intel_scu_ipc_dev *scu)
> >  
> >  static int intel_scu_ipc_check_status(struct intel_scu_ipc_dev *scu)
> >  {
> > -	return scu->irq_mode ? ipc_wait_for_interrupt(scu) : busy_loop(scu);
> > +	return scu->irq > 0 ? ipc_wait_for_interrupt(scu) : busy_loop(scu);
> >  }
> >  
> >  /* Read/Write power control(PMIC in Langwell, MSIC in PenWell) registers */
> > @@ -402,60 +400,60 @@ static irqreturn_t ioc(int irq, void *dev_id)
> >  }
> >  
> >  /**
> > - *	ipc_probe	-	probe an Intel SCU IPC
> > - *	@pdev: the PCI device matching
> > - *	@id: entry in the match table
> > + * intel_scu_ipc_register() - Register SCU IPC mechanism
> > + * @dev: SCU device
> > + * @pdata: Platform specific data
> >   *
> > - *	Enable and install an intel SCU IPC. This appears in the PCI space
> > - *	but uses some hard coded addresses as well.
> > + * Call this function to initialize SCU IPC mechanism for @dev.
> >   */
> > -static int ipc_probe(struct pci_dev *pdev, const struct pci_device_id *id)
> > +int intel_scu_ipc_register(struct device *dev,
> > +			   const struct intel_scu_ipc_pdata *pdata)
> >  {
> 
> How do you "know" that dev really is a SCU device?

Well this expects the caller to know that.

> If you are "registering" something, shouldn't you have set it up
> properly?  You are saying that any random struct device has these
> attributes.  Now that's fine as you "know" this, but usually you would
> create a child device that really is a SCU functionality, i.e. a class
> device.
> 
> So how about making the SCU stuff a class as that is what is then made a
> child of the struct device as it is how it talks to this class of
> devices, right?

That's a good idea. I'll look into this.

> As it is, this "register" really feels odd to me in the scheme of how
> the whole driver model works.
> 
> Not to mention I didn't see any reference counting increment happening
> here, as you are passing a pointer that is then saved off, right?

Right.

> >  	int err;
> >  	struct intel_scu_ipc_dev *scu = &ipcdev;
> >  
> > -	if (scu->dev)		/* We support only one SCU */
> > -		return -EBUSY;
> > +	mutex_lock(&ipclock);
> > +	/* We support only one IPC */
> > +	if (scu->dev) {
> > +		err = -EBUSY;
> > +		goto err_unlock;
> > +	}
> >  
> > -	err = pcim_enable_device(pdev);
> > -	if (err)
> > -		return err;
> > +	if (!request_mem_region(pdata->mem.start, resource_size(&pdata->mem),
> > +				"intel_scu_ipc")) {
> > +		err = -EBUSY;
> > +		goto err_unlock;
> > +	}
> >  
> > -	err = pcim_iomap_regions(pdev, 1 << 0, pci_name(pdev));
> > -	if (err)
> > -		return err;
> > +	scu->ipc_base = ioremap(pdata->mem.start, resource_size(&pdata->mem));
> > +	if (!scu->ipc_base) {
> > +		err = -ENOMEM;
> > +		goto err_release;
> > +	}
> >  
> > +	scu->mem = pdata->mem;
> > +	scu->irq = pdata->irq;
> >  	init_completion(&scu->cmd_complete);
> >  
> > -	scu->ipc_base = pcim_iomap_table(pdev)[0];
> > -
> > -	err = devm_request_irq(&pdev->dev, pdev->irq, ioc, 0, "intel_scu_ipc",
> > -			       scu);
> > -	if (err)
> > -		return err;
> > +	if (scu->irq > 0) {
> > +		err = request_irq(scu->irq, ioc, 0, "intel_scu_ipc", scu);
> > +		if (err)
> > +			goto err_unmap;
> > +	}
> >  
> >  	/* Assign device at last */
> > -	scu->dev = &pdev->dev;
> > -
> > -	intel_scu_devices_create();
> > +	scu->dev = dev;
> 
> Look ma, a reference count mess!
> 
> Ick.
> 
> Please make this a class.

I will, thanks!

  reply	other threads:[~2020-01-22 14:35 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-21 16:00 [PATCH v4 00/38] platform/x86: Rework intel_scu_ipc and intel_pmc_ipc drivers Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 01/38] platform/x86: intel_mid_powerbtn: Take a copy of ddata Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 02/38] platform/x86: intel_scu_ipcutil: Remove default y from Kconfig Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 03/38] platform/x86: intel_scu_ipc: Add constants for register offsets Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 04/38] platform/x86: intel_scu_ipc: Remove Lincroft support Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 05/38] platform/x86: intel_scu_ipc: Drop intel_scu_ipc_i2c_cntrl() Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 06/38] platform/x86: intel_scu_ipc: Fix interrupt support Mika Westerberg
2020-01-22 13:34   ` Greg Kroah-Hartman
2020-01-22 14:30     ` Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 07/38] platform/x86: intel_scu_ipc: Sleeping is fine when polling Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 08/38] platform/x86: intel_scu_ipc: Drop unused prototype intel_scu_ipc_fw_update() Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 09/38] platform/x86: intel_scu_ipc: Drop unused macros Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 10/38] platform/x86: intel_scu_ipc: Drop intel_scu_ipc_io[read|write][8|16]() Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 11/38] platform/x86: intel_scu_ipc: Drop intel_scu_ipc_raw_command() Mika Westerberg
2020-01-22 13:36   ` Greg Kroah-Hartman
2020-01-22 14:33     ` Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 12/38] platform/x86: intel_scu_ipc: Split out SCU IPC functionality from the SCU driver Mika Westerberg
2020-01-22 13:40   ` Greg Kroah-Hartman
2020-01-22 14:35     ` Mika Westerberg [this message]
2020-01-21 16:00 ` [PATCH v4 13/38] platform/x86: intel_scu_ipc: Reformat kernel-doc comments of exported functions Mika Westerberg
2020-01-22 13:40   ` Greg Kroah-Hartman
2020-01-22 14:36     ` Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 14/38] platform/x86: intel_scu_ipc: Introduce new SCU IPC API Mika Westerberg
2020-01-22 13:43   ` Greg Kroah-Hartman
2020-01-22 14:40     ` Mika Westerberg
2020-01-22 14:49       ` Greg Kroah-Hartman
2020-01-22 15:04         ` Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 15/38] platform/x86: intel_mid_powerbtn: Convert to use " Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 16/38] watchdog: intel-mid_wdt: " Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 17/38] platform/x86: intel_scu_ipcutil: " Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 18/38] platform/x86: intel_pmc_ipc: Make intel_pmc_gcr_update() static Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 19/38] platform/x86: intel_pmc_ipc: Make intel_pmc_ipc_simple_command() static Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 20/38] platform/x86: intel_pmc_ipc: Make intel_pmc_ipc_raw_cmd() static Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 21/38] platform/x86: intel_pmc_ipc: Drop intel_pmc_gcr_read() and intel_pmc_gcr_write() Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 22/38] platform/x86: intel_pmc_ipc: Drop ipc_data_readb() Mika Westerberg
2020-01-21 16:00 ` [PATCH v4 23/38] platform/x86: intel_pmc_ipc: Get rid of unnecessary includes Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 24/38] platform/x86: intel_scu_ipc: Add managed function to register SCU IPC Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 25/38] platform/x86: intel_pmc_ipc: Start using " Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 26/38] mfd: intel_soc_pmic: Add SCU IPC member to struct intel_soc_pmic Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 27/38] mfd: intel_soc_pmic_bxtwc: Convert to use new SCU IPC API Mika Westerberg
2020-01-22 13:46   ` Greg Kroah-Hartman
2020-01-22 14:41     ` Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 28/38] mfd: intel_soc_pmic_mrfld: " Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 29/38] platform/x86: intel_telemetry: " Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 30/38] platform/x86: intel_pmc_ipc: Drop intel_pmc_ipc_command() Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 31/38] x86/platform/intel-mid: Add empty stubs for intel_scu_devices_[create|destroy]() Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 32/38] platform/x86: intel_pmc_ipc: Move PCI IDs to intel_scu_pcidrv.c Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 33/38] platform/x86: intel_pmc_ipc: Use octal permissions in sysfs attributes Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 34/38] platform/x86: intel_pmc_ipc: Propagate error from kstrtoul() Mika Westerberg
2020-01-21 17:51   ` Andy Shevchenko
2020-01-21 16:01 ` [PATCH v4 35/38] platform/x86: intel_pmc_ipc: Switch to use driver->dev_groups Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 36/38] platform/x86: intel_telemetry: Add telemetry_get_pltdata() Mika Westerberg
2020-01-21 18:00   ` Andy Shevchenko
2020-01-21 16:01 ` [PATCH v4 37/38] platform/x86: intel_pmc_ipc: Convert to MFD Mika Westerberg
2020-01-21 18:26   ` Andy Shevchenko
2020-01-22 10:55     ` Mika Westerberg
2020-01-22 12:34   ` Lee Jones
2020-01-22 12:53     ` Mika Westerberg
2020-01-22 13:27       ` Lee Jones
2020-01-22 14:45         ` Mika Westerberg
2020-01-23  8:01           ` Lee Jones
2020-01-23  8:56             ` Mika Westerberg
2020-01-21 16:01 ` [PATCH v4 38/38] MAINTAINERS: Update entry for Intel Broxton PMC driver Mika Westerberg
2020-01-21 16:21 ` [PATCH v4 00/38] platform/x86: Rework intel_scu_ipc and intel_pmc_ipc drivers Mark Brown
2020-01-21 16:33   ` Mika Westerberg
2020-01-21 16:45     ` Mark Brown
2020-01-21 17:00       ` Mika Westerberg
2020-01-21 17:06         ` Mark Brown
2020-01-21 17:21           ` Mika Westerberg

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=20200122143536.GT2665@lahna.fi.intel.com \
    --to=mika.westerberg@linux.intel.com \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=bp@alien8.de \
    --cc=broonie@kernel.org \
    --cc=david.e.box@linux.intel.com \
    --cc=dvhart@infradead.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=hpa@zytor.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=mingo@redhat.com \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=qipeng.zha@intel.com \
    --cc=tglx@linutronix.de \
    --cc=wim@linux-watchdog.org \
    --cc=x86@kernel.org \
    /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 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).