Message ID | 20190227095617.20968-1-alexander.sverdlin@nokia.com |
---|---|
State | Changes Requested |
Headers | show |
Series | [v2] spi-nor: intel-spi: Avoid crossing 4K address boundary on read/write | expand |
On Wed, Feb 27, 2019 at 09:57:15AM +0000, Sverdlin, Alexander (Nokia - DE/Ulm) wrote: > It was observed that reads crossing 4K address boundary are failing. > > This limitation is mentioned in Intel documents: > > Intel(R) 9 Series Chipset Family Platform Controller Hub (PCH) Datasheet: > > "5.26.3 Flash Access > Program Register Access: > * Program Register Accesses are not allowed to cross a 4 KB boundary..." > > Enhanced Serial Peripheral Interface (eSPI) > Interface Base Specification (for Client and Server Platforms): > > "5.1.4 Address > For other memory transactions, the address may start or end at any byte > boundary. However, the address and payload length combination must not > cross the naturally aligned address boundary of the corresponding Maximum > Payload Size. It must not cross a 4 KB address boundary." > > Avoid this by splitting an operation crossing the boundary into two > operations. > > Cc: stable@vger.kernel.org > Reported-by: Romain Porte <romain.porte@nokia.com> > Tested-by: Pascal Fabreges <pascal.fabreges@nokia.com> > Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> > --- > Changelog: > v2: More macros! As Mika suggested. > > drivers/mtd/spi-nor/intel-spi.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/mtd/spi-nor/intel-spi.c b/drivers/mtd/spi-nor/intel-spi.c > index af0a220..8c279c4 100644 > --- a/drivers/mtd/spi-nor/intel-spi.c > +++ b/drivers/mtd/spi-nor/intel-spi.c > @@ -632,6 +632,10 @@ static ssize_t intel_spi_read(struct spi_nor *nor, loff_t from, size_t len, > while (len > 0) { > block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); > > + /* Read cannot cross 4K boundary */ > + blocksize = min(from + block_size, round_up(from + 1, SZ_4K)) - > + from; Nit: It looks better if you put it into one line like: blocksize = min(from + block_size, round_up(from + 1, SZ_4K)) - from; Regardless of that, Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Hello Mika and all, On 27/02/2019 11:27, Mika Westerberg wrote: > On Wed, Feb 27, 2019 at 09:57:15AM +0000, Sverdlin, Alexander (Nokia - DE/Ulm) wrote: >> It was observed that reads crossing 4K address boundary are failing. [...] >> Reported-by: Romain Porte <romain.porte@nokia.com> >> Tested-by: Pascal Fabreges <pascal.fabreges@nokia.com> >> Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> >> --- >> Changelog: >> v2: More macros! As Mika suggested. >> >> drivers/mtd/spi-nor/intel-spi.c | 7 +++++++ >> 1 file changed, 7 insertions(+) >> >> diff --git a/drivers/mtd/spi-nor/intel-spi.c b/drivers/mtd/spi-nor/intel-spi.c >> index af0a220..8c279c4 100644 >> --- a/drivers/mtd/spi-nor/intel-spi.c >> +++ b/drivers/mtd/spi-nor/intel-spi.c >> @@ -632,6 +632,10 @@ static ssize_t intel_spi_read(struct spi_nor *nor, loff_t from, size_t len, >> while (len > 0) { >> block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); >> >> + /* Read cannot cross 4K boundary */ >> + blocksize = min(from + block_size, round_up(from + 1, SZ_4K)) - >> + from; > > Nit: > > It looks better if you put it into one line like: > > blocksize = min(from + block_size, round_up(from + 1, SZ_4K)) - from; > > > Regardless of that, > > Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com> Please ignore v2! There was a failure in build/test process on my side. I will send v3.
Hi, [This is an automated email] This commit has been processed because it contains a -stable tag. The stable tag indicates that it's relevant for the following trees: all The bot has tested the following trees: v4.20.13, v4.19.26, v4.14.104, v4.9.161, v4.4.176, v3.18.136. v4.20.13: Build failed! Errors: drivers/mtd/spi-nor/intel-spi.c:636:3: error: ‘blocksize’ undeclared (first use in this function); did you mean ‘block_size’? drivers/mtd/spi-nor/intel-spi.c:693:3: error: ‘blocksize’ undeclared (first use in this function); did you mean ‘block_size’? v4.19.26: Build failed! Errors: drivers/mtd/spi-nor/intel-spi.c:636:3: error: ‘blocksize’ undeclared (first use in this function); did you mean ‘block_size’? drivers/mtd/spi-nor/intel-spi.c:693:3: error: ‘blocksize’ undeclared (first use in this function); did you mean ‘block_size’? v4.14.104: Build failed! Errors: drivers/mtd/spi-nor/intel-spi.c:507:3: error: ‘blocksize’ undeclared (first use in this function); did you mean ‘block_size’? drivers/mtd/spi-nor/intel-spi.c:561:3: error: ‘blocksize’ undeclared (first use in this function); did you mean ‘block_size’? v4.9.161: Failed to apply! Possible dependencies: 8afda8b26d01 ("spi-nor: Add support for Intel SPI serial flash controller") v4.4.176: Failed to apply! Possible dependencies: 8afda8b26d01 ("spi-nor: Add support for Intel SPI serial flash controller") v3.18.136: Failed to apply! Possible dependencies: 8afda8b26d01 ("spi-nor: Add support for Intel SPI serial flash controller") f617b9587c16 ("mtd: spi-nor: add driver for NXP SPI Flash Interface (SPIFI)") How should we proceed with this patch? -- Thanks, Sasha
diff --git a/drivers/mtd/spi-nor/intel-spi.c b/drivers/mtd/spi-nor/intel-spi.c index af0a220..8c279c4 100644 --- a/drivers/mtd/spi-nor/intel-spi.c +++ b/drivers/mtd/spi-nor/intel-spi.c @@ -632,6 +632,10 @@ static ssize_t intel_spi_read(struct spi_nor *nor, loff_t from, size_t len, while (len > 0) { block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); + /* Read cannot cross 4K boundary */ + blocksize = min(from + block_size, round_up(from + 1, SZ_4K)) - + from; + writel(from, ispi->base + FADDR); val = readl(ispi->base + HSFSTS_CTL); @@ -685,6 +689,9 @@ static ssize_t intel_spi_write(struct spi_nor *nor, loff_t to, size_t len, while (len > 0) { block_size = min_t(size_t, len, INTEL_SPI_FIFO_SZ); + /* Write cannot cross 4K boundary */ + blocksize = min(to + block_size, round_up(to + 1, SZ_4K)) - to; + writel(to, ispi->base + FADDR); val = readl(ispi->base + HSFSTS_CTL);