How does Mali GPU implement the RO/WO registers?

Arm Mali GPU expose their registers to CPU side using MMIO. And there are so many types of registers (written in device drivers' source code) which are used for different usages. How does Mali GPU check the register access permissions?

I tested on Hikey960 Development Board using busybox devmem, there are some MMIO registers (GPU_ID, GPU_FEATURE, etc.) which are not writable from CPU side. I wonder how does hardware implement read-only/write-only permissions on this registers?