Commit 70a29c32 authored by Marc Zyngier's avatar Marc Zyngier

irqchip/gic-v3: Describe the SGI range

As we are about to start making use of SGIs in a more conventional
way, let's describe it is the GICv3 list of interrupt types.
Reviewed-by: default avatarValentin Schneider <valentin.schneider@arm.com>
Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
parent 56afcd3d
...@@ -112,6 +112,7 @@ static DEFINE_PER_CPU(bool, has_rss); ...@@ -112,6 +112,7 @@ static DEFINE_PER_CPU(bool, has_rss);
#define DEFAULT_PMR_VALUE 0xf0 #define DEFAULT_PMR_VALUE 0xf0
enum gic_intid_range { enum gic_intid_range {
SGI_RANGE,
PPI_RANGE, PPI_RANGE,
SPI_RANGE, SPI_RANGE,
EPPI_RANGE, EPPI_RANGE,
...@@ -123,6 +124,8 @@ enum gic_intid_range { ...@@ -123,6 +124,8 @@ enum gic_intid_range {
static enum gic_intid_range __get_intid_range(irq_hw_number_t hwirq) static enum gic_intid_range __get_intid_range(irq_hw_number_t hwirq)
{ {
switch (hwirq) { switch (hwirq) {
case 0 ... 15:
return SGI_RANGE;
case 16 ... 31: case 16 ... 31:
return PPI_RANGE; return PPI_RANGE;
case 32 ... 1019: case 32 ... 1019:
...@@ -148,15 +151,22 @@ static inline unsigned int gic_irq(struct irq_data *d) ...@@ -148,15 +151,22 @@ static inline unsigned int gic_irq(struct irq_data *d)
return d->hwirq; return d->hwirq;
} }
static inline int gic_irq_in_rdist(struct irq_data *d) static inline bool gic_irq_in_rdist(struct irq_data *d)
{ {
enum gic_intid_range range = get_intid_range(d); switch (get_intid_range(d)) {
return range == PPI_RANGE || range == EPPI_RANGE; case SGI_RANGE:
case PPI_RANGE:
case EPPI_RANGE:
return true;
default:
return false;
}
} }
static inline void __iomem *gic_dist_base(struct irq_data *d) static inline void __iomem *gic_dist_base(struct irq_data *d)
{ {
switch (get_intid_range(d)) { switch (get_intid_range(d)) {
case SGI_RANGE:
case PPI_RANGE: case PPI_RANGE:
case EPPI_RANGE: case EPPI_RANGE:
/* SGI+PPI -> SGI_base for this CPU */ /* SGI+PPI -> SGI_base for this CPU */
...@@ -253,6 +263,7 @@ static void gic_enable_redist(bool enable) ...@@ -253,6 +263,7 @@ static void gic_enable_redist(bool enable)
static u32 convert_offset_index(struct irq_data *d, u32 offset, u32 *index) static u32 convert_offset_index(struct irq_data *d, u32 offset, u32 *index)
{ {
switch (get_intid_range(d)) { switch (get_intid_range(d)) {
case SGI_RANGE:
case PPI_RANGE: case PPI_RANGE:
case SPI_RANGE: case SPI_RANGE:
*index = d->hwirq; *index = d->hwirq;
...@@ -1277,6 +1288,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq, ...@@ -1277,6 +1288,7 @@ static int gic_irq_domain_map(struct irq_domain *d, unsigned int irq,
chip = &gic_eoimode1_chip; chip = &gic_eoimode1_chip;
switch (__get_intid_range(hw)) { switch (__get_intid_range(hw)) {
case SGI_RANGE:
case PPI_RANGE: case PPI_RANGE:
case EPPI_RANGE: case EPPI_RANGE:
irq_set_percpu_devid(irq); irq_set_percpu_devid(irq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment