panfrost: Check GPU version before loading
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 8 Jul 2019 16:14:59 +0000 (09:14 -0700)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 10 Jul 2019 13:47:11 +0000 (06:47 -0700)
Panfrost is known to only work on a select few CPU/GPU combinations at
the moment (tested system-on-chips: RK3288, RK3399, and S912). Whitelist
the combinations known to work and refuse to load on others where
nothing works yet to avoid user confusion.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Reviewed-by: Tomeu Vizoso <tomeu.vizoso@collabora.com>
src/gallium/drivers/panfrost/pan_context.c
src/gallium/drivers/panfrost/pan_screen.c
src/gallium/drivers/panfrost/pan_screen.h

index 69d877277be14475e3e071c8b84dc56093627756..29e36d02f8b265f44d8a0a7bc06757c9a11432cc 100644 (file)
@@ -2675,12 +2675,9 @@ panfrost_create_context(struct pipe_screen *screen, void *priv, unsigned flags)
         struct panfrost_screen *pscreen = pan_screen(screen);
         memset(ctx, 0, sizeof(*ctx));
         struct pipe_context *gallium = (struct pipe_context *) ctx;
-        unsigned gpu_id;
 
-        gpu_id = panfrost_drm_query_gpu_version(pscreen);
-
-        ctx->is_t6xx = gpu_id <= 0x0750; /* For now, this flag means T760 or less */
-        ctx->require_sfbd = gpu_id < 0x0750; /* T760 is the first to support MFBD */
+        ctx->is_t6xx = pscreen->gpu_id <= 0x0750; /* For now, this flag means T760 or less */
+        ctx->require_sfbd = pscreen->gpu_id < 0x0750; /* T760 is the first to support MFBD */
 
         gallium->screen = screen;
 
index 6590359a53f016b0829c3229a92c198903638356..1aa0debb907293de2156f55ed0f3e212f55d426e 100644 (file)
@@ -487,6 +487,31 @@ panfrost_create_screen(int fd, struct renderonly *ro)
 
         screen->fd = fd;
 
+        screen->gpu_id = panfrost_drm_query_gpu_version(screen);
+
+        /* Check if we're loading against a supported GPU model
+         * paired with a supported CPU (differences from
+         * armhf/aarch64 break models on incompatible CPUs at the
+         * moment -- this is a TODO). In other words, we whitelist
+         * RK3288, RK3399, and S912, which are verified to work. */
+
+        switch (screen->gpu_id) {
+#ifdef __LP64__
+                case 0x820: /* T820 */
+                case 0x860: /* T860 */
+                        break;
+#else
+                case 0x750: /* T760 */
+                        break;
+#endif
+
+                default:
+                        /* Fail to load against untested models */
+                        debug_printf("panfrost: Unsupported model %X",
+                                        screen->gpu_id);
+                        return NULL;
+        }
+
         if (pan_debug & PAN_DBG_TRACE)
                 pandecode_initialize();
 
index 9bcea6114285feb9b2a1bfeaf3f9b16e8ae7be2c..ddb89efe396b98b243a2f4047f585be9e7662327 100644 (file)
@@ -49,6 +49,7 @@ struct panfrost_screen;
 struct panfrost_screen {
         struct pipe_screen base;
         int fd;
+        unsigned gpu_id;
 
         struct renderonly *ro;