ARM: tegra: enable GPU node by compatible value
authorStephen Warren <swarren@nvidia.com>
Tue, 12 Apr 2016 17:17:39 +0000 (11:17 -0600)
committerTom Warren <twarren@nvidia.com>
Wed, 4 May 2016 20:31:03 +0000 (13:31 -0700)
In current Linux kernel Tegra DT files, 64-bit addresses are represented
in unit addresses as a pair of comma-separated 32-bit values. Apparently
this is no longer the correct representation for simple busses, and the
unit address should be represented as a single 64-bit value. If this is
changed in the DTs, arm/arm/mach-tegra/board2.c:ft_system_setup() will no
longer be able to find and enable the GPU node, since it looks up the node
by name.

Fix that function to enable nodes based on their compatible value rather
than their node name. This will work no matter what the node name is, i.e
for DTs both before and after any rename operation.

Cc: Thierry Reding <treding@nvidia.com>
Cc: Alexandre Courbot <acourbot@nvidia.com>
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Signed-off-by: Tom Warren <twarren@nvidia.com>
arch/arm/include/asm/arch-tegra/gpu.h
arch/arm/mach-tegra/board2.c
arch/arm/mach-tegra/gpu.c

index 4423386f28051071e7453921daf99d40040ebd67..6be9f6157b36bf5eff22c4552bac72622690b714 100644 (file)
@@ -26,7 +26,7 @@ int tegra_gpu_enable_node(void *blob, const char *gpupath);
 
 #else /* CONFIG_OF_LIBFDT */
 
-static inline int tegra_gpu_enable_node(void *blob, const char *gpupath)
+static inline int tegra_gpu_enable_node(void *blob, const char *compat)
 {
        return 0;
 }
index ac274e17e8bd7deb7e3d9c7e392a7a6bbfeeab89..141d6e1cb55591c67da1de32fc70e96790e6ec35 100644 (file)
@@ -404,16 +404,22 @@ ulong board_get_usable_ram_top(ulong total_size)
  */
 int ft_system_setup(void *blob, bd_t *bd)
 {
-       const char *gpu_path =
-#if defined(CONFIG_TEGRA124) || defined(CONFIG_TEGRA210)
-               "/gpu@0,57000000";
-#else
-               NULL;
+       const char *gpu_compats[] = {
+#if defined(CONFIG_TEGRA124)
+               "nvidia,gk20a",
+#endif
+#if defined(CONFIG_TEGRA210)
+               "nvidia,gm20b",
 #endif
+       };
+       int i, ret;
 
        /* Enable GPU node if GPU setup has been performed */
-       if (gpu_path != NULL)
-               return tegra_gpu_enable_node(blob, gpu_path);
+       for (i = 0; i < ARRAY_SIZE(gpu_compats); i++) {
+               ret = tegra_gpu_enable_node(blob, gpu_compats[i]);
+               if (ret)
+                       return ret;
+       }
 
        return 0;
 }
index 0dbddd45d4159293cad21519c7643d06dfc9049e..74b64a620c5f65ef7ab33afb64d40cfc0beb8420 100644 (file)
@@ -33,16 +33,17 @@ void tegra_gpu_config(void)
 
 #if defined(CONFIG_OF_LIBFDT)
 
-int tegra_gpu_enable_node(void *blob, const char *gpupath)
+int tegra_gpu_enable_node(void *blob, const char *compat)
 {
        int offset;
 
-       if (_configured) {
-               offset = fdt_path_offset(blob, gpupath);
-               if (offset > 0) {
-                       fdt_status_okay(blob, offset);
-                       debug("enabled GPU node %s\n", gpupath);
-               }
+       if (!_configured)
+               return 0;
+
+       offset = fdt_node_offset_by_compatible(blob, -1, compat);
+       while (offset != -FDT_ERR_NOTFOUND) {
+               fdt_status_okay(blob, offset);
+               offset = fdt_node_offset_by_compatible(blob, offset, compat);
        }
 
        return 0;