From patchwork Fri May 31 14:22:24 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michal Simek X-Patchwork-Id: 2644151 Return-Path: X-Original-To: patchwork-linux-fbdev@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id 49F50DFB79 for ; Fri, 31 May 2013 14:22:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752489Ab3EaOW2 (ORCPT ); Fri, 31 May 2013 10:22:28 -0400 Received: from mail-wi0-f178.google.com ([209.85.212.178]:65526 "EHLO mail-wi0-f178.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751985Ab3EaOW2 (ORCPT ); Fri, 31 May 2013 10:22:28 -0400 Received: by mail-wi0-f178.google.com with SMTP id hj6so741640wib.11 for ; Fri, 31 May 2013 07:22:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=message-id:date:from:reply-to:user-agent:mime-version:to:cc:subject :references:in-reply-to:x-enigmail-version:content-type :x-gm-message-state; bh=9wkV5ptIcAC/+apItQVqIuOGAfvBHMbiyeOd7d7tnkY=; b=hcP0BNcpzxX2g9QJYdp1UurouaYL7+9rUTzPGCusCO1gCKSjxoO5m/qPF03+mvrMnQ AEV3QnpCmVQNjubCz2D+tvWaDQQtKpB/G8PT+Bx1UVvoBzErKdJloNKkps4M9vRo9sfx 7wL4TZkCzlOeoDVVaWEeh0/RYuvLmdlSvfi1FYQAEw8+cHanKTWx00QEoF7qrtXMA8cR mqXLlPWjtrKiWPY8kWfKBvUOrjekKqeVUnu8xnciS90t660O4H+reIarS5DEI2LfB8yv 9ReHGjzI/hcpU3DvMLCGq5T5szePZomhlvBUpgkBO1SGhQSdcbuEPPwPOgVHUocNiugO vuyw== X-Received: by 10.180.9.80 with SMTP id x16mr3422448wia.63.1370010146912; Fri, 31 May 2013 07:22:26 -0700 (PDT) Received: from [192.168.0.100] (nat-63.starnet.cz. [178.255.168.63]) by mx.google.com with ESMTPSA id w8sm5313800wiz.0.2013.05.31.07.22.24 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Fri, 31 May 2013 07:22:25 -0700 (PDT) Message-ID: <51A8B220.6070308@monstr.eu> Date: Fri, 31 May 2013 16:22:24 +0200 From: Michal Simek Reply-To: monstr@monstr.eu User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130330 Thunderbird/17.0.5 MIME-Version: 1.0 To: Timur Tabi CC: Michal Simek , linux-kernel@vger.kernel.org, Arnd Bergmann , Jean-Christophe Plagniol-Villard , Tomi Valkeinen , linux-fbdev@vger.kernel.org Subject: Re: [PATCH v3 7/8] video: xilinxfb: Fix sparse warnings References: <51A8A4ED.6070104@tabi.org> <51A8A7B1.3040709@monstr.eu> <51A8A89C.8030404@tabi.org> In-Reply-To: <51A8A89C.8030404@tabi.org> X-Enigmail-Version: 1.5.1 X-Gm-Message-State: ALoCoQnicKtXXX4hQKDtunL2BUJqG/QTOF3epJhtsKOhg2HnEyCAAt3kFFGDtJhOZ83auVbD3Kh0 Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org 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 /* 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); 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,