genirq: Add IRQ_AFFINITY_MANAGED flag
Add IRQ_AFFINITY_MANAGED flag and related kernel APIs so that kernel driver can modify an irq's status in such a way that user space affinity change will be ignored. Kernel space's affinity setting will not be changed. Change-Id: Ib2d5ea651263bff4317562af69079ad950c9e71e Signed-off-by: Runmin Wang <runminw@codeaurora.org>
This commit is contained in:
parent
6d13d73162
commit
af7d0b5d01
3 changed files with 19 additions and 2 deletions
|
@ -73,6 +73,7 @@ enum irqchip_irq_state;
|
||||||
* it from the spurious interrupt detection
|
* it from the spurious interrupt detection
|
||||||
* mechanism and from core side polling.
|
* mechanism and from core side polling.
|
||||||
* IRQ_DISABLE_UNLAZY - Disable lazy irq disable
|
* IRQ_DISABLE_UNLAZY - Disable lazy irq disable
|
||||||
|
* IRQ_AFFINITY_MANAGED - Affinity is auto-managed by the kernel
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
IRQ_TYPE_NONE = 0x00000000,
|
IRQ_TYPE_NONE = 0x00000000,
|
||||||
|
@ -99,13 +100,14 @@ enum {
|
||||||
IRQ_PER_CPU_DEVID = (1 << 17),
|
IRQ_PER_CPU_DEVID = (1 << 17),
|
||||||
IRQ_IS_POLLED = (1 << 18),
|
IRQ_IS_POLLED = (1 << 18),
|
||||||
IRQ_DISABLE_UNLAZY = (1 << 19),
|
IRQ_DISABLE_UNLAZY = (1 << 19),
|
||||||
|
IRQ_AFFINITY_MANAGED = (1 << 21),
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IRQF_MODIFY_MASK \
|
#define IRQF_MODIFY_MASK \
|
||||||
(IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
|
(IRQ_TYPE_SENSE_MASK | IRQ_NOPROBE | IRQ_NOREQUEST | \
|
||||||
IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \
|
IRQ_NOAUTOEN | IRQ_MOVE_PCNTXT | IRQ_LEVEL | IRQ_NO_BALANCING | \
|
||||||
IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \
|
IRQ_PER_CPU | IRQ_NESTED_THREAD | IRQ_NOTHREAD | IRQ_PER_CPU_DEVID | \
|
||||||
IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY)
|
IRQ_IS_POLLED | IRQ_DISABLE_UNLAZY | IRQ_AFFINITY_MANAGED)
|
||||||
|
|
||||||
#define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
|
#define IRQ_NO_BALANCING_MASK (IRQ_PER_CPU | IRQ_NO_BALANCING)
|
||||||
|
|
||||||
|
|
|
@ -913,7 +913,8 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)
|
||||||
trigger = irqd_get_trigger_type(&desc->irq_data);
|
trigger = irqd_get_trigger_type(&desc->irq_data);
|
||||||
|
|
||||||
irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU |
|
irqd_clear(&desc->irq_data, IRQD_NO_BALANCING | IRQD_PER_CPU |
|
||||||
IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT);
|
IRQD_TRIGGER_MASK | IRQD_LEVEL | IRQD_MOVE_PCNTXT |
|
||||||
|
IRQD_AFFINITY_MANAGED);
|
||||||
if (irq_settings_has_no_balance_set(desc))
|
if (irq_settings_has_no_balance_set(desc))
|
||||||
irqd_set(&desc->irq_data, IRQD_NO_BALANCING);
|
irqd_set(&desc->irq_data, IRQD_NO_BALANCING);
|
||||||
if (irq_settings_is_per_cpu(desc))
|
if (irq_settings_is_per_cpu(desc))
|
||||||
|
@ -922,6 +923,8 @@ void irq_modify_status(unsigned int irq, unsigned long clr, unsigned long set)
|
||||||
irqd_set(&desc->irq_data, IRQD_MOVE_PCNTXT);
|
irqd_set(&desc->irq_data, IRQD_MOVE_PCNTXT);
|
||||||
if (irq_settings_is_level(desc))
|
if (irq_settings_is_level(desc))
|
||||||
irqd_set(&desc->irq_data, IRQD_LEVEL);
|
irqd_set(&desc->irq_data, IRQD_LEVEL);
|
||||||
|
if (irq_settings_has_affinity_managed_set(desc))
|
||||||
|
irqd_set(&desc->irq_data, IRQD_AFFINITY_MANAGED);
|
||||||
|
|
||||||
tmp = irq_settings_get_trigger_mask(desc);
|
tmp = irq_settings_get_trigger_mask(desc);
|
||||||
if (tmp != IRQ_TYPE_NONE)
|
if (tmp != IRQ_TYPE_NONE)
|
||||||
|
|
|
@ -17,6 +17,7 @@ enum {
|
||||||
_IRQ_IS_POLLED = IRQ_IS_POLLED,
|
_IRQ_IS_POLLED = IRQ_IS_POLLED,
|
||||||
_IRQ_DISABLE_UNLAZY = IRQ_DISABLE_UNLAZY,
|
_IRQ_DISABLE_UNLAZY = IRQ_DISABLE_UNLAZY,
|
||||||
_IRQF_MODIFY_MASK = IRQF_MODIFY_MASK,
|
_IRQF_MODIFY_MASK = IRQF_MODIFY_MASK,
|
||||||
|
_IRQ_AFFINITY_MANAGED = IRQ_AFFINITY_MANAGED,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define IRQ_PER_CPU GOT_YOU_MORON
|
#define IRQ_PER_CPU GOT_YOU_MORON
|
||||||
|
@ -32,6 +33,7 @@ enum {
|
||||||
#define IRQ_DISABLE_UNLAZY GOT_YOU_MORON
|
#define IRQ_DISABLE_UNLAZY GOT_YOU_MORON
|
||||||
#undef IRQF_MODIFY_MASK
|
#undef IRQF_MODIFY_MASK
|
||||||
#define IRQF_MODIFY_MASK GOT_YOU_MORON
|
#define IRQF_MODIFY_MASK GOT_YOU_MORON
|
||||||
|
#define IRQ_AFFINITY_MANAGED GOT_YOU_MORON
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set)
|
irq_settings_clr_and_set(struct irq_desc *desc, u32 clr, u32 set)
|
||||||
|
@ -65,6 +67,16 @@ static inline bool irq_settings_has_no_balance_set(struct irq_desc *desc)
|
||||||
return desc->status_use_accessors & _IRQ_NO_BALANCING;
|
return desc->status_use_accessors & _IRQ_NO_BALANCING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void irq_settings_set_affinity_managed(struct irq_desc *desc)
|
||||||
|
{
|
||||||
|
desc->status_use_accessors |= _IRQ_AFFINITY_MANAGED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool irq_settings_has_affinity_managed_set(struct irq_desc *desc)
|
||||||
|
{
|
||||||
|
return desc->status_use_accessors & _IRQ_AFFINITY_MANAGED;
|
||||||
|
}
|
||||||
|
|
||||||
static inline u32 irq_settings_get_trigger_mask(struct irq_desc *desc)
|
static inline u32 irq_settings_get_trigger_mask(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
return desc->status_use_accessors & IRQ_TYPE_SENSE_MASK;
|
return desc->status_use_accessors & IRQ_TYPE_SENSE_MASK;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue