From 87ce5e0eb6dbb63e6418d9ba16f36de4b55cc627 Mon Sep 17 00:00:00 2001 From: N_vectorspace Date: Fri, 16 Feb 2024 18:01:14 +0800 Subject: [PATCH 1/2] Modify phytium display drm carveout mem initialization to occupy reserved memory to avoid potential memory conflicts. --- .../boot/dts/phytium/e2000q-miniitx-board.dts | 15 ++++++++++- drivers/gpu/drm/phytium/phytium_platform.c | 26 +++++++++++++------ 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts b/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts index 6829a30793..793f216c99 100644 --- a/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts +++ b/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts @@ -14,7 +14,7 @@ /dts-v1/; /memreserve/ 0x80000000 0x10000; -/memreserve/ 0xf4000000 0x4000000; + #include "pe2204.dtsi" @@ -38,6 +38,19 @@ memory@00{ reg = <0x0 0x80000000 0x2 0x00000000>; }; + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + phytium_display_reserved: share@0xf4000000 { + compatible = "phytium-display-carveout-mem"; + device_type = "display"; + reg = <0x00 0xf4000000 0x0 0x4000000>; + status = "okay"; + }; + }; + sound_card: sound { compatible = "simple-audio-card"; simple-audio-card,format = "i2s"; diff --git a/drivers/gpu/drm/phytium/phytium_platform.c b/drivers/gpu/drm/phytium/phytium_platform.c index 27815ecc9c..faffa7f500 100644 --- a/drivers/gpu/drm/phytium/phytium_platform.c +++ b/drivers/gpu/drm/phytium/phytium_platform.c @@ -19,14 +19,23 @@ int phytium_platform_carveout_mem_init(struct platform_device *pdev, struct phytium_display_private *priv) { - struct resource *res; - int ret = 0; - - res = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (res) { - priv->pool_size = resource_size(res); - priv->pool_phys_addr = res->start; - } + struct resource *res; + struct resource *mem_region; + int ret = 0; + + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + if (res) { + mem_region = request_mem_region(res->start, resource_size(res), "phytium-display"); + if (!mem_region) { + DRM_WARN("Failed to request reserved memory\n"); + priv->pool_size = resource_size(res); + priv->pool_phys_addr = res->start; + } + else { + priv->pool_size = resource_size(mem_region); + priv->pool_phys_addr = mem_region->start; + } + } if ((priv->pool_phys_addr != 0) && (priv->pool_size != 0)) { priv->pool_virt_addr = ioremap_cache(priv->pool_phys_addr, priv->pool_size); @@ -54,6 +63,7 @@ int phytium_platform_carveout_mem_init(struct platform_device *pdev, failed_init_memory_pool: iounmap(priv->pool_virt_addr); failed_ioremap: + release_mem_region(mem_region->start, resource_size(mem_region)); return ret; } -- Gitee From 5c966bfc0179ac936555f15126ce05079b22ddcb Mon Sep 17 00:00:00 2001 From: N_vectorspace Date: Wed, 21 Feb 2024 21:10:25 +0800 Subject: [PATCH 2/2] Update phytium drm driver. --- .../boot/dts/phytium/e2000q-miniitx-board.dts | 4 +- drivers/gpu/drm/phytium/phytium_platform.c | 48 +++++++++++++------ 2 files changed, 35 insertions(+), 17 deletions(-) diff --git a/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts b/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts index 793f216c99..d4ff241f61 100644 --- a/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts +++ b/arch/arm64/boot/dts/phytium/e2000q-miniitx-board.dts @@ -232,8 +232,8 @@ &macb2 { }; &dc0 { - reg = <0x0 0x32000000 0x0 0x8000>, - <0x0 0xf4000000 0x0 0x4000000>; // (optional) + reg = <0x0 0x32000000 0x0 0x8000>; + dc-memory-region = <&phytium_display_reserved>; pipe_mask = [03]; edp_mask = [00]; status = "okay"; diff --git a/drivers/gpu/drm/phytium/phytium_platform.c b/drivers/gpu/drm/phytium/phytium_platform.c index faffa7f500..6efddfa4bf 100644 --- a/drivers/gpu/drm/phytium/phytium_platform.c +++ b/drivers/gpu/drm/phytium/phytium_platform.c @@ -6,6 +6,7 @@ */ #include +#include #include #include #include @@ -19,24 +20,39 @@ int phytium_platform_carveout_mem_init(struct platform_device *pdev, struct phytium_display_private *priv) { - struct resource *res; - struct resource *mem_region; + struct device_node *np; + struct resource res, *mem_region; int ret = 0; - res = platform_get_resource(pdev, IORESOURCE_MEM, 1); - if (res) { - mem_region = request_mem_region(res->start, resource_size(res), "phytium-display"); - if (!mem_region) { - DRM_WARN("Failed to request reserved memory\n"); - priv->pool_size = resource_size(res); - priv->pool_phys_addr = res->start; - } - else { - priv->pool_size = resource_size(mem_region); - priv->pool_phys_addr = mem_region->start; - } + if (!pdev->dev.of_node) { + DRM_ERROR("This driver must be probed from devicetree!\n"); + return -EINVAL; } + np = of_parse_phandle(pdev->dev.of_node, "dc-memory-region", 0); + if(!np) { + DRM_ERROR("No %s specified\n", "dc-memory-region"); + return -EINVAL; + } + + ret = of_address_to_resource(np, 0, &res); + if(ret) { + DRM_ERROR("No memory address assigned to the region\n"); + return ret; + } + + mem_region = request_mem_region(res.start, resource_size(&res), "phytium-display"); + if (!mem_region) { + DRM_WARN("Failed to request reserved memory\n"); + priv->pool_size = resource_size(&res); + priv->pool_phys_addr = res.start; + } + else { + priv->pool_size = resource_size(mem_region); + priv->pool_phys_addr = mem_region->start; + } + + if ((priv->pool_phys_addr != 0) && (priv->pool_size != 0)) { priv->pool_virt_addr = ioremap_cache(priv->pool_phys_addr, priv->pool_size); if (priv->pool_virt_addr == NULL) { @@ -63,7 +79,9 @@ int phytium_platform_carveout_mem_init(struct platform_device *pdev, failed_init_memory_pool: iounmap(priv->pool_virt_addr); failed_ioremap: - release_mem_region(mem_region->start, resource_size(mem_region)); + if (mem_region) + release_mem_region(mem_region->start, resource_size(mem_region)); + return ret; } -- Gitee