History

Revert "drivers: of: add initialization code for dma reserved memory"

This reverts commit 9d8eab7af79cb4ce2de5de39f82c455b1f796963. There is still no consensus on the bindings for the reserved memory and various drawbacks of the proposed solution has been shown, so the best now is to revert it completely and start again from scratch later.

Marek Szyprowski committed 13 years ago

Commit 1931ee11 parent cebf3e46 files · +0 −366Browse files

Unified · Split

6 files
  1. Documentation/devicetree/bindings/memory.txt +0 −168
  2. drivers/of/Kconfig +0 −6
  3. drivers/of/Makefile +0 −1
  4. drivers/of/of_reserved_mem.c +0 −173
  5. drivers/of/platform.c +0 −4
  6. include/linux/of_reserved_mem.h +0 −14
Documentation/devicetree/bindings/memory.txt+0−168
@@ -1,168 +0,0 @@
1−*** Memory binding ***
2−
3−The /memory node provides basic information about the address and size
4−of the physical memory. This node is usually filled or updated by the
5−bootloader, depending on the actual memory configuration of the given
6−hardware.
7−
8−The memory layout is described by the following node:
9−
10−/ {
11− #address-cells = <(n)>;
12− #size-cells = <(m)>;
13− memory {
14− device_type = "memory";
15− reg = <(baseaddr1) (size1)
16− (baseaddr2) (size2)
17− ...
18− (baseaddrN) (sizeN)>;
19− };
20− ...
21−};
22−
23−A memory node follows the typical device tree rules for "reg" property:
24−n: number of cells used to store base address value
25−m: number of cells used to store size value
26−baseaddrX: defines a base address of the defined memory bank
27−sizeX: the size of the defined memory bank
28−
29−
30−More than one memory bank can be defined.
31−
32−
33−*** Reserved memory regions ***
34−
35−In /memory/reserved-memory node one can create child nodes describing
36−particular reserved (excluded from normal use) memory regions. Such
37−memory regions are usually designed for the special usage by various
38−device drivers. A good example are contiguous memory allocations or
39−memory sharing with other operating system on the same hardware board.
40−Those special memory regions might depend on the board configuration and
41−devices used on the target system.
42−
43−Parameters for each memory region can be encoded into the device tree
44−with the following convention:
45−
46−[(label):] (name) {
47− compatible = "linux,contiguous-memory-region", "reserved-memory-region";
48− reg = <(address) (size)>;
49− (linux,default-contiguous-region);
50−};
51−
52−compatible: one or more of:
53− - "linux,contiguous-memory-region" - enables binding of this
54− region to Contiguous Memory Allocator (special region for
55− contiguous memory allocations, shared with movable system
56− memory, Linux kernel-specific).
57− - "reserved-memory-region" - compatibility is defined, given
58− region is assigned for exclusive usage for by the respective
59− devices.
60−
61−reg: standard property defining the base address and size of
62− the memory region
63−
64−linux,default-contiguous-region: property indicating that the region
65− is the default region for all contiguous memory
66− allocations, Linux specific (optional)
67−
68−It is optional to specify the base address, so if one wants to use
69−autoconfiguration of the base address, '0' can be specified as a base
70−address in the 'reg' property.
71−
72−The /memory/reserved-memory node must contain the same #address-cells
73−and #size-cells value as the root node.
74−
75−
76−*** Device node's properties ***
77−
78−Once regions in the /memory/reserved-memory node have been defined, they
79−may be referenced by other device nodes. Bindings that wish to reference
80−memory regions should explicitly document their use of the following
81−property:
82−
83−memory-region = <&phandle_to_defined_region>;
84−
85−This property indicates that the device driver should use the memory
86−region pointed by the given phandle.
87−
88−
89−*** Example ***
90−
91−This example defines a memory consisting of 4 memory banks. 3 contiguous
92−regions are defined for Linux kernel, one default of all device drivers
93−(named contig_mem, placed at 0x72000000, 64MiB), one dedicated to the
94−framebuffer device (labelled display_mem, placed at 0x78000000, 8MiB)
95−and one for multimedia processing (labelled multimedia_mem, placed at
96−0x77000000, 64MiB). 'display_mem' region is then assigned to fb@12300000
97−device for DMA memory allocations (Linux kernel drivers will use CMA is
98−available or dma-exclusive usage otherwise). 'multimedia_mem' is
99−assigned to scaler@12500000 and codec@12600000 devices for contiguous
100−memory allocations when CMA driver is enabled.
101−
102−The reason for creating a separate region for framebuffer device is to
103−match the framebuffer base address to the one configured by bootloader,
104−so once Linux kernel drivers starts no glitches on the displayed boot
105−logo appears. Scaller and codec drivers should share the memory
106−allocations.
107−
108−/ {
109− #address-cells = <1>;
110− #size-cells = <1>;
111−
112− /* ... */
113−
114− memory {
115− reg = <0x40000000 0x10000000
116− 0x50000000 0x10000000
117− 0x60000000 0x10000000
118− 0x70000000 0x10000000>;
119−
120− reserved-memory {
121− #address-cells = <1>;
122− #size-cells = <1>;
123−
124− /*
125− * global autoconfigured region for contiguous allocations
126− * (used only with Contiguous Memory Allocator)
127− */
128− contig_region@0 {
129− compatible = "linux,contiguous-memory-region";
130− reg = <0x0 0x4000000>;
131− linux,default-contiguous-region;
132− };
133−
134− /*
135− * special region for framebuffer
136− */
137− display_region: region@78000000 {
138− compatible = "linux,contiguous-memory-region", "reserved-memory-region";
139− reg = <0x78000000 0x800000>;
140− };
141−
142− /*
143− * special region for multimedia processing devices
144− */
145− multimedia_region: region@77000000 {
146− compatible = "linux,contiguous-memory-region";
147− reg = <0x77000000 0x4000000>;
148− };
149− };
150− };
151−
152− /* ... */
153−
154− fb0: fb@12300000 {
155− status = "okay";
156− memory-region = <&display_region>;
157− };
158−
159− scaler: scaler@12500000 {
160− status = "okay";
161− memory-region = <&multimedia_region>;
162− };
163−
164− codec: codec@12600000 {
165− status = "okay";
166− memory-region = <&multimedia_region>;
167− };
168−};
drivers/of/Kconfig+0−6
@@ -74,10 +74,4 @@ config OF_MTD · 73 unmodified lines
7474 depends on MTD
7575 def_bool y
7676
77−config OF_RESERVED_MEM
78− depends on OF_FLATTREE && (DMA_CMA || (HAVE_GENERIC_DMA_COHERENT && HAVE_MEMBLOCK))
79− def_bool y
80− help
81− Initialization code for DMA reserved memory
82−
8377 endmenu # OF
drivers/of/Makefile+0−1
@@ -9,4 +9,3 @@ obj-$(CONFIG_OF_MDIO) += of_mdio.o · 8 unmodified lines
99 obj-$(CONFIG_OF_PCI) += of_pci.o
1010 obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
1111 obj-$(CONFIG_OF_MTD) += of_mtd.o
12−obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o
drivers/of/of_reserved_mem.c+0−173
@@ -1,173 +0,0 @@
1−/*
2− * Device tree based initialization code for reserved memory.
3− *
4− * Copyright (c) 2013 Samsung Electronics Co., Ltd.
5− * http://www.samsung.com
6− * Author: Marek Szyprowski <m.szyprowski@samsung.com>
7− *
8− * This program is free software; you can redistribute it and/or
9− * modify it under the terms of the GNU General Public License as
10− * published by the Free Software Foundation; either version 2 of the
11− * License or (at your optional) any later version of the license.
12− */
13−
14−#include <linux/memblock.h>
15−#include <linux/err.h>
16−#include <linux/of.h>
17−#include <linux/of_fdt.h>
18−#include <linux/of_platform.h>
19−#include <linux/mm.h>
20−#include <linux/sizes.h>
21−#include <linux/mm_types.h>
22−#include <linux/dma-contiguous.h>
23−#include <linux/dma-mapping.h>
24−#include <linux/of_reserved_mem.h>
25−
26−#define MAX_RESERVED_REGIONS 16
27−struct reserved_mem {
28− phys_addr_t base;
29− unsigned long size;
30− struct cma *cma;
31− char name[32];
32−};
33−static struct reserved_mem reserved_mem[MAX_RESERVED_REGIONS];
34−static int reserved_mem_count;
35−
36−static int __init fdt_scan_reserved_mem(unsigned long node, const char *uname,
37− int depth, void *data)
38−{
39− struct reserved_mem *rmem = &reserved_mem[reserved_mem_count];
40− phys_addr_t base, size;
41− int is_cma, is_reserved;
42− unsigned long len;
43− const char *status;
44− __be32 *prop;
45−
46− is_cma = IS_ENABLED(CONFIG_DMA_CMA) &&
47− of_flat_dt_is_compatible(node, "linux,contiguous-memory-region");
48− is_reserved = of_flat_dt_is_compatible(node, "reserved-memory-region");
49−
50− if (!is_reserved && !is_cma) {
51− /* ignore node and scan next one */
52− return 0;
53− }
54−
55− status = of_get_flat_dt_prop(node, "status", &len);
56− if (status && strcmp(status, "okay") != 0) {
57− /* ignore disabled node nad scan next one */
58− return 0;
59− }
60−
61− prop = of_get_flat_dt_prop(node, "reg", &len);
62− if (!prop || (len < (dt_root_size_cells + dt_root_addr_cells) *
63− sizeof(__be32))) {
64− pr_err("Reserved mem: node %s, incorrect \"reg\" property\n",
65− uname);
66− /* ignore node and scan next one */
67− return 0;
68− }
69− base = dt_mem_next_cell(dt_root_addr_cells, &prop);
70− size = dt_mem_next_cell(dt_root_size_cells, &prop);
71−
72− if (!size) {
73− /* ignore node and scan next one */
74− return 0;
75− }
76−
77− pr_info("Reserved mem: found %s, memory base %lx, size %ld MiB\n",
78− uname, (unsigned long)base, (unsigned long)size / SZ_1M);
79−
80− if (reserved_mem_count == ARRAY_SIZE(reserved_mem))
81− return -ENOSPC;
82−
83− rmem->base = base;
84− rmem->size = size;
85− strlcpy(rmem->name, uname, sizeof(rmem->name));
86−
87− if (is_cma) {
88− struct cma *cma;
89− if (dma_contiguous_reserve_area(size, base, 0, &cma) == 0) {
90− rmem->cma = cma;
91− reserved_mem_count++;
92− if (of_get_flat_dt_prop(node,
93− "linux,default-contiguous-region",
94− NULL))
95− dma_contiguous_set_default(cma);
96− }
97− } else if (is_reserved) {
98− if (memblock_remove(base, size) == 0)
99− reserved_mem_count++;
100− else
101− pr_err("Failed to reserve memory for %s\n", uname);
102− }
103−
104− return 0;
105−}
106−
107−static struct reserved_mem *get_dma_memory_region(struct device *dev)
108−{
109− struct device_node *node;
110− const char *name;
111− int i;
112−
113− node = of_parse_phandle(dev->of_node, "memory-region", 0);
114− if (!node)
115− return NULL;
116−
117− name = kbasename(node->full_name);
118− for (i = 0; i < reserved_mem_count; i++)
119− if (strcmp(name, reserved_mem[i].name) == 0)
120− return &reserved_mem[i];
121− return NULL;
122−}
123−
124−/**
125− * of_reserved_mem_device_init() - assign reserved memory region to given device
126− *
127− * This function assign memory region pointed by "memory-region" device tree
128− * property to the given device.
129− */
130−void of_reserved_mem_device_init(struct device *dev)
131−{
132− struct reserved_mem *region = get_dma_memory_region(dev);
133− if (!region)
134− return;
135−
136− if (region->cma) {
137− dev_set_cma_area(dev, region->cma);
138− pr_info("Assigned CMA %s to %s device\n", region->name,
139− dev_name(dev));
140− } else {
141− if (dma_declare_coherent_memory(dev, region->base, region->base,
142− region->size, DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE) != 0)
143− pr_info("Declared reserved memory %s to %s device\n",
144− region->name, dev_name(dev));
145− }
146−}
147−
148−/**
149− * of_reserved_mem_device_release() - release reserved memory device structures
150− *
151− * This function releases structures allocated for memory region handling for
152− * the given device.
153− */
154−void of_reserved_mem_device_release(struct device *dev)
155−{
156− struct reserved_mem *region = get_dma_memory_region(dev);
157− if (!region && !region->cma)
158− dma_release_declared_memory(dev);
159−}
160−
161−/**
162− * early_init_dt_scan_reserved_mem() - create reserved memory regions
163− *
164− * This function grabs memory from early allocator for device exclusive use
165− * defined in device tree structures. It should be called by arch specific code
166− * once the early allocator (memblock) has been activated and all other
167− * subsystems have already allocated/reserved memory.
168− */
169−void __init early_init_dt_scan_reserved_mem(void)
170−{
171− of_scan_flat_dt_by_path("/memory/reserved-memory",
172− fdt_scan_reserved_mem, NULL);
173−}
drivers/of/platform.c+0−4
@@ -21,7 +21,6 @@ · 20 unmodified lines
2121 #include <linux/of_device.h>
2222 #include <linux/of_irq.h>
2323 #include <linux/of_platform.h>
24−#include <linux/of_reserved_mem.h>
2524 #include <linux/platform_device.h>
2625
2726 const struct of_device_id of_default_bus_match_table[] = {
@@ -219,8 +218,6 @@ static struct platform_device *of_platform_device_create_pdata( · 191 unmodified lines
219218 dev->dev.bus = &platform_bus_type;
220219 dev->dev.platform_data = platform_data;
221220
222− of_reserved_mem_device_init(&dev->dev);
223−
224221 /* We do not fill the DMA ops for platform devices by default.
225222 * This is currently the responsibility of the platform code
226223 * to do such, possibly using a device notifier
@@ -228,7 +225,6 @@ static struct platform_device *of_platform_device_create_pdata( · 1 unmodified line
228225
229226 if (of_device_add(dev) != 0) {
230227 platform_device_put(dev);
231− of_reserved_mem_device_release(&dev->dev);
232228 return NULL;
233229 }
234230
include/linux/of_reserved_mem.h+0−14
@@ -1,14 +0,0 @@
1−#ifndef __OF_RESERVED_MEM_H
2−#define __OF_RESERVED_MEM_H
3−
4−#ifdef CONFIG_OF_RESERVED_MEM
5−void of_reserved_mem_device_init(struct device *dev);
6−void of_reserved_mem_device_release(struct device *dev);
7−void early_init_dt_scan_reserved_mem(void);
8−#else
9−static inline void of_reserved_mem_device_init(struct device *dev) { }
10−static inline void of_reserved_mem_device_release(struct device *dev) { }
11−static inline void early_init_dt_scan_reserved_mem(void) { }
12−#endif
13−
14−#endif /* __OF_RESERVED_MEM_H */