Hi Jan,

[auto build test ERROR on linus/master]
[also build test ERROR on v4.10-rc7 next-20170210]
[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/Jan-Glauber/Cavium-MMC-driver/20170206-214740
config: arm64-allmodconfig (attached as .config)
compiler: aarch64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget 
https://git.kernel.org/cgit/linux/kernel/git/wfg/lkp-tests.git/plain/sbin/make.cross
 -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        make.cross ARCH=arm64 

All errors (new ones prefixed by >>):

   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:255:29: note: in expansion of macro 'readq'
      old_slot->cached_switch = readq(host->base + MIO_EMM_SWITCH);
                                ^~~~~
   drivers/mmc/host/cavium-mmc.c:256:45: error: 'MIO_EMM_RCA' undeclared (first 
use in this function)
      old_slot->cached_rca = readq(host->base + MIO_EMM_RCA);
                                                ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:256:26: note: in expansion of macro 'readq'
      old_slot->cached_rca = readq(host->base + MIO_EMM_RCA);
                             ^~~~~
   In file included from include/linux/scatterlist.h:8:0,
                    from include/linux/dma-mapping.h:10,
                    from drivers/mmc/host/cavium-mmc.c:18:
   drivers/mmc/host/cavium-mmc.c:267:38: error: 'MIO_EMM_SAMPLE' undeclared 
(first use in this function)
     writeq(emm_sample.val, host->base + MIO_EMM_SAMPLE);
                                         ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:267:2: note: in expansion of macro 'writeq'
     writeq(emm_sample.val, host->base + MIO_EMM_SAMPLE);
     ^~~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'do_read':
   drivers/mmc/host/cavium-mmc.c:281:47: error: 'MIO_EMM_BUF_IDX' undeclared 
(first use in this function)
     writeq((0x10000 | (dbuf << 6)), host->base + MIO_EMM_BUF_IDX);
                                                  ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:281:2: note: in expansion of macro 'writeq'
     writeq((0x10000 | (dbuf << 6)), host->base + MIO_EMM_BUF_IDX);
     ^~~~~~
   In file included from include/linux/swab.h:4:0,
                    from include/uapi/linux/byteorder/big_endian.h:12,
                    from include/linux/byteorder/big_endian.h:4,
                    from arch/arm64/include/uapi/asm/byteorder.h:20,
                    from include/asm-generic/bitops/le.h:5,
                    from arch/arm64/include/asm/bitops.h:50,
                    from include/linux/bitops.h:36,
                    from include/linux/kernel.h:10,
                    from include/linux/delay.h:10,
                    from drivers/mmc/host/cavium-mmc.c:16:
   drivers/mmc/host/cavium-mmc.c:291:29: error: 'MIO_EMM_BUF_DAT' undeclared 
(first use in this function)
       dat = readq(host->base + MIO_EMM_BUF_DAT);
                                ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:291:10: note: in expansion of macro 'readq'
       dat = readq(host->base + MIO_EMM_BUF_DAT);
             ^~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'set_cmd_response':
   drivers/mmc/host/cavium-mmc.c:322:30: error: 'MIO_EMM_RSP_LO' undeclared 
(first use in this function)
     rsp_lo = readq(host->base + MIO_EMM_RSP_LO);
                                 ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:322:11: note: in expansion of macro 'readq'
     rsp_lo = readq(host->base + MIO_EMM_RSP_LO);
              ^~~~~
   drivers/mmc/host/cavium-mmc.c:335:31: error: 'MIO_EMM_RSP_HI' undeclared 
(first use in this function)
      rsp_hi = readq(host->base + MIO_EMM_RSP_HI);
                                  ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:335:12: note: in expansion of macro 'readq'
      rsp_hi = readq(host->base + MIO_EMM_RSP_HI);
               ^~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'finish_dma_sg':
>> drivers/mmc/host/cavium-mmc.c:359:40: error: 'MIO_EMM_DMA_FIFO_CFG' 
>> undeclared (first use in this function)
     fifo_cfg.val = readq(host->dma_base + MIO_EMM_DMA_FIFO_CFG);
                                           ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:359:17: note: in expansion of macro 'readq'
     fifo_cfg.val = readq(host->dma_base + MIO_EMM_DMA_FIFO_CFG);
                    ^~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'cleanup_dma':
   drivers/mmc/host/cavium-mmc.c:397:35: error: 'MIO_EMM_DMA' undeclared (first 
use in this function)
     emm_dma.val = readq(host->base + MIO_EMM_DMA);
                                      ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:397:16: note: in expansion of macro 'readq'
     emm_dma.val = readq(host->base + MIO_EMM_DMA);
                   ^~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'cvm_mmc_interrupt':
   drivers/mmc/host/cavium-mmc.c:419:35: error: 'MIO_EMM_INT' undeclared (first 
use in this function)
     emm_int.val = readq(host->base + MIO_EMM_INT);
                                      ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:419:16: note: in expansion of macro 'readq'
     emm_int.val = readq(host->base + MIO_EMM_INT);
                   ^~~~~
   drivers/mmc/host/cavium-mmc.c:429:35: error: 'MIO_EMM_RSP_STS' undeclared 
(first use in this function)
     rsp_sts.val = readq(host->base + MIO_EMM_RSP_STS);
                                      ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:429:16: note: in expansion of macro 'readq'
     rsp_sts.val = readq(host->base + MIO_EMM_RSP_STS);
                   ^~~~~
   In file included from include/linux/scatterlist.h:8:0,
                    from include/linux/dma-mapping.h:10,
                    from drivers/mmc/host/cavium-mmc.c:18:
   drivers/mmc/host/cavium-mmc.c: In function 'prepare_dma_single':
   drivers/mmc/host/cavium-mmc.c:508:39: error: 'MIO_EMM_DMA_CFG' undeclared 
(first use in this function)
     writeq(dma_cfg.val, host->dma_base + MIO_EMM_DMA_CFG);
                                          ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:508:2: note: in expansion of macro 'writeq'
     writeq(dma_cfg.val, host->dma_base + MIO_EMM_DMA_CFG);
     ^~~~~~
   drivers/mmc/host/cavium-mmc.c:514:33: error: 'MIO_EMM_DMA_ADR' undeclared 
(first use in this function)
      writeq(addr, host->dma_base + MIO_EMM_DMA_ADR);
                                    ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:514:3: note: in expansion of macro 'writeq'
      writeq(addr, host->dma_base + MIO_EMM_DMA_ADR);
      ^~~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'prepare_dma_sg':
   drivers/mmc/host/cavium-mmc.c:537:29: error: 'MIO_EMM_DMA_FIFO_CFG' 
undeclared (first use in this function)
     writeq(0, host->dma_base + MIO_EMM_DMA_FIFO_CFG);
                                ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:537:2: note: in expansion of macro 'writeq'
     writeq(0, host->dma_base + MIO_EMM_DMA_FIFO_CFG);
     ^~~~~~
>> drivers/mmc/host/cavium-mmc.c:544:33: error: 'MIO_EMM_DMA_FIFO_ADR' 
>> undeclared (first use in this function)
      writeq(addr, host->dma_base + MIO_EMM_DMA_FIFO_ADR);
                                    ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:544:3: note: in expansion of macro 'writeq'
      writeq(addr, host->dma_base + MIO_EMM_DMA_FIFO_ADR);
      ^~~~~~
>> drivers/mmc/host/cavium-mmc.c:568:41: error: 'MIO_EMM_DMA_FIFO_CMD' 
>> undeclared (first use in this function)
      writeq(fifo_cmd.val, host->dma_base + MIO_EMM_DMA_FIFO_CMD);
                                            ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:568:3: note: in expansion of macro 'writeq'
      writeq(fifo_cmd.val, host->dma_base + MIO_EMM_DMA_FIFO_CMD);
      ^~~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'cvm_mmc_dma_request':
   drivers/mmc/host/cavium-mmc.c:683:38: error: 'MIO_EMM_STS_MASK' undeclared 
(first use in this function)
      writeq(0x00b00000ull, host->base + MIO_EMM_STS_MASK);
                                         ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:683:3: note: in expansion of macro 'writeq'
      writeq(0x00b00000ull, host->base + MIO_EMM_STS_MASK);
      ^~~~~~
   drivers/mmc/host/cavium-mmc.c:686:35: error: 'MIO_EMM_DMA' undeclared (first 
use in this function)
     writeq(emm_dma.val, host->base + MIO_EMM_DMA);
                                      ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:686:2: note: in expansion of macro 'writeq'
     writeq(emm_dma.val, host->base + MIO_EMM_DMA);
     ^~~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'do_write_request':
   drivers/mmc/host/cavium-mmc.c:714:34: error: 'MIO_EMM_BUF_IDX' undeclared 
(first use in this function)
     writeq(0x10000ull, host->base + MIO_EMM_BUF_IDX);
                                     ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:714:2: note: in expansion of macro 'writeq'
     writeq(0x10000ull, host->base + MIO_EMM_BUF_IDX);
     ^~~~~~
   drivers/mmc/host/cavium-mmc.c:731:29: error: 'MIO_EMM_BUF_DAT' undeclared 
(first use in this function)
       writeq(dat, host->base + MIO_EMM_BUF_DAT);
                                ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:731:4: note: in expansion of macro 'writeq'
       writeq(dat, host->base + MIO_EMM_BUF_DAT);
       ^~~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'cvm_mmc_request':
   drivers/mmc/host/cavium-mmc.c:800:25: error: 'MIO_EMM_STS_MASK' undeclared 
(first use in this function)
     writeq(0, host->base + MIO_EMM_STS_MASK);
                            ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:800:2: note: in expansion of macro 'writeq'
     writeq(0, host->base + MIO_EMM_STS_MASK);
     ^~~~~~
   In file included from include/linux/swab.h:4:0,
                    from include/uapi/linux/byteorder/big_endian.h:12,
                    from include/linux/byteorder/big_endian.h:4,
                    from arch/arm64/include/uapi/asm/byteorder.h:20,
                    from include/asm-generic/bitops/le.h:5,
                    from arch/arm64/include/asm/bitops.h:50,
                    from include/linux/bitops.h:36,
                    from include/linux/kernel.h:10,
                    from include/linux/delay.h:10,
                    from drivers/mmc/host/cavium-mmc.c:16:
   drivers/mmc/host/cavium-mmc.c:803:35: error: 'MIO_EMM_RSP_STS' undeclared 
(first use in this function)
     rsp_sts.val = readq(host->base + MIO_EMM_RSP_STS);
                                      ^
   include/uapi/linux/swab.h:129:32: note: in definition of macro '__swab64'
     (__builtin_constant_p((__u64)(x)) ? \
                                   ^
   include/linux/byteorder/generic.h:86:21: note: in expansion of macro 
'__le64_to_cpu'
    #define le64_to_cpu __le64_to_cpu
                        ^~~~~~~~~~~~~
   arch/arm64/include/asm/io.h:137:32: note: in expansion of macro 
'readq_relaxed'
    #define readq(c)  ({ u64 __v = readq_relaxed(c); __iormb(); __v; })
                                   ^~~~~~~~~~~~~
   drivers/mmc/host/cavium-mmc.c:803:16: note: in expansion of macro 'readq'
     rsp_sts.val = readq(host->base + MIO_EMM_RSP_STS);
                   ^~~~~
   In file included from include/linux/scatterlist.h:8:0,
                    from include/linux/dma-mapping.h:10,
                    from drivers/mmc/host/cavium-mmc.c:18:
   drivers/mmc/host/cavium-mmc.c:812:35: error: 'MIO_EMM_CMD' undeclared (first 
use in this function)
     writeq(emm_cmd.val, host->base + MIO_EMM_CMD);
                                      ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
   drivers/mmc/host/cavium-mmc.c:812:2: note: in expansion of macro 'writeq'
     writeq(emm_cmd.val, host->base + MIO_EMM_CMD);
     ^~~~~~
   drivers/mmc/host/cavium-mmc.c: In function 'cvm_mmc_init_lowlevel':
   drivers/mmc/host/cavium-mmc.c:914:43: error: 'MIO_EMM_CFG' undeclared (first 
use in this function)
     writeq(host->emm_cfg, slot->host->base + MIO_EMM_CFG);
                                              ^
   arch/arm64/include/asm/io.h:127:78: note: in definition of macro 
'writeq_relaxed'
    #define writeq_relaxed(v,c) ((void)__raw_writeq((__force 
u64)cpu_to_le64(v),(c)))
                                                                                
 ^
..

vim +/MIO_EMM_DMA_FIFO_CFG +359 drivers/mmc/host/cavium-mmc.c

   329                  req->cmd->resp[2] = 0;
   330                  req->cmd->resp[3] = 0;
   331                  break;
   332          case 2:
   333                  req->cmd->resp[3] = rsp_lo & 0xffffffff;
   334                  req->cmd->resp[2] = (rsp_lo >> 32) & 0xffffffff;
 > 335                  rsp_hi = readq(host->base + MIO_EMM_RSP_HI);
   336                  req->cmd->resp[1] = rsp_hi & 0xffffffff;
   337                  req->cmd->resp[0] = (rsp_hi >> 32) & 0xffffffff;
   338                  break;
   339          }
   340  }
   341  
   342  static int get_dma_dir(struct mmc_data *data)
   343  {
   344          return (data->flags & MMC_DATA_WRITE) ? DMA_TO_DEVICE : 
DMA_FROM_DEVICE;
   345  }
   346  
   347  static int finish_dma_single(struct cvm_mmc_host *host, struct mmc_data 
*data)
   348  {
   349          data->bytes_xfered = data->blocks * data->blksz;
   350          data->error = 0;
   351          return 1;
   352  }
   353  
   354  static int finish_dma_sg(struct cvm_mmc_host *host, struct mmc_data 
*data)
   355  {
   356          union mio_emm_dma_fifo_cfg fifo_cfg;
   357  
   358          /* Check if there are any pending requests left */
 > 359          fifo_cfg.val = readq(host->dma_base + MIO_EMM_DMA_FIFO_CFG);
   360          if (fifo_cfg.s.count)
   361                  dev_err(host->dev, "%u requests still pending\n",
   362                          fifo_cfg.s.count);
   363  
   364          data->bytes_xfered = data->blocks * data->blksz;
   365          data->error = 0;
   366  
   367          /* Clear and disable FIFO */
   368          writeq(BIT_ULL(16), host->dma_base + MIO_EMM_DMA_FIFO_CFG);
   369          dma_unmap_sg(host->dev, data->sg, data->sg_len, 
get_dma_dir(data));
   370          return 1;
   371  }
   372  
   373  static int finish_dma(struct cvm_mmc_host *host, struct mmc_data *data)
   374  {
   375          if (host->use_sg && data->sg_len > 1)
   376                  return finish_dma_sg(host, data);
   377          else
   378                  return finish_dma_single(host, data);
   379  }
   380  
   381  static bool bad_status(union mio_emm_rsp_sts *rsp_sts)
   382  {
   383          if (rsp_sts->s.rsp_bad_sts || rsp_sts->s.rsp_crc_err ||
   384              rsp_sts->s.rsp_timeout || rsp_sts->s.blk_crc_err ||
   385              rsp_sts->s.blk_timeout || rsp_sts->s.dbuf_err)
   386                  return true;
   387  
   388          return false;
   389  }
   390  
   391  /* Try to clean up failed DMA. */
   392  static void cleanup_dma(struct cvm_mmc_host *host,
   393                          union mio_emm_rsp_sts *rsp_sts)
   394  {
   395          union mio_emm_dma emm_dma;
   396  
   397          emm_dma.val = readq(host->base + MIO_EMM_DMA);
   398          emm_dma.s.dma_val = 1;
   399          emm_dma.s.dat_null = 1;
   400          emm_dma.s.bus_id = rsp_sts->s.bus_id;
   401          writeq(emm_dma.val, host->base + MIO_EMM_DMA);
   402  }
   403  
   404  irqreturn_t cvm_mmc_interrupt(int irq, void *dev_id)
   405  {
   406          struct cvm_mmc_host *host = dev_id;
   407          union mio_emm_rsp_sts rsp_sts;
   408          union mio_emm_int emm_int;
   409          struct mmc_request *req;
   410          unsigned long flags = 0;
   411          bool host_done;
   412  
   413          if (host->need_irq_handler_lock)
   414                  spin_lock_irqsave(&host->irq_handler_lock, flags);
   415          else
   416                  __acquire(&host->irq_handler_lock);
   417  
   418          /* Clear interrupt bits (write 1 clears ). */
   419          emm_int.val = readq(host->base + MIO_EMM_INT);
   420          writeq(emm_int.val, host->base + MIO_EMM_INT);
   421  
   422          if (emm_int.s.switch_err)
   423                  check_switch_errors(host);
   424  
   425          req = host->current_req;
   426          if (!req)
   427                  goto out;
   428  
   429          rsp_sts.val = readq(host->base + MIO_EMM_RSP_STS);
   430          /*
   431           * dma_val set means DMA is still in progress. Don't touch
   432           * the request and wait for the interrupt indicating that
   433           * the DMA is finished.
   434           */
   435          if (rsp_sts.s.dma_val && host->dma_active)
   436                  goto out;
   437  
   438          if (!host->dma_active && emm_int.s.buf_done && req->data) {
   439                  unsigned int type = (rsp_sts.val >> 7) & 3;
   440  
   441                  if (type == 1)
   442                          do_read(host, req, rsp_sts.s.dbuf);
   443                  else if (type == 2)
   444                          do_write(req);
   445          }
   446  
   447          host_done = emm_int.s.cmd_done || emm_int.s.dma_done ||
   448                      emm_int.s.cmd_err || emm_int.s.dma_err;
   449  
   450          if (!(host_done && req->done))
   451                  goto no_req_done;
   452  
   453          if (bad_status(&rsp_sts))
   454                  req->cmd->error = -EILSEQ;
   455          else
   456                  req->cmd->error = 0;
   457  
   458          if (host->dma_active && req->data)
   459                  if (!finish_dma(host, req->data))
   460                          goto no_req_done;
   461  
   462          set_cmd_response(host, req, &rsp_sts);
   463          if (emm_int.s.dma_err && rsp_sts.s.dma_pend)
   464                  cleanup_dma(host, &rsp_sts);
   465  
   466          host->current_req = NULL;
   467          req->done(req);
   468  
   469  no_req_done:
   470          if (host->dmar_fixup_done)
   471                  host->dmar_fixup_done(host);
   472          if (host_done)
   473                  host->release_bus(host);
   474  out:
   475          if (host->need_irq_handler_lock)
   476                  spin_unlock_irqrestore(&host->irq_handler_lock, flags);
   477          else
   478                  __release(&host->irq_handler_lock);
   479          return IRQ_RETVAL(emm_int.val != 0);
   480  }
   481  
   482  /*
   483   * Program DMA_CFG and if needed DMA_ADR.
   484   * Returns 0 on error, DMA address otherwise.
   485   */
   486  static u64 prepare_dma_single(struct cvm_mmc_host *host, struct 
mmc_data *data)
   487  {
   488          union mio_emm_dma_cfg dma_cfg;
   489          int count;
   490          u64 addr;
   491  
   492          count = dma_map_sg(host->dev, data->sg, data->sg_len,
   493                             get_dma_dir(data));
   494          if (!count)
   495                  return 0;
   496  
   497          dma_cfg.val = 0;
   498          dma_cfg.s.en = 1;
   499          dma_cfg.s.rw = (data->flags & MMC_DATA_WRITE) ? 1 : 0;
   500  #ifdef __LITTLE_ENDIAN
   501          dma_cfg.s.endian = 1;
   502  #endif
   503          dma_cfg.s.size = (sg_dma_len(&data->sg[0]) / 8) - 1;
   504  
   505          addr = sg_dma_address(&data->sg[0]);
   506          if (!host->big_dma_addr)
   507                  dma_cfg.s.adr = addr;
   508          writeq(dma_cfg.val, host->dma_base + MIO_EMM_DMA_CFG);
   509  
   510          pr_debug("[%s] sg_dma_len: %u  total sg_elem: %d\n",
   511                   (dma_cfg.s.rw) ? "W" : "R", sg_dma_len(&data->sg[0]), 
count);
   512  
   513          if (host->big_dma_addr)
   514                  writeq(addr, host->dma_base + MIO_EMM_DMA_ADR);
   515          return addr;
   516  }
   517  
   518  /*
   519   * Queue complete sg list into the FIFO.
   520   * Returns 0 on error, 1 otherwise.
   521   */
   522  static u64 prepare_dma_sg(struct cvm_mmc_host *host, struct mmc_data 
*data)
   523  {
   524          union mio_emm_dma_fifo_cmd fifo_cmd;
   525          struct scatterlist *sg;
   526          int count, i;
   527          u64 addr;
   528  
   529          count = dma_map_sg(host->dev, data->sg, data->sg_len,
   530                             get_dma_dir(data));
   531          if (!count)
   532                  return 0;
   533          if (count > 16)
   534                  goto error;
   535  
   536          /* Enable FIFO by removing CLR bit */
 > 537          writeq(0, host->dma_base + MIO_EMM_DMA_FIFO_CFG);
   538  
   539          for_each_sg(data->sg, sg, count, i) {
   540                  /* Program DMA address */
   541                  addr = sg_dma_address(sg);
   542                  if (addr & 7)
   543                          goto error;
 > 544                  writeq(addr, host->dma_base + MIO_EMM_DMA_FIFO_ADR);
   545  
   546                  /*
   547                   * If we have scatter-gather support we also have an 
extra

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

Attachment: .config.gz
Description: application/gzip

Reply via email to