Re: [PATCH mmc-next v2 3/3] mmc: sdhci-of-dwcmshc: solve 128MB DMA boundary limitation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Jisheng,

I love your patch! Yet something to improve:

[auto build test ERROR on ulf.hansson-mmc/next]
[also build test ERROR on next-20180727]
[cannot apply to v4.18-rc6]
[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/Jisheng-Zhang/solve-SDHCI-DWC-MSHC-128MB-DMA-boundary-limitation/20180728-234650
base:   git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc.git next
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
        # save the attached .config to linux build tree
        make ARCH=x86_64 

All error/warnings (new ones prefixed by >>):

   drivers/mmc/host/sdhci-of-dwcmshc.c: In function 'dwcmshc_adma_write_desc':
>> drivers/mmc/host/sdhci-of-dwcmshc.c:18:12: error: 'SZ_128M' undeclared (first use in this function)
     ((addr | (SZ_128M - 1)) == ((addr + len - 1) | (SZ_128M - 1)))
               ^
>> drivers/mmc/host/sdhci-of-dwcmshc.c:34:6: note: in expansion of macro 'BOUNDARY_OK'
     if (BOUNDARY_OK(addr, len) || !len)
         ^~~~~~~~~~~
   drivers/mmc/host/sdhci-of-dwcmshc.c:18:12: note: each undeclared identifier is reported only once for each function it appears in
     ((addr | (SZ_128M - 1)) == ((addr + len - 1) | (SZ_128M - 1)))
               ^
>> drivers/mmc/host/sdhci-of-dwcmshc.c:34:6: note: in expansion of macro 'BOUNDARY_OK'
     if (BOUNDARY_OK(addr, len) || !len)
         ^~~~~~~~~~~
   In file included from include/linux/cache.h:5:0,
                    from include/linux/printk.h:9,
                    from include/linux/kernel.h:14,
                    from include/linux/clk.h:16,
                    from drivers/mmc/host/sdhci-of-dwcmshc.c:10:
   drivers/mmc/host/sdhci-of-dwcmshc.c: In function 'dwcmshc_probe':
   drivers/mmc/host/sdhci-of-dwcmshc.c:82:39: error: 'SZ_128M' undeclared (first use in this function)
     extra = DIV_ROUND_UP(totalram_pages, SZ_128M / PAGE_SIZE);
                                          ^
   include/uapi/linux/kernel.h:13:46: note: in definition of macro '__KERNEL_DIV_ROUND_UP'
    #define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
                                                 ^
>> drivers/mmc/host/sdhci-of-dwcmshc.c:82:10: note: in expansion of macro 'DIV_ROUND_UP'
     extra = DIV_ROUND_UP(totalram_pages, SZ_128M / PAGE_SIZE);
             ^~~~~~~~~~~~

vim +/SZ_128M +18 drivers/mmc/host/sdhci-of-dwcmshc.c

  > 10	#include <linux/clk.h>
    11	#include <linux/mm.h>
    12	#include <linux/module.h>
    13	#include <linux/of.h>
    14	
    15	#include "sdhci-pltfm.h"
    16	
    17	#define BOUNDARY_OK(addr, len) \
  > 18		((addr | (SZ_128M - 1)) == ((addr + len - 1) | (SZ_128M - 1)))
    19	
    20	struct dwcmshc_priv {
    21		struct clk	*bus_clk;
    22	};
    23	
    24	/*
    25	 * if DMA addr spans 128MB boundary, we split the DMA transfer into two
    26	 * so that the DMA transfer doesn't exceed the boundary.
    27	 */
    28	static unsigned int dwcmshc_adma_write_desc(struct sdhci_host *host,
    29						    void *desc, dma_addr_t addr,
    30						    int len, unsigned int cmd)
    31	{
    32		int tmplen, offset;
    33	
  > 34		if (BOUNDARY_OK(addr, len) || !len)
    35			return _sdhci_adma_write_desc(host, desc, addr, len, cmd);
    36	
    37		offset = addr & (SZ_128M - 1);
    38		tmplen = SZ_128M - offset;
    39		_sdhci_adma_write_desc(host, desc, addr, tmplen, cmd);
    40	
    41		addr += tmplen;
    42		len -= tmplen;
    43		desc += host->desc_sz;
    44		_sdhci_adma_write_desc(host, desc, addr, len, cmd);
    45	
    46		return host->desc_sz * 2;
    47	}
    48	
    49	static const struct sdhci_ops sdhci_dwcmshc_ops = {
    50		.set_clock		= sdhci_set_clock,
    51		.set_bus_width		= sdhci_set_bus_width,
    52		.set_uhs_signaling	= sdhci_set_uhs_signaling,
    53		.get_max_clock		= sdhci_pltfm_clk_get_max_clock,
    54		.reset			= sdhci_reset,
    55		.adma_write_desc	= dwcmshc_adma_write_desc,
    56	};
    57	
    58	static const struct sdhci_pltfm_data sdhci_dwcmshc_pdata = {
    59		.ops = &sdhci_dwcmshc_ops,
    60		.quirks = SDHCI_QUIRK_CAP_CLOCK_BASE_BROKEN,
    61	};
    62	
    63	static int dwcmshc_probe(struct platform_device *pdev)
    64	{
    65		struct sdhci_pltfm_host *pltfm_host;
    66		struct sdhci_host *host;
    67		struct dwcmshc_priv *priv;
    68		int err;
    69		u32 extra;
    70	
    71		host = sdhci_pltfm_init(pdev, &sdhci_dwcmshc_pdata,
    72					sizeof(struct dwcmshc_priv));
    73		if (IS_ERR(host))
    74			return PTR_ERR(host);
    75	
    76		/*
    77		 * The DMA descriptor table number is calculated as the maximum
    78		 * number of segments times 2, to allow for an alignment
    79		 * descriptor for each segment, plus 1 for a nop end descriptor,
    80		 * plus extra number for cross 128M boundary handling.
    81		 */
  > 82		extra = DIV_ROUND_UP(totalram_pages, SZ_128M / PAGE_SIZE);
    83		if (extra > SDHCI_MAX_SEGS)
    84			extra = SDHCI_MAX_SEGS;
    85		host->adma_table_num = SDHCI_MAX_SEGS * 2 + 1 + extra;
    86	
    87		pltfm_host = sdhci_priv(host);
    88		priv = sdhci_pltfm_priv(pltfm_host);
    89	
    90		pltfm_host->clk = devm_clk_get(&pdev->dev, "core");
    91		if (IS_ERR(pltfm_host->clk)) {
    92			err = PTR_ERR(pltfm_host->clk);
    93			dev_err(&pdev->dev, "failed to get core clk: %d\n", err);
    94			goto free_pltfm;
    95		}
    96		err = clk_prepare_enable(pltfm_host->clk);
    97		if (err)
    98			goto free_pltfm;
    99	
   100		priv->bus_clk = devm_clk_get(&pdev->dev, "bus");
   101		if (!IS_ERR(priv->bus_clk))
   102			clk_prepare_enable(priv->bus_clk);
   103	
   104		err = mmc_of_parse(host->mmc);
   105		if (err)
   106			goto err_clk;
   107	
   108		sdhci_get_of_property(pdev);
   109	
   110		err = sdhci_add_host(host);
   111		if (err)
   112			goto err_clk;
   113	
   114		return 0;
   115	
   116	err_clk:
   117		clk_disable_unprepare(pltfm_host->clk);
   118		clk_disable_unprepare(priv->bus_clk);
   119	free_pltfm:
   120		sdhci_pltfm_free(pdev);
   121		return err;
   122	}
   123	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

Attachment: .config.gz
Description: application/gzip


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux