public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH RFC] bcm47xxsflash: just use memcpy for reading
@ 2012-09-19 12:08 Rafał Miłecki
  2012-09-19 13:45 ` Marc Kleine-Budde
  0 siblings, 1 reply; 3+ messages in thread
From: Rafał Miłecki @ 2012-09-19 12:08 UTC (permalink / raw)
  To: linux-mtd, Artem Bityutskiy; +Cc: Rafał Miłecki, Jonas Gorski

---
Still have to check it with aiaiai
---
 drivers/mtd/devices/bcm47xxsflash.c |   31 ++-----------------------------
 1 files changed, 2 insertions(+), 29 deletions(-)

diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
index a328872..2f8dfd4 100644
--- a/drivers/mtd/devices/bcm47xxsflash.c
+++ b/drivers/mtd/devices/bcm47xxsflash.c
@@ -14,41 +14,14 @@ static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
 			      size_t *retlen, u_char *buf)
 {
 	struct bcma_sflash *sflash = mtd->priv;
-	size_t bytes_read = 0;
-	__iomem u8 *src = (__iomem u8 *)KSEG0ADDR(sflash->window + from);
-	int i;
-	size_t unaligned_before, unaligned_after;
 
 	/* Check address range */
 	if ((from + len) > mtd->size)
 		return -EINVAL;
 
-	unaligned_before = from & 0x3;
-	unaligned_after = (from + len) & 0x3;
+	memcpy(buf, (void *)KSEG0ADDR(sflash->window + from), len);
 
-	for (i = 0; i < unaligned_before; i++) {
-		*buf = readb(src);
-		buf++;
-		src++;
-		bytes_read++;
-	}
-	for (i = from - unaligned_before; i < from + len - unaligned_after;
-	     i += 4) {
-		*(u32 *)buf = readl(src);
-		buf += 4;
-		src += 4;
-		bytes_read += 4;
-	}
-	for (i = 0; i < unaligned_after; i++) {
-		*buf = readb(src);
-		buf++;
-		src++;
-		bytes_read++;
-	}
-
-	*retlen = bytes_read;
-
-	return 0;
+	return len;
 }
 
 static void bcm47xxsflash_fill_mtd(struct bcma_sflash *sflash,
-- 
1.7.7

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH RFC] bcm47xxsflash: just use memcpy for reading
  2012-09-19 12:08 [PATCH RFC] bcm47xxsflash: just use memcpy for reading Rafał Miłecki
@ 2012-09-19 13:45 ` Marc Kleine-Budde
  2012-09-19 14:07   ` Rafał Miłecki
  0 siblings, 1 reply; 3+ messages in thread
From: Marc Kleine-Budde @ 2012-09-19 13:45 UTC (permalink / raw)
  To: Rafał Miłecki; +Cc: Jonas Gorski, linux-mtd, Artem Bityutskiy

[-- Attachment #1: Type: text/plain, Size: 2036 bytes --]

On 09/19/2012 02:08 PM, Rafał Miłecki wrote:
> ---
> Still have to check it with aiaiai
> ---
>  drivers/mtd/devices/bcm47xxsflash.c |   31 ++-----------------------------
>  1 files changed, 2 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
> index a328872..2f8dfd4 100644
> --- a/drivers/mtd/devices/bcm47xxsflash.c
> +++ b/drivers/mtd/devices/bcm47xxsflash.c
> @@ -14,41 +14,14 @@ static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
>  			      size_t *retlen, u_char *buf)
>  {
>  	struct bcma_sflash *sflash = mtd->priv;
> -	size_t bytes_read = 0;
> -	__iomem u8 *src = (__iomem u8 *)KSEG0ADDR(sflash->window + from);
> -	int i;
> -	size_t unaligned_before, unaligned_after;
>  
>  	/* Check address range */
>  	if ((from + len) > mtd->size)
>  		return -EINVAL;
>  
> -	unaligned_before = from & 0x3;
> -	unaligned_after = (from + len) & 0x3;
> +	memcpy(buf, (void *)KSEG0ADDR(sflash->window + from), len);

You should not access iomem with memcpy, there is a memcpy_fromio(), but
it's an unoptimized readb loop on arm.

Marc
>  
> -	for (i = 0; i < unaligned_before; i++) {
> -		*buf = readb(src);
> -		buf++;
> -		src++;
> -		bytes_read++;
> -	}
> -	for (i = from - unaligned_before; i < from + len - unaligned_after;
> -	     i += 4) {
> -		*(u32 *)buf = readl(src);
> -		buf += 4;
> -		src += 4;
> -		bytes_read += 4;
> -	}
> -	for (i = 0; i < unaligned_after; i++) {
> -		*buf = readb(src);
> -		buf++;
> -		src++;
> -		bytes_read++;
> -	}
> -
> -	*retlen = bytes_read;
> -
> -	return 0;
> +	return len;
>  }
>  
>  static void bcm47xxsflash_fill_mtd(struct bcma_sflash *sflash,
> 


-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH RFC] bcm47xxsflash: just use memcpy for reading
  2012-09-19 13:45 ` Marc Kleine-Budde
@ 2012-09-19 14:07   ` Rafał Miłecki
  0 siblings, 0 replies; 3+ messages in thread
From: Rafał Miłecki @ 2012-09-19 14:07 UTC (permalink / raw)
  To: Marc Kleine-Budde; +Cc: Jonas Gorski, linux-mtd, Artem Bityutskiy

2012/9/19 Marc Kleine-Budde <mkl@pengutronix.de>:
> On 09/19/2012 02:08 PM, Rafał Miłecki wrote:
>> ---
>> Still have to check it with aiaiai
>> ---
>>  drivers/mtd/devices/bcm47xxsflash.c |   31 ++-----------------------------
>>  1 files changed, 2 insertions(+), 29 deletions(-)
>>
>> diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
>> index a328872..2f8dfd4 100644
>> --- a/drivers/mtd/devices/bcm47xxsflash.c
>> +++ b/drivers/mtd/devices/bcm47xxsflash.c
>> @@ -14,41 +14,14 @@ static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
>>                             size_t *retlen, u_char *buf)
>>  {
>>       struct bcma_sflash *sflash = mtd->priv;
>> -     size_t bytes_read = 0;
>> -     __iomem u8 *src = (__iomem u8 *)KSEG0ADDR(sflash->window + from);
>> -     int i;
>> -     size_t unaligned_before, unaligned_after;
>>
>>       /* Check address range */
>>       if ((from + len) > mtd->size)
>>               return -EINVAL;
>>
>> -     unaligned_before = from & 0x3;
>> -     unaligned_after = (from + len) & 0x3;
>> +     memcpy(buf, (void *)KSEG0ADDR(sflash->window + from), len);
>
> You should not access iomem with memcpy, there is a memcpy_fromio(), but
> it's an unoptimized readb loop on arm.

Sure, I can replace that with _fromio, which AFAIK is the same for mips.

I'm afraid access to the serial flash can't be really optimal. Saving
is actually even worse, it requires some operations on BCMA core,
polling for ready, etc.

-- 
Rafał

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-09-19 14:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-19 12:08 [PATCH RFC] bcm47xxsflash: just use memcpy for reading Rafał Miłecki
2012-09-19 13:45 ` Marc Kleine-Budde
2012-09-19 14:07   ` Rafał Miłecki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox