WARN_ON(ring->id != RCS);
 
+       /* some WA perform writes to scratch page, ensure it is valid */
+       if (ring->scratch.obj == NULL) {
+               DRM_ERROR("scratch page not allocated for %s\n", ring->name);
+               return -EINVAL;
+       }
+
        ret = lrc_setup_wa_ctx_obj(ring, PAGE_SIZE);
        if (ret) {
                DRM_DEBUG_DRIVER("Failed to setup context WA page: %d\n", ret);
        ring->emit_bb_start = gen8_emit_bb_start;
 
        ring->dev = dev;
-       ret = logical_ring_init(dev, ring);
+
+       ret = intel_init_pipe_control(ring);
        if (ret)
                return ret;
 
                          ret);
        }
 
-       ret = intel_init_pipe_control(ring);
-       if (ret)
+       ret = logical_ring_init(dev, ring);
+       if (ret) {
                lrc_destroy_wa_ctx_obj(ring);
+       }
 
        return ret;
 }