All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Radu Rendec <rrendec@redhat.com>, Thomas Gleixner <tglx@linutronix.de>
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev,
	linux-kernel@vger.kernel.org, Brian Masney <bmasney@redhat.com>,
	Eric Chanudet <echanude@redhat.com>
Subject: Re: [PATCH 1/1] samples: Add irqchip test driver
Date: Fri, 26 Sep 2025 07:27:09 +0800	[thread overview]
Message-ID: <202509260730.o2TJUGJS-lkp@intel.com> (raw)
In-Reply-To: <20250923232905.1510547-2-rrendec@redhat.com>

Hi Radu,

kernel test robot noticed the following build errors:

[auto build test ERROR on linus/master]
[also build test ERROR on v6.17-rc7 next-20250925]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Radu-Rendec/samples-Add-irqchip-test-driver/20250924-073245
base:   linus/master
patch link:    https://lore.kernel.org/r/20250923232905.1510547-2-rrendec%40redhat.com
patch subject: [PATCH 1/1] samples: Add irqchip test driver
config: i386-randconfig-015-20250926 (https://download.01.org/0day-ci/archive/20250926/202509260730.o2TJUGJS-lkp@intel.com/config)
compiler: clang version 20.1.8 (https://github.com/llvm/llvm-project 87f0227cb60147a26a1eeb4fb06e3b505e9c7261)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250926/202509260730.o2TJUGJS-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202509260730.o2TJUGJS-lkp@intel.com/

All errors (new ones prefixed by >>):

>> samples/irqchip/irqc_test.c:187:10: error: use of undeclared identifier 'irq_domain_free_irqs_common'; did you mean 'irq_domain_free_irqs'?
     187 |         .free = irq_domain_free_irqs_common,
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                 irq_domain_free_irqs
   include/linux/irqdomain.h:651:20: note: 'irq_domain_free_irqs' declared here
     651 | static inline void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs) { }
         |                    ^
>> samples/irqchip/irqc_test.c:186:3: error: field designator 'alloc' does not refer to any field in type 'const struct irq_domain_ops'
     186 |         .alloc = root_alloc,
         |         ~^~~~~~~~~~~~~~~~~~
>> samples/irqchip/irqc_test.c:187:3: error: field designator 'free' does not refer to any field in type 'const struct irq_domain_ops'
     187 |         .free = irq_domain_free_irqs_common,
         |         ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> samples/irqchip/irqc_test.c:188:3: error: field designator 'translate' does not refer to any field in type 'const struct irq_domain_ops'
     188 |         .translate = irq_domain_translate_onecell,
         |         ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> samples/irqchip/irqc_test.c:198:13: error: use of undeclared identifier 'irq_chip_ack_parent'
     198 |         .irq_ack = irq_chip_ack_parent,
         |                    ^
>> samples/irqchip/irqc_test.c:199:22: error: use of undeclared identifier 'irq_chip_set_affinity_parent'; did you mean 'irq_set_affinity_hint'?
     199 |         .irq_set_affinity = irq_chip_set_affinity_parent,
         |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                             irq_set_affinity_hint
   include/linux/interrupt.h:404:19: note: 'irq_set_affinity_hint' declared here
     404 | static inline int irq_set_affinity_hint(unsigned int irq,
         |                   ^
>> samples/irqchip/irqc_test.c:219:19: error: no member named 'parent' in 'struct irq_domain'
     219 |                 .fwnode = irqd->parent->fwnode,
         |                           ~~~~  ^
>> samples/irqchip/irqc_test.c:236:20: error: no member named 'parent_data' in 'struct irq_data'
     236 |                         virq + i, d, d->parent_data);
         |                                      ~  ^
   include/linux/printk.h:587:34: note: expanded from macro 'pr_info'
     587 |         printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)
         |                                         ^~~~~~~~~~~
   include/linux/printk.h:514:60: note: expanded from macro 'printk'
     514 | #define printk(fmt, ...) printk_index_wrap(_printk, fmt, ##__VA_ARGS__)
         |                                                            ^~~~~~~~~~~
   include/linux/printk.h:486:19: note: expanded from macro 'printk_index_wrap'
     486 |                 _p_func(_fmt, ##__VA_ARGS__);                           \
         |                                 ^~~~~~~~~~~
>> samples/irqchip/irqc_test.c:237:3: error: call to undeclared function 'irq_domain_set_hwirq_and_chip'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     237 |                 irq_domain_set_hwirq_and_chip(irqd, virq + i, hwirq + i,
         |                 ^
>> samples/irqchip/irqc_test.c:256:9: error: call to undeclared function 'irq_domain_alloc_irqs_parent'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     256 |         return irq_domain_alloc_irqs_parent(irqd, virq, nr_irqs, &parent_fwspec);
         |                ^
   samples/irqchip/irqc_test.c:256:9: note: did you mean 'irq_domain_alloc_irqs'?
   include/linux/irqdomain.h:645:19: note: 'irq_domain_alloc_irqs' declared here
     645 | static inline int irq_domain_alloc_irqs(struct irq_domain *domain, unsigned int nr_irqs,
         |                   ^
   samples/irqchip/irqc_test.c:269:10: error: use of undeclared identifier 'irq_domain_free_irqs_common'; did you mean 'irq_domain_free_irqs'?
     269 |         .free = irq_domain_free_irqs_common,
         |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |                 irq_domain_free_irqs
   include/linux/irqdomain.h:651:20: note: 'irq_domain_free_irqs' declared here
     651 | static inline void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs) { }
         |                    ^
   samples/irqchip/irqc_test.c:268:3: error: field designator 'alloc' does not refer to any field in type 'const struct irq_domain_ops'
     268 |         .alloc = hier_alloc,
         |         ~^~~~~~~~~~~~~~~~~~
   samples/irqchip/irqc_test.c:269:3: error: field designator 'free' does not refer to any field in type 'const struct irq_domain_ops'
     269 |         .free = irq_domain_free_irqs_common,
         |         ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   samples/irqchip/irqc_test.c:270:3: error: field designator 'translate' does not refer to any field in type 'const struct irq_domain_ops'
     270 |         .translate = irq_domain_translate_onecell,
         |         ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> samples/irqchip/irqc_test.c:438:14: error: call to undeclared function 'irq_domain_create_hierarchy'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     438 |         hier_irqd = irq_domain_create_hierarchy(root_irqd, 0, NUM_TOTAL_IRQS_HIER,
         |                     ^
   samples/irqchip/irqc_test.c:438:14: note: did you mean 'irq_domain_create_legacy'?
   include/linux/irqdomain.h:324:20: note: 'irq_domain_create_legacy' declared here
     324 | struct irq_domain *irq_domain_create_legacy(struct fwnode_handle *fwnode, unsigned int size,
         |                    ^
>> samples/irqchip/irqc_test.c:438:12: error: incompatible integer to pointer conversion assigning to 'struct irq_domain *' from 'int' [-Wint-conversion]
     438 |         hier_irqd = irq_domain_create_hierarchy(root_irqd, 0, NUM_TOTAL_IRQS_HIER,
         |                   ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     439 |                                                 hier_fwnode, &hier_ops, NULL);
         |                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   16 errors generated.


vim +187 samples/irqchip/irqc_test.c

   166	
   167	/*
   168	 * Parent IRQ domains *must* use the new API (i.e. alloc/free vs. map) to
   169	 * support hierarchy, for the following reasons:
   170	 *   - The child .alloc() function calls irq_domain_alloc_irqs_parent().
   171	 *   - The irq_domain_alloc_irqs_hierarchy() is just a thin wrapper around
   172	 *     irq_domain_alloc_irqs_hierarchy().
   173	 *   - Finally, irq_domain_alloc_irqs_hierarchy() explicitly checks that
   174	 *     the (parent) domain implements the alloc() function and returns an
   175	 *     error otherwise.
   176	 *
   177	 * Furthermore, Documentation/core-api/irq/irq-domain.rst clearly states that
   178	 * the new API must be used for all domains to support hierarchy.
   179	 *
   180	 * Note: The .free() function is also part of the new API and is mandatory but
   181	 *       there is a default implementation that we can use. If we do not
   182	 *       implement this function and .alloc() fails for whatever reason, we get
   183	 *       an oops as the IRQ framework tries to rollback whatever has been done.
   184	 */
   185	static const struct irq_domain_ops root_ops = {
 > 186		.alloc = root_alloc,
 > 187		.free = irq_domain_free_irqs_common,
 > 188		.translate = irq_domain_translate_onecell,
   189	};
   190	
   191	/*
   192	 * Since hierarchical interrupts are mapped 1:1 in all domains along the path,
   193	 * CPU affinity is not shared with other interrupts. Use the parent handlers to
   194	 * set the affinity in the root domain.
   195	 */
   196	static const struct irq_chip hier_chip = {
   197		.name = "TEST-HIER-IC",
 > 198		.irq_ack = irq_chip_ack_parent,
 > 199		.irq_set_affinity = irq_chip_set_affinity_parent,
   200	};
   201	
   202	/*
   203	 * For a GPIO IRQ chip, this is gpiochip_hierarchy_irq_domain_alloc(), and the
   204	 * ops pointer is set in gpiochip_hierarchy_setup_domain_ops(), called from
   205	 * gpiochip_hierarchy_add_domain(). See full stack sample below in testirq_init().
   206	 *
   207	 * This function is called indirectly by irq_create_fwspec_mapping() through
   208	 * irq_domain_alloc_irqs_locked().
   209	 *
   210	 * How to search for other examples:
   211	 *   grep -rn '\.alloc\>' drivers/gpio/
   212	 *   grep -rn '\<irq_domain_alloc_irqs_parent\>' drivers/irqchip/
   213	 */
   214	static int hier_alloc(struct irq_domain *irqd, unsigned int virq,
   215			      unsigned int nr_irqs, void *data)
   216	{
   217		struct irq_fwspec *fwspec = data;
   218		struct irq_fwspec parent_fwspec = {
 > 219			.fwnode = irqd->parent->fwnode,
   220			.param_count = 1,
   221		};
   222		irq_hw_number_t hwirq;
   223		unsigned int type;
   224		int ret, i;
   225	
   226		pr_info("[%s] virq = %u, nr_irqs = %u\n", irqd->name, virq, nr_irqs);
   227	
   228		ret = irq_domain_translate_onecell(irqd, fwspec, &hwirq, &type);
   229		if (ret)
   230			return ret;
   231	
   232		for (i = 0; i < nr_irqs; i++) {
   233			struct irq_data *d = irq_get_irq_data(virq + i);
   234	
   235			pr_info("\tvirq = %u, data = %pS, parent = %pS\n",
 > 236				virq + i, d, d->parent_data);
 > 237			irq_domain_set_hwirq_and_chip(irqd, virq + i, hwirq + i,
   238						      &hier_chip, NULL);
   239		}
   240	
   241		/*
   242		 * We're not done yet, we still need to allocate interrupts in the
   243		 * parent domain. If we just "return 0" at this point, the upstream
   244		 * call to irq_create_fwspec_mapping() fails with -EINVAL.
   245		 *
   246		 * By now, the framework has already allocated a struct irq_data for
   247		 * each virq, for both our domain (hier) and the parent domain (root).
   248		 * So, irq_get_irq_data(virq) and irq_get_irq_data(virq)->parent_data
   249		 * are both non-null. The problem is that parent_data->chip is NULL,
   250		 * and this fails the sanity checks in irq_domain_trim_hierarchy()
   251		 * (called from irq_domain_alloc_irqs_locked()).
   252		 */
   253	
   254		parent_fwspec.param[0] = hwirq;
   255	
 > 256		return irq_domain_alloc_irqs_parent(irqd, virq, nr_irqs, &parent_fwspec);
   257	}
   258	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

      reply	other threads:[~2025-09-25 23:27 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-23 23:29 [PATCH 0/1] irqchip test driver/sandbox Radu Rendec
2025-09-23 23:29 ` [PATCH 1/1] samples: Add irqchip test driver Radu Rendec
2025-09-25 23:27   ` kernel test robot [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202509260730.o2TJUGJS-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=bmasney@redhat.com \
    --cc=echanude@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=llvm@lists.linux.dev \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=rrendec@redhat.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.