diff --git a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts index 83a8431d9e5fd3..996112381eefbc 100644 --- a/arch/arm/boot/dts/bcm2711-rpi-4-b.dts +++ b/arch/arm/boot/dts/bcm2711-rpi-4-b.dts @@ -195,7 +195,7 @@ / { chosen { - bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M"; + bootargs = "coherent_pool=1M 8250.nr_uarts=1"; }; aliases { @@ -215,10 +215,6 @@ }; /delete-node/ wifi-pwrseq; - - reserved-memory { - /delete-node/ linux,cma; - }; }; &mmcnr { diff --git a/arch/arm/boot/dts/bcm2711.dtsi b/arch/arm/boot/dts/bcm2711.dtsi index 3ecff12736adc9..72cbd23c9796de 100644 --- a/arch/arm/boot/dts/bcm2711.dtsi +++ b/arch/arm/boot/dts/bcm2711.dtsi @@ -12,25 +12,6 @@ interrupt-parent = <&gicv2>; - reserved-memory { - #address-cells = <2>; - #size-cells = <1>; - ranges; - - /* - * arm64 reserves the CMA by default somewhere in ZONE_DMA32, - * that's not good enough for the BCM2711 as some devices can - * only address the lower 1G of memory (ZONE_DMA). - */ - linux,cma { - compatible = "shared-dma-pool"; - size = <0x2000000>; /* 32MB */ - alloc-ranges = <0x0 0x00000000 0x40000000>; - reusable; - linux,cma-default; - }; - }; - vc4: gpu { compatible = "brcm,bcm2711-vc5"; status = "disabled"; @@ -992,6 +973,19 @@ }; }; +&rmem { + #address-cells = <2>; +}; + +&cma { + /* + * arm64 reserves the CMA by default somewhere in ZONE_DMA32, + * that's not good enough for the BCM2711 as some devices can + * only address the lower 1G of memory (ZONE_DMA). + */ + alloc-ranges = <0x0 0x00000000 0x40000000>; +}; + &i2c0 { compatible = "brcm,bcm2711-i2c", "brcm,bcm2835-i2c"; interrupts = ; diff --git a/arch/arm/boot/dts/bcm283x.dtsi b/arch/arm/boot/dts/bcm283x.dtsi index 839491628e87b3..6128baed83c244 100644 --- a/arch/arm/boot/dts/bcm283x.dtsi +++ b/arch/arm/boot/dts/bcm283x.dtsi @@ -30,6 +30,19 @@ stdout-path = "serial0:115200n8"; }; + rmem: reserved-memory { + #address-cells = <1>; + #size-cells = <1>; + ranges; + + cma: linux,cma { + compatible = "shared-dma-pool"; + size = <0x4000000>; /* 64MB */ + reusable; + linux,cma-default; + }; + }; + thermal-zones { cpu_thermal: cpu-thermal { polling-delay-passive = <0>; diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile index 3f60596cdbeb2c..96f96c98561e5c 100644 --- a/arch/arm/boot/dts/overlays/Makefile +++ b/arch/arm/boot/dts/overlays/Makefile @@ -28,6 +28,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ audiosense-pi.dtbo \ audremap.dtbo \ balena-fin.dtbo \ + cma.dtbo \ dht11.dtbo \ dionaudio-loco.dtbo \ dionaudio-loco-v2.dtbo \ diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README index 38459f67ddcf7d..1df13b1fbc513c 100644 --- a/arch/arm/boot/dts/overlays/README +++ b/arch/arm/boot/dts/overlays/README @@ -554,6 +554,19 @@ Info: This overlay is now deprecated - see i2c-sensor Load: +Name: cma +Info: Set custom CMA sizes, only use if you know what you are doing, might + clash with other overlays like vc4-fkms-v3d and vc4-kms-v3d. +Load: dtoverlay=cma,= +Params: cma-256 CMA is 256MB (needs 1GB) + cma-192 CMA is 192MB (needs 1GB) + cma-128 CMA is 128MB + cma-96 CMA is 96MB + cma-64 CMA is 64MB + cma-size CMA size in bytes, 4MB aligned + cma-default Use upstream's default value + + Name: dht11 Info: Overlay for the DHT11/DHT21/DHT22 humidity/temperature sensors Also sometimes found with the part number(s) AM230x. @@ -2675,6 +2688,8 @@ Params: cma-256 CMA is 256MB (needs 1GB) cma-128 CMA is 128MB cma-96 CMA is 96MB cma-64 CMA is 64MB + cma-size CMA size in bytes, 4MB aligned + cma-default Use upstream's default value Name: vc4-kms-kippah-7inch @@ -2692,6 +2707,8 @@ Params: cma-256 CMA is 256MB (needs 1GB) cma-128 CMA is 128MB cma-96 CMA is 96MB cma-64 CMA is 64MB + cma-size CMA size in bytes, 4MB aligned + cma-default Use upstream's default value audio Enable or disable audio over HDMI (default "on") @@ -2703,6 +2720,8 @@ Params: cma-256 CMA is 256MB cma-128 CMA is 128MB cma-96 CMA is 96MB cma-64 CMA is 64MB + cma-size CMA size in bytes, 4MB aligned + cma-default Use upstream's default value audio Enable or disable audio over HDMI0 (default "on") audio1 Enable or disable audio over HDMI1 (default diff --git a/arch/arm/boot/dts/overlays/cma-overlay.dts b/arch/arm/boot/dts/overlays/cma-overlay.dts new file mode 100644 index 00000000000000..4fbdf161672e3d --- /dev/null +++ b/arch/arm/boot/dts/overlays/cma-overlay.dts @@ -0,0 +1,32 @@ +/* + * cma.dts + */ + +/dts-v1/; +/plugin/; + +/ { + compatible = "brcm,bcm2835"; + + fragment@0 { + target = <&cma>; + frag0: __overlay__ { + /* + * The default size when using this overlay is 256 MB + * and should be kept as is for backwards + * compatibility. + */ + size = <0x10000000>; + }; + }; + + __overrides__ { + cma-256 = <&frag0>,"size:0=",<0x10000000>; + cma-192 = <&frag0>,"size:0=",<0xC000000>; + cma-128 = <&frag0>,"size:0=",<0x8000000>; + cma-96 = <&frag0>,"size:0=",<0x6000000>; + cma-64 = <&frag0>,"size:0=",<0x4000000>; + cma-size = <&frag0>,"size:0"; /* in bytes, 4MB aligned */ + cma-default = <0>,"-0"; + }; +}; diff --git a/arch/arm/boot/dts/overlays/upstream-overlay.dts b/arch/arm/boot/dts/overlays/upstream-overlay.dts index 96837d962188cb..4d46790d81c9cb 100644 --- a/arch/arm/boot/dts/overlays/upstream-overlay.dts +++ b/arch/arm/boot/dts/overlays/upstream-overlay.dts @@ -1,4 +1,4 @@ -// redo: ovmerge -c vc4-kms-v3d-overlay.dts,cma-96 dwc2-overlay.dts,dr_mode=otg +// redo: ovmerge -c vc4-kms-v3d-overlay.dts,cma-default dwc2-overlay.dts,dr_mode=otg /dts-v1/; /plugin/; @@ -8,114 +8,90 @@ / { compatible = "brcm,bcm2835"; fragment@0 { - target-path = "/chosen"; + target = <&cma>; __dormant__ { - bootargs = "cma=256M"; + size = <0x10000000>; }; }; fragment@1 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=192M"; - }; - }; - fragment@2 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=128M"; - }; - }; - fragment@3 { - target-path = "/chosen"; - __overlay__ { - bootargs = "cma=96M"; - }; - }; - fragment@4 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=64M"; - }; - }; - fragment@5 { target = <&i2c2>; __overlay__ { status = "okay"; }; }; - fragment@6 { + fragment@2 { target = <&fb>; __overlay__ { status = "disabled"; }; }; - fragment@7 { + fragment@3 { target = <&pixelvalve0>; __overlay__ { status = "okay"; }; }; - fragment@8 { + fragment@4 { target = <&pixelvalve1>; __overlay__ { status = "okay"; }; }; - fragment@9 { + fragment@5 { target = <&pixelvalve2>; __overlay__ { status = "okay"; }; }; - fragment@10 { + fragment@6 { target = <&hvs>; __overlay__ { status = "okay"; }; }; - fragment@11 { + fragment@7 { target = <&hdmi>; __overlay__ { status = "okay"; }; }; - fragment@12 { + fragment@8 { target = <&v3d>; __overlay__ { status = "okay"; }; }; - fragment@13 { + fragment@9 { target = <&vc4>; __overlay__ { status = "okay"; }; }; - fragment@14 { + fragment@10 { target = <&clocks>; __overlay__ { claim-clocks = ; }; }; - fragment@15 { + fragment@11 { target = <&vec>; __overlay__ { status = "okay"; }; }; - fragment@16 { + fragment@12 { target = <&txp>; __overlay__ { status = "okay"; }; }; - fragment@17 { + fragment@13 { target = <&hdmi>; __dormant__ { dmas; }; }; - fragment@18 { + fragment@14 { target = <&usb>; #address-cells = <1>; #size-cells = <1>; diff --git a/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts b/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts index 2db343ef2237f6..428aa5dcc38f04 100644 --- a/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts +++ b/arch/arm/boot/dts/overlays/upstream-pi4-overlay.dts @@ -8,144 +8,120 @@ / { compatible = "brcm,bcm2835"; fragment@0 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=256M"; - }; - }; - fragment@1 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=192M"; - }; - }; - fragment@2 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=128M"; - }; - }; - fragment@3 { - target-path = "/chosen"; + target = <&cma>; __overlay__ { - bootargs = "cma=96M"; + size = <100663296>; }; }; - fragment@4 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=64M"; - }; - }; - fragment@5 { + fragment@1 { target = <&ddc0>; __overlay__ { status = "okay"; }; }; - fragment@6 { + fragment@2 { target = <&ddc1>; __overlay__ { status = "okay"; }; }; - fragment@7 { + fragment@3 { target = <&hdmi0>; __overlay__ { status = "okay"; }; }; - fragment@8 { + fragment@4 { target = <&hdmi1>; __overlay__ { status = "okay"; }; }; - fragment@9 { + fragment@5 { target = <&hvs>; __overlay__ { status = "okay"; }; }; - fragment@10 { + fragment@6 { target = <&pixelvalve0>; __overlay__ { status = "okay"; }; }; - fragment@11 { + fragment@7 { target = <&pixelvalve1>; __overlay__ { status = "okay"; }; }; - fragment@12 { + fragment@8 { target = <&pixelvalve2>; __overlay__ { status = "okay"; }; }; - fragment@13 { + fragment@9 { target = <&pixelvalve3>; __overlay__ { status = "okay"; }; }; - fragment@14 { + fragment@10 { target = <&pixelvalve4>; __overlay__ { status = "okay"; }; }; - fragment@15 { + fragment@11 { target = <&v3d>; __overlay__ { status = "okay"; }; }; - fragment@16 { + fragment@12 { target = <&vc4>; __overlay__ { status = "okay"; }; }; - fragment@17 { + fragment@13 { target = <&txp>; __overlay__ { status = "okay"; }; }; - fragment@18 { + fragment@14 { target = <&fb>; __overlay__ { status = "disabled"; }; }; - fragment@19 { + fragment@15 { target = <&firmwarekms>; __overlay__ { status = "disabled"; }; }; - fragment@20 { + fragment@16 { target = <&vec>; __overlay__ { status = "disabled"; }; }; - fragment@21 { + fragment@17 { target = <&hdmi0>; __dormant__ { dmas; }; }; - fragment@22 { + fragment@18 { target = <&hdmi1>; __dormant__ { dmas; }; }; - fragment@23 { + fragment@19 { target = <&usb>; #address-cells = <1>; #size-cells = <1>; diff --git a/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts b/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts index d9af97c8414f03..ca344492bed861 100644 --- a/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts +++ b/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts @@ -5,77 +5,36 @@ /dts-v1/; /plugin/; +#include "cma-overlay.dts" + / { compatible = "brcm,bcm2835"; - fragment@0 { - target-path = "/chosen"; - __overlay__ { - bootargs = "cma=256M"; - }; - }; - fragment@1 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=192M"; - }; - }; - - fragment@2 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=128M"; - }; - }; - - fragment@3 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=96M"; - }; - }; - - fragment@4 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=64M"; - }; - }; - - fragment@5 { target = <&fb>; __overlay__ { status = "disabled"; }; }; - fragment@6 { + fragment@2 { target = <&firmwarekms>; __overlay__ { status = "okay"; }; }; - fragment@7 { + fragment@3 { target = <&v3d>; __overlay__ { status = "okay"; }; }; - fragment@8 { + fragment@4 { target = <&vc4>; __overlay__ { status = "okay"; }; }; - - __overrides__ { - cma-256 = <0>,"+0-1-2-3-4"; - cma-192 = <0>,"-0+1-2-3-4"; - cma-128 = <0>,"-0-1+2-3-4"; - cma-96 = <0>,"-0-1-2+3-4"; - cma-64 = <0>,"-0-1-2-3+4"; - }; }; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts index c5f687e8bcb9a8..b40aa1d8f432b3 100644 --- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts +++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts @@ -7,108 +7,75 @@ #include +#include "cma-overlay.dts" + / { compatible = "brcm,bcm2835"; - fragment@0 { - target-path = "/chosen"; - __overlay__ { - bootargs = "cma=256M"; - }; - }; - fragment@1 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=192M"; - }; - }; - - fragment@2 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=128M"; - }; - }; - - fragment@3 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=96M"; - }; - }; - - fragment@4 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=64M"; - }; - }; - - fragment@5 { target = <&i2c2>; __overlay__ { status = "okay"; }; }; - fragment@6 { + fragment@2 { target = <&fb>; __overlay__ { status = "disabled"; }; }; - fragment@7 { + fragment@3 { target = <&pixelvalve0>; __overlay__ { status = "okay"; }; }; - fragment@8 { + fragment@4 { target = <&pixelvalve1>; __overlay__ { status = "okay"; }; }; - fragment@9 { + fragment@5 { target = <&pixelvalve2>; __overlay__ { status = "okay"; }; }; - fragment@10 { + fragment@6 { target = <&hvs>; __overlay__ { status = "okay"; }; }; - fragment@11 { + fragment@7 { target = <&hdmi>; __overlay__ { status = "okay"; }; }; - fragment@12 { + fragment@8 { target = <&v3d>; __overlay__ { status = "okay"; }; }; - fragment@13 { + fragment@9 { target = <&vc4>; __overlay__ { status = "okay"; }; }; - fragment@14 { + fragment@10 { target = <&clocks>; __overlay__ { claim-clocks = < @@ -120,21 +87,21 @@ }; }; - fragment@15 { + fragment@11 { target = <&vec>; __overlay__ { status = "okay"; }; }; - fragment@16 { + fragment@12 { target = <&txp>; __overlay__ { status = "okay"; }; }; - fragment@17 { + fragment@13 { target = <&hdmi>; __dormant__ { dmas; @@ -142,11 +109,6 @@ }; __overrides__ { - cma-256 = <0>,"+0-1-2-3-4"; - cma-192 = <0>,"-0+1-2-3-4"; - cma-128 = <0>,"-0-1+2-3-4"; - cma-96 = <0>,"-0-1-2+3-4"; - cma-64 = <0>,"-0-1-2-3+4"; audio = <0>,"!17"; }; }; diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts index 7d59a30a3662a4..134ad9ecbd4ab8 100644 --- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts +++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-pi4-overlay.dts @@ -7,164 +7,131 @@ #include +#include "cma-overlay.dts" + / { compatible = "brcm,bcm2835"; - fragment@0 { - target-path = "/chosen"; - __overlay__ { - bootargs = "cma=256M"; - }; - }; - fragment@1 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=192M"; - }; - }; - - fragment@2 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=128M"; - }; - }; - - fragment@3 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=96M"; - }; - }; - - fragment@4 { - target-path = "/chosen"; - __dormant__ { - bootargs = "cma=64M"; - }; - }; - - fragment@5 { target = <&ddc0>; __overlay__ { status = "okay"; }; }; - fragment@6 { + fragment@2 { target = <&ddc1>; __overlay__ { status = "okay"; }; }; - fragment@7 { + fragment@3 { target = <&hdmi0>; __overlay__ { status = "okay"; }; }; - fragment@8 { + fragment@4 { target = <&hdmi1>; __overlay__ { status = "okay"; }; }; - fragment@9 { + fragment@5 { target = <&hvs>; __overlay__ { status = "okay"; }; }; - fragment@10 { + fragment@6 { target = <&pixelvalve0>; __overlay__ { status = "okay"; }; }; - fragment@11 { + fragment@7 { target = <&pixelvalve1>; __overlay__ { status = "okay"; }; }; - fragment@12 { + fragment@8 { target = <&pixelvalve2>; __overlay__ { status = "okay"; }; }; - fragment@13 { + fragment@9 { target = <&pixelvalve3>; __overlay__ { status = "okay"; }; }; - fragment@14 { + fragment@10 { target = <&pixelvalve4>; __overlay__ { status = "okay"; }; }; - fragment@15 { + fragment@11 { target = <&v3d>; __overlay__ { status = "okay"; }; }; - fragment@16 { + fragment@12 { target = <&vc4>; __overlay__ { status = "okay"; }; }; - fragment@17 { + fragment@13 { target = <&txp>; __overlay__ { status = "okay"; }; }; - fragment@18 { + fragment@14 { target = <&fb>; __overlay__ { status = "disabled"; }; }; - fragment@19 { + fragment@15 { target = <&firmwarekms>; __overlay__ { status = "disabled"; }; }; - fragment@20 { + fragment@16 { target = <&vec>; __overlay__ { status = "disabled"; }; }; - fragment@21 { + fragment@17 { target = <&hdmi0>; __dormant__ { dmas; }; }; - fragment@22 { + fragment@18 { target = <&hdmi1>; __dormant__ { dmas; @@ -172,12 +139,7 @@ }; __overrides__ { - cma-256 = <0>,"+0-1-2-3-4"; - cma-192 = <0>,"-0+1-2-3-4"; - cma-128 = <0>,"-0-1+2-3-4"; - cma-96 = <0>,"-0-1-2+3-4"; - cma-64 = <0>,"-0-1-2-3+4"; - audio = <0>,"!21"; - audio1 = <0>,"!22"; + audio = <0>,"!17"; + audio1 = <0>,"!18"; }; }; diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index ddd6a6ce158e1e..9af647dafa5135 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c @@ -91,7 +91,7 @@ static void __init reserve_crashkernel(void) if (crash_base == 0) { /* Current arm64 boot protocol requires 2MB alignment */ - crash_base = memblock_find_in_range(0, ARCH_LOW_ADDRESS_LIMIT, + crash_base = memblock_find_in_range(0, arm64_dma32_phys_limit, crash_size, SZ_2M); if (crash_base == 0) { pr_warn("cannot allocate crashkernel (size:0x%llx)\n", @@ -214,15 +214,14 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) { struct memblock_region *reg; unsigned long zone_size[MAX_NR_ZONES], zhole_size[MAX_NR_ZONES]; - unsigned long max_dma32 = min; - unsigned long max_dma = min; + unsigned long __maybe_unused max_dma, max_dma32; memset(zone_size, 0, sizeof(zone_size)); + max_dma = max_dma32 = min; #ifdef CONFIG_ZONE_DMA - max_dma = PFN_DOWN(arm64_dma_phys_limit); + max_dma = max_dma32 = PFN_DOWN(arm64_dma_phys_limit); zone_size[ZONE_DMA] = max_dma - min; - max_dma32 = max_dma; #endif #ifdef CONFIG_ZONE_DMA32 max_dma32 = PFN_DOWN(arm64_dma32_phys_limit); @@ -236,25 +235,23 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) unsigned long start = memblock_region_memory_base_pfn(reg); unsigned long end = memblock_region_memory_end_pfn(reg); - if (start >= max) - continue; #ifdef CONFIG_ZONE_DMA - if (start < max_dma) { - unsigned long dma_end = min_not_zero(end, max_dma); + if (start >= min && start < max_dma) { + unsigned long dma_end = min(end, max_dma); zhole_size[ZONE_DMA] -= dma_end - start; + start = dma_end; } #endif #ifdef CONFIG_ZONE_DMA32 - if (start < max_dma32) { + if (start >= max_dma && start < max_dma32) { unsigned long dma32_end = min(end, max_dma32); - unsigned long dma32_start = max(start, max_dma); - zhole_size[ZONE_DMA32] -= dma32_end - dma32_start; + zhole_size[ZONE_DMA32] -= dma32_end - start; + start = dma32_end; } #endif - if (end > max_dma32) { + if (start >= max_dma32 && start < max) { unsigned long normal_end = min(end, max); - unsigned long normal_start = max(start, max_dma32); - zhole_size[ZONE_NORMAL] -= normal_end - normal_start; + zhole_size[ZONE_NORMAL] -= normal_end - start; } } @@ -459,7 +456,7 @@ void __init arm64_memblock_init(void) high_memory = __va(memblock_end_of_DRAM() - 1) + 1; - dma_contiguous_reserve(arm64_dma_phys_limit ? : arm64_dma32_phys_limit); + dma_contiguous_reserve(arm64_dma32_phys_limit); } void __init bootmem_init(void) diff --git a/kernel/dma/contiguous.c b/kernel/dma/contiguous.c index 69cfb4345388c3..8477bf549dc918 100644 --- a/kernel/dma/contiguous.c +++ b/kernel/dma/contiguous.c @@ -301,9 +301,16 @@ 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; + bool default_cma = of_get_flat_dt_prop(node, "linux,cma-default", NULL); struct cma *cma; int err; + if (size_cmdline != -1 && default_cma) { + pr_info("Reserved memory: bypass %s node, using cmdline CMA params instead\n", + rmem->name); + return -EBUSY; + } + if (!of_get_flat_dt_prop(node, "reusable", NULL) || of_get_flat_dt_prop(node, "no-map", NULL)) return -EINVAL; @@ -321,7 +328,7 @@ static int __init rmem_cma_setup(struct reserved_mem *rmem) /* Architecture specific contiguous memory fixup. */ dma_contiguous_early_fixup(rmem->base, rmem->size); - if (of_get_flat_dt_prop(node, "linux,cma-default", NULL)) + if (default_cma) dma_contiguous_set_default(cma); rmem->ops = &rmem_cma_ops;