|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/9] AMD/IOMMU: use bit field for control register
On 13/06/2019 14:22, Jan Beulich wrote:
> Also introduce a field in struct amd_iommu caching the most recently
> written control register. All writes should now happen exclusively from
> that cached value, such that it is guaranteed to be up to date.
>
> Take the opportunity and add further fields. Also convert a few boolean
> function parameters to bool, such that use of !! can be avoided.
Critically also, some previous writel()'s have turned into writeq(),
which needs calling out.
> --- a/xen/drivers/passthrough/amd/iommu_init.c
> +++ b/xen/drivers/passthrough/amd/iommu_init.c
> @@ -69,31 +69,18 @@ static void __init unmap_iommu_mmio_regi
>
> static void set_iommu_ht_flags(struct amd_iommu *iommu)
> {
> - u32 entry;
> - entry = readl(iommu->mmio_base + IOMMU_CONTROL_MMIO_OFFSET);
> -
> /* Setup HT flags */
> if ( iommu_has_cap(iommu, PCI_CAP_HT_TUNNEL_SHIFT) )
> - iommu_has_ht_flag(iommu, ACPI_IVHD_TT_ENABLE) ?
> - iommu_set_bit(&entry, IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT)
> :
> - iommu_clear_bit(&entry,
> IOMMU_CONTROL_HT_TUNNEL_TRANSLATION_SHIFT);
> -
> - iommu_has_ht_flag(iommu, ACPI_IVHD_RES_PASS_PW) ?
> - iommu_set_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT):
> - iommu_clear_bit(&entry, IOMMU_CONTROL_RESP_PASS_POSTED_WRITE_SHIFT);
> -
> - iommu_has_ht_flag(iommu, ACPI_IVHD_ISOC) ?
> - iommu_set_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT):
> - iommu_clear_bit(&entry, IOMMU_CONTROL_ISOCHRONOUS_SHIFT);
> -
> - iommu_has_ht_flag(iommu, ACPI_IVHD_PASS_PW) ?
> - iommu_set_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT):
> - iommu_clear_bit(&entry, IOMMU_CONTROL_PASS_POSTED_WRITE_SHIFT);
> + iommu->ctrl.ht_tun_en = iommu_has_ht_flag(iommu,
> ACPI_IVHD_TT_ENABLE);
> +
> + iommu->ctrl.pass_pw = iommu_has_ht_flag(iommu, ACPI_IVHD_PASS_PW);
> + iommu->ctrl.res_pass_pw = iommu_has_ht_flag(iommu,
> ACPI_IVHD_RES_PASS_PW);
> + iommu->ctrl.isoc = iommu_has_ht_flag(iommu, ACPI_IVHD_ISOC);
>
> /* Force coherent */
> - iommu_set_bit(&entry, IOMMU_CONTROL_COHERENT_SHIFT);
> + iommu->ctrl.coherent = 1;
Ah - so this is the AMD version of Intel's iommu=snoop
> --- a/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
> +++ b/xen/include/asm-x86/hvm/svm/amd-iommu-defs.h
> @@ -295,38 +295,55 @@ struct amd_iommu_dte {
>
> +union amd_iommu_control {
> + uint64_t raw;
> + struct {
> + unsigned int iommu_en:1;
> + unsigned int ht_tun_en:1;
> + unsigned int event_log_en:1;
> + unsigned int event_int_en:1;
> + unsigned int com_wait_int_en:1;
> + unsigned int inv_timeout:3;
> + unsigned int pass_pw:1;
> + unsigned int res_pass_pw:1;
> + unsigned int coherent:1;
> + unsigned int isoc:1;
> + unsigned int cmd_buf_en:1;
> + unsigned int ppr_log_en:1;
> + unsigned int ppr_int_en:1;
> + unsigned int ppr_en:1;
> + unsigned int gt_en:1;
> + unsigned int ga_en:1;
> + unsigned int crw:4;
This field does have an assigned name, but is also documented as Res0
for forwards compatibility. I think this field wants handling
consistently with...
> + unsigned int smif_en:1;
> + unsigned int slf_wb_dis:1;
> + unsigned int smif_log_en:1;
> + unsigned int gam_en:3;
> + unsigned int ga_log_en:1;
> + unsigned int ga_int_en:1;
> + unsigned int dual_ppr_log_en:2;
> + unsigned int dual_event_log_en:2;
> + unsigned int dev_tbl_seg_en:3;
> + unsigned int priv_abrt_en:2;
> + unsigned int ppr_auto_rsp_en:1;
> + unsigned int marc_en:1;
> + unsigned int blk_stop_mrk_en:1;
> + unsigned int ppr_auto_rsp_aon:1;
> + unsigned int :2;
... this, where you have dropped the DomainIDPNE bit (whatever the PN
stands for).
~Andrew
> + unsigned int eph_en:1;
> + unsigned int had_update:2;
> + unsigned int gd_update_dis:1;
> + unsigned int :1;
> + unsigned int xt_en:1;
> + unsigned int int_cap_xt_en:1;
> + unsigned int vcmd_en:1;
> + unsigned int viommu_en:1;
> + unsigned int ga_update_dis:1;
> + unsigned int gappi_en:1;
> + unsigned int :8;
> + };
> +};
>
> /* Exclusion Register */
> #define IOMMU_EXCLUSION_BASE_LOW_OFFSET 0x20
>
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |