On 04/06/2021 14:00, Alyssa Rosenzweig wrote: > The value of the AFBC_FEATURES register is required by userspace to > determine AFBC support on Bifrost. A user on our IRC channel (#panfrost) > reported a workload that raised a fault on one system's Mali G31 but > worked flawlessly with another system's Mali G31. We determined the > cause to be missing AFBC support on one vendor's Mali implementation -- > it turns out AFBC is optional on Bifrost! > > Whether AFBC is supported or not is exposed in the AFBC_FEATURES > register on Bifrost, which reads back as 0 on Midgard. A zero value > indicates AFBC is fully supported, provided the architecture itself > supports AFBC, allowing backwards-compatibility with Midgard. Bits 0 and > 15 indicate that AFBC support is absent for texturing and rendering > respectively. > > The user experiencing the fault reports that AFBC_FEATURES reads back > 0x10001 on their system, confirming the architectural lack of AFBC. > Userspace needs this this parameter to know to disable AFBC on that ^^^^^^^^^ Repeated word ;) But I've fixed that up and pushed it to drm-misc-next. Thanks, Steve > chip, and perhaps others. > > v2: Fix typo from copy-paste fail. > > v3: Bump the UABI version. This commit was cherry-picked from another > series so chalking this up to a rebase fail. > > Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@xxxxxxxxxxxxx> > Reviewed-by: Steven Price <steven.price@xxxxxxx> > Cc: Rob Herring <robh@xxxxxxxxxx> > Cc: Tomeu Vizoso <tomeu.vizoso@xxxxxxxxxxxxx> > --- > drivers/gpu/drm/panfrost/panfrost_device.h | 1 + > drivers/gpu/drm/panfrost/panfrost_drv.c | 4 +++- > drivers/gpu/drm/panfrost/panfrost_gpu.c | 1 + > drivers/gpu/drm/panfrost/panfrost_regs.h | 1 + > include/uapi/drm/panfrost_drm.h | 1 + > 5 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h > index 597cf1459..f614e9877 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_device.h > +++ b/drivers/gpu/drm/panfrost/panfrost_device.h > @@ -45,6 +45,7 @@ struct panfrost_features { > u32 thread_max_workgroup_sz; > u32 thread_max_barrier_sz; > u32 coherency_features; > + u32 afbc_features; > u32 texture_features[4]; > u32 js_features[16]; > > diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c > index ca07098a6..1596559f3 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_drv.c > +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c > @@ -63,6 +63,7 @@ static int panfrost_ioctl_get_param(struct drm_device *ddev, void *data, struct > PANFROST_FEATURE(THREAD_MAX_BARRIER_SZ, > thread_max_barrier_sz); > PANFROST_FEATURE(COHERENCY_FEATURES, coherency_features); > + PANFROST_FEATURE(AFBC_FEATURES, afbc_features); > PANFROST_FEATURE_ARRAY(TEXTURE_FEATURES, texture_features, 3); > PANFROST_FEATURE_ARRAY(JS_FEATURES, js_features, 15); > PANFROST_FEATURE(NR_CORE_GROUPS, nr_core_groups); > @@ -547,6 +548,7 @@ DEFINE_DRM_GEM_FOPS(panfrost_drm_driver_fops); > * Panfrost driver version: > * - 1.0 - initial interface > * - 1.1 - adds HEAP and NOEXEC flags for CREATE_BO > + * - 1.2 - adds AFBC_FEATURES query > */ > static const struct drm_driver panfrost_drm_driver = { > .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ, > @@ -559,7 +561,7 @@ static const struct drm_driver panfrost_drm_driver = { > .desc = "panfrost DRM", > .date = "20180908", > .major = 1, > - .minor = 1, > + .minor = 2, > > .gem_create_object = panfrost_gem_create_object, > .prime_handle_to_fd = drm_gem_prime_handle_to_fd, > diff --git a/drivers/gpu/drm/panfrost/panfrost_gpu.c b/drivers/gpu/drm/panfrost/panfrost_gpu.c > index 2aae636f1..0e70e27fd 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_gpu.c > +++ b/drivers/gpu/drm/panfrost/panfrost_gpu.c > @@ -228,6 +228,7 @@ static void panfrost_gpu_init_features(struct panfrost_device *pfdev) > pfdev->features.thread_max_workgroup_sz = gpu_read(pfdev, GPU_THREAD_MAX_WORKGROUP_SIZE); > pfdev->features.thread_max_barrier_sz = gpu_read(pfdev, GPU_THREAD_MAX_BARRIER_SIZE); > pfdev->features.coherency_features = gpu_read(pfdev, GPU_COHERENCY_FEATURES); > + pfdev->features.afbc_features = gpu_read(pfdev, GPU_AFBC_FEATURES); > for (i = 0; i < 4; i++) > pfdev->features.texture_features[i] = gpu_read(pfdev, GPU_TEXTURE_FEATURES(i)); > > diff --git a/drivers/gpu/drm/panfrost/panfrost_regs.h b/drivers/gpu/drm/panfrost/panfrost_regs.h > index eddaa62ad..dc9df5457 100644 > --- a/drivers/gpu/drm/panfrost/panfrost_regs.h > +++ b/drivers/gpu/drm/panfrost/panfrost_regs.h > @@ -82,6 +82,7 @@ > > #define GPU_TEXTURE_FEATURES(n) (0x0B0 + ((n) * 4)) > #define GPU_JS_FEATURES(n) (0x0C0 + ((n) * 4)) > +#define GPU_AFBC_FEATURES (0x4C) /* (RO) AFBC support on Bifrost */ > > #define GPU_SHADER_PRESENT_LO 0x100 /* (RO) Shader core present bitmap, low word */ > #define GPU_SHADER_PRESENT_HI 0x104 /* (RO) Shader core present bitmap, high word */ > diff --git a/include/uapi/drm/panfrost_drm.h b/include/uapi/drm/panfrost_drm.h > index ec19db1ee..061e700dd 100644 > --- a/include/uapi/drm/panfrost_drm.h > +++ b/include/uapi/drm/panfrost_drm.h > @@ -171,6 +171,7 @@ enum drm_panfrost_param { > DRM_PANFROST_PARAM_JS_FEATURES15, > DRM_PANFROST_PARAM_NR_CORE_GROUPS, > DRM_PANFROST_PARAM_THREAD_TLS_ALLOC, > + DRM_PANFROST_PARAM_AFBC_FEATURES, > }; > > struct drm_panfrost_get_param { >