The devices which require interaction with the CPU also share data with the CPU. However, when the CPU produces the (shared) data, the data is normally cached to improve CPU performance. Similarly, some devices have caches to improve their performance. There are two ways to share data between devices and CPUs.
In software coherency, software (as a producer) must flush CPU caches before devices can read shared data from memory. And, if the device produces the data, then software (as a consumer) must invalidate CPU caches before using the data produced by the device.
The hardware coherency (I/O coherency) can provide data coherence by having device memory requests snoop CPU caches. This speeds up data sharing significantly (by avoiding cache flush/invalidate), and simplifies software.