[prev in list] [next in list] [prev in thread] [next in thread]
List: linux-serial
Subject: Re: [PATCH V3 3/8] soc: qcom-geni-se: Add interconnect support to fix earlycon crash
From: Matthias Kaehlcke <mka () chromium ! org>
Date: 2020-03-31 18:24:57
Message-ID: 20200331182457.GH199755 () google ! com
[Download RAW message or body]
Hi Akash,
On Tue, Mar 31, 2020 at 04:39:31PM +0530, Akash Asthana wrote:
> QUP core clock is shared among all the SE drivers present on particular
> QUP wrapper, the system will reset(unclocked access) if earlycon used after
> QUP core clock is put to 0 from other SE drivers before real console comes
> up.
>
> As earlycon can't vote for it's QUP core need, to fix this add ICC
> support to common/QUP wrapper driver and put vote for QUP core from
> probe on behalf of earlycon and remove vote during earlycon exit call.
>
> Signed-off-by: Akash Asthana <akashast@codeaurora.org>
> Reported-by: Matthias Kaehlcke <mka@chromium.org>
> ---
> Change is V3:
> - Add geni_remove_earlycon_icc_vote API that will be used by earlycon
> exit function to remove ICC vote for earlyconsole.
> - Remove suspend/resume hook for geni-se driver as we are no longer
> removing earlyconsole ICC vote from system suspend, we are removing
> from earlycon exit.
>
> drivers/soc/qcom/qcom-geni-se.c | 51 +++++++++++++++++++++++++++++++++++
> drivers/tty/serial/qcom_geni_serial.c | 7 +++++
> include/linux/qcom-geni-se.h | 2 ++
> 3 files changed, 60 insertions(+)
>
> diff --git a/drivers/soc/qcom/qcom-geni-se.c b/drivers/soc/qcom/qcom-geni-se.c
> index 9344c14..d30c282 100644
> --- a/drivers/soc/qcom/qcom-geni-se.c
> +++ b/drivers/soc/qcom/qcom-geni-se.c
> @@ -90,8 +90,11 @@ struct geni_wrapper {
> struct device *dev;
> void __iomem *base;
> struct clk_bulk_data ahb_clks[NUM_AHB_CLKS];
> + struct geni_icc_path to_core;
> };
>
> +struct geni_wrapper *earlycon_wrapper;
should be static
> +
> #define QUP_HW_VER_REG 0x4
>
> /* Common SE registers */
> @@ -818,6 +821,26 @@ int geni_icc_vote_off(struct geni_se *se)
> }
> EXPORT_SYMBOL(geni_icc_vote_off);
>
> +void geni_remove_earlycon_icc_vote(void)
> +{
> + struct geni_wrapper *wrapper = earlycon_wrapper;
> + struct device_node *parent = of_get_next_parent(wrapper->dev->of_node);
> + struct device_node *child;
> +
> + for_each_child_of_node(parent, child) {
> + if (of_device_is_compatible(child, "qcom,geni-se-qup")) {
> + wrapper = platform_get_drvdata(of_find_device_by_node(
> + child));
> + icc_put(wrapper->to_core.path);
> + wrapper->to_core.path = NULL;
> + }
> + }
> + of_node_put(parent);
> +
> + earlycon_wrapper = NULL;
> +}
> +EXPORT_SYMBOL(geni_remove_earlycon_icc_vote);
I didn't know that consoles have an exit handler, this is way nicer than
the miscellaneous triggers we discussed earlier :)
> +
> static int geni_se_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -845,6 +868,34 @@ static int geni_se_probe(struct platform_device *pdev)
> }
> }
>
> +#ifdef CONFIG_SERIAL_EARLYCON
> + wrapper->to_core.path = devm_of_icc_get(dev, "qup-core");
> + if (IS_ERR(wrapper->to_core.path))
> + return PTR_ERR(wrapper->to_core.path);
> + /*
> + * Put minmal BW request on core clocks on behalf of early console.
> + * The vote will be removed earlycon exit function.
> + *
> + * Note: We are putting vote on each QUP wrapper instead only to which
> + * earlycon is connected because QUP core clock of different wrapper
> + * share same voltage domain. If core1 is put to 0, then core2 will
> + * also run at 0, if not voted. Default ICC vote will be removed ASA
> + * we touch any of the core clock.
> + * core1 = core2 = max(core1, core2)
> + */
I don't really understand this part. According to the comment if we vote
(let's say) for core2 but not for core1 then:
core1: 0
core2: GENI_DEFAULT_BW
core1 = core2 = max(core1, core2)
or
core1 = core2 = max(0, GENI_DEFAULT_BW)
hence
core1 = core2 = GENI_DEFAULT_BW
What am I missing, why is it necessary to vote for both/all?
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic