From patchwork Mon Aug 25 16:27:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 126 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756139271; bh=OKaP3LHorM6CPh88vXDFx40yE14fa7kLn0h8RPdGOEs=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=lr/uDh1vNvLji7F0DsPb4DIv88vLmHyqxOZNDggowOkglVyVROn8q8wrFuy9YWeAx IAVlFZQrBqWHMs7eVV8PlJZH0DEJ7/DNXpqzr8KeyXQKL4e8dvf9tJcIPHStELZ0KZ 02f9u7fS3+j2mFEGHKO9PfgPYtRllvpaY9Y5esL2oYRozknSKkOk+/vqZ5tVROtg7r 9+9OV9+mLc2yQfTt4R4RauKE85wLG18B7xbReeV2/5lNEythdxYZklO6Cwyt1WFd1N iEzkhg6/YkEmB+anF+ucVdUx4XXcFEVmUM/a+J+Hg9EO+35PQf+3d0F1i8H9cRieGA cAsYOYTBhF8EQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 28A8E677AC for ; Mon, 25 Aug 2025 10:27:51 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id f7U9FsQyciqm for ; Mon, 25 Aug 2025 10:27:51 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756139268; bh=OKaP3LHorM6CPh88vXDFx40yE14fa7kLn0h8RPdGOEs=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=RbR2NPu3Bwpg5COQKVEB2YFmhyUEjl50Y3w6xnD5NCUGKl4i99N2STT1HomFm8yxm mV7sM3iNf6Q28l8grnbk98fk2pJmI2WljrsrL0ewNXY4TFIJJuaaDmT86ze7xLsdAD 8OQnoA/7DxMX/znQGnuO9sOcnVGGK21xXca89l5p/Zk2gwrIh3FuP+ZxZVBguwP3go gftbwNDgngkgKuxrgvE5omeJTRb+xXn82yyK/EWwH1XCsMsTZMlDAOQyAWZGAIlIGi oXytCjmtIpT2qOKcrXF0R8aHLNKzvmKOBZthwmFhN941EIn/2f5a6clU5+xddhA9hG fmhK0QZAGyWyw== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id DF9C4676E8 for ; Mon, 25 Aug 2025 10:27:48 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756139266; bh=D9QuotdVeFm24TNDJPIzNYMEGsHNsPvEhmpjr70gxpI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=hMKSy/SrxjqEmtASm0XuzJR3VHVkGZ6YxAOaHk+9GEQnTBHOa92uLsYNS3zVH0vIG NVQqpxPOljMpKXRboCx9eNqZ1fTNXoYrjLfjo8bbX4V7Wu/Sj/cb501T6m8rysuG6x KiXXjTraQIUue6/BRwgHWqQxcyHAL8ynjuoNYLz8kqZFxzxWvhd1aokS83WSHfh1cL VBfwAzKJKfWQBrLEgzVD1Rnp4LmoPZUlvPNHkjodHkCohxuPD1UayTkBI1hjqDsdJb h7aV6hBFDAngs2GlLJnavrXjohu/ubmyUhfHbdeBGgkdQMJHRixzKMfeBLiGCbfneh kvmT2GfXAHqSQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 6F53767795; Mon, 25 Aug 2025 10:27:46 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id SDR7dQO0EOPe; Mon, 25 Aug 2025 10:27:46 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1756139262; bh=laphQ1v8B8REKjJHGA64uz7dR0VJXM1cl+fxO5pi2d0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bNO1r0fUzb0LmqhPIa0s40gDabdGqJrkrBgGZ2A+Zkl0javXEnp4CBqPSfYpBg60y skBteEOOKDvQXQKKfvBuSG4ABIVpt3DeaF47qOFlNCh04FMn6G9fK0hiw0I76/6vCn Azmd7TJyX0iEHVlrubMJttusQbQ6pZgOsBe0/awGRFbN4d2E4QdQCp0HnGAnnBAB75 0/taC1fLF9Y0Tys6NvK2pR1oTgQTbHO48m/2ywgwoIbwoodVoQHCPWxCY2ghgkfOKB Av1aV2TgVlG4DhD4p+0AxaDj/AOoL2zsXkXh7CrBB3dTH+pw/Nrzo6g2f3DVTwLcPb JHYSdjeJg81IQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id D78E66778C; Mon, 25 Aug 2025 10:27:41 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Mon, 25 Aug 2025 10:27:08 -0600 Message-ID: <20250825162727.3185381-6-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250825162727.3185381-1-sjg@u-boot.org> References: <20250825162727.3185381-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: MRK2AJ2GYOXK565GJ25DKVRJKPTVOLJV X-Message-ID-Hash: MRK2AJ2GYOXK565GJ25DKVRJKPTVOLJV X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH v2 05/16] serial: Cache the terminal size List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add serial_priv structure to serial uclass to cache terminal dimensions. When serial_query_size() successfully queries the terminal, store the results in the uclass-private data for later retrieval. This avoids repeated terminal queries and improves performance when different subsystems need the terminal size. Co-developed-by: Claude Signed-off-by: Simon Glass --- (no changes since v1) drivers/serial/serial-uclass.c | 38 ++++++++++++++++++++++++++++++++++ include/serial.h | 24 +++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/drivers/serial/serial-uclass.c b/drivers/serial/serial-uclass.c index 1204fb5d4c4..27de461d196 100644 --- a/drivers/serial/serial-uclass.c +++ b/drivers/serial/serial-uclass.c @@ -24,6 +24,8 @@ DECLARE_GLOBAL_DATA_PTR; +#define ESC "\x1b" + /* * Table with supported baudrates (defined in config_xyz.h) */ @@ -666,8 +668,18 @@ int serial_query_size(int *rowsp, int *colsp) /* Read {rows,cols} */ ret = term_read_reply(n, 2, 'R'); if (!ret) { + struct serial_priv *priv; + struct uclass *uc; + *colsp = n[1]; *rowsp = n[0]; + + /* Store in serial uclass private data if available */ + if (!uclass_get(UCLASS_SERIAL, &uc)) { + priv = uclass_get_priv(uc); + priv->rows = n[0]; + priv->cols = n[1]; + } } printf(ESC "8"); /* Restore cursor position */ @@ -675,6 +687,31 @@ int serial_query_size(int *rowsp, int *colsp) return ret; } +int serial_get_size(struct udevice *dev, int *rowsp, int *colsp) +{ + struct serial_priv *priv; + struct uclass *uc; + int ret; + + ret = uclass_get(UCLASS_SERIAL, &uc); + if (ret) + return ret; + + priv = uclass_get_priv(uc); + + /* Check if we have cached values */ + if (priv->rows && priv->cols) { + *rowsp = priv->rows; + *colsp = priv->cols; + return 0; + } + + /* No cached values, query the terminal */ + ret = serial_query_size(rowsp, colsp); + + return ret; +} + #if CONFIG_IS_ENABLED(SERIAL_PRESENT) static int serial_post_probe(struct udevice *dev) { @@ -730,5 +767,6 @@ UCLASS_DRIVER(serial) = { .post_probe = serial_post_probe, .pre_remove = serial_pre_remove, .per_device_auto = sizeof(struct serial_dev_priv), + .priv_auto = sizeof(struct serial_priv), }; #endif diff --git a/include/serial.h b/include/serial.h index 2aba4c313c2..9ed3793b647 100644 --- a/include/serial.h +++ b/include/serial.h @@ -291,6 +291,17 @@ struct dm_serial_ops { int (*getinfo)(struct udevice *dev, struct serial_device_info *info); }; +/** + * struct serial_priv - private data for serial uclass + * + * @rows: Number of terminal rows (0 if unknown) + * @cols: Number of terminal columns (0 if unknown) + */ +struct serial_priv { + int rows; + int cols; +}; + /** * struct serial_dev_priv - information about a device used by the uclass * @@ -400,4 +411,17 @@ int serial_tstc(void); */ int serial_query_size(int *rowsp, int *colsp); +/** + * serial_get_size() - get serial console size + * + * Get the terminal size, using cached values if available, or failing that, + * query the terminal + * + * @dev: serial device to query (may be NULL) + * @rowsp: returns number of rows + * @colsp: returns number of columns + * Returns: 0 on success, -ve on error + */ +int serial_get_size(struct udevice *dev, int *rowsp, int *colsp); + #endif