* [PATCH] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR in nvram
@ 2014-09-01 16:08 Rafał Miłecki
2014-09-03 19:33 ` Hauke Mehrtens
2014-09-03 20:51 ` [PATCH V2] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR Rafał Miłecki
0 siblings, 2 replies; 3+ messages in thread
From: Rafał Miłecki @ 2014-09-01 16:08 UTC (permalink / raw)
To: linux-mips, Ralf Baechle; +Cc: Hauke Mehrtens, Rafał Miłecki
We should be using ioremap_nocache helper which handles remaps in a
smarter way.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
arch/mips/bcm47xx/nvram.c | 35 +++++++++++++++++++++++++----------
1 file changed, 25 insertions(+), 10 deletions(-)
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
index 2bed73a..2f0a646 100644
--- a/arch/mips/bcm47xx/nvram.c
+++ b/arch/mips/bcm47xx/nvram.c
@@ -23,13 +23,13 @@
static char nvram_buf[NVRAM_SPACE];
static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
-static u32 find_nvram_size(u32 end)
+static u32 find_nvram_size(void __iomem *end)
{
struct nvram_header *header;
int i;
for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
- header = (struct nvram_header *)KSEG1ADDR(end - nvram_sizes[i]);
+ header = (struct nvram_header *)(end - nvram_sizes[i]);
if (header->magic == NVRAM_HEADER)
return nvram_sizes[i];
}
@@ -38,7 +38,7 @@ static u32 find_nvram_size(u32 end)
}
/* Probe for NVRAM header */
-static int nvram_find_and_copy(u32 base, u32 lim)
+static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
{
struct nvram_header *header;
int i;
@@ -46,27 +46,31 @@ static int nvram_find_and_copy(u32 base, u32 lim)
u32 *src, *dst;
u32 size;
+ if (nvram_buf[0]) {
+ pr_warn("nvram already initialized\n");
+ return -EEXIST;
+ }
+
/* TODO: when nvram is on nand flash check for bad blocks first. */
off = FLASH_MIN;
while (off <= lim) {
/* Windowed flash access */
- size = find_nvram_size(base + off);
+ size = find_nvram_size(iobase + off);
if (size) {
- header = (struct nvram_header *)KSEG1ADDR(base + off -
- size);
+ header = (struct nvram_header *)(iobase + off - size);
goto found;
}
off <<= 1;
}
/* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
- header = (struct nvram_header *) KSEG1ADDR(base + 4096);
+ header = (struct nvram_header *)(iobase + 4096);
if (header->magic == NVRAM_HEADER) {
size = NVRAM_SPACE;
goto found;
}
- header = (struct nvram_header *) KSEG1ADDR(base + 1024);
+ header = (struct nvram_header *)(iobase + 1024);
if (header->magic == NVRAM_HEADER) {
size = NVRAM_SPACE;
goto found;
@@ -94,6 +98,17 @@ found:
return 0;
}
+static int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
+{
+ void __iomem *iobase;
+
+ iobase = ioremap_nocache(base, lim);
+ if (!iobase)
+ return -ENOMEM;
+
+ return nvram_find_and_copy(iobase, lim);
+}
+
#ifdef CONFIG_BCM47XX_SSB
static int nvram_init_ssb(void)
{
@@ -109,7 +124,7 @@ static int nvram_init_ssb(void)
return -ENXIO;
}
- return nvram_find_and_copy(base, lim);
+ return bcm47xx_nvram_init_from_mem(base, lim);
}
#endif
@@ -139,7 +154,7 @@ static int nvram_init_bcma(void)
return -ENXIO;
}
- return nvram_find_and_copy(base, lim);
+ return bcm47xx_nvram_init_from_mem(base, lim);
}
#endif
--
1.8.4.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR in nvram
2014-09-01 16:08 [PATCH] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR in nvram Rafał Miłecki
@ 2014-09-03 19:33 ` Hauke Mehrtens
2014-09-03 20:51 ` [PATCH V2] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR Rafał Miłecki
1 sibling, 0 replies; 3+ messages in thread
From: Hauke Mehrtens @ 2014-09-03 19:33 UTC (permalink / raw)
To: Rafał Miłecki, linux-mips, Ralf Baechle
On 09/01/2014 06:08 PM, Rafał Miłecki wrote:
> We should be using ioremap_nocache helper which handles remaps in a
> smarter way.
This is a good idea.
I just checked this with sparse and it still finds some places where you
cast a var annotated with __iomem to a var without this annotation.
hauke@hauke-desktop:~/linux/linux-next$ ionice -c 3 nice -n 20 make
ARCH=mips CROSS_COMPILE=mipsel-openwrt-linux-uclibc- C=2 arch/mips/bcm47xx/
.....
CHECK arch/mips/bcm47xx/nvram.c
arch/mips/bcm47xx/nvram.c:32:27: warning: cast removes address space of
expression
arch/mips/bcm47xx/nvram.c:60:35: warning: cast removes address space of
expression
arch/mips/bcm47xx/nvram.c:67:19: warning: cast removes address space of
expression
arch/mips/bcm47xx/nvram.c:73:19: warning: cast removes address space of
expression
CC arch/mips/bcm47xx/nvram.o
>
> Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
> ---
> arch/mips/bcm47xx/nvram.c | 35 +++++++++++++++++++++++++----------
> 1 file changed, 25 insertions(+), 10 deletions(-)
>
> diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
> index 2bed73a..2f0a646 100644
> --- a/arch/mips/bcm47xx/nvram.c
> +++ b/arch/mips/bcm47xx/nvram.c
> @@ -23,13 +23,13 @@
> static char nvram_buf[NVRAM_SPACE];
> static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
>
> -static u32 find_nvram_size(u32 end)
> +static u32 find_nvram_size(void __iomem *end)
> {
> struct nvram_header *header;
> int i;
>
> for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
> - header = (struct nvram_header *)KSEG1ADDR(end - nvram_sizes[i]);
> + header = (struct nvram_header *)(end - nvram_sizes[i]);
__iomem annotation gets lost
> if (header->magic == NVRAM_HEADER)
> return nvram_sizes[i];
> }
> @@ -38,7 +38,7 @@ static u32 find_nvram_size(u32 end)
> }
>
> /* Probe for NVRAM header */
> -static int nvram_find_and_copy(u32 base, u32 lim)
> +static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
> {
> struct nvram_header *header;
> int i;
> @@ -46,27 +46,31 @@ static int nvram_find_and_copy(u32 base, u32 lim)
> u32 *src, *dst;
> u32 size;
>
> + if (nvram_buf[0]) {
> + pr_warn("nvram already initialized\n");
> + return -EEXIST;
> + }
> +
> /* TODO: when nvram is on nand flash check for bad blocks first. */
> off = FLASH_MIN;
> while (off <= lim) {
> /* Windowed flash access */
> - size = find_nvram_size(base + off);
> + size = find_nvram_size(iobase + off);
> if (size) {
> - header = (struct nvram_header *)KSEG1ADDR(base + off -
> - size);
> + header = (struct nvram_header *)(iobase + off - size);
__iomem annotation gets lost
> goto found;
> }
> off <<= 1;
> }
>
> /* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
> - header = (struct nvram_header *) KSEG1ADDR(base + 4096);
> + header = (struct nvram_header *)(iobase + 4096);
__iomem annotation gets lost
> if (header->magic == NVRAM_HEADER) {
> size = NVRAM_SPACE;
> goto found;
> }
>
> - header = (struct nvram_header *) KSEG1ADDR(base + 1024);
> + header = (struct nvram_header *)(iobase + 1024);
__iomem annotation gets lost
> if (header->magic == NVRAM_HEADER) {
> size = NVRAM_SPACE;
> goto found;
> @@ -94,6 +98,17 @@ found:
> return 0;
> }
>
> +static int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
> +{
> + void __iomem *iobase;
> +
> + iobase = ioremap_nocache(base, lim);
> + if (!iobase)
> + return -ENOMEM;
You should iounmap this sometime later, because the data is copied to
nvram_buf and iobase is not accsses after is was passed to
nvram_find_and_copy().
> +
> + return nvram_find_and_copy(iobase, lim);
> +}
> +
> #ifdef CONFIG_BCM47XX_SSB
> static int nvram_init_ssb(void)
> {
> @@ -109,7 +124,7 @@ static int nvram_init_ssb(void)
> return -ENXIO;
> }
>
> - return nvram_find_and_copy(base, lim);
> + return bcm47xx_nvram_init_from_mem(base, lim);
> }
> #endif
>
> @@ -139,7 +154,7 @@ static int nvram_init_bcma(void)
> return -ENXIO;
> }
>
> - return nvram_find_and_copy(base, lim);
> + return bcm47xx_nvram_init_from_mem(base, lim);
> }
> #endif
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCH V2] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR
2014-09-01 16:08 [PATCH] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR in nvram Rafał Miłecki
2014-09-03 19:33 ` Hauke Mehrtens
@ 2014-09-03 20:51 ` Rafał Miłecki
1 sibling, 0 replies; 3+ messages in thread
From: Rafał Miłecki @ 2014-09-03 20:51 UTC (permalink / raw)
To: linux-mips, Ralf Baechle; +Cc: Hauke Mehrtens, Rafał Miłecki
We should be using ioremap_nocache helper which handles remaps in a
smarter way.
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
V2: Use __iomem for *header
iounmap when initialization is done
Thanks Hauke!
---
arch/mips/bcm47xx/nvram.c | 44 ++++++++++++++++++++++++++++++++------------
1 file changed, 32 insertions(+), 12 deletions(-)
diff --git a/arch/mips/bcm47xx/nvram.c b/arch/mips/bcm47xx/nvram.c
index 2bed73a..e07976b 100644
--- a/arch/mips/bcm47xx/nvram.c
+++ b/arch/mips/bcm47xx/nvram.c
@@ -23,13 +23,13 @@
static char nvram_buf[NVRAM_SPACE];
static const u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
-static u32 find_nvram_size(u32 end)
+static u32 find_nvram_size(void __iomem *end)
{
- struct nvram_header *header;
+ struct nvram_header __iomem *header;
int i;
for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
- header = (struct nvram_header *)KSEG1ADDR(end - nvram_sizes[i]);
+ header = (struct nvram_header *)(end - nvram_sizes[i]);
if (header->magic == NVRAM_HEADER)
return nvram_sizes[i];
}
@@ -38,35 +38,39 @@ static u32 find_nvram_size(u32 end)
}
/* Probe for NVRAM header */
-static int nvram_find_and_copy(u32 base, u32 lim)
+static int nvram_find_and_copy(void __iomem *iobase, u32 lim)
{
- struct nvram_header *header;
+ struct nvram_header __iomem *header;
int i;
u32 off;
u32 *src, *dst;
u32 size;
+ if (nvram_buf[0]) {
+ pr_warn("nvram already initialized\n");
+ return -EEXIST;
+ }
+
/* TODO: when nvram is on nand flash check for bad blocks first. */
off = FLASH_MIN;
while (off <= lim) {
/* Windowed flash access */
- size = find_nvram_size(base + off);
+ size = find_nvram_size(iobase + off);
if (size) {
- header = (struct nvram_header *)KSEG1ADDR(base + off -
- size);
+ header = (struct nvram_header *)(iobase + off - size);
goto found;
}
off <<= 1;
}
/* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
- header = (struct nvram_header *) KSEG1ADDR(base + 4096);
+ header = (struct nvram_header *)(iobase + 4096);
if (header->magic == NVRAM_HEADER) {
size = NVRAM_SPACE;
goto found;
}
- header = (struct nvram_header *) KSEG1ADDR(base + 1024);
+ header = (struct nvram_header *)(iobase + 1024);
if (header->magic == NVRAM_HEADER) {
size = NVRAM_SPACE;
goto found;
@@ -94,6 +98,22 @@ found:
return 0;
}
+static int bcm47xx_nvram_init_from_mem(u32 base, u32 lim)
+{
+ void __iomem *iobase;
+ int err;
+
+ iobase = ioremap_nocache(base, lim);
+ if (!iobase)
+ return -ENOMEM;
+
+ err = nvram_find_and_copy(iobase, lim);
+
+ iounmap(iobase);
+
+ return err;
+}
+
#ifdef CONFIG_BCM47XX_SSB
static int nvram_init_ssb(void)
{
@@ -109,7 +129,7 @@ static int nvram_init_ssb(void)
return -ENXIO;
}
- return nvram_find_and_copy(base, lim);
+ return bcm47xx_nvram_init_from_mem(base, lim);
}
#endif
@@ -139,7 +159,7 @@ static int nvram_init_bcma(void)
return -ENXIO;
}
- return nvram_find_and_copy(base, lim);
+ return bcm47xx_nvram_init_from_mem(base, lim);
}
#endif
--
1.8.4.5
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-09-03 20:51 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-09-01 16:08 [PATCH] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR in nvram Rafał Miłecki
2014-09-03 19:33 ` Hauke Mehrtens
2014-09-03 20:51 ` [PATCH V2] MIPS: BCM47XX: Get rid of calls to KSEG1ADDR Rafał Miłecki
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.