Commit 894901b5 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

Merge branch 'iommu/fixes' into arm/mediatek

parents 46cc815d 2926a2aa
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -4452,6 +4452,7 @@ static int amd_ir_set_vcpu_affinity(struct irq_data *data, void *vcpu_info)
		/* Setting */
		/* Setting */
		irte->hi.fields.ga_root_ptr = (pi_data->base >> 12);
		irte->hi.fields.ga_root_ptr = (pi_data->base >> 12);
		irte->hi.fields.vector = vcpu_pi_info->vector;
		irte->hi.fields.vector = vcpu_pi_info->vector;
		irte->lo.fields_vapic.ga_log_intr = 1;
		irte->lo.fields_vapic.guest_mode = 1;
		irte->lo.fields_vapic.guest_mode = 1;
		irte->lo.fields_vapic.ga_tag = pi_data->ga_tag;
		irte->lo.fields_vapic.ga_tag = pi_data->ga_tag;


+1 −1
Original line number Original line Diff line number Diff line
@@ -2440,11 +2440,11 @@ static int __init state_next(void)
		break;
		break;
	case IOMMU_ACPI_FINISHED:
	case IOMMU_ACPI_FINISHED:
		early_enable_iommus();
		early_enable_iommus();
		register_syscore_ops(&amd_iommu_syscore_ops);
		x86_platform.iommu_shutdown = disable_iommus;
		x86_platform.iommu_shutdown = disable_iommus;
		init_state = IOMMU_ENABLED;
		init_state = IOMMU_ENABLED;
		break;
		break;
	case IOMMU_ENABLED:
	case IOMMU_ENABLED:
		register_syscore_ops(&amd_iommu_syscore_ops);
		ret = amd_iommu_init_pci();
		ret = amd_iommu_init_pci();
		init_state = ret ? IOMMU_INIT_ERROR : IOMMU_PCI_INIT;
		init_state = ret ? IOMMU_INIT_ERROR : IOMMU_PCI_INIT;
		enable_iommus_v2();
		enable_iommus_v2();
+3 −1
Original line number Original line Diff line number Diff line
@@ -574,7 +574,9 @@ struct amd_iommu {


static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev)
static inline struct amd_iommu *dev_to_amd_iommu(struct device *dev)
{
{
	return container_of(dev, struct amd_iommu, iommu.dev);
	struct iommu_device *iommu = dev_to_iommu_device(dev);

	return container_of(iommu, struct amd_iommu, iommu);
}
}


#define ACPIHID_UID_LEN 256
#define ACPIHID_UID_LEN 256
+19 −4
Original line number Original line Diff line number Diff line
@@ -400,6 +400,8 @@ struct arm_smmu_device {


	u32				cavium_id_base; /* Specific to Cavium */
	u32				cavium_id_base; /* Specific to Cavium */


	spinlock_t			global_sync_lock;

	/* IOMMU core code handle */
	/* IOMMU core code handle */
	struct iommu_device		iommu;
	struct iommu_device		iommu;
};
};
@@ -436,7 +438,7 @@ struct arm_smmu_domain {
	struct arm_smmu_cfg		cfg;
	struct arm_smmu_cfg		cfg;
	enum arm_smmu_domain_stage	stage;
	enum arm_smmu_domain_stage	stage;
	struct mutex			init_mutex; /* Protects smmu pointer */
	struct mutex			init_mutex; /* Protects smmu pointer */
	spinlock_t			cb_lock; /* Serialises ATS1* ops */
	spinlock_t			cb_lock; /* Serialises ATS1* ops and TLB syncs */
	struct iommu_domain		domain;
	struct iommu_domain		domain;
};
};


@@ -602,9 +604,12 @@ static void __arm_smmu_tlb_sync(struct arm_smmu_device *smmu,
static void arm_smmu_tlb_sync_global(struct arm_smmu_device *smmu)
static void arm_smmu_tlb_sync_global(struct arm_smmu_device *smmu)
{
{
	void __iomem *base = ARM_SMMU_GR0(smmu);
	void __iomem *base = ARM_SMMU_GR0(smmu);
	unsigned long flags;


	spin_lock_irqsave(&smmu->global_sync_lock, flags);
	__arm_smmu_tlb_sync(smmu, base + ARM_SMMU_GR0_sTLBGSYNC,
	__arm_smmu_tlb_sync(smmu, base + ARM_SMMU_GR0_sTLBGSYNC,
			    base + ARM_SMMU_GR0_sTLBGSTATUS);
			    base + ARM_SMMU_GR0_sTLBGSTATUS);
	spin_unlock_irqrestore(&smmu->global_sync_lock, flags);
}
}


static void arm_smmu_tlb_sync_context(void *cookie)
static void arm_smmu_tlb_sync_context(void *cookie)
@@ -612,9 +617,12 @@ static void arm_smmu_tlb_sync_context(void *cookie)
	struct arm_smmu_domain *smmu_domain = cookie;
	struct arm_smmu_domain *smmu_domain = cookie;
	struct arm_smmu_device *smmu = smmu_domain->smmu;
	struct arm_smmu_device *smmu = smmu_domain->smmu;
	void __iomem *base = ARM_SMMU_CB(smmu, smmu_domain->cfg.cbndx);
	void __iomem *base = ARM_SMMU_CB(smmu, smmu_domain->cfg.cbndx);
	unsigned long flags;


	spin_lock_irqsave(&smmu_domain->cb_lock, flags);
	__arm_smmu_tlb_sync(smmu, base + ARM_SMMU_CB_TLBSYNC,
	__arm_smmu_tlb_sync(smmu, base + ARM_SMMU_CB_TLBSYNC,
			    base + ARM_SMMU_CB_TLBSTATUS);
			    base + ARM_SMMU_CB_TLBSTATUS);
	spin_unlock_irqrestore(&smmu_domain->cb_lock, flags);
}
}


static void arm_smmu_tlb_sync_vmid(void *cookie)
static void arm_smmu_tlb_sync_vmid(void *cookie)
@@ -1511,6 +1519,12 @@ static int arm_smmu_add_device(struct device *dev)


	if (using_legacy_binding) {
	if (using_legacy_binding) {
		ret = arm_smmu_register_legacy_master(dev, &smmu);
		ret = arm_smmu_register_legacy_master(dev, &smmu);

		/*
		 * If dev->iommu_fwspec is initally NULL, arm_smmu_register_legacy_master()
		 * will allocate/initialise a new one. Thus we need to update fwspec for
		 * later use.
		 */
		fwspec = dev->iommu_fwspec;
		fwspec = dev->iommu_fwspec;
		if (ret)
		if (ret)
			goto out_free;
			goto out_free;
@@ -1550,15 +1564,15 @@ static int arm_smmu_add_device(struct device *dev)


	ret = arm_smmu_master_alloc_smes(dev);
	ret = arm_smmu_master_alloc_smes(dev);
	if (ret)
	if (ret)
		goto out_free;
		goto out_cfg_free;


	iommu_device_link(&smmu->iommu, dev);
	iommu_device_link(&smmu->iommu, dev);


	return 0;
	return 0;


out_cfg_free:
	kfree(cfg);
out_free:
out_free:
	if (fwspec)
		kfree(fwspec->iommu_priv);
	iommu_fwspec_free(dev);
	iommu_fwspec_free(dev);
	return ret;
	return ret;
}
}
@@ -1925,6 +1939,7 @@ static int arm_smmu_device_cfg_probe(struct arm_smmu_device *smmu)


	smmu->num_mapping_groups = size;
	smmu->num_mapping_groups = size;
	mutex_init(&smmu->stream_map_mutex);
	mutex_init(&smmu->stream_map_mutex);
	spin_lock_init(&smmu->global_sync_lock);


	if (smmu->version < ARM_SMMU_V2 || !(id & ID0_PTFS_NO_AARCH32)) {
	if (smmu->version < ARM_SMMU_V2 || !(id & ID0_PTFS_NO_AARCH32)) {
		smmu->features |= ARM_SMMU_FEAT_FMT_AARCH32_L;
		smmu->features |= ARM_SMMU_FEAT_FMT_AARCH32_L;
+3 −1
Original line number Original line Diff line number Diff line
@@ -4736,7 +4736,9 @@ static void intel_disable_iommus(void)


static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev)
static inline struct intel_iommu *dev_to_intel_iommu(struct device *dev)
{
{
	return container_of(dev, struct intel_iommu, iommu.dev);
	struct iommu_device *iommu_dev = dev_to_iommu_device(dev);

	return container_of(iommu_dev, struct intel_iommu, iommu);
}
}


static ssize_t intel_iommu_show_version(struct device *dev,
static ssize_t intel_iommu_show_version(struct device *dev,
Loading