I'd like to point out that the copy itself can be written in safe code, since it appears that nobody has pointed it out yet.
fn copy_data<T: Copy>(from: &[T], to: &mut [MaybeUninit<T>]) {
assert_eq!(from.len(), to.len());
for (from, to) in from.iter().zip(to) {
*to = MaybeUninit::new(*from);
}
}