From: Michal Simek <monstr@monstr.eu>
To: Timur Tabi <timur@tabi.org>
Cc: Michal Simek <michal.simek@xilinx.com>,
linux-kernel@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
Tomi Valkeinen <tomi.valkeinen@ti.com>,
linux-fbdev@vger.kernel.org
Subject: Re: [PATCH v3 7/8] video: xilinxfb: Fix sparse warnings
Date: Fri, 31 May 2013 14:22:24 +0000 [thread overview]
Message-ID: <51A8B220.6070308@monstr.eu> (raw)
In-Reply-To: <51A8A89C.8030404@tabi.org>
[-- Attachment #1: Type: text/plain, Size: 5077 bytes --]
On 05/31/2013 03:41 PM, Timur Tabi wrote:
> On 05/31/2013 08:37 AM, Michal Simek wrote:
>> The same is for Microblaze. Driver shares fb_virt for IO memory
>> and for allocated memory. The purpose of this driver wasn't
>> to change the driver logic just resolved sparse warnings.
>> The other way is also wrong.
>> I have compiled this driver with ppc toolchain and it should
>> remove sparse warnings for PPC.
>
> But it's not I/O memory. It's regular memory. __iomem is for
> memory-mapped I/O, which is limited to a specific range of memory locations.
>
> If sometimes you use regular memory for the framebuffer, and other times
> you use real I/O memory for the framebuffer, then you should have two
> different pointers.
I agree with you and if you like I can change it.
But there will be at least one retype because dma_alloc_coherent returns void *
but struct fb_info expects that pointer is __iomem (char __iomem *screen_base).
Patch is below.
Thanks,
Michal
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index f3d4a69..885f294 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -132,8 +132,8 @@ struct xilinxfb_drvdata {
unsigned int dcr_len;
#endif
void *fb_virt; /* virt. address of the frame buffer */
+ void __iomem *fb_virt_io; /* virt. address of the frame buffer */
dma_addr_t fb_phys; /* phys. address of the frame buffer */
- int fb_alloced; /* Flag, was the fb memory alloced? */
u8 flags; /* features of the driver */
@@ -270,24 +270,36 @@ static int xilinxfb_assign(struct platform_device *pdev,
/* Allocate the framebuffer memory */
if (pdata->fb_phys) {
drvdata->fb_phys = pdata->fb_phys;
- drvdata->fb_virt = ioremap(pdata->fb_phys, fbsize);
+ drvdata->fb_virt_io = ioremap(pdata->fb_phys, fbsize);
+
+ if (!drvdata->fb_virt_io) {
+ dev_err(dev, "Could not allocate frame buffer memory\n");
+ rc = -ENOMEM;
+ if (drvdata->flags & BUS_ACCESS_FLAG)
+ goto err_fbmem;
+ else
+ goto err_region;
+ }
+
+ /* Clear (turn to black) the framebuffer */
+ memset_io(drvdata->fb_virt_io, 0, fbsize);
} else {
- drvdata->fb_alloced = 1;
drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(fbsize),
&drvdata->fb_phys, GFP_KERNEL);
- }
- if (!drvdata->fb_virt) {
- dev_err(dev, "Could not allocate frame buffer memory\n");
- rc = -ENOMEM;
- if (drvdata->flags & BUS_ACCESS_FLAG)
- goto err_fbmem;
- else
- goto err_region;
+ if (!drvdata->fb_virt_io) {
+ dev_err(dev, "Could not allocate frame buffer memory\n");
+ rc = -ENOMEM;
+ if (drvdata->flags & BUS_ACCESS_FLAG)
+ goto err_fbmem;
+ else
+ goto err_region;
+ memset(drvdata->fb_virt, 0, fbsize);
}
- /* Clear (turn to black) the framebuffer */
- memset_io((void __iomem *)drvdata->fb_virt, 0, fbsize);
+
/* Tell the hardware where the frame buffer is */
xilinx_fb_out32(drvdata, REG_FB_ADDR, drvdata->fb_phys);
@@ -307,7 +319,11 @@ static int xilinxfb_assign(struct platform_device *pdev,
/* Fill struct fb_info */
drvdata->info.device = dev;
- drvdata->info.screen_base = (void __iomem *)drvdata->fb_virt;
+ if (drvdata->fb_virt)
+ drvdata->info.screen_base = (__force void __iomem *)
+ drvdata->fb_virt;
+ else
+ drvdata->info.screen_base = drvdata->fb_virt_io;
drvdata->info.fbops = &xilinxfb_ops;
drvdata->info.fix = xilinx_fb_fix;
drvdata->info.fix.smem_start = drvdata->fb_phys;
@@ -341,8 +357,8 @@ static int xilinxfb_assign(struct platform_device *pdev,
if (drvdata->flags & BUS_ACCESS_FLAG) {
/* Put a banner in the log (for DEBUG) */
- dev_dbg(dev, "regs: phys=%x, virt=%p\n", drvdata->regs_phys,
- drvdata->regs);
+ dev_dbg(dev, "regs: phys=%x, virt=%p\n",
+ (u32)drvdata->regs_phys, drvdata->regs);
}
/* Put a banner in the log (for DEBUG) */
dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n",
@@ -354,11 +370,11 @@ err_regfb:
fb_dealloc_cmap(&drvdata->info.cmap);
err_cmap:
- if (drvdata->fb_alloced)
+ if (drvdata->fb_virt)
dma_free_coherent(dev, PAGE_ALIGN(fbsize), drvdata->fb_virt,
drvdata->fb_phys);
else
- iounmap(drvdata->fb_virt);
+ iounmap(drvdata->fb_virt_io);
/* Turn off the display */
xilinx_fb_out32(drvdata, REG_CTRL, 0);
@@ -386,11 +402,11 @@ static int xilinxfb_release(struct device *dev)
fb_dealloc_cmap(&drvdata->info.cmap);
- if (drvdata->fb_alloced)
+ if (drvdata->fb_virt)
dma_free_coherent(dev, PAGE_ALIGN(drvdata->info.fix.smem_len),
drvdata->fb_virt, drvdata->fb_phys);
else
- iounmap(drvdata->fb_virt);
+ iounmap(drvdata->fb_virt_io);
/* Turn off the display */
xilinx_fb_out32(drvdata, REG_CTRL, 0);
--
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 263 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: Michal Simek <monstr@monstr.eu>
To: Timur Tabi <timur@tabi.org>
Cc: Michal Simek <michal.simek@xilinx.com>,
linux-kernel@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>,
Tomi Valkeinen <tomi.valkeinen@ti.com>,
linux-fbdev@vger.kernel.org
Subject: Re: [PATCH v3 7/8] video: xilinxfb: Fix sparse warnings
Date: Fri, 31 May 2013 16:22:24 +0200 [thread overview]
Message-ID: <51A8B220.6070308@monstr.eu> (raw)
In-Reply-To: <51A8A89C.8030404@tabi.org>
[-- Attachment #1: Type: text/plain, Size: 5077 bytes --]
On 05/31/2013 03:41 PM, Timur Tabi wrote:
> On 05/31/2013 08:37 AM, Michal Simek wrote:
>> The same is for Microblaze. Driver shares fb_virt for IO memory
>> and for allocated memory. The purpose of this driver wasn't
>> to change the driver logic just resolved sparse warnings.
>> The other way is also wrong.
>> I have compiled this driver with ppc toolchain and it should
>> remove sparse warnings for PPC.
>
> But it's not I/O memory. It's regular memory. __iomem is for
> memory-mapped I/O, which is limited to a specific range of memory locations.
>
> If sometimes you use regular memory for the framebuffer, and other times
> you use real I/O memory for the framebuffer, then you should have two
> different pointers.
I agree with you and if you like I can change it.
But there will be at least one retype because dma_alloc_coherent returns void *
but struct fb_info expects that pointer is __iomem (char __iomem *screen_base).
Patch is below.
Thanks,
Michal
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index f3d4a69..885f294 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -132,8 +132,8 @@ struct xilinxfb_drvdata {
unsigned int dcr_len;
#endif
void *fb_virt; /* virt. address of the frame buffer */
+ void __iomem *fb_virt_io; /* virt. address of the frame buffer */
dma_addr_t fb_phys; /* phys. address of the frame buffer */
- int fb_alloced; /* Flag, was the fb memory alloced? */
u8 flags; /* features of the driver */
@@ -270,24 +270,36 @@ static int xilinxfb_assign(struct platform_device *pdev,
/* Allocate the framebuffer memory */
if (pdata->fb_phys) {
drvdata->fb_phys = pdata->fb_phys;
- drvdata->fb_virt = ioremap(pdata->fb_phys, fbsize);
+ drvdata->fb_virt_io = ioremap(pdata->fb_phys, fbsize);
+
+ if (!drvdata->fb_virt_io) {
+ dev_err(dev, "Could not allocate frame buffer memory\n");
+ rc = -ENOMEM;
+ if (drvdata->flags & BUS_ACCESS_FLAG)
+ goto err_fbmem;
+ else
+ goto err_region;
+ }
+
+ /* Clear (turn to black) the framebuffer */
+ memset_io(drvdata->fb_virt_io, 0, fbsize);
} else {
- drvdata->fb_alloced = 1;
drvdata->fb_virt = dma_alloc_coherent(dev, PAGE_ALIGN(fbsize),
&drvdata->fb_phys, GFP_KERNEL);
- }
- if (!drvdata->fb_virt) {
- dev_err(dev, "Could not allocate frame buffer memory\n");
- rc = -ENOMEM;
- if (drvdata->flags & BUS_ACCESS_FLAG)
- goto err_fbmem;
- else
- goto err_region;
+ if (!drvdata->fb_virt_io) {
+ dev_err(dev, "Could not allocate frame buffer memory\n");
+ rc = -ENOMEM;
+ if (drvdata->flags & BUS_ACCESS_FLAG)
+ goto err_fbmem;
+ else
+ goto err_region;
+ memset(drvdata->fb_virt, 0, fbsize);
}
- /* Clear (turn to black) the framebuffer */
- memset_io((void __iomem *)drvdata->fb_virt, 0, fbsize);
+
/* Tell the hardware where the frame buffer is */
xilinx_fb_out32(drvdata, REG_FB_ADDR, drvdata->fb_phys);
@@ -307,7 +319,11 @@ static int xilinxfb_assign(struct platform_device *pdev,
/* Fill struct fb_info */
drvdata->info.device = dev;
- drvdata->info.screen_base = (void __iomem *)drvdata->fb_virt;
+ if (drvdata->fb_virt)
+ drvdata->info.screen_base = (__force void __iomem *)
+ drvdata->fb_virt;
+ else
+ drvdata->info.screen_base = drvdata->fb_virt_io;
drvdata->info.fbops = &xilinxfb_ops;
drvdata->info.fix = xilinx_fb_fix;
drvdata->info.fix.smem_start = drvdata->fb_phys;
@@ -341,8 +357,8 @@ static int xilinxfb_assign(struct platform_device *pdev,
if (drvdata->flags & BUS_ACCESS_FLAG) {
/* Put a banner in the log (for DEBUG) */
- dev_dbg(dev, "regs: phys=%x, virt=%p\n", drvdata->regs_phys,
- drvdata->regs);
+ dev_dbg(dev, "regs: phys=%x, virt=%p\n",
+ (u32)drvdata->regs_phys, drvdata->regs);
}
/* Put a banner in the log (for DEBUG) */
dev_dbg(dev, "fb: phys=%llx, virt=%p, size=%x\n",
@@ -354,11 +370,11 @@ err_regfb:
fb_dealloc_cmap(&drvdata->info.cmap);
err_cmap:
- if (drvdata->fb_alloced)
+ if (drvdata->fb_virt)
dma_free_coherent(dev, PAGE_ALIGN(fbsize), drvdata->fb_virt,
drvdata->fb_phys);
else
- iounmap(drvdata->fb_virt);
+ iounmap(drvdata->fb_virt_io);
/* Turn off the display */
xilinx_fb_out32(drvdata, REG_CTRL, 0);
@@ -386,11 +402,11 @@ static int xilinxfb_release(struct device *dev)
fb_dealloc_cmap(&drvdata->info.cmap);
- if (drvdata->fb_alloced)
+ if (drvdata->fb_virt)
dma_free_coherent(dev, PAGE_ALIGN(drvdata->info.fix.smem_len),
drvdata->fb_virt, drvdata->fb_phys);
else
- iounmap(drvdata->fb_virt);
+ iounmap(drvdata->fb_virt_io);
/* Turn off the display */
xilinx_fb_out32(drvdata, REG_CTRL, 0);
--
Michal Simek, Ing. (M.Eng), OpenPGP -> KeyID: FE3D1F91
w: www.monstr.eu p: +42-0-721842854
Maintainer of Linux kernel - Microblaze cpu - http://www.monstr.eu/fdt/
Maintainer of Linux kernel - Xilinx Zynq ARM architecture
Microblaze U-BOOT custodian and responsible for u-boot arm zynq platform
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 263 bytes --]
next prev parent reply other threads:[~2013-05-31 14:22 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-31 12:55 [PATCH v3 0/8] xilinxfb changes Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 12:55 ` Michal Simek
[not found] ` <cover.1370004925.git.michal.simek-gjFFaj9aHVfQT0dZR+AlfA@public.gmane.org>
2013-05-31 12:55 ` [PATCH v3 1/8] video: xilinxfb: Fix OF probing on little-endian systems Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 13:05 ` Timur Tabi
2013-05-31 13:05 ` Timur Tabi
2013-05-31 13:09 ` Michal Simek
2013-05-31 13:09 ` Michal Simek
2013-05-31 12:55 ` [PATCH v3 2/8] video: xilinxfb: Do not name out_be32 in function name Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 12:55 ` [PATCH v3 3/8] video: xilinxfb: Rename PLB_ACCESS_FLAG to BUS_ACCESS_FLAG Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 12:55 ` [PATCH v3 4/8] video: xilinxfb: Use drvdata->regs_phys instead of physaddr Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 12:55 ` [PATCH v3 5/8] video: xilinxfb: Group bus initialization Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 12:55 ` [PATCH v3 6/8] video: xilinxfb: Add support for little endian accesses Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 13:38 ` Arnd Bergmann
2013-05-31 13:38 ` Arnd Bergmann
2013-05-31 12:55 ` [PATCH v3 7/8] video: xilinxfb: Fix sparse warnings Michal Simek
2013-05-31 12:55 ` Michal Simek
2013-05-31 13:26 ` Timur Tabi
2013-05-31 13:26 ` Timur Tabi
2013-05-31 13:37 ` Michal Simek
2013-05-31 13:37 ` Michal Simek
2013-05-31 13:41 ` Timur Tabi
2013-05-31 13:41 ` Timur Tabi
2013-05-31 14:22 ` Michal Simek [this message]
2013-05-31 14:22 ` Michal Simek
2013-05-31 14:56 ` Arnd Bergmann
2013-05-31 14:56 ` Arnd Bergmann
2013-05-31 15:06 ` Timur Tabi
2013-05-31 15:06 ` Timur Tabi
2013-05-31 15:29 ` Arnd Bergmann
2013-05-31 15:29 ` Arnd Bergmann
2013-05-31 16:33 ` Michal Simek
2013-05-31 16:33 ` Michal Simek
2013-05-31 15:28 ` Arnd Bergmann
2013-05-31 15:28 ` Arnd Bergmann
2013-05-31 12:55 ` [PATCH v3 8/8] video: xilinxfb: Use driver for Xilinx ARM Zynq Michal Simek
2013-05-31 12:55 ` Michal Simek
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51A8B220.6070308@monstr.eu \
--to=monstr@monstr.eu \
--cc=arnd@arndb.de \
--cc=linux-fbdev@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=michal.simek@xilinx.com \
--cc=plagnioj@jcrosoft.com \
--cc=timur@tabi.org \
--cc=tomi.valkeinen@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.