[Mesa-dev] [PATCH 5/5] tegra: Initial support

Emil Velikov emil.l.velikov at gmail.com
Wed Feb 21 17:01:02 UTC 2018


Hi Thierry,

On 21 February 2018 at 15:30, Thierry Reding <thierry.reding at gmail.com> wrote:

> @@ -2595,6 +2596,11 @@ if test -n "$with_gallium_drivers"; then
>         ximx)
>              HAVE_GALLIUM_IMX=yes
>              ;;
> +        xtegra)
> +            HAVE_GALLIUM_TEGRA=yes
> +            PKG_CHECK_MODULES([TEGRA], [libdrm_tegra >= $LIBDRM_TEGRA_REQUIRED])
> +            require_libdrm "tegra"
> +            ;;

Could use the following hunk just after the "... needed dependencies
for renderonly drivers." comment.

if test "x$HAVE_GALLIUM_NOUVEAU" != xyes -a "x$HAVE_GALLIUM_TEGRA" =
xyes  ; then
    AC_MSG_ERROR([Building with tegra requires nouveau])
fi

In a future patch we can:
- add tegra to the Makefile.am DISTCHECK list
- wire up the driver with .travis


> index 000000000000..910cbe02d873
> --- /dev/null
> +++ b/include/drm-uapi/tegra_drm.h

Haven't checked this one, but I trust you picked the latest and greatest.


> --- /dev/null
> +++ b/src/gallium/drivers/tegra/Makefile.am
> @@ -0,0 +1,18 @@
> +AUTOMAKE_OPTIONS = subdir-objects
> +
Not needed - already set at global scope.

> +include Makefile.sources
> +include $(top_srcdir)/src/gallium/Automake.inc
> +
> +AM_CFLAGS = \
> +       -I$(top_srcdir)/include/drm-uapi \
> +       $(GALLIUM_DRIVER_CFLAGS) \
> +       $(LIBUDEV_CFLAGS) \
libudev is gone.

> +
> +noinst_LTLIBRARIES = libtegra.la
> +
> +libtegra_la_SOURCES = \
> +       $(C_SOURCES)
> +
> +libtegra_la_LIBADD = \
> +       $(LIBUDEV_LIBS)
Ditto.


> --- /dev/null
> +++ b/src/gallium/drivers/tegra/Makefile.sources
> @@ -0,0 +1,3 @@
> +C_SOURCES := \
> +       tegra_context.c \
> +       tegra_screen.c

Please include the following to as well.
tegra_context.h
tegra_resource.h

> index 000000000000..feaa5138c95d
> --- /dev/null
> +++ b/src/gallium/drivers/tegra/tegra_context.c

> +#include "tegra/tegra_context.h"
> +#include "tegra/tegra_resource.h"
> +#include "tegra/tegra_screen.h"
> +
The "tegra/" prefix isn't needed - it doesn't hurt though.


> --- /dev/null
> +++ b/src/gallium/drivers/tegra/tegra_screen.c

> +#include "tegra/tegra_context.h"
> +#include "tegra/tegra_resource.h"
> +#include "tegra/tegra_screen.h"
> +
Ditto.

> +static const char *
> +tegra_screen_get_name(struct pipe_screen *pscreen)
> +{
> +   return "tegra";
> +}
> +
> +static const char *
> +tegra_screen_get_vendor(struct pipe_screen *pscreen)
> +{
> +   return "NVIDIA";
> +}
> +
> +static const char *
> +tegra_screen_get_device_vendor(struct pipe_screen *pscreen)
> +{
> +   return "NVIDIA";
> +}
> +
As-is these might be a bit fiddly, but will do for now.
For example - how will devs distinguish between the closed-source
driver and Mesa.


> +static int tegra_open_render_node(void)
> +{
> +   drmDevicePtr *devices, device;
> +   int err, fd = -ENODEV;
> +   unsigned int num, i;
> +
> +   err = drmGetDevices2(0, NULL, 0);
> +   if (err < 0)
> +      return err;
> +
> +   num = err;
> +
> +   devices = calloc(num, sizeof(*devices));
> +   if (!devices)
> +      return -ENOMEM;
> +
> +   err = drmGetDevices2(0, devices, num);
> +   if (err < 0) {
> +      free(devices);
> +      return err;
> +   }
> +
> +   for (i = 0; i < num; i++) {
> +      device = devices[i];
> +
> +      if ((device->available_nodes & (1 << DRM_NODE_RENDER)) &&
> +          (device->bustype == DRM_BUS_PLATFORM)) {
Worth checking for any instances of "tegra" in the platform/deviceinfo strings?

> +         fd = open(device->nodes[DRM_NODE_RENDER], O_RDWR);
open(.... O_RDWR | O_CLOEXEC) + check for failure.



> +struct pipe_screen *
> +tegra_screen_create(int fd)
> +{
> +   struct tegra_screen *screen;
> +
> +   screen = calloc(1, sizeof(*screen));
> +   if (!screen)
> +      return NULL;
> +
> +   screen->fd = fd;
IIRC there were some fallouts for xinerama setups that required a dup().
Don't recall the details and how applicable those are here.


-Emil


More information about the mesa-dev mailing list