From patchwork Thu Feb 21 20:19:59 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Francis X-Patchwork-Id: 10824717 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B991E15AC for ; Thu, 21 Feb 2019 20:20:19 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A9DEF3248B for ; Thu, 21 Feb 2019 20:20:19 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A743A324B3; Thu, 21 Feb 2019 20:20:19 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAD_ENC_HEADER,BAYES_00, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id A26A832489 for ; Thu, 21 Feb 2019 20:20:18 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 0488A8936C; Thu, 21 Feb 2019 20:20:13 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from NAM04-CO1-obe.outbound.protection.outlook.com (mail-eopbgr690062.outbound.protection.outlook.com [40.107.69.62]) by gabe.freedesktop.org (Postfix) with ESMTPS id 16DE78933E; Thu, 21 Feb 2019 20:20:09 +0000 (UTC) Received: from CY4PR12CA0035.namprd12.prod.outlook.com (2603:10b6:903:129::21) by BYAPR12MB2965.namprd12.prod.outlook.com (2603:10b6:a03:d5::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.14; Thu, 21 Feb 2019 20:20:07 +0000 Received: from CO1NAM03FT023.eop-NAM03.prod.protection.outlook.com (2a01:111:f400:7e48::201) by CY4PR12CA0035.outlook.office365.com (2603:10b6:903:129::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1643.15 via Frontend Transport; Thu, 21 Feb 2019 20:20:07 +0000 Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) Received: from SATLEXCHOV02.amd.com (165.204.84.17) by CO1NAM03FT023.mail.protection.outlook.com (10.152.80.157) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.20.1643.13 via Frontend Transport; Thu, 21 Feb 2019 20:20:06 +0000 Received: from localhost.localdomain (10.180.168.240) by SATLEXCHOV02.amd.com (10.181.40.72) with Microsoft SMTP Server id 14.3.389.1; Thu, 21 Feb 2019 14:20:06 -0600 From: David Francis To: Subject: [PATCH v2 1/3] drm/i915: Move dsc rate params compute into drm Date: Thu, 21 Feb 2019 15:19:59 -0500 Message-ID: <20190221202001.28430-2-David.Francis@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20190221202001.28430-1-David.Francis@amd.com> References: <20190221202001.28430-1-David.Francis@amd.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:165.204.84.17; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(396003)(346002)(376002)(39860400002)(136003)(2980300002)(428003)(189003)(199004)(105586002)(2351001)(305945005)(486006)(36756003)(72206003)(51416003)(48376002)(2906002)(47776003)(50466002)(106466001)(76176011)(6666004)(8936002)(68736007)(8676002)(81166006)(81156014)(356004)(11346002)(86362001)(126002)(26005)(478600001)(6916009)(77096007)(54906003)(186003)(49486002)(30864003)(2616005)(446003)(336012)(4326008)(476003)(1076003)(53936002)(316002)(5660300002)(16586007)(97736004)(50226002)(426003)(104016004); DIR:OUT; SFP:1101; SCL:1; SRVR:BYAPR12MB2965; H:SATLEXCHOV02.amd.com; FPR:; SPF:None; LANG:en; PTR:InfoDomainNonexistent; MX:1; A:1; X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: b9819685-9bab-467c-8988-08d69839f89c X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(5600110)(711020)(4605104)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(2017052603328)(7153060); SRVR:BYAPR12MB2965; X-MS-TrafficTypeDiagnostic: BYAPR12MB2965: X-Microsoft-Exchange-Diagnostics: 1; BYAPR12MB2965; 20:5m5RSzQNx4obG0yLTzrAtUAC3U9sXSYfiLTuVgfmKjsQy6NeLp+L48FzpFpgCPB3rtLrDLfAWTjFZ8H/l3smrImMAY1sf18MdsmADUOtHY8adLnYXn6NAH6Pv/9BmkMR1Neq0m6lDxBXlZa+w13btpazaTRpJlMFQUX2dQJ1hGxF2OwUXil2zPMHn/la0hlD0+j7Cqo12jXXubr5Xn3jYFjOBAh3WYLqZu/qoO+GEaqdZFxbEAm+9BwUz4CgxqggK7bjM/IZAR2+hDxlXyXMs5nPdAkZoKRe6A/nMjMllUl7xzdstj8w4kUk1rufXC/bqPy3okQfCVJxXHddtzwJfr7LvirYjx3x7BmIU4mcV0k7ZeJuZ+NTkfwO38kpyo3c9jC94YrT32r2TMpIFDrX7Hp7MZirs8uNTWFJm3Y4c8Sm/LKlL4pk87rBG8Nhmhhqlhg9i82F2HOMAN9GIdmzlHdxwooM0hAi2g29LTCxr3oRQyg7IitZVessvrB/B45Y X-Microsoft-Antispam-PRVS: X-Forefront-PRVS: 09555FB1AD X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BYAPR12MB2965; 23:B1KF6lKO3kUOpKw0fQW12WLuM37CDv72NoWMKtltK?= x+l20pguZdE2N3QBimb9HU5jV/WsJ8BoB0JRXDKv5gC0hUr7yREss3PXbTODIzGTBRx5yxyBw17QMU/myGA1X8iMrAGRrkWfPGc4yjyaIfy/GT3pG4WD195HjmVaYjlDasNacKTPD17MDRmDYFuevP4dbas3BBa3lifjmAXQVMxGbXJj9XigM5+rB5CdPu39oMw0St4QE+JJKfyXzhx6jEI35F/db6w0eYZuXz9Ur3vztpWjL7Iff/Go9nBzx1UNtO/+VMBGjVkFJJVGw4th6DaWvxQ57zm5D91PxpB4XfL66zdYQI34CgK+AbEO+cjYMuq2hGd3qllQO5wZKs7/1DWsX8MODvvNsSl5eeJ0DgMP+RXY0c3S6MxvVxbHNZv8A61xHXF3TQiJvw1OUTVrl1FhbnwdVErlx17wOKA3oBx90yfr71A5oK+LlDjx4i76aQPOb6UhhGamsNCZWh3NSDqYX0KOmYphLIGU2G2BXQ6Yar2FFc6RKQsoEDownhhzKwkfxxTnZH8VSMceNUhYpCC3JWmrwcogvS7nphRfSpVYJhcY3YD88bKEVqVhkLjI5R37qLhJYl/YFq+zdH83DPynGxWXkmcOOO42QkWM2rP2Z3UN/FS8+8TybcFYgtgA11owT2SqjnpmY54AJ2Mde/78MbkE1Fbdtuuud0+bhyeFhzUpY14BdBbzWwJRgQiy6PoAM3GsK4Ndbs2Ipq5lcMynhLMK7VIpjCyHBBZ5X0dfwWKb30WSh20PJVVrIK9qzvKkkFdFPzOcNZxeSHGJn+gNjhI/3VAHqD1QK9KoB8f43j7VoQ50K6imQYvKmZQBqblIYiw6PgPis2ByRlZ93LJm5Cq8XZj0cmf48Ugu1uOPv0zuenYiD2Hu7G65B/Wf1BcISycI9oL9Z/z3ZLuW4VyH03I2ZDutMFoDZFRPgMBs6fhSZryZ33ghc87iCBOj1cI8cSxU0zeLB6jmVxhbMYsX/SdftFO37W/Q73qWHCHlq55sm65aMh88g7bdA3G3AHDVRskJ+HOwK2iGk6U5R8b2E67qJljSOkWaxwHSs7E1CU5C+/si66stPEHOehyXdCQ9f001ERdM+QWE+bh2O09mUWiii9fBEe6F8Z2nsuk1X37bLLK/aRf0G6r+0Hqw94= X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info: 7KA7bhCtKfPGJ5lSbj+438sBBfkEWagMLKnUIhyL+zFZ9HqmrMh6mdvbyXdHL4UWevU37de58W7mr2Zl7GLl92G3g5tANY/zTYKrDChWATf8Vy+fTDlRkEf7N6nVfhiiKY0XxwgChMAFDM6o5fYwrUdQc9nTC5uSoy6tlHOhXQwjdE2hpCMxgMRV55aVat3H3ccNXUttg6CO9Wr7DRK7bFSl6Mu793dmnpSWJbVYQphSSVNdBt9V/Yu9yj/Cw5mM6der269hB3OBXgF/CIDVqzftdDE9Cqufa1YUZ5o2tqM43QBEnlIDPC/JrcYXgKzYxPOoHbaV1l39cZs98p+vGOplDBknmkKNqwqF+doVU3UObNhHaK83p4bYn2zMXSc+IGUD0qGI6IoHS1ITMxO7hbeKnv4UA9YLPXiBI3Iki9I= X-Microsoft-Exchange-Diagnostics: 1; BYAPR12MB2965; 20:eqIgMd3KZqyb4nMlDl7dpX673nu0qxnqxbO3GETCmoXq7Yu4D0S4bmn31jGpih82m7g3sHqRrnATTJowp6hcAGFmEjkwdALVacxuWLy/Gq13ipL3knuQpwvOlFxlhPezimKlbuCNqLNxPTtUzqjc+fbTaYKtjObEvHEqPXAhQUuprjw+31F9J+6lkYNLv7uFv0a9I6OS5FOTfj7U0OFDiYjshW9bzBTL7QUusvuu965GHuPFYhZzRuiAzOb9fSwv X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Feb 2019 20:20:06.8207 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: b9819685-9bab-467c-8988-08d69839f89c X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=3dd8961f-e488-4e60-8e11-a82d994e183d; Ip=[165.204.84.17]; Helo=[SATLEXCHOV02.amd.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR12MB2965 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector1-amd-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=XmxanRlWkXIHQDWjJdPcBhmzgqVF74izC6t71zTL2/A=; b=KzhUrBhnAVtpUgfLqU0aGKLuQ8yGlriBTbJuYgtV9ng6PGi/fu6OVWk7gLsi3uR9P3bd+J3vewKnTqc/1d0vz+hMh/9Dv23BEBLZxxEXIZTISPaJ5lkYLt7fkqNKfaIzL2rpsJqjhbUM6U+lza+l07zfM17M8RTWtTlKksRoybg= X-Mailman-Original-Authentication-Results: spf=none (sender IP is 165.204.84.17) smtp.mailfrom=amd.com; lists.freedesktop.org; dkim=none (message not signed) header.d=none;lists.freedesktop.org; dmarc=permerror action=none header.from=amd.com; X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: intel-gfx@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, nikola.cornij@amd.com, manasi.d.navare@intel.com, David Francis Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP The function intel_compute_rc_parameters is part of the dsc spec and is not driver-specific. Other drm drivers might like to use it. The function is not changed; just moved and renamed. Reviewed-by: Harry Wentland Signed-off-by: David Francis --- drivers/gpu/drm/drm_dsc.c | 135 ++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_vdsc.c | 125 +-------------------------- include/drm/drm_dsc.h | 1 + 3 files changed, 137 insertions(+), 124 deletions(-) diff --git a/drivers/gpu/drm/drm_dsc.c b/drivers/gpu/drm/drm_dsc.c index bce99f95c1a3..b7f1903508a4 100644 --- a/drivers/gpu/drm/drm_dsc.c +++ b/drivers/gpu/drm/drm_dsc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include @@ -244,3 +245,137 @@ void drm_dsc_pps_infoframe_pack(struct drm_dsc_pps_infoframe *pps_sdp, /* PPS 94 - 127 are O */ } EXPORT_SYMBOL(drm_dsc_pps_infoframe_pack); + +/** + * drm_dsc_compute_rc_parameters() - Write rate control + * parameters to the dsc configuration defined in + * &struct drm_dsc_config in accordance with the DSC 1.1 + * specification. Some configuration fields must be present + * beforehand. + * + * @vdsc_cfg: + * DSC Configuration data partially filled by driver + */ +int drm_dsc_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg) +{ + unsigned long groups_per_line = 0; + unsigned long groups_total = 0; + unsigned long num_extra_mux_bits = 0; + unsigned long slice_bits = 0; + unsigned long hrd_delay = 0; + unsigned long final_scale = 0; + unsigned long rbs_min = 0; + + /* Number of groups used to code each line of a slice */ + groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width, + DSC_RC_PIXELS_PER_GROUP); + + /* chunksize in Bytes */ + vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width * + vdsc_cfg->bits_per_pixel, + (8 * 16)); + + if (vdsc_cfg->convert_rgb) + num_extra_mux_bits = 3 * (vdsc_cfg->mux_word_size + + (4 * vdsc_cfg->bits_per_component + 4) + - 2); + else + num_extra_mux_bits = 3 * vdsc_cfg->mux_word_size + + (4 * vdsc_cfg->bits_per_component + 4) + + 2 * (4 * vdsc_cfg->bits_per_component) - 2; + /* Number of bits in one Slice */ + slice_bits = 8 * vdsc_cfg->slice_chunk_size * vdsc_cfg->slice_height; + + while ((num_extra_mux_bits > 0) && + ((slice_bits - num_extra_mux_bits) % vdsc_cfg->mux_word_size)) + num_extra_mux_bits--; + + if (groups_per_line < vdsc_cfg->initial_scale_value - 8) + vdsc_cfg->initial_scale_value = groups_per_line + 8; + + /* scale_decrement_interval calculation according to DSC spec 1.11 */ + if (vdsc_cfg->initial_scale_value > 8) + vdsc_cfg->scale_decrement_interval = groups_per_line / + (vdsc_cfg->initial_scale_value - 8); + else + vdsc_cfg->scale_decrement_interval = DSC_SCALE_DECREMENT_INTERVAL_MAX; + + vdsc_cfg->final_offset = vdsc_cfg->rc_model_size - + (vdsc_cfg->initial_xmit_delay * + vdsc_cfg->bits_per_pixel + 8) / 16 + num_extra_mux_bits; + + if (vdsc_cfg->final_offset >= vdsc_cfg->rc_model_size) { + DRM_DEBUG_KMS("FinalOfs < RcModelSze for this InitialXmitDelay\n"); + return -ERANGE; + } + + final_scale = (vdsc_cfg->rc_model_size * 8) / + (vdsc_cfg->rc_model_size - vdsc_cfg->final_offset); + if (vdsc_cfg->slice_height > 1) + /* + * NflBpgOffset is 16 bit value with 11 fractional bits + * hence we multiply by 2^11 for preserving the + * fractional part + */ + vdsc_cfg->nfl_bpg_offset = DIV_ROUND_UP((vdsc_cfg->first_line_bpg_offset << 11), + (vdsc_cfg->slice_height - 1)); + else + vdsc_cfg->nfl_bpg_offset = 0; + + /* 2^16 - 1 */ + if (vdsc_cfg->nfl_bpg_offset > 65535) { + DRM_DEBUG_KMS("NflBpgOffset is too large for this slice height\n"); + return -ERANGE; + } + + /* Number of groups used to code the entire slice */ + groups_total = groups_per_line * vdsc_cfg->slice_height; + + /* slice_bpg_offset is 16 bit value with 11 fractional bits */ + vdsc_cfg->slice_bpg_offset = DIV_ROUND_UP(((vdsc_cfg->rc_model_size - + vdsc_cfg->initial_offset + + num_extra_mux_bits) << 11), + groups_total); + + if (final_scale > 9) { + /* + * ScaleIncrementInterval = + * finaloffset/((NflBpgOffset + SliceBpgOffset)*8(finalscale - 1.125)) + * as (NflBpgOffset + SliceBpgOffset) has 11 bit fractional value, + * we need divide by 2^11 from pstDscCfg values + */ + vdsc_cfg->scale_increment_interval = + (vdsc_cfg->final_offset * (1 << 11)) / + ((vdsc_cfg->nfl_bpg_offset + + vdsc_cfg->slice_bpg_offset) * + (final_scale - 9)); + } else { + /* + * If finalScaleValue is less than or equal to 9, a value of 0 should + * be used to disable the scale increment at the end of the slice + */ + vdsc_cfg->scale_increment_interval = 0; + } + + if (vdsc_cfg->scale_increment_interval > 65535) { + DRM_DEBUG_KMS("ScaleIncrementInterval is large for slice height\n"); + return -ERANGE; + } + + /* + * DSC spec mentions that bits_per_pixel specifies the target + * bits/pixel (bpp) rate that is used by the encoder, + * in steps of 1/16 of a bit per pixel + */ + rbs_min = vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset + + DIV_ROUND_UP(vdsc_cfg->initial_xmit_delay * + vdsc_cfg->bits_per_pixel, 16) + + groups_per_line * vdsc_cfg->first_line_bpg_offset; + + hrd_delay = DIV_ROUND_UP((rbs_min * 16), vdsc_cfg->bits_per_pixel); + vdsc_cfg->rc_bits = (hrd_delay * vdsc_cfg->bits_per_pixel) / 16; + vdsc_cfg->initial_dec_delay = hrd_delay - vdsc_cfg->initial_xmit_delay; + + return 0; +} +EXPORT_SYMBOL(drm_dsc_compute_rc_parameters); diff --git a/drivers/gpu/drm/i915/intel_vdsc.c b/drivers/gpu/drm/i915/intel_vdsc.c index 23abf03736e7..2d059ebc9bd0 100644 --- a/drivers/gpu/drm/i915/intel_vdsc.c +++ b/drivers/gpu/drm/i915/intel_vdsc.c @@ -317,129 +317,6 @@ static int get_column_index_for_rc_params(u8 bits_per_component) } } -static int intel_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg) -{ - unsigned long groups_per_line = 0; - unsigned long groups_total = 0; - unsigned long num_extra_mux_bits = 0; - unsigned long slice_bits = 0; - unsigned long hrd_delay = 0; - unsigned long final_scale = 0; - unsigned long rbs_min = 0; - - /* Number of groups used to code each line of a slice */ - groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width, - DSC_RC_PIXELS_PER_GROUP); - - /* chunksize in Bytes */ - vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width * - vdsc_cfg->bits_per_pixel, - (8 * 16)); - - if (vdsc_cfg->convert_rgb) - num_extra_mux_bits = 3 * (vdsc_cfg->mux_word_size + - (4 * vdsc_cfg->bits_per_component + 4) - - 2); - else - num_extra_mux_bits = 3 * vdsc_cfg->mux_word_size + - (4 * vdsc_cfg->bits_per_component + 4) + - 2 * (4 * vdsc_cfg->bits_per_component) - 2; - /* Number of bits in one Slice */ - slice_bits = 8 * vdsc_cfg->slice_chunk_size * vdsc_cfg->slice_height; - - while ((num_extra_mux_bits > 0) && - ((slice_bits - num_extra_mux_bits) % vdsc_cfg->mux_word_size)) - num_extra_mux_bits--; - - if (groups_per_line < vdsc_cfg->initial_scale_value - 8) - vdsc_cfg->initial_scale_value = groups_per_line + 8; - - /* scale_decrement_interval calculation according to DSC spec 1.11 */ - if (vdsc_cfg->initial_scale_value > 8) - vdsc_cfg->scale_decrement_interval = groups_per_line / - (vdsc_cfg->initial_scale_value - 8); - else - vdsc_cfg->scale_decrement_interval = DSC_SCALE_DECREMENT_INTERVAL_MAX; - - vdsc_cfg->final_offset = vdsc_cfg->rc_model_size - - (vdsc_cfg->initial_xmit_delay * - vdsc_cfg->bits_per_pixel + 8) / 16 + num_extra_mux_bits; - - if (vdsc_cfg->final_offset >= vdsc_cfg->rc_model_size) { - DRM_DEBUG_KMS("FinalOfs < RcModelSze for this InitialXmitDelay\n"); - return -ERANGE; - } - - final_scale = (vdsc_cfg->rc_model_size * 8) / - (vdsc_cfg->rc_model_size - vdsc_cfg->final_offset); - if (vdsc_cfg->slice_height > 1) - /* - * NflBpgOffset is 16 bit value with 11 fractional bits - * hence we multiply by 2^11 for preserving the - * fractional part - */ - vdsc_cfg->nfl_bpg_offset = DIV_ROUND_UP((vdsc_cfg->first_line_bpg_offset << 11), - (vdsc_cfg->slice_height - 1)); - else - vdsc_cfg->nfl_bpg_offset = 0; - - /* 2^16 - 1 */ - if (vdsc_cfg->nfl_bpg_offset > 65535) { - DRM_DEBUG_KMS("NflBpgOffset is too large for this slice height\n"); - return -ERANGE; - } - - /* Number of groups used to code the entire slice */ - groups_total = groups_per_line * vdsc_cfg->slice_height; - - /* slice_bpg_offset is 16 bit value with 11 fractional bits */ - vdsc_cfg->slice_bpg_offset = DIV_ROUND_UP(((vdsc_cfg->rc_model_size - - vdsc_cfg->initial_offset + - num_extra_mux_bits) << 11), - groups_total); - - if (final_scale > 9) { - /* - * ScaleIncrementInterval = - * finaloffset/((NflBpgOffset + SliceBpgOffset)*8(finalscale - 1.125)) - * as (NflBpgOffset + SliceBpgOffset) has 11 bit fractional value, - * we need divide by 2^11 from pstDscCfg values - */ - vdsc_cfg->scale_increment_interval = - (vdsc_cfg->final_offset * (1 << 11)) / - ((vdsc_cfg->nfl_bpg_offset + - vdsc_cfg->slice_bpg_offset) * - (final_scale - 9)); - } else { - /* - * If finalScaleValue is less than or equal to 9, a value of 0 should - * be used to disable the scale increment at the end of the slice - */ - vdsc_cfg->scale_increment_interval = 0; - } - - if (vdsc_cfg->scale_increment_interval > 65535) { - DRM_DEBUG_KMS("ScaleIncrementInterval is large for slice height\n"); - return -ERANGE; - } - - /* - * DSC spec mentions that bits_per_pixel specifies the target - * bits/pixel (bpp) rate that is used by the encoder, - * in steps of 1/16 of a bit per pixel - */ - rbs_min = vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset + - DIV_ROUND_UP(vdsc_cfg->initial_xmit_delay * - vdsc_cfg->bits_per_pixel, 16) + - groups_per_line * vdsc_cfg->first_line_bpg_offset; - - hrd_delay = DIV_ROUND_UP((rbs_min * 16), vdsc_cfg->bits_per_pixel); - vdsc_cfg->rc_bits = (hrd_delay * vdsc_cfg->bits_per_pixel) / 16; - vdsc_cfg->initial_dec_delay = hrd_delay - vdsc_cfg->initial_xmit_delay; - - return 0; -} - int intel_dp_compute_dsc_params(struct intel_dp *intel_dp, struct intel_crtc_state *pipe_config) { @@ -574,7 +451,7 @@ int intel_dp_compute_dsc_params(struct intel_dp *intel_dp, vdsc_cfg->initial_scale_value = (vdsc_cfg->rc_model_size << 3) / (vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset); - return intel_compute_rc_parameters(vdsc_cfg); + return drm_dsc_compute_rc_parameters(vdsc_cfg); } enum intel_display_power_domain diff --git a/include/drm/drm_dsc.h b/include/drm/drm_dsc.h index 9c26f083c70f..5a98b8dfdf43 100644 --- a/include/drm/drm_dsc.h +++ b/include/drm/drm_dsc.h @@ -604,5 +604,6 @@ struct drm_dsc_pps_infoframe { void drm_dsc_dp_pps_header_init(struct drm_dsc_pps_infoframe *pps_sdp); void drm_dsc_pps_infoframe_pack(struct drm_dsc_pps_infoframe *pps_sdp, const struct drm_dsc_config *dsc_cfg); +int drm_dsc_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg); #endif /* _DRM_DSC_H_ */