All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Sven Peter <sven@svenpeter.dev>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org,
	Hector Martin <marcan@marcan.st>, Christoph Hellwig <hch@lst.de>,
	Arnd Bergmann <arnd@arndb.de>
Subject: [asahilinux:bits/050-nvme 6/9] drivers/nvme/host/apple.c:291:19: sparse: sparse: incorrect type in assignment (different base types)
Date: Sat, 25 Jun 2022 15:55:03 +0800	[thread overview]
Message-ID: <202206251551.PTd0wn6d-lkp@intel.com> (raw)

tree:   https://github.com/AsahiLinux/linux bits/050-nvme
head:   54dfe8ce63a23f4a11e9aa0481a09a6ec2267b2f
commit: 01cb5f6fdaf932ffa3f466b17a146e5784e19947 [6/9] nvme-apple: Add initial Apple SoC NVMe driver
config: openrisc-randconfig-s031-20220625
compiler: or1k-linux-gcc (GCC) 11.3.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # apt-get install sparse
        # sparse version: v0.6.4-31-g4880bd19-dirty
        # https://github.com/AsahiLinux/linux/commit/01cb5f6fdaf932ffa3f466b17a146e5784e19947
        git remote add asahilinux https://github.com/AsahiLinux/linux
        git fetch --no-tags asahilinux bits/050-nvme
        git checkout 01cb5f6fdaf932ffa3f466b17a146e5784e19947
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=openrisc SHELL=/bin/bash drivers/nvme/host/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
>> drivers/nvme/host/apple.c:291:19: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] prp1 @@     got restricted __le64 [usertype] prp1 @@
   drivers/nvme/host/apple.c:291:19: sparse:     expected unsigned long long [usertype] prp1
   drivers/nvme/host/apple.c:291:19: sparse:     got restricted __le64 [usertype] prp1
>> drivers/nvme/host/apple.c:292:19: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned long long [usertype] prp2 @@     got restricted __le64 [usertype] prp2 @@
   drivers/nvme/host/apple.c:292:19: sparse:     expected unsigned long long [usertype] prp2
   drivers/nvme/host/apple.c:292:19: sparse:     got restricted __le64 [usertype] prp2
>> drivers/nvme/host/apple.c:293:21: sparse: sparse: incorrect type in assignment (different base types) @@     expected unsigned int [usertype] length @@     got restricted __le16 [usertype] length @@
   drivers/nvme/host/apple.c:293:21: sparse:     expected unsigned int [usertype] length
   drivers/nvme/host/apple.c:293:21: sparse:     got restricted __le16 [usertype] length
>> drivers/nvme/host/apple.c:351:52: sparse: sparse: incorrect type in initializer (different base types) @@     expected unsigned int [usertype] next_dma_addr @@     got restricted __le64 [usertype] @@
   drivers/nvme/host/apple.c:351:52: sparse:     expected unsigned int [usertype] next_dma_addr
   drivers/nvme/host/apple.c:351:52: sparse:     got restricted __le64 [usertype]
>> drivers/nvme/host/apple.c:456:45: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] @@     got unsigned int [addressable] [usertype] prp_dma @@
   drivers/nvme/host/apple.c:456:45: sparse:     expected restricted __le64 [usertype]
   drivers/nvme/host/apple.c:456:45: sparse:     got unsigned int [addressable] [usertype] prp_dma
>> drivers/nvme/host/apple.c:459:31: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] @@     got unsigned long long [assigned] [usertype] dma_addr @@
   drivers/nvme/host/apple.c:459:31: sparse:     expected restricted __le64 [usertype]
   drivers/nvme/host/apple.c:459:31: sparse:     got unsigned long long [assigned] [usertype] dma_addr
>> drivers/nvme/host/apple.c:474:25: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] prp1 @@     got unsigned int [usertype] dma_address @@
   drivers/nvme/host/apple.c:474:25: sparse:     expected restricted __le64 [usertype] prp1
   drivers/nvme/host/apple.c:474:25: sparse:     got unsigned int [usertype] dma_address
>> drivers/nvme/host/apple.c:475:25: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] prp2 @@     got unsigned int [usertype] first_dma @@
   drivers/nvme/host/apple.c:475:25: sparse:     expected restricted __le64 [usertype] prp2
   drivers/nvme/host/apple.c:475:25: sparse:     got unsigned int [usertype] first_dma
>> drivers/nvme/host/apple.c:501:25: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] prp1 @@     got unsigned int [usertype] first_dma @@
   drivers/nvme/host/apple.c:501:25: sparse:     expected restricted __le64 [usertype] prp1
   drivers/nvme/host/apple.c:501:25: sparse:     got unsigned int [usertype] first_dma
>> drivers/nvme/host/apple.c:503:33: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [usertype] prp2 @@     got unsigned int @@
   drivers/nvme/host/apple.c:503:33: sparse:     expected restricted __le64 [usertype] prp2
   drivers/nvme/host/apple.c:503:33: sparse:     got unsigned int
>> drivers/nvme/host/apple.c:685:26: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [assigned] [usertype] prp1 @@     got unsigned int [usertype] cq_dma_addr @@
   drivers/nvme/host/apple.c:685:26: sparse:     expected restricted __le64 [assigned] [usertype] prp1
   drivers/nvme/host/apple.c:685:26: sparse:     got unsigned int [usertype] cq_dma_addr
>> drivers/nvme/host/apple.c:686:26: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] cqid @@     got int @@
   drivers/nvme/host/apple.c:686:26: sparse:     expected restricted __le16 [assigned] [usertype] cqid
   drivers/nvme/host/apple.c:686:26: sparse:     got int
>> drivers/nvme/host/apple.c:687:27: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] qsize @@     got int @@
   drivers/nvme/host/apple.c:687:27: sparse:     expected restricted __le16 [assigned] [usertype] qsize
   drivers/nvme/host/apple.c:687:27: sparse:     got int
>> drivers/nvme/host/apple.c:688:30: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] cq_flags @@     got int @@
   drivers/nvme/host/apple.c:688:30: sparse:     expected restricted __le16 [assigned] [usertype] cq_flags
   drivers/nvme/host/apple.c:688:30: sparse:     got int
>> drivers/nvme/host/apple.c:699:28: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] qid @@     got int @@
   drivers/nvme/host/apple.c:699:28: sparse:     expected restricted __le16 [assigned] [usertype] qid
   drivers/nvme/host/apple.c:699:28: sparse:     got int
>> drivers/nvme/host/apple.c:713:26: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le64 [assigned] [usertype] prp1 @@     got unsigned int [usertype] sq_dma_addr @@
   drivers/nvme/host/apple.c:713:26: sparse:     expected restricted __le64 [assigned] [usertype] prp1
   drivers/nvme/host/apple.c:713:26: sparse:     got unsigned int [usertype] sq_dma_addr
>> drivers/nvme/host/apple.c:714:26: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] sqid @@     got int @@
   drivers/nvme/host/apple.c:714:26: sparse:     expected restricted __le16 [assigned] [usertype] sqid
   drivers/nvme/host/apple.c:714:26: sparse:     got int
   drivers/nvme/host/apple.c:715:27: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] qsize @@     got int @@
   drivers/nvme/host/apple.c:715:27: sparse:     expected restricted __le16 [assigned] [usertype] qsize
   drivers/nvme/host/apple.c:715:27: sparse:     got int
>> drivers/nvme/host/apple.c:716:30: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] sq_flags @@     got int @@
   drivers/nvme/host/apple.c:716:30: sparse:     expected restricted __le16 [assigned] [usertype] sq_flags
   drivers/nvme/host/apple.c:716:30: sparse:     got int
   drivers/nvme/host/apple.c:717:26: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] cqid @@     got int @@
   drivers/nvme/host/apple.c:717:26: sparse:     expected restricted __le16 [assigned] [usertype] cqid
   drivers/nvme/host/apple.c:717:26: sparse:     got int
   drivers/nvme/host/apple.c:727:28: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __le16 [assigned] [usertype] qid @@     got int @@
   drivers/nvme/host/apple.c:727:28: sparse:     expected restricted __le16 [assigned] [usertype] qid
   drivers/nvme/host/apple.c:727:28: sparse:     got int
>> drivers/nvme/host/apple.c:573:17: sparse: sparse: restricted __le16 degrades to integer

vim +291 drivers/nvme/host/apple.c

   282	
   283	static void apple_nvme_submit_cmd(struct apple_nvme_queue *q,
   284					  struct nvme_command *cmd)
   285	{
   286		struct apple_nvme *anv = queue_to_apple_nvme(q);
   287		u32 tag = nvme_tag_from_cid(cmd->common.command_id);
   288		struct apple_nvmmu_tcb *tcb = &q->tcbs[tag];
   289	
   290		tcb->opcode = cmd->common.opcode;
 > 291		tcb->prp1 = cmd->common.dptr.prp1;
 > 292		tcb->prp2 = cmd->common.dptr.prp2;
 > 293		tcb->length = cmd->rw.length;
   294		tcb->command_id = tag;
   295	
   296		if (nvme_is_write(cmd))
   297			tcb->dma_flags = APPLE_ANS_TCB_DMA_TO_DEVICE;
   298		else
   299			tcb->dma_flags = APPLE_ANS_TCB_DMA_FROM_DEVICE;
   300	
   301		memcpy(&q->sqes[tag], cmd, sizeof(*cmd));
   302	
   303		/*
   304		 * This lock here doesn't make much sense at a first glace but
   305		 * removing it will result in occasional missed completetion
   306		 * interrupts even though the commands still appear on the CQ.
   307		 * It's unclear why this happens but our best guess is that
   308		 * there is a bug in the firmware triggered when a new command
   309		 * is issued while we're inside the irq handler between the
   310		 * NVMMU invalidation (and making the tag available again)
   311		 * and the final CQ update.
   312		 */
   313		spin_lock_irq(&anv->lock);
   314		writel(tag, q->sq_db);
   315		spin_unlock_irq(&anv->lock);
   316	}
   317	
   318	/*
   319	 * From pci.c:
   320	 * Will slightly overestimate the number of pages needed.  This is OK
   321	 * as it only leads to a small amount of wasted memory for the lifetime of
   322	 * the I/O.
   323	 */
   324	static inline size_t apple_nvme_iod_alloc_size(void)
   325	{
   326		const unsigned int nprps = DIV_ROUND_UP(
   327			NVME_MAX_KB_SZ + NVME_CTRL_PAGE_SIZE, NVME_CTRL_PAGE_SIZE);
   328		const int npages = DIV_ROUND_UP(8 * nprps, PAGE_SIZE - 8);
   329		const size_t alloc_size = sizeof(__le64 *) * npages +
   330					  sizeof(struct scatterlist) * NVME_MAX_SEGS;
   331	
   332		return alloc_size;
   333	}
   334	
   335	static void **apple_nvme_iod_list(struct request *req)
   336	{
   337		struct apple_nvme_iod *iod = blk_mq_rq_to_pdu(req);
   338	
   339		return (void **)(iod->sg + blk_rq_nr_phys_segments(req));
   340	}
   341	
   342	static void apple_nvme_free_prps(struct apple_nvme *anv, struct request *req)
   343	{
   344		const int last_prp = NVME_CTRL_PAGE_SIZE / sizeof(__le64) - 1;
   345		struct apple_nvme_iod *iod = blk_mq_rq_to_pdu(req);
   346		dma_addr_t dma_addr = iod->first_dma;
   347		int i;
   348	
   349		for (i = 0; i < iod->npages; i++) {
   350			__le64 *prp_list = apple_nvme_iod_list(req)[i];
 > 351			dma_addr_t next_dma_addr = prp_list[last_prp];
   352	
   353			dma_pool_free(anv->prp_page_pool, prp_list, dma_addr);
   354			dma_addr = next_dma_addr;
   355		}
   356	}
   357	
   358	static void apple_nvme_unmap_data(struct apple_nvme *anv, struct request *req)
   359	{
   360		struct apple_nvme_iod *iod = blk_mq_rq_to_pdu(req);
   361	
   362		if (iod->dma_len) {
   363			dma_unmap_page(anv->dev, iod->first_dma, iod->dma_len,
   364				       rq_dma_dir(req));
   365			return;
   366		}
   367	
   368		WARN_ON_ONCE(!iod->nents);
   369	
   370		dma_unmap_sg(anv->dev, iod->sg, iod->nents, rq_dma_dir(req));
   371		if (iod->npages == 0)
   372			dma_pool_free(anv->prp_small_pool, apple_nvme_iod_list(req)[0],
   373				      iod->first_dma);
   374		else
   375			apple_nvme_free_prps(anv, req);
   376		mempool_free(iod->sg, anv->iod_mempool);
   377	}
   378	
   379	static void apple_nvme_print_sgl(struct scatterlist *sgl, int nents)
   380	{
   381		int i;
   382		struct scatterlist *sg;
   383	
   384		for_each_sg(sgl, sg, nents, i) {
   385			dma_addr_t phys = sg_phys(sg);
   386	
   387			pr_warn("sg[%d] phys_addr:%pad offset:%d length:%d dma_address:%pad dma_length:%d\n",
   388				i, &phys, sg->offset, sg->length, &sg_dma_address(sg),
   389				sg_dma_len(sg));
   390		}
   391	}
   392	
   393	static blk_status_t apple_nvme_setup_prps(struct apple_nvme *anv,
   394						  struct request *req,
   395						  struct nvme_rw_command *cmnd)
   396	{
   397		struct apple_nvme_iod *iod = blk_mq_rq_to_pdu(req);
   398		struct dma_pool *pool;
   399		int length = blk_rq_payload_bytes(req);
   400		struct scatterlist *sg = iod->sg;
   401		int dma_len = sg_dma_len(sg);
   402		u64 dma_addr = sg_dma_address(sg);
   403		int offset = dma_addr & (NVME_CTRL_PAGE_SIZE - 1);
   404		__le64 *prp_list;
   405		void **list = apple_nvme_iod_list(req);
   406		dma_addr_t prp_dma;
   407		int nprps, i;
   408	
   409		length -= (NVME_CTRL_PAGE_SIZE - offset);
   410		if (length <= 0) {
   411			iod->first_dma = 0;
   412			goto done;
   413		}
   414	
   415		dma_len -= (NVME_CTRL_PAGE_SIZE - offset);
   416		if (dma_len) {
   417			dma_addr += (NVME_CTRL_PAGE_SIZE - offset);
   418		} else {
   419			sg = sg_next(sg);
   420			dma_addr = sg_dma_address(sg);
   421			dma_len = sg_dma_len(sg);
   422		}
   423	
   424		if (length <= NVME_CTRL_PAGE_SIZE) {
   425			iod->first_dma = dma_addr;
   426			goto done;
   427		}
   428	
   429		nprps = DIV_ROUND_UP(length, NVME_CTRL_PAGE_SIZE);
   430		if (nprps <= (256 / 8)) {
   431			pool = anv->prp_small_pool;
   432			iod->npages = 0;
   433		} else {
   434			pool = anv->prp_page_pool;
   435			iod->npages = 1;
   436		}
   437	
   438		prp_list = dma_pool_alloc(pool, GFP_ATOMIC, &prp_dma);
   439		if (!prp_list) {
   440			iod->first_dma = dma_addr;
   441			iod->npages = -1;
   442			return BLK_STS_RESOURCE;
   443		}
   444		list[0] = prp_list;
   445		iod->first_dma = prp_dma;
   446		i = 0;
   447		for (;;) {
   448			if (i == NVME_CTRL_PAGE_SIZE >> 3) {
   449				__le64 *old_prp_list = prp_list;
   450	
   451				prp_list = dma_pool_alloc(pool, GFP_ATOMIC, &prp_dma);
   452				if (!prp_list)
   453					goto free_prps;
   454				list[iod->npages++] = prp_list;
   455				prp_list[0] = old_prp_list[i - 1];
 > 456				old_prp_list[i - 1] = prp_dma;
   457				i = 1;
   458			}
 > 459			prp_list[i++] = dma_addr;
   460			dma_len -= NVME_CTRL_PAGE_SIZE;
   461			dma_addr += NVME_CTRL_PAGE_SIZE;
   462			length -= NVME_CTRL_PAGE_SIZE;
   463			if (length <= 0)
   464				break;
   465			if (dma_len > 0)
   466				continue;
   467			if (unlikely(dma_len < 0))
   468				goto bad_sgl;
   469			sg = sg_next(sg);
   470			dma_addr = sg_dma_address(sg);
   471			dma_len = sg_dma_len(sg);
   472		}
   473	done:
 > 474		cmnd->dptr.prp1 = sg_dma_address(iod->sg);
 > 475		cmnd->dptr.prp2 = iod->first_dma;
   476		return BLK_STS_OK;
   477	free_prps:
   478		apple_nvme_free_prps(anv, req);
   479		return BLK_STS_RESOURCE;
   480	bad_sgl:
   481		WARN(DO_ONCE(apple_nvme_print_sgl, iod->sg, iod->nents),
   482		     "Invalid SGL for payload:%d nents:%d\n", blk_rq_payload_bytes(req),
   483		     iod->nents);
   484		return BLK_STS_IOERR;
   485	}
   486	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

             reply	other threads:[~2022-06-25  7:56 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-06-25  7:55 kernel test robot [this message]
2022-06-25  7:59 ` [asahilinux:bits/050-nvme 6/9] drivers/nvme/host/apple.c:291:19: sparse: sparse: incorrect type in assignment (different base types) Christoph Hellwig
2022-06-25  7:59   ` Christoph Hellwig
2022-06-25  9:46   ` Sven Peter
2022-06-27  3:04     ` Sven Peter
2022-06-25  9:51     ` hch
2022-06-27  3:04       ` hch

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=202206251551.PTd0wn6d-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=arnd@arndb.de \
    --cc=hch@lst.de \
    --cc=kbuild-all@lists.01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marcan@marcan.st \
    --cc=sven@svenpeter.dev \
    /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.