From patchwork Mon Sep 6 06:33:58 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?TWljaGHDheKAmiBOYXphcmV3aWN6?= X-Patchwork-Id: 157521 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id o866b4ND009942 for ; Mon, 6 Sep 2010 06:37:05 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754805Ab0IFGfW (ORCPT ); Mon, 6 Sep 2010 02:35:22 -0400 Received: from mailout2.w1.samsung.com ([210.118.77.12]:21464 "EHLO mailout2.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754803Ab0IFGfT (ORCPT ); Mon, 6 Sep 2010 02:35:19 -0400 Received: from eu_spt1 (mailout2.w1.samsung.com [210.118.77.12]) by mailout2.w1.samsung.com (iPlanet Messaging Server 5.2 Patch 2 (built Jul 14 2004)) with ESMTP id <0L8B00MD6BMTIK@mailout2.w1.samsung.com>; Mon, 06 Sep 2010 07:35:17 +0100 (BST) Received: from linux.samsung.com ([106.116.38.10]) by spt1.w1.samsung.com (iPlanet Messaging Server 5.2 Patch 2 (built Jul 14 2004)) with ESMTPA id <0L8B00IWLBMSPV@spt1.w1.samsung.com>; Mon, 06 Sep 2010 07:35:16 +0100 (BST) Received: from pikus.localdomain (unknown [106.116.37.23]) by linux.samsung.com (Postfix) with ESMTP id E6AC6270003; Mon, 06 Sep 2010 08:32:00 +0200 (CEST) Date: Mon, 06 Sep 2010 08:33:58 +0200 From: Michal Nazarewicz Subject: [RFCv5 8/9] mm: vcm: Sample driver added In-reply-to: To: linux-arm-kernel@lists.infradead.org, linux-media@vger.kernel.org, linux-mm@kvack.org Cc: Andrew Morton , Daniel Walker , FUJITA Tomonori , Hans Verkuil , Jonathan Corbet , KAMEZAWA Hiroyuki , Konrad Rzeszutek Wilk , Kyungmin Park , Marek Szyprowski , Mel Gorman , Minchan Kim , Pawel Osciak , Peter Zijlstra , Russell King , Zach Pfeffer , linux-kernel@vger.kernel.org Message-id: <262a5a5019c1f1a44d5793f7e69776e56f27af06.1283749231.git.mina86@mina86.com> MIME-version: 1.0 X-Mailer: git-send-email 1.7.1 Content-type: TEXT/PLAIN Content-transfer-encoding: 7BIT References: Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 06 Sep 2010 06:37:05 +0000 (UTC) diff --git a/Documentation/virtual-contiguous-memory.txt b/Documentation/virtual-contiguous-memory.txt index 0c0e90c..6d1014c 100644 --- a/Documentation/virtual-contiguous-memory.txt +++ b/Documentation/virtual-contiguous-memory.txt @@ -730,6 +730,9 @@ already there. If you want to use this wrapper, you need to select VCM_MMU Kconfig option. +There is a sample driver provided which provides a template for real +drivers. It can be found in [[file:../mm/vcm-sample.c][mm/vcm-sample.c]] file. + *** Context creation Similarly to normal drivers, MMU driver needs to provide a context diff --git a/include/linux/vcm-sample.h b/include/linux/vcm-sample.h new file mode 100644 index 0000000..9a79403 --- /dev/null +++ b/include/linux/vcm-sample.h @@ -0,0 +1,30 @@ +/* + * Virtual Contiguous Memory driver driver template header + * Copyright (c) 2010 by Samsung Electronics. + * Written by Michal Nazarewicz (m.nazarewicz@samsung.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License or (at your optional) any later version of the license. + */ + +/* + * See Documentation/virtual-contiguous-memory.txt for details. + */ + +#ifndef __LINUX_VCM_SAMPLE_H +#define __LINUX_VCM_SAMPLE_H + +#include + +struct vcm; + +/** + * vcm_samp_create() - creates a VCM context + * + * ... Documentation goes here ... + */ +struct vcm *__must_check vcm_samp_create(/* ... */); + +#endif diff --git a/mm/Kconfig b/mm/Kconfig index 0445f68..be040e7 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -401,3 +401,12 @@ config VCM_O2O # Select if you need vcm_phys_alloc() or vcm_phys_walk() functions config VCM_PHYS bool + +config VCM_SAMP + bool "VCM sample driver" + depends on VCM + select VCM_MMU + help + This enables a sample driver for the VCM framework. This driver + does not handle any real harwdare. It's merely an template of + how for real drivers. diff --git a/mm/Makefile b/mm/Makefile index e908202..c465dfa 100644 --- a/mm/Makefile +++ b/mm/Makefile @@ -50,3 +50,4 @@ obj-$(CONFIG_DEBUG_KMEMLEAK_TEST) += kmemleak-test.o obj-$(CONFIG_CMA) += cma.o obj-$(CONFIG_CMA_BEST_FIT) += cma-best-fit.o obj-$(CONFIG_VCM) += vcm.o +obj-$(CONFIG_VCM_SAMPLE) += vcm-sample.o diff --git a/mm/vcm-sample.c b/mm/vcm-sample.c new file mode 100644 index 0000000..e265a73 --- /dev/null +++ b/mm/vcm-sample.c @@ -0,0 +1,120 @@ +/* + * Virtual Contiguous Memory driver template + * Copyright (c) 2010 by Samsung Electronics. + * Written by Michal Nazarewicz (m.nazarewicz@samsung.com) + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License or (at your optional) any later version of the license. + */ + +/* + * This is just a sample code. It does nothing useful other then + * presenting a template for VCM driver. + */ + +/* + * See Documentation/virtual-contiguous-memory.txt for details. + */ + +#include +#include + +struct vcm_samp { + struct vcm_mmu mmu; + /* ... */ +}; + +static const unsigned vcm_samp_orders[] = { + 4 + 20 - PAGES_SHIFT, /* 16MiB pages */ + 0 + 20 - PAGES_SHIFT, /* 1MiB pages */ + 6 + 10 - PAGES_SHIFT, /* 64KiB pages */ + 2 + 10 - PAGES_SHIFT, /* 4KiB pages */ +}; + +static int vcm_samp_activate_page(dma_addr_t vaddr, dma_addr_t paddr, + unsigned order, void *priv) +{ + struct vcm_samp *samp = + container_of((struct vcm *)priv, struct vcm_samp, mmu.vcm); + + /* + * Handle adding a mapping from virtual page at @vaddr to + * physical page ad @paddr. The page is of order @order which + * means that it's (PAGE_SIZE << @order) bytes. + */ + + return -EOPNOTSUPP; +} + +static int vcm_samp_deactivate_page(dma_addr_t vaddr, dma_addr_t paddr, + unsigned order, void *priv) +{ + struct vcm_samp *samp = + container_of((struct vcm *)priv, struct vcm_samp, mmu.vcm); + + /* + * Handle removing a mapping from virtual page at @vaddr to + * physical page ad @paddr. The page is of order @order which + * means that it's (PAGE_SIZE << @order) bytes. + */ + + /* It's best not to fail here */ + return 0; +} + +static void vcm_samp_cleanup(struct vcm *vcm) +{ + struct vcm_samp *samp = + container_of(res->vcm, struct vcm_samp, mmu.vcm); + + /* Clean ups ... */ + + kfree(samp); +} + +struct vcm *__must_check vcm_samp_create(/* ... */) +{ + static const struct vcm_mmu_driver driver = { + .order = vcm_samp_orders, + .cleanup = vcm_samp_cleanup, + .activate_page = vcm_samp_activate_page, + .deactivate_page = vcm_samp_deactivate_page, + }; + + struct vcm_samp *samp; + struct vcm *vcm; + + switch (0) { + case 0: + case PAGE_SHIFT == 12: + /* + * If you have a compilation error here it means you + * are compiling for a very strange platfrom where + * PAGE_SHIFT is not 12 (ie. PAGE_SIZE is not 4KiB). + * This driver assumes PAGE_SHIFT is 12. + */ + }; + + samp = kzalloc(sizeof *samp, GFP_KERNEL); + if (!samp) + return ERR_PTR(-ENOMEM); + + /* ... Set things up ... */ + + samp->mmu.driver = &driver; + /* skip first 64K so that zero address will be a NULL pointer */ + samp->mmu.vcm.start = (64 << 10); + samp->mmu.vcm.size = -(64 << 10); + + vcm = vcm_mmu_init(&samp->mmu); + if (!IS_ERR(vcm)) + return vcm; + + /* ... Error recovery ... */ + + kfree(samp); + return vcm; +} +EXPORT_SYMBOL_GPL(vcm_samp_create);