diff options
author | Alyssa Rosenzweig <[email protected]> | 2019-07-08 09:14:59 -0700 |
---|---|---|
committer | Alyssa Rosenzweig <[email protected]> | 2019-07-10 06:47:11 -0700 |
commit | 2f7145a6dee82779f5cd2183ed42f086c25aaf18 (patch) | |
tree | 092db7e6f2db698a2bccbee2c7a219810f3b4567 /src | |
parent | b5de423ac1c653741c78030598ae9561e4966c30 (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.c | 7 | ||||
-rw-r--r-- | src/gallium/drivers/panfrost/pan_screen.c | 25 | ||||
-rw-r--r-- | src/gallium/drivers/panfrost/pan_screen.h | 1 |
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; |