From: Kuppuswamy Sathyanarayanan <[email protected]>

Hi All,

Currently intel_pmc_ipc.c, intel_punit_ipc.c, intel_scu_ipc.c drivers 
implements the same IPC features.
This code duplication could be avoided if we implement the IPC driver as a 
single library and let custom
device drivers use API provided by generic driver. This patchset mainly 
addresses this issue.

For now, Since we don't have any good test platform for SCU, I am not planning 
to modify intel_scu_ipc.c.

This patch-set addresses following issues(except #4) in intel_pmc_ipc and 
intel_punit_ipc drivers.

1. Intel_pmc_ipc.c driver does not use any resource managed(devm_*) calls.
2. In Intel_pmc_ipc.c driver, dependent devices like PUNIT, Telemetry and iTCO 
are created manually and uses lot of redundant buffer code.
3. Code duplication related to IPC helper functions in both PMC and PUNIT IPC 
drivers.
4. Global variable is used to store the IPC device structure and it is used 
across all functions in intel_pmc_ipc.c and intel_punit_ipc.c.

Patch #1, #2 fixes the issue #1.

Patch #3 fixes the issue #2.

Patch #4, #5, #6 fixes the issue #3.

To fix issue #4 we might need to make changes to drivers that use IPC APIs. So 
I am not sure whether its worth the effort. Maintainers, let me know your 
inputs.

If we have to address it, then we might need to adapt to model similar to 
extcon framework.

ipc_dev = intel_ipc_get_dev("intel_pmc_ipc");

PMC IPC call would look like,

intel_pmc_ipc_command(ipc_dev, cmd, sub, in, inlen, out, outlen)

More info on adapted solution (for issue #1):
----------------------------------------------

A generic Intel IPC class driver has been implemented and all common IPC helper 
functions has been moved to this driver. It exposes APIs to create IPC device 
channel, send raw IPC comman and simple IPC commands. It also creates device 
attribute to send IPC command from user space.

API for creating a new IPC channel device is,

struct intel_ipc_dev *devm_intel_ipc_dev_create(struct device *dev, const char 
*devname, struct intel_ipc_dev_cfg *cfg, struct intel_ipc_dev_ops *ops)

The IPC channel drivers (PUNIT/PMC/SCU) when creating a new device can 
configure their device params like register mapping, irq, irq-mode, channel 
type, etc  using intel_ipc_dev_cfg and intel_ipc_dev_ops arguments. After a new 
IPC channel device is created, we can use the APIs provided by generic IPC 
device driver to implement the custom channel specific APIs.

For example, after using this new model, PMC ipc comand send routine will look 
like,

int intel_pmc_ipc_command(u32 cmd, u32 sub, u8 *in, u32 inlen, u32 *out, u32 
outlen)
{
    // this function is implemented in generic Intel IPC class driver.
    return ipc_dev_raw_cmd(ipcdev.pmc_ipc_dev, f(cmd, sub), in, inlen, out, 
outlen, 0, 0);
}

I am still testing the driver in different products. But posted it to get some 
early comments. I also welcome any PMC/PUNIT driver users to check these 
patches in their product.



Kuppuswamy Sathyanarayanan (6):
  platform/x86: intel_pmc_ipc: Fix error handling in ipc_pci_probe()
  platform/x86: intel_pmc_ipc: Use devm_* calls in driver probe
  platform/x86: intel_pmc_ipc: Use MFD framework to create dependent
    devices
  platform: x86: Add generic Intel IPC driver
  platform/x86: intel_punit_ipc: Use generic intel ipc device calls
  platform/x86: intel_pmc_ipc: Use generic Intel IPC device calls

 arch/x86/include/asm/intel_ipc_dev.h   | 148 +++++++
 drivers/platform/x86/Kconfig           |   8 +
 drivers/platform/x86/Makefile          |   1 +
 drivers/platform/x86/intel_ipc_dev.c   | 433 ++++++++++++++++++++
 drivers/platform/x86/intel_pmc_ipc.c   | 715 ++++++++++++---------------------
 drivers/platform/x86/intel_punit_ipc.c | 234 ++++-------
 6 files changed, 930 insertions(+), 609 deletions(-)
 create mode 100644 arch/x86/include/asm/intel_ipc_dev.h
 create mode 100644 drivers/platform/x86/intel_ipc_dev.c

-- 
2.7.4

Reply via email to