[arm-platforms:irq/domain_cleanup 7/39] arch/mips/sgi-ip30/ip30-irq.c:222:2: error: implicit declaration of function 'irq_domain_set_info'
kernel test robot
lkp at intel.com
Tue May 18 16:47:56 PDT 2021
tree: https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git irq/domain_cleanup
head: 5019b17f095613b0b187d1cdcaa798347de62033
commit: e02a045e1bf414960f6b563a638c88ac6c96e490 [7/39] MIPS: Do not include linux/irqdomain.h from asm/irq.h
config: mips-randconfig-r003-20210519 (attached as .config)
compiler: mips64-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git/commit/?id=e02a045e1bf414960f6b563a638c88ac6c96e490
git remote add arm-platforms https://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms.git
git fetch --no-tags arm-platforms irq/domain_cleanup
git checkout e02a045e1bf414960f6b563a638c88ac6c96e490
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=mips
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>
All error/warnings (new ones prefixed by >>):
arch/mips/sgi-ip30/ip30-irq.c: In function 'ip30_normal_irq':
arch/mips/sgi-ip30/ip30-irq.c:132:9: error: implicit declaration of function 'irq_linear_revmap' [-Werror=implicit-function-declaration]
132 | irq = irq_linear_revmap(domain, __ffs(pend));
| ^~~~~~~~~~~~~~~~~
arch/mips/sgi-ip30/ip30-irq.c: In function 'heart_domain_alloc':
>> arch/mips/sgi-ip30/ip30-irq.c:222:2: error: implicit declaration of function 'irq_domain_set_info' [-Werror=implicit-function-declaration]
222 | irq_domain_set_info(domain, virq, hwirq, &heart_irq_chip, hd,
| ^~~~~~~~~~~~~~~~~~~
arch/mips/sgi-ip30/ip30-irq.c: In function 'heart_domain_free':
>> arch/mips/sgi-ip30/ip30-irq.c:236:9: error: implicit declaration of function 'irq_domain_get_irq_data'; did you mean 'irq_desc_get_irq_data'? [-Werror=implicit-function-declaration]
236 | irqd = irq_domain_get_irq_data(domain, virq);
| ^~~~~~~~~~~~~~~~~~~~~~~
| irq_desc_get_irq_data
>> arch/mips/sgi-ip30/ip30-irq.c:236:7: warning: assignment to 'struct irq_data *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
236 | irqd = irq_domain_get_irq_data(domain, virq);
| ^
arch/mips/sgi-ip30/ip30-irq.c: At top level:
>> arch/mips/sgi-ip30/ip30-irq.c:243:21: error: variable 'heart_domain_ops' has initializer but incomplete type
243 | static const struct irq_domain_ops heart_domain_ops = {
| ^~~~~~~~~~~~~~
>> arch/mips/sgi-ip30/ip30-irq.c:244:3: error: 'const struct irq_domain_ops' has no member named 'alloc'
244 | .alloc = heart_domain_alloc,
| ^~~~~
>> arch/mips/sgi-ip30/ip30-irq.c:244:11: warning: excess elements in struct initializer
244 | .alloc = heart_domain_alloc,
| ^~~~~~~~~~~~~~~~~~
arch/mips/sgi-ip30/ip30-irq.c:244:11: note: (near initialization for 'heart_domain_ops')
>> arch/mips/sgi-ip30/ip30-irq.c:245:3: error: 'const struct irq_domain_ops' has no member named 'free'
245 | .free = heart_domain_free,
| ^~~~
arch/mips/sgi-ip30/ip30-irq.c:245:11: warning: excess elements in struct initializer
245 | .free = heart_domain_free,
| ^~~~~~~~~~~~~~~~~
arch/mips/sgi-ip30/ip30-irq.c:245:11: note: (near initialization for 'heart_domain_ops')
arch/mips/sgi-ip30/ip30-irq.c: In function 'arch_init_irq':
>> arch/mips/sgi-ip30/ip30-irq.c:307:7: error: implicit declaration of function 'irq_domain_alloc_named_fwnode' [-Werror=implicit-function-declaration]
307 | fn = irq_domain_alloc_named_fwnode("HEART");
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> arch/mips/sgi-ip30/ip30-irq.c:307:5: warning: assignment to 'struct fwnode_handle *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
307 | fn = irq_domain_alloc_named_fwnode("HEART");
| ^
>> arch/mips/sgi-ip30/ip30-irq.c:311:11: error: implicit declaration of function 'irq_domain_create_linear' [-Werror=implicit-function-declaration]
311 | domain = irq_domain_create_linear(fn, HEART_NUM_IRQS,
| ^~~~~~~~~~~~~~~~~~~~~~~~
>> arch/mips/sgi-ip30/ip30-irq.c:311:9: warning: assignment to 'struct irq_domain *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
311 | domain = irq_domain_create_linear(fn, HEART_NUM_IRQS,
| ^
>> arch/mips/sgi-ip30/ip30-irq.c:317:2: error: implicit declaration of function 'irq_set_default_host' [-Werror=implicit-function-declaration]
317 | irq_set_default_host(domain);
| ^~~~~~~~~~~~~~~~~~~~
arch/mips/sgi-ip30/ip30-irq.c: At top level:
>> arch/mips/sgi-ip30/ip30-irq.c:243:36: error: storage size of 'heart_domain_ops' isn't known
243 | static const struct irq_domain_ops heart_domain_ops = {
| ^~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
--
arch/mips/pci/pci-xtalk-bridge.c: In function 'bridge_domain_alloc':
>> arch/mips/pci/pci-xtalk-bridge.c:347:8: error: implicit declaration of function 'irq_domain_alloc_irqs_parent' [-Werror=implicit-function-declaration]
347 | ret = irq_domain_alloc_irqs_parent(domain, virq, nr_irqs, arg);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> arch/mips/pci/pci-xtalk-bridge.c:351:3: error: implicit declaration of function 'irq_domain_set_info' [-Werror=implicit-function-declaration]
351 | irq_domain_set_info(domain, virq, info->pin, &bridge_irq_chip,
| ^~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c: In function 'bridge_domain_free':
>> arch/mips/pci/pci-xtalk-bridge.c:363:26: error: implicit declaration of function 'irq_domain_get_irq_data'; did you mean 'irq_desc_get_irq_data'? [-Werror=implicit-function-declaration]
363 | struct irq_data *irqd = irq_domain_get_irq_data(domain, virq);
| ^~~~~~~~~~~~~~~~~~~~~~~
| irq_desc_get_irq_data
>> arch/mips/pci/pci-xtalk-bridge.c:363:26: warning: initialization of 'struct irq_data *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
>> arch/mips/pci/pci-xtalk-bridge.c:369:2: error: implicit declaration of function 'irq_domain_free_irqs_top' [-Werror=implicit-function-declaration]
369 | irq_domain_free_irqs_top(domain, virq, nr_irqs);
| ^~~~~~~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c: At top level:
>> arch/mips/pci/pci-xtalk-bridge.c:418:21: error: variable 'bridge_domain_ops' has initializer but incomplete type
418 | static const struct irq_domain_ops bridge_domain_ops = {
| ^~~~~~~~~~~~~~
>> arch/mips/pci/pci-xtalk-bridge.c:419:3: error: 'const struct irq_domain_ops' has no member named 'alloc'
419 | .alloc = bridge_domain_alloc,
| ^~~~~
>> arch/mips/pci/pci-xtalk-bridge.c:419:16: warning: excess elements in struct initializer
419 | .alloc = bridge_domain_alloc,
| ^~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:419:16: note: (near initialization for 'bridge_domain_ops')
>> arch/mips/pci/pci-xtalk-bridge.c:420:3: error: 'const struct irq_domain_ops' has no member named 'free'
420 | .free = bridge_domain_free,
| ^~~~
arch/mips/pci/pci-xtalk-bridge.c:420:16: warning: excess elements in struct initializer
420 | .free = bridge_domain_free,
| ^~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:420:16: note: (near initialization for 'bridge_domain_ops')
>> arch/mips/pci/pci-xtalk-bridge.c:421:3: error: 'const struct irq_domain_ops' has no member named 'activate'
421 | .activate = bridge_domain_activate,
| ^~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:421:16: warning: excess elements in struct initializer
421 | .activate = bridge_domain_activate,
| ^~~~~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:421:16: note: (near initialization for 'bridge_domain_ops')
>> arch/mips/pci/pci-xtalk-bridge.c:422:3: error: 'const struct irq_domain_ops' has no member named 'deactivate'
422 | .deactivate = bridge_domain_deactivate
| ^~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:422:16: warning: excess elements in struct initializer
422 | .deactivate = bridge_domain_deactivate
| ^~~~~~~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:422:16: note: (near initialization for 'bridge_domain_ops')
arch/mips/pci/pci-xtalk-bridge.c: In function 'bridge_map_irq':
>> arch/mips/pci/pci-xtalk-bridge.c:457:9: error: implicit declaration of function 'irq_domain_alloc_irqs' [-Werror=implicit-function-declaration]
457 | irq = irq_domain_alloc_irqs(bc->domain, 1, bc->nasid, &info);
| ^~~~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c: In function 'bridge_probe':
>> arch/mips/pci/pci-xtalk-bridge.c:622:11: error: implicit declaration of function 'irq_get_default_host' [-Werror=implicit-function-declaration]
622 | parent = irq_get_default_host();
| ^~~~~~~~~~~~~~~~~~~~
>> arch/mips/pci/pci-xtalk-bridge.c:622:9: warning: assignment to 'struct irq_domain *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
622 | parent = irq_get_default_host();
| ^
>> arch/mips/pci/pci-xtalk-bridge.c:625:7: error: implicit declaration of function 'irq_domain_alloc_named_fwnode' [-Werror=implicit-function-declaration]
625 | fn = irq_domain_alloc_named_fwnode("BRIDGE");
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> arch/mips/pci/pci-xtalk-bridge.c:625:5: warning: assignment to 'struct fwnode_handle *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
625 | fn = irq_domain_alloc_named_fwnode("BRIDGE");
| ^
>> arch/mips/pci/pci-xtalk-bridge.c:628:11: error: implicit declaration of function 'irq_domain_create_hierarchy' [-Werror=implicit-function-declaration]
628 | domain = irq_domain_create_hierarchy(parent, 0, 8, fn,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c:628:9: warning: assignment to 'struct irq_domain *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
628 | domain = irq_domain_create_hierarchy(parent, 0, 8, fn,
| ^
>> arch/mips/pci/pci-xtalk-bridge.c:631:3: error: implicit declaration of function 'irq_domain_free_fwnode' [-Werror=implicit-function-declaration]
631 | irq_domain_free_fwnode(fn);
| ^~~~~~~~~~~~~~~~~~~~~~
>> arch/mips/pci/pci-xtalk-bridge.c:730:2: error: implicit declaration of function 'irq_domain_remove' [-Werror=implicit-function-declaration]
730 | irq_domain_remove(domain);
| ^~~~~~~~~~~~~~~~~
arch/mips/pci/pci-xtalk-bridge.c: In function 'bridge_remove':
>> arch/mips/pci/pci-xtalk-bridge.c:739:39: error: dereferencing pointer to incomplete type 'struct irq_domain'
739 | struct fwnode_handle *fn = bc->domain->fwnode;
| ^~
arch/mips/pci/pci-xtalk-bridge.c: At top level:
arch/mips/pci/pci-xtalk-bridge.c:418:36: error: storage size of 'bridge_domain_ops' isn't known
418 | static const struct irq_domain_ops bridge_domain_ops = {
| ^~~~~~~~~~~~~~~~~
In file included from arch/mips/include/asm/pci/bridge.h:17,
from arch/mips/pci/pci-xtalk-bridge.c:17:
arch/mips/include/asm/xtalk/xwidget.h:124:46: warning: 'widget_idents' defined but not used [-Wunused-const-variable=]
124 | static const struct widget_ident __initconst widget_idents[] = {
| ^~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/irq_domain_set_info +222 arch/mips/sgi-ip30/ip30-irq.c
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 95
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 96 static void ip30_normal_irq(struct irq_desc *desc)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 97 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 98 int cpu = smp_processor_id();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 99 struct irq_domain *domain;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 100 u64 pend, mask;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 101 int irq;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 102
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 103 pend = heart_read(&heart_regs->isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 104 mask = (heart_read(&heart_regs->imr[cpu]) &
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 105 (HEART_L0_INT_MASK | HEART_L1_INT_MASK | HEART_L2_INT_MASK));
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 106
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 107 pend &= mask;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 108 if (unlikely(!pend))
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 109 return;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 110
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 111 #ifdef CONFIG_SMP
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 112 if (pend & BIT_ULL(HEART_L2_INT_RESCHED_CPU_0)) {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 113 heart_write(BIT_ULL(HEART_L2_INT_RESCHED_CPU_0),
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 114 &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 115 scheduler_ipi();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 116 } else if (pend & BIT_ULL(HEART_L2_INT_RESCHED_CPU_1)) {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 117 heart_write(BIT_ULL(HEART_L2_INT_RESCHED_CPU_1),
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 118 &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 119 scheduler_ipi();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 120 } else if (pend & BIT_ULL(HEART_L2_INT_CALL_CPU_0)) {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 121 heart_write(BIT_ULL(HEART_L2_INT_CALL_CPU_0),
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 122 &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 123 generic_smp_call_function_interrupt();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 124 } else if (pend & BIT_ULL(HEART_L2_INT_CALL_CPU_1)) {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 125 heart_write(BIT_ULL(HEART_L2_INT_CALL_CPU_1),
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 126 &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 127 generic_smp_call_function_interrupt();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 128 } else
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 129 #endif
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 130 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 131 domain = irq_desc_get_handler_data(desc);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @132 irq = irq_linear_revmap(domain, __ffs(pend));
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 133 if (irq)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 134 generic_handle_irq(irq);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 135 else
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 136 spurious_interrupt();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 137 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 138 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 139
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 140 static void ip30_ack_heart_irq(struct irq_data *d)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 141 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 142 heart_write(BIT_ULL(d->hwirq), &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 143 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 144
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 145 static void ip30_mask_heart_irq(struct irq_data *d)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 146 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 147 struct heart_irq_data *hd = irq_data_get_irq_chip_data(d);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 148 unsigned long *mask = &per_cpu(irq_enable_mask, hd->cpu);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 149
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 150 clear_bit(d->hwirq, mask);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 151 heart_write(*mask, &heart_regs->imr[hd->cpu]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 152 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 153
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 154 static void ip30_mask_and_ack_heart_irq(struct irq_data *d)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 155 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 156 struct heart_irq_data *hd = irq_data_get_irq_chip_data(d);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 157 unsigned long *mask = &per_cpu(irq_enable_mask, hd->cpu);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 158
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 159 clear_bit(d->hwirq, mask);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 160 heart_write(*mask, &heart_regs->imr[hd->cpu]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 161 heart_write(BIT_ULL(d->hwirq), &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 162 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 163
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 164 static void ip30_unmask_heart_irq(struct irq_data *d)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 165 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 166 struct heart_irq_data *hd = irq_data_get_irq_chip_data(d);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 167 unsigned long *mask = &per_cpu(irq_enable_mask, hd->cpu);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 168
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 169 set_bit(d->hwirq, mask);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 170 heart_write(*mask, &heart_regs->imr[hd->cpu]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 171 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 172
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 173 static int ip30_set_heart_irq_affinity(struct irq_data *d,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 174 const struct cpumask *mask, bool force)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 175 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 176 struct heart_irq_data *hd = irq_data_get_irq_chip_data(d);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 177
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 178 if (!hd)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 179 return -EINVAL;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 180
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 181 if (irqd_is_started(d))
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 182 ip30_mask_and_ack_heart_irq(d);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 183
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 184 hd->cpu = cpumask_first_and(mask, cpu_online_mask);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 185
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 186 if (irqd_is_started(d))
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 187 ip30_unmask_heart_irq(d);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 188
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 189 irq_data_update_effective_affinity(d, cpumask_of(hd->cpu));
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 190
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 191 return 0;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 192 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 193
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 194 static struct irq_chip heart_irq_chip = {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 195 .name = "HEART",
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 196 .irq_ack = ip30_ack_heart_irq,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 197 .irq_mask = ip30_mask_heart_irq,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 198 .irq_mask_ack = ip30_mask_and_ack_heart_irq,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 199 .irq_unmask = ip30_unmask_heart_irq,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 200 .irq_set_affinity = ip30_set_heart_irq_affinity,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 201 };
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 202
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 203 static int heart_domain_alloc(struct irq_domain *domain, unsigned int virq,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 204 unsigned int nr_irqs, void *arg)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 205 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 206 struct irq_alloc_info *info = arg;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 207 struct heart_irq_data *hd;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 208 int hwirq;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 209
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 210 if (nr_irqs > 1 || !info)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 211 return -EINVAL;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 212
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 213 hd = kzalloc(sizeof(*hd), GFP_KERNEL);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 214 if (!hd)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 215 return -ENOMEM;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 216
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 217 hwirq = heart_alloc_int();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 218 if (hwirq < 0) {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 219 kfree(hd);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 220 return -EAGAIN;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 221 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @222 irq_domain_set_info(domain, virq, hwirq, &heart_irq_chip, hd,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 223 handle_level_irq, NULL, NULL);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 224
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 225 return 0;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 226 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 227
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 228 static void heart_domain_free(struct irq_domain *domain,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 229 unsigned int virq, unsigned int nr_irqs)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 230 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 231 struct irq_data *irqd;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 232
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 233 if (nr_irqs > 1)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 234 return;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 235
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @236 irqd = irq_domain_get_irq_data(domain, virq);
c0e79fd89749b0 Thomas Bogendoerfer 2020-01-22 237 if (irqd) {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 238 clear_bit(irqd->hwirq, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 239 kfree(irqd->chip_data);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 240 }
c0e79fd89749b0 Thomas Bogendoerfer 2020-01-22 241 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 242
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @243 static const struct irq_domain_ops heart_domain_ops = {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @244 .alloc = heart_domain_alloc,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @245 .free = heart_domain_free,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 246 };
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 247
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 248 void __init ip30_install_ipi(void)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 249 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 250 int cpu = smp_processor_id();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 251 unsigned long *mask = &per_cpu(irq_enable_mask, cpu);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 252
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 253 set_bit(HEART_L2_INT_RESCHED_CPU_0 + cpu, mask);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 254 heart_write(BIT_ULL(HEART_L2_INT_RESCHED_CPU_0 + cpu),
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 255 &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 256 set_bit(HEART_L2_INT_CALL_CPU_0 + cpu, mask);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 257 heart_write(BIT_ULL(HEART_L2_INT_CALL_CPU_0 + cpu),
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 258 &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 259
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 260 heart_write(*mask, &heart_regs->imr[cpu]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 261 }
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 262
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 263 void __init arch_init_irq(void)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 264 {
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 265 struct irq_domain *domain;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 266 struct fwnode_handle *fn;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 267 unsigned long *mask;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 268 int i;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 269
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 270 mips_cpu_irq_init();
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 271
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 272 /* Mask all IRQs. */
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 273 heart_write(HEART_CLR_ALL_MASK, &heart_regs->imr[0]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 274 heart_write(HEART_CLR_ALL_MASK, &heart_regs->imr[1]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 275 heart_write(HEART_CLR_ALL_MASK, &heart_regs->imr[2]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 276 heart_write(HEART_CLR_ALL_MASK, &heart_regs->imr[3]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 277
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 278 /* Ack everything. */
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 279 heart_write(HEART_ACK_ALL_MASK, &heart_regs->clear_isr);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 280
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 281 /* Enable specific HEART error IRQs for each CPU. */
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 282 mask = &per_cpu(irq_enable_mask, 0);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 283 *mask |= HEART_CPU0_ERR_MASK;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 284 heart_write(*mask, &heart_regs->imr[0]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 285 mask = &per_cpu(irq_enable_mask, 1);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 286 *mask |= HEART_CPU1_ERR_MASK;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 287 heart_write(*mask, &heart_regs->imr[1]);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 288
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 289 /*
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 290 * Some HEART bits are reserved by hardware or by software convention.
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 291 * Mark these as reserved right away so they won't be accidentally
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 292 * used later.
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 293 */
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 294 set_bit(HEART_L0_INT_GENERIC, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 295 set_bit(HEART_L0_INT_FLOW_CTRL_HWTR_0, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 296 set_bit(HEART_L0_INT_FLOW_CTRL_HWTR_1, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 297 set_bit(HEART_L2_INT_RESCHED_CPU_0, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 298 set_bit(HEART_L2_INT_RESCHED_CPU_1, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 299 set_bit(HEART_L2_INT_CALL_CPU_0, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 300 set_bit(HEART_L2_INT_CALL_CPU_1, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 301 set_bit(HEART_L3_INT_TIMER, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 302
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 303 /* Reserve the error interrupts (#51 to #63). */
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 304 for (i = HEART_L4_INT_XWID_ERR_9; i <= HEART_L4_INT_HEART_EXCP; i++)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 305 set_bit(i, heart_irq_map);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 306
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @307 fn = irq_domain_alloc_named_fwnode("HEART");
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 308 WARN_ON(fn == NULL);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 309 if (!fn)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 310 return;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @311 domain = irq_domain_create_linear(fn, HEART_NUM_IRQS,
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 312 &heart_domain_ops, NULL);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 313 WARN_ON(domain == NULL);
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 314 if (!domain)
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 315 return;
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 316
7505576d1c1ac0 Thomas Bogendoerfer 2019-10-24 @317 irq_set_default_host(domain);
:::::: The code at line 222 was first introduced by commit
:::::: 7505576d1c1ac0cfe85fdf90999433dd8b673012 MIPS: add support for SGI Octane (IP30)
:::::: TO: Thomas Bogendoerfer <tbogendoerfer at suse.de>
:::::: CC: Paul Burton <paulburton at kernel.org>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 30206 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20210519/a4458648/attachment-0001.gz>
More information about the linux-arm-kernel
mailing list