summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAlyssa Rosenzweig <[email protected]>2019-07-08 09:14:59 -0700
committerAlyssa Rosenzweig <[email protected]>2019-07-10 06:47:11 -0700
commit2f7145a6dee82779f5cd2183ed42f086c25aaf18 (patch)
tree092db7e6f2db698a2bccbee2c7a219810f3b4567 /src
parentb5de423ac1c653741c78030598ae9561e4966c30 (diff)
panfrost: Check GPU version before loading
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 <[email protected]> Reviewed-by: Tomeu Vizoso <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/panfrost/pan_context.c7
-rw-r--r--src/gallium/drivers/panfrost/pan_screen.c25
-rw-r--r--src/gallium/drivers/panfrost/pan_screen.h1
3 files changed, 28 insertions, 5 deletions
diff --git a/src/gallium/drivers/panfrost/pan_context.c b/src/gallium/drivers/panfrost/pan_context.c
index 69d877277be..29e36d02f8b 100644
--- a/src/gallium/drivers/panfrost/pan_context.c
+++ b/src/gallium/drivers/panfrost/pan_context.c
@@ -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;
diff --git a/src/gallium/drivers/panfrost/pan_screen.c b/src/gallium/drivers/panfrost/pan_screen.c
index 6590359a53f..1aa0debb907 100644
--- a/src/gallium/drivers/panfrost/pan_screen.c
+++ b/src/gallium/drivers/panfrost/pan_screen.c
@@ -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();
diff --git a/src/gallium/drivers/panfrost/pan_screen.h b/src/gallium/drivers/panfrost/pan_screen.h
index 9bcea611428..ddb89efe396 100644
--- a/src/gallium/drivers/panfrost/pan_screen.h
+++ b/src/gallium/drivers/panfrost/pan_screen.h
@@ -49,6 +49,7 @@ struct panfrost_screen;
struct panfrost_screen {
struct pipe_screen base;
int fd;
+ unsigned gpu_id;
struct renderonly *ro;