Re: [PATCH 2/3] drm/armada: add OF reserved memory support

2018-12-19 Thread Lubomir Rintel
On Tue, 2018-07-10 at 11:24 +0100, Russell King wrote:
> Existing Armada DRM makes use of reserved memory for allocating
> contiguous screen buffers, which currently prevents its use with
> DT systems.  Add support for this for DT systems.
> 
> Signed-off-by: Russell King 
> ---
>  drivers/gpu/drm/armada/Makefile  |  3 +++
>  drivers/gpu/drm/armada/armada_drv.c  | 24 --
>  drivers/gpu/drm/armada/armada_rmem.c | 49
> 
>  3 files changed, 74 insertions(+), 2 deletions(-)
>  create mode 100644 drivers/gpu/drm/armada/armada_rmem.c
> 
> diff --git a/drivers/gpu/drm/armada/Makefile
> b/drivers/gpu/drm/armada/Makefile
> index ecf25cf9f9f5..0b8bf3b8aa6a 100644
> --- a/drivers/gpu/drm/armada/Makefile
> +++ b/drivers/gpu/drm/armada/Makefile
> @@ -5,3 +5,6 @@ armada-y  += armada_510.o
>  armada-$(CONFIG_DEBUG_FS) += armada_debugfs.o
>  
>  obj-$(CONFIG_DRM_ARMADA) := armada.o
> +
> +armada-rmem-$(CONFIG_DRM_ARMADA) += armada_rmem.o
> +obj-y += $(armada-rmem-y) $(armada-rmem-m)
> diff --git a/drivers/gpu/drm/armada/armada_drv.c
> b/drivers/gpu/drm/armada/armada_drv.c
> index 217f0590fd61..a9ee492a2810 100644
> --- a/drivers/gpu/drm/armada/armada_drv.c
> +++ b/drivers/gpu/drm/armada/armada_drv.c
> @@ -9,6 +9,7 @@
>  #include 
>  #include 
>  #include 
> +#include 
>  #include 
>  #include 
>  #include 
> @@ -96,6 +97,9 @@ static int armada_drm_bind(struct device *dev)
>   return -EINVAL;
>   }
>  
> + if (!mem && dev->of_node)
> + mem = dev->platform_data;
> +
>   if (!mem)
>   return -ENXIO;
>  
> @@ -250,9 +254,17 @@ static int armada_drm_probe(struct
> platform_device *pdev)
>   struct device *dev = &pdev->dev;
>   int ret;
>  
> - ret = drm_of_component_probe(dev, compare_dev_name,
> &armada_master_ops);
> - if (ret != -EINVAL)
> + if (dev->of_node) {
> + ret = of_reserved_mem_device_init(dev);
> + if (ret && ret != -ENODEV)
> + return ret;
> +
> + ret = drm_of_component_probe(dev, compare_of,
> +  &armada_master_ops);
> + if (ret)
> + of_reserved_mem_device_release(dev);
>   return ret;
> + }
>  
>   if (dev->platform_data) {
>   char **devices = dev->platform_data;
> @@ -287,6 +299,7 @@ static int armada_drm_probe(struct
> platform_device *pdev)
>  static int armada_drm_remove(struct platform_device *pdev)
>  {
>   component_master_del(&pdev->dev, &armada_master_ops);
> + of_reserved_mem_device_release(&pdev->dev);
>   return 0;
>  }
>  
> @@ -300,11 +313,18 @@ static const struct platform_device_id
> armada_drm_platform_ids[] = {
>  };
>  MODULE_DEVICE_TABLE(platform, armada_drm_platform_ids);
>  
> +static const struct of_device_id armada_drm_dt_ids[] = {
> + { .compatible = "marvell,dove-display-subsystem", },
> + { /* sentinel */ },
> +};
> +MODULE_DEVICE_TABLE(of, armada_drm_dt_ids);
> +
>  static struct platform_driver armada_drm_platform_driver = {
>   .probe  = armada_drm_probe,
>   .remove = armada_drm_remove,
>   .driver = {
>   .name   = "armada-drm",
> + .of_match_table = armada_drm_dt_ids,
>   },
>   .id_table = armada_drm_platform_ids,
>  };
> diff --git a/drivers/gpu/drm/armada/armada_rmem.c
> b/drivers/gpu/drm/armada/armada_rmem.c
> new file mode 100644
> index ..36bb20e426b6
> --- /dev/null
> +++ b/drivers/gpu/drm/armada/armada_rmem.c
> @@ -0,0 +1,49 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// Copyright (C) 2017 Russell King
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +static int armada_rmem_dev_init(struct reserved_mem *rmem, struct
> device *dev)
> +{
> + struct resource *r;
> +
> + if (dev->platform_data)
> + return -EBUSY;
> +
> + r = kzalloc(sizeof(*r), GFP_KERNEL);
> + if (!r)
> + return -ENOMEM;
> +
> + r->start = rmem->base;
> + r->end = rmem->base + rmem->size - 1;
> + r->flags = IORESOURCE_MEM;
> +
> + rmem->priv = r;
> + dev->platform_data = r;
> +
> + return 0;
> +}
> +
> +static void armada_rmem_dev_release(struct reserved_mem *rmem,
> + struct device *dev)
> +{
> + kfree(rmem->priv);
> + rmem->priv = NULL;
> + dev->platform_data = NULL;
> +}
> +
> +static const struct reserved_mem_ops armada_rmem_ops = {
> + .device_init = armada_rmem_dev_init,
> + .device_release = armada_rmem_dev_release,
> +};
> +
> +static int __init armada_rmem_init(struct reserved_mem *rmem)
> +{
> + rmem->ops = &armada_rmem_ops;
> + return 0;
> +}
> +
> +RESERVEDMEM_OF_DECLARE(armada_rmem, "marvell,dove-framebuffer",
> + armada_rmem_init);

Hi,

wouldn't "marvell,armada-framebuffer" make more sense here?
The driver will do just well for MMP2 and perhaps more hardware that is
not Dove; the DTs could just say:

com

[PATCH 2/3] drm/armada: add OF reserved memory support

2018-07-11 Thread Russell King
Existing Armada DRM makes use of reserved memory for allocating
contiguous screen buffers, which currently prevents its use with
DT systems.  Add support for this for DT systems.

Signed-off-by: Russell King 
---
 drivers/gpu/drm/armada/Makefile  |  3 +++
 drivers/gpu/drm/armada/armada_drv.c  | 24 --
 drivers/gpu/drm/armada/armada_rmem.c | 49 
 3 files changed, 74 insertions(+), 2 deletions(-)
 create mode 100644 drivers/gpu/drm/armada/armada_rmem.c

diff --git a/drivers/gpu/drm/armada/Makefile b/drivers/gpu/drm/armada/Makefile
index ecf25cf9f9f5..0b8bf3b8aa6a 100644
--- a/drivers/gpu/drm/armada/Makefile
+++ b/drivers/gpu/drm/armada/Makefile
@@ -5,3 +5,6 @@ armada-y+= armada_510.o
 armada-$(CONFIG_DEBUG_FS) += armada_debugfs.o
 
 obj-$(CONFIG_DRM_ARMADA) := armada.o
+
+armada-rmem-$(CONFIG_DRM_ARMADA) += armada_rmem.o
+obj-y += $(armada-rmem-y) $(armada-rmem-m)
diff --git a/drivers/gpu/drm/armada/armada_drv.c 
b/drivers/gpu/drm/armada/armada_drv.c
index 217f0590fd61..a9ee492a2810 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -9,6 +9,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -96,6 +97,9 @@ static int armada_drm_bind(struct device *dev)
return -EINVAL;
}
 
+   if (!mem && dev->of_node)
+   mem = dev->platform_data;
+
if (!mem)
return -ENXIO;
 
@@ -250,9 +254,17 @@ static int armada_drm_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
int ret;
 
-   ret = drm_of_component_probe(dev, compare_dev_name, &armada_master_ops);
-   if (ret != -EINVAL)
+   if (dev->of_node) {
+   ret = of_reserved_mem_device_init(dev);
+   if (ret && ret != -ENODEV)
+   return ret;
+
+   ret = drm_of_component_probe(dev, compare_of,
+&armada_master_ops);
+   if (ret)
+   of_reserved_mem_device_release(dev);
return ret;
+   }
 
if (dev->platform_data) {
char **devices = dev->platform_data;
@@ -287,6 +299,7 @@ static int armada_drm_probe(struct platform_device *pdev)
 static int armada_drm_remove(struct platform_device *pdev)
 {
component_master_del(&pdev->dev, &armada_master_ops);
+   of_reserved_mem_device_release(&pdev->dev);
return 0;
 }
 
@@ -300,11 +313,18 @@ static const struct platform_device_id 
armada_drm_platform_ids[] = {
 };
 MODULE_DEVICE_TABLE(platform, armada_drm_platform_ids);
 
+static const struct of_device_id armada_drm_dt_ids[] = {
+   { .compatible = "marvell,dove-display-subsystem", },
+   { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, armada_drm_dt_ids);
+
 static struct platform_driver armada_drm_platform_driver = {
.probe  = armada_drm_probe,
.remove = armada_drm_remove,
.driver = {
.name   = "armada-drm",
+   .of_match_table = armada_drm_dt_ids,
},
.id_table = armada_drm_platform_ids,
 };
diff --git a/drivers/gpu/drm/armada/armada_rmem.c 
b/drivers/gpu/drm/armada/armada_rmem.c
new file mode 100644
index ..36bb20e426b6
--- /dev/null
+++ b/drivers/gpu/drm/armada/armada_rmem.c
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0
+// Copyright (C) 2017 Russell King
+#include 
+#include 
+#include 
+#include 
+
+static int armada_rmem_dev_init(struct reserved_mem *rmem, struct device *dev)
+{
+   struct resource *r;
+
+   if (dev->platform_data)
+   return -EBUSY;
+
+   r = kzalloc(sizeof(*r), GFP_KERNEL);
+   if (!r)
+   return -ENOMEM;
+
+   r->start = rmem->base;
+   r->end = rmem->base + rmem->size - 1;
+   r->flags = IORESOURCE_MEM;
+
+   rmem->priv = r;
+   dev->platform_data = r;
+
+   return 0;
+}
+
+static void armada_rmem_dev_release(struct reserved_mem *rmem,
+   struct device *dev)
+{
+   kfree(rmem->priv);
+   rmem->priv = NULL;
+   dev->platform_data = NULL;
+}
+
+static const struct reserved_mem_ops armada_rmem_ops = {
+   .device_init = armada_rmem_dev_init,
+   .device_release = armada_rmem_dev_release,
+};
+
+static int __init armada_rmem_init(struct reserved_mem *rmem)
+{
+   rmem->ops = &armada_rmem_ops;
+   return 0;
+}
+
+RESERVEDMEM_OF_DECLARE(armada_rmem, "marvell,dove-framebuffer",
+   armada_rmem_init);
-- 
2.7.4

___
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel