So I started investigating the kernel runtime PM support as per Alan's suggestion. An API with lots of interface docs and not enough examples :-)
So I've mostly implemented autosuspend for nouveau with this, it could still be pushed down a lot further into the code I suspect.
Also this doesn't actually turn the power switch off since runtime PM currently have no hook to do that, so it only D3s the GPU.
Dave.