irqchip fixes for v3.17
- gic-v3 - SMP build fix - tag low level accessors __maybe_unused - declare rdist as __percpu - gic - staticize - crossbar - fix off-by-one bug - exynos-combiner - fix arm64 build error -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABAgAGBQJUFUvDAAoJEP45WPkGe8Znvz8P/0uRjF7iabU2yJjWnZypo96W ir62rSy9tn1ITqHoLh9fv98CPvwGtIit1Kjkg+heLFCR5KMao8h+gov6clMMaf8b wQQUK+eezfN0Uxx2nM0wbcdpsbjFWQnIxQjreoADcneoRqZu8UZIWIoBU/VAC1PP m4jaUFWCaktQVCtvC4/gG60Zi4GQO2ll08Ixh71BWmmoS4A08RQV8PjlNfDm4E7H VoQI4ALCui1hl+BRIZw35Em0EDd+u8fYJTMfqP7750rgtSF4bNDCjuZQ8dCmfwoo MbNHgOGDfAfIC7kK4X6IUxqveqaDxIYvjoeek/Xq9Vc7p8xY3G5rJ8asd8ZxHOd7 oOEexLbQeg7dLwAqPXjASppE4M7VyhzOwX9KVBoQz1oXIGvYIBuZ3FeOFEOnZW1K YdPCIdggnFI7yrResVgIz09bMfi4f4AflUWFrBO4nMseOrTesx1myg2rymp9mjzN WVV4vOl+xn0EhU/G4bTtn8MVjKZ5DhREtS33lTlN84kZktcQAxXbV/TY2oLPtFXu f8lPZpEkEvBa32IYQoA85UYbYouVo5yl7OAYKIM/DpEmZYUEnsdFR6DwgX/t4ghz 4JLnOb0GJbYNyziLtGwp4sMGkdFIQ264STov+5Rf/Q5EkUl6G13TWRbkOcXCrkvP sSNXMGwgVKDKlZImU/IA =3wED -----END PGP SIGNATURE----- Merge tag 'irqchip-urgent-3.17' of git://git.infradead.org/users/jcooper/linux into irq/urgent irqchip fixes for v3.17 from Jason Cooper - GIC/GICV3: Various fixlets - crossbar: Fix off-by-one bug - exynos-combiner: Fix arm64 build error
This commit is contained in:
Коммит
938c04a870
|
@ -15,6 +15,7 @@
|
|||
#include <linux/slab.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/irqchip/chained_irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
|
||||
|
|
|
@ -220,7 +220,7 @@ static int __init crossbar_of_init(struct device_node *node)
|
|||
of_property_read_u32_index(node,
|
||||
"ti,irqs-reserved",
|
||||
i, &entry);
|
||||
if (entry > max) {
|
||||
if (entry >= max) {
|
||||
pr_err("Invalid reserved entry\n");
|
||||
ret = -EINVAL;
|
||||
goto err_irq_map;
|
||||
|
@ -238,7 +238,7 @@ static int __init crossbar_of_init(struct device_node *node)
|
|||
of_property_read_u32_index(node,
|
||||
"ti,irqs-skip",
|
||||
i, &entry);
|
||||
if (entry > max) {
|
||||
if (entry >= max) {
|
||||
pr_err("Invalid skip entry\n");
|
||||
ret = -EINVAL;
|
||||
goto err_irq_map;
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
struct gic_chip_data {
|
||||
void __iomem *dist_base;
|
||||
void __iomem **redist_base;
|
||||
void __percpu __iomem **rdist;
|
||||
void __iomem * __percpu *rdist;
|
||||
struct irq_domain *domain;
|
||||
u64 redist_stride;
|
||||
u32 redist_regions;
|
||||
|
@ -104,7 +104,7 @@ static void gic_redist_wait_for_rwp(void)
|
|||
}
|
||||
|
||||
/* Low level accessors */
|
||||
static u64 gic_read_iar(void)
|
||||
static u64 __maybe_unused gic_read_iar(void)
|
||||
{
|
||||
u64 irqstat;
|
||||
|
||||
|
@ -112,24 +112,24 @@ static u64 gic_read_iar(void)
|
|||
return irqstat;
|
||||
}
|
||||
|
||||
static void gic_write_pmr(u64 val)
|
||||
static void __maybe_unused gic_write_pmr(u64 val)
|
||||
{
|
||||
asm volatile("msr_s " __stringify(ICC_PMR_EL1) ", %0" : : "r" (val));
|
||||
}
|
||||
|
||||
static void gic_write_ctlr(u64 val)
|
||||
static void __maybe_unused gic_write_ctlr(u64 val)
|
||||
{
|
||||
asm volatile("msr_s " __stringify(ICC_CTLR_EL1) ", %0" : : "r" (val));
|
||||
isb();
|
||||
}
|
||||
|
||||
static void gic_write_grpen1(u64 val)
|
||||
static void __maybe_unused gic_write_grpen1(u64 val)
|
||||
{
|
||||
asm volatile("msr_s " __stringify(ICC_GRPEN1_EL1) ", %0" : : "r" (val));
|
||||
isb();
|
||||
}
|
||||
|
||||
static void gic_write_sgi1r(u64 val)
|
||||
static void __maybe_unused gic_write_sgi1r(u64 val)
|
||||
{
|
||||
asm volatile("msr_s " __stringify(ICC_SGI1R_EL1) ", %0" : : "r" (val));
|
||||
}
|
||||
|
@ -200,19 +200,6 @@ static void gic_poke_irq(struct irq_data *d, u32 offset)
|
|||
rwp_wait();
|
||||
}
|
||||
|
||||
static int gic_peek_irq(struct irq_data *d, u32 offset)
|
||||
{
|
||||
u32 mask = 1 << (gic_irq(d) % 32);
|
||||
void __iomem *base;
|
||||
|
||||
if (gic_irq_in_rdist(d))
|
||||
base = gic_data_rdist_sgi_base();
|
||||
else
|
||||
base = gic_data.dist_base;
|
||||
|
||||
return !!(readl_relaxed(base + offset + (gic_irq(d) / 32) * 4) & mask);
|
||||
}
|
||||
|
||||
static void gic_mask_irq(struct irq_data *d)
|
||||
{
|
||||
gic_poke_irq(d, GICD_ICENABLER);
|
||||
|
@ -401,6 +388,19 @@ static void gic_cpu_init(void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static int gic_peek_irq(struct irq_data *d, u32 offset)
|
||||
{
|
||||
u32 mask = 1 << (gic_irq(d) % 32);
|
||||
void __iomem *base;
|
||||
|
||||
if (gic_irq_in_rdist(d))
|
||||
base = gic_data_rdist_sgi_base();
|
||||
else
|
||||
base = gic_data.dist_base;
|
||||
|
||||
return !!(readl_relaxed(base + offset + (gic_irq(d) / 32) * 4) & mask);
|
||||
}
|
||||
|
||||
static int gic_secondary_init(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
|
|
|
@ -867,7 +867,7 @@ static int gic_routable_irq_domain_xlate(struct irq_domain *d,
|
|||
return 0;
|
||||
}
|
||||
|
||||
const struct irq_domain_ops gic_default_routable_irq_domain_ops = {
|
||||
static const struct irq_domain_ops gic_default_routable_irq_domain_ops = {
|
||||
.map = gic_routable_irq_domain_map,
|
||||
.unmap = gic_routable_irq_domain_unmap,
|
||||
.xlate = gic_routable_irq_domain_xlate,
|
||||
|
|
Загрузка…
Ссылка в новой задаче