All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <5450A9D8.108@linux.intel.com>

diff --git a/a/1.txt b/N1/1.txt
index bd61d0e..8ae1320 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -59,3 +59,495 @@ to find a solution:)
 
 Regards!
 Gerry
+
+-------------- next part --------------
+diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
+index 68d6dfcf7d92..97dec9eadef3 100644
+--- a/arch/x86/include/asm/irq_remapping.h
++++ b/arch/x86/include/asm/irq_remapping.h
+@@ -63,8 +63,6 @@ extern struct irq_domain *irq_remapping_get_irq_domain(
+ 				struct irq_alloc_info *info);
+ extern int irq_remapping_get_ioapic_entry(struct irq_data *irq_data,
+ 					  struct IR_IO_APIC_route_entry *entry);
+-extern int irq_remapping_get_msi_entry(struct irq_data *irq_data,
+-				       struct msi_msg *entry);
+ extern void irq_remapping_print_chip(struct irq_data *data, struct seq_file *p);
+ 
+ /*
+@@ -142,12 +140,6 @@ static inline int irq_remapping_get_ioapic_entry(struct irq_data *irq_data,
+ 	return -ENOSYS;
+ }
+ 
+-static inline int irq_remapping_get_msi_entry(struct irq_data *irq_data,
+-					      struct msi_msg *entry)
+-{
+-	return -ENOSYS;
+-}
+-
+ static inline void irq_remapping_domain_set_remapped(struct irq_domain *domain)
+ {
+ }
+diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
+index bd4275038436..0519ab3e43fb 100644
+--- a/arch/x86/kernel/apic/msi.c
++++ b/arch/x86/kernel/apic/msi.c
+@@ -35,8 +35,10 @@ static void msi_reset_irq_data_and_handler(struct irq_domain *domain, int virq)
+ 	irq_set_handler(virq, NULL);
+ }
+ 
+-static void native_compose_msi_msg(struct irq_cfg *cfg, struct msi_msg *msg)
++static int msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
+ {
++	struct irq_cfg *cfg = irqd_cfg(data);
++
+ 	msg->address_hi = MSI_ADDR_BASE_HI;
+ 
+ 	if (x2apic_enabled())
+@@ -59,6 +61,8 @@ static void native_compose_msi_msg(struct irq_cfg *cfg, struct msi_msg *msg)
+ 			MSI_DATA_DELIVERY_FIXED :
+ 			MSI_DATA_DELIVERY_LOWPRI) |
+ 		MSI_DATA_VECTOR(cfg->vector);
++
++	return 0;
+ }
+ 
+ static void msi_update_msg(struct msi_msg *msg, struct irq_data *irq_data)
+@@ -74,11 +78,6 @@ static void msi_update_msg(struct msi_msg *msg, struct irq_data *irq_data)
+ 				  MSI_ADDR_EXT_DEST_ID(cfg->dest_apicid);
+ }
+ 
+-static bool msi_irq_remapped(struct irq_data *irq_data)
+-{
+-	return irq_remapping_domain_is_remapped(irq_data->domain);
+-}
+-
+ static int msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
+ 			    bool force)
+ {
+@@ -86,8 +85,7 @@ static int msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
+ 	int ret;
+ 
+ 	ret = parent->chip->irq_set_affinity(parent, mask, force);
+-	/* No need to reprogram MSI registers if interrupt is remapped */
+-	if (ret >= 0 && !msi_irq_remapped(data)) {
++	if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE) {
+ 		struct msi_msg msg;
+ 
+ 		__get_cached_msi_msg(data->msi_desc, &msg);
+@@ -110,6 +108,7 @@ static struct irq_chip msi_chip = {
+ 	.irq_set_affinity	= msi_set_affinity,
+ 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
+ 	.irq_print_chip		= irq_remapping_print_chip,
++	.irq_compose_msi_msg	= msi_compose_msg,
+  	.flags			= IRQCHIP_SKIP_SET_WAKE,
+ };
+ 
+@@ -164,8 +163,8 @@ static void msi_domain_free(struct irq_domain *domain, unsigned int virq,
+ static int msi_domain_activate(struct irq_domain *domain,
+ 			       struct irq_data *irq_data)
+ {
++	int ret;
+ 	struct msi_msg msg;
+-	struct irq_cfg *cfg = irqd_cfg(irq_data);
+ 
+ 	/*
+ 	 * irq_data->chip_data is MSI/MSIx offset.
+@@ -175,13 +174,11 @@ static int msi_domain_activate(struct irq_domain *domain,
+ 	if (irq_data->chip_data)
+ 		return 0;
+ 
+-	if (msi_irq_remapped(irq_data))
+-		irq_remapping_get_msi_entry(irq_data->parent_data, &msg);
+-	else
+-		native_compose_msi_msg(cfg, &msg);
+-	write_msi_msg(irq_data->irq, &msg);
++	ret = irq_chip_compose_msi_msg(irq_data, &msg);
++	if (ret == 0)
++		write_msi_msg(irq_data->irq, &msg);
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static int msi_domain_deactivate(struct irq_domain *domain,
+@@ -268,17 +265,13 @@ void native_teardown_msi_irq(unsigned int irq)
+ 	irq_domain_free_irqs(irq, 1);
+ }
+ 
+-static struct irq_domain *msi_create_domain(struct irq_domain *parent,
+-					    bool remapped)
++static struct irq_domain *msi_create_domain(struct irq_domain *parent)
+ {
+ 	struct irq_domain *domain;
+ 
+ 	domain = irq_domain_add_tree(NULL, &msi_domain_ops, NULL);
+-	if (domain) {
++	if (domain)
+ 		domain->parent = parent;
+-		if (remapped)
+-			irq_remapping_domain_set_remapped(domain);
+-	}
+ 
+ 	return domain;
+ }
+@@ -288,7 +281,7 @@ void arch_init_msi_domain(struct irq_domain *parent)
+ 	if (disable_apic)
+ 		return;
+ 
+-	msi_default_domain = msi_create_domain(parent, false);
++	msi_default_domain = msi_create_domain(parent);
+ 	if (!msi_default_domain)
+ 		pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n");
+ }
+@@ -296,7 +289,7 @@ void arch_init_msi_domain(struct irq_domain *parent)
+ #ifdef CONFIG_IRQ_REMAP
+ struct irq_domain *arch_create_msi_irq_domain(struct irq_domain *parent)
+ {
+-	return msi_create_domain(parent, true);
++	return msi_create_domain(parent);
+ }
+ #endif
+ 
+@@ -326,6 +319,7 @@ static struct irq_chip dmar_msi_type = {
+ 	.irq_ack		= irq_chip_ack_parent,
+ 	.irq_set_affinity	= dmar_msi_set_affinity,
+ 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
++	.irq_compose_msi_msg	= msi_compose_msg,
+  	.flags			= IRQCHIP_SKIP_SET_WAKE,
+ };
+ 
+@@ -364,12 +358,14 @@ static void dmar_domain_free(struct irq_domain *domain, unsigned int virq,
+ static int dmar_domain_activate(struct irq_domain *domain,
+ 				struct irq_data *irq_data)
+ {
++	int ret;
+ 	struct msi_msg msg;
+ 
+-	native_compose_msi_msg(irqd_cfg(irq_data), &msg);
+-	dmar_msi_write(irq_data->irq, &msg);
++	ret = irq_chip_compose_msi_msg(irq_data, &msg);
++	if (ret == 0)
++		dmar_msi_write(irq_data->irq, &msg);
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static int dmar_domain_deactivate(struct irq_domain *domain,
+@@ -445,8 +441,7 @@ static int hpet_msi_set_affinity(struct irq_data *data,
+ 	int ret;
+ 
+ 	ret = parent->chip->irq_set_affinity(parent, mask, force);
+-	/* No need to rewrite HPET registers if interrupt is remapped */
+-	if (ret >= 0 && !msi_irq_remapped(data)) {
++	if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE) {
+ 		hpet_msi_read(data->handler_data, &msg);
+ 		msi_update_msg(&msg, data);
+ 		hpet_msi_write(data->handler_data, &msg);
+@@ -463,6 +458,7 @@ static struct irq_chip hpet_msi_type = {
+ 	.irq_set_affinity = hpet_msi_set_affinity,
+ 	.irq_retrigger = irq_chip_retrigger_hierarchy,
+ 	.irq_print_chip = irq_remapping_print_chip,
++	.irq_compose_msi_msg = msi_compose_msg,
+  	.flags = IRQCHIP_SKIP_SET_WAKE,
+ };
+ 
+@@ -503,16 +499,14 @@ static void hpet_domain_free(struct irq_domain *domain, unsigned int virq,
+ static int hpet_domain_activate(struct irq_domain *domain,
+ 				struct irq_data *irq_data)
+ {
++	int ret;
+ 	struct msi_msg msg;
+-	struct irq_cfg *cfg = irqd_cfg(irq_data);
+ 
+-	if (msi_irq_remapped(irq_data))
+-		irq_remapping_get_msi_entry(irq_data->parent_data, &msg);
+-	else
+-		native_compose_msi_msg(cfg, &msg);
+-	hpet_msi_write(irq_get_handler_data(irq_data->irq), &msg);
++	ret = irq_chip_compose_msi_msg(irq_data, &msg);
++	if (ret == 0)
++		hpet_msi_write(irq_get_handler_data(irq_data->irq), &msg);
+ 
+-	return 0;
++	return ret;
+ }
+ 
+ static int hpet_domain_deactivate(struct irq_domain *domain,
+@@ -535,27 +529,22 @@ static struct irq_domain_ops hpet_domain_ops = {
+ 
+ struct irq_domain *hpet_create_irq_domain(int hpet_id)
+ {
+-	struct irq_domain *parent, *domain;
++	struct irq_domain *domain;
+ 	struct irq_alloc_info info;
+-	bool remapped = false;
++
++	if (x86_vector_domain == NULL)
++		return NULL;
+ 
+ 	init_irq_alloc_info(&info, NULL);
+ 	info.type = X86_IRQ_ALLOC_TYPE_HPET;
+ 	info.hpet_id = hpet_id;
+-	parent = irq_remapping_get_ir_irq_domain(&info);
+-	if (parent)
+-		remapped = true;
+-	else
+-		parent = x86_vector_domain;
+-	if (!parent)
+-		return NULL;
+ 
+ 	domain = irq_domain_add_tree(NULL, &hpet_domain_ops,
+ 				     (void *)(long)hpet_id);
+ 	if (domain) {
+-		domain->parent = parent;
+-		if (remapped)
+-			irq_remapping_domain_set_remapped(domain);
++		domain->parent = irq_remapping_get_ir_irq_domain(&info);
++		if (!domain->parent)
++			domain->parent = x86_vector_domain;
+ 	}
+ 
+ 	return domain;
+diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
+index 0b648772c221..8fcd1497b109 100644
+--- a/drivers/iommu/amd_iommu.c
++++ b/drivers/iommu/amd_iommu.c
+@@ -4260,15 +4260,6 @@ static int get_ioapic_entry(struct irq_data *irq_data,
+ 	return 0;
+ }
+ 
+-static int get_msi_entry(struct irq_data *irq_data, struct msi_msg *msg)
+-{
+-	struct amd_ir_data *ir_data = irq_data->chip_data;
+-
+-	*msg = ir_data->msi_entry;
+-
+-	return 0;
+-}
+-
+ struct irq_remap_ops amd_iommu_irq_ops = {
+ 	.supported		= amd_iommu_supported,
+ 	.prepare		= amd_iommu_prepare,
+@@ -4282,7 +4273,6 @@ struct irq_remap_ops amd_iommu_irq_ops = {
+ 	.get_ir_irq_domain	= get_ir_irq_domain,
+ 	.get_irq_domain		= get_irq_domain,
+ 	.get_ioapic_entry	= get_ioapic_entry,
+-	.get_msi_entry		= get_msi_entry,
+ };
+ 
+ static void irq_remapping_prepare_irte(struct amd_ir_data *data,
+@@ -4475,7 +4465,7 @@ static int amd_ir_set_affinity(struct irq_data *data,
+ 	int ret;
+ 
+ 	ret = parent->chip->irq_set_affinity(parent, mask, force);
+-	if (ret < 0)
++	if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE)
+ 		return ret;
+ 
+ 	/*
+@@ -4494,12 +4484,22 @@ static int amd_ir_set_affinity(struct irq_data *data,
+ 	if (cfg->move_in_progress)
+ 		send_cleanup_vector(cfg);
+ 
+-	return ret;
++	return IRQ_SET_MASK_OK_DONE;
++}
++
++static int compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
++{
++	struct amd_ir_data *ir_data = irq_data->chip_data;
++
++	*msg = ir_data->msi_entry;
++
++	return 0;
+ }
+ 
+ static struct irq_chip amd_ir_chip = {
+ 	.irq_ack = ir_ack_apic_edge,
+ 	.irq_set_affinity = amd_ir_set_affinity,
++	.irq_compose_msi_msg = compose_msi_msg,
+ };
+ 
+ int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
+diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
+index 9742011190fb..e2ea4eccf9c9 100644
+--- a/drivers/iommu/intel_irq_remapping.c
++++ b/drivers/iommu/intel_irq_remapping.c
+@@ -1029,6 +1029,7 @@ intel_ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
+ 		send_cleanup_vector(cfg);
+ 
+ 	cpumask_copy(data->affinity, mask);
++
+ 	return 0;
+ }
+ 
+@@ -1089,15 +1090,6 @@ static int intel_get_ioapic_entry(struct irq_data *irq_data,
+ 	return 0;
+ }
+ 
+-static int intel_get_msi_entry(struct irq_data *irq_data, struct msi_msg *msg)
+-{
+-	struct intel_ir_data *ir_data = irq_data->chip_data;
+-
+-	*msg = ir_data->msi_entry;
+-
+-	return 0;
+-}
+-
+ struct irq_remap_ops intel_irq_remap_ops = {
+ 	.supported		= intel_irq_remapping_supported,
+ 	.prepare		= dmar_table_init,
+@@ -1111,7 +1103,6 @@ struct irq_remap_ops intel_irq_remap_ops = {
+ 	.get_ir_irq_domain	= intel_get_ir_irq_domain,
+ 	.get_irq_domain		= intel_get_irq_domain,
+ 	.get_ioapic_entry	= intel_get_ioapic_entry,
+-	.get_msi_entry		= intel_get_msi_entry,
+ };
+ 
+ /*
+@@ -1139,7 +1130,7 @@ intel_ir_set_affinity(struct irq_data *data, const struct cpumask *mask,
+ 	int ret;
+ 
+ 	ret = parent->chip->irq_set_affinity(parent, mask, force);
+-	if (ret < 0)
++	if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE)
+ 		return ret;
+ 
+ 	/*
+@@ -1158,12 +1149,22 @@ intel_ir_set_affinity(struct irq_data *data, const struct cpumask *mask,
+ 	if (cfg->move_in_progress)
+ 		send_cleanup_vector(cfg);
+ 
+-	return ret;
++	return IRQ_SET_MASK_OK_DONE;
++}
++
++static int intel_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
++{
++	struct intel_ir_data *ir_data = irq_data->chip_data;
++
++	*msg = ir_data->msi_entry;
++
++	return 0;
+ }
+ 
+ static struct irq_chip intel_ir_chip = {
+ 	.irq_ack = ir_ack_apic_edge,
+ 	.irq_set_affinity = intel_ir_set_affinity,
++	.irq_compose_msi_msg = intel_compose_msi_msg,
+ };
+ 
+ static void intel_irq_remapping_prepare_irte(struct intel_ir_data *data,
+diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
+index 8fabc1d05f93..aa0cacc1486a 100644
+--- a/drivers/iommu/irq_remapping.c
++++ b/drivers/iommu/irq_remapping.c
+@@ -310,18 +310,3 @@ int irq_remapping_get_ioapic_entry(struct irq_data *irq_data,
+ {
+ 	return remap_ops->get_ioapic_entry(irq_data, entry);
+ }
+-
+-/**
+- * irq_remapping_get_ioapic_entry - Get MSI data rewritten by interrupt
+- *				    remapping driver
+- * @irq_data: irq_data associated with interrupt remapping irqdomain
+- * @entry: host returned data
+- *
+- * Caller must make sure that the interrupt is remapped.
+- * Return 0 on success, otherwise return error code
+- */
+-int irq_remapping_get_msi_entry(struct irq_data *irq_data,
+-				struct msi_msg *entry)
+-{
+-	return remap_ops->get_msi_entry(irq_data, entry);
+-}
+diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
+index b01a51ed1780..df73f010c326 100644
+--- a/drivers/iommu/irq_remapping.h
++++ b/drivers/iommu/irq_remapping.h
+@@ -79,9 +79,6 @@ struct irq_remap_ops {
+ 	/* Get IOAPIC entry content rewritten by interrupt remapping driver */
+ 	int (*get_ioapic_entry)(struct irq_data *,
+ 				struct IR_IO_APIC_route_entry *);
+-
+-	/*  Get MSI data rewritten by interrupt remapping driver */
+-	int (*get_msi_entry)(struct irq_data *, struct msi_msg *);
+ };
+ 
+ extern struct irq_remap_ops intel_irq_remap_ops;
+diff --git a/include/linux/irq.h b/include/linux/irq.h
+index 0adcbbbf2e87..226449317b78 100644
+--- a/include/linux/irq.h
++++ b/include/linux/irq.h
+@@ -113,10 +113,14 @@ enum {
+  *
+  * IRQ_SET_MASK_OK	- OK, core updates irq_data.affinity
+  * IRQ_SET_MASK_NOCPY	- OK, chip did update irq_data.affinity
++ * IRQ_SET_MASK_OK_DONE	- Same as IRQ_SET_MASK_OK for core. Special code to
++ *			  support stacked irqchips, which indicates skipping
++ *			  all descendent irqchips.
+  */
+ enum {
+ 	IRQ_SET_MASK_OK = 0,
+ 	IRQ_SET_MASK_OK_NOCOPY,
++	IRQ_SET_MASK_OK_DONE,
+ };
+ 
+ struct msi_desc;
+@@ -356,6 +360,8 @@ struct irq_chip {
+ 	int		(*irq_request_resources)(struct irq_data *data);
+ 	void		(*irq_release_resources)(struct irq_data *data);
+ 
++	int		(*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg);
++
+ 	unsigned long	flags;
+ };
+ 
+@@ -443,6 +449,7 @@ extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
+ extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
+ extern void handle_nested_irq(unsigned int irq);
+ 
++extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
+ #ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
+ extern void irq_chip_ack_parent(struct irq_data *data);
+ extern int irq_chip_retrigger_hierarchy(struct irq_data *data);
+diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
+index 12f3e72449eb..50cbbff7e27f 100644
+--- a/kernel/irq/chip.c
++++ b/kernel/irq/chip.c
+@@ -867,3 +867,15 @@ int irq_chip_retrigger_hierarchy(struct irq_data *data)
+ 	return -ENOSYS;
+ }
+ #endif
++
++int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
++{
++	int ret = -ENOSYS;
++
++	if (data->parent_data)
++		ret = irq_chip_compose_msi_msg(data->parent_data, msg);
++	if (ret == -ENOSYS && data->chip && data->chip->irq_compose_msi_msg)
++		ret = data->chip->irq_compose_msi_msg(data, msg);
++
++	return ret;
++}
+diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
+index 0a9104b4608b..80692373abd6 100644
+--- a/kernel/irq/manage.c
++++ b/kernel/irq/manage.c
+@@ -183,6 +183,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
+ 	ret = chip->irq_set_affinity(data, mask, force);
+ 	switch (ret) {
+ 	case IRQ_SET_MASK_OK:
++	case IRQ_SET_MASK_OK_DONE:
+ 		cpumask_copy(data->affinity, mask);
+ 	case IRQ_SET_MASK_OK_NOCOPY:
+ 		irq_set_thread_affinity(desc);
+@@ -600,6 +601,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
+ 
+ 	switch (ret) {
+ 	case IRQ_SET_MASK_OK:
++	case IRQ_SET_MASK_OK_DONE:
+ 		irqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK);
+ 		irqd_set(&desc->irq_data, flags);
diff --git a/a/2.hdr b/a/2.hdr
deleted file mode 100644
index d7669df..0000000
--- a/a/2.hdr
+++ /dev/null
@@ -1,5 +0,0 @@
-Content-Type: text/plain; charset=gb18030;
- name="tmp2.patch"
-Content-Transfer-Encoding: 7bit
-Content-Disposition: attachment;
- filename="tmp2.patch"
diff --git a/a/2.txt b/a/2.txt
deleted file mode 100644
index 2f7828a..0000000
--- a/a/2.txt
+++ /dev/null
@@ -1,490 +0,0 @@
-diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
-index 68d6dfcf7d92..97dec9eadef3 100644
---- a/arch/x86/include/asm/irq_remapping.h
-+++ b/arch/x86/include/asm/irq_remapping.h
-@@ -63,8 +63,6 @@ extern struct irq_domain *irq_remapping_get_irq_domain(
- 				struct irq_alloc_info *info);
- extern int irq_remapping_get_ioapic_entry(struct irq_data *irq_data,
- 					  struct IR_IO_APIC_route_entry *entry);
--extern int irq_remapping_get_msi_entry(struct irq_data *irq_data,
--				       struct msi_msg *entry);
- extern void irq_remapping_print_chip(struct irq_data *data, struct seq_file *p);
- 
- /*
-@@ -142,12 +140,6 @@ static inline int irq_remapping_get_ioapic_entry(struct irq_data *irq_data,
- 	return -ENOSYS;
- }
- 
--static inline int irq_remapping_get_msi_entry(struct irq_data *irq_data,
--					      struct msi_msg *entry)
--{
--	return -ENOSYS;
--}
--
- static inline void irq_remapping_domain_set_remapped(struct irq_domain *domain)
- {
- }
-diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
-index bd4275038436..0519ab3e43fb 100644
---- a/arch/x86/kernel/apic/msi.c
-+++ b/arch/x86/kernel/apic/msi.c
-@@ -35,8 +35,10 @@ static void msi_reset_irq_data_and_handler(struct irq_domain *domain, int virq)
- 	irq_set_handler(virq, NULL);
- }
- 
--static void native_compose_msi_msg(struct irq_cfg *cfg, struct msi_msg *msg)
-+static int msi_compose_msg(struct irq_data *data, struct msi_msg *msg)
- {
-+	struct irq_cfg *cfg = irqd_cfg(data);
-+
- 	msg->address_hi = MSI_ADDR_BASE_HI;
- 
- 	if (x2apic_enabled())
-@@ -59,6 +61,8 @@ static void native_compose_msi_msg(struct irq_cfg *cfg, struct msi_msg *msg)
- 			MSI_DATA_DELIVERY_FIXED :
- 			MSI_DATA_DELIVERY_LOWPRI) |
- 		MSI_DATA_VECTOR(cfg->vector);
-+
-+	return 0;
- }
- 
- static void msi_update_msg(struct msi_msg *msg, struct irq_data *irq_data)
-@@ -74,11 +78,6 @@ static void msi_update_msg(struct msi_msg *msg, struct irq_data *irq_data)
- 				  MSI_ADDR_EXT_DEST_ID(cfg->dest_apicid);
- }
- 
--static bool msi_irq_remapped(struct irq_data *irq_data)
--{
--	return irq_remapping_domain_is_remapped(irq_data->domain);
--}
--
- static int msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
- 			    bool force)
- {
-@@ -86,8 +85,7 @@ static int msi_set_affinity(struct irq_data *data, const struct cpumask *mask,
- 	int ret;
- 
- 	ret = parent->chip->irq_set_affinity(parent, mask, force);
--	/* No need to reprogram MSI registers if interrupt is remapped */
--	if (ret >= 0 && !msi_irq_remapped(data)) {
-+	if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE) {
- 		struct msi_msg msg;
- 
- 		__get_cached_msi_msg(data->msi_desc, &msg);
-@@ -110,6 +108,7 @@ static struct irq_chip msi_chip = {
- 	.irq_set_affinity	= msi_set_affinity,
- 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
- 	.irq_print_chip		= irq_remapping_print_chip,
-+	.irq_compose_msi_msg	= msi_compose_msg,
-  	.flags			= IRQCHIP_SKIP_SET_WAKE,
- };
- 
-@@ -164,8 +163,8 @@ static void msi_domain_free(struct irq_domain *domain, unsigned int virq,
- static int msi_domain_activate(struct irq_domain *domain,
- 			       struct irq_data *irq_data)
- {
-+	int ret;
- 	struct msi_msg msg;
--	struct irq_cfg *cfg = irqd_cfg(irq_data);
- 
- 	/*
- 	 * irq_data->chip_data is MSI/MSIx offset.
-@@ -175,13 +174,11 @@ static int msi_domain_activate(struct irq_domain *domain,
- 	if (irq_data->chip_data)
- 		return 0;
- 
--	if (msi_irq_remapped(irq_data))
--		irq_remapping_get_msi_entry(irq_data->parent_data, &msg);
--	else
--		native_compose_msi_msg(cfg, &msg);
--	write_msi_msg(irq_data->irq, &msg);
-+	ret = irq_chip_compose_msi_msg(irq_data, &msg);
-+	if (ret == 0)
-+		write_msi_msg(irq_data->irq, &msg);
- 
--	return 0;
-+	return ret;
- }
- 
- static int msi_domain_deactivate(struct irq_domain *domain,
-@@ -268,17 +265,13 @@ void native_teardown_msi_irq(unsigned int irq)
- 	irq_domain_free_irqs(irq, 1);
- }
- 
--static struct irq_domain *msi_create_domain(struct irq_domain *parent,
--					    bool remapped)
-+static struct irq_domain *msi_create_domain(struct irq_domain *parent)
- {
- 	struct irq_domain *domain;
- 
- 	domain = irq_domain_add_tree(NULL, &msi_domain_ops, NULL);
--	if (domain) {
-+	if (domain)
- 		domain->parent = parent;
--		if (remapped)
--			irq_remapping_domain_set_remapped(domain);
--	}
- 
- 	return domain;
- }
-@@ -288,7 +281,7 @@ void arch_init_msi_domain(struct irq_domain *parent)
- 	if (disable_apic)
- 		return;
- 
--	msi_default_domain = msi_create_domain(parent, false);
-+	msi_default_domain = msi_create_domain(parent);
- 	if (!msi_default_domain)
- 		pr_warn("failed to initialize irqdomain for MSI/MSI-x.\n");
- }
-@@ -296,7 +289,7 @@ void arch_init_msi_domain(struct irq_domain *parent)
- #ifdef CONFIG_IRQ_REMAP
- struct irq_domain *arch_create_msi_irq_domain(struct irq_domain *parent)
- {
--	return msi_create_domain(parent, true);
-+	return msi_create_domain(parent);
- }
- #endif
- 
-@@ -326,6 +319,7 @@ static struct irq_chip dmar_msi_type = {
- 	.irq_ack		= irq_chip_ack_parent,
- 	.irq_set_affinity	= dmar_msi_set_affinity,
- 	.irq_retrigger		= irq_chip_retrigger_hierarchy,
-+	.irq_compose_msi_msg	= msi_compose_msg,
-  	.flags			= IRQCHIP_SKIP_SET_WAKE,
- };
- 
-@@ -364,12 +358,14 @@ static void dmar_domain_free(struct irq_domain *domain, unsigned int virq,
- static int dmar_domain_activate(struct irq_domain *domain,
- 				struct irq_data *irq_data)
- {
-+	int ret;
- 	struct msi_msg msg;
- 
--	native_compose_msi_msg(irqd_cfg(irq_data), &msg);
--	dmar_msi_write(irq_data->irq, &msg);
-+	ret = irq_chip_compose_msi_msg(irq_data, &msg);
-+	if (ret == 0)
-+		dmar_msi_write(irq_data->irq, &msg);
- 
--	return 0;
-+	return ret;
- }
- 
- static int dmar_domain_deactivate(struct irq_domain *domain,
-@@ -445,8 +441,7 @@ static int hpet_msi_set_affinity(struct irq_data *data,
- 	int ret;
- 
- 	ret = parent->chip->irq_set_affinity(parent, mask, force);
--	/* No need to rewrite HPET registers if interrupt is remapped */
--	if (ret >= 0 && !msi_irq_remapped(data)) {
-+	if (ret >= 0 && ret != IRQ_SET_MASK_OK_DONE) {
- 		hpet_msi_read(data->handler_data, &msg);
- 		msi_update_msg(&msg, data);
- 		hpet_msi_write(data->handler_data, &msg);
-@@ -463,6 +458,7 @@ static struct irq_chip hpet_msi_type = {
- 	.irq_set_affinity = hpet_msi_set_affinity,
- 	.irq_retrigger = irq_chip_retrigger_hierarchy,
- 	.irq_print_chip = irq_remapping_print_chip,
-+	.irq_compose_msi_msg = msi_compose_msg,
-  	.flags = IRQCHIP_SKIP_SET_WAKE,
- };
- 
-@@ -503,16 +499,14 @@ static void hpet_domain_free(struct irq_domain *domain, unsigned int virq,
- static int hpet_domain_activate(struct irq_domain *domain,
- 				struct irq_data *irq_data)
- {
-+	int ret;
- 	struct msi_msg msg;
--	struct irq_cfg *cfg = irqd_cfg(irq_data);
- 
--	if (msi_irq_remapped(irq_data))
--		irq_remapping_get_msi_entry(irq_data->parent_data, &msg);
--	else
--		native_compose_msi_msg(cfg, &msg);
--	hpet_msi_write(irq_get_handler_data(irq_data->irq), &msg);
-+	ret = irq_chip_compose_msi_msg(irq_data, &msg);
-+	if (ret == 0)
-+		hpet_msi_write(irq_get_handler_data(irq_data->irq), &msg);
- 
--	return 0;
-+	return ret;
- }
- 
- static int hpet_domain_deactivate(struct irq_domain *domain,
-@@ -535,27 +529,22 @@ static struct irq_domain_ops hpet_domain_ops = {
- 
- struct irq_domain *hpet_create_irq_domain(int hpet_id)
- {
--	struct irq_domain *parent, *domain;
-+	struct irq_domain *domain;
- 	struct irq_alloc_info info;
--	bool remapped = false;
-+
-+	if (x86_vector_domain == NULL)
-+		return NULL;
- 
- 	init_irq_alloc_info(&info, NULL);
- 	info.type = X86_IRQ_ALLOC_TYPE_HPET;
- 	info.hpet_id = hpet_id;
--	parent = irq_remapping_get_ir_irq_domain(&info);
--	if (parent)
--		remapped = true;
--	else
--		parent = x86_vector_domain;
--	if (!parent)
--		return NULL;
- 
- 	domain = irq_domain_add_tree(NULL, &hpet_domain_ops,
- 				     (void *)(long)hpet_id);
- 	if (domain) {
--		domain->parent = parent;
--		if (remapped)
--			irq_remapping_domain_set_remapped(domain);
-+		domain->parent = irq_remapping_get_ir_irq_domain(&info);
-+		if (!domain->parent)
-+			domain->parent = x86_vector_domain;
- 	}
- 
- 	return domain;
-diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
-index 0b648772c221..8fcd1497b109 100644
---- a/drivers/iommu/amd_iommu.c
-+++ b/drivers/iommu/amd_iommu.c
-@@ -4260,15 +4260,6 @@ static int get_ioapic_entry(struct irq_data *irq_data,
- 	return 0;
- }
- 
--static int get_msi_entry(struct irq_data *irq_data, struct msi_msg *msg)
--{
--	struct amd_ir_data *ir_data = irq_data->chip_data;
--
--	*msg = ir_data->msi_entry;
--
--	return 0;
--}
--
- struct irq_remap_ops amd_iommu_irq_ops = {
- 	.supported		= amd_iommu_supported,
- 	.prepare		= amd_iommu_prepare,
-@@ -4282,7 +4273,6 @@ struct irq_remap_ops amd_iommu_irq_ops = {
- 	.get_ir_irq_domain	= get_ir_irq_domain,
- 	.get_irq_domain		= get_irq_domain,
- 	.get_ioapic_entry	= get_ioapic_entry,
--	.get_msi_entry		= get_msi_entry,
- };
- 
- static void irq_remapping_prepare_irte(struct amd_ir_data *data,
-@@ -4475,7 +4465,7 @@ static int amd_ir_set_affinity(struct irq_data *data,
- 	int ret;
- 
- 	ret = parent->chip->irq_set_affinity(parent, mask, force);
--	if (ret < 0)
-+	if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE)
- 		return ret;
- 
- 	/*
-@@ -4494,12 +4484,22 @@ static int amd_ir_set_affinity(struct irq_data *data,
- 	if (cfg->move_in_progress)
- 		send_cleanup_vector(cfg);
- 
--	return ret;
-+	return IRQ_SET_MASK_OK_DONE;
-+}
-+
-+static int compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
-+{
-+	struct amd_ir_data *ir_data = irq_data->chip_data;
-+
-+	*msg = ir_data->msi_entry;
-+
-+	return 0;
- }
- 
- static struct irq_chip amd_ir_chip = {
- 	.irq_ack = ir_ack_apic_edge,
- 	.irq_set_affinity = amd_ir_set_affinity,
-+	.irq_compose_msi_msg = compose_msi_msg,
- };
- 
- int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
-diff --git a/drivers/iommu/intel_irq_remapping.c b/drivers/iommu/intel_irq_remapping.c
-index 9742011190fb..e2ea4eccf9c9 100644
---- a/drivers/iommu/intel_irq_remapping.c
-+++ b/drivers/iommu/intel_irq_remapping.c
-@@ -1029,6 +1029,7 @@ intel_ioapic_set_affinity(struct irq_data *data, const struct cpumask *mask,
- 		send_cleanup_vector(cfg);
- 
- 	cpumask_copy(data->affinity, mask);
-+
- 	return 0;
- }
- 
-@@ -1089,15 +1090,6 @@ static int intel_get_ioapic_entry(struct irq_data *irq_data,
- 	return 0;
- }
- 
--static int intel_get_msi_entry(struct irq_data *irq_data, struct msi_msg *msg)
--{
--	struct intel_ir_data *ir_data = irq_data->chip_data;
--
--	*msg = ir_data->msi_entry;
--
--	return 0;
--}
--
- struct irq_remap_ops intel_irq_remap_ops = {
- 	.supported		= intel_irq_remapping_supported,
- 	.prepare		= dmar_table_init,
-@@ -1111,7 +1103,6 @@ struct irq_remap_ops intel_irq_remap_ops = {
- 	.get_ir_irq_domain	= intel_get_ir_irq_domain,
- 	.get_irq_domain		= intel_get_irq_domain,
- 	.get_ioapic_entry	= intel_get_ioapic_entry,
--	.get_msi_entry		= intel_get_msi_entry,
- };
- 
- /*
-@@ -1139,7 +1130,7 @@ intel_ir_set_affinity(struct irq_data *data, const struct cpumask *mask,
- 	int ret;
- 
- 	ret = parent->chip->irq_set_affinity(parent, mask, force);
--	if (ret < 0)
-+	if (ret < 0 || ret == IRQ_SET_MASK_OK_DONE)
- 		return ret;
- 
- 	/*
-@@ -1158,12 +1149,22 @@ intel_ir_set_affinity(struct irq_data *data, const struct cpumask *mask,
- 	if (cfg->move_in_progress)
- 		send_cleanup_vector(cfg);
- 
--	return ret;
-+	return IRQ_SET_MASK_OK_DONE;
-+}
-+
-+static int intel_compose_msi_msg(struct irq_data *irq_data, struct msi_msg *msg)
-+{
-+	struct intel_ir_data *ir_data = irq_data->chip_data;
-+
-+	*msg = ir_data->msi_entry;
-+
-+	return 0;
- }
- 
- static struct irq_chip intel_ir_chip = {
- 	.irq_ack = ir_ack_apic_edge,
- 	.irq_set_affinity = intel_ir_set_affinity,
-+	.irq_compose_msi_msg = intel_compose_msi_msg,
- };
- 
- static void intel_irq_remapping_prepare_irte(struct intel_ir_data *data,
-diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
-index 8fabc1d05f93..aa0cacc1486a 100644
---- a/drivers/iommu/irq_remapping.c
-+++ b/drivers/iommu/irq_remapping.c
-@@ -310,18 +310,3 @@ int irq_remapping_get_ioapic_entry(struct irq_data *irq_data,
- {
- 	return remap_ops->get_ioapic_entry(irq_data, entry);
- }
--
--/**
-- * irq_remapping_get_ioapic_entry - Get MSI data rewritten by interrupt
-- *				    remapping driver
-- * @irq_data: irq_data associated with interrupt remapping irqdomain
-- * @entry: host returned data
-- *
-- * Caller must make sure that the interrupt is remapped.
-- * Return 0 on success, otherwise return error code
-- */
--int irq_remapping_get_msi_entry(struct irq_data *irq_data,
--				struct msi_msg *entry)
--{
--	return remap_ops->get_msi_entry(irq_data, entry);
--}
-diff --git a/drivers/iommu/irq_remapping.h b/drivers/iommu/irq_remapping.h
-index b01a51ed1780..df73f010c326 100644
---- a/drivers/iommu/irq_remapping.h
-+++ b/drivers/iommu/irq_remapping.h
-@@ -79,9 +79,6 @@ struct irq_remap_ops {
- 	/* Get IOAPIC entry content rewritten by interrupt remapping driver */
- 	int (*get_ioapic_entry)(struct irq_data *,
- 				struct IR_IO_APIC_route_entry *);
--
--	/*  Get MSI data rewritten by interrupt remapping driver */
--	int (*get_msi_entry)(struct irq_data *, struct msi_msg *);
- };
- 
- extern struct irq_remap_ops intel_irq_remap_ops;
-diff --git a/include/linux/irq.h b/include/linux/irq.h
-index 0adcbbbf2e87..226449317b78 100644
---- a/include/linux/irq.h
-+++ b/include/linux/irq.h
-@@ -113,10 +113,14 @@ enum {
-  *
-  * IRQ_SET_MASK_OK	- OK, core updates irq_data.affinity
-  * IRQ_SET_MASK_NOCPY	- OK, chip did update irq_data.affinity
-+ * IRQ_SET_MASK_OK_DONE	- Same as IRQ_SET_MASK_OK for core. Special code to
-+ *			  support stacked irqchips, which indicates skipping
-+ *			  all descendent irqchips.
-  */
- enum {
- 	IRQ_SET_MASK_OK = 0,
- 	IRQ_SET_MASK_OK_NOCOPY,
-+	IRQ_SET_MASK_OK_DONE,
- };
- 
- struct msi_desc;
-@@ -356,6 +360,8 @@ struct irq_chip {
- 	int		(*irq_request_resources)(struct irq_data *data);
- 	void		(*irq_release_resources)(struct irq_data *data);
- 
-+	int		(*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg);
-+
- 	unsigned long	flags;
- };
- 
-@@ -443,6 +449,7 @@ extern void handle_percpu_devid_irq(unsigned int irq, struct irq_desc *desc);
- extern void handle_bad_irq(unsigned int irq, struct irq_desc *desc);
- extern void handle_nested_irq(unsigned int irq);
- 
-+extern int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg);
- #ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
- extern void irq_chip_ack_parent(struct irq_data *data);
- extern int irq_chip_retrigger_hierarchy(struct irq_data *data);
-diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
-index 12f3e72449eb..50cbbff7e27f 100644
---- a/kernel/irq/chip.c
-+++ b/kernel/irq/chip.c
-@@ -867,3 +867,15 @@ int irq_chip_retrigger_hierarchy(struct irq_data *data)
- 	return -ENOSYS;
- }
- #endif
-+
-+int irq_chip_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
-+{
-+	int ret = -ENOSYS;
-+
-+	if (data->parent_data)
-+		ret = irq_chip_compose_msi_msg(data->parent_data, msg);
-+	if (ret == -ENOSYS && data->chip && data->chip->irq_compose_msi_msg)
-+		ret = data->chip->irq_compose_msi_msg(data, msg);
-+
-+	return ret;
-+}
-diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
-index 0a9104b4608b..80692373abd6 100644
---- a/kernel/irq/manage.c
-+++ b/kernel/irq/manage.c
-@@ -183,6 +183,7 @@ int irq_do_set_affinity(struct irq_data *data, const struct cpumask *mask,
- 	ret = chip->irq_set_affinity(data, mask, force);
- 	switch (ret) {
- 	case IRQ_SET_MASK_OK:
-+	case IRQ_SET_MASK_OK_DONE:
- 		cpumask_copy(data->affinity, mask);
- 	case IRQ_SET_MASK_OK_NOCOPY:
- 		irq_set_thread_affinity(desc);
-@@ -600,6 +601,7 @@ int __irq_set_trigger(struct irq_desc *desc, unsigned int irq,
- 
- 	switch (ret) {
- 	case IRQ_SET_MASK_OK:
-+	case IRQ_SET_MASK_OK_DONE:
- 		irqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK);
- 		irqd_set(&desc->irq_data, flags);
diff --git a/a/content_digest b/N1/content_digest
index 77b008d..e6f6b4f 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -1,34 +1,11 @@
  "ref\01414484803-10311-1-git-send-email-jiang.liu@linux.intel.com\0"
  "ref\01414484803-10311-16-git-send-email-jiang.liu@linux.intel.com\0"
  "ref\0alpine.DEB.2.11.1410282046120.5308@nanos\0"
- "From\0Jiang Liu <jiang.liu@linux.intel.com>\0"
- "Subject\0Re: [Patch Part2 v3 15/24] x86, MSI: Use hierarchy irqdomain to manage MSI interrupts\0"
+ "From\0jiang.liu@linux.intel.com (Jiang Liu)\0"
+ "Subject\0[Patch Part2 v3 15/24] x86, MSI: Use hierarchy irqdomain to manage MSI interrupts\0"
  "Date\0Wed, 29 Oct 2014 16:48:24 +0800\0"
- "To\0Thomas Gleixner <tglx@linutronix.de>\0"
- "Cc\0Benjamin Herrenschmidt <benh@kernel.crashing.org>"
-  Ingo Molnar <mingo@redhat.com>
-  H. Peter Anvin <hpa@zytor.com>
-  Rafael J. Wysocki <rjw@rjwysocki.net>
-  Bjorn Helgaas <bhelgaas@google.com>
-  Randy Dunlap <rdunlap@infradead.org>
-  Yinghai Lu <yinghai@kernel.org>
-  Borislav Petkov <bp@alien8.de>
-  Grant Likely <grant.likely@linaro.org>
-  Marc Zyngier <marc.zyngier@arm.com>
-  Yingjoe Chen <yingjoe.chen@mediatek.com>
-  x86@kernel.org
-  Joerg Roedel <joro@8bytes.org>
-  Matthias Brugger <matthias.bgg@gmail.com>
-  Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
-  Andrew Morton <akpm@linux-foundation.org>
-  Tony Luck <tony.luck@intel.com>
-  Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-  linux-kernel@vger.kernel.org
-  linux-pci@vger.kernel.org
-  linux-acpi@vger.kernel.org
-  linux-arm-kernel@lists.infradead.org
- " iommu@lists.linux-foundation.org\0"
- "\01:1\0"
+ "To\0linux-arm-kernel@lists.infradead.org\0"
+ "\00:1\0"
  "b\0"
  "On 2014/10/29 5:37, Thomas Gleixner wrote:\n"
  "> On Tue, 28 Oct 2014, Jiang Liu wrote:\n"
@@ -90,10 +67,9 @@
  "to find a solution:)\n"
  "\n"
  "Regards!\n"
- Gerry
- "\01:2\0"
- "fn\0tmp2.patch\0"
- "b\0"
+ "Gerry\n"
+ "\n"
+ "-------------- next part --------------\n"
  "diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h\n"
  "index 68d6dfcf7d92..97dec9eadef3 100644\n"
  "--- a/arch/x86/include/asm/irq_remapping.h\n"
@@ -585,4 +561,4 @@
  " \t\tirqd_clear(&desc->irq_data, IRQD_TRIGGER_MASK);\n"
  " \t\tirqd_set(&desc->irq_data, flags);"
 
-0ddc688db87849ee1f310180c1c5a9be9884eabbcf80eb8a5477e13c960a4cef
+7fd05635b91353706ed94aa24e38f797618c1e8dfb719dbfcfa8d94dce0566c2

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.