diff mbox series

[v2] spi-nor: intel-spi: Avoid crossing 4K address boundary on read/write

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

Commit Message

Alexander A Sverdlin Feb. 27, 2019, 9:57 a.m. UTC
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(+)

Comments

Mika Westerberg Feb. 27, 2019, 10:27 a.m. UTC | #1
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>
Alexander A Sverdlin Feb. 27, 2019, 1:29 p.m. UTC | #2
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.
Sasha Levin March 1, 2019, 9:22 p.m. UTC | #3
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 mbox series

Patch

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);