From patchwork Fri Mar 6 14:14:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roese X-Patchwork-Id: 243301 List-Id: U-Boot discussion From: sr at denx.de (Stefan Roese) Date: Fri, 6 Mar 2020 15:14:03 +0100 Subject: [PATCH 1/3] mips: mt76x8: ddr_cal: Rename dqs_test_valid() to dqs_test_error() Message-ID: <20200306141405.24539-1-sr@denx.de> This function returns "-1" (true) upon error. So the function name does not match its implementation which is confusing. This patch renames the function to dqs_test_error() which makes the code easier to read. Also change the return type to bool and return "true" or "false". Signed-off-by: Stefan Roese Cc: Weijie Gao Cc: Daniel Schwierzeck --- arch/mips/mach-mtmips/ddr_cal.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/arch/mips/mach-mtmips/ddr_cal.c b/arch/mips/mach-mtmips/ddr_cal.c index 0ea7c7d5e1..b934c4a854 100644 --- a/arch/mips/mach-mtmips/ddr_cal.c +++ b/arch/mips/mach-mtmips/ddr_cal.c @@ -32,8 +32,8 @@ static inline void pref_op(int op, const volatile void *addr) __asm__ __volatile__("pref %0, 0(%1)" : : "i" (op), "r" (addr)); } -static inline int dqs_test_valid(void __iomem *memc, u32 memsize, u32 dqsval, - u32 bias) +static inline bool dqs_test_error(void __iomem *memc, u32 memsize, u32 dqsval, + u32 bias) { u32 *nca, *ca; u32 off; @@ -64,11 +64,11 @@ static inline int dqs_test_valid(void __iomem *memc, u32 memsize, u32 dqsval, for (i = 0; i < TEST_PAT_SIZE / sizeof(u32); i++) { if (ca[i] != (u32)nca + i + bias) - return -1; + return true; } } - return 0; + return false; } static inline u32 dqs_find_max(void __iomem *memc, u32 memsize, u32 initval, @@ -79,7 +79,7 @@ static inline u32 dqs_find_max(void __iomem *memc, u32 memsize, u32 initval, do { dqsval = regval | (fieldval << shift); - if (dqs_test_valid(memc, memsize, dqsval, 3)) + if (dqs_test_error(memc, memsize, dqsval, 3)) break; fieldval++; @@ -96,7 +96,7 @@ static inline u32 dqs_find_min(void __iomem *memc, u32 memsize, u32 initval, while (fieldval > minval) { dqsval = regval | (fieldval << shift); - if (dqs_test_valid(memc, memsize, dqsval, 1)) { + if (dqs_test_error(memc, memsize, dqsval, 1)) { fieldval++; break; } From patchwork Fri Mar 6 14:14:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roese X-Patchwork-Id: 243300 List-Id: U-Boot discussion From: sr at denx.de (Stefan Roese) Date: Fri, 6 Mar 2020 15:14:04 +0100 Subject: [PATCH 2/3] mips: mt76x8: ddr_cal: Change types from u32 to int in dqs_find_min/max In-Reply-To: <20200306141405.24539-1-sr@denx.de> References: <20200306141405.24539-1-sr@denx.de> Message-ID: <20200306141405.24539-2-sr@denx.de> This change is made to enable comparison of integer variables, which might be negative in the next patch. No functional change is intended in this patch. Signed-off-by: Stefan Roese Cc: Weijie Gao Cc: Daniel Schwierzeck --- arch/mips/mach-mtmips/ddr_cal.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/arch/mips/mach-mtmips/ddr_cal.c b/arch/mips/mach-mtmips/ddr_cal.c index b934c4a854..80a058d693 100644 --- a/arch/mips/mach-mtmips/ddr_cal.c +++ b/arch/mips/mach-mtmips/ddr_cal.c @@ -71,10 +71,11 @@ static inline bool dqs_test_error(void __iomem *memc, u32 memsize, u32 dqsval, return false; } -static inline u32 dqs_find_max(void __iomem *memc, u32 memsize, u32 initval, - u32 maxval, u32 shift, u32 regval) +static inline int dqs_find_max(void __iomem *memc, u32 memsize, int initval, + int maxval, int shift, u32 regval) { - u32 fieldval = initval, dqsval; + int fieldval = initval; + u32 dqsval; do { dqsval = regval | (fieldval << shift); @@ -88,10 +89,11 @@ static inline u32 dqs_find_max(void __iomem *memc, u32 memsize, u32 initval, return fieldval; } -static inline u32 dqs_find_min(void __iomem *memc, u32 memsize, u32 initval, - u32 minval, u32 shift, u32 regval) +static inline int dqs_find_min(void __iomem *memc, u32 memsize, int initval, + int minval, int shift, u32 regval) { - u32 fieldval = initval, dqsval; + int fieldval = initval; + u32 dqsval; while (fieldval > minval) { dqsval = regval | (fieldval << shift); From patchwork Fri Mar 6 14:14:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roese X-Patchwork-Id: 243302 List-Id: U-Boot discussion From: sr at denx.de (Stefan Roese) Date: Fri, 6 Mar 2020 15:14:05 +0100 Subject: [PATCH 3/3] mips: mt76x8: ddr_cal: Correct dqs_find_min/max implementations In-Reply-To: <20200306141405.24539-1-sr@denx.de> References: <20200306141405.24539-1-sr@denx.de> Message-ID: <20200306141405.24539-3-sr@denx.de> The current implementations have some issues detecting the correct values: dqs_find_max() will return "last passing fieldval + 1" instead of "last passing fieldval". Also it will return "maxval + 1" in the case that all fieldvals are tested valid (without error). dqs_find_min() will not test the "lowest" value because of using ">" instead of ">=". This patch now rewrites these functions to fix those issues. Also, this patch uses the same approach of a for loop in both functions making it easier to read and maintain. Since the variables are integers now, we can use min()/max(), which handles the wrap around case for fieldval=0: return (0 - 1). Signed-off-by: Stefan Roese Cc: Weijie Gao Cc: Daniel Schwierzeck --- arch/mips/mach-mtmips/ddr_cal.c | 28 ++++++++++------------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/arch/mips/mach-mtmips/ddr_cal.c b/arch/mips/mach-mtmips/ddr_cal.c index 80a058d693..71a53c3c9c 100644 --- a/arch/mips/mach-mtmips/ddr_cal.c +++ b/arch/mips/mach-mtmips/ddr_cal.c @@ -74,39 +74,31 @@ static inline bool dqs_test_error(void __iomem *memc, u32 memsize, u32 dqsval, static inline int dqs_find_max(void __iomem *memc, u32 memsize, int initval, int maxval, int shift, u32 regval) { - int fieldval = initval; + int fieldval; u32 dqsval; - do { + for (fieldval = initval; fieldval <= maxval; fieldval++) { dqsval = regval | (fieldval << shift); - if (dqs_test_error(memc, memsize, dqsval, 3)) - break; - - fieldval++; - } while (fieldval <= maxval); + return max(fieldval - 1, initval); + } - return fieldval; + return maxval; } static inline int dqs_find_min(void __iomem *memc, u32 memsize, int initval, int minval, int shift, u32 regval) { - int fieldval = initval; + int fieldval; u32 dqsval; - while (fieldval > minval) { + for (fieldval = initval; fieldval >= minval; fieldval--) { dqsval = regval | (fieldval << shift); - - if (dqs_test_error(memc, memsize, dqsval, 1)) { - fieldval++; - break; - } - - fieldval--; + if (dqs_test_error(memc, memsize, dqsval, 1)) + return min(fieldval + 1, initval); } - return fieldval; + return minval; } void ddr_calibrate(void __iomem *memc, u32 memsize, u32 bw)