Message ID | 1507502482-22518-4-git-send-email-pure.logic@nexus-software.ie (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Bryan, [auto build test ERROR on linus/master] [also build test ERROR on v4.14-rc4 next-20170929] [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/Bryan-O-Donoghue/Fix-i-MX7D-OCOTP-write-support/20171009-155445 config: sparc64-allyesconfig (attached as .config) compiler: sparc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=sparc64 Note: the linux-review/Bryan-O-Donoghue/Fix-i-MX7D-OCOTP-write-support/20171009-155445 HEAD 5cdf7fb933d7043592aa21e657d9ffa0ef4eb764 builds fine. It only hurts bisectibility. All errors (new ones prefixed by >>): >> drivers/nvmem/imx-ocotp.c:367:34: error: array type has incomplete element type 'struct octop_params' static const struct octop_params params[] = { ^~~~~~ drivers/nvmem/imx-ocotp.c:368:4: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:368:4: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:368:18: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:368:18: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:369:4: error: field name not in record or union initializer { .nregs = 64, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:369:4: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:369:18: error: field name not in record or union initializer { .nregs = 64, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:369:18: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:370:4: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:370:4: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:370:18: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:370:18: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:371:4: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:371:4: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:371:18: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:371:18: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:372:4: error: field name not in record or union initializer { .nregs = 64, .bank_address_words = 4 }, ^ drivers/nvmem/imx-ocotp.c:372:4: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:372:18: error: field name not in record or union initializer { .nregs = 64, .bank_address_words = 4 }, ^ drivers/nvmem/imx-ocotp.c:372:18: note: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:367:34: warning: 'params' defined but not used [-Wunused-variable] static const struct octop_params params[] = { ^~~~~~ vim +367 drivers/nvmem/imx-ocotp.c 366 > 367 static const struct octop_params params[] = { 368 { .nregs = 128, .bank_address_words = 0 }, 369 { .nregs = 64, .bank_address_words = 0 }, 370 { .nregs = 128, .bank_address_words = 0 }, 371 { .nregs = 128, .bank_address_words = 0 }, 372 { .nregs = 64, .bank_address_words = 4 }, 373 }; 374 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
Hi Bryan, [auto build test ERROR on linus/master] [also build test ERROR on v4.14-rc4 next-20170929] [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/Bryan-O-Donoghue/Fix-i-MX7D-OCOTP-write-support/20171009-155445 config: xtensa-allyesconfig (attached as .config) compiler: xtensa-linux-gcc (GCC) 4.9.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=xtensa Note: the linux-review/Bryan-O-Donoghue/Fix-i-MX7D-OCOTP-write-support/20171009-155445 HEAD 5cdf7fb933d7043592aa21e657d9ffa0ef4eb764 builds fine. It only hurts bisectibility. All errors (new ones prefixed by >>): >> drivers/nvmem/imx-ocotp.c:367:34: error: array type has incomplete element type static const struct octop_params params[] = { ^ >> drivers/nvmem/imx-ocotp.c:368:2: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:368:2: error: (near initialization for 'params') >> drivers/nvmem/imx-ocotp.c:368:2: error: field name not in record or union initializer drivers/nvmem/imx-ocotp.c:368:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:369:2: error: field name not in record or union initializer { .nregs = 64, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:369:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:369:2: error: field name not in record or union initializer drivers/nvmem/imx-ocotp.c:369:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:370:2: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:370:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:370:2: error: field name not in record or union initializer drivers/nvmem/imx-ocotp.c:370:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:371:2: error: field name not in record or union initializer { .nregs = 128, .bank_address_words = 0 }, ^ drivers/nvmem/imx-ocotp.c:371:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:371:2: error: field name not in record or union initializer drivers/nvmem/imx-ocotp.c:371:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:372:2: error: field name not in record or union initializer { .nregs = 64, .bank_address_words = 4 }, ^ drivers/nvmem/imx-ocotp.c:372:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:372:2: error: field name not in record or union initializer drivers/nvmem/imx-ocotp.c:372:2: error: (near initialization for 'params') drivers/nvmem/imx-ocotp.c:367:34: warning: 'params' defined but not used [-Wunused-variable] static const struct octop_params params[] = { ^ vim +367 drivers/nvmem/imx-ocotp.c 366 > 367 static const struct octop_params params[] = { > 368 { .nregs = 128, .bank_address_words = 0 }, 369 { .nregs = 64, .bank_address_words = 0 }, 370 { .nregs = 128, .bank_address_words = 0 }, 371 { .nregs = 128, .bank_address_words = 0 }, 372 { .nregs = 64, .bank_address_words = 4 }, 373 }; 374 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/nvmem/imx-ocotp.c b/drivers/nvmem/imx-ocotp.c index 7798571..3b18351 100644 --- a/drivers/nvmem/imx-ocotp.c +++ b/drivers/nvmem/imx-ocotp.c @@ -40,7 +40,10 @@ #define IMX_OCOTP_ADDR_CTRL_SET 0x0004 #define IMX_OCOTP_ADDR_CTRL_CLR 0x0008 #define IMX_OCOTP_ADDR_TIMING 0x0010 -#define IMX_OCOTP_ADDR_DATA 0x0020 +#define IMX_OCOTP_ADDR_DATA0 0x0020 +#define IMX_OCOTP_ADDR_DATA1 0x0030 +#define IMX_OCOTP_ADDR_DATA2 0x0040 +#define IMX_OCOTP_ADDR_DATA3 0x0050 #define IMX_OCOTP_BM_CTRL_ADDR 0x0000007F #define IMX_OCOTP_BM_CTRL_BUSY 0x00000100 @@ -55,6 +58,7 @@ static DEFINE_MUTEX(ocotp_mutex); struct ocotp_params { unsigned int nregs; + unsigned int bank_address_words; }; struct ocotp_priv { @@ -176,6 +180,7 @@ static int imx_ocotp_write(void *context, unsigned int offset, void *val, u32 timing = 0; u32 ctrl; u8 waddr; + u8 word = 0; /* allow only writing one complete OTP word at a time */ if ((bytes != priv->config->word_size) || @@ -228,8 +233,22 @@ static int imx_ocotp_write(void *context, unsigned int offset, void *val, * description. Both the unlock code and address can be written in the * same operation. */ - /* OTP write/read address specifies one of 128 word address locations */ - waddr = offset / 4; + if (priv->params->bank_address_words != 0) { + /* + * In banked mode the OTP register bank goes into waddr see + * i.MX 7Solo Applications Processor Reference Manual, Rev. 0.1 + * 6.4.3.1 + */ + offset = offset / priv->config->word_size; + waddr = offset / priv->params->bank_address_words; + word = offset & (priv->params->bank_address_words - 1); + } else { + /* + * OTP write/read address specifies one of 128 word address + * locations + */ + waddr = offset / 4; + } ctrl = readl(priv->base + IMX_OCOTP_ADDR_CTRL); ctrl &= ~IMX_OCOTP_BM_CTRL_ADDR; @@ -255,8 +274,41 @@ static int imx_ocotp_write(void *context, unsigned int offset, void *val, * shift right (with zero fill). This shifting is required to program * the OTP serially. During the write operation, HW_OCOTP_DATA cannot be * modified. + * Note: on i.MX7 there are four data fields to write for banked write + * with the fuse blowing operation only taking place after data0 + * has been written. This is why data0 must always be the last + * register written. */ - writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA); + if (priv->params->bank_address_words == 0) { + writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA0); + } else { + switch (word) { + case 0: + writel(0, priv->base + IMX_OCOTP_ADDR_DATA1); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA2); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA3); + writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA0); + break; + case 1: + writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA1); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA2); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA3); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA0); + break; + case 2: + writel(0, priv->base + IMX_OCOTP_ADDR_DATA1); + writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA2); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA3); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA0); + break; + case 3: + writel(0, priv->base + IMX_OCOTP_ADDR_DATA1); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA2); + writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA3); + writel(0, priv->base + IMX_OCOTP_ADDR_DATA0); + break; + } + } /* 47.4.1.4.5 * Once complete, the controller will clear BUSY. A write request to a @@ -312,12 +364,12 @@ static struct nvmem_config imx_ocotp_nvmem_config = { .reg_write = imx_ocotp_write, }; -static const struct ocotp_params params[] = { - { .nregs = 128 }, - { .nregs = 64 }, - { .nregs = 128 }, - { .nregs = 128 }, - { .nregs = 64 }, +static const struct octop_params params[] = { + { .nregs = 128, .bank_address_words = 0 }, + { .nregs = 64, .bank_address_words = 0 }, + { .nregs = 128, .bank_address_words = 0 }, + { .nregs = 128, .bank_address_words = 0 }, + { .nregs = 64, .bank_address_words = 4 }, }; static const struct of_device_id imx_ocotp_dt_ids[] = {
The i.MX7S/D takes the bank address in the CTRLn.ADDR field and the data value in one of the DATAx {0, 1, 2, 3} register fields. The current write routine is based on writing the CTRLn.ADDR field and writing a single DATA register only. Fixes: 0642bac7da42 ("nvmem: imx-ocotp: add write support") Signed-off-by: Bryan O'Donoghue <pure.logic@nexus-software.ie> --- drivers/nvmem/imx-ocotp.c | 72 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 62 insertions(+), 10 deletions(-)