drm/i915: split gen11_irq_handler to make it shareable
Split gen11_irq_handler() to receive as parameter the function pointers. This allows to share the interrupt handler even if the enable/disable functions are different. Make sure it's always inlined to avoid the extra indirect call on the hot path. Checking with gcc 9 this produce the exact same code as of now: $ size drivers/gpu/drm/i915/i915_irq*.o text data bss dec hex filename 47511 560 0 48071 bbc7 drivers/gpu/drm/i915/i915_irq.o 47511 560 0 48071 bbc7 drivers/gpu/drm/i915/i915_irq_new.o $ gdb -batch -ex 'file drivers/gpu/drm/i915/i915_irq.o' -ex 'disassemble gen11_irq_handler' > /tmp/old.s $ gdb -batch -ex 'file drivers/gpu/drm/i915/i915_irq_new.o' -ex 'disassemble gen11_irq_handler' > /tmp/new.s $ git diff --no-index /tmp/{old,new}.s $ So, no change in behavior, just a simple refactor. Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Link: https://patchwork.freedesktop.org/patch/msgid/20191024195122.22877-4-lucas.demarchi@intel.com
This commit is contained in:
parent
e6e2ac0711
commit
7be8782a50
@ -2861,9 +2861,11 @@ static inline void gen11_master_intr_enable(void __iomem * const regs)
|
||||
raw_reg_write(regs, GEN11_GFX_MSTR_IRQ, GEN11_MASTER_IRQ);
|
||||
}
|
||||
|
||||
static irqreturn_t gen11_irq_handler(int irq, void *arg)
|
||||
static __always_inline irqreturn_t
|
||||
__gen11_irq_handler(struct drm_i915_private * const i915,
|
||||
u32 (*intr_disable)(void __iomem * const regs),
|
||||
void (*intr_enable)(void __iomem * const regs))
|
||||
{
|
||||
struct drm_i915_private * const i915 = arg;
|
||||
void __iomem * const regs = i915->uncore.regs;
|
||||
struct intel_gt *gt = &i915->gt;
|
||||
u32 master_ctl;
|
||||
@ -2872,9 +2874,9 @@ static irqreturn_t gen11_irq_handler(int irq, void *arg)
|
||||
if (!intel_irqs_enabled(i915))
|
||||
return IRQ_NONE;
|
||||
|
||||
master_ctl = gen11_master_intr_disable(regs);
|
||||
master_ctl = intr_disable(regs);
|
||||
if (!master_ctl) {
|
||||
gen11_master_intr_enable(regs);
|
||||
intr_enable(regs);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
@ -2896,13 +2898,20 @@ static irqreturn_t gen11_irq_handler(int irq, void *arg)
|
||||
|
||||
gu_misc_iir = gen11_gu_misc_irq_ack(gt, master_ctl);
|
||||
|
||||
gen11_master_intr_enable(regs);
|
||||
intr_enable(regs);
|
||||
|
||||
gen11_gu_misc_irq_handler(gt, gu_misc_iir);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static irqreturn_t gen11_irq_handler(int irq, void *arg)
|
||||
{
|
||||
return __gen11_irq_handler(arg,
|
||||
gen11_master_intr_disable,
|
||||
gen11_master_intr_enable);
|
||||
}
|
||||
|
||||
/* Called from drm generic code, passed 'crtc' which
|
||||
* we use as a pipe index
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user