#define GITS_TYPER_PTA                 (1UL << 19)
 #define GITS_TYPER_HWCOLLCNT_SHIFT     24
 
+#define GITS_IIDR_REV_SHIFT            12
+#define GITS_IIDR_REV_MASK             (0xf << GITS_IIDR_REV_SHIFT)
+#define GITS_IIDR_REV(r)               (((r) >> GITS_IIDR_REV_SHIFT) & 0xf)
+#define GITS_IIDR_PRODUCTID_SHIFT      24
+
 #define GITS_CBASER_VALID                      (1ULL << 63)
 #define GITS_CBASER_SHAREABILITY_SHIFT         (10)
 #define GITS_CBASER_INNER_CACHEABILITY_SHIFT   (59)
 
                                             struct vgic_its *its,
                                             gpa_t addr, unsigned int len)
 {
-       return (PRODUCT_ID_KVM << 24) | (IMPLEMENTER_ARM << 0);
+       u32 val;
+
+       val = (its->abi_rev << GITS_IIDR_REV_SHIFT) & GITS_IIDR_REV_MASK;
+       val |= (PRODUCT_ID_KVM << GITS_IIDR_PRODUCTID_SHIFT) | IMPLEMENTER_ARM;
+       return val;
+}
+
+static int vgic_mmio_uaccess_write_its_iidr(struct kvm *kvm,
+                                           struct vgic_its *its,
+                                           gpa_t addr, unsigned int len,
+                                           unsigned long val)
+{
+       u32 rev = GITS_IIDR_REV(val);
+
+       if (rev >= NR_ITS_ABIS)
+               return -EINVAL;
+       return vgic_its_set_abi(its, rev);
 }
 
 static unsigned long vgic_mmio_read_its_idregs(struct kvm *kvm,
        REGISTER_ITS_DESC(GITS_CTLR,
                vgic_mmio_read_its_ctlr, vgic_mmio_write_its_ctlr, 4,
                VGIC_ACCESS_32bit),
-       REGISTER_ITS_DESC(GITS_IIDR,
-               vgic_mmio_read_its_iidr, its_mmio_write_wi, 4,
+       REGISTER_ITS_DESC_UACCESS(GITS_IIDR,
+               vgic_mmio_read_its_iidr, its_mmio_write_wi,
+               vgic_mmio_uaccess_write_its_iidr, 4,
                VGIC_ACCESS_32bit),
        REGISTER_ITS_DESC(GITS_TYPER,
                vgic_mmio_read_its_typer, its_mmio_write_wi, 8,