All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Glauber <jan.glauber@caviumnetworks.com>
To: Ulf Hansson <ulf.hansson@linaro.org>
Cc: kbuild-all@01.org, linux-mmc@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	David Daney <ddaney@caviumnetworks.com>,
	"Steven J . Hill" <Steven.Hill@cavium.com>,
	David Daney <david.daney@cavium.com>
Subject: Re: [PATCH v11 6/9] mmc: cavium: Add MMC PCI driver for ThunderX SOCs
Date: Mon, 13 Feb 2017 16:24:08 +0100	[thread overview]
Message-ID: <20170213152408.GB27339@hardcore> (raw)
In-Reply-To: <201702120922.DE85ulq1%fengguang.wu@intel.com>

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@cavium.com>
> a16e92de Jan Glauber 2017-02-06   12   *   Peter Swain <pswain@cavium.com>
> a16e92de Jan Glauber 2017-02-06   13   *   Steven J. Hill <steven.hill@cavium.com>
> a16e92de Jan Glauber 2017-02-06   14   *   Jan Glauber <jglauber@cavium.com>
> 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@cavium.com>
> :::::: CC: 0day robot <fengguang.wu@intel.com>
> 
> ---
> 0-DAY kernel test infrastructure                Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

  reply	other threads:[~2017-02-13 15:24 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-06 13:39 [PATCH v11 0/9] Cavium MMC driver Jan Glauber
2017-02-06 13:39 ` [PATCH v11 1/9] dt-bindings: mmc: Add Cavium SOCs MMC bindings Jan Glauber
     [not found]   ` <20170206133953.8390-2-jglauber-YGCgFSpz5w/QT0dZR+AlfA@public.gmane.org>
2017-02-09  0:40     ` Rob Herring
2017-02-09  0:40       ` Rob Herring
2017-03-03 11:47     ` Ulf Hansson
2017-03-03 11:47       ` Ulf Hansson
2017-03-06 11:09       ` Jan Glauber
2017-02-06 13:39 ` [PATCH v11 2/9] mmc: cavium: Add core MMC driver for Cavium SOCs Jan Glauber
2017-03-03 11:47   ` Ulf Hansson
2017-03-03 18:39     ` David Daney
2017-03-07 10:49     ` Jan Glauber
2017-03-08  9:45       ` Ulf Hansson
2017-03-08 17:52         ` Jan Glauber
2017-02-06 13:39 ` [PATCH v11 3/9] mmc: cavium: Add MMC platform driver for Octeon SOCs Jan Glauber
2017-02-06 13:39 ` [PATCH v11 4/9] mmc: cavium: Work-around hardware bug on cn6xxx and cnf7xxx Jan Glauber
2017-02-06 13:39 ` [PATCH v11 5/9] mmc: cavium: Add support for Octeon cn7890 Jan Glauber
2017-02-06 13:39 ` [PATCH v11 6/9] mmc: cavium: Add MMC PCI driver for ThunderX SOCs Jan Glauber
2017-02-12  1:09   ` kbuild test robot
2017-02-12  1:09     ` kbuild test robot
2017-02-13 15:24     ` Jan Glauber [this message]
2017-02-13 15:45       ` Ulf Hansson
2017-02-15 12:34         ` Arnd Bergmann
2017-02-15 13:54           ` Jan Glauber
2017-02-06 13:39 ` [PATCH v11 7/9] mmc: cavium: Add scatter-gather DMA support Jan Glauber
2017-02-12  1:27   ` kbuild test robot
2017-02-12  1:27     ` kbuild test robot
2017-02-06 13:39 ` [PATCH v11 8/9] mmc: cavium: Support DDR mode for eMMC devices Jan Glauber
2017-02-06 13:39 ` [PATCH v11 9/9] MAINTAINERS: Add entry for Cavium MMC driver Jan Glauber

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=20170213152408.GB27339@hardcore \
    --to=jan.glauber@caviumnetworks.com \
    --cc=Steven.Hill@cavium.com \
    --cc=david.daney@cavium.com \
    --cc=ddaney@caviumnetworks.com \
    --cc=kbuild-all@01.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=ulf.hansson@linaro.org \
    /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.