Re: [PATCH v11 6/9] mmc: cavium: Add MMC PCI driver for ThunderX SOCs

From: Jan Glauber
Date: Mon Feb 13 2017 - 10:25:19 EST


On Sun, Feb 12, 2017 at 09:09:29AM +0800, kbuild test robot wrote:
> 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 >>):
>
> In file included from drivers/mmc/host/cavium-mmc.c:28:0:
> drivers/mmc/host/cavium-mmc.h:41:7: warning: "CONFIG_MMC_CAVIUM_THUNDERX" is not defined [-Wundef]
> #elif CONFIG_MMC_CAVIUM_THUNDERX
> ^~~~~~~~~~~~~~~~~~~~~~~~~~

Hi Ulf,

We are aware of this build error, the line above should be:
#elif IS_ENABLED(CONFIG_MMC_CAVIUM_THUNDERX)

instead of:
#elif CONFIG_MMC_CAVIUM_THUNDERX

Unless you want it otherwise I'll wait for your review of the series
and fix this build error with the next revision.

thanks,
Jan

> 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: In function 'check_switch_errors':
> >> drivers/mmc/host/cavium-mmc.c:156:38: error: 'MIO_EMM_SWITCH' undeclared (first use in this function)
> emm_switch.val = readq(host->base + MIO_EMM_SWITCH);
> ^
> 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:156:19: note: in expansion of macro 'readq'
> emm_switch.val = readq(host->base + MIO_EMM_SWITCH);
> ^~~~~
> drivers/mmc/host/cavium-mmc.c:156:38: note: each undeclared identifier is reported only once for each function it appears in
> emm_switch.val = readq(host->base + MIO_EMM_SWITCH);
> ^
> 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:156:19: note: in expansion of macro 'readq'
> emm_switch.val = readq(host->base + MIO_EMM_SWITCH);
> ^~~~~
> 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 'do_switch':
> drivers/mmc/host/cavium-mmc.c:184:38: error: 'MIO_EMM_SWITCH' undeclared (first use in this function)
> writeq(emm_switch.val, host->base + MIO_EMM_SWITCH);
> ^
> 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:184:2: note: in expansion of macro 'writeq'
> writeq(emm_switch.val, host->base + MIO_EMM_SWITCH);
> ^~~~~~
> 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:191:36: 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:191:17: 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 'set_wdog':
> >> drivers/mmc/host/cavium-mmc.c:217:37: error: 'MIO_EMM_WDOG' undeclared (first use in this function)
> writeq(timeout, slot->host->base + MIO_EMM_WDOG);
> ^
> 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:217:2: note: in expansion of macro 'writeq'
> writeq(timeout, slot->host->base + MIO_EMM_WDOG);
> ^~~~~~
> 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: In function 'cvm_mmc_reset_bus':
> drivers/mmc/host/cavium-mmc.c:225:44: error: 'MIO_EMM_SWITCH' undeclared (first use in this function)
> emm_switch.val = readq(slot->host->base + MIO_EMM_SWITCH);
> ^
> 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:225:19: note: in expansion of macro 'readq'
> emm_switch.val = readq(slot->host->base + MIO_EMM_SWITCH);
> ^~~~~
> drivers/mmc/host/cavium-mmc.c:226:34: error: 'MIO_EMM_WDOG' undeclared (first use in this function)
> wdog = readq(slot->host->base + MIO_EMM_WDOG);
> ^
> 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:226:9: note: in expansion of macro 'readq'
> wdog = readq(slot->host->base + MIO_EMM_WDOG);
> ^~~~~
> drivers/mmc/host/cavium-mmc.c: In function 'cvm_mmc_switch_to':
> drivers/mmc/host/cavium-mmc.c:255:48: error: 'MIO_EMM_SWITCH' undeclared (first use in this function)
> old_slot->cached_switch = readq(host->base + MIO_EMM_SWITCH);
> ^
> 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: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 'cleanup_dma':
> >> drivers/mmc/host/cavium-mmc.c:375: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:375: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:397: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:397:16: note: in expansion of macro 'readq'
> emm_int.val = readq(host->base + MIO_EMM_INT);
> ^~~~~
> drivers/mmc/host/cavium-mmc.c:407: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:407: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:486: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:486:2: note: in expansion of macro 'writeq'
> writeq(dma_cfg.val, host->dma_base + MIO_EMM_DMA_CFG);
> ^~~~~~
> >> drivers/mmc/host/cavium-mmc.c:492: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:492:3: note: in expansion of macro 'writeq'
> writeq(addr, host->dma_base + MIO_EMM_DMA_ADR);
> ^~~~~~
> drivers/mmc/host/cavium-mmc.c: In function 'cvm_mmc_dma_request':
> >> drivers/mmc/host/cavium-mmc.c:587: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:587:3: note: in expansion of macro 'writeq'
> writeq(0x00b00000ull, host->base + MIO_EMM_STS_MASK);
> ^~~~~~
> drivers/mmc/host/cavium-mmc.c:590: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:590: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:618: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:618:2: note: in expansion of macro 'writeq'
> writeq(0x10000ull, host->base + MIO_EMM_BUF_IDX);
> ^~~~~~
> drivers/mmc/host/cavium-mmc.c:635: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:635: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:704: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:704: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:707: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:707: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:716: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:716: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:818: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)))
> ^
> drivers/mmc/host/cavium-mmc.c:818:2: note: in expansion of macro 'writeq'
> writeq(host->emm_cfg, slot->host->base + MIO_EMM_CFG);
> ^~~~~~
> drivers/mmc/host/cavium-mmc.c:841:37: error: 'MIO_EMM_STS_MASK' undeclared (first use in this function)
> writeq(0xe4390080ull, 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:841:2: note: in expansion of macro 'writeq'
> writeq(0xe4390080ull, host->base + MIO_EMM_STS_MASK);
> ^~~~~~
> drivers/mmc/host/cavium-mmc.c:842:25: error: 'MIO_EMM_RCA' undeclared (first use in this function)
> writeq(1, host->base + MIO_EMM_RCA);
> ^
> 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:842:2: note: in expansion of macro 'writeq'
> writeq(1, host->base + MIO_EMM_RCA);
> ^~~~~~
> ..
>
> vim +/MIO_EMM_SWITCH +156 drivers/mmc/host/cavium-mmc.c
>
> a16e92de Jan Glauber 2017-02-06 10 * Authors:
> a16e92de Jan Glauber 2017-02-06 11 * David Daney <david.daney@xxxxxxxxxx>
> a16e92de Jan Glauber 2017-02-06 12 * Peter Swain <pswain@xxxxxxxxxx>
> a16e92de Jan Glauber 2017-02-06 13 * Steven J. Hill <steven.hill@xxxxxxxxxx>
> a16e92de Jan Glauber 2017-02-06 14 * Jan Glauber <jglauber@xxxxxxxxxx>
> a16e92de Jan Glauber 2017-02-06 15 */
> a16e92de Jan Glauber 2017-02-06 @16 #include <linux/delay.h>
> a16e92de Jan Glauber 2017-02-06 17 #include <linux/dma-direction.h>
> a16e92de Jan Glauber 2017-02-06 18 #include <linux/dma-mapping.h>
> a16e92de Jan Glauber 2017-02-06 19 #include <linux/gpio/consumer.h>
> a16e92de Jan Glauber 2017-02-06 20 #include <linux/interrupt.h>
> a16e92de Jan Glauber 2017-02-06 21 #include <linux/mmc/mmc.h>
> a16e92de Jan Glauber 2017-02-06 22 #include <linux/mmc/slot-gpio.h>
> a16e92de Jan Glauber 2017-02-06 23 #include <linux/module.h>
> a16e92de Jan Glauber 2017-02-06 24 #include <linux/regulator/consumer.h>
> a16e92de Jan Glauber 2017-02-06 25 #include <linux/scatterlist.h>
> a16e92de Jan Glauber 2017-02-06 26 #include <linux/time.h>
> a16e92de Jan Glauber 2017-02-06 27
> a16e92de Jan Glauber 2017-02-06 28 #include "cavium-mmc.h"
> a16e92de Jan Glauber 2017-02-06 29
> a16e92de Jan Glauber 2017-02-06 30 /*
> a16e92de Jan Glauber 2017-02-06 31 * The Cavium MMC host hardware assumes that all commands have fixed
> a16e92de Jan Glauber 2017-02-06 32 * command and response types. These are correct if MMC devices are
> a16e92de Jan Glauber 2017-02-06 33 * being used. However, non-MMC devices like SD use command and
> a16e92de Jan Glauber 2017-02-06 34 * response types that are unexpected by the host hardware.
> a16e92de Jan Glauber 2017-02-06 35 *
> a16e92de Jan Glauber 2017-02-06 36 * The command and response types can be overridden by supplying an
> a16e92de Jan Glauber 2017-02-06 37 * XOR value that is applied to the type. We calculate the XOR value
> a16e92de Jan Glauber 2017-02-06 38 * from the values in this table and the flags passed from the MMC
> a16e92de Jan Glauber 2017-02-06 39 * core.
> a16e92de Jan Glauber 2017-02-06 40 */
> a16e92de Jan Glauber 2017-02-06 41 static struct cvm_mmc_cr_type cvm_mmc_cr_types[] = {
> a16e92de Jan Glauber 2017-02-06 42 {0, 0}, /* CMD0 */
> a16e92de Jan Glauber 2017-02-06 43 {0, 3}, /* CMD1 */
> a16e92de Jan Glauber 2017-02-06 44 {0, 2}, /* CMD2 */
> a16e92de Jan Glauber 2017-02-06 45 {0, 1}, /* CMD3 */
> a16e92de Jan Glauber 2017-02-06 46 {0, 0}, /* CMD4 */
> a16e92de Jan Glauber 2017-02-06 47 {0, 1}, /* CMD5 */
> a16e92de Jan Glauber 2017-02-06 48 {0, 1}, /* CMD6 */
> a16e92de Jan Glauber 2017-02-06 49 {0, 1}, /* CMD7 */
> a16e92de Jan Glauber 2017-02-06 50 {1, 1}, /* CMD8 */
> a16e92de Jan Glauber 2017-02-06 51 {0, 2}, /* CMD9 */
> a16e92de Jan Glauber 2017-02-06 52 {0, 2}, /* CMD10 */
> a16e92de Jan Glauber 2017-02-06 53 {1, 1}, /* CMD11 */
> a16e92de Jan Glauber 2017-02-06 54 {0, 1}, /* CMD12 */
> a16e92de Jan Glauber 2017-02-06 55 {0, 1}, /* CMD13 */
> a16e92de Jan Glauber 2017-02-06 56 {1, 1}, /* CMD14 */
> a16e92de Jan Glauber 2017-02-06 57 {0, 0}, /* CMD15 */
> a16e92de Jan Glauber 2017-02-06 58 {0, 1}, /* CMD16 */
> a16e92de Jan Glauber 2017-02-06 59 {1, 1}, /* CMD17 */
> a16e92de Jan Glauber 2017-02-06 60 {1, 1}, /* CMD18 */
> a16e92de Jan Glauber 2017-02-06 61 {3, 1}, /* CMD19 */
> a16e92de Jan Glauber 2017-02-06 62 {2, 1}, /* CMD20 */
> a16e92de Jan Glauber 2017-02-06 63 {0, 0}, /* CMD21 */
> a16e92de Jan Glauber 2017-02-06 64 {0, 0}, /* CMD22 */
> a16e92de Jan Glauber 2017-02-06 65 {0, 1}, /* CMD23 */
> a16e92de Jan Glauber 2017-02-06 66 {2, 1}, /* CMD24 */
> a16e92de Jan Glauber 2017-02-06 67 {2, 1}, /* CMD25 */
> a16e92de Jan Glauber 2017-02-06 68 {2, 1}, /* CMD26 */
> a16e92de Jan Glauber 2017-02-06 69 {2, 1}, /* CMD27 */
> a16e92de Jan Glauber 2017-02-06 70 {0, 1}, /* CMD28 */
> a16e92de Jan Glauber 2017-02-06 71 {0, 1}, /* CMD29 */
> a16e92de Jan Glauber 2017-02-06 72 {1, 1}, /* CMD30 */
> a16e92de Jan Glauber 2017-02-06 73 {1, 1}, /* CMD31 */
> a16e92de Jan Glauber 2017-02-06 74 {0, 0}, /* CMD32 */
> a16e92de Jan Glauber 2017-02-06 75 {0, 0}, /* CMD33 */
> a16e92de Jan Glauber 2017-02-06 76 {0, 0}, /* CMD34 */
> a16e92de Jan Glauber 2017-02-06 77 {0, 1}, /* CMD35 */
> a16e92de Jan Glauber 2017-02-06 78 {0, 1}, /* CMD36 */
> a16e92de Jan Glauber 2017-02-06 79 {0, 0}, /* CMD37 */
> a16e92de Jan Glauber 2017-02-06 80 {0, 1}, /* CMD38 */
> a16e92de Jan Glauber 2017-02-06 81 {0, 4}, /* CMD39 */
> a16e92de Jan Glauber 2017-02-06 82 {0, 5}, /* CMD40 */
> a16e92de Jan Glauber 2017-02-06 83 {0, 0}, /* CMD41 */
> a16e92de Jan Glauber 2017-02-06 84 {2, 1}, /* CMD42 */
> a16e92de Jan Glauber 2017-02-06 85 {0, 0}, /* CMD43 */
> a16e92de Jan Glauber 2017-02-06 86 {0, 0}, /* CMD44 */
> a16e92de Jan Glauber 2017-02-06 87 {0, 0}, /* CMD45 */
> a16e92de Jan Glauber 2017-02-06 88 {0, 0}, /* CMD46 */
> a16e92de Jan Glauber 2017-02-06 89 {0, 0}, /* CMD47 */
> a16e92de Jan Glauber 2017-02-06 90 {0, 0}, /* CMD48 */
> a16e92de Jan Glauber 2017-02-06 91 {0, 0}, /* CMD49 */
> a16e92de Jan Glauber 2017-02-06 92 {0, 0}, /* CMD50 */
> a16e92de Jan Glauber 2017-02-06 93 {0, 0}, /* CMD51 */
> a16e92de Jan Glauber 2017-02-06 94 {0, 0}, /* CMD52 */
> a16e92de Jan Glauber 2017-02-06 95 {0, 0}, /* CMD53 */
> a16e92de Jan Glauber 2017-02-06 96 {0, 0}, /* CMD54 */
> a16e92de Jan Glauber 2017-02-06 97 {0, 1}, /* CMD55 */
> a16e92de Jan Glauber 2017-02-06 98 {0xff, 0xff}, /* CMD56 */
> a16e92de Jan Glauber 2017-02-06 99 {0, 0}, /* CMD57 */
> a16e92de Jan Glauber 2017-02-06 100 {0, 0}, /* CMD58 */
> a16e92de Jan Glauber 2017-02-06 101 {0, 0}, /* CMD59 */
> a16e92de Jan Glauber 2017-02-06 102 {0, 0}, /* CMD60 */
> a16e92de Jan Glauber 2017-02-06 103 {0, 0}, /* CMD61 */
> a16e92de Jan Glauber 2017-02-06 104 {0, 0}, /* CMD62 */
> a16e92de Jan Glauber 2017-02-06 105 {0, 0} /* CMD63 */
> a16e92de Jan Glauber 2017-02-06 106 };
> a16e92de Jan Glauber 2017-02-06 107
> a16e92de Jan Glauber 2017-02-06 108 static struct cvm_mmc_cr_mods cvm_mmc_get_cr_mods(struct mmc_command *cmd)
> a16e92de Jan Glauber 2017-02-06 109 {
> a16e92de Jan Glauber 2017-02-06 110 struct cvm_mmc_cr_type *cr;
> a16e92de Jan Glauber 2017-02-06 111 u8 hardware_ctype, hardware_rtype;
> a16e92de Jan Glauber 2017-02-06 112 u8 desired_ctype = 0, desired_rtype = 0;
> a16e92de Jan Glauber 2017-02-06 113 struct cvm_mmc_cr_mods r;
> a16e92de Jan Glauber 2017-02-06 114
> a16e92de Jan Glauber 2017-02-06 115 cr = cvm_mmc_cr_types + (cmd->opcode & 0x3f);
> a16e92de Jan Glauber 2017-02-06 116 hardware_ctype = cr->ctype;
> a16e92de Jan Glauber 2017-02-06 117 hardware_rtype = cr->rtype;
> a16e92de Jan Glauber 2017-02-06 118 if (cmd->opcode == MMC_GEN_CMD)
> a16e92de Jan Glauber 2017-02-06 119 hardware_ctype = (cmd->arg & 1) ? 1 : 2;
> a16e92de Jan Glauber 2017-02-06 120
> a16e92de Jan Glauber 2017-02-06 121 switch (mmc_cmd_type(cmd)) {
> a16e92de Jan Glauber 2017-02-06 122 case MMC_CMD_ADTC:
> a16e92de Jan Glauber 2017-02-06 123 desired_ctype = (cmd->data->flags & MMC_DATA_WRITE) ? 2 : 1;
> a16e92de Jan Glauber 2017-02-06 124 break;
> a16e92de Jan Glauber 2017-02-06 125 case MMC_CMD_AC:
> a16e92de Jan Glauber 2017-02-06 126 case MMC_CMD_BC:
> a16e92de Jan Glauber 2017-02-06 127 case MMC_CMD_BCR:
> a16e92de Jan Glauber 2017-02-06 128 desired_ctype = 0;
> a16e92de Jan Glauber 2017-02-06 129 break;
> a16e92de Jan Glauber 2017-02-06 130 }
> a16e92de Jan Glauber 2017-02-06 131
> a16e92de Jan Glauber 2017-02-06 132 switch (mmc_resp_type(cmd)) {
> a16e92de Jan Glauber 2017-02-06 133 case MMC_RSP_NONE:
> a16e92de Jan Glauber 2017-02-06 134 desired_rtype = 0;
> a16e92de Jan Glauber 2017-02-06 135 break;
> a16e92de Jan Glauber 2017-02-06 136 case MMC_RSP_R1:/* MMC_RSP_R5, MMC_RSP_R6, MMC_RSP_R7 */
> a16e92de Jan Glauber 2017-02-06 137 case MMC_RSP_R1B:
> a16e92de Jan Glauber 2017-02-06 138 desired_rtype = 1;
> a16e92de Jan Glauber 2017-02-06 139 break;
> a16e92de Jan Glauber 2017-02-06 140 case MMC_RSP_R2:
> a16e92de Jan Glauber 2017-02-06 141 desired_rtype = 2;
> a16e92de Jan Glauber 2017-02-06 142 break;
> a16e92de Jan Glauber 2017-02-06 143 case MMC_RSP_R3: /* MMC_RSP_R4 */
> a16e92de Jan Glauber 2017-02-06 144 desired_rtype = 3;
> a16e92de Jan Glauber 2017-02-06 145 break;
> a16e92de Jan Glauber 2017-02-06 146 }
> a16e92de Jan Glauber 2017-02-06 147 r.ctype_xor = desired_ctype ^ hardware_ctype;
> a16e92de Jan Glauber 2017-02-06 148 r.rtype_xor = desired_rtype ^ hardware_rtype;
> a16e92de Jan Glauber 2017-02-06 149 return r;
> a16e92de Jan Glauber 2017-02-06 150 }
> a16e92de Jan Glauber 2017-02-06 151
> a16e92de Jan Glauber 2017-02-06 152 static void check_switch_errors(struct cvm_mmc_host *host)
> a16e92de Jan Glauber 2017-02-06 153 {
> a16e92de Jan Glauber 2017-02-06 154 union mio_emm_switch emm_switch;
> a16e92de Jan Glauber 2017-02-06 155
> a16e92de Jan Glauber 2017-02-06 @156 emm_switch.val = readq(host->base + MIO_EMM_SWITCH);
> a16e92de Jan Glauber 2017-02-06 157 if (emm_switch.s.switch_err0)
> a16e92de Jan Glauber 2017-02-06 158 dev_err(host->dev, "Switch power class error\n");
> a16e92de Jan Glauber 2017-02-06 159 if (emm_switch.s.switch_err1)
> a16e92de Jan Glauber 2017-02-06 160 dev_err(host->dev, "Switch hs timing error\n");
> a16e92de Jan Glauber 2017-02-06 161 if (emm_switch.s.switch_err2)
> a16e92de Jan Glauber 2017-02-06 162 dev_err(host->dev, "Switch bus width error\n");
> a16e92de Jan Glauber 2017-02-06 163 }
> a16e92de Jan Glauber 2017-02-06 164
> a16e92de Jan Glauber 2017-02-06 165 /*
> a16e92de Jan Glauber 2017-02-06 166 * We never set the switch_exe bit since that would interfere
> a16e92de Jan Glauber 2017-02-06 167 * with the commands send by the MMC core.
> a16e92de Jan Glauber 2017-02-06 168 */
> a16e92de Jan Glauber 2017-02-06 169 static void do_switch(struct cvm_mmc_host *host, u64 val)
> a16e92de Jan Glauber 2017-02-06 170 {
> a16e92de Jan Glauber 2017-02-06 171 union mio_emm_rsp_sts rsp_sts;
> a16e92de Jan Glauber 2017-02-06 172 union mio_emm_switch emm_switch;
> a16e92de Jan Glauber 2017-02-06 173 int retries = 100;
> a16e92de Jan Glauber 2017-02-06 174 int bus_id;
> a16e92de Jan Glauber 2017-02-06 175
> a16e92de Jan Glauber 2017-02-06 176 emm_switch.val = val;
> a16e92de Jan Glauber 2017-02-06 177
> a16e92de Jan Glauber 2017-02-06 178 /*
> a16e92de Jan Glauber 2017-02-06 179 * Modes setting only taken from slot 0. Work around that hardware
> a16e92de Jan Glauber 2017-02-06 180 * issue by first switching to slot 0.
> a16e92de Jan Glauber 2017-02-06 181 */
> a16e92de Jan Glauber 2017-02-06 182 bus_id = emm_switch.s.bus_id;
> a16e92de Jan Glauber 2017-02-06 183 emm_switch.s.bus_id = 0;
> a16e92de Jan Glauber 2017-02-06 184 writeq(emm_switch.val, host->base + MIO_EMM_SWITCH);
> a16e92de Jan Glauber 2017-02-06 185
> a16e92de Jan Glauber 2017-02-06 186 emm_switch.s.bus_id = bus_id;
> a16e92de Jan Glauber 2017-02-06 187 writeq(emm_switch.val, host->base + MIO_EMM_SWITCH);
> a16e92de Jan Glauber 2017-02-06 188
> a16e92de Jan Glauber 2017-02-06 189 /* wait for the switch to finish */
> a16e92de Jan Glauber 2017-02-06 190 do {
> a16e92de Jan Glauber 2017-02-06 @191 rsp_sts.val = readq(host->base + MIO_EMM_RSP_STS);
> a16e92de Jan Glauber 2017-02-06 192 if (!rsp_sts.s.switch_val)
> a16e92de Jan Glauber 2017-02-06 193 break;
> a16e92de Jan Glauber 2017-02-06 194 udelay(10);
> a16e92de Jan Glauber 2017-02-06 195 } while (--retries);
> a16e92de Jan Glauber 2017-02-06 196
> a16e92de Jan Glauber 2017-02-06 197 check_switch_errors(host);
> a16e92de Jan Glauber 2017-02-06 198 }
> a16e92de Jan Glauber 2017-02-06 199
> a16e92de Jan Glauber 2017-02-06 200 static bool switch_val_changed(struct cvm_mmc_slot *slot, u64 new_val)
> a16e92de Jan Glauber 2017-02-06 201 {
> a16e92de Jan Glauber 2017-02-06 202 /* Match BUS_ID, HS_TIMING, BUS_WIDTH, POWER_CLASS, CLK_HI, CLK_LO */
> a16e92de Jan Glauber 2017-02-06 203 u64 match = 0x3001070fffffffffull;
> a16e92de Jan Glauber 2017-02-06 204
> a16e92de Jan Glauber 2017-02-06 205 return (slot->cached_switch & match) != (new_val & match);
> a16e92de Jan Glauber 2017-02-06 206 }
> a16e92de Jan Glauber 2017-02-06 207
> a16e92de Jan Glauber 2017-02-06 208 static void set_wdog(struct cvm_mmc_slot *slot, unsigned int ns)
> a16e92de Jan Glauber 2017-02-06 209 {
> a16e92de Jan Glauber 2017-02-06 210 u64 timeout;
> a16e92de Jan Glauber 2017-02-06 211
> a16e92de Jan Glauber 2017-02-06 212 WARN_ON_ONCE(!slot->clock);
> a16e92de Jan Glauber 2017-02-06 213 if (ns)
> a16e92de Jan Glauber 2017-02-06 214 timeout = (slot->clock * ns) / NSEC_PER_SEC;
> a16e92de Jan Glauber 2017-02-06 215 else
> a16e92de Jan Glauber 2017-02-06 216 timeout = (slot->clock * 850ull) / 1000ull;
> a16e92de Jan Glauber 2017-02-06 @217 writeq(timeout, slot->host->base + MIO_EMM_WDOG);
> a16e92de Jan Glauber 2017-02-06 218 }
> a16e92de Jan Glauber 2017-02-06 219
> a16e92de Jan Glauber 2017-02-06 220 static void cvm_mmc_reset_bus(struct cvm_mmc_slot *slot)
> a16e92de Jan Glauber 2017-02-06 221 {
> a16e92de Jan Glauber 2017-02-06 222 union mio_emm_switch emm_switch;
> a16e92de Jan Glauber 2017-02-06 223 u64 wdog = 0;
> a16e92de Jan Glauber 2017-02-06 224
> a16e92de Jan Glauber 2017-02-06 225 emm_switch.val = readq(slot->host->base + MIO_EMM_SWITCH);
> a16e92de Jan Glauber 2017-02-06 226 wdog = readq(slot->host->base + MIO_EMM_WDOG);
> a16e92de Jan Glauber 2017-02-06 227
> a16e92de Jan Glauber 2017-02-06 228 emm_switch.s.switch_exe = 0;
> a16e92de Jan Glauber 2017-02-06 229 emm_switch.s.switch_err0 = 0;
> a16e92de Jan Glauber 2017-02-06 230 emm_switch.s.switch_err1 = 0;
> a16e92de Jan Glauber 2017-02-06 231 emm_switch.s.switch_err2 = 0;
> a16e92de Jan Glauber 2017-02-06 232 emm_switch.s.bus_id = slot->bus_id;
> a16e92de Jan Glauber 2017-02-06 233 do_switch(slot->host, emm_switch.val);
> a16e92de Jan Glauber 2017-02-06 234
> a16e92de Jan Glauber 2017-02-06 235 slot->cached_switch = emm_switch.val;
> a16e92de Jan Glauber 2017-02-06 236
> a16e92de Jan Glauber 2017-02-06 237 msleep(20);
> a16e92de Jan Glauber 2017-02-06 238
> a16e92de Jan Glauber 2017-02-06 239 writeq(wdog, slot->host->base + MIO_EMM_WDOG);
> a16e92de Jan Glauber 2017-02-06 240 }
> a16e92de Jan Glauber 2017-02-06 241
> a16e92de Jan Glauber 2017-02-06 242 /* Switch to another slot if needed */
> a16e92de Jan Glauber 2017-02-06 243 static void cvm_mmc_switch_to(struct cvm_mmc_slot *slot)
> a16e92de Jan Glauber 2017-02-06 244 {
> a16e92de Jan Glauber 2017-02-06 245 struct cvm_mmc_host *host = slot->host;
> a16e92de Jan Glauber 2017-02-06 246 struct cvm_mmc_slot *old_slot;
> a16e92de Jan Glauber 2017-02-06 247 union mio_emm_switch emm_switch;
> a16e92de Jan Glauber 2017-02-06 248 union mio_emm_sample emm_sample;
> a16e92de Jan Glauber 2017-02-06 249
> a16e92de Jan Glauber 2017-02-06 250 if (slot->bus_id == host->last_slot)
> a16e92de Jan Glauber 2017-02-06 251 return;
> a16e92de Jan Glauber 2017-02-06 252
> a16e92de Jan Glauber 2017-02-06 253 if (host->last_slot >= 0 && host->slot[host->last_slot]) {
> a16e92de Jan Glauber 2017-02-06 254 old_slot = host->slot[host->last_slot];
> a16e92de Jan Glauber 2017-02-06 @255 old_slot->cached_switch = readq(host->base + MIO_EMM_SWITCH);
> a16e92de Jan Glauber 2017-02-06 @256 old_slot->cached_rca = readq(host->base + MIO_EMM_RCA);
> a16e92de Jan Glauber 2017-02-06 257 }
> a16e92de Jan Glauber 2017-02-06 258
> a16e92de Jan Glauber 2017-02-06 259 writeq(slot->cached_rca, host->base + MIO_EMM_RCA);
> a16e92de Jan Glauber 2017-02-06 260 emm_switch.val = slot->cached_switch;
> a16e92de Jan Glauber 2017-02-06 261 emm_switch.s.bus_id = slot->bus_id;
> a16e92de Jan Glauber 2017-02-06 262 do_switch(host, emm_switch.val);
> a16e92de Jan Glauber 2017-02-06 263
> a16e92de Jan Glauber 2017-02-06 264 emm_sample.val = 0;
> a16e92de Jan Glauber 2017-02-06 265 emm_sample.s.cmd_cnt = slot->cmd_cnt;
> a16e92de Jan Glauber 2017-02-06 266 emm_sample.s.dat_cnt = slot->dat_cnt;
> a16e92de Jan Glauber 2017-02-06 @267 writeq(emm_sample.val, host->base + MIO_EMM_SAMPLE);
> a16e92de Jan Glauber 2017-02-06 268
> a16e92de Jan Glauber 2017-02-06 269 host->last_slot = slot->bus_id;
> a16e92de Jan Glauber 2017-02-06 270 }
> a16e92de Jan Glauber 2017-02-06 271
> a16e92de Jan Glauber 2017-02-06 272 static void do_read(struct cvm_mmc_host *host, struct mmc_request *req,
> a16e92de Jan Glauber 2017-02-06 273 u64 dbuf)
> a16e92de Jan Glauber 2017-02-06 274 {
> a16e92de Jan Glauber 2017-02-06 275 struct sg_mapping_iter *smi = &host->smi;
> a16e92de Jan Glauber 2017-02-06 276 int data_len = req->data->blocks * req->data->blksz;
> a16e92de Jan Glauber 2017-02-06 277 int bytes_xfered, shift = -1;
> a16e92de Jan Glauber 2017-02-06 278 u64 dat = 0;
> a16e92de Jan Glauber 2017-02-06 279
> a16e92de Jan Glauber 2017-02-06 280 /* Auto inc from offset zero */
> a16e92de Jan Glauber 2017-02-06 @281 writeq((0x10000 | (dbuf << 6)), host->base + MIO_EMM_BUF_IDX);
> a16e92de Jan Glauber 2017-02-06 282
> a16e92de Jan Glauber 2017-02-06 283 for (bytes_xfered = 0; bytes_xfered < data_len;) {
> a16e92de Jan Glauber 2017-02-06 284 if (smi->consumed >= smi->length) {
> a16e92de Jan Glauber 2017-02-06 285 if (!sg_miter_next(smi))
> a16e92de Jan Glauber 2017-02-06 286 break;
> a16e92de Jan Glauber 2017-02-06 287 smi->consumed = 0;
> a16e92de Jan Glauber 2017-02-06 288 }
> a16e92de Jan Glauber 2017-02-06 289
> a16e92de Jan Glauber 2017-02-06 290 if (shift < 0) {
> a16e92de Jan Glauber 2017-02-06 @291 dat = readq(host->base + MIO_EMM_BUF_DAT);
> a16e92de Jan Glauber 2017-02-06 292 shift = 56;
> a16e92de Jan Glauber 2017-02-06 293 }
> a16e92de Jan Glauber 2017-02-06 294
> a16e92de Jan Glauber 2017-02-06 295 while (smi->consumed < smi->length && shift >= 0) {
> a16e92de Jan Glauber 2017-02-06 296 ((u8 *)smi->addr)[smi->consumed] = (dat >> shift) & 0xff;
> a16e92de Jan Glauber 2017-02-06 297 bytes_xfered++;
> a16e92de Jan Glauber 2017-02-06 298 smi->consumed++;
> a16e92de Jan Glauber 2017-02-06 299 shift -= 8;
> a16e92de Jan Glauber 2017-02-06 300 }
> a16e92de Jan Glauber 2017-02-06 301 }
> a16e92de Jan Glauber 2017-02-06 302
> a16e92de Jan Glauber 2017-02-06 303 sg_miter_stop(smi);
> a16e92de Jan Glauber 2017-02-06 304 req->data->bytes_xfered = bytes_xfered;
> a16e92de Jan Glauber 2017-02-06 305 req->data->error = 0;
> a16e92de Jan Glauber 2017-02-06 306 }
> a16e92de Jan Glauber 2017-02-06 307
> a16e92de Jan Glauber 2017-02-06 308 static void do_write(struct mmc_request *req)
> a16e92de Jan Glauber 2017-02-06 309 {
> a16e92de Jan Glauber 2017-02-06 310 req->data->bytes_xfered = req->data->blocks * req->data->blksz;
> a16e92de Jan Glauber 2017-02-06 311 req->data->error = 0;
> a16e92de Jan Glauber 2017-02-06 312 }
> a16e92de Jan Glauber 2017-02-06 313
> a16e92de Jan Glauber 2017-02-06 314 static void set_cmd_response(struct cvm_mmc_host *host, struct mmc_request *req,
> a16e92de Jan Glauber 2017-02-06 315 union mio_emm_rsp_sts *rsp_sts)
> a16e92de Jan Glauber 2017-02-06 316 {
> a16e92de Jan Glauber 2017-02-06 317 u64 rsp_hi, rsp_lo;
> a16e92de Jan Glauber 2017-02-06 318
> a16e92de Jan Glauber 2017-02-06 319 if (!rsp_sts->s.rsp_val)
> a16e92de Jan Glauber 2017-02-06 320 return;
> a16e92de Jan Glauber 2017-02-06 321
> a16e92de Jan Glauber 2017-02-06 @322 rsp_lo = readq(host->base + MIO_EMM_RSP_LO);
> a16e92de Jan Glauber 2017-02-06 323
> a16e92de Jan Glauber 2017-02-06 324 switch (rsp_sts->s.rsp_type) {
> a16e92de Jan Glauber 2017-02-06 325 case 1:
> a16e92de Jan Glauber 2017-02-06 326 case 3:
> a16e92de Jan Glauber 2017-02-06 327 req->cmd->resp[0] = (rsp_lo >> 8) & 0xffffffff;
> a16e92de Jan Glauber 2017-02-06 328 req->cmd->resp[1] = 0;
> a16e92de Jan Glauber 2017-02-06 329 req->cmd->resp[2] = 0;
> a16e92de Jan Glauber 2017-02-06 330 req->cmd->resp[3] = 0;
> a16e92de Jan Glauber 2017-02-06 331 break;
> a16e92de Jan Glauber 2017-02-06 332 case 2:
> a16e92de Jan Glauber 2017-02-06 333 req->cmd->resp[3] = rsp_lo & 0xffffffff;
> a16e92de Jan Glauber 2017-02-06 334 req->cmd->resp[2] = (rsp_lo >> 32) & 0xffffffff;
> a16e92de Jan Glauber 2017-02-06 @335 rsp_hi = readq(host->base + MIO_EMM_RSP_HI);
> a16e92de Jan Glauber 2017-02-06 336 req->cmd->resp[1] = rsp_hi & 0xffffffff;
> a16e92de Jan Glauber 2017-02-06 337 req->cmd->resp[0] = (rsp_hi >> 32) & 0xffffffff;
> a16e92de Jan Glauber 2017-02-06 338 break;
>
> :::::: The code at line 156 was first introduced by commit
> :::::: a16e92dea256e2d09874770563fc9000029fc235 mmc: cavium: Add core MMC driver for Cavium SOCs
>
> :::::: TO: Jan Glauber <jglauber@xxxxxxxxxx>
> :::::: CC: 0day robot <fengguang.wu@xxxxxxxxx>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation