Re: [PATCH v2 0/9] soc: qcom: geni: Derive SE clock configuration from OPP table on SA8255P
From: Praveen Talari
Date: Tue Sep 01 2026 - 12:56:06 EST
Hi Ulf,
On 01-09-2026 20:22, Ulf Hansson wrote:
On Thu, Aug 27, 2026 at 7:59 PM Praveen TalariI agree that protocol drivers should not need to know whether GENI resources
<praveen.talari@xxxxxxxxxxxxxxxx> wrote:
On firmware-managed platforms such as SA8255P, there is no Linux clockHmm, this sounds like moving backwards when it comes to keeping
handler available to determine the appropriate SE source clock, source
clock index, and divider values for a requested protocol frequency.
However, these parameters are required when programming GSI TREs, where
the hardware expects an explicit clock source selection and divider
configuration for the serial engine.
In contrast, platforms using Linux-managed clocks derive these
parameters through geni_se_clk_freq_match() using the source clock
information stored in clk_perf_tbl. Since the firmware-managed path
lacks equivalent clock information, protocol drivers cannot reuse the
existing frequency matching logic and instead rely on a direct mapping
between protocol-requested frequencies and performance levels. This
creates a separate clock configuration flow and prevents
firmware-managed platforms from deriving the actual SE clock parameters
required for GSI TRE programming.
drivers as portable as possible.
I understand geni_se_clk_freq_match() has been around for a while, but
fortunately its use seems limited to only a few qcom specific drivers.
Rather than continue down this path, would it not be possible to find
a more generic solution for "geni_se_clk_freq_match()"? Can we replace
it with a common clock/OPP API? In this way, we would not need to
sprinkle drivers with calls to platform specific code.
are managed through the clock framework or a firmware-provided performance domain.
The intent of this series is actually to move in that direction rather than
introduce a separate flow. Today firmware-managed platforms cannot use
geni_se_clk_freq_match() because clk_perf_tbl is only populated when a Linux clock
is present. This series derives the same clock-performance information(clk_perf_tbl) from the OPP
table and populates clk_perf_tbl during geni_se_domain_attach(), allowing both
resource-management models to reuse the existing geni_se_clk_freq_match() infrastructure.
Likewise, geni_se_set_rate() hides whether the underlying implementation uses
dev_pm_opp_set_rate() on a perf-domain device or a regular clock-backed device,
so protocol drivers no longer need platform-specific callbacks. The goal is to
converge both paths behind common GENI helpers rather than maintain separate
clock-selection mechanisms.
I agree with the goal of using generic infrastructure. However, geni_se_clk_freq_match()
To address this limitation, the performance-domain OPP table is treatedRather than adding yet another platform specific method, would it be
as the representation of SE-supported source clock frequencies. During
geni_se_domain_attach(), the OPP entries are used to populate
clk_perf_tbl and related clock performance data, allowing
firmware-managed platforms to leverage the same clock frequency matching
infrastructure used by Linux-managed platforms.
With this change, protocol drivers can use geni_se_clk_freq_match() to
select the closest supported source clock frequency for a requested
protocol rate, derive the corresponding source clock index and divider
values required for GSI TRE programming, and apply the matched clock
through the OPP framework. This removes the dependency on direct
protocol-frequency-to-performance-level mappings and provides a common
clock selection and configuration mechanism across both firmware-managed
and Linux-managed GENI deployments.
possible to extend the generic OPP library with the pieces that are
missing to make this work in a generic way?
derives GENI-specific parameters such as the source clock, clock index, and divider values
required for GSI TRE programming, which are not represented by the generic OPP interface today.
This series does not introduce a new clock selection path; it reuses the existing
geni_se_clk_freq_match() flow on firmware-managed platforms by populating
clk_perf_tbl from OPP data.
Signed-off-by: Praveen Talari <praveen.talari@xxxxxxxxxxxxxxxx>Kind regards
Uffe
---
Changes in v2:
- Add new patch to remove OPP rate reset from resource deactivation
- Add new patch to vote source frequency via OPP for I2C
- Compress the SPI, I2C and serial commit messages per review feedback
- Drop a stray blank line before trace_geni_i2c_bus_setup() in the
I2C resource-initialization helper commit.
- Link to v1: https://patch.msgid.link/20260805-derive_clk_perf_tbl_from_perf_domain_opp_table-v1-0-61171ab1cdce@xxxxxxxxxxxxxxxx
---
Praveen Talari (9):
pmdomain: arm: Fix -EINVAL from scmi_pd_set_perf_state() on state 0
soc: qcom: geni-se: Populate clk_perf_tbl with SE source clock frequencies from perf OPP table
soc: qcom: geni-se: Add helper to set SE clock rate via OPP
soc: qcom: geni-se: Remove OPP rate reset from resource deactivation
serial: qcom-geni: Use geni_se_set_rate() for source clock configuration
spi: qcom-geni: Use geni_se_set_rate() for setting source clock frequency
i2c: qcom-geni: Vote for SE clock rate using OPP
i2c: qcom-geni: Use common GENI resource initialization helper
i2c: qcom-geni: Use geni_se_set_rate() for setting source clock frequency
drivers/i2c/busses/i2c-qcom-geni.c | 72 +++++++++++++++++----------------
drivers/pmdomain/arm/scmi_perf_domain.c | 2 +-
drivers/soc/qcom/qcom-geni-se.c | 62 +++++++++++++++++++++++++---
drivers/spi/spi-geni-qcom.c | 24 +++++------
drivers/tty/serial/qcom_geni_serial.c | 26 ++++++------
include/linux/soc/qcom/geni-se.h | 2 +
6 files changed, 122 insertions(+), 66 deletions(-)
---
base-commit: 0f6da28aab51b16762ed82e8fdeaa5042da45b08
change-id: 20260805-derive_clk_perf_tbl_from_perf_domain_opp_table-2f29ad32226a
Best regards,
--
Praveen Talari <praveen.talari@xxxxxxxxxxxxxxxx>