On Tue, Aug 1, 2017 at 9:13 PM,
<sathyanarayanan.kuppusw...@linux.intel.com> wrote:
> From: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppusw...@linux.intel.com>
>
> 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.
>

Thanks for doing it, really appreciated!
I'm on vacation for few days now, I will definitely check this after.

> 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
>



-- 
With Best Regards,
Andy Shevchenko

Reply via email to