[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