* [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module
@ 2018-12-21 11:46 james qian wang (Arm Technology China)
0 siblings, 0 replies; 3+ messages in thread
From: james qian wang (Arm Technology China) @ 2018-12-21 11:46 UTC (permalink / raw)
To: Liviu Dudau
Cc: Mark Rutland, linux-doc@vger.kernel.org,
maxime.ripard@bootlin.com, Jonathan Chai (Arm Technology China),
Alexandru-Cosmin Gheorghe, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, yamada.masahiro@socionext.com,
Yiqi Kang (Arm Technology China), mchehab+samsung@kernel.org,
Tiannan Zhu (Arm Technology China), corbet@lwn.net,
airlied@linux.ie, malidp@foss.arm.com,
thomas Sun (Arm Technology China), Ayan Halder, devicetree
Implement a simple wrapper for platform module to build komeda to module,
Also add a very simple D71 layer code to show how to discover a product.
Komeda driver direct bind the product ENTRY function xxx_identity to DT
compatible name like:
d71_product = {
.product_id = MALIDP_D71_PRODUCT_ID,
.identify = d71_identify,
},
const struct of_device_id komeda_of_match[] = {
{ .compatible = "arm,mali-d71", .data = &d71_product, },
{},
};
Then when linux found a matched DT node and call driver to probe, we can
easily get the of data, and call into the product to do the identify:
komeda_bind()
{
...
product = of_device_get_match_data(dev);
product->identify();
...
}
Changes in v3:
- Fixed style problem found by checkpatch.pl --strict.
Signed-off-by: James (Qian) Wang <james.qian.wang@arm.com>
---
.../gpu/drm/arm/display/include/malidp_io.h | 42 ++++++
drivers/gpu/drm/arm/display/komeda/Makefile | 6 +-
.../gpu/drm/arm/display/komeda/d71/d71_dev.c | 33 +++++
.../gpu/drm/arm/display/komeda/komeda_dev.h | 3 +
.../gpu/drm/arm/display/komeda/komeda_drv.c | 132 ++++++++++++++++++
5 files changed, 215 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/arm/display/include/malidp_io.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_drv.c
diff --git a/drivers/gpu/drm/arm/display/include/malidp_io.h b/drivers/gpu/drm/arm/display/include/malidp_io.h
new file mode 100644
index 000000000000..4fb3caf864ce
--- /dev/null
+++ b/drivers/gpu/drm/arm/display/include/malidp_io.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * Author: James.Qian.Wang <james.qian.wang@arm.com>
+ *
+ */
+#ifndef _MALIDP_IO_H_
+#define _MALIDP_IO_H_
+
+#include <linux/io.h>
+
+static inline u32
+malidp_read32(u32 __iomem *base, u32 offset)
+{
+ return readl((base + (offset >> 2)));
+}
+
+static inline void
+malidp_write32(u32 __iomem *base, u32 offset, u32 v)
+{
+ writel(v, (base + (offset >> 2)));
+}
+
+static inline void
+malidp_write32_mask(u32 __iomem *base, u32 offset, u32 m, u32 v)
+{
+ u32 tmp = malidp_read32(base, offset);
+
+ tmp &= (~m);
+ malidp_write32(base, offset, v | tmp);
+}
+
+static inline void
+malidp_write_group(u32 __iomem *base, u32 offset, int num, const u32 *values)
+{
+ int i;
+
+ for (i = 0; i < num; i++)
+ malidp_write32(base, offset + i * 4, values[i]);
+}
+
+#endif /*_MALIDP_IO_H_*/
diff --git a/drivers/gpu/drm/arm/display/komeda/Makefile b/drivers/gpu/drm/arm/display/komeda/Makefile
index 5b44e36509b1..c03d6876ef75 100644
--- a/drivers/gpu/drm/arm/display/komeda/Makefile
+++ b/drivers/gpu/drm/arm/display/komeda/Makefile
@@ -5,7 +5,11 @@ ccflags-y := \
-I$(src)
komeda-y := \
+ komeda_drv.o \
komeda_dev.o \
- komeda_pipeline.o \
+ komeda_pipeline.o
+
+komeda-y += \
+ d71/d71_dev.o
obj-$(CONFIG_DRM_KOMEDA) += komeda.o
diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
new file mode 100644
index 000000000000..af3dabb499cd
--- /dev/null
+++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * Author: James.Qian.Wang <james.qian.wang@arm.com>
+ *
+ */
+#include "malidp_io.h"
+#include "komeda_dev.h"
+
+static int d71_enum_resources(struct komeda_dev *mdev)
+{
+ /* TODO add enum resources */
+ return -1;
+}
+
+static struct komeda_dev_funcs d71_chip_funcs = {
+ .enum_resources = d71_enum_resources,
+ .cleanup = NULL,
+};
+
+#define GLB_ARCH_ID 0x000
+#define GLB_CORE_ID 0x004
+#define GLB_CORE_INFO 0x008
+
+struct komeda_dev_funcs *
+d71_identify(u32 __iomem *reg_base, struct komeda_chip_info *chip)
+{
+ chip->arch_id = malidp_read32(reg_base, GLB_ARCH_ID);
+ chip->core_id = malidp_read32(reg_base, GLB_CORE_ID);
+ chip->core_info = malidp_read32(reg_base, GLB_CORE_INFO);
+
+ return &d71_chip_funcs;
+}
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
index ad8fa160eff9..680e3e2cf100 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
@@ -92,6 +92,9 @@ komeda_product_match(struct komeda_dev *mdev, u32 target)
return MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id) == target;
}
+struct komeda_dev_funcs *
+d71_identify(u32 __iomem *reg, struct komeda_chip_info *chip);
+
struct komeda_dev *komeda_dev_create(struct device *dev);
void komeda_dev_destroy(struct komeda_dev *mdev);
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
new file mode 100644
index 000000000000..326ae264481f
--- /dev/null
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * Author: James.Qian.Wang <james.qian.wang@arm.com>
+ *
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/component.h>
+#include <drm/drm_of.h>
+#include "komeda_dev.h"
+
+struct komeda_drv {
+ struct komeda_dev *mdev;
+};
+
+static void komeda_unbind(struct device *dev)
+{
+ struct komeda_drv *mdrv = dev_get_drvdata(dev);
+
+ dev_set_drvdata(dev, NULL);
+
+ if (!mdrv)
+ return;
+
+ komeda_dev_destroy(mdrv->mdev);
+ kfree(mdrv);
+}
+
+static int komeda_bind(struct device *dev)
+{
+ struct komeda_drv *mdrv;
+ int err;
+
+ mdrv = kzalloc(sizeof(*mdrv), GFP_KERNEL);
+ if (!mdrv)
+ return -ENOMEM;
+
+ mdrv->mdev = komeda_dev_create(dev);
+ if (IS_ERR(mdrv->mdev)) {
+ err = PTR_ERR(mdrv->mdev);
+ goto free_mdrv;
+ }
+
+ dev_set_drvdata(dev, mdrv);
+
+ return 0;
+
+free_mdrv:
+ kfree(mdrv);
+ return err;
+}
+
+static const struct component_master_ops komeda_master_ops = {
+ .bind = komeda_bind,
+ .unbind = komeda_unbind,
+};
+
+static int compare_of(struct device *dev, void *data)
+{
+ return dev->of_node == data;
+}
+
+static void komeda_add_slave(struct device *master,
+ struct component_match **match,
+ struct device_node *np, int port)
+{
+ struct device_node *remote;
+
+ remote = of_graph_get_remote_node(np, port, 0);
+ if (remote) {
+ drm_of_component_match_add(master, match, compare_of, remote);
+ of_node_put(remote);
+ }
+}
+
+static int komeda_platform_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct component_match *match = NULL;
+ struct device_node *child;
+
+ if (!dev->of_node)
+ return -ENODEV;
+
+ for_each_available_child_of_node(dev->of_node, child) {
+ if (of_node_cmp(child->name, "pipeline") != 0)
+ continue;
+
+ /* add connector */
+ komeda_add_slave(dev, &match, child, KOMEDA_OF_PORT_OUTPUT);
+ }
+
+ return component_master_add_with_match(dev, &komeda_master_ops, match);
+}
+
+static int komeda_platform_remove(struct platform_device *pdev)
+{
+ component_master_del(&pdev->dev, &komeda_master_ops);
+ return 0;
+}
+
+static const struct komeda_product_data komeda_products[] = {
+ [MALI_D71] = {
+ .product_id = MALIDP_D71_PRODUCT_ID,
+ .identify = d71_identify,
+ },
+};
+
+const struct of_device_id komeda_of_match[] = {
+ { .compatible = "arm,mali-d71", .data = &komeda_products[MALI_D71], },
+ {},
+};
+
+MODULE_DEVICE_TABLE(of, komeda_of_match);
+
+static struct platform_driver komeda_platform_driver = {
+ .probe = komeda_platform_probe,
+ .remove = komeda_platform_remove,
+ .driver = {
+ .name = "komeda",
+ .of_match_table = komeda_of_match,
+ .pm = NULL,
+ },
+};
+
+module_platform_driver(komeda_platform_driver);
+
+MODULE_AUTHOR("James.Qian.Wang <james.qian.wang@arm.com>");
+MODULE_DESCRIPTION("Komeda KMS driver");
+MODULE_LICENSE("GPL v2");
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 3+ messages in thread* [PATCH v3 0/9] Overview of Arm komeda display driver
@ 2018-12-21 9:58 james qian wang (Arm Technology China)
2018-12-21 9:59 ` [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module james qian wang (Arm Technology China)
0 siblings, 1 reply; 3+ messages in thread
From: james qian wang (Arm Technology China) @ 2018-12-21 9:58 UTC (permalink / raw)
To: Liviu Dudau
Cc: Mark Rutland, linux-doc@vger.kernel.org,
maxime.ripard@bootlin.com, Jonathan Chai (Arm Technology China),
Alexandru-Cosmin Gheorghe, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, yamada.masahiro@socionext.com,
Yiqi Kang (Arm Technology China), mchehab+samsung@kernel.org,
Tiannan Zhu (Arm Technology China), corbet@lwn.net,
airlied@linux.ie, malidp@foss.arm.com,
thomas Sun (Arm Technology China), Ayan Halder, devicetree
This is the first patchset of ARM new komeda display driver, this patchset
added all basic structure of komeda, relationship of DRM-KMS with komeda,
for tring to give a brife overview of komeda-driver.
komeda is for supporting the ARM display processor D71 and later IPs, Since from
D71, Arm display IP begins to adopt a flexible and modularized architecture:
A display pipeline is made up of multiple individual and functional pipeline
stages called components, and every component has some specific capabilities
that can give the flowed pipeline pixel data a specific data processing.
The typical components like:
- Layer:
Layer is the first pipeline stage, It fetches the pixel from memory and
prepare the source pixel data for the next stage, like rotation, format,
color-space handling.
- Scaler:
As its name, scaler is for scaling and image enhancement.
- Compositor (compiz)
Compositor is for blending multiple layers or pixel data flows into one
single display frame.
- Writeback Layer (wb_layer)
Writeback layer do the opposite things of Layer, Which connect to compiz
for writing the composition result to memory.
- Post image processor (improc)
Post image processor is for adjusting frame data like gamma and color space
to fit the requirements of the monitor.
- Timing controller (timing_ctrlr)
Final stage of display pipeline, Timing controller is not for the pixel
handling, but only for controlling the display timing.
Benefitting from the modularized architecture, D71 pipelines can be easily
adjusted to fit different usages. And D71 has two pipelines, which support two
types of working mode:
- Dual display mode
Two pipelines work independently and separately to drive two display outputs.
- Single pipeline data flow
Layer_0 -> (scaler) ->\
Layer_1 -> (scaler) ->\ /-> (scaler) -> wb_layer -> memory
compiz ->
Layer_2 -> (scaler) ->/ \-> improc ->timing_ctrlr ->monitor
Layer_3 -> (scaler) ->/
- Single display mode
Two pipelines work together to drive only one display output.
On this mode, pipeline_B doesn't work indenpendently, but outputs its
composition result into pipeline_A, and its pixel timing also derived from
pipeline_A.timing_ctrlr. The pipeline_B works just like a "slave" of
pipeline_A(master)
- Slave enabled data flow
Layer_0 -> (scaler) ->\
Layer_1 -> (scaler) ->\
compiz_B -> compiz_A
Layer_2 -> (scaler) ->/
Layer_3 -> (scaler) ->/
compiz_B ->\
Layer_4 -> (scaler) ->\
Layer_5 -> (scaler) ->\ /-> (scaler) -> wb_layer -> memory
compiz_A ->
Layer_6 -> (scaler) ->/ \-> improc ->timing_ctrlr ->monitor
Layer_7 -> (scaler) ->/
To fully utilize and easily access/configure the HW, komeda use a similar
architecture: Pipeline/Component to describe the HW features and capabilities.
Add the DRM-KMS consideration. then:
A Komeda driver is comprised of two layers of data structures:
1. komeda_dev/pipeline/component
Which are used by komeda driver to describe and abstract a display HW.
- komeda_layer/scaler/compiz/improc/timing_ctrlr
for describing a specific pipeline component stage.
- komeda_pipeline
for abstracting a display pipeline and the pipeline is composed of multiple
components.
- komeda_dev
for the whole view of the device, manage the pipeline, irq, and the other
control-abilites of device.
2. komeda_kms_dev/crtc/plane:
Which connect Komeda-dev to DRM-KMS, basically it collects and organizes
komeda_dev's capabilities and resurces by DRM-KMS's way (crtc/plane/connector),
and convert the DRM-KMS's requirement to the real komeda_dev's configuration.
So generally, the komeda_dev is like a resource collection, and the komeda_kms
is a group of users (crtc/plane/wb_connector), the drm_state defined or
described the resource requirement of user, and every KMS-OBJ maps or represents
to a specific komeda data pipeline:
- Plane: Layer -> (Scaler) -> Compiz
- Wb_connector: Compiz-> (scaler) -> Wb_layer -> memory
- Crtc: Compiz -> Improc -> Timing_Ctrlr -> Monitor
The features and properties of KMS-OBJ based on the mapping pipeline, and the
komeda_kms level function (crtc/plane/wb_connector->atomic_check) actually
is for pickuping suitable pipeline and component resources, configure them to
a specific state and build these input/output pipeline of komeda to fit the
requirement.
Furthermore, To support multiple IPs, komeda_dev has been split into two layers:
- Komeda-CORE or common layer.
for the common feature validation and handling
- Komeda-CHIP.
for reporting and exposing the HW resource by CORE's way, the HW register
programming and updating.
With this two Layer's device abstraction, the most operations are handled in
Komeda-CORE, the Komeda-CHIP is only for CHIP-specific stuff, easy for adding
new chipset or IP in future.
v3:
- Fixed style problem found by checkpatch.pl --strict.
- Updated DT binding document according to Rob Herring's comments.
v2:
- Use "pipe" (to replace "ppl") as the short form of "pipeline".
- Some editing changes for document according to Randy Dunlap's comments.
- Adjusted the position of KOMEDA by alphabetical order.
James (Qian) Wang (9):
drm/komeda: komeda_dev/pipeline/component definition and initialzation
dt/bindings: drm/komeda: Add DT bindings for ARM display processor D71
drm/komeda: Build komeda to be a platform module
drm/komeda: Add DT parsing
drm/komeda: Add komeda_format_caps for format handling
drm/komeda: Add komeda_framebuffer
drm/komeda: Attach komeda_dev to DRM-KMS
drm/doc: Add initial komeda driver documentation
MAINTAINERS: Add maintainer for arm komeda driver
.../bindings/display/arm/arm,komeda.txt | 79 +++
Documentation/gpu/drivers.rst | 1 +
Documentation/gpu/komeda-kms.rst | 488 ++++++++++++++++++
MAINTAINERS | 9 +
drivers/gpu/drm/arm/Kconfig | 2 +
drivers/gpu/drm/arm/Makefile | 1 +
drivers/gpu/drm/arm/display/Kbuild | 3 +
drivers/gpu/drm/arm/display/Kconfig | 14 +
.../gpu/drm/arm/display/include/malidp_io.h | 42 ++
.../drm/arm/display/include/malidp_product.h | 23 +
.../drm/arm/display/include/malidp_utils.h | 16 +
drivers/gpu/drm/arm/display/komeda/Makefile | 21 +
.../gpu/drm/arm/display/komeda/d71/d71_dev.c | 111 ++++
.../gpu/drm/arm/display/komeda/komeda_crtc.c | 106 ++++
.../gpu/drm/arm/display/komeda/komeda_dev.c | 195 +++++++
.../gpu/drm/arm/display/komeda/komeda_dev.h | 113 ++++
.../gpu/drm/arm/display/komeda/komeda_drv.c | 143 +++++
.../arm/display/komeda/komeda_format_caps.c | 75 +++
.../arm/display/komeda/komeda_format_caps.h | 89 ++++
.../arm/display/komeda/komeda_framebuffer.c | 165 ++++++
.../arm/display/komeda/komeda_framebuffer.h | 31 ++
.../gpu/drm/arm/display/komeda/komeda_kms.c | 169 ++++++
.../gpu/drm/arm/display/komeda/komeda_kms.h | 113 ++++
.../drm/arm/display/komeda/komeda_pipeline.c | 202 ++++++++
.../drm/arm/display/komeda/komeda_pipeline.h | 361 +++++++++++++
.../gpu/drm/arm/display/komeda/komeda_plane.c | 109 ++++
.../arm/display/komeda/komeda_private_obj.c | 88 ++++
27 files changed, 2769 insertions(+)
create mode 100644 Documentation/devicetree/bindings/display/arm/arm,komeda.txt
create mode 100644 Documentation/gpu/komeda-kms.rst
create mode 100644 drivers/gpu/drm/arm/display/Kbuild
create mode 100644 drivers/gpu/drm/arm/display/Kconfig
create mode 100644 drivers/gpu/drm/arm/display/include/malidp_io.h
create mode 100644 drivers/gpu/drm/arm/display/include/malidp_product.h
create mode 100644 drivers/gpu/drm/arm/display/include/malidp_utils.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/Makefile
create mode 100644 drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_dev.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_dev.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_drv.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_format_caps.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_kms.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_kms.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_pipeline.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_plane.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_private_obj.c
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 3+ messages in thread* [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module
2018-12-21 9:58 [PATCH v3 0/9] Overview of Arm komeda display driver james qian wang (Arm Technology China)
@ 2018-12-21 9:59 ` james qian wang (Arm Technology China)
2018-12-24 12:02 ` Liviu Dudau
0 siblings, 1 reply; 3+ messages in thread
From: james qian wang (Arm Technology China) @ 2018-12-21 9:59 UTC (permalink / raw)
To: Liviu Dudau
Cc: Mark Rutland, linux-doc@vger.kernel.org,
maxime.ripard@bootlin.com, Jonathan Chai (Arm Technology China),
Alexandru-Cosmin Gheorghe, dri-devel@lists.freedesktop.org,
linux-kernel@vger.kernel.org, yamada.masahiro@socionext.com,
Yiqi Kang (Arm Technology China), mchehab+samsung@kernel.org,
Tiannan Zhu (Arm Technology China), corbet@lwn.net,
airlied@linux.ie, malidp@foss.arm.com,
thomas Sun (Arm Technology China), Ayan Halder, devicetree
Implement a simple wrapper for platform module to build komeda to module,
Also add a very simple D71 layer code to show how to discover a product.
Komeda driver direct bind the product ENTRY function xxx_identity to DT
compatible name like:
d71_product = {
.product_id = MALIDP_D71_PRODUCT_ID,
.identify = d71_identify,
},
const struct of_device_id komeda_of_match[] = {
{ .compatible = "arm,mali-d71", .data = &d71_product, },
{},
};
Then when linux found a matched DT node and call driver to probe, we can
easily get the of data, and call into the product to do the identify:
komeda_bind()
{
...
product = of_device_get_match_data(dev);
product->identify();
...
}
Changes in v3:
- Fixed style problem found by checkpatch.pl --strict.
Signed-off-by: James (Qian) Wang <james.qian.wang@arm.com>
---
.../gpu/drm/arm/display/include/malidp_io.h | 42 ++++++
drivers/gpu/drm/arm/display/komeda/Makefile | 6 +-
.../gpu/drm/arm/display/komeda/d71/d71_dev.c | 33 +++++
.../gpu/drm/arm/display/komeda/komeda_dev.h | 3 +
.../gpu/drm/arm/display/komeda/komeda_drv.c | 132 ++++++++++++++++++
5 files changed, 215 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/arm/display/include/malidp_io.h
create mode 100644 drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_drv.c
diff --git a/drivers/gpu/drm/arm/display/include/malidp_io.h b/drivers/gpu/drm/arm/display/include/malidp_io.h
new file mode 100644
index 000000000000..4fb3caf864ce
--- /dev/null
+++ b/drivers/gpu/drm/arm/display/include/malidp_io.h
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * Author: James.Qian.Wang <james.qian.wang@arm.com>
+ *
+ */
+#ifndef _MALIDP_IO_H_
+#define _MALIDP_IO_H_
+
+#include <linux/io.h>
+
+static inline u32
+malidp_read32(u32 __iomem *base, u32 offset)
+{
+ return readl((base + (offset >> 2)));
+}
+
+static inline void
+malidp_write32(u32 __iomem *base, u32 offset, u32 v)
+{
+ writel(v, (base + (offset >> 2)));
+}
+
+static inline void
+malidp_write32_mask(u32 __iomem *base, u32 offset, u32 m, u32 v)
+{
+ u32 tmp = malidp_read32(base, offset);
+
+ tmp &= (~m);
+ malidp_write32(base, offset, v | tmp);
+}
+
+static inline void
+malidp_write_group(u32 __iomem *base, u32 offset, int num, const u32 *values)
+{
+ int i;
+
+ for (i = 0; i < num; i++)
+ malidp_write32(base, offset + i * 4, values[i]);
+}
+
+#endif /*_MALIDP_IO_H_*/
diff --git a/drivers/gpu/drm/arm/display/komeda/Makefile b/drivers/gpu/drm/arm/display/komeda/Makefile
index 5b44e36509b1..c03d6876ef75 100644
--- a/drivers/gpu/drm/arm/display/komeda/Makefile
+++ b/drivers/gpu/drm/arm/display/komeda/Makefile
@@ -5,7 +5,11 @@ ccflags-y := \
-I$(src)
komeda-y := \
+ komeda_drv.o \
komeda_dev.o \
- komeda_pipeline.o \
+ komeda_pipeline.o
+
+komeda-y += \
+ d71/d71_dev.o
obj-$(CONFIG_DRM_KOMEDA) += komeda.o
diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
new file mode 100644
index 000000000000..af3dabb499cd
--- /dev/null
+++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
@@ -0,0 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * Author: James.Qian.Wang <james.qian.wang@arm.com>
+ *
+ */
+#include "malidp_io.h"
+#include "komeda_dev.h"
+
+static int d71_enum_resources(struct komeda_dev *mdev)
+{
+ /* TODO add enum resources */
+ return -1;
+}
+
+static struct komeda_dev_funcs d71_chip_funcs = {
+ .enum_resources = d71_enum_resources,
+ .cleanup = NULL,
+};
+
+#define GLB_ARCH_ID 0x000
+#define GLB_CORE_ID 0x004
+#define GLB_CORE_INFO 0x008
+
+struct komeda_dev_funcs *
+d71_identify(u32 __iomem *reg_base, struct komeda_chip_info *chip)
+{
+ chip->arch_id = malidp_read32(reg_base, GLB_ARCH_ID);
+ chip->core_id = malidp_read32(reg_base, GLB_CORE_ID);
+ chip->core_info = malidp_read32(reg_base, GLB_CORE_INFO);
+
+ return &d71_chip_funcs;
+}
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
index ad8fa160eff9..680e3e2cf100 100644
--- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
@@ -92,6 +92,9 @@ komeda_product_match(struct komeda_dev *mdev, u32 target)
return MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id) == target;
}
+struct komeda_dev_funcs *
+d71_identify(u32 __iomem *reg, struct komeda_chip_info *chip);
+
struct komeda_dev *komeda_dev_create(struct device *dev);
void komeda_dev_destroy(struct komeda_dev *mdev);
diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
new file mode 100644
index 000000000000..a2657b3d09d7
--- /dev/null
+++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
@@ -0,0 +1,132 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
+ * Author: James.Qian.Wang <james.qian.wang@arm.com>
+ *
+ */
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/platform_device.h>
+#include <linux/component.h>
+#include <drm/drm_of.h>
+#include "komeda_dev.h"
+
+struct komeda_drv {
+ struct komeda_dev *mdev;
+};
+
+static void komeda_unbind(struct device *dev)
+{
+ struct komeda_drv *mdrv = dev_get_drvdata(dev);
+
+ dev_set_drvdata(dev, NULL);
+
+ if (!mdrv)
+ return;
+
+ komeda_dev_destroy(mdrv->mdev);
+ kfree(mdrv);
+}
+
+static int komeda_bind(struct device *dev)
+{
+ struct komeda_drv *mdrv;
+ int err;
+
+ mdrv = kzalloc(sizeof(*mdrv), GFP_KERNEL);
+ if (!mdrv)
+ return -ENOMEM;
+
+ mdrv->mdev = komeda_dev_create(dev);
+ if (IS_ERR(mdrv->mdev)) {
+ err = PTR_ERR(mdrv->mdev);
+ goto free_mdrv;
+ }
+
+ dev_set_drvdata(dev, mdrv);
+
+ return 0;
+
+free_mdrv:
+ kfree(mdrv);
+ return err;
+}
+
+static const struct component_master_ops komeda_master_ops = {
+ .bind = komeda_bind,
+ .unbind = komeda_unbind,
+};
+
+static int compare_of(struct device *dev, void *data)
+{
+ return dev->of_node == data;
+}
+
+static void komeda_add_slave(struct device *master,
+ struct component_match **match,
+ struct device_node *np, int port)
+{
+ struct device_node *remote;
+
+ remote = of_graph_get_remote_node(np, port, 0);
+ if (!remote) {
+ drm_of_component_match_add(master, match, compare_of, remote);
+ of_node_put(remote);
+ }
+}
+
+static int komeda_platform_probe(struct platform_device *pdev)
+{
+ struct device *dev = &pdev->dev;
+ struct component_match *match = NULL;
+ struct device_node *child;
+
+ if (!dev->of_node)
+ return -ENODEV;
+
+ for_each_available_child_of_node(dev->of_node, child) {
+ if (of_node_cmp(child->name, "pipeline") != 0)
+ continue;
+
+ /* add connector */
+ komeda_add_slave(dev, &match, child, KOMEDA_OF_PORT_OUTPUT);
+ }
+
+ return component_master_add_with_match(dev, &komeda_master_ops, match);
+}
+
+static int komeda_platform_remove(struct platform_device *pdev)
+{
+ component_master_del(&pdev->dev, &komeda_master_ops);
+ return 0;
+}
+
+static const struct komeda_product_data komeda_products[] = {
+ [MALI_D71] = {
+ .product_id = MALIDP_D71_PRODUCT_ID,
+ .identify = d71_identify,
+ },
+};
+
+const struct of_device_id komeda_of_match[] = {
+ { .compatible = "arm,mali-d71", .data = &komeda_products[MALI_D71], },
+ {},
+};
+
+MODULE_DEVICE_TABLE(of, komeda_of_match);
+
+static struct platform_driver komeda_platform_driver = {
+ .probe = komeda_platform_probe,
+ .remove = komeda_platform_remove,
+ .driver = {
+ .name = "komeda",
+ .of_match_table = komeda_of_match,
+ .pm = NULL,
+ },
+};
+
+module_platform_driver(komeda_platform_driver);
+
+MODULE_AUTHOR("James.Qian.Wang <james.qian.wang@arm.com>");
+MODULE_DESCRIPTION("Komeda KMS driver");
+MODULE_LICENSE("GPL v2");
--
2.17.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module
2018-12-21 9:59 ` [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module james qian wang (Arm Technology China)
@ 2018-12-24 12:02 ` Liviu Dudau
0 siblings, 0 replies; 3+ messages in thread
From: Liviu Dudau @ 2018-12-24 12:02 UTC (permalink / raw)
To: james qian wang (Arm Technology China)
Cc: Jonathan Chai (Arm Technology China), Brian Starkey,
Julien Yin (Arm Technology China),
thomas Sun (Arm Technology China), Alexandru-Cosmin Gheorghe,
Lowry Li (Arm Technology China), Ayan Halder,
Tiannan Zhu (Arm Technology China),
Jin Gao (Arm Technology China), Yiqi Kang (Arm Technology China),
nd, malidp@foss.arm.com, maarten.lankhorst@linux.intel.com,
maxime.ripard@bootlin.com, sean@poorly.run, corbet
On Fri, Dec 21, 2018 at 09:59:28AM +0000, james qian wang (Arm Technology China) wrote:
> Implement a simple wrapper for platform module to build komeda to module,
> Also add a very simple D71 layer code to show how to discover a product.
> Komeda driver direct bind the product ENTRY function xxx_identity to DT
> compatible name like:
>
> d71_product = {
> .product_id = MALIDP_D71_PRODUCT_ID,
> .identify = d71_identify,
> },
>
> const struct of_device_id komeda_of_match[] = {
> { .compatible = "arm,mali-d71", .data = &d71_product, },
> {},
> };
>
> Then when linux found a matched DT node and call driver to probe, we can
> easily get the of data, and call into the product to do the identify:
>
> komeda_bind()
> {
> ...
> product = of_device_get_match_data(dev);
>
> product->identify();
> ...
> }
>
> Changes in v3:
> - Fixed style problem found by checkpatch.pl --strict.
>
> Signed-off-by: James (Qian) Wang <james.qian.wang@arm.com>
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
Best regards,
Liviu
> ---
> .../gpu/drm/arm/display/include/malidp_io.h | 42 ++++++
> drivers/gpu/drm/arm/display/komeda/Makefile | 6 +-
> .../gpu/drm/arm/display/komeda/d71/d71_dev.c | 33 +++++
> .../gpu/drm/arm/display/komeda/komeda_dev.h | 3 +
> .../gpu/drm/arm/display/komeda/komeda_drv.c | 132 ++++++++++++++++++
> 5 files changed, 215 insertions(+), 1 deletion(-)
> create mode 100644 drivers/gpu/drm/arm/display/include/malidp_io.h
> create mode 100644 drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_drv.c
>
> diff --git a/drivers/gpu/drm/arm/display/include/malidp_io.h b/drivers/gpu/drm/arm/display/include/malidp_io.h
> new file mode 100644
> index 000000000000..4fb3caf864ce
> --- /dev/null
> +++ b/drivers/gpu/drm/arm/display/include/malidp_io.h
> @@ -0,0 +1,42 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
> + * Author: James.Qian.Wang <james.qian.wang@arm.com>
> + *
> + */
> +#ifndef _MALIDP_IO_H_
> +#define _MALIDP_IO_H_
> +
> +#include <linux/io.h>
> +
> +static inline u32
> +malidp_read32(u32 __iomem *base, u32 offset)
> +{
> + return readl((base + (offset >> 2)));
> +}
> +
> +static inline void
> +malidp_write32(u32 __iomem *base, u32 offset, u32 v)
> +{
> + writel(v, (base + (offset >> 2)));
> +}
> +
> +static inline void
> +malidp_write32_mask(u32 __iomem *base, u32 offset, u32 m, u32 v)
> +{
> + u32 tmp = malidp_read32(base, offset);
> +
> + tmp &= (~m);
> + malidp_write32(base, offset, v | tmp);
> +}
> +
> +static inline void
> +malidp_write_group(u32 __iomem *base, u32 offset, int num, const u32 *values)
> +{
> + int i;
> +
> + for (i = 0; i < num; i++)
> + malidp_write32(base, offset + i * 4, values[i]);
> +}
> +
> +#endif /*_MALIDP_IO_H_*/
> diff --git a/drivers/gpu/drm/arm/display/komeda/Makefile b/drivers/gpu/drm/arm/display/komeda/Makefile
> index 5b44e36509b1..c03d6876ef75 100644
> --- a/drivers/gpu/drm/arm/display/komeda/Makefile
> +++ b/drivers/gpu/drm/arm/display/komeda/Makefile
> @@ -5,7 +5,11 @@ ccflags-y := \
> -I$(src)
>
> komeda-y := \
> + komeda_drv.o \
> komeda_dev.o \
> - komeda_pipeline.o \
> + komeda_pipeline.o
> +
> +komeda-y += \
> + d71/d71_dev.o
>
> obj-$(CONFIG_DRM_KOMEDA) += komeda.o
> diff --git a/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> new file mode 100644
> index 000000000000..af3dabb499cd
> --- /dev/null
> +++ b/drivers/gpu/drm/arm/display/komeda/d71/d71_dev.c
> @@ -0,0 +1,33 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
> + * Author: James.Qian.Wang <james.qian.wang@arm.com>
> + *
> + */
> +#include "malidp_io.h"
> +#include "komeda_dev.h"
> +
> +static int d71_enum_resources(struct komeda_dev *mdev)
> +{
> + /* TODO add enum resources */
> + return -1;
> +}
> +
> +static struct komeda_dev_funcs d71_chip_funcs = {
> + .enum_resources = d71_enum_resources,
> + .cleanup = NULL,
> +};
> +
> +#define GLB_ARCH_ID 0x000
> +#define GLB_CORE_ID 0x004
> +#define GLB_CORE_INFO 0x008
> +
> +struct komeda_dev_funcs *
> +d71_identify(u32 __iomem *reg_base, struct komeda_chip_info *chip)
> +{
> + chip->arch_id = malidp_read32(reg_base, GLB_ARCH_ID);
> + chip->core_id = malidp_read32(reg_base, GLB_CORE_ID);
> + chip->core_info = malidp_read32(reg_base, GLB_CORE_INFO);
> +
> + return &d71_chip_funcs;
> +}
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> index ad8fa160eff9..680e3e2cf100 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> @@ -92,6 +92,9 @@ komeda_product_match(struct komeda_dev *mdev, u32 target)
> return MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id) == target;
> }
>
> +struct komeda_dev_funcs *
> +d71_identify(u32 __iomem *reg, struct komeda_chip_info *chip);
> +
> struct komeda_dev *komeda_dev_create(struct device *dev);
> void komeda_dev_destroy(struct komeda_dev *mdev);
>
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> new file mode 100644
> index 000000000000..a2657b3d09d7
> --- /dev/null
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c
> @@ -0,0 +1,132 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
> + * Author: James.Qian.Wang <james.qian.wang@arm.com>
> + *
> + */
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/platform_device.h>
> +#include <linux/component.h>
> +#include <drm/drm_of.h>
> +#include "komeda_dev.h"
> +
> +struct komeda_drv {
> + struct komeda_dev *mdev;
> +};
> +
> +static void komeda_unbind(struct device *dev)
> +{
> + struct komeda_drv *mdrv = dev_get_drvdata(dev);
> +
> + dev_set_drvdata(dev, NULL);
> +
> + if (!mdrv)
> + return;
> +
> + komeda_dev_destroy(mdrv->mdev);
> + kfree(mdrv);
> +}
> +
> +static int komeda_bind(struct device *dev)
> +{
> + struct komeda_drv *mdrv;
> + int err;
> +
> + mdrv = kzalloc(sizeof(*mdrv), GFP_KERNEL);
> + if (!mdrv)
> + return -ENOMEM;
> +
> + mdrv->mdev = komeda_dev_create(dev);
> + if (IS_ERR(mdrv->mdev)) {
> + err = PTR_ERR(mdrv->mdev);
> + goto free_mdrv;
> + }
> +
> + dev_set_drvdata(dev, mdrv);
> +
> + return 0;
> +
> +free_mdrv:
> + kfree(mdrv);
> + return err;
> +}
> +
> +static const struct component_master_ops komeda_master_ops = {
> + .bind = komeda_bind,
> + .unbind = komeda_unbind,
> +};
> +
> +static int compare_of(struct device *dev, void *data)
> +{
> + return dev->of_node == data;
> +}
> +
> +static void komeda_add_slave(struct device *master,
> + struct component_match **match,
> + struct device_node *np, int port)
> +{
> + struct device_node *remote;
> +
> + remote = of_graph_get_remote_node(np, port, 0);
> + if (!remote) {
> + drm_of_component_match_add(master, match, compare_of, remote);
> + of_node_put(remote);
> + }
> +}
> +
> +static int komeda_platform_probe(struct platform_device *pdev)
> +{
> + struct device *dev = &pdev->dev;
> + struct component_match *match = NULL;
> + struct device_node *child;
> +
> + if (!dev->of_node)
> + return -ENODEV;
> +
> + for_each_available_child_of_node(dev->of_node, child) {
> + if (of_node_cmp(child->name, "pipeline") != 0)
> + continue;
> +
> + /* add connector */
> + komeda_add_slave(dev, &match, child, KOMEDA_OF_PORT_OUTPUT);
> + }
> +
> + return component_master_add_with_match(dev, &komeda_master_ops, match);
> +}
> +
> +static int komeda_platform_remove(struct platform_device *pdev)
> +{
> + component_master_del(&pdev->dev, &komeda_master_ops);
> + return 0;
> +}
> +
> +static const struct komeda_product_data komeda_products[] = {
> + [MALI_D71] = {
> + .product_id = MALIDP_D71_PRODUCT_ID,
> + .identify = d71_identify,
> + },
> +};
> +
> +const struct of_device_id komeda_of_match[] = {
> + { .compatible = "arm,mali-d71", .data = &komeda_products[MALI_D71], },
> + {},
> +};
> +
> +MODULE_DEVICE_TABLE(of, komeda_of_match);
> +
> +static struct platform_driver komeda_platform_driver = {
> + .probe = komeda_platform_probe,
> + .remove = komeda_platform_remove,
> + .driver = {
> + .name = "komeda",
> + .of_match_table = komeda_of_match,
> + .pm = NULL,
> + },
> +};
> +
> +module_platform_driver(komeda_platform_driver);
> +
> +MODULE_AUTHOR("James.Qian.Wang <james.qian.wang@arm.com>");
> +MODULE_DESCRIPTION("Komeda KMS driver");
> +MODULE_LICENSE("GPL v2");
> --
> 2.17.1
>
--
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2018-12-24 12:02 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-12-21 11:46 [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module james qian wang (Arm Technology China)
-- strict thread matches above, loose matches on Subject: below --
2018-12-21 9:58 [PATCH v3 0/9] Overview of Arm komeda display driver james qian wang (Arm Technology China)
2018-12-21 9:59 ` [PATCH v3 3/9] drm/komeda: Build komeda to be a platform module james qian wang (Arm Technology China)
2018-12-24 12:02 ` Liviu Dudau
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).