mbox series

[v7,0/7] Exynos DRM: rewrite IPP subsystem and userspace API

Message ID 20180509085928.2023-1-m.szyprowski@samsung.com
Headers show
Series Exynos DRM: rewrite IPP subsystem and userspace API | expand

Message

Marek Szyprowski May 9, 2018, 8:59 a.m. UTC
Dear all,

This patchset performs complete rewrite of Exynos DRM IPP subsystem and
its userspace API. Original, obsoleted Exynos DRM IPP (v1) framework and
API has been already removed by commit 8ded59413ccc ("drm/exynos: ipp:
Remove Exynos DRM IPP subsystem"). Rationale for that step has been
provided in the mentioned patch commit message. Basically that API was
broken by design, useless, and without any real users in userspace.

However the hardware capability to perform memory-to-memory image
processing is still very needed feature for Exynos DRM clients, so
a replacement API - IPP v2 has been designed. V2 IPP userspace API is
based on stateless approach, which much better fits to memory-to-memory
image processing model. It also provides support for all image formats,
which are both already defined in DRM API and supported by the existing
IPP hardware modules. The new code of the IPP driver core and device
drivers are significantly smaller and easier to understand. Also a new
driver for Exynos Scaler hardware module available in Exynos5420 and
newer SoCs has been added on top of the provided changes.

Patches were tested on Exynos4412 based Odroid U3, Exynos5422
Odroid XU3 and Exynos5433 TM2 boards, on top of Linux next-20180501 kernel.

A simple userspace test tool has been sent together with v1 of this
patchset:
https://www.spinics.net/lists/linux-samsung-soc/msg60498.html

Tobias Jakobi has added support for this new API to his fork of libdrm and
mpv video player:
https://github.com/tobiasjakobi/libdrm/tree/ippv2
https://github.com/tobiasjakobi/mpv

Support for the Exynos DRM IPP v2 API has been also added to Tizen project
(to its graphics middleware library for Exynos SoC platform, libtdm-exynos)
where it finally got extensive tests and provided its usefulness on
Exynos-based devices (Odroid XU3/XU4 and TM2):

https://git.tizen.org/cgit/platform/adaptation/samsung_exynos/libtdm-exynos/log/?h=tizen&qt=grep&q=ipp
https://git.tizen.org/cgit/platform/adaptation/samsung_exynos/libtdm-exynos/commit/?h=tizen&id=b59be207365d10efd489e6f71c8a045b558c44fe
https://git.tizen.org/cgit/platform/kernel/linux-exynos/log/?h=tizen&qt=grep&q=ipp

Best regards
Marek Szyprowski
Samsung R&D Institute Poland


Changelog:

v7:
- rebased onto linux next-20180501
- dropped Exynos DRM IPPv1 removal patch, which has been merged separately as
  commit 8ded59413ccc ("drm/exynos: ipp: Remove Exynos DRM IPP subsystem")
- bumped Exynos DRM driver version to v1.1 to let userspace easily notice that
  new API is available
- fixed some corner cases of operation in 90/270 rotation modes
- restored tiled formats support in Exynos FIMC IPP driver
- relaxed some limits for Exynos5433 GScaler driver, as hardware seems to work
  fine with such values

v6:
- fixed most checkpatch.pl warnings, only some debug messages exceeds 80
  characters line boundary to avoid breaking strings

v5: https://www.spinics.net/lists/linux-samsung-soc/msg61171.html
- fixed and reworked items pointed by Inki Dae:
  * formats and limits arrays are no longer NULL terminated, all functions
    accessing them require explicit array size argument
  * fixed return value for functions in GScaler, FIMC and Rotator drivers
  * simplified exynos_drm_ipp_task_set() function (removed temporary
    buffer)
  * reworked FIMC driver sharing with V4L2 subsystem, now user can specify
    mask of devices assigned to DRM driver (defaults to fimc.2 and fimc.3)
  * removed drivers specific task check (not used anymore)
- fixed issue pointed by Arnd Bergmann and Tobias Jakobi:
  * removed usage of timeval structures
- removed more dead-code from GScaler and FIMC drivers
- fixed IOMMU page fault caused by FIMC operation in 90 degree rotation
  mode
- added Ack from Rob Herring for Scaler driver
- generated patches with -B/40% to make Rotator, GScaler and FIMC patches
  easier to read (forced complete rewrite)

v4: https://www.spinics.net/lists/linux-samsung-soc/msg61066.html
- fixed Exynos GSC limits (alignment) and operation in 90 degree rotation
  mode
- fixed some style issues in Scaler driver (thanks to Andrzej)
- fixed copy/paste typos in commit messages
- improved debug messages, especially if provided parameters exceeds
  hardwave limits

v3: https://www.spinics.net/lists/linux-samsung-soc/msg60981.html
- fixed minor issues and added features pointed by other developers:
  * fixed missing ipp_unregister (Hoegeun)
  * added missing limits to FIMC and GSC driver (Hoegeun)
  * added more specific compatible strings to GSC driver (Hoegeun)
  * added Exynos5433 support to GSC driver (Hoegeun)
  * added autosuspend runtime PM to all IPP drivers (Tobias)
- added Exynos5433 support to Scaler driver (thanks to Andrzej)
- dropped Exynos5420 clk patch, which has been alredy merged

v2: https://www.spinics.net/lists/dri-devel/msg153418.html
- fixed minor issues pointed by other developers:
  * fixed possible null pointer dereferrence (Tobias)
  * changed limits_size to limits_count (Tobias)
  * renamed struct exynos_drm_ipp_format to drm_exynos_ipp_format (Andrzej)
  * added proper return value from exynos_drm_ipp_get_res_ioctl when no IPP
    driver is present (Andrzej)
  * properly aligned all uapi structures to be 32/64 bit safe (Emil)
  * properly initialize all strucutres
- added new Exynos Scaler driver from Andrzej Pietrasiewicz

v1: https://www.spinics.net/lists/linux-samsung-soc/msg60492.html
- initial version of IPP v2

My previous works in this area:

"[RFC v2 0/2] Exynos DRM: add Picture Processor extension"
https://www.spinics.net/lists/dri-devel/msg140669.html
- removed usage of DRM objects and properties - replaced them with simple
  list of parameters with predefined IDs

"[RFC 0/4] Exynos DRM: add Picture Processor extension"
https://www.spinics.net/lists/linux-samsung-soc/msg59323.html
- moved this feature from DRM core to Exynos DRM driver
- changed name from framebuffer processor to picture processor
- simplified code to cover only things needed by Exynos drivers
- implemented simple fifo task scheduler
- cleaned up rotator driver conversion (removed IPP remainings)

"[RFC 0/2] New feature: Framebuffer processors"
https://www.spinics.net/lists/linux-samsung-soc/msg54810.html
- generic approach implemented in DRM core, rejected


Patch summary:

Andrzej Pietrasiewicz (3):
  drm/exynos: Add driver for Exynos Scaler module
  ARM: dts: exynos: Add mem-2-mem Scaler devices
  ARM64: dts: exynos: Add mem-2-mem Scaler devices

Marek Szyprowski (4):
  drm/exynos: ipp: Add IPP v2 framework
  drm/exynos: rotator: Convert driver to IPP v2 core API
  drm/exynos: gsc: Convert driver to IPP v2 core API
  drm/exynos: fimc: Convert driver to IPP v2 core API

 .../bindings/gpu/samsung-scaler.txt           |   27 +
 arch/arm/boot/dts/exynos5420.dtsi             |   36 +
 arch/arm64/boot/dts/exynos/exynos5433.dtsi    |   46 +
 drivers/gpu/drm/exynos/Kconfig                |   16 +-
 drivers/gpu/drm/exynos/Makefile               |    2 +
 drivers/gpu/drm/exynos/exynos_drm_drv.c       |   35 +-
 drivers/gpu/drm/exynos/exynos_drm_drv.h       |   10 +
 drivers/gpu/drm/exynos/exynos_drm_fimc.c      | 3214 ++++++++---------
 drivers/gpu/drm/exynos/exynos_drm_fimc.h      |   23 -
 drivers/gpu/drm/exynos/exynos_drm_gsc.c       | 3201 +++++++---------
 drivers/gpu/drm/exynos/exynos_drm_gsc.h       |   24 -
 drivers/gpu/drm/exynos/exynos_drm_ipp.c       |  916 +++++
 drivers/gpu/drm/exynos/exynos_drm_ipp.h       |  175 +
 drivers/gpu/drm/exynos/exynos_drm_rotator.c   | 1274 +++----
 drivers/gpu/drm/exynos/exynos_drm_scaler.c    |  694 ++++
 drivers/gpu/drm/exynos/regs-scaler.h          |  426 +++
 include/uapi/drm/exynos_drm.h                 |  240 ++
 17 files changed, 5877 insertions(+), 4482 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/gpu/samsung-scaler.txt
 rewrite drivers/gpu/drm/exynos/exynos_drm_fimc.c (47%)
 delete mode 100644 drivers/gpu/drm/exynos/exynos_drm_fimc.h
 rewrite drivers/gpu/drm/exynos/exynos_drm_gsc.c (44%)
 delete mode 100644 drivers/gpu/drm/exynos/exynos_drm_gsc.h
 create mode 100644 drivers/gpu/drm/exynos/exynos_drm_ipp.c
 create mode 100644 drivers/gpu/drm/exynos/exynos_drm_ipp.h
 rewrite drivers/gpu/drm/exynos/exynos_drm_rotator.c (72%)
 create mode 100644 drivers/gpu/drm/exynos/exynos_drm_scaler.c
 create mode 100644 drivers/gpu/drm/exynos/regs-scaler.h