[Mesa-dev] [PATCH] gallium: add etnaviv support for armada drm

Kyle Russell bkylerussell at gmail.com
Tue Jan 22 17:27:45 UTC 2019


Similar configuration to the iMX platform, but interfaces with
the armada-drm driver.

Signed-off-by: Kyle Russell <bkylerussell at gmail.com>
---
 configure.ac                                  | 12 +++++++++-
 meson.build                                   |  6 ++++-
 meson_options.txt                             |  2 +-
 src/gallium/Makefile.am                       |  4 ++++
 .../auxiliary/pipe-loader/pipe_loader_drm.c   |  5 ++++
 .../auxiliary/target-helpers/drm_helper.h     | 23 ++++++++++++++++++
 .../target-helpers/drm_helper_public.h        |  3 +++
 src/gallium/drivers/armada/Automake.inc       |  9 +++++++
 src/gallium/drivers/armada/Makefile.am        |  8 +++++++
 src/gallium/meson.build                       |  5 ++++
 src/gallium/targets/dri/Makefile.am           |  1 +
 src/gallium/targets/dri/meson.build           |  3 ++-
 src/gallium/targets/dri/target.c              |  1 +
 src/gallium/winsys/armada/drm/Makefile.am     | 11 +++++++++
 .../winsys/armada/drm/Makefile.sources        |  3 +++
 .../winsys/armada/drm/armada_drm_public.h     |  8 +++++++
 .../winsys/armada/drm/armada_drm_winsys.c     | 24 +++++++++++++++++++
 src/gallium/winsys/armada/drm/meson.build     | 14 +++++++++++
 18 files changed, 138 insertions(+), 4 deletions(-)
 create mode 100644 src/gallium/drivers/armada/Automake.inc
 create mode 100644 src/gallium/drivers/armada/Makefile.am
 create mode 100644 src/gallium/winsys/armada/drm/Makefile.am
 create mode 100644 src/gallium/winsys/armada/drm/Makefile.sources
 create mode 100644 src/gallium/winsys/armada/drm/armada_drm_public.h
 create mode 100644 src/gallium/winsys/armada/drm/armada_drm_winsys.c
 create mode 100644 src/gallium/winsys/armada/drm/meson.build

diff --git a/configure.ac b/configure.ac
index c7473d77eff..a6c3fa19852 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1408,7 +1408,7 @@ GALLIUM_DRIVERS_DEFAULT="r300,r600,svga,swrast"
 AC_ARG_WITH([gallium-drivers],
     [AS_HELP_STRING([--with-gallium-drivers@<:@=DIRS...@:>@],
         [comma delimited Gallium drivers list, e.g.
-        "i915,nouveau,r300,r600,radeonsi,freedreno,pl111,svga,swrast,swr,tegra,v3d,vc4,virgl,etnaviv,imx"
+        "i915,nouveau,r300,r600,radeonsi,freedreno,pl111,svga,swrast,swr,tegra,v3d,vc4,virgl,etnaviv,imx,armada"
         @<:@default=r300,r600,svga,swrast@:>@])],
     [with_gallium_drivers="$withval"],
     [with_gallium_drivers="$GALLIUM_DRIVERS_DEFAULT"])
@@ -2747,6 +2747,9 @@ if test -n "$with_gallium_drivers"; then
             HAVE_GALLIUM_TEGRA=yes
             require_libdrm "tegra"
             ;;
+        xarmada)
+            HAVE_GALLIUM_ARMADA=yes
+        ;;
         xswrast)
             HAVE_GALLIUM_SOFTPIPE=yes
             if test "x$enable_llvm" = xyes; then
@@ -2867,6 +2870,10 @@ if test "x$HAVE_GALLIUM_ETNAVIV" != xyes -a "x$HAVE_GALLIUM_IMX" = xyes  ; then
     AC_MSG_ERROR([Building with imx requires etnaviv])
 fi
 
+if test "x$HAVE_GALLIUM_ETNAVIV" != xyes -a "x$HAVE_GALLIUM_ARMADA" = xyes  ; then
+	AC_MSG_ERROR([Building with armada requires etnaviv])
+fi
+
 if test "x$HAVE_GALLIUM_VC4" != xyes -a "x$HAVE_GALLIUM_PL111" = xyes  ; then
     AC_MSG_ERROR([Building with pl111 requires vc4])
 fi
@@ -2973,6 +2980,7 @@ AM_CONDITIONAL(HAVE_GALLIUM_NOUVEAU, test "x$HAVE_GALLIUM_NOUVEAU" = xyes)
 AM_CONDITIONAL(HAVE_GALLIUM_FREEDRENO, test "x$HAVE_GALLIUM_FREEDRENO" = xyes)
 AM_CONDITIONAL(HAVE_GALLIUM_ETNAVIV, test "x$HAVE_GALLIUM_ETNAVIV" = xyes)
 AM_CONDITIONAL(HAVE_GALLIUM_IMX, test "x$HAVE_GALLIUM_IMX" = xyes)
+AM_CONDITIONAL(HAVE_GALLIUM_ARMADA, test "x$HAVE_GALLIUM_ARMADA" = xyes)
 AM_CONDITIONAL(HAVE_GALLIUM_TEGRA, test "x$HAVE_GALLIUM_TEGRA" = xyes)
 AM_CONDITIONAL(HAVE_GALLIUM_SOFTPIPE, test "x$HAVE_GALLIUM_SOFTPIPE" = xyes)
 AM_CONDITIONAL(HAVE_GALLIUM_LLVMPIPE, test "x$HAVE_GALLIUM_LLVMPIPE" = xyes)
@@ -3124,6 +3132,7 @@ AC_CONFIG_FILES([Makefile
                  src/gallium/drivers/swr/Makefile
                  src/gallium/drivers/tegra/Makefile
                  src/gallium/drivers/etnaviv/Makefile
+                 src/gallium/drivers/armada/Makefile
                  src/gallium/drivers/imx/Makefile
                  src/gallium/drivers/v3d/Makefile
                  src/gallium/drivers/vc4/Makefile
@@ -3159,6 +3168,7 @@ AC_CONFIG_FILES([Makefile
                  src/gallium/tests/trivial/Makefile
                  src/gallium/tests/unit/Makefile
                  src/gallium/winsys/etnaviv/drm/Makefile
+                 src/gallium/winsys/armada/drm/Makefile
                  src/gallium/winsys/imx/drm/Makefile
                  src/gallium/winsys/freedreno/drm/Makefile
                  src/gallium/winsys/i915/drm/Makefile
diff --git a/meson.build b/meson.build
index c5bc94720d6..6536a38e790 100644
--- a/meson.build
+++ b/meson.build
@@ -132,7 +132,7 @@ if _drivers.contains('auto')
     elif ['arm', 'aarch64'].contains(host_machine.cpu_family())
       _drivers = [
         'pl111', 'v3d', 'vc4', 'freedreno', 'etnaviv', 'imx', 'nouveau',
-        'tegra', 'virgl', 'swrast',
+        'armada', 'tegra', 'virgl', 'swrast',
       ]
     else
       error('Unknown architecture @0 at . Please pass -Dgallium-drivers to set driver options. Patches gladly accepted to fix this.'.format(
@@ -156,6 +156,7 @@ with_gallium_vc4 = _drivers.contains('vc4')
 with_gallium_v3d = _drivers.contains('v3d')
 with_gallium_etnaviv = _drivers.contains('etnaviv')
 with_gallium_imx = _drivers.contains('imx')
+with_gallium_armada = _drivers.contains('armada')
 with_gallium_tegra = _drivers.contains('tegra')
 with_gallium_i915 = _drivers.contains('i915')
 with_gallium_svga = _drivers.contains('svga')
@@ -205,6 +206,9 @@ endif
 if with_gallium_imx and not with_gallium_etnaviv
   error('IMX driver requires etnaviv driver')
 endif
+if with_gallium_armada and not with_gallium_etnaviv
+  error('Armada driver requires etnaviv driver')
+endif
 if with_gallium_pl111 and not with_gallium_vc4
   error('pl111 driver requires vc4 driver')
 endif
diff --git a/meson_options.txt b/meson_options.txt
index bfb06c4dd42..690cde4a05a 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -60,7 +60,7 @@ option(
   choices : [
     '', 'auto', 'pl111', 'radeonsi', 'r300', 'r600', 'nouveau', 'freedreno',
     'swrast', 'v3d', 'vc4', 'etnaviv', 'imx', 'tegra', 'i915', 'svga', 'virgl',
-    'swr',
+    'swr', 'armada',
   ],
   description : 'List of gallium drivers to build. If this is set to auto all drivers applicable to the target OS/architecture will be built'
 )
diff --git a/src/gallium/Makefile.am b/src/gallium/Makefile.am
index e75c1866832..1db9f40bf9f 100644
--- a/src/gallium/Makefile.am
+++ b/src/gallium/Makefile.am
@@ -56,6 +56,10 @@ if HAVE_GALLIUM_ETNAVIV
 SUBDIRS += drivers/etnaviv winsys/etnaviv/drm
 endif
 
+if HAVE_GALLIUM_ARMADA
+SUBDIRS += drivers/armada winsys/armada/drm
+endif
+
 if HAVE_GALLIUM_IMX
 SUBDIRS += drivers/imx winsys/imx/drm
 endif
diff --git a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
index 5a88a2ac2f0..338b49af48c 100644
--- a/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
+++ b/src/gallium/auxiliary/pipe-loader/pipe_loader_drm.c
@@ -141,6 +141,11 @@ static const struct drm_driver_descriptor driver_descriptors[] = {
         .create_screen = pipe_tegra_create_screen,
         .configuration = pipe_default_configuration_query,
     },
+    {
+        .driver_name = "armada-drm",
+        .create_screen = pipe_armada_create_screen,
+        .configuration = pipe_default_configuration_query,
+    }
 };
 #endif
 
diff --git a/src/gallium/auxiliary/target-helpers/drm_helper.h b/src/gallium/auxiliary/target-helpers/drm_helper.h
index 7eefa6e42ec..4a0ca9ddf4c 100644
--- a/src/gallium/auxiliary/target-helpers/drm_helper.h
+++ b/src/gallium/auxiliary/target-helpers/drm_helper.h
@@ -403,4 +403,27 @@ pipe_tegra_create_screen(int fd, const struct pipe_screen_config *config)
 
 #endif
 
+#ifdef GALLIUM_ARMADA
+#include "armada/drm/armada_drm_public.h"
+
+struct pipe_screen *
+pipe_armada_create_screen(int fd, const struct pipe_screen_config *config)
+{
+  struct pipe_screen *screen;
+
+  screen = armada_drm_screen_create(fd);
+  return screen ? debug_screen_wrap(screen) : NULL;
+}
+
+#else
+
+struct pipe_screen *
+pipe_armada_create_screen(int fd, const struct pipe_screen_config *config)
+{
+  fprintf(stderr, "armada-drm: driver missing\n");
+  return NULL;
+}
+
+#endif
+
 #endif /* DRM_HELPER_H */
diff --git a/src/gallium/auxiliary/target-helpers/drm_helper_public.h b/src/gallium/auxiliary/target-helpers/drm_helper_public.h
index 155c525762c..cc6e42eb648 100644
--- a/src/gallium/auxiliary/target-helpers/drm_helper_public.h
+++ b/src/gallium/auxiliary/target-helpers/drm_helper_public.h
@@ -54,6 +54,9 @@ pipe_imx_drm_create_screen(int fd, const struct pipe_screen_config *config);
 struct pipe_screen *
 pipe_tegra_create_screen(int fd, const struct pipe_screen_config *config);
 
+struct pipe_screen *
+pipe_armada_create_screen(int fd, const struct pipe_screen_config *config);
+
 const struct drm_conf_ret *
 pipe_default_configuration_query(enum drm_conf conf);
 
diff --git a/src/gallium/drivers/armada/Automake.inc b/src/gallium/drivers/armada/Automake.inc
new file mode 100644
index 00000000000..f4718d68855
--- /dev/null
+++ b/src/gallium/drivers/armada/Automake.inc
@@ -0,0 +1,9 @@
+if HAVE_GALLIUM_ARMADA
+
+TARGET_DRIVERS += armada-drm
+TARGET_CPPFLAGS += -DGALLIUM_ARMADA
+TARGET_LIB_DEPS += \
+    $(top_builddir)/src/gallium/winsys/armada/drm/libarmadadrm.la \
+    $(LIBDRM_LIBS)
+
+endif
diff --git a/src/gallium/drivers/armada/Makefile.am b/src/gallium/drivers/armada/Makefile.am
new file mode 100644
index 00000000000..788b08ef350
--- /dev/null
+++ b/src/gallium/drivers/armada/Makefile.am
@@ -0,0 +1,8 @@
+include $(top_srcdir)/src/gallium/Automake.inc
+
+AM_CPPFLAGS = \
+	$(GALLIUM_CFLAGS)
+
+noinst_LTLIBRARIES = libarmada.la
+
+libarmada_la_SOURCES =
diff --git a/src/gallium/meson.build b/src/gallium/meson.build
index 561af9d339c..3de028c3f45 100644
--- a/src/gallium/meson.build
+++ b/src/gallium/meson.build
@@ -111,6 +111,11 @@ if with_gallium_imx
 else
   driver_imx = declare_dependency()
 endif
+if with_gallium_armada
+  subdir('winsys/armada/drm')
+else
+  driver_armada = declare_dependency()
+endif
 if with_gallium_tegra
   subdir('winsys/tegra/drm')
   subdir('drivers/tegra')
diff --git a/src/gallium/targets/dri/Makefile.am b/src/gallium/targets/dri/Makefile.am
index a857b5129fd..ae5b1c0bd07 100644
--- a/src/gallium/targets/dri/Makefile.am
+++ b/src/gallium/targets/dri/Makefile.am
@@ -83,6 +83,7 @@ include $(top_srcdir)/src/gallium/drivers/pl111/Automake.inc
 include $(top_srcdir)/src/gallium/drivers/virgl/Automake.inc
 
 include $(top_srcdir)/src/gallium/drivers/etnaviv/Automake.inc
+include $(top_srcdir)/src/gallium/drivers/armada/Automake.inc
 include $(top_srcdir)/src/gallium/drivers/imx/Automake.inc
 
 include $(top_srcdir)/src/gallium/drivers/softpipe/Automake.inc
diff --git a/src/gallium/targets/dri/meson.build b/src/gallium/targets/dri/meson.build
index 51940a2f350..60356f2192b 100644
--- a/src/gallium/targets/dri/meson.build
+++ b/src/gallium/targets/dri/meson.build
@@ -58,7 +58,7 @@ libgallium_dri = shared_library(
     driver_swrast, driver_r300, driver_r600, driver_radeonsi, driver_nouveau,
     driver_pl111, driver_v3d, driver_vc4, driver_freedreno, driver_etnaviv,
     driver_imx, driver_tegra, driver_i915, driver_svga, driver_virgl,
-    driver_swr,
+    driver_swr, driver_armada
   ],
 )
 
@@ -72,6 +72,7 @@ foreach d : [[with_gallium_pl111, 'pl111_dri.so'],
              [with_gallium_vc4, 'vc4_dri.so'],
              [with_gallium_etnaviv, 'etnaviv_dri.so'],
              [with_gallium_imx, 'imx-drm_dri.so'],
+             [with_gallium_armada, 'armada-drm_dri.so'],
              [with_gallium_tegra, 'tegra_dri.so'],
              [with_gallium_i915, 'i915_dri.so'],
              [with_gallium_r300, 'r300_dri.so'],
diff --git a/src/gallium/targets/dri/target.c b/src/gallium/targets/dri/target.c
index 835d125f21e..5d5a41dba80 100644
--- a/src/gallium/targets/dri/target.c
+++ b/src/gallium/targets/dri/target.c
@@ -83,6 +83,7 @@ DEFINE_LOADER_DRM_ENTRYPOINT(pl111)
 #endif
 
 #if defined(GALLIUM_ETNAVIV)
+DEFINE_LOADER_DRM_ENTRYPOINT(armada_drm)
 DEFINE_LOADER_DRM_ENTRYPOINT(imx_drm)
 DEFINE_LOADER_DRM_ENTRYPOINT(etnaviv)
 #endif
diff --git a/src/gallium/winsys/armada/drm/Makefile.am b/src/gallium/winsys/armada/drm/Makefile.am
new file mode 100644
index 00000000000..f0773976e0c
--- /dev/null
+++ b/src/gallium/winsys/armada/drm/Makefile.am
@@ -0,0 +1,11 @@
+include Makefile.sources
+include $(top_srcdir)/src/gallium/Automake.inc
+
+AM_CFLAGS = \
+	 -I$(top_srcdir)/src/gallium/drivers \
+	 -I$(top_srcdir)/src/gallium/winsys \
+	 $(GALLIUM_WINSYS_CFLAGS)
+
+noinst_LTLIBRARIES = libarmadadrm.la
+
+libarmadadrm_la_SOURCES = $(C_SOURCES)
diff --git a/src/gallium/winsys/armada/drm/Makefile.sources b/src/gallium/winsys/armada/drm/Makefile.sources
new file mode 100644
index 00000000000..00d8de33bb9
--- /dev/null
+++ b/src/gallium/winsys/armada/drm/Makefile.sources
@@ -0,0 +1,3 @@
+C_SOURCES := \
+    armada_drm_public.h \
+    armada_drm_winsys.c
diff --git a/src/gallium/winsys/armada/drm/armada_drm_public.h b/src/gallium/winsys/armada/drm/armada_drm_public.h
new file mode 100644
index 00000000000..c3628ae5a07
--- /dev/null
+++ b/src/gallium/winsys/armada/drm/armada_drm_public.h
@@ -0,0 +1,8 @@
+#ifndef __ARMADA_DRM_PUBLIC_H__
+#define __ARMADA_DRM_PUBLIC_H__
+
+struct pipe_screen;
+
+struct pipe_screen *armada_drm_screen_create(int fd);
+
+#endif
diff --git a/src/gallium/winsys/armada/drm/armada_drm_winsys.c b/src/gallium/winsys/armada/drm/armada_drm_winsys.c
new file mode 100644
index 00000000000..c9dbf1997b7
--- /dev/null
+++ b/src/gallium/winsys/armada/drm/armada_drm_winsys.c
@@ -0,0 +1,24 @@
+#include "armada_drm_public.h"
+#include "etnaviv/drm/etnaviv_drm_public.h"
+#include "renderonly/renderonly.h"
+
+#include <fcntl.h>
+#include <unistd.h>
+
+struct pipe_screen *armada_drm_screen_create(int fd)
+{
+    struct renderonly ro = {
+        .create_for_resource = renderonly_create_kms_dumb_buffer_for_resource,
+        .kms_fd = fd,
+        .gpu_fd = open("/dev/dri/renderD128", O_RDWR | O_CLOEXEC)
+    };
+
+    if (ro.gpu_fd < 0)
+        return NULL;
+
+    struct pipe_screen *screen = etna_drm_screen_create_renderonly(&ro);
+    if (!screen)
+        close(ro.gpu_fd);
+
+    return screen;
+}
diff --git a/src/gallium/winsys/armada/drm/meson.build b/src/gallium/winsys/armada/drm/meson.build
new file mode 100644
index 00000000000..af4d55fb634
--- /dev/null
+++ b/src/gallium/winsys/armada/drm/meson.build
@@ -0,0 +1,14 @@
+libarmadadrm = static_library(
+  'armadadrm',
+  'armada_drm_winsys.c',
+  include_directories : [
+    inc_include, inc_src, inc_gallium, inc_gallium_aux,
+    include_directories('../..'),
+  ],
+)
+
+driver_armada = declare_dependency(
+  compile_args : '-DGALLIUM_ARMADA',
+  link_with : libarmadadrm,
+)
+
-- 
2.20.1



More information about the mesa-dev mailing list