Unverified Commit f6a96ed9 authored by openeuler-ci-bot's avatar openeuler-ci-bot Committed by Gitee
Browse files

!9163 genirq: introduce handle_fasteoi_edge_irq flow handler

Merge Pull Request from: @ci-robot 
 
PR sync from: Yipeng Zou <zouyipeng@huawei.com>
https://mailweb.openeuler.org/hyperkitty/list/kernel@openeuler.org/message/FIEJ2QVNCYY3ANRMHZ62QFDKJRDBNW2C/ 
Rebase to here

Yipeng Zou (2):
  genirq: introduce handle_fasteoi_edge_irq flow handler
  genirq: introduce handle_fasteoi_edge_irq for phytium


-- 
2.34.1
 
https://gitee.com/openeuler/kernel/issues/I6WPFT 
 
Link:https://gitee.com/openeuler/kernel/pulls/9163

 

Reviewed-by: default avatarZhang Jianhua <chris.zjh@huawei.com>
Signed-off-by: default avatarJialin Zhang <zhangjialin11@huawei.com>
parents 10b2707f ecfc8100
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1526,7 +1526,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
		if (!gic_dist_supports_lpis())
			return -EPERM;
		irq_domain_set_info(d, irq, hw, chip, d->host_data,
				    handle_fasteoi_irq, NULL, NULL);
				    handle_fasteoi_edge_irq, NULL, NULL);
		break;

	default:
+1 −1
Original line number Diff line number Diff line
@@ -1475,7 +1475,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
		if (!gic_dist_supports_lpis())
			return -EPERM;
		irq_domain_set_info(d, irq, hw, chip, d->host_data,
				    handle_fasteoi_irq, NULL, NULL);
				    handle_fasteoi_edge_irq, NULL, NULL);
		break;

	default:
+1 −0
Original line number Diff line number Diff line
@@ -654,6 +654,7 @@ static inline int irq_set_parent(int irq, int parent_irq)
 */
extern void handle_level_irq(struct irq_desc *desc);
extern void handle_fasteoi_irq(struct irq_desc *desc);
extern void handle_fasteoi_edge_irq(struct irq_desc *desc);
extern void handle_percpu_devid_fasteoi_ipi(struct irq_desc *desc);
extern void handle_edge_irq(struct irq_desc *desc);
extern void handle_edge_eoi_irq(struct irq_desc *desc);
+67 −0
Original line number Diff line number Diff line
@@ -680,6 +680,73 @@ static void cond_unmask_eoi_irq(struct irq_desc *desc, struct irq_chip *chip)
	}
}

/**
 *	handle_fasteoi_edge_irq - irq handler for transparent controllers
 *	edge type IRQ.
 *	@desc:	the interrupt description structure for this irq
 */
void handle_fasteoi_edge_irq(struct irq_desc *desc)
{
	struct irq_chip *chip = desc->irq_data.chip;

	raw_spin_lock(&desc->lock);

	if (!irq_may_run(desc)) {
		desc->istate |= IRQS_PENDING;
		mask_irq(desc);
		goto out;
	}

	desc->istate &= ~(IRQS_REPLAY | IRQS_WAITING);

	/*
	 * If its disabled or no action available
	 * then mask it and get out of here:
	 */
	if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {
		desc->istate |= IRQS_PENDING;
		mask_irq(desc);
		goto out;
	}

	kstat_incr_irqs_this_cpu(desc);

	if (desc->istate & IRQS_ONESHOT)
		mask_irq(desc);

	do {
		if (unlikely(!desc->action)) {
			mask_irq(desc);
			goto out;
		}

		/*
		 * When another irq arrived while we were handling
		 * one, we could have masked the irq.
		 * Reenable it, if it was not disabled in meantime.
		 */
		if (unlikely(desc->istate & IRQS_PENDING)) {
			if (!irqd_irq_disabled(&desc->irq_data) &&
			    irqd_irq_masked(&desc->irq_data))
				unmask_irq(desc);
		}

		handle_irq_event(desc);

	} while ((desc->istate & IRQS_PENDING) &&
		 !irqd_irq_disabled(&desc->irq_data));

	cond_unmask_eoi_irq(desc, chip);

	raw_spin_unlock(&desc->lock);
	return;
out:
	if (!(chip->flags & IRQCHIP_EOI_IF_HANDLED))
		chip->irq_eoi(&desc->irq_data);
	raw_spin_unlock(&desc->lock);
}
EXPORT_SYMBOL_GPL(handle_fasteoi_edge_irq);

/**
 *	handle_fasteoi_irq - irq handler for transparent controllers
 *	@desc:	the interrupt description structure for this irq