From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 7D04BEB64DC for ; Sun, 25 Jun 2023 09:26:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7A6B910E152; Sun, 25 Jun 2023 09:26:21 +0000 (UTC) Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by gabe.freedesktop.org (Postfix) with ESMTP id E8D8010E10A for ; Sun, 25 Jun 2023 07:56:47 +0000 (UTC) Received: from loongson.cn (unknown [10.20.42.72]) by gateway (Coremail) with SMTP id _____8Bx2cU885dk0X8BAA--.2311S3; Sun, 25 Jun 2023 15:56:44 +0800 (CST) Received: from [10.20.42.72] (unknown [10.20.42.72]) by localhost.localdomain (Coremail) with SMTP id AQAAf8BxSM0485dkxpAGAA--.3850S2; Sun, 25 Jun 2023 15:56:40 +0800 (CST) Subject: Re: [PATCH v15 1/2] drm: Add kms driver for loongson display controller To: Sui Jingfeng <15330273260@189.cn>, Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Sumit Semwal , Sui Jingfeng , Christian Koenig References: <20230615143613.1236245-1-15330273260@189.cn> <20230615143613.1236245-2-15330273260@189.cn> From: liyi Message-ID: <876700a9-a9e5-4f85-477a-88b8c85947c8@loongson.cn> Date: Sun, 25 Jun 2023 15:56:40 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.3.0 MIME-Version: 1.0 In-Reply-To: <20230615143613.1236245-2-15330273260@189.cn> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: uk-UA X-CM-TRANSID: AQAAf8BxSM0485dkxpAGAA--.3850S2 X-CM-SenderInfo: pol1xqxorr0wxvrqhubq/ X-Coremail-Antispam: 1Uk129KBj9DXoWkCw4UZw17KF1kury5ur17Arc_yoW8Zw18Jr c_uFy2vF4kGwn8AF1Fqw1UCw12qas3Gr97XFs8XFWIqFZ7AwnrXa48CrWrXr1xuFWUuw18 tF9xJ34kGFy2y3Z2gosvyTuYvTs0mTUanT9S1TB71UUUUjJqnTZGkaVYY2UrUUUUj1kv1T uYvTs0mT0YCTnIWjqI5I8CrVACY4xI64kE6c02F40Ex7xfYxn0WfASr-VFAUDa7-sFnT9f nUUIcSsGvfJTRUUUbqxYFVCjjxCrM7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4 v20xvaj40_Wr0E3s1l1IIY67AEw4v_Jrv_JF1l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0 rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVW8JVW5JwA2z4x0Y4vE2Ix0cI8IcVCY1x0267 AKxVW8JVWxJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E 14v26r4UJVWxJr1ln4kS14v26r126r1DM2AIxVAIcxkEcVAq07x20xvEncxIr21l57IF6x kI12xvs2x26I8E6xACxx1l5I8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v2 6r126r1DMcIj6I8E87Iv67AKxVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IY64 vIr41lc7I2V7IY0VAS07AlzVAYIcxG8wCY1x0262kKe7AKxVWUAVWUtwCF04k20xvY0x0E wIxGrwCFx2IqxVCFs4IE7xkEbVWUJVW8JwCFI7km07C267AKxVWUAVWUtwC20s026c02F4 0E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67kF1VAFwI0_GFv_Wryl IxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI42IY6xIIjxv20xvEc7CjxV AFwI0_Jr0_Gr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0xvEx4A2jsIE14v26r1j 6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Jr0_GrUvcSsGvfC2KfnxnUUI43ZEXa7IU8Dl1D UUUUU== X-Mailman-Approved-At: Sun, 25 Jun 2023 09:26:15 +0000 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nathan Chancellor , inux-kernel@vger.kernel.org, Geert Uytterhoeven , Emil Velikov , dri-devel@lists.freedesktop.org, loongson-kernel@lists.loongnix.cn, Liu Peibao , linux-media@vger.kernel.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" The patch is tested  on  3A5000 + 7A2000 board ,  it looks  works good. Tested-by: Li Yi  > From: Sui Jingfeng > > Loongson display controller IP has been integrated in both Loongson north > bridge chipset (ls7a1000/ls7a2000) and Loongson SoCs (ls2k1000/ls2k2000). > It has even been included in Loongson's BMC products. It has two display > pipes, and each display pipe supports a primary plane and a cursor plane. > > For the DC in the LS7a1000, each display pipe has a DVO output interface, > which is able to support 1920x1080@60Hz. For the DC in the LS7A2000, each > display pipe is equipped with a built-in HDMI encoder, which is compliant > with the HDMI 1.4 specification. The first display pipe is also equipped > with a transparent VGA encoder, which is parallel with the HDMI encoder. > To get a decent performance for writing framebuffer data to the VRAM, the > write combine support should be enabled. > > v1 -> v2: > 1) Use hpd status reg when polling for ls7a2000. > 2) Fix all warnings that emerged when compiling with W=1. > > v2 -> v3: > 1) Add COMPILE_TEST to Kconfig and make the driver off by default > 2) Alphabetical sorting headers (Thomas) > 3) Untangle register access functions as much as possible (Thomas) > 4) Switch to TTM-based memory manager (Thomas) > 5) Add the chip ID detection function which can be used to distinguish > chip models > 6) Revise the built-in HDMI phy driver, nearly all main stream mode below > 4K@30Hz is tested, and this driver supports clone(mirror) display mode > and extend(joint) display mode. > > v3 -> v4: > 1) Quickly fix a small mistake. > > v4 -> v5: > 1) Add per display pipe debugfs support to the builtin HDMI encoder. > > v5 -> v6: > 1) Remove stray code which didn't get used, say lsdc_of_get_reserved_ram > 2) Fix all typos I could found, make sentences and code more readable > 3) Untangle lsdc_hdmi*_connector_detect() function according to the pipe > 4) Rename this driver as loongson. > > v6 -> v7: > 1) Add prime support for buffer self-sharing, sharing buffer with > drm/etnaviv is also tested and it works with limitations. > 2) Implement buffer object tracking with list_head. > 3) Add S3(sleep to RAM) support > 4) Rewrite lsdc_bo_move since TTM core stop allocating resources >     during BO creation. Patch V1 ~ V6 of this series no longer work. >     Thus, we send V7. > > v7 -> v8: >  1) Zero a compile warning on a 32-bit platform, compile with W=1 >  2) Revise lsdc_bo_gpu_offset() and make minor cleanups. >  3) Pageflip tested on the virtual terminal with the following commands: > > modetest -M loongson -s 32:1920x1080 -v > modetest -M loongson -s 34:1920x1080 -v -F tiles > > It works like a charm, when running the pageflip test with dual screens > configuration, another two additional BOs were created by the modetest, > VRAM usage up to 40+ MB, well we have at least 64MB, still enough. > > # cat bos > > bo[0000]: size: 8112kB VRAM > bo[0001]: size: 16kB VRAM > bo[0002]: size: 16kB VRAM > bo[0003]: size: 16208kB VRAM > bo[0004]: size: 8112kB VRAM > bo[0005]: size: 8112kB VRAM > > v8 -> v9: > 1) Select I2C and I2C_ALGOBIT in Kconfig, should depend on MMU. > 2) Using pci_get_domain_bus_and_slot to get the GPU device. > > v9 -> v10: > 1) Revise lsdc_drm_freeze() to implement S3 correctly. We realized that > the pinned BO could not be moved, the VRAM lost power when sleeping > to RAM. Thus, the data in the buffer who is pinned in VRAM will get > lost when resumed. Yet it's not a big problem because this driver > relies on the CPU to update the front framebuffer. We can see the > garbage data when resume from S3, but the screen will show the right > image as I move the cursor. This is due to the CPU repaint. v10 of > this patch makes S3 perfect by unpin all of the BOs in VRAM, evict > them all to system RAM in lsdc_drm_freeze(). > > v10 -> v11: > 1) On a double-screen case, The buffer object backing the single giant > framebuffer is referenced by two GEM objects; hence, it will be > pinned at least twice by prepare_fb() function. This causes its pin > count > 1. V10 of this patch only unpins VRAM BOs once when suspend, > which is not correct on double-screen case. V11 of this patch unpin > the BOs until its pin count reaches zero when suspend. Then, we make > the S3 support complete finally. With v11, I can't see any garbage > data when resume. > > 2) Fix vblank wait timeout when disable CRTC. > 3) Test against IGT, at least fbdev test and kms_flip test passed. > 4) Rewrite pixel PLL update function, magic numbers eliminated (Emil) > 5) Drop a few common hardware features description in lsdc_desc (Emil) > 6) Drop lsdc_mode_config_mode_valid(), instead add restrictions in dumb > create function. (Emil) > 7) Untangle the ls7a1000 case and ls7a2000 case completely (Thomas) > > v11 -> v12: > none > > v12 -> v13: > 1) Add benchmarks to figure out the bandwidth of the hardware platform. > Usage: > # cd /sys/kernel/debug/dri/0/ > # cat benchmark > > 2) VRAM is filled with garbage data if uninitialized, add a buffer > clearing procedure (lsdc_bo_clear), clear the BO on creation time. > 3) Update copyrights and adjust coding style (Huacai) > > v13 -> v14: > 1) Trying to add async update support for cursor plane. > > v14 -> v15: > 1) Add lsdc_vga_set_decode() funciton, which allow us remove multi-video > cards workaround, now it allow drm/loongson, drm/amdgpu, drm/etnaviv > co-exist in the system, more is also possible (Emil and Xuerui) > 2) Fix typos and grammar mistakes as much as possible (Xuerui) > 3) Unify copyrights as GPL-2.0+ (Xuerui) > 4) Fix a bug introduce since V13, TTM may import BO from other drivers, > we shouldn't clear it on such a case. > > Cc: Maarten Lankhorst > Cc: Maxime Ripard > Cc: Thomas Zimmermann > Cc: David Airlie > Cc: Daniel Vetter > Cc: Sumit Semwal > Cc: "Christian König" > Cc: Nathan Chancellor > Cc: Emil Velikov > Cc: Geert Uytterhoeven > Cc: loongson-kernel@lists.loongnix.cn > Tested-by: Liu Peibao > Signed-off-by: Sui Jingfeng > --- > drivers/gpu/drm/Kconfig | 2 + > drivers/gpu/drm/Makefile | 1 + > drivers/gpu/drm/loongson/Kconfig | 17 + > drivers/gpu/drm/loongson/Makefile | 22 + > drivers/gpu/drm/loongson/loongson_device.c | 102 ++ > drivers/gpu/drm/loongson/loongson_module.c | 33 + > drivers/gpu/drm/loongson/loongson_module.h | 12 + > drivers/gpu/drm/loongson/lsdc_benchmark.c | 133 +++ > drivers/gpu/drm/loongson/lsdc_benchmark.h | 13 + > drivers/gpu/drm/loongson/lsdc_crtc.c | 1024 +++++++++++++++++ > drivers/gpu/drm/loongson/lsdc_debugfs.c | 110 ++ > drivers/gpu/drm/loongson/lsdc_drv.c | 458 ++++++++ > drivers/gpu/drm/loongson/lsdc_drv.h | 388 +++++++ > drivers/gpu/drm/loongson/lsdc_gem.c | 311 +++++ > drivers/gpu/drm/loongson/lsdc_gem.h | 37 + > drivers/gpu/drm/loongson/lsdc_gfxpll.c | 199 ++++ > drivers/gpu/drm/loongson/lsdc_gfxpll.h | 52 + > drivers/gpu/drm/loongson/lsdc_i2c.c | 179 +++ > drivers/gpu/drm/loongson/lsdc_i2c.h | 29 + > drivers/gpu/drm/loongson/lsdc_irq.c | 74 ++ > drivers/gpu/drm/loongson/lsdc_irq.h | 16 + > drivers/gpu/drm/loongson/lsdc_output.h | 21 + > drivers/gpu/drm/loongson/lsdc_output_7a1000.c | 178 +++ > drivers/gpu/drm/loongson/lsdc_output_7a2000.c | 552 +++++++++ > drivers/gpu/drm/loongson/lsdc_pixpll.c | 481 ++++++++ > drivers/gpu/drm/loongson/lsdc_pixpll.h | 86 ++ > drivers/gpu/drm/loongson/lsdc_plane.c | 799 +++++++++++++ > drivers/gpu/drm/loongson/lsdc_probe.c | 56 + > drivers/gpu/drm/loongson/lsdc_probe.h | 12 + > drivers/gpu/drm/loongson/lsdc_regs.h | 406 +++++++ > drivers/gpu/drm/loongson/lsdc_ttm.c | 591 ++++++++++ > drivers/gpu/drm/loongson/lsdc_ttm.h | 99 ++ > 32 files changed, 6493 insertions(+) > create mode 100644 drivers/gpu/drm/loongson/Kconfig > create mode 100644 drivers/gpu/drm/loongson/Makefile > create mode 100644 drivers/gpu/drm/loongson/loongson_device.c > create mode 100644 drivers/gpu/drm/loongson/loongson_module.c > create mode 100644 drivers/gpu/drm/loongson/loongson_module.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_benchmark.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_benchmark.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_crtc.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_debugfs.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_drv.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_drv.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_gem.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_gem.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_gfxpll.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_gfxpll.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_i2c.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_i2c.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_irq.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_irq.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_output.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_output_7a1000.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_output_7a2000.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_pixpll.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_pixpll.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_plane.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_probe.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_probe.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_regs.h > create mode 100644 drivers/gpu/drm/loongson/lsdc_ttm.c > create mode 100644 drivers/gpu/drm/loongson/lsdc_ttm.h > > diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig > index afb3b2f5f425..cc9c9947fdef 100644 > --- a/drivers/gpu/drm/Kconfig > +++ b/drivers/gpu/drm/Kconfig > @@ -323,6 +323,8 @@ source "drivers/gpu/drm/v3d/Kconfig" > > source "drivers/gpu/drm/vc4/Kconfig" > > +source "drivers/gpu/drm/loongson/Kconfig" > + > source "drivers/gpu/drm/etnaviv/Kconfig" > > source "drivers/gpu/drm/hisilicon/Kconfig" > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile > index 7a09a89b493b..1c0f5204e47b 100644 > --- a/drivers/gpu/drm/Makefile > +++ b/drivers/gpu/drm/Makefile > @@ -194,3 +194,4 @@ obj-y += gud/ > obj-$(CONFIG_DRM_HYPERV) += hyperv/ > obj-y += solomon/ > obj-$(CONFIG_DRM_SPRD) += sprd/ > +obj-$(CONFIG_DRM_LOONGSON) += loongson/ > diff --git a/drivers/gpu/drm/loongson/Kconfig b/drivers/gpu/drm/loongson/Kconfig > new file mode 100644 > index 000000000000..df6946d505fa > --- /dev/null > +++ b/drivers/gpu/drm/loongson/Kconfig > @@ -0,0 +1,17 @@ > +# SPDX-License-Identifier: GPL-2.0 > + > +config DRM_LOONGSON > + tristate "DRM support for Loongson Graphics" > + depends on DRM && PCI && MMU > + select DRM_KMS_HELPER > + select DRM_TTM > + select I2C > + select I2C_ALGOBIT > + help > + This is a DRM driver for Loongson Graphics, it may including > + LS7A2000, LS7A1000, LS2K2000 and LS2K1000 etc. Loongson LS7A > + series are bridge chipset, while Loongson LS2K series are SoC. > + > + If "M" is selected, the module will be called loongson. > + > + If in doubt, say "N". > diff --git a/drivers/gpu/drm/loongson/Makefile b/drivers/gpu/drm/loongson/Makefile > new file mode 100644 > index 000000000000..91e72bd900c1 > --- /dev/null > +++ b/drivers/gpu/drm/loongson/Makefile > @@ -0,0 +1,22 @@ > +# SPDX-License-Identifier: GPL-2.0 > + > +loongson-y := \ > + lsdc_benchmark.o \ > + lsdc_crtc.o \ > + lsdc_debugfs.o \ > + lsdc_drv.o \ > + lsdc_gem.o \ > + lsdc_gfxpll.o \ > + lsdc_i2c.o \ > + lsdc_irq.o \ > + lsdc_output_7a1000.o \ > + lsdc_output_7a2000.o \ > + lsdc_plane.o \ > + lsdc_pixpll.o \ > + lsdc_probe.o \ > + lsdc_ttm.o > + > +loongson-y += loongson_device.o \ > + loongson_module.o > + > +obj-$(CONFIG_DRM_LOONGSON) += loongson.o > diff --git a/drivers/gpu/drm/loongson/loongson_device.c b/drivers/gpu/drm/loongson/loongson_device.c > new file mode 100644 > index 000000000000..9986c8a2a255 > --- /dev/null > +++ b/drivers/gpu/drm/loongson/loongson_device.c > @@ -0,0 +1,102 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Copyright (C) 2023 Loongson Technology Corporation Limited > + */ > + > +#include > + > +#include "lsdc_drv.h" > + > +static const struct lsdc_kms_funcs ls7a1000_kms_funcs = { > + .create_i2c = lsdc_create_i2c_chan, > + .irq_handler = ls7a1000_dc_irq_handler, > + .output_init = ls7a1000_output_init, > + .cursor_plane_init = ls7a1000_cursor_plane_init, > + .primary_plane_init = lsdc_primary_plane_init, > + .crtc_init = ls7a1000_crtc_init, > +}; > + > +static const struct lsdc_kms_funcs ls7a2000_kms_funcs = { > + .create_i2c = lsdc_create_i2c_chan, > + .irq_handler = ls7a2000_dc_irq_handler, > + .output_init = ls7a2000_output_init, > + .cursor_plane_init = ls7a2000_cursor_plane_init, > + .primary_plane_init = lsdc_primary_plane_init, > + .crtc_init = ls7a2000_crtc_init, > +}; > + > +static const struct loongson_gfx_desc ls7a1000_gfx = { > + .dc = { > + .num_of_crtc = 2, > + .max_pixel_clk = 200000, > + .max_width = 2048, > + .max_height = 2048, > + .num_of_hw_cursor = 1, > + .hw_cursor_w = 32, > + .hw_cursor_h = 32, > + .pitch_align = 256, > + .has_vblank_counter = false, > + .funcs = &ls7a1000_kms_funcs, > + }, > + .conf_reg_base = LS7A1000_CONF_REG_BASE, > + .gfxpll = { > + .reg_offset = LS7A1000_PLL_GFX_REG, > + .reg_size = 8, > + }, > + .pixpll = { > + [0] = { > + .reg_offset = LS7A1000_PIXPLL0_REG, > + .reg_size = 8, > + }, > + [1] = { > + .reg_offset = LS7A1000_PIXPLL1_REG, > + .reg_size = 8, > + }, > + }, > + .chip_id = CHIP_LS7A1000, > + .model = "LS7A1000 bridge chipset", > +}; > + > +static const struct loongson_gfx_desc ls7a2000_gfx = { > + .dc = { > + .num_of_crtc = 2, > + .max_pixel_clk = 350000, > + .max_width = 4096, > + .max_height = 4096, > + .num_of_hw_cursor = 2, > + .hw_cursor_w = 64, > + .hw_cursor_h = 64, > + .pitch_align = 64, > + .has_vblank_counter = true, > + .funcs = &ls7a2000_kms_funcs, > + }, > + .conf_reg_base = LS7A2000_CONF_REG_BASE, > + .gfxpll = { > + .reg_offset = LS7A2000_PLL_GFX_REG, > + .reg_size = 8, > + }, > + .pixpll = { > + [0] = { > + .reg_offset = LS7A2000_PIXPLL0_REG, > + .reg_size = 8, > + }, > + [1] = { > + .reg_offset = LS7A2000_PIXPLL1_REG, > + .reg_size = 8, > + }, > + }, > + .chip_id = CHIP_LS7A2000, > + .model = "LS7A2000 bridge chipset", > +}; > + > +static const struct lsdc_desc *__chip_id_desc_table[] = { > + [CHIP_LS7A1000] = &ls7a1000_gfx.dc, > + [CHIP_LS7A2000] = &ls7a2000_gfx.dc, > + [CHIP_LS_LAST] = NULL, > +}; > + > +const struct lsdc_desc * > +lsdc_device_probe(struct pci_dev *pdev, enum loongson_chip_id chip_id) > +{ > + return __chip_id_desc_table[chip_id]; > +} > diff --git a/drivers/gpu/drm/loongson/loongson_module.c b/drivers/gpu/drm/loongson/loongson_module.c > new file mode 100644 > index 000000000000..d2a51bd395f6 > --- /dev/null > +++ b/drivers/gpu/drm/loongson/loongson_module.c > @@ -0,0 +1,33 @@ > +// SPDX-License-Identifier: GPL-2.0+ > +/* > + * Copyright (C) 2023 Loongson Technology Corporation Limited > + */ > + > +#include > + > +#include