drm/meson: Make sure to align buffer sizes to page sizes

GEM requires this.
drm/meson: Minor cosmetic fixes to error handling
drm/meson: Minor code style fixes
drm/meson: Double-check that we don't have a queued state

We should only have one async state at a time.
drm/meson: Don't leak the page flip event

This will be cleaned up for our next state.
drm/meson: Reorganize CRTC
drm/meson: Fix the cosmetics of an X-macros table

We were relying on the whitespace here to end our define, which is bad form.
drm/meson: Shadow registers, copy them at vblank time

Atomic updates work in a way that apps queue up an atomic state commit,
then check that state, and that state is supposed to apply either
immediately (set crtc, set cursor, update plane), or asynchronously,
with an event sent back (page flip).

We were implementing asynchronous atomic commits by saving the state
then playing that back later, but that really wasn't expected, and,
various things broke.

Theoretically, there should only be one atomic commit per CRTC at a
time, but this completely breaks down on the legacy cursor ioctls
which Xorg uses to set and move the cursor. The new universal plane
cursor path implements this with an atomic commit, which means that
our CRTC state.

As such, doing a page flip and then a move cursor will first commit
one state, and then the second state, and the first state is just
dropped on the floor. If the first state has a pending vblank event,
this means that we'll simply drop the vblank event on the floor,
never deliver it, and make userspace very disappointed.

Future fixes to the cursor helpers will properly fix this by making
a separate commit or modifying the last one, but until that's done,
make a fix that we really should have been doing for a while: shadowing
the register table and copying it to the real registers at vblank
time. This means that all the commits happen in-order, and we simply
just overwrite past registers with their new values when multiple
commits are done in-order.