*参照元 [#if9a466b] #backlinks *説明 [#g0f618d3] -パス: [[linux-4.4.1/drivers/base/dma-contiguous.c]] -FIXME: これは何? --説明 **引数 [#u39d0b9c] -struct reserved_mem *rmem -- --[[linux-4.4.1/reserved_mem]] **返り値 [#v1bbe5d7] -int -- **参考 [#v9fe5625] *実装 [#ddb5468e] static int __init rmem_cma_setup(struct reserved_mem *rmem) { phys_addr_t align = PAGE_SIZE << max(MAX_ORDER - 1, pageblock_order); phys_addr_t mask = align - 1; unsigned long node = rmem->fdt_node; struct cma *cma; int err; - --[[linux-4.4.1/phys_addr_t]] --[[linux-4.4.1/PAGE_SIZE]] --[[linux-4.4.1/max()]] --[[linux-4.4.1/MAX_ORDER]] --[[linux-4.4.1/pageblock_order(global)]] --[[linux-4.4.1/cma]] if (!of_get_flat_dt_prop(node, "reusable", NULL) || of_get_flat_dt_prop(node, "no-map", NULL)) return -EINVAL; -必ず reusable プロパティを持っている必要がある。 -また no-map プロパティを持っていてはならない。 --[[linux-4.4.1/of_get_flat_dt_prop()]] if ((rmem->base & mask) || (rmem->size & mask)) { pr_err("Reserved memory: incorrect alignment of CMA region\n"); return -EINVAL; } - --[[linux-4.4.1/pr_err()]] err = cma_init_reserved_mem(rmem->base, rmem->size, 0, &cma); if (err) { pr_err("Reserved memory: unable to setup CMA region\n"); return err; } /* Architecture specific contiguous memory fixup. */ dma_contiguous_early_fixup(rmem->base, rmem->size); - --[[linux-4.4.1/cma_init_reserved_mem()]] --[[linux-4.4.1/dma_contiguous_early_fixup()]] if (of_get_flat_dt_prop(node, "linux,cma-default", NULL)) dma_contiguous_set_default(cma); - --[[linux-4.4.1/dma_contiguous_set_default()]] rmem->ops = &rmem_cma_ops; rmem->priv = cma; - --[[linux-4.4.1/rmem_cma_ops(global)]] pr_info("Reserved memory: created CMA memory pool at %pa, size %ld MiB\n", &rmem->base, (unsigned long)rmem->size / SZ_1M); - --[[linux-4.4.1/pr_info()]] --[[linux-4.4.1/SZ_1M]] return 0; } RESERVEDMEM_OF_DECLARE(cma, "shared-dma-pool", rmem_cma_setup); - -デバイスツリーの compatible プロパティが compatible = "shared-dma-pool" の値であるノードに対応する。 --[[linux-4.4.1/RESERVEDMEM_OF_DECLARE()]] --[[linux-4.4.1/__of_table_cma(global)]] *コメント [#r843592f]