[PATCH v2 04/10] powerpc/xive: Native exploitation of the XIVE interrupt controller
kbuild test robot
lkp at intel.com
Thu Apr 6 08:46:13 AEST 2017
Hi Benjamin,
[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.11-rc5 next-20170405]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Benjamin-Herrenschmidt/powerpc-Add-more-PPC-bit-conversion-macros/20170406-041935
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-defconfig (attached as .config)
compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_populate_irq_data':
>> arch/powerpc/sysdev/xive/native.c:55:7: error: implicit declaration of function 'opal_xive_get_irq_info' [-Werror=implicit-function-declaration]
rc = opal_xive_get_irq_info(hw_irq, &flags, &eoi_page, &trig_page,
^~~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:64:19: error: 'OPAL_XIVE_IRQ_STORE_EOI' undeclared (first use in this function)
if (opal_flags & OPAL_XIVE_IRQ_STORE_EOI)
^~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c:64:19: note: each undeclared identifier is reported only once for each function it appears in
>> arch/powerpc/sysdev/xive/native.c:66:19: error: 'OPAL_XIVE_IRQ_LSI' undeclared (first use in this function)
if (opal_flags & OPAL_XIVE_IRQ_LSI)
^~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:68:19: error: 'OPAL_XIVE_IRQ_SHIFT_BUG' undeclared (first use in this function)
if (opal_flags & OPAL_XIVE_IRQ_SHIFT_BUG)
^~~~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:70:19: error: 'OPAL_XIVE_IRQ_MASK_VIA_FW' undeclared (first use in this function)
if (opal_flags & OPAL_XIVE_IRQ_MASK_VIA_FW)
^~~~~~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:72:19: error: 'OPAL_XIVE_IRQ_EOI_VIA_FW' undeclared (first use in this function)
if (opal_flags & OPAL_XIVE_IRQ_EOI_VIA_FW)
^~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_configure_irq':
>> arch/powerpc/sysdev/xive/native.c:105:8: error: implicit declaration of function 'opal_xive_set_irq_config' [-Werror=implicit-function-declaration]
rc = opal_xive_set_irq_config(hw_irq, target, prio, sw_irq);
^~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_configure_queue':
>> arch/powerpc/sysdev/xive/native.c:135:7: error: implicit declaration of function 'opal_xive_get_queue_info' [-Werror=implicit-function-declaration]
rc = opal_xive_get_queue_info(vp_id, prio, NULL, NULL,
^~~~~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:148:10: error: 'OPAL_XIVE_EQ_ALWAYS_NOTIFY' undeclared (first use in this function)
flags = OPAL_XIVE_EQ_ALWAYS_NOTIFY | OPAL_XIVE_EQ_ENABLED;
^~~~~~~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:148:39: error: 'OPAL_XIVE_EQ_ENABLED' undeclared (first use in this function)
flags = OPAL_XIVE_EQ_ALWAYS_NOTIFY | OPAL_XIVE_EQ_ENABLED;
^~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:153:12: error: 'OPAL_XIVE_EQ_ESCALATE' undeclared (first use in this function)
flags |= OPAL_XIVE_EQ_ESCALATE;
^~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:158:8: error: implicit declaration of function 'opal_xive_set_queue_info' [-Werror=implicit-function-declaration]
rc = opal_xive_set_queue_info(vp_id, prio, qpage_phys, order, flags);
^~~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_get_ipi':
>> arch/powerpc/sysdev/xive/native.c:254:9: error: implicit declaration of function 'opal_xive_allocate_irq' [-Werror=implicit-function-declaration]
irq = opal_xive_allocate_irq(chip_id);
^~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_alloc_irq':
>> arch/powerpc/sysdev/xive/native.c:275:31: error: 'OPAL_XIVE_ANY_CHIP' undeclared (first use in this function)
rc = opal_xive_allocate_irq(OPAL_XIVE_ANY_CHIP);
^~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_free_irq':
>> arch/powerpc/sysdev/xive/native.c:288:12: error: implicit declaration of function 'opal_xive_free_irq' [-Werror=implicit-function-declaration]
s64 rc = opal_xive_free_irq(irq);
^~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_shutdown':
>> arch/powerpc/sysdev/xive/native.c:317:2: error: implicit declaration of function 'opal_xive_reset' [-Werror=implicit-function-declaration]
opal_xive_reset(OPAL_XIVE_MODE_EMU);
^~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:317:18: error: 'OPAL_XIVE_MODE_EMU' undeclared (first use in this function)
opal_xive_reset(OPAL_XIVE_MODE_EMU);
^~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_setup_cpu':
>> arch/powerpc/sysdev/xive/native.c:392:8: error: implicit declaration of function 'opal_xive_set_vp_info' [-Werror=implicit-function-declaration]
rc = opal_xive_set_vp_info(vp, OPAL_XIVE_VP_ENABLED, 0);
^~~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:392:34: error: 'OPAL_XIVE_VP_ENABLED' undeclared (first use in this function)
rc = opal_xive_set_vp_info(vp, OPAL_XIVE_VP_ENABLED, 0);
^~~~~~~~~~~~~~~~~~~~
>> arch/powerpc/sysdev/xive/native.c:403:7: error: implicit declaration of function 'opal_xive_get_vp_info' [-Werror=implicit-function-declaration]
rc = opal_xive_get_vp_info(vp, NULL, &vp_cam_be, NULL, NULL);
^~~~~~~~~~~~~~~~~~~~~
arch/powerpc/sysdev/xive/native.c: In function 'xive_native_sync_source':
--
arch/powerpc/xmon/xmon.c: In function 'dump_one_xive':
>> arch/powerpc/xmon/xmon.c:2352:2: error: implicit declaration of function 'opal_xive_dump' [-Werror=implicit-function-declaration]
opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
^~~~~~~~~~~~~~
>> arch/powerpc/xmon/xmon.c:2352:17: error: 'XIVE_DUMP_TM_HYP' undeclared (first use in this function)
opal_xive_dump(XIVE_DUMP_TM_HYP, hwid);
^~~~~~~~~~~~~~~~
arch/powerpc/xmon/xmon.c:2352:17: note: each undeclared identifier is reported only once for each function it appears in
>> arch/powerpc/xmon/xmon.c:2353:17: error: 'XIVE_DUMP_TM_POOL' undeclared (first use in this function)
opal_xive_dump(XIVE_DUMP_TM_POOL, hwid);
^~~~~~~~~~~~~~~~~
>> arch/powerpc/xmon/xmon.c:2354:17: error: 'XIVE_DUMP_TM_OS' undeclared (first use in this function)
opal_xive_dump(XIVE_DUMP_TM_OS, hwid);
^~~~~~~~~~~~~~~
>> arch/powerpc/xmon/xmon.c:2355:17: error: 'XIVE_DUMP_TM_USER' undeclared (first use in this function)
opal_xive_dump(XIVE_DUMP_TM_USER, hwid);
^~~~~~~~~~~~~~~~~
>> arch/powerpc/xmon/xmon.c:2356:17: error: 'XIVE_DUMP_VP' undeclared (first use in this function)
opal_xive_dump(XIVE_DUMP_VP, hwid);
^~~~~~~~~~~~
>> arch/powerpc/xmon/xmon.c:2357:17: error: 'XIVE_DUMP_EMU_STATE' undeclared (first use in this function)
opal_xive_dump(XIVE_DUMP_EMU_STATE, hwid);
^~~~~~~~~~~~~~~~~~~
arch/powerpc/xmon/xmon.c: In function 'dump_one_xive_irq':
>> arch/powerpc/xmon/xmon.c:2393:7: error: implicit declaration of function 'opal_xive_get_irq_config' [-Werror=implicit-function-declaration]
rc = opal_xive_get_irq_config(num, &vp, &prio, &lirq);
^~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
vim +/opal_xive_get_irq_info +55 arch/powerpc/sysdev/xive/native.c
49 __be32 esb_shift, src_chip;
50 u64 opal_flags;
51 s64 rc;
52
53 memset(data, 0, sizeof(*data));
54
> 55 rc = opal_xive_get_irq_info(hw_irq, &flags, &eoi_page, &trig_page,
56 &esb_shift, &src_chip);
57 if (rc) {
58 pr_err("XIVE: opal_xive_get_irq_info(0x%x) returned %lld\n",
59 hw_irq, rc);
60 return -EINVAL;
61 }
62
63 opal_flags = be64_to_cpu(flags);
> 64 if (opal_flags & OPAL_XIVE_IRQ_STORE_EOI)
65 data->flags |= XIVE_IRQ_FLAG_STORE_EOI;
> 66 if (opal_flags & OPAL_XIVE_IRQ_LSI)
67 data->flags |= XIVE_IRQ_FLAG_LSI;
> 68 if (opal_flags & OPAL_XIVE_IRQ_SHIFT_BUG)
69 data->flags |= XIVE_IRQ_FLAG_SHIFT_BUG;
> 70 if (opal_flags & OPAL_XIVE_IRQ_MASK_VIA_FW)
71 data->flags |= XIVE_IRQ_FLAG_MASK_FW;
> 72 if (opal_flags & OPAL_XIVE_IRQ_EOI_VIA_FW)
73 data->flags |= XIVE_IRQ_FLAG_EOI_FW;
74 data->eoi_page = be64_to_cpu(eoi_page);
75 data->trig_page = be64_to_cpu(trig_page);
76 data->esb_shift = be32_to_cpu(esb_shift);
77 data->src_chip = be32_to_cpu(src_chip);
78
79 data->eoi_mmio = ioremap(data->eoi_page, 1u << data->esb_shift);
80 if (!data->eoi_mmio) {
81 pr_err("XIVE: Failed to map EOI page for irq 0x%x\n", hw_irq);
82 return -ENOMEM;
83 }
84
85 if (!data->trig_page)
86 return 0;
87 if (data->trig_page == data->eoi_page) {
88 data->trig_mmio = data->eoi_mmio;
89 return 0;
90 }
91
92 data->trig_mmio = ioremap(data->trig_page, 1u << data->esb_shift);
93 if (!data->trig_mmio) {
94 pr_err("XIVE: Failed to map trigger page for irq 0x%x\n", hw_irq);
95 return -ENOMEM;
96 }
97 return 0;
98 }
99
100 int xive_native_configure_irq(u32 hw_irq, u32 target, u8 prio, u32 sw_irq)
101 {
102 s64 rc;
103
104 for (;;) {
> 105 rc = opal_xive_set_irq_config(hw_irq, target, prio, sw_irq);
106 if (rc != OPAL_BUSY)
107 break;
108 msleep(1);
109 }
110 return rc == 0 ? 0 : -ENXIO;
111 }
112
113 /* This can be called multiple time to change a queue configuration */
114 int xive_native_configure_queue(u32 vp_id, struct xive_q *q, u8 prio,
115 __be32 *qpage, u32 order, bool can_escalate)
116 {
117 s64 rc = 0;
118 __be64 qeoi_page_be;
119 __be32 esc_irq_be;
120 u64 flags, qpage_phys;
121
122 /* If there's an actual queue page, clean it */
123 if (order) {
124 if (WARN_ON(!qpage))
125 return -EINVAL;
126 qpage_phys = __pa(qpage);
127 } else
128 qpage_phys = 0;
129
130 /* Initialize the rest of the fields */
131 q->msk = order ? ((1u << (order - 2)) - 1) : 0;
132 q->idx = 0;
133 q->toggle = 0;
134
> 135 rc = opal_xive_get_queue_info(vp_id, prio, NULL, NULL,
136 &qeoi_page_be,
137 &esc_irq_be,
138 NULL);
139 if (rc) {
140 pr_err("XIVE: Error %lld getting queue info prio %d\n",
141 rc, prio);
142 rc = -EIO;
143 goto fail;
144 }
145 q->eoi_phys = be64_to_cpu(qeoi_page_be);
146
147 /* Default flags */
> 148 flags = OPAL_XIVE_EQ_ALWAYS_NOTIFY | OPAL_XIVE_EQ_ENABLED;
149
150 /* Escalation needed ? */
151 if (can_escalate) {
152 q->esc_irq = be32_to_cpu(esc_irq_be);
> 153 flags |= OPAL_XIVE_EQ_ESCALATE;
154 }
155
156 /* Configure and enable the queue in HW */
157 for (;;) {
> 158 rc = opal_xive_set_queue_info(vp_id, prio, qpage_phys, order, flags);
159 if (rc != OPAL_BUSY)
160 break;
161 msleep(1);
162 }
163 if (rc) {
164 pr_err("XIVE: Error %lld setting queue for prio %d\n",
165 rc, prio);
166 rc = -EIO;
167 } else {
168 /*
169 * KVM code requires all of the above to be visible before
170 * q->qpage is set due to how it manages IPI EOIs
171 */
172 wmb();
173 q->qpage = qpage;
174 }
175 fail:
176 return rc;
177 }
178
179 static void __xive_native_disable_queue(u32 vp_id, struct xive_q *q, u8 prio)
180 {
181 s64 rc;
182
183 /* Disable the queue in HW */
184 for (;;) {
185 rc = opal_xive_set_queue_info(vp_id, prio, 0, 0, 0);
186 break;
187 msleep(1);
188 }
189 if (rc)
190 pr_err("XIVE: Error %lld disabling queue for prio %d\n",
191 rc, prio);
192 }
193
194 void xive_native_disable_queue(u32 vp_id, struct xive_q *q, u8 prio)
195 {
196 __xive_native_disable_queue(vp_id, q, prio);
197 }
198
199 static int xive_native_setup_queue(unsigned int cpu, struct xive_cpu *xc, u8 prio)
200 {
201 struct xive_q *q = &xc->queue[prio];
202 unsigned int alloc_order;
203 struct page *pages;
204 __be32 *qpage;
205
206 alloc_order = (xive_queue_shift > PAGE_SHIFT) ?
207 (xive_queue_shift - PAGE_SHIFT) : 0;
208 pages = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, alloc_order);
209 if (!pages)
210 return -ENOMEM;
211 qpage = (__be32 *)page_address(pages);
212 memset(qpage, 0, 1 << xive_queue_shift);
213 return xive_native_configure_queue(get_hard_smp_processor_id(cpu),
214 q, prio, qpage, xive_queue_shift, false);
215 }
216
217 static void xive_native_cleanup_queue(unsigned int cpu, struct xive_cpu *xc, u8 prio)
218 {
219 struct xive_q *q = &xc->queue[prio];
220 unsigned int alloc_order;
221
222 /*
223 * We use the variant with no iounmap as this is called on exec
224 * from an IPI and iounmap isn't safe
225 */
226 __xive_native_disable_queue(get_hard_smp_processor_id(cpu), q, prio);
227 alloc_order = (xive_queue_shift > PAGE_SHIFT) ?
228 (xive_queue_shift - PAGE_SHIFT) : 0;
229 free_pages((unsigned long)q->qpage, alloc_order);
230 q->qpage = NULL;
231 }
232
233 static bool xive_native_match(struct device_node *node)
234 {
235 return of_device_is_compatible(node, "ibm,opal-xive-vc");
236 }
237
238 #ifdef CONFIG_SMP
239 static int xive_native_get_ipi(unsigned int cpu, struct xive_cpu *xc)
240 {
241 struct device_node *np;
242 unsigned int chip_id;
243 s64 irq;
244
245 /* Find the chip ID */
246 np = of_get_cpu_node(cpu, NULL);
247 if (np) {
248 if (of_property_read_u32(np, "ibm,chip-id", &chip_id) < 0)
249 chip_id = 0;
250 }
251
252 /* Allocate an IPI and populate info about it */
253 for (;;) {
> 254 irq = opal_xive_allocate_irq(chip_id);
255 if (irq == OPAL_BUSY) {
256 msleep(1);
257 continue;
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 23099 bytes
Desc: not available
URL: <http://lists.ozlabs.org/pipermail/linuxppc-dev/attachments/20170406/a06269eb/attachment-0001.gz>
More information about the Linuxppc-dev
mailing list