···9292 IRQ_NO_BALANCING = (1 << 13),9393 IRQ_MOVE_PCNTXT = (1 << 14),9494 IRQ_NESTED_THREAD = (1 << 15),9595-9696-#ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT9797- IRQ_INPROGRESS = (1 << 16),9898- IRQ_REPLAY = (1 << 17),9999- IRQ_WAITING = (1 << 18),100100- IRQ_DISABLED = (1 << 19),101101- IRQ_PENDING = (1 << 20),102102- IRQ_MASKED = (1 << 21),103103- IRQ_MOVE_PENDING = (1 << 22),104104- IRQ_AFFINITY_SET = (1 << 23),105105- IRQ_WAKEUP = (1 << 24),106106-#endif10795};1089610997#define IRQF_MODIFY_MASK \···309321 */310322struct irq_chip {311323 const char *name;312312-#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED313313- unsigned int (*startup)(unsigned int irq);314314- void (*shutdown)(unsigned int irq);315315- void (*enable)(unsigned int irq);316316- void (*disable)(unsigned int irq);317317-318318- void (*ack)(unsigned int irq);319319- void (*mask)(unsigned int irq);320320- void (*mask_ack)(unsigned int irq);321321- void (*unmask)(unsigned int irq);322322- void (*eoi)(unsigned int irq);323323-324324- void (*end)(unsigned int irq);325325- int (*set_affinity)(unsigned int irq,326326- const struct cpumask *dest);327327- int (*retrigger)(unsigned int irq);328328- int (*set_type)(unsigned int irq, unsigned int flow_type);329329- int (*set_wake)(unsigned int irq, unsigned int on);330330-331331- void (*bus_lock)(unsigned int irq);332332- void (*bus_sync_unlock)(unsigned int irq);333333-#endif334324 unsigned int (*irq_startup)(struct irq_data *data);335325 void (*irq_shutdown)(struct irq_data *data);336326 void (*irq_enable)(struct irq_data *data);···554588{555589 return d->msi_desc;556590}557557-558558-#ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT559559-/* Please do not use: Use the replacement functions instead */560560-static inline int set_irq_chip(unsigned int irq, struct irq_chip *chip)561561-{562562- return irq_set_chip(irq, chip);563563-}564564-static inline int set_irq_data(unsigned int irq, void *data)565565-{566566- return irq_set_handler_data(irq, data);567567-}568568-static inline int set_irq_chip_data(unsigned int irq, void *data)569569-{570570- return irq_set_chip_data(irq, data);571571-}572572-static inline int set_irq_type(unsigned int irq, unsigned int type)573573-{574574- return irq_set_irq_type(irq, type);575575-}576576-static inline int set_irq_msi(unsigned int irq, struct msi_desc *entry)577577-{578578- return irq_set_msi_desc(irq, entry);579579-}580580-static inline struct irq_chip *get_irq_chip(unsigned int irq)581581-{582582- return irq_get_chip(irq);583583-}584584-static inline void *get_irq_chip_data(unsigned int irq)585585-{586586- return irq_get_chip_data(irq);587587-}588588-static inline void *get_irq_data(unsigned int irq)589589-{590590- return irq_get_handler_data(irq);591591-}592592-static inline void *irq_data_get_irq_data(struct irq_data *d)593593-{594594- return irq_data_get_irq_handler_data(d);595595-}596596-static inline struct msi_desc *get_irq_msi(unsigned int irq)597597-{598598- return irq_get_msi_desc(irq);599599-}600600-static inline void set_irq_noprobe(unsigned int irq)601601-{602602- irq_set_noprobe(irq);603603-}604604-static inline void set_irq_probe(unsigned int irq)605605-{606606- irq_set_probe(irq);607607-}608608-static inline void set_irq_nested_thread(unsigned int irq, int nest)609609-{610610- irq_set_nested_thread(irq, nest);611611-}612612-static inline void613613-set_irq_chip_and_handler_name(unsigned int irq, struct irq_chip *chip,614614- irq_flow_handler_t handle, const char *name)615615-{616616- irq_set_chip_and_handler_name(irq, chip, handle, name);617617-}618618-static inline void619619-set_irq_chip_and_handler(unsigned int irq, struct irq_chip *chip,620620- irq_flow_handler_t handle)621621-{622622- irq_set_chip_and_handler(irq, chip, handle);623623-}624624-static inline void625625-__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,626626- const char *name)627627-{628628- __irq_set_handler(irq, handle, is_chained, name);629629-}630630-static inline void set_irq_handler(unsigned int irq, irq_flow_handler_t handle)631631-{632632- irq_set_handler(irq, handle);633633-}634634-static inline void635635-set_irq_chained_handler(unsigned int irq, irq_flow_handler_t handle)636636-{637637- irq_set_chained_handler(irq, handle);638638-}639639-#endif640591641592int irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node);642593void irq_free_descs(unsigned int irq, unsigned int cnt);
+1-59
include/linux/irqdesc.h
···3535 * @name: flow handler name for /proc/interrupts output3636 */3737struct irq_desc {3838-3939-#ifdef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED4038 struct irq_data irq_data;4141-#else4242- /*4343- * This union will go away, once we fixed the direct access to4444- * irq_desc all over the place. The direct fields are a 1:14545- * overlay of irq_data.4646- */4747- union {4848- struct irq_data irq_data;4949- struct {5050- unsigned int irq;5151- unsigned int node;5252- unsigned int pad_do_not_even_think_about_it;5353- struct irq_chip *chip;5454- void *handler_data;5555- void *chip_data;5656- struct msi_desc *msi_desc;5757-#ifdef CONFIG_SMP5858- cpumask_var_t affinity;5959-#endif6060- };6161- };6262-#endif6363-6439 struct timer_rand_state *timer_rand_state;6540 unsigned int __percpu *kstat_irqs;6641 irq_flow_handler_t handle_irq;···4368 irq_preflow_handler_t preflow_handler;4469#endif4570 struct irqaction *action; /* IRQ action list */4646-#ifdef CONFIG_GENERIC_HARDIRQS_NO_COMPAT4771 unsigned int status_use_accessors;4848-#else4949- unsigned int status; /* IRQ status */5050-#endif5172 unsigned int core_internal_state__do_not_mess_with_it;5273 unsigned int depth; /* nested irq disables */5374 unsigned int wake_depth; /* nested wake enables */···98127 return desc->irq_data.msi_desc;99128}100129101101-#ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT102102-static inline struct irq_chip *get_irq_desc_chip(struct irq_desc *desc)103103-{104104- return irq_desc_get_chip(desc);105105-}106106-static inline void *get_irq_desc_data(struct irq_desc *desc)107107-{108108- return irq_desc_get_handler_data(desc);109109-}110110-111111-static inline void *get_irq_desc_chip_data(struct irq_desc *desc)112112-{113113- return irq_desc_get_chip_data(desc);114114-}115115-116116-static inline struct msi_desc *get_irq_desc_msi(struct irq_desc *desc)117117-{118118- return irq_desc_get_msi_desc(desc);119119-}120120-#endif121121-122130/*123131 * Architectures call this to let the generic IRQ layer124132 * handle an interrupt. If the descriptor is attached to an···144194 desc->name = name;145195}146196147147-#ifndef CONFIG_GENERIC_HARDIRQS_NO_COMPAT148148-static inline void __set_irq_handler_unlocked(int irq,149149- irq_flow_handler_t handler)150150-{151151- __irq_set_handler_locked(irq, handler);152152-}153153-154197static inline int irq_balancing_disabled(unsigned int irq)155198{156199 struct irq_desc *desc;157200158201 desc = irq_to_desc(irq);159159- return desc->status & IRQ_NO_BALANCING_MASK;202202+ return desc->status_use_accessors & IRQ_NO_BALANCING_MASK;160203}161161-#endif162204163205static inline void164206irq_set_lockdep_class(unsigned int irq, struct lock_class_key *class)
-4
kernel/irq/Kconfig
···1010config GENERIC_HARDIRQS1111 def_bool y12121313-# Select this to disable the deprecated stuff1414-config GENERIC_HARDIRQS_NO_DEPRECATED1515- bool1616-1713config GENERIC_HARDIRQS_NO_COMPAT1814 bool1915
+1-3
kernel/irq/autoprobe.c
···7070 raw_spin_lock_irq(&desc->lock);7171 if (!desc->action && irq_settings_can_probe(desc)) {7272 desc->istate |= IRQS_AUTODETECT | IRQS_WAITING;7373- if (irq_startup(desc)) {7474- irq_compat_set_pending(desc);7373+ if (irq_startup(desc))7574 desc->istate |= IRQS_PENDING;7676- }7775 }7876 raw_spin_unlock_irq(&desc->lock);7977 }
-129
kernel/irq/chip.c
···3434 if (!chip)3535 chip = &no_irq_chip;36363737- irq_chip_set_defaults(chip);3837 desc->irq_data.chip = chip;3938 irq_put_desc_unlock(desc, flags);4039 /*···140141static void irq_state_clr_disabled(struct irq_desc *desc)141142{142143 irqd_clear(&desc->irq_data, IRQD_IRQ_DISABLED);143143- irq_compat_clr_disabled(desc);144144}145145146146static void irq_state_set_disabled(struct irq_desc *desc)147147{148148 irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);149149- irq_compat_set_disabled(desc);150149}151150152151static void irq_state_clr_masked(struct irq_desc *desc)153152{154153 irqd_clear(&desc->irq_data, IRQD_IRQ_MASKED);155155- irq_compat_clr_masked(desc);156154}157155158156static void irq_state_set_masked(struct irq_desc *desc)159157{160158 irqd_set(&desc->irq_data, IRQD_IRQ_MASKED);161161- irq_compat_set_masked(desc);162159}163160164161int irq_startup(struct irq_desc *desc)···202207 desc->irq_data.chip->irq_disable(&desc->irq_data);203208 irq_state_set_masked(desc);204209 }205205-}206206-207207-#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED208208-/* Temporary migration helpers */209209-static void compat_irq_mask(struct irq_data *data)210210-{211211- data->chip->mask(data->irq);212212-}213213-214214-static void compat_irq_unmask(struct irq_data *data)215215-{216216- data->chip->unmask(data->irq);217217-}218218-219219-static void compat_irq_ack(struct irq_data *data)220220-{221221- data->chip->ack(data->irq);222222-}223223-224224-static void compat_irq_mask_ack(struct irq_data *data)225225-{226226- data->chip->mask_ack(data->irq);227227-}228228-229229-static void compat_irq_eoi(struct irq_data *data)230230-{231231- data->chip->eoi(data->irq);232232-}233233-234234-static void compat_irq_enable(struct irq_data *data)235235-{236236- data->chip->enable(data->irq);237237-}238238-239239-static void compat_irq_disable(struct irq_data *data)240240-{241241- data->chip->disable(data->irq);242242-}243243-244244-static void compat_irq_shutdown(struct irq_data *data)245245-{246246- data->chip->shutdown(data->irq);247247-}248248-249249-static unsigned int compat_irq_startup(struct irq_data *data)250250-{251251- return data->chip->startup(data->irq);252252-}253253-254254-static int compat_irq_set_affinity(struct irq_data *data,255255- const struct cpumask *dest, bool force)256256-{257257- return data->chip->set_affinity(data->irq, dest);258258-}259259-260260-static int compat_irq_set_type(struct irq_data *data, unsigned int type)261261-{262262- return data->chip->set_type(data->irq, type);263263-}264264-265265-static int compat_irq_set_wake(struct irq_data *data, unsigned int on)266266-{267267- return data->chip->set_wake(data->irq, on);268268-}269269-270270-static int compat_irq_retrigger(struct irq_data *data)271271-{272272- return data->chip->retrigger(data->irq);273273-}274274-275275-static void compat_bus_lock(struct irq_data *data)276276-{277277- data->chip->bus_lock(data->irq);278278-}279279-280280-static void compat_bus_sync_unlock(struct irq_data *data)281281-{282282- data->chip->bus_sync_unlock(data->irq);283283-}284284-#endif285285-286286-/*287287- * Fixup enable/disable function pointers288288- */289289-void irq_chip_set_defaults(struct irq_chip *chip)290290-{291291-#ifndef CONFIG_GENERIC_HARDIRQS_NO_DEPRECATED292292- if (chip->enable)293293- chip->irq_enable = compat_irq_enable;294294- if (chip->disable)295295- chip->irq_disable = compat_irq_disable;296296- if (chip->shutdown)297297- chip->irq_shutdown = compat_irq_shutdown;298298- if (chip->startup)299299- chip->irq_startup = compat_irq_startup;300300- if (!chip->end)301301- chip->end = dummy_irq_chip.end;302302- if (chip->bus_lock)303303- chip->irq_bus_lock = compat_bus_lock;304304- if (chip->bus_sync_unlock)305305- chip->irq_bus_sync_unlock = compat_bus_sync_unlock;306306- if (chip->mask)307307- chip->irq_mask = compat_irq_mask;308308- if (chip->unmask)309309- chip->irq_unmask = compat_irq_unmask;310310- if (chip->ack)311311- chip->irq_ack = compat_irq_ack;312312- if (chip->mask_ack)313313- chip->irq_mask_ack = compat_irq_mask_ack;314314- if (chip->eoi)315315- chip->irq_eoi = compat_irq_eoi;316316- if (chip->set_affinity)317317- chip->irq_set_affinity = compat_irq_set_affinity;318318- if (chip->set_type)319319- chip->irq_set_type = compat_irq_set_type;320320- if (chip->set_wake)321321- chip->irq_set_wake = compat_irq_set_wake;322322- if (chip->retrigger)323323- chip->irq_retrigger = compat_irq_retrigger;324324-#endif325210}326211327212static inline void mask_ack_irq(struct irq_desc *desc)···256381 if (unlikely(!action || irqd_irq_disabled(&desc->irq_data)))257382 goto out_unlock;258383259259- irq_compat_set_progress(desc);260384 irqd_set(&desc->irq_data, IRQD_IRQ_INPROGRESS);261385 raw_spin_unlock_irq(&desc->lock);262386···265391266392 raw_spin_lock_irq(&desc->lock);267393 irqd_clear(&desc->irq_data, IRQD_IRQ_INPROGRESS);268268- irq_compat_clr_progress(desc);269394270395out_unlock:271396 raw_spin_unlock_irq(&desc->lock);···387514 * then mask it and get out of here:388515 */389516 if (unlikely(!desc->action || irqd_irq_disabled(&desc->irq_data))) {390390- irq_compat_set_pending(desc);391517 desc->istate |= IRQS_PENDING;392518 mask_irq(desc);393519 goto out;···439567 if (unlikely(irqd_irq_disabled(&desc->irq_data) ||440568 irqd_irq_inprogress(&desc->irq_data) || !desc->action)) {441569 if (!irq_check_poll(desc)) {442442- irq_compat_set_pending(desc);443570 desc->istate |= IRQS_PENDING;444571 mask_ack_irq(desc);445572 goto out_unlock;
···9393 * Already running: If it is shared get the other9494 * CPU to go looking for our mystery interrupt too9595 */9696- irq_compat_set_pending(desc);9796 desc->istate |= IRQS_PENDING;9897 goto out;9998 }