I still think this goes into the wrong direction. Something closer to your first version that also saves away the gvt->mmio.mmio_attribute flags in the core i915 module, and which splits the MMIO table into one that contains just the offset, size and flags (core i915) and one that has the read-only mask and handlers (gvt) would be much simpler and not create this super-tight coupling between core i915 and gvt. Bonus points for moving your new intel_gvt_hw_state structure out of struct intel_gvt and into struct i915_virtual_gpu.