intel_iommu.c (80748eb4fbc70f0a3ae423f2c01cb5a4584d803f) | intel_iommu.c (d5fd978d918516b7bc4224de432c7ef93ec089a3) |
---|---|
1/* 2 * QEMU emulation of an Intel IOMMU (VT-d) 3 * (DMA Remapping device) 4 * 5 * Copyright (C) 2013 Knut Omang, Oracle <knut.omang@oracle.com> 6 * Copyright (C) 2014 Le Tan, <tamlokveer@gmail.com> 7 * 8 * This program is free software; you can redistribute it and/or modify --- 3920 unchanged lines hidden (view full) --- 3929 } else { 3930 trace_vtd_replay_ce_invalid(bus_n, PCI_SLOT(vtd_as->devfn), 3931 PCI_FUNC(vtd_as->devfn)); 3932 } 3933 3934 return; 3935} 3936 | 1/* 2 * QEMU emulation of an Intel IOMMU (VT-d) 3 * (DMA Remapping device) 4 * 5 * Copyright (C) 2013 Knut Omang, Oracle <knut.omang@oracle.com> 6 * Copyright (C) 2014 Le Tan, <tamlokveer@gmail.com> 7 * 8 * This program is free software; you can redistribute it and/or modify --- 3920 unchanged lines hidden (view full) --- 3929 } else { 3930 trace_vtd_replay_ce_invalid(bus_n, PCI_SLOT(vtd_as->devfn), 3931 PCI_FUNC(vtd_as->devfn)); 3932 } 3933 3934 return; 3935} 3936 |
3937/* Do the initialization. It will also be called when reset, so pay 3938 * attention when adding new initialization stuff. 3939 */ 3940static void vtd_init(IntelIOMMUState *s) | 3937static void vtd_cap_init(IntelIOMMUState *s) |
3941{ 3942 X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s); 3943 | 3938{ 3939 X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s); 3940 |
3944 memset(s->csr, 0, DMAR_REG_SIZE); 3945 memset(s->wmask, 0, DMAR_REG_SIZE); 3946 memset(s->w1cmask, 0, DMAR_REG_SIZE); 3947 memset(s->womask, 0, DMAR_REG_SIZE); 3948 3949 s->root = 0; 3950 s->root_scalable = false; 3951 s->dmar_enabled = false; 3952 s->intr_enabled = false; 3953 s->iq_head = 0; 3954 s->iq_tail = 0; 3955 s->iq = 0; 3956 s->iq_size = 0; 3957 s->qi_enabled = false; 3958 s->iq_last_desc_type = VTD_INV_DESC_NONE; 3959 s->iq_dw = false; 3960 s->next_frcd_reg = 0; | |
3961 s->cap = VTD_CAP_FRO | VTD_CAP_NFR | VTD_CAP_ND | 3962 VTD_CAP_MAMV | VTD_CAP_PSI | VTD_CAP_SLLPS | 3963 VTD_CAP_MGAW(s->aw_bits); 3964 if (s->dma_drain) { 3965 s->cap |= VTD_CAP_DRAIN; 3966 } 3967 if (s->dma_translation) { 3968 if (s->aw_bits >= VTD_HOST_AW_39BIT) { 3969 s->cap |= VTD_CAP_SAGAW_39bit; 3970 } 3971 if (s->aw_bits >= VTD_HOST_AW_48BIT) { 3972 s->cap |= VTD_CAP_SAGAW_48bit; 3973 } 3974 } 3975 s->ecap = VTD_ECAP_QI | VTD_ECAP_IRO; 3976 | 3941 s->cap = VTD_CAP_FRO | VTD_CAP_NFR | VTD_CAP_ND | 3942 VTD_CAP_MAMV | VTD_CAP_PSI | VTD_CAP_SLLPS | 3943 VTD_CAP_MGAW(s->aw_bits); 3944 if (s->dma_drain) { 3945 s->cap |= VTD_CAP_DRAIN; 3946 } 3947 if (s->dma_translation) { 3948 if (s->aw_bits >= VTD_HOST_AW_39BIT) { 3949 s->cap |= VTD_CAP_SAGAW_39bit; 3950 } 3951 if (s->aw_bits >= VTD_HOST_AW_48BIT) { 3952 s->cap |= VTD_CAP_SAGAW_48bit; 3953 } 3954 } 3955 s->ecap = VTD_ECAP_QI | VTD_ECAP_IRO; 3956 |
3977 /* 3978 * Rsvd field masks for spte 3979 */ 3980 vtd_spte_rsvd[0] = ~0ULL; 3981 vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits, 3982 x86_iommu->dt_supported); 3983 vtd_spte_rsvd[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s->aw_bits); 3984 vtd_spte_rsvd[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits); 3985 vtd_spte_rsvd[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s->aw_bits); 3986 3987 vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits, 3988 x86_iommu->dt_supported); 3989 vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits, 3990 x86_iommu->dt_supported); 3991 3992 if (s->scalable_mode || s->snoop_control) { 3993 vtd_spte_rsvd[1] &= ~VTD_SPTE_SNP; 3994 vtd_spte_rsvd_large[2] &= ~VTD_SPTE_SNP; 3995 vtd_spte_rsvd_large[3] &= ~VTD_SPTE_SNP; 3996 } 3997 | |
3998 if (x86_iommu_ir_supported(x86_iommu)) { 3999 s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV; 4000 if (s->intr_eim == ON_OFF_AUTO_ON) { 4001 s->ecap |= VTD_ECAP_EIM; 4002 } 4003 assert(s->intr_eim != ON_OFF_AUTO_AUTO); 4004 } 4005 --- 16 unchanged lines hidden (view full) --- 4022 4023 if (s->snoop_control) { 4024 s->ecap |= VTD_ECAP_SC; 4025 } 4026 4027 if (s->pasid) { 4028 s->ecap |= VTD_ECAP_PASID; 4029 } | 3957 if (x86_iommu_ir_supported(x86_iommu)) { 3958 s->ecap |= VTD_ECAP_IR | VTD_ECAP_MHMV; 3959 if (s->intr_eim == ON_OFF_AUTO_ON) { 3960 s->ecap |= VTD_ECAP_EIM; 3961 } 3962 assert(s->intr_eim != ON_OFF_AUTO_AUTO); 3963 } 3964 --- 16 unchanged lines hidden (view full) --- 3981 3982 if (s->snoop_control) { 3983 s->ecap |= VTD_ECAP_SC; 3984 } 3985 3986 if (s->pasid) { 3987 s->ecap |= VTD_ECAP_PASID; 3988 } |
3989} |
|
4030 | 3990 |
3991/* 3992 * Do the initialization. It will also be called when reset, so pay 3993 * attention when adding new initialization stuff. 3994 */ 3995static void vtd_init(IntelIOMMUState *s) 3996{ 3997 X86IOMMUState *x86_iommu = X86_IOMMU_DEVICE(s); 3998 3999 memset(s->csr, 0, DMAR_REG_SIZE); 4000 memset(s->wmask, 0, DMAR_REG_SIZE); 4001 memset(s->w1cmask, 0, DMAR_REG_SIZE); 4002 memset(s->womask, 0, DMAR_REG_SIZE); 4003 4004 s->root = 0; 4005 s->root_scalable = false; 4006 s->dmar_enabled = false; 4007 s->intr_enabled = false; 4008 s->iq_head = 0; 4009 s->iq_tail = 0; 4010 s->iq = 0; 4011 s->iq_size = 0; 4012 s->qi_enabled = false; 4013 s->iq_last_desc_type = VTD_INV_DESC_NONE; 4014 s->iq_dw = false; 4015 s->next_frcd_reg = 0; 4016 4017 vtd_cap_init(s); 4018 4019 /* 4020 * Rsvd field masks for spte 4021 */ 4022 vtd_spte_rsvd[0] = ~0ULL; 4023 vtd_spte_rsvd[1] = VTD_SPTE_PAGE_L1_RSVD_MASK(s->aw_bits, 4024 x86_iommu->dt_supported); 4025 vtd_spte_rsvd[2] = VTD_SPTE_PAGE_L2_RSVD_MASK(s->aw_bits); 4026 vtd_spte_rsvd[3] = VTD_SPTE_PAGE_L3_RSVD_MASK(s->aw_bits); 4027 vtd_spte_rsvd[4] = VTD_SPTE_PAGE_L4_RSVD_MASK(s->aw_bits); 4028 4029 vtd_spte_rsvd_large[2] = VTD_SPTE_LPAGE_L2_RSVD_MASK(s->aw_bits, 4030 x86_iommu->dt_supported); 4031 vtd_spte_rsvd_large[3] = VTD_SPTE_LPAGE_L3_RSVD_MASK(s->aw_bits, 4032 x86_iommu->dt_supported); 4033 4034 if (s->scalable_mode || s->snoop_control) { 4035 vtd_spte_rsvd[1] &= ~VTD_SPTE_SNP; 4036 vtd_spte_rsvd_large[2] &= ~VTD_SPTE_SNP; 4037 vtd_spte_rsvd_large[3] &= ~VTD_SPTE_SNP; 4038 } 4039 |
|
4031 vtd_reset_caches(s); 4032 4033 /* Define registers with default values and bit semantics */ 4034 vtd_define_long(s, DMAR_VER_REG, 0x10UL, 0, 0); 4035 vtd_define_quad(s, DMAR_CAP_REG, s->cap, 0, 0); 4036 vtd_define_quad(s, DMAR_ECAP_REG, s->ecap, 0, 0); 4037 vtd_define_long(s, DMAR_GCMD_REG, 0, 0xff800000UL, 0); 4038 vtd_define_long_wo(s, DMAR_GCMD_REG, 0xff800000UL); --- 244 unchanged lines hidden --- | 4040 vtd_reset_caches(s); 4041 4042 /* Define registers with default values and bit semantics */ 4043 vtd_define_long(s, DMAR_VER_REG, 0x10UL, 0, 0); 4044 vtd_define_quad(s, DMAR_CAP_REG, s->cap, 0, 0); 4045 vtd_define_quad(s, DMAR_ECAP_REG, s->ecap, 0, 0); 4046 vtd_define_long(s, DMAR_GCMD_REG, 0, 0xff800000UL, 0); 4047 vtd_define_long_wo(s, DMAR_GCMD_REG, 0xff800000UL); --- 244 unchanged lines hidden --- |