1. Support Octal DTR manual mode (Program & Erase & register)
2. Support diramap read (enable external address space read mode)
Signed-off-by: JaimeLiao <[email protected]>
---
drivers/memory/renesas-rpc-if.c | 56 +++++++++++++++++++++++++++++++++
1 file changed, 56 insertions(+)
diff --git a/drivers/memory/renesas-rpc-if.c b/drivers/memory/renesas-rpc-if.c
index bdf0a7f68ff2..db5019a7190e 100644
--- a/drivers/memory/renesas-rpc-if.c
+++ b/drivers/memory/renesas-rpc-if.c
@@ -462,6 +462,43 @@ void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs,
rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth));
}
+ /* Fixup in Octal DTR mode */
+ if (op->cmd.buswidth == 8 && op->cmd.ddr) {
+ rpc->bus_size = 2;
+
+ regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
+ RPCIF_PHYCNT_OCTA(0x2) | RPCIF_PHYCNT_OCT |
+ RPCIF_PHYCNT_PHYMEM(0x1) ,
+ RPCIF_PHYCNT_OCTA(0x2) | RPCIF_PHYCNT_OCT |
+ RPCIF_PHYCNT_PHYMEM(0x1));
+ regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_BSZ(1),
+ RPCIF_CMNCR_BSZ(1));
+
+ regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1,
+ RPCIF_PHYOFFSET1_DDRTMG(3),
+ RPCIF_PHYOFFSET1_DDRTMG(2));
+ regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2,
+ RPCIF_PHYOFFSET2_OCTTMG(7),
+ RPCIF_PHYOFFSET2_OCTTMG(3));
+
+ if (op->ocmd.buswidth == 8 && RPCIF_SMENR_OCDE)
+ rpc->enable &= ~RPCIF_SMENR_OCDE;
+
+ if (op->addr.ddr)
+ rpc->enable &= ~RPCIF_SMENR_ADE(0xF) |
+ RPCIF_SMENR_ADE(0xc);
+
+ if (op->dummy.buswidth == 8)
+ rpc->dummy =
+ RPCIF_SMDMCR_DMCYC(op->dummy.ncycles / 2);
+
+ if (op->data.dir == RPCIF_DATA_IN)
+ /* Set Extenal Address space Read mode */
+ if (op->data.buswidth == 8 && op->data.ddr) {
+ regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
+ RPCIF_PHYCNT_EXDS, RPCIF_PHYCNT_EXDS);
+ }
+ }
}
EXPORT_SYMBOL(rpcif_prepare);
@@ -501,10 +538,24 @@ int rpcif_manual_xfer(struct rpcif *rpc)
rpc->xfer_size = nbytes;
memcpy(data, rpc->buffer + pos, nbytes);
+ if (rpc->bus_size == 2) {
+ data[0] = (data[0] & 0x00f000f0) << 8 |
+ (data[0] & 0xf000f000) >> 4 |
+ (data[0] & 0x000f000f) << 4 |
+ (data[0] & 0x0f000f00) >> 8;
+
+ data[1] = (data[1] & 0x00f000f0) << 8 |
+ (data[1] & 0xf000f000) >> 4 |
+ (data[1] & 0x000f000f) << 4 |
+ (data[1] & 0x0f000f00) >> 8;
+ }
if (nbytes == 8)
regmap_write(rpc->regmap, RPCIF_SMWDR1, *p++);
regmap_write(rpc->regmap, RPCIF_SMWDR0, *p);
+ regmap_write(rpc->regmap, RPCIF_SMADR,
+ rpc->smadr + pos);
+ regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
regmap_write(rpc->regmap, RPCIF_SMCR, smcr);
ret = wait_msg_xfer_end(rpc);
if (ret)
@@ -652,9 +703,14 @@ ssize_t rpcif_dirmap_read(struct rpcif *rpc, u64 offs, size_t len, void *buf)
regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
regmap_write(rpc->regmap, RPCIF_DRENR,
rpc->enable & ~RPCIF_SMENR_SPIDE(0xF));
+ regmap_write(rpc->regmap, RPCIF_SMENR,
+ rpc->enable & ~RPCIF_SMENR_SPIDE(0xF));
regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
+ regmap_update_bits(rpc->regmap, RPCIF_DRENR, RPCIF_DRENR_ADE(0xF),
+ RPCIF_DRENR_ADE(0xF));
+
if (rpc->bus_size == 2)
memcpy_fromio_readw(buf, rpc->dirmap + from, len);
else
--
2.17.1
On 24/11/2022 08:39, JaimeLiao wrote:
> 1. Support Octal DTR manual mode (Program & Erase & register)
> 2. Support diramap read (enable external address space read mode)
If these are two separate features, you need two separate commits.
>
> Signed-off-by: JaimeLiao <[email protected]>
> ---
> drivers/memory/renesas-rpc-if.c | 56 +++++++++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
>
> diff --git a/drivers/memory/renesas-rpc-if.c b/drivers/memory/renesas-rpc-if.c
> index bdf0a7f68ff2..db5019a7190e 100644
> --- a/drivers/memory/renesas-rpc-if.c
> +++ b/drivers/memory/renesas-rpc-if.c
> @@ -462,6 +462,43 @@ void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs,
>
> rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth));
> }
> + /* Fixup in Octal DTR mode */
> + if (op->cmd.buswidth == 8 && op->cmd.ddr) {
> + rpc->bus_size = 2;
> +
> + regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
> + RPCIF_PHYCNT_OCTA(0x2) | RPCIF_PHYCNT_OCT |
> + RPCIF_PHYCNT_PHYMEM(0x1) ,
> + RPCIF_PHYCNT_OCTA(0x2) | RPCIF_PHYCNT_OCT |
> + RPCIF_PHYCNT_PHYMEM(0x1));
> + regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_BSZ(1),
> + RPCIF_CMNCR_BSZ(1));
> +
> + regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1,
> + RPCIF_PHYOFFSET1_DDRTMG(3),
> + RPCIF_PHYOFFSET1_DDRTMG(2));
> + regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2,
> + RPCIF_PHYOFFSET2_OCTTMG(7),
> + RPCIF_PHYOFFSET2_OCTTMG(3));
> +
> + if (op->ocmd.buswidth == 8 && RPCIF_SMENR_OCDE)
> + rpc->enable &= ~RPCIF_SMENR_OCDE;
> +
> + if (op->addr.ddr)
> + rpc->enable &= ~RPCIF_SMENR_ADE(0xF) |
> + RPCIF_SMENR_ADE(0xc);
> +
> + if (op->dummy.buswidth == 8)
> + rpc->dummy =
> + RPCIF_SMDMCR_DMCYC(op->dummy.ncycles / 2);
> +
> + if (op->data.dir == RPCIF_DATA_IN)
> + /* Set Extenal Address space Read mode */
> + if (op->data.buswidth == 8 && op->data.ddr) {
> + regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
> + RPCIF_PHYCNT_EXDS, RPCIF_PHYCNT_EXDS);
> + }
Wrap it in {}. It's quite error-prone in such syntax.
Best regards,
Krzysztof
Hi JaimeLiao,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on broonie-spi/for-next]
[also build test WARNING on krzk-mem-ctrl/for-next linus/master v6.1-rc7 next-20221130]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/JaimeLiao/Add-Octal-DTR-support-on-RPC-driver/20221124-154211
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git for-next
patch link: https://lore.kernel.org/r/20221124073957.22471-3-jaimeliao.tw%40gmail.com
patch subject: [PATCH v1 2/2] memory: renesas-rpc-if: Add Octal DTR mode support
config: hexagon-randconfig-r004-20221128
compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 6e4cea55f0d1104408b26ac574566a0e4de48036)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/61bae8cb17ad5715386ee18a1d06549843775cd0
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review JaimeLiao/Add-Octal-DTR-support-on-RPC-driver/20221124-154211
git checkout 61bae8cb17ad5715386ee18a1d06549843775cd0
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/memory/
If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>
All warnings (new ones prefixed by >>):
In file included from drivers/memory/renesas-rpc-if.c:11:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:334:
include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
val = __raw_readb(PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
#define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
^
In file included from drivers/memory/renesas-rpc-if.c:11:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:334:
include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
~~~~~~~~~~ ^
include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
#define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
^
In file included from drivers/memory/renesas-rpc-if.c:11:
In file included from include/linux/io.h:13:
In file included from arch/hexagon/include/asm/io.h:334:
include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
__raw_writeb(value, PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
__raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
~~~~~~~~~~ ^
include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
__raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
~~~~~~~~~~ ^
>> drivers/memory/renesas-rpc-if.c:484:30: warning: use of logical '&&' with constant operand [-Wconstant-logical-operand]
if (op->ocmd.buswidth == 8 && RPCIF_SMENR_OCDE)
^ ~~~~~~~~~~~~~~~~
drivers/memory/renesas-rpc-if.c:484:30: note: use '&' for a bitwise operation
if (op->ocmd.buswidth == 8 && RPCIF_SMENR_OCDE)
^~
&
drivers/memory/renesas-rpc-if.c:484:30: note: remove constant to silence this warning
if (op->ocmd.buswidth == 8 && RPCIF_SMENR_OCDE)
~^~~~~~~~~~~~~~~~~~~
7 warnings generated.
vim +484 drivers/memory/renesas-rpc-if.c
381
382 void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs,
383 size_t *len)
384 {
385 rpc->smcr = 0;
386 rpc->smadr = 0;
387 rpc->enable = 0;
388 rpc->command = 0;
389 rpc->option = 0;
390 rpc->dummy = 0;
391 rpc->ddr = 0;
392 rpc->xferlen = 0;
393
394 if (op->cmd.buswidth) {
395 rpc->enable = RPCIF_SMENR_CDE |
396 RPCIF_SMENR_CDB(rpcif_bit_size(op->cmd.buswidth));
397 rpc->command = RPCIF_SMCMR_CMD(op->cmd.opcode);
398 if (op->cmd.ddr)
399 rpc->ddr = RPCIF_SMDRENR_HYPE(0x5);
400 }
401 if (op->ocmd.buswidth) {
402 rpc->enable |= RPCIF_SMENR_OCDE |
403 RPCIF_SMENR_OCDB(rpcif_bit_size(op->ocmd.buswidth));
404 rpc->command |= RPCIF_SMCMR_OCMD(op->ocmd.opcode);
405 }
406
407 if (op->addr.buswidth) {
408 rpc->enable |=
409 RPCIF_SMENR_ADB(rpcif_bit_size(op->addr.buswidth));
410 if (op->addr.nbytes == 4)
411 rpc->enable |= RPCIF_SMENR_ADE(0xF);
412 else
413 rpc->enable |= RPCIF_SMENR_ADE(GENMASK(
414 2, 3 - op->addr.nbytes));
415 if (op->addr.ddr)
416 rpc->ddr |= RPCIF_SMDRENR_ADDRE;
417
418 if (offs && len)
419 rpc->smadr = *offs;
420 else
421 rpc->smadr = op->addr.val;
422 }
423
424 if (op->dummy.buswidth) {
425 rpc->enable |= RPCIF_SMENR_DME;
426 rpc->dummy = RPCIF_SMDMCR_DMCYC(op->dummy.ncycles /
427 op->dummy.buswidth);
428 }
429
430 if (op->option.buswidth) {
431 rpc->enable |= RPCIF_SMENR_OPDE(
432 rpcif_bits_set(rpc, op->option.nbytes)) |
433 RPCIF_SMENR_OPDB(rpcif_bit_size(op->option.buswidth));
434 if (op->option.ddr)
435 rpc->ddr |= RPCIF_SMDRENR_OPDRE;
436 rpc->option = op->option.val;
437 }
438
439 rpc->dir = op->data.dir;
440 if (op->data.buswidth) {
441 u32 nbytes;
442
443 rpc->buffer = op->data.buf.in;
444 switch (op->data.dir) {
445 case RPCIF_DATA_IN:
446 rpc->smcr = RPCIF_SMCR_SPIRE;
447 break;
448 case RPCIF_DATA_OUT:
449 rpc->smcr = RPCIF_SMCR_SPIWE;
450 break;
451 default:
452 break;
453 }
454 if (op->data.ddr)
455 rpc->ddr |= RPCIF_SMDRENR_SPIDRE;
456
457 if (offs && len)
458 nbytes = *len;
459 else
460 nbytes = op->data.nbytes;
461 rpc->xferlen = nbytes;
462
463 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth));
464 }
465 /* Fixup in Octal DTR mode */
466 if (op->cmd.buswidth == 8 && op->cmd.ddr) {
467 rpc->bus_size = 2;
468
469 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
470 RPCIF_PHYCNT_OCTA(0x2) | RPCIF_PHYCNT_OCT |
471 RPCIF_PHYCNT_PHYMEM(0x1) ,
472 RPCIF_PHYCNT_OCTA(0x2) | RPCIF_PHYCNT_OCT |
473 RPCIF_PHYCNT_PHYMEM(0x1));
474 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_BSZ(1),
475 RPCIF_CMNCR_BSZ(1));
476
477 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1,
478 RPCIF_PHYOFFSET1_DDRTMG(3),
479 RPCIF_PHYOFFSET1_DDRTMG(2));
480 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2,
481 RPCIF_PHYOFFSET2_OCTTMG(7),
482 RPCIF_PHYOFFSET2_OCTTMG(3));
483
> 484 if (op->ocmd.buswidth == 8 && RPCIF_SMENR_OCDE)
485 rpc->enable &= ~RPCIF_SMENR_OCDE;
486
487 if (op->addr.ddr)
488 rpc->enable &= ~RPCIF_SMENR_ADE(0xF) |
489 RPCIF_SMENR_ADE(0xc);
490
491 if (op->dummy.buswidth == 8)
492 rpc->dummy =
493 RPCIF_SMDMCR_DMCYC(op->dummy.ncycles / 2);
494
495 if (op->data.dir == RPCIF_DATA_IN)
496 /* Set Extenal Address space Read mode */
497 if (op->data.buswidth == 8 && op->data.ddr) {
498 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
499 RPCIF_PHYCNT_EXDS, RPCIF_PHYCNT_EXDS);
500 }
501 }
502 }
503 EXPORT_SYMBOL(rpcif_prepare);
504
--
0-DAY CI Kernel Test Service
https://01.org/lkp