return 0;
 }
 
+int sun4i_backend_update_layer_zpos(struct sun4i_backend *backend, int layer,
+                                   struct drm_plane *plane)
+{
+       struct drm_plane_state *state = plane->state;
+       unsigned int priority = state->normalized_zpos;
+
+       DRM_DEBUG_DRIVER("Setting layer %d's priority to %d\n", layer, priority);
+
+       regmap_update_bits(backend->engine.regs, SUN4I_BACKEND_ATTCTL_REG0(layer),
+                          SUN4I_BACKEND_ATTCTL_REG0_LAY_PRISEL_MASK,
+                          SUN4I_BACKEND_ATTCTL_REG0_LAY_PRISEL(priority));
+
+       return 0;
+}
+
 static bool sun4i_backend_plane_uses_scaler(struct drm_plane_state *state)
 {
        u16 src_h = state->src_h >> 16;
 
                                      int layer, struct drm_plane *plane);
 int sun4i_backend_update_layer_frontend(struct sun4i_backend *backend,
                                        int layer, uint32_t in_fmt);
+int sun4i_backend_update_layer_zpos(struct sun4i_backend *backend,
+                                   int layer, struct drm_plane *plane);
 
 #endif /* _SUN4I_BACKEND_H_ */
 
        if (ret)
                return ret;
 
+       ret = drm_atomic_normalize_zpos(dev, state);
+       if (ret)
+               return ret;
+
        return drm_atomic_helper_check_planes(dev, state);
 }
 
 
        }
 
        sun4i_backend_update_layer_coord(backend, layer->id, plane);
+       sun4i_backend_update_layer_zpos(backend, layer->id, plane);
        sun4i_backend_layer_enable(backend, layer->id, true);
 }
 
                        return ERR_CAST(layer);
                };
 
+               drm_plane_create_zpos_immutable_property(&layer->plane, i);
+
                DRM_DEBUG_DRIVER("Assigning %s plane to pipe %d\n",
                                 i ? "overlay" : "primary", plane->pipe);
                regmap_update_bits(engine->regs, SUN4I_BACKEND_ATTCTL_REG0(i),