From: Keith Zhao <keith.zhao@starfivetech.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
<dri-devel@lists.freedesktop.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<linux-media@vger.kernel.org>, <linaro-mm-sig@lists.linaro.org>
Cc: David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>,
"Rob Herring" <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>,
"Emil Renner Berthing" <kernel@esmil.dk>,
Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
Sumit Semwal <sumit.semwal@linaro.org>,
<christian.koenig@amd.com>,
Bjorn Andersson <andersson@kernel.org>,
Heiko Stuebner <heiko@sntech.de>, Shawn Guo <shawnguo@kernel.org>,
Jagan Teki <jagan@edgeble.ai>,
Chris Morgan <macromorgan@hotmail.com>,
Jack Zhu <jack.zhu@starfivetech.com>,
"Shengyang Chen" <shengyang.chen@starfivetech.com>,
Changhuang Liang <changhuang.liang@starfivetech.com>
Subject: Re: [PATCH 5/9] drm/verisilicon: Add mode config funcs
Date: Fri, 21 Jul 2023 17:06:32 +0800 [thread overview]
Message-ID: <af5422e8-c14b-c47c-e699-884ec65bf87f@starfivetech.com> (raw)
In-Reply-To: <30008535-8606-fc6d-9c07-23d46f59c957@suse.de>
On 2023/6/21 19:04, Thomas Zimmermann wrote:
> Hi Keith
>
> Am 02.06.23 um 09:40 schrieb Keith Zhao:
>> Add mode setting functions for JH7110 SoC.
>>
>> Signed-off-by: Keith Zhao <keith.zhao@starfivetech.com>
>> ---
>> drivers/gpu/drm/verisilicon/Makefile | 1 +
>> drivers/gpu/drm/verisilicon/vs_drv.c | 3 +
>
>> drivers/gpu/drm/verisilicon/vs_fb.c | 181 +++++++++++++++++++++++++++
>> drivers/gpu/drm/verisilicon/vs_fb.h | 15 +++
>
> I'd call these files vs_modeset.{c,h} to be consistent with the rest of the drivers.
>
>> 4 files changed, 200 insertions(+)
>> create mode 100644 drivers/gpu/drm/verisilicon/vs_fb.c
>> create mode 100644 drivers/gpu/drm/verisilicon/vs_fb.h
>>
>> diff --git a/drivers/gpu/drm/verisilicon/Makefile b/drivers/gpu/drm/verisilicon/Makefile
>> index 30360e370e47..38254dc5d98d 100644
>> --- a/drivers/gpu/drm/verisilicon/Makefile
>> +++ b/drivers/gpu/drm/verisilicon/Makefile
>> @@ -1,6 +1,7 @@
>> # SPDX-License-Identifier: GPL-2.0
>> vs_drm-objs := vs_drv.o \
>> + vs_fb.o \
>> vs_gem.o
>> obj-$(CONFIG_DRM_VERISILICON) += vs_drm.o
>> diff --git a/drivers/gpu/drm/verisilicon/vs_drv.c b/drivers/gpu/drm/verisilicon/vs_drv.c
>> index e0a2fc43b55f..d84aacd751bc 100644
>> --- a/drivers/gpu/drm/verisilicon/vs_drv.c
>> +++ b/drivers/gpu/drm/verisilicon/vs_drv.c
>> @@ -30,6 +30,7 @@
>> #include <drm/drm_vblank.h>
>> #include "vs_drv.h"
>> +#include "vs_fb.h"
>> #include "vs_gem.h"
>> #define DRV_NAME "starfive"
>> @@ -118,6 +119,8 @@ static int vs_drm_bind(struct device *dev)
>> if (ret)
>> goto err_mode;
>> + vs_mode_config_init(drm_dev);
>> +
>> ret = drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc);
>> if (ret)
>> goto err_bind;
>> diff --git a/drivers/gpu/drm/verisilicon/vs_fb.c b/drivers/gpu/drm/verisilicon/vs_fb.c
>> new file mode 100644
>> index 000000000000..3e85f7365084
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/vs_fb.c
>> @@ -0,0 +1,181 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>> + */
>> +
>> +#include <linux/module.h>
>> +#include <linux/version.h>
>> +
>> +#include <drm/drm_damage_helper.h>
>> +#include <drm/drm_fb_helper.h>
>> +#include <drm/drm_crtc.h>
>> +#include <drm/drm_crtc_helper.h>
>> +#include <drm/drm_fourcc.h>
>> +#include <drm/drm_framebuffer.h>
>> +#include <drm/drm_gem.h>
>> +#include <drm/drm_gem_framebuffer_helper.h>
>> +
>> +#include "vs_fb.h"
>> +#include "vs_gem.h"
>> +
>> +#define fourcc_mod_vs_get_type(val) \
>> + (((val) & DRM_FORMAT_MOD_VS_TYPE_MASK) >> 54)
>> +
>> +static struct drm_framebuffer_funcs vs_fb_funcs = {
>> + .create_handle = drm_gem_fb_create_handle,
>> + .destroy = drm_gem_fb_destroy,
>> + .dirty = drm_atomic_helper_dirtyfb,
>> +};
>> +
>> +static struct drm_framebuffer *
>> +vs_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
>> + struct vs_gem_object **obj, unsigned int num_planes)
>> +{
>> + struct drm_framebuffer *fb;
>> + int ret, i;
>> +
>> + fb = kzalloc(sizeof(*fb), GFP_KERNEL);
>> + if (!fb)
>> + return ERR_PTR(-ENOMEM);
>> +
>> + drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
>> +
>> + for (i = 0; i < num_planes; i++)
>> + fb->obj[i] = &obj[i]->base;
>> +
>> + ret = drm_framebuffer_init(dev, fb, &vs_fb_funcs);
>> + if (ret) {
>> + dev_err(dev->dev, "Failed to initialize framebuffer: %d\n",
>> + ret);
>> + kfree(fb);
>> + return ERR_PTR(ret);
>> + }
>> +
>> + return fb;
>> +}
>> +
>> +static struct drm_framebuffer *vs_fb_create(struct drm_device *dev,
>> + struct drm_file *file_priv,
>> + const struct drm_mode_fb_cmd2 *mode_cmd)
>> +{
>> + struct drm_framebuffer *fb;
>> + const struct drm_format_info *info;
>> + struct vs_gem_object *objs[MAX_NUM_PLANES];
>> + struct drm_gem_object *obj;
>> + unsigned int height, size;
>> + unsigned char i, num_planes;
>> + int ret = 0;
>> +
>> + info = drm_get_format_info(dev, mode_cmd);
>> + if (!info)
>> + return ERR_PTR(-EINVAL);
>> +
>> + num_planes = info->num_planes;
>> + if (num_planes > MAX_NUM_PLANES)
>> + return ERR_PTR(-EINVAL);
>> +
>> + for (i = 0; i < num_planes; i++) {
>> + obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
>> + if (!obj) {
>> + dev_err(dev->dev, "Failed to lookup GEM object.\n");
>> + ret = -ENXIO;
>> + goto err;
>> + }
>> +
>> + height = drm_format_info_plane_height(info,
>> + mode_cmd->height, i);
>> +
>> + size = height * mode_cmd->pitches[i] + mode_cmd->offsets[i];
>> +
>> + if (obj->size < size) {
>> + drm_gem_object_put(obj);
>> +
>> + ret = -EINVAL;
>> + goto err;
>> + }
>> +
>> + objs[i] = to_vs_gem_object(obj);
>> + }
>> +
>> + fb = vs_fb_alloc(dev, mode_cmd, objs, i);
>> + if (IS_ERR(fb)) {
>> + ret = PTR_ERR(fb);
>> + goto err;
>> + }
>> +
>> + return fb;
>> +
>> +err:
>> + for (; i > 0; i--)
>> + drm_gem_object_put(&objs[i - 1]->base);
>> +
>> + return ERR_PTR(ret);
>> +}
>> +
>> +struct vs_gem_object *vs_fb_get_gem_obj(struct drm_framebuffer *fb,
>> + unsigned char plane)
>> +{
>> + if (plane > MAX_NUM_PLANES)
>> + return NULL;
>> +
>> + return to_vs_gem_object(fb->obj[plane]);
>> +}
>> +
>> +static const struct drm_format_info vs_formats[] = {
>> + {.format = DRM_FORMAT_NV12, .depth = 0, .num_planes = 2, .char_per_block = { 20, 40, 0 },
>> + .block_w = { 4, 4, 0 }, .block_h = { 4, 4, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true},
>> + {.format = DRM_FORMAT_YUV444, .depth = 0, .num_planes = 3, .char_per_block = { 20, 20, 20 },
>> + .block_w = { 4, 4, 4 }, .block_h = { 4, 4, 4 }, .hsub = 1, .vsub = 1, .is_yuv = true},
>> +};
>> +
>> +static const struct drm_format_info *
>> +vs_lookup_format_info(const struct drm_format_info formats[],
>> + int num_formats, u32 format)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < num_formats; i++) {
>> + if (formats[i].format == format)
>> + return &formats[i];
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> +static const struct drm_format_info *
>> +vs_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
>> +{
>> + if (fourcc_mod_vs_get_type(cmd->modifier[0]) ==
>> + DRM_FORMAT_MOD_VS_TYPE_CUSTOM_10BIT)
>> + return vs_lookup_format_info(vs_formats, ARRAY_SIZE(vs_formats),
>> + cmd->pixel_format);
>> + else
>> + return NULL;
>> +}
>> +
>> +static const struct drm_mode_config_funcs vs_mode_config_funcs = {
>> + .fb_create = vs_fb_create,
>
> Maybe I'm missing something here, but it looks like you can call
> drm_gem_fb_create_with_funcs() to create the framebuffer.
>
That's a brilliant suggestion!!!
>> + .get_format_info = vs_get_format_info,
>> + .output_poll_changed = drm_fb_helper_output_poll_changed,
>> + .atomic_check = drm_atomic_helper_check,
>> + .atomic_commit = drm_atomic_helper_commit,
>> +};
>> +
>> +static struct drm_mode_config_helper_funcs vs_mode_config_helpers = {
>> + .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
>> +};
>> +
>> +void vs_mode_config_init(struct drm_device *dev)
>> +{
>
> If possible, move the call to drm_mode_config_init() into this function.
>
move drm_mode_config_init() into vs_mode_config_init.
and vs_mode_config_init must be called ahead component_bind_all
like this:
static int vs_drm_bind(struct device *dev)
{
......
vs_mode_config_init(drm_dev);
/* Now try and bind all our sub-components */
ret = component_bind_all(dev, drm_dev);
if (ret)
goto err_mode;
......
}
>> + dev->mode_config.fb_modifiers_not_supported = false;
>> +
>> + if (dev->mode_config.max_width == 0 ||
>> + dev->mode_config.max_height == 0) {
>> + dev->mode_config.min_width = 0;
>> + dev->mode_config.min_height = 0;
>> + dev->mode_config.max_width = 4096;
>> + dev->mode_config.max_height = 4096;
>> + }
>> + dev->mode_config.funcs = &vs_mode_config_funcs;
>> + dev->mode_config.helper_private = &vs_mode_config_helpers;
>> +}
>> diff --git a/drivers/gpu/drm/verisilicon/vs_fb.h b/drivers/gpu/drm/verisilicon/vs_fb.h
>> new file mode 100644
>> index 000000000000..78dda8e42894
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/vs_fb.h
>> @@ -0,0 +1,15 @@
>> +/* SPDX-License-Identifier: GPL-2.0 */
>> +/*
>> + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>> + */
>> +
>> +#ifndef __VS_FB_H__
>> +#define __VS_FB_H__
>> +
>> +#define MAX_NUM_PLANES 3 /* colour format plane */
>
> There's DRM_FORMAT_MAX_PLANES already. Please don't introduce a constant with the same purpose.
>
ok good idea!
> Best regards
> Thomas
>
>> +
>> +struct vs_gem_object *vs_fb_get_gem_obj(struct drm_framebuffer *fb,
>> + unsigned char plane);
>> +
>> +void vs_mode_config_init(struct drm_device *dev);
>> +#endif /* __VS_FB_H__ */
>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
WARNING: multiple messages have this Message-ID (diff)
From: Keith Zhao <keith.zhao@starfivetech.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
<dri-devel@lists.freedesktop.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<linux-media@vger.kernel.org>, <linaro-mm-sig@lists.linaro.org>
Cc: David Airlie <airlied@gmail.com>, Daniel Vetter <daniel@ffwll.ch>,
"Rob Herring" <robh+dt@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Conor Dooley <conor+dt@kernel.org>,
"Emil Renner Berthing" <kernel@esmil.dk>,
Paul Walmsley <paul.walmsley@sifive.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Albert Ou <aou@eecs.berkeley.edu>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Philipp Zabel <p.zabel@pengutronix.de>,
Sumit Semwal <sumit.semwal@linaro.org>,
<christian.koenig@amd.com>,
Bjorn Andersson <andersson@kernel.org>,
Heiko Stuebner <heiko@sntech.de>, Shawn Guo <shawnguo@kernel.org>,
Jagan Teki <jagan@edgeble.ai>,
Chris Morgan <macromorgan@hotmail.com>,
Jack Zhu <jack.zhu@starfivetech.com>,
"Shengyang Chen" <shengyang.chen@starfivetech.com>,
Changhuang Liang <changhuang.liang@starfivetech.com>
Subject: Re: [PATCH 5/9] drm/verisilicon: Add mode config funcs
Date: Fri, 21 Jul 2023 17:06:32 +0800 [thread overview]
Message-ID: <af5422e8-c14b-c47c-e699-884ec65bf87f@starfivetech.com> (raw)
In-Reply-To: <30008535-8606-fc6d-9c07-23d46f59c957@suse.de>
On 2023/6/21 19:04, Thomas Zimmermann wrote:
> Hi Keith
>
> Am 02.06.23 um 09:40 schrieb Keith Zhao:
>> Add mode setting functions for JH7110 SoC.
>>
>> Signed-off-by: Keith Zhao <keith.zhao@starfivetech.com>
>> ---
>> drivers/gpu/drm/verisilicon/Makefile | 1 +
>> drivers/gpu/drm/verisilicon/vs_drv.c | 3 +
>
>> drivers/gpu/drm/verisilicon/vs_fb.c | 181 +++++++++++++++++++++++++++
>> drivers/gpu/drm/verisilicon/vs_fb.h | 15 +++
>
> I'd call these files vs_modeset.{c,h} to be consistent with the rest of the drivers.
>
>> 4 files changed, 200 insertions(+)
>> create mode 100644 drivers/gpu/drm/verisilicon/vs_fb.c
>> create mode 100644 drivers/gpu/drm/verisilicon/vs_fb.h
>>
>> diff --git a/drivers/gpu/drm/verisilicon/Makefile b/drivers/gpu/drm/verisilicon/Makefile
>> index 30360e370e47..38254dc5d98d 100644
>> --- a/drivers/gpu/drm/verisilicon/Makefile
>> +++ b/drivers/gpu/drm/verisilicon/Makefile
>> @@ -1,6 +1,7 @@
>> # SPDX-License-Identifier: GPL-2.0
>> vs_drm-objs := vs_drv.o \
>> + vs_fb.o \
>> vs_gem.o
>> obj-$(CONFIG_DRM_VERISILICON) += vs_drm.o
>> diff --git a/drivers/gpu/drm/verisilicon/vs_drv.c b/drivers/gpu/drm/verisilicon/vs_drv.c
>> index e0a2fc43b55f..d84aacd751bc 100644
>> --- a/drivers/gpu/drm/verisilicon/vs_drv.c
>> +++ b/drivers/gpu/drm/verisilicon/vs_drv.c
>> @@ -30,6 +30,7 @@
>> #include <drm/drm_vblank.h>
>> #include "vs_drv.h"
>> +#include "vs_fb.h"
>> #include "vs_gem.h"
>> #define DRV_NAME "starfive"
>> @@ -118,6 +119,8 @@ static int vs_drm_bind(struct device *dev)
>> if (ret)
>> goto err_mode;
>> + vs_mode_config_init(drm_dev);
>> +
>> ret = drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc);
>> if (ret)
>> goto err_bind;
>> diff --git a/drivers/gpu/drm/verisilicon/vs_fb.c b/drivers/gpu/drm/verisilicon/vs_fb.c
>> new file mode 100644
>> index 000000000000..3e85f7365084
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/vs_fb.c
>> @@ -0,0 +1,181 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>> + */
>> +
>> +#include <linux/module.h>
>> +#include <linux/version.h>
>> +
>> +#include <drm/drm_damage_helper.h>
>> +#include <drm/drm_fb_helper.h>
>> +#include <drm/drm_crtc.h>
>> +#include <drm/drm_crtc_helper.h>
>> +#include <drm/drm_fourcc.h>
>> +#include <drm/drm_framebuffer.h>
>> +#include <drm/drm_gem.h>
>> +#include <drm/drm_gem_framebuffer_helper.h>
>> +
>> +#include "vs_fb.h"
>> +#include "vs_gem.h"
>> +
>> +#define fourcc_mod_vs_get_type(val) \
>> + (((val) & DRM_FORMAT_MOD_VS_TYPE_MASK) >> 54)
>> +
>> +static struct drm_framebuffer_funcs vs_fb_funcs = {
>> + .create_handle = drm_gem_fb_create_handle,
>> + .destroy = drm_gem_fb_destroy,
>> + .dirty = drm_atomic_helper_dirtyfb,
>> +};
>> +
>> +static struct drm_framebuffer *
>> +vs_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
>> + struct vs_gem_object **obj, unsigned int num_planes)
>> +{
>> + struct drm_framebuffer *fb;
>> + int ret, i;
>> +
>> + fb = kzalloc(sizeof(*fb), GFP_KERNEL);
>> + if (!fb)
>> + return ERR_PTR(-ENOMEM);
>> +
>> + drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
>> +
>> + for (i = 0; i < num_planes; i++)
>> + fb->obj[i] = &obj[i]->base;
>> +
>> + ret = drm_framebuffer_init(dev, fb, &vs_fb_funcs);
>> + if (ret) {
>> + dev_err(dev->dev, "Failed to initialize framebuffer: %d\n",
>> + ret);
>> + kfree(fb);
>> + return ERR_PTR(ret);
>> + }
>> +
>> + return fb;
>> +}
>> +
>> +static struct drm_framebuffer *vs_fb_create(struct drm_device *dev,
>> + struct drm_file *file_priv,
>> + const struct drm_mode_fb_cmd2 *mode_cmd)
>> +{
>> + struct drm_framebuffer *fb;
>> + const struct drm_format_info *info;
>> + struct vs_gem_object *objs[MAX_NUM_PLANES];
>> + struct drm_gem_object *obj;
>> + unsigned int height, size;
>> + unsigned char i, num_planes;
>> + int ret = 0;
>> +
>> + info = drm_get_format_info(dev, mode_cmd);
>> + if (!info)
>> + return ERR_PTR(-EINVAL);
>> +
>> + num_planes = info->num_planes;
>> + if (num_planes > MAX_NUM_PLANES)
>> + return ERR_PTR(-EINVAL);
>> +
>> + for (i = 0; i < num_planes; i++) {
>> + obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
>> + if (!obj) {
>> + dev_err(dev->dev, "Failed to lookup GEM object.\n");
>> + ret = -ENXIO;
>> + goto err;
>> + }
>> +
>> + height = drm_format_info_plane_height(info,
>> + mode_cmd->height, i);
>> +
>> + size = height * mode_cmd->pitches[i] + mode_cmd->offsets[i];
>> +
>> + if (obj->size < size) {
>> + drm_gem_object_put(obj);
>> +
>> + ret = -EINVAL;
>> + goto err;
>> + }
>> +
>> + objs[i] = to_vs_gem_object(obj);
>> + }
>> +
>> + fb = vs_fb_alloc(dev, mode_cmd, objs, i);
>> + if (IS_ERR(fb)) {
>> + ret = PTR_ERR(fb);
>> + goto err;
>> + }
>> +
>> + return fb;
>> +
>> +err:
>> + for (; i > 0; i--)
>> + drm_gem_object_put(&objs[i - 1]->base);
>> +
>> + return ERR_PTR(ret);
>> +}
>> +
>> +struct vs_gem_object *vs_fb_get_gem_obj(struct drm_framebuffer *fb,
>> + unsigned char plane)
>> +{
>> + if (plane > MAX_NUM_PLANES)
>> + return NULL;
>> +
>> + return to_vs_gem_object(fb->obj[plane]);
>> +}
>> +
>> +static const struct drm_format_info vs_formats[] = {
>> + {.format = DRM_FORMAT_NV12, .depth = 0, .num_planes = 2, .char_per_block = { 20, 40, 0 },
>> + .block_w = { 4, 4, 0 }, .block_h = { 4, 4, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true},
>> + {.format = DRM_FORMAT_YUV444, .depth = 0, .num_planes = 3, .char_per_block = { 20, 20, 20 },
>> + .block_w = { 4, 4, 4 }, .block_h = { 4, 4, 4 }, .hsub = 1, .vsub = 1, .is_yuv = true},
>> +};
>> +
>> +static const struct drm_format_info *
>> +vs_lookup_format_info(const struct drm_format_info formats[],
>> + int num_formats, u32 format)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < num_formats; i++) {
>> + if (formats[i].format == format)
>> + return &formats[i];
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> +static const struct drm_format_info *
>> +vs_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
>> +{
>> + if (fourcc_mod_vs_get_type(cmd->modifier[0]) ==
>> + DRM_FORMAT_MOD_VS_TYPE_CUSTOM_10BIT)
>> + return vs_lookup_format_info(vs_formats, ARRAY_SIZE(vs_formats),
>> + cmd->pixel_format);
>> + else
>> + return NULL;
>> +}
>> +
>> +static const struct drm_mode_config_funcs vs_mode_config_funcs = {
>> + .fb_create = vs_fb_create,
>
> Maybe I'm missing something here, but it looks like you can call
> drm_gem_fb_create_with_funcs() to create the framebuffer.
>
That's a brilliant suggestion!!!
>> + .get_format_info = vs_get_format_info,
>> + .output_poll_changed = drm_fb_helper_output_poll_changed,
>> + .atomic_check = drm_atomic_helper_check,
>> + .atomic_commit = drm_atomic_helper_commit,
>> +};
>> +
>> +static struct drm_mode_config_helper_funcs vs_mode_config_helpers = {
>> + .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
>> +};
>> +
>> +void vs_mode_config_init(struct drm_device *dev)
>> +{
>
> If possible, move the call to drm_mode_config_init() into this function.
>
move drm_mode_config_init() into vs_mode_config_init.
and vs_mode_config_init must be called ahead component_bind_all
like this:
static int vs_drm_bind(struct device *dev)
{
......
vs_mode_config_init(drm_dev);
/* Now try and bind all our sub-components */
ret = component_bind_all(dev, drm_dev);
if (ret)
goto err_mode;
......
}
>> + dev->mode_config.fb_modifiers_not_supported = false;
>> +
>> + if (dev->mode_config.max_width == 0 ||
>> + dev->mode_config.max_height == 0) {
>> + dev->mode_config.min_width = 0;
>> + dev->mode_config.min_height = 0;
>> + dev->mode_config.max_width = 4096;
>> + dev->mode_config.max_height = 4096;
>> + }
>> + dev->mode_config.funcs = &vs_mode_config_funcs;
>> + dev->mode_config.helper_private = &vs_mode_config_helpers;
>> +}
>> diff --git a/drivers/gpu/drm/verisilicon/vs_fb.h b/drivers/gpu/drm/verisilicon/vs_fb.h
>> new file mode 100644
>> index 000000000000..78dda8e42894
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/vs_fb.h
>> @@ -0,0 +1,15 @@
>> +/* SPDX-License-Identifier: GPL-2.0 */
>> +/*
>> + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>> + */
>> +
>> +#ifndef __VS_FB_H__
>> +#define __VS_FB_H__
>> +
>> +#define MAX_NUM_PLANES 3 /* colour format plane */
>
> There's DRM_FORMAT_MAX_PLANES already. Please don't introduce a constant with the same purpose.
>
ok good idea!
> Best regards
> Thomas
>
>> +
>> +struct vs_gem_object *vs_fb_get_gem_obj(struct drm_framebuffer *fb,
>> + unsigned char plane);
>> +
>> +void vs_mode_config_init(struct drm_device *dev);
>> +#endif /* __VS_FB_H__ */
>
WARNING: multiple messages have this Message-ID (diff)
From: Keith Zhao <keith.zhao@starfivetech.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
<dri-devel@lists.freedesktop.org>, <devicetree@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-riscv@lists.infradead.org>,
<linux-media@vger.kernel.org>, <linaro-mm-sig@lists.linaro.org>
Cc: Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Sumit Semwal <sumit.semwal@linaro.org>,
Emil Renner Berthing <kernel@esmil.dk>,
Shengyang Chen <shengyang.chen@starfivetech.com>,
Conor Dooley <conor+dt@kernel.org>,
Albert Ou <aou@eecs.berkeley.edu>,
Maxime Ripard <mripard@kernel.org>, Jagan Teki <jagan@edgeble.ai>,
Rob Herring <robh+dt@kernel.org>,
Chris Morgan <macromorgan@hotmail.com>,
Paul Walmsley <paul.walmsley@sifive.com>,
Bjorn Andersson <andersson@kernel.org>,
Changhuang Liang <changhuang.liang@starfivetech.com>,
Jack Zhu <jack.zhu@starfivetech.com>,
Palmer Dabbelt <palmer@dabbelt.com>,
Shawn Guo <shawnguo@kernel.org>,
christian.koenig@amd.com
Subject: Re: [PATCH 5/9] drm/verisilicon: Add mode config funcs
Date: Fri, 21 Jul 2023 17:06:32 +0800 [thread overview]
Message-ID: <af5422e8-c14b-c47c-e699-884ec65bf87f@starfivetech.com> (raw)
In-Reply-To: <30008535-8606-fc6d-9c07-23d46f59c957@suse.de>
On 2023/6/21 19:04, Thomas Zimmermann wrote:
> Hi Keith
>
> Am 02.06.23 um 09:40 schrieb Keith Zhao:
>> Add mode setting functions for JH7110 SoC.
>>
>> Signed-off-by: Keith Zhao <keith.zhao@starfivetech.com>
>> ---
>> drivers/gpu/drm/verisilicon/Makefile | 1 +
>> drivers/gpu/drm/verisilicon/vs_drv.c | 3 +
>
>> drivers/gpu/drm/verisilicon/vs_fb.c | 181 +++++++++++++++++++++++++++
>> drivers/gpu/drm/verisilicon/vs_fb.h | 15 +++
>
> I'd call these files vs_modeset.{c,h} to be consistent with the rest of the drivers.
>
>> 4 files changed, 200 insertions(+)
>> create mode 100644 drivers/gpu/drm/verisilicon/vs_fb.c
>> create mode 100644 drivers/gpu/drm/verisilicon/vs_fb.h
>>
>> diff --git a/drivers/gpu/drm/verisilicon/Makefile b/drivers/gpu/drm/verisilicon/Makefile
>> index 30360e370e47..38254dc5d98d 100644
>> --- a/drivers/gpu/drm/verisilicon/Makefile
>> +++ b/drivers/gpu/drm/verisilicon/Makefile
>> @@ -1,6 +1,7 @@
>> # SPDX-License-Identifier: GPL-2.0
>> vs_drm-objs := vs_drv.o \
>> + vs_fb.o \
>> vs_gem.o
>> obj-$(CONFIG_DRM_VERISILICON) += vs_drm.o
>> diff --git a/drivers/gpu/drm/verisilicon/vs_drv.c b/drivers/gpu/drm/verisilicon/vs_drv.c
>> index e0a2fc43b55f..d84aacd751bc 100644
>> --- a/drivers/gpu/drm/verisilicon/vs_drv.c
>> +++ b/drivers/gpu/drm/verisilicon/vs_drv.c
>> @@ -30,6 +30,7 @@
>> #include <drm/drm_vblank.h>
>> #include "vs_drv.h"
>> +#include "vs_fb.h"
>> #include "vs_gem.h"
>> #define DRV_NAME "starfive"
>> @@ -118,6 +119,8 @@ static int vs_drm_bind(struct device *dev)
>> if (ret)
>> goto err_mode;
>> + vs_mode_config_init(drm_dev);
>> +
>> ret = drm_vblank_init(drm_dev, drm_dev->mode_config.num_crtc);
>> if (ret)
>> goto err_bind;
>> diff --git a/drivers/gpu/drm/verisilicon/vs_fb.c b/drivers/gpu/drm/verisilicon/vs_fb.c
>> new file mode 100644
>> index 000000000000..3e85f7365084
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/vs_fb.c
>> @@ -0,0 +1,181 @@
>> +// SPDX-License-Identifier: GPL-2.0
>> +/*
>> + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>> + */
>> +
>> +#include <linux/module.h>
>> +#include <linux/version.h>
>> +
>> +#include <drm/drm_damage_helper.h>
>> +#include <drm/drm_fb_helper.h>
>> +#include <drm/drm_crtc.h>
>> +#include <drm/drm_crtc_helper.h>
>> +#include <drm/drm_fourcc.h>
>> +#include <drm/drm_framebuffer.h>
>> +#include <drm/drm_gem.h>
>> +#include <drm/drm_gem_framebuffer_helper.h>
>> +
>> +#include "vs_fb.h"
>> +#include "vs_gem.h"
>> +
>> +#define fourcc_mod_vs_get_type(val) \
>> + (((val) & DRM_FORMAT_MOD_VS_TYPE_MASK) >> 54)
>> +
>> +static struct drm_framebuffer_funcs vs_fb_funcs = {
>> + .create_handle = drm_gem_fb_create_handle,
>> + .destroy = drm_gem_fb_destroy,
>> + .dirty = drm_atomic_helper_dirtyfb,
>> +};
>> +
>> +static struct drm_framebuffer *
>> +vs_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
>> + struct vs_gem_object **obj, unsigned int num_planes)
>> +{
>> + struct drm_framebuffer *fb;
>> + int ret, i;
>> +
>> + fb = kzalloc(sizeof(*fb), GFP_KERNEL);
>> + if (!fb)
>> + return ERR_PTR(-ENOMEM);
>> +
>> + drm_helper_mode_fill_fb_struct(dev, fb, mode_cmd);
>> +
>> + for (i = 0; i < num_planes; i++)
>> + fb->obj[i] = &obj[i]->base;
>> +
>> + ret = drm_framebuffer_init(dev, fb, &vs_fb_funcs);
>> + if (ret) {
>> + dev_err(dev->dev, "Failed to initialize framebuffer: %d\n",
>> + ret);
>> + kfree(fb);
>> + return ERR_PTR(ret);
>> + }
>> +
>> + return fb;
>> +}
>> +
>> +static struct drm_framebuffer *vs_fb_create(struct drm_device *dev,
>> + struct drm_file *file_priv,
>> + const struct drm_mode_fb_cmd2 *mode_cmd)
>> +{
>> + struct drm_framebuffer *fb;
>> + const struct drm_format_info *info;
>> + struct vs_gem_object *objs[MAX_NUM_PLANES];
>> + struct drm_gem_object *obj;
>> + unsigned int height, size;
>> + unsigned char i, num_planes;
>> + int ret = 0;
>> +
>> + info = drm_get_format_info(dev, mode_cmd);
>> + if (!info)
>> + return ERR_PTR(-EINVAL);
>> +
>> + num_planes = info->num_planes;
>> + if (num_planes > MAX_NUM_PLANES)
>> + return ERR_PTR(-EINVAL);
>> +
>> + for (i = 0; i < num_planes; i++) {
>> + obj = drm_gem_object_lookup(file_priv, mode_cmd->handles[i]);
>> + if (!obj) {
>> + dev_err(dev->dev, "Failed to lookup GEM object.\n");
>> + ret = -ENXIO;
>> + goto err;
>> + }
>> +
>> + height = drm_format_info_plane_height(info,
>> + mode_cmd->height, i);
>> +
>> + size = height * mode_cmd->pitches[i] + mode_cmd->offsets[i];
>> +
>> + if (obj->size < size) {
>> + drm_gem_object_put(obj);
>> +
>> + ret = -EINVAL;
>> + goto err;
>> + }
>> +
>> + objs[i] = to_vs_gem_object(obj);
>> + }
>> +
>> + fb = vs_fb_alloc(dev, mode_cmd, objs, i);
>> + if (IS_ERR(fb)) {
>> + ret = PTR_ERR(fb);
>> + goto err;
>> + }
>> +
>> + return fb;
>> +
>> +err:
>> + for (; i > 0; i--)
>> + drm_gem_object_put(&objs[i - 1]->base);
>> +
>> + return ERR_PTR(ret);
>> +}
>> +
>> +struct vs_gem_object *vs_fb_get_gem_obj(struct drm_framebuffer *fb,
>> + unsigned char plane)
>> +{
>> + if (plane > MAX_NUM_PLANES)
>> + return NULL;
>> +
>> + return to_vs_gem_object(fb->obj[plane]);
>> +}
>> +
>> +static const struct drm_format_info vs_formats[] = {
>> + {.format = DRM_FORMAT_NV12, .depth = 0, .num_planes = 2, .char_per_block = { 20, 40, 0 },
>> + .block_w = { 4, 4, 0 }, .block_h = { 4, 4, 0 }, .hsub = 2, .vsub = 2, .is_yuv = true},
>> + {.format = DRM_FORMAT_YUV444, .depth = 0, .num_planes = 3, .char_per_block = { 20, 20, 20 },
>> + .block_w = { 4, 4, 4 }, .block_h = { 4, 4, 4 }, .hsub = 1, .vsub = 1, .is_yuv = true},
>> +};
>> +
>> +static const struct drm_format_info *
>> +vs_lookup_format_info(const struct drm_format_info formats[],
>> + int num_formats, u32 format)
>> +{
>> + int i;
>> +
>> + for (i = 0; i < num_formats; i++) {
>> + if (formats[i].format == format)
>> + return &formats[i];
>> + }
>> +
>> + return NULL;
>> +}
>> +
>> +static const struct drm_format_info *
>> +vs_get_format_info(const struct drm_mode_fb_cmd2 *cmd)
>> +{
>> + if (fourcc_mod_vs_get_type(cmd->modifier[0]) ==
>> + DRM_FORMAT_MOD_VS_TYPE_CUSTOM_10BIT)
>> + return vs_lookup_format_info(vs_formats, ARRAY_SIZE(vs_formats),
>> + cmd->pixel_format);
>> + else
>> + return NULL;
>> +}
>> +
>> +static const struct drm_mode_config_funcs vs_mode_config_funcs = {
>> + .fb_create = vs_fb_create,
>
> Maybe I'm missing something here, but it looks like you can call
> drm_gem_fb_create_with_funcs() to create the framebuffer.
>
That's a brilliant suggestion!!!
>> + .get_format_info = vs_get_format_info,
>> + .output_poll_changed = drm_fb_helper_output_poll_changed,
>> + .atomic_check = drm_atomic_helper_check,
>> + .atomic_commit = drm_atomic_helper_commit,
>> +};
>> +
>> +static struct drm_mode_config_helper_funcs vs_mode_config_helpers = {
>> + .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
>> +};
>> +
>> +void vs_mode_config_init(struct drm_device *dev)
>> +{
>
> If possible, move the call to drm_mode_config_init() into this function.
>
move drm_mode_config_init() into vs_mode_config_init.
and vs_mode_config_init must be called ahead component_bind_all
like this:
static int vs_drm_bind(struct device *dev)
{
......
vs_mode_config_init(drm_dev);
/* Now try and bind all our sub-components */
ret = component_bind_all(dev, drm_dev);
if (ret)
goto err_mode;
......
}
>> + dev->mode_config.fb_modifiers_not_supported = false;
>> +
>> + if (dev->mode_config.max_width == 0 ||
>> + dev->mode_config.max_height == 0) {
>> + dev->mode_config.min_width = 0;
>> + dev->mode_config.min_height = 0;
>> + dev->mode_config.max_width = 4096;
>> + dev->mode_config.max_height = 4096;
>> + }
>> + dev->mode_config.funcs = &vs_mode_config_funcs;
>> + dev->mode_config.helper_private = &vs_mode_config_helpers;
>> +}
>> diff --git a/drivers/gpu/drm/verisilicon/vs_fb.h b/drivers/gpu/drm/verisilicon/vs_fb.h
>> new file mode 100644
>> index 000000000000..78dda8e42894
>> --- /dev/null
>> +++ b/drivers/gpu/drm/verisilicon/vs_fb.h
>> @@ -0,0 +1,15 @@
>> +/* SPDX-License-Identifier: GPL-2.0 */
>> +/*
>> + * Copyright (C) 2023 VeriSilicon Holdings Co., Ltd.
>> + */
>> +
>> +#ifndef __VS_FB_H__
>> +#define __VS_FB_H__
>> +
>> +#define MAX_NUM_PLANES 3 /* colour format plane */
>
> There's DRM_FORMAT_MAX_PLANES already. Please don't introduce a constant with the same purpose.
>
ok good idea!
> Best regards
> Thomas
>
>> +
>> +struct vs_gem_object *vs_fb_get_gem_obj(struct drm_framebuffer *fb,
>> + unsigned char plane);
>> +
>> +void vs_mode_config_init(struct drm_device *dev);
>> +#endif /* __VS_FB_H__ */
>
next prev parent reply other threads:[~2023-07-21 9:07 UTC|newest]
Thread overview: 136+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-02 7:40 [PATCH 0/9] Add DRM driver for StarFive SoC JH7110 Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` [PATCH 1/9] dt-bindings: display: Add yamls for JH7110 display subsystem Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 18:21 ` Conor Dooley
2023-06-02 18:21 ` Conor Dooley
2023-06-02 18:21 ` Conor Dooley
2023-06-06 18:41 ` Shengyu Qu
2023-06-06 18:41 ` Shengyu Qu
2023-06-06 18:41 ` Shengyu Qu
2023-06-06 22:22 ` Heiko Stübner
2023-06-06 22:22 ` Heiko Stübner
2023-06-06 22:22 ` Heiko Stübner
2023-06-06 22:37 ` Conor Dooley
2023-06-06 22:37 ` Conor Dooley
2023-06-06 22:37 ` Conor Dooley
2023-06-07 6:41 ` Maxime Ripard
2023-06-07 6:41 ` Maxime Ripard
2023-06-07 6:41 ` Maxime Ripard
2023-06-07 8:02 ` Keith Zhao
2023-06-07 8:02 ` Keith Zhao
2023-06-07 8:40 ` Heiko Stübner
2023-06-07 8:40 ` Heiko Stübner
2023-06-07 8:40 ` Heiko Stübner
2023-06-07 7:35 ` Krzysztof Kozlowski
2023-06-07 7:35 ` Krzysztof Kozlowski
2023-06-07 7:35 ` Krzysztof Kozlowski
2023-06-02 7:40 ` [PATCH 2/9] riscv: dts: starfive: jh7110: add dc&hdmi controller node Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-07 7:38 ` Krzysztof Kozlowski
2023-06-07 7:38 ` Krzysztof Kozlowski
2023-06-07 7:38 ` Krzysztof Kozlowski
2023-06-02 7:40 ` [PATCH 3/9] drm/verisilicon: Add basic drm driver Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-07 8:53 ` Lucas Stach
2023-06-07 8:53 ` Lucas Stach
2023-06-07 8:53 ` Lucas Stach
2023-07-25 3:12 ` Keith Zhao
2023-07-25 3:12 ` Keith Zhao
2023-07-25 3:12 ` Keith Zhao
2023-07-25 11:23 ` Keith Zhao
2023-07-25 11:23 ` Keith Zhao
2023-07-25 11:23 ` Keith Zhao
2023-06-19 12:59 ` Thomas Zimmermann
2023-06-19 12:59 ` Thomas Zimmermann
2023-06-19 12:59 ` Thomas Zimmermann
2023-07-07 18:09 ` Nicolas Dufresne
2023-07-07 18:09 ` Nicolas Dufresne
2023-07-07 18:09 ` Nicolas Dufresne
2023-07-08 19:11 ` Thomas Zimmermann
2023-07-08 19:11 ` Thomas Zimmermann
2023-07-08 19:11 ` Thomas Zimmermann
2023-07-13 15:14 ` Nicolas Dufresne
2023-07-13 15:14 ` Nicolas Dufresne
2023-07-13 15:14 ` Nicolas Dufresne
2023-07-03 18:42 ` Shengyu Qu
2023-07-03 18:42 ` Shengyu Qu
2023-07-03 18:42 ` Shengyu Qu
2023-07-04 6:09 ` Keith Zhao
2023-07-04 6:09 ` Keith Zhao
2023-07-04 6:09 ` Keith Zhao
2023-06-02 7:40 ` [PATCH 4/9] drm/verisilicon: Add gem driver for JH7110 SoC Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-19 13:18 ` Thomas Zimmermann
2023-06-19 13:18 ` Thomas Zimmermann
2023-06-19 13:18 ` Thomas Zimmermann
2023-07-20 10:00 ` Keith Zhao
2023-07-20 10:00 ` Keith Zhao
2023-07-20 10:00 ` Keith Zhao
2023-06-19 14:22 ` Thomas Zimmermann
2023-06-19 14:22 ` Thomas Zimmermann
2023-06-19 14:22 ` Thomas Zimmermann
2023-06-21 10:44 ` Thomas Zimmermann
2023-06-21 10:44 ` Thomas Zimmermann
2023-06-21 10:44 ` Thomas Zimmermann
2023-06-02 7:40 ` [PATCH 5/9] drm/verisilicon: Add mode config funcs Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-21 11:04 ` Thomas Zimmermann
2023-06-21 11:04 ` Thomas Zimmermann
2023-06-21 11:04 ` Thomas Zimmermann
2023-07-21 9:06 ` Keith Zhao [this message]
2023-07-21 9:06 ` Keith Zhao
2023-07-21 9:06 ` Keith Zhao
2023-06-02 7:40 ` [PATCH 6/9] drm/verisilicon: Add drm crtc funcs Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-30 11:55 ` Thomas Zimmermann
2023-06-30 11:55 ` Thomas Zimmermann
2023-06-30 11:55 ` Thomas Zimmermann
2023-07-21 11:57 ` Keith Zhao
2023-07-21 11:57 ` Keith Zhao
2023-07-21 11:57 ` Keith Zhao
2023-07-21 12:32 ` Sam Ravnborg
2023-07-21 12:32 ` Sam Ravnborg
2023-07-21 12:32 ` Sam Ravnborg
2023-06-02 7:40 ` [PATCH 7/9] drm/verisilicon: Add drm plane funcs Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-30 12:14 ` Thomas Zimmermann
2023-06-30 12:14 ` Thomas Zimmermann
2023-06-30 12:14 ` Thomas Zimmermann
2023-07-10 16:46 ` Shengyu Qu
2023-07-10 16:46 ` Shengyu Qu
2023-07-10 16:46 ` Shengyu Qu
2023-07-11 1:44 ` Keith Zhao
2023-07-11 1:44 ` Keith Zhao
2023-07-11 1:44 ` Keith Zhao
2023-06-02 7:40 ` [PATCH 8/9] drm/verisilicon: Add verisilicon dc controller driver Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-30 12:36 ` Thomas Zimmermann
2023-06-30 12:36 ` Thomas Zimmermann
2023-06-30 12:36 ` Thomas Zimmermann
2023-06-02 7:40 ` [PATCH 9/9] drm/verisilicon: Add starfive hdmi driver Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-02 7:40 ` Keith Zhao
2023-06-05 8:08 ` Philipp Zabel
2023-06-05 8:08 ` Philipp Zabel
2023-06-05 8:08 ` Philipp Zabel
2023-06-05 9:56 ` Maxime Ripard
2023-06-05 9:56 ` Maxime Ripard
2023-06-05 9:56 ` Maxime Ripard
2023-06-23 2:38 ` Hoegeun Kwon
2023-06-23 2:38 ` Hoegeun Kwon
2023-06-23 2:38 ` Hoegeun Kwon
2023-06-26 5:34 ` Keith Zhao
2023-06-26 5:34 ` Keith Zhao
2023-06-22 18:19 ` [PATCH 0/9] Add DRM driver for StarFive SoC JH7110 Palmer Dabbelt
2023-06-22 18:19 ` Palmer Dabbelt
2023-06-22 18:19 ` Palmer Dabbelt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=af5422e8-c14b-c47c-e699-884ec65bf87f@starfivetech.com \
--to=keith.zhao@starfivetech.com \
--cc=airlied@gmail.com \
--cc=andersson@kernel.org \
--cc=aou@eecs.berkeley.edu \
--cc=changhuang.liang@starfivetech.com \
--cc=christian.koenig@amd.com \
--cc=conor+dt@kernel.org \
--cc=daniel@ffwll.ch \
--cc=devicetree@vger.kernel.org \
--cc=dri-devel@lists.freedesktop.org \
--cc=heiko@sntech.de \
--cc=jack.zhu@starfivetech.com \
--cc=jagan@edgeble.ai \
--cc=kernel@esmil.dk \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=macromorgan@hotmail.com \
--cc=mripard@kernel.org \
--cc=p.zabel@pengutronix.de \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=robh+dt@kernel.org \
--cc=shawnguo@kernel.org \
--cc=shengyang.chen@starfivetech.com \
--cc=sumit.semwal@linaro.org \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.