From patchwork Tue Jun 26 14:18:13 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Gaignard X-Patchwork-Id: 9625 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 8F11523E23 for ; Tue, 26 Jun 2012 14:18:42 +0000 (UTC) Received: from mail-gg0-f180.google.com (mail-gg0-f180.google.com [209.85.161.180]) by fiordland.canonical.com (Postfix) with ESMTP id 4872FA18C66 for ; Tue, 26 Jun 2012 14:18:42 +0000 (UTC) Received: by mail-gg0-f180.google.com with SMTP id f1so4139609ggn.11 for ; Tue, 26 Jun 2012 07:18:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to :date:message-id:x-mailer:in-reply-to:references:subject:x-beenthere :x-mailman-version:precedence:list-id:list-unsubscribe:list-archive :list-post:list-help:list-subscribe:mime-version:content-type :content-transfer-encoding:sender:errors-to:x-gm-message-state; bh=Ydxhk1UOiQoaN3yOGreftmO17RuCBfigiYmt/ulM5MI=; b=Hg4bowRZ1INvBhnng1Ljjyk+ZWyot2uM/Pro96k0ESylHEsuscZ+Ur1MC2dmcIhPox wpcVPBpQwq7Ny9QRmmAzcmcP1aIafblPY2VO7XkThZQM/Gt3ut7wBtsyXlWTIJwhBotU 1KqSCD4x13qtxEOU3Cpln7P8GGh393TGMLODXFq8oVGaVFJvxadrIqbv0tdlvWjayITl DmRGZKxQXkQEUdUdCfg7ekTYayeTVMuwN6YOQJHZXXlB6Efsm9j6X6KMaym1wTU07zcq GWfbt/SKsu/z44TOFCzZJdUEXbIprY0YTvCDu3OSdhVZ/3VivXev+evBfljPnAiFpiEl ZHaA== Received: by 10.42.89.72 with SMTP id f8mr8351579icm.33.1340720321624; Tue, 26 Jun 2012 07:18:41 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.24.148 with SMTP id v20csp79230ibb; Tue, 26 Jun 2012 07:18:40 -0700 (PDT) Received: by 10.216.195.201 with SMTP id p51mr8631659wen.158.1340720319997; Tue, 26 Jun 2012 07:18:39 -0700 (PDT) Received: from mombin.canonical.com (mombin.canonical.com. [91.189.95.16]) by mx.google.com with ESMTP id 57si19794188wej.79.2012.06.26.07.18.38; Tue, 26 Jun 2012 07:18:39 -0700 (PDT) Received-SPF: neutral (google.com: 91.189.95.16 is neither permitted nor denied by best guess record for domain of linaro-mm-sig-bounces@lists.linaro.org) client-ip=91.189.95.16; Authentication-Results: mx.google.com; spf=neutral (google.com: 91.189.95.16 is neither permitted nor denied by best guess record for domain of linaro-mm-sig-bounces@lists.linaro.org) smtp.mail=linaro-mm-sig-bounces@lists.linaro.org Received: from localhost ([127.0.0.1] helo=mombin.canonical.com) by mombin.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1SjWbF-0007DE-O5; Tue, 26 Jun 2012 14:18:37 +0000 Received: from mail-bk0-f42.google.com ([209.85.214.42]) by mombin.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1SjWbE-00078J-7Q for linaro-mm-sig@lists.linaro.org; Tue, 26 Jun 2012 14:18:36 +0000 Received: by mail-bk0-f42.google.com with SMTP id ik5so8676947bkc.1 for ; Tue, 26 Jun 2012 07:18:36 -0700 (PDT) Received: by 10.205.133.197 with SMTP id hz5mr5618397bkc.126.1340720315856; Tue, 26 Jun 2012 07:18:35 -0700 (PDT) Received: from localhost.localdomain (LPuteaux-156-14-44-212.w82-127.abo.wanadoo.fr. [82.127.83.212]) by mx.google.com with ESMTPS id h18sm50991055bkh.8.2012.06.26.07.18.34 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 26 Jun 2012 07:18:35 -0700 (PDT) From: Benjamin Gaignard To: linaro-mm-sig@lists.linaro.org Date: Tue, 26 Jun 2012 16:18:13 +0200 Message-Id: <1340720293-21221-5-git-send-email-benjamin.gaignard@linaro.org> X-Mailer: git-send-email 1.7.10 In-Reply-To: <1340720293-21221-1-git-send-email-benjamin.gaignard@linaro.org> References: <1340720293-21221-1-git-send-email-benjamin.gaignard@linaro.org> Subject: [Linaro-mm-sig] [PATCH v6 4/4] add test/example driver for ux500 platform X-BeenThere: linaro-mm-sig@lists.linaro.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Unified memory management interest group." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: linaro-mm-sig-bounces@lists.linaro.org Errors-To: linaro-mm-sig-bounces@lists.linaro.org X-Gm-Message-State: ALoCoQlbnyzhWmn4446vEcO7Y+Smr9VmqYGbZBzHhn/3O7O30rsfr7+n1bQMgVQgzOh3n3WzfJlt DO NOT MERGE ux500-ion driver is provided as example. Define 2 CMA heaps, one on a specific CMA region reserved at boot time the other will use the default CMA region. Signed-off-by: Benjamin Gaignard --- arch/arm/mach-ux500/board-mop500.c | 64 +++++++++++++++++ drivers/gpu/ion/Kconfig | 5 ++ drivers/gpu/ion/Makefile | 1 + drivers/gpu/ion/ux500/Makefile | 1 + drivers/gpu/ion/ux500/ux500_ion.c | 134 ++++++++++++++++++++++++++++++++++++ 5 files changed, 205 insertions(+) create mode 100644 drivers/gpu/ion/ux500/Makefile create mode 100644 drivers/gpu/ion/ux500/ux500_ion.c diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 77d03c1..c91cd8f 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c @@ -30,6 +30,13 @@ #include #include +#ifdef CONFIG_ION +#include +#endif +#ifdef CONFIG_CMA +#include +#endif + #include #include @@ -54,6 +61,50 @@ #include "board-mop500.h" #include "board-mop500-regulators.h" +#ifdef CONFIG_CMA +static u64 snowball_dmamask = DMA_BIT_MASK(32); + +static struct platform_device snowball_cma_device = { + .name = "snowball-cma-device", + .id = -1, + .dev = { + .dma_mask = &snowball_dmamask, + .coherent_dma_mask = DMA_BIT_MASK(32), + }, + .num_resources = 0, +}; + +#ifdef CONFIG_ION +static struct ion_platform_heap snowball_ion_heaps[] = { + [0] = { + .type = ION_HEAP_TYPE_DMA, + .id = 0, + .name = "ion-cma-heap-1", + .priv = &snowball_cma_device.dev, + }, + [1] = { + .type = ION_HEAP_TYPE_DMA, + .id = 1, + .name = "ion-cma-heap-2", + }, +}; + +static struct ion_platform_data snowball_ion_data = { + .heaps = snowball_ion_heaps, + .nr = ARRAY_SIZE(snowball_ion_heaps), +}; + +static struct platform_device snowball_ion_device = { + .name = "ion-ux500", + .id = -1, + .dev = { + .platform_data = &snowball_ion_data, + }, + .num_resources = 0, +}; +#endif +#endif + static struct gpio_led snowball_led_array[] = { { .name = "user_led", @@ -607,8 +658,18 @@ static struct platform_device *snowball_platform_devs[] __initdata = { &snowball_key_dev, &snowball_sbnet_dev, &ab8500_device, +#ifdef CONFIG_ION + &snowball_ion_device, +#endif }; +#ifdef CONFIG_ION +static void __init mop500_reserve(void) +{ + dma_declare_contiguous(&snowball_cma_device.dev, (16 * SZ_1M), 0, 0); +} +#endif + static void __init mop500_init_machine(void) { struct device *parent = NULL; @@ -741,6 +802,9 @@ MACHINE_START(SNOWBALL, "Calao Systems Snowball platform") .timer = &ux500_timer, .handle_irq = gic_handle_irq, .init_machine = snowball_init_machine, +#ifdef CONFIG_ION + .reserve = mop500_reserve, +#endif MACHINE_END #ifdef CONFIG_MACH_UX500_DT diff --git a/drivers/gpu/ion/Kconfig b/drivers/gpu/ion/Kconfig index b5bfdb4..bfe572d 100644 --- a/drivers/gpu/ion/Kconfig +++ b/drivers/gpu/ion/Kconfig @@ -11,3 +11,8 @@ config ION_TEGRA help Choose this option if you wish to use ion on an nVidia Tegra. +config ION_UX500 + tristate "Ion for ux500" + depends on ARCH_U8500 && ION + help + Choose this option if you wish to use ion on ux500 platforms. diff --git a/drivers/gpu/ion/Makefile b/drivers/gpu/ion/Makefile index 32d3385..a7ea570 100644 --- a/drivers/gpu/ion/Makefile +++ b/drivers/gpu/ion/Makefile @@ -2,3 +2,4 @@ ion-driver-objs += ion.o ion_heap.o ion_system_heap.o ion_carveout_heap.o obj-$(CONFIG_ION) += ion-driver.o obj-$(CONFIG_CMA) += ion_cma_heap.o obj-$(CONFIG_ION_TEGRA) += tegra/ +obj-$(CONFIG_ION_UX500) += ux500/ diff --git a/drivers/gpu/ion/ux500/Makefile b/drivers/gpu/ion/ux500/Makefile new file mode 100644 index 0000000..691c600 --- /dev/null +++ b/drivers/gpu/ion/ux500/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_ION_UX500) += ux500_ion.o diff --git a/drivers/gpu/ion/ux500/ux500_ion.c b/drivers/gpu/ion/ux500/ux500_ion.c new file mode 100644 index 0000000..5d5cf77 --- /dev/null +++ b/drivers/gpu/ion/ux500/ux500_ion.c @@ -0,0 +1,134 @@ +/* + * drivers/gpu/ion/ux500/ux500_ion.c + * + * Copyright (C) Linaro 2012 + * Author: for ST-Ericsson. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include "../ion_priv.h" + +struct ion_ux500_internal { + struct ion_device *ion_device; + int num_heaps; + struct ion_heap **heaps; +}; + +int ux500_ion_probe(struct platform_device *pdev) +{ + struct ion_platform_data *pdata = pdev->dev.platform_data; + struct ion_ux500_internal *ion_ux500; + int ret = 0; + int i; + + ion_ux500 = kzalloc(sizeof(struct ion_ux500_internal), GFP_KERNEL); + if (!ion_ux500) { + dev_err(&pdev->dev, "can't allocate memory\n"); + return -ENOMEM; + } + + ion_ux500->num_heaps = pdata->nr; + if (!ion_ux500->num_heaps) { + dev_err(&pdev->dev, "no heap defined\n"); + ret = -ENODEV; + goto release; + } + + ion_ux500->heaps = kzalloc(sizeof(struct ion_heap *) + * ion_ux500->num_heaps, GFP_KERNEL); + if (!ion_ux500->heaps) { + dev_err(&pdev->dev, "no memory for heaps\n"); + ret = -ENOMEM; + goto release; + } + + ion_ux500->ion_device = ion_device_create(NULL); + if (IS_ERR_OR_NULL(ion_ux500->ion_device)) { + dev_err(&pdev->dev, "failed to create ion device\n"); + ret = PTR_ERR(ion_ux500->ion_device); + goto release_heaps; + } + + /* create the heaps as specified in the board file */ + for (i = 0; i < ion_ux500->num_heaps; i++) { + struct ion_platform_heap *heap_data = &pdata->heaps[i]; + + ion_ux500->heaps[i] = ion_heap_create(heap_data); + + if (IS_ERR_OR_NULL(ion_ux500->heaps[i])) { + ret = PTR_ERR(ion_ux500->heaps[i]); + ion_ux500->heaps[i] = NULL; + dev_err(&pdev->dev, + "failed to create heap type %d id %d\n", + heap_data->type, heap_data->id); + goto destroy_heaps; + } + ion_device_add_heap(ion_ux500->ion_device, ion_ux500->heaps[i]); + } + + platform_set_drvdata(pdev, ion_ux500); + + return ret; + +destroy_heaps: + for (i = 0; i < ion_ux500->num_heaps; i++) + if (ion_ux500->heaps[i]) + ion_heap_destroy(ion_ux500->heaps[i]); + + ion_device_destroy(ion_ux500->ion_device); +release_heaps: + kfree(ion_ux500->heaps); +release: + kfree(ion_ux500); + return ret; +} + +int ux500_ion_remove(struct platform_device *pdev) +{ + struct ion_ux500_internal *ion_ux500 = platform_get_drvdata(pdev); + int i; + + for (i = 0; i < ion_ux500->num_heaps; i++) + if (ion_ux500->heaps[i]) + ion_heap_destroy(ion_ux500->heaps[i]); + + ion_device_destroy(ion_ux500->ion_device); + kfree(ion_ux500->heaps); + kfree(ion_ux500); + + return 0; +} + +static struct platform_driver ux500_ion_driver = { + .probe = ux500_ion_probe, + .remove = ux500_ion_remove, + .driver = { + .name = "ion-ux500", + } +}; + +static int __init ux500_ion_init(void) +{ + return platform_driver_register(&ux500_ion_driver); +} + +static void __exit ux500_ion_exit(void) +{ + platform_driver_unregister(&ux500_ion_driver); +} + +module_init(ux500_ion_init); +module_exit(ux500_ion_exit);