Received: by 2002:a05:6602:2086:0:0:0:0 with SMTP id a6csp3904995ioa; Tue, 26 Apr 2022 12:03:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzfIwb7PjJrgjbAShf+M2DdRFZYWwmkH9xvu1A/nciCozjv8cnWQVUh6dC4hRU/iGk6Zuyr X-Received: by 2002:a17:902:e550:b0:15c:f4f2:814f with SMTP id n16-20020a170902e55000b0015cf4f2814fmr16445099plf.123.1650999831612; Tue, 26 Apr 2022 12:03:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1650999831; cv=none; d=google.com; s=arc-20160816; b=qf904DiPAA5m0JJVV1EsvDyrmUNkSymIt9Ek6Wes8OXHmoz/u9FzC3i+KswVw/xz3H VwlKki/6fysO4NXIjsAtZG8S3kMyujiO179Zq1OxHXUxYqJLVPzS+f/o9+kWH1fOf3AK ygaEtgrfbgf3Q/9iC98kaN8UDUfhKDOWn5WU0G70EAAtN9+8D8PhQR16h4wFQ0T+Y+Zv hfVyepwKuThZXr0BRfWwTCnfiOopBWIOZSNjvvbDcGCCB0XGosXT/Oieq/0Xxf4DTE8Y BraYCQGCmasUeqH+/fWo+MOtlYbwHdk8rSsFi13IG6Ua5DfqCV8GBBEwXmOYcw9ncN2/ fUkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=oxvTmypBBV1dcA5LKBfYnuJggK+6LDF/F/EDctPMfhg=; b=UPq1O0VyxHNSNT7WZslenmboPMZ5v32mSHKUhRZ/9j8oR4VWVzeLCHPWOVRLKA/lff mQDfwrISCBKENcbNJ4GuNM+LLRiE7yXt9PC8Dq4e08wBZvW0GSMXLa1U10WT3mro5Yre BDcB7fM5YcfAghplbo0cV0tvXbNa/GGARqmCdRtO1mcMKKNSAoSzF9E1DpGiIGInSZJs zz2amsAb485mncnS31BJYi9Ks6BszsqJoaL+uuezMGDvwVMFD+gCdLHrWG667j3chKuD fOObR/ORa7Tqpq41SXdvXajOnat9HP/z/RbrI8AcJ41DntCm8B7ybRS7UB0Qy4HRReTP gJww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@jms.id.au header.s=google header.b=lpvJnznv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id b18-20020a170903229200b00158695aa2efsi6738692plh.200.2022.04.26.12.03.32; Tue, 26 Apr 2022 12:03:51 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@jms.id.au header.s=google header.b=lpvJnznv; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240796AbiDZDak (ORCPT + 99 others); Mon, 25 Apr 2022 23:30:40 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45156 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232958AbiDZDaf (ORCPT ); Mon, 25 Apr 2022 23:30:35 -0400 Received: from mail-qv1-xf2f.google.com (mail-qv1-xf2f.google.com [IPv6:2607:f8b0:4864:20::f2f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8C9522182D; Mon, 25 Apr 2022 20:27:28 -0700 (PDT) Received: by mail-qv1-xf2f.google.com with SMTP id jt15so7273135qvb.13; Mon, 25 Apr 2022 20:27:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jms.id.au; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=oxvTmypBBV1dcA5LKBfYnuJggK+6LDF/F/EDctPMfhg=; b=lpvJnznv8Wt7AE6DkzPZ8wyC84hrbIv3ngWbpuZypeTEcnGM+CTX0J9XT9A+tanY06 TNLpZPKUYECXDFT5YQa6TE9ixMK72mxm8OCG+yEJB9giQt63+yV1qjRh/rFiKC6yMTHT U7K+teoWg0vlcH9D8ozYmHuBKLnr6o4vlucPw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=oxvTmypBBV1dcA5LKBfYnuJggK+6LDF/F/EDctPMfhg=; b=CuT0jbticD2N97Rvk3Nr7XwWjPNgx5GWFsqsYmZpIsFYJ0OVYvbHhNAog4GTE3zNtQ xe8h+Jsdx2ZSnLJqjfyZNQUlBZWCxQKQXrXeDJXJjqycpwyTNNQd7kQ3D8HgiC58Gmwd aTFNv31zJ5xc8RZ0s6laOx4qijzUSV48ZRCZealhUtT6KXA9+sBPpQRGwS4ipjpbW1Be pTSYycg9oorg/daULEgX0HeYdW+uw7vLXamvFUgYBJbEIlgb6C5JVWuohqtgAq+cbAka BtSjUWTWKqhqLVgqqMBV57aTSTJ/WHEgiCJ6wkFP8zezPGwsaJ3RgSMDFH7TIW9iS1/G XMZQ== X-Gm-Message-State: AOAM532tN22ECFt+hicsX6p94AA78SGWU2I9PZEK60dat2Tj4VX6wv4P CIh61vREB/eQlRyhVdBlp6tR+rGXkKXrI8NzU1Y= X-Received: by 2002:ad4:5dea:0:b0:452:6009:844b with SMTP id jn10-20020ad45dea000000b004526009844bmr13646167qvb.121.1650943647552; Mon, 25 Apr 2022 20:27:27 -0700 (PDT) MIME-Version: 1.0 References: <20220304063137.12970-1-tommy_huang@aspeedtech.com> <20220304063137.12970-3-tommy_huang@aspeedtech.com> In-Reply-To: <20220304063137.12970-3-tommy_huang@aspeedtech.com> From: Joel Stanley Date: Tue, 26 Apr 2022 03:27:15 +0000 Message-ID: Subject: Re: [PATCH v1 2/2] drm/aspeed: Add 1024x768 mode for AST2600 To: Tommy Haung Cc: David Airlie , Daniel Vetter , Rob Herring , Andrew Jeffery , linux-aspeed , "open list:DRM DRIVERS" , devicetree , Linux ARM , Linux Kernel Mailing List , BMC-SW Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-1.5 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 4 Mar 2022 at 06:32, Tommy Haung wrote: > > Update the aspeed_gfx_set_clk with display width. > At AST2600, the display clock could be coming from > HPLL clock / 16 = 75MHz. It would fit 1024x768@70Hz. > Another chip will still keep 800x600. > > Signed-off-by: Tommy Haung > --- > drivers/gpu/drm/aspeed/aspeed_gfx.h | 12 ++++++---- > drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c | 29 ++++++++++++++++++++---- > drivers/gpu/drm/aspeed/aspeed_gfx_drv.c | 16 +++++++++++-- > drivers/gpu/drm/aspeed/aspeed_gfx_out.c | 14 +++++++++++- > 4 files changed, 60 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx.h b/drivers/gpu/drm/aspeed/aspeed_gfx.h > index eb4c267cde5e..c7aefee0657a 100644 > --- a/drivers/gpu/drm/aspeed/aspeed_gfx.h > +++ b/drivers/gpu/drm/aspeed/aspeed_gfx.h > @@ -109,11 +109,15 @@ int aspeed_gfx_create_output(struct drm_device *drm); > #define CRT_THROD_HIGH(x) ((x) << 8) > > /* SCU control */ > -#define SCU_G6_CLK_COURCE 0x300 > +#define G6_CLK_SOURCE 0x300 > +#define G6_CLK_SOURCE_MASK (BIT(8) | BIT(9) | BIT(10)) > +#define G6_CLK_SOURCE_HPLL (BIT(8) | BIT(9) | BIT(10)) > +#define G6_CLK_SOURCE_USB BIT(9) > +#define G6_CLK_SEL3 0x308 > +#define G6_CLK_DIV_MASK 0x3F000 > +#define G6_CLK_DIV_16 (BIT(16)|BIT(15)|BIT(13)|BIT(12)) > +#define G6_USB_40_CLK BIT(9) > > /* GFX FLAGS */ > #define CLK_MASK BIT(0) > #define CLK_G6 BIT(0) > - > -#define G6_CLK_MASK (BIT(8) | BIT(9) | BIT(10)) > -#define G6_USB_40_CLK BIT(9) > diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c b/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c > index a24fab22eac4..5829be9c7c67 100644 > --- a/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c > +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c > @@ -23,6 +23,28 @@ drm_pipe_to_aspeed_gfx(struct drm_simple_display_pipe *pipe) > return container_of(pipe, struct aspeed_gfx, pipe); > } > > +static void aspeed_gfx_set_clock_source(struct aspeed_gfx *priv, int mode_width) > +{ > + regmap_update_bits(priv->scu, G6_CLK_SOURCE, G6_CLK_SOURCE_MASK, 0x0); > + regmap_update_bits(priv->scu, G6_CLK_SEL3, G6_CLK_DIV_MASK, 0x0); > + > + switch (mode_width) { > + case 1024: > + /* hpll div 16 = 75Mhz */ > + regmap_update_bits(priv->scu, G6_CLK_SOURCE, > + G6_CLK_SOURCE_MASK, G6_CLK_SOURCE_HPLL); > + regmap_update_bits(priv->scu, G6_CLK_SEL3, > + G6_CLK_DIV_MASK, G6_CLK_DIV_16); > + break; > + case 800: > + default: > + /* usb 40Mhz */ > + regmap_update_bits(priv->scu, G6_CLK_SOURCE, > + G6_CLK_SOURCE_MASK, G6_CLK_SOURCE_USB); > + break; > + } I'm not familiar with this area, but I think this belongs in the clock driver. We want to be able to call clk_set_rate() from the drm driver and have the clock driver update the correct bits in the SCU. Instead of specialising the 2600 vs others, could clk_set_rate() fail on the others, and cause the driver to stay at 800x600. If the set succeeds it can then run at the higher resolution. If this is not how the APIs work, we could instead have a clock_rate in struct aspeed_gfx and each platform can define its expected clock rate. It would then need a corresponding resolution. Please take a look at other drivers and see what they do. > +} > + > static int aspeed_gfx_set_pixel_fmt(struct aspeed_gfx *priv, u32 *bpp) > { > struct drm_crtc *crtc = &priv->pipe.crtc; > @@ -77,12 +99,11 @@ static void aspeed_gfx_disable_controller(struct aspeed_gfx *priv) > regmap_update_bits(priv->scu, priv->dac_reg, BIT(16), 0); > } > > -static void aspeed_gfx_set_clk(struct aspeed_gfx *priv) > +static void aspeed_gfx_set_clk(struct aspeed_gfx *priv, int mode_width) > { > switch (priv->flags & CLK_MASK) { > case CLK_G6: > - regmap_update_bits(priv->scu, SCU_G6_CLK_COURCE, G6_CLK_MASK, 0x0); > - regmap_update_bits(priv->scu, SCU_G6_CLK_COURCE, G6_CLK_MASK, G6_USB_40_CLK); > + aspeed_gfx_set_clock_source(priv, mode_width); > break; > default: > break; > @@ -99,7 +120,7 @@ static void aspeed_gfx_crtc_mode_set_nofb(struct aspeed_gfx *priv) > if (err) > return; > > - aspeed_gfx_set_clk(priv); > + aspeed_gfx_set_clk(priv, m->hdisplay); > > #if 0 > /* TODO: we have only been able to test with the 40MHz USB clock. The > diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c > index af56ffdccc65..e1a814aebc2d 100644 > --- a/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c > +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_drv.c > @@ -110,6 +110,7 @@ static const struct drm_mode_config_funcs aspeed_gfx_mode_config_funcs = { > > static int aspeed_gfx_setup_mode_config(struct drm_device *drm) > { > + struct aspeed_gfx *priv = to_aspeed_gfx(drm); > int ret; > > ret = drmm_mode_config_init(drm); > @@ -118,8 +119,18 @@ static int aspeed_gfx_setup_mode_config(struct drm_device *drm) > > drm->mode_config.min_width = 0; > drm->mode_config.min_height = 0; > - drm->mode_config.max_width = 800; > - drm->mode_config.max_height = 600; > + > + switch (priv->flags & CLK_MASK) { > + case CLK_G6: > + drm->mode_config.max_width = 1024; > + drm->mode_config.max_height = 768; > + break; > + default: > + drm->mode_config.max_width = 800; > + drm->mode_config.max_height = 600; > + break; > + } > + > drm->mode_config.funcs = &aspeed_gfx_mode_config_funcs; > > return ret; > @@ -167,6 +178,7 @@ static int aspeed_gfx_load(struct drm_device *drm) > priv->vga_scratch_reg = config->vga_scratch_reg; > priv->throd_val = config->throd_val; > priv->scan_line_max = config->scan_line_max; > + priv->flags = config->gfx_flags; > > priv->scu = syscon_regmap_lookup_by_phandle(np, "syscon"); > if (IS_ERR(priv->scu)) { > diff --git a/drivers/gpu/drm/aspeed/aspeed_gfx_out.c b/drivers/gpu/drm/aspeed/aspeed_gfx_out.c > index 6759cb88415a..5d5e04f15c59 100644 > --- a/drivers/gpu/drm/aspeed/aspeed_gfx_out.c > +++ b/drivers/gpu/drm/aspeed/aspeed_gfx_out.c > @@ -10,7 +10,19 @@ > > static int aspeed_gfx_get_modes(struct drm_connector *connector) > { > - return drm_add_modes_noedid(connector, 800, 600); > + struct aspeed_gfx *priv = container_of(connector, struct aspeed_gfx, connector); > + int mode_count = 0; > + > + switch (priv->flags & CLK_MASK) { > + case CLK_G6: > + mode_count = drm_add_modes_noedid(connector, 1024, 768); > + break; > + default: > + mode_count = drm_add_modes_noedid(connector, 800, 600); > + break; > + } > + > + return mode_count; > } > > static const struct > -- > 2.17.1 >