linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: julien.grall@arm.com (Julien Grall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] xen/arm: register clocks used by the hypervisor
Date: Wed, 22 Jun 2016 16:26:46 +0100	[thread overview]
Message-ID: <576AAE36.9070501@arm.com> (raw)
In-Reply-To: <1466504165-9214-1-git-send-email-dirk.behme@de.bosch.com>

Hello Dirk,

On 21/06/16 11:16, Dirk Behme wrote:
> Some clocks might be used by the Xen hypervisor and not by the Linux
> kernel. If these are not registered by the Linux kernel, they might be
> disabled by clk_disable_unused() as the kernel doesn't know that they
> are used. The clock of the serial console handled by Xen is one
> example for this. It might be disabled by clk_disable_unused() which
> stops the whole serial output, even from Xen, then.
>
> Up to now, the workaround for this has been to use the Linux kernel
> command line parameter 'clk_ignore_unused'. See Xen bug
>
> http://bugs.xenproject.org/xen/bug/45
>
> too.
>
> To fix this, we will add the "unused" clocks in Xen to the hypervisor
> node. The Linux kernel has to register the clocks from the hypervisor
> node, then.
>
> Therefore, check if there is a "clocks" entry in the hypervisor node
> and if so register the given clocks to the Linux kernel clock
> framework and with this mark them as used. This prevents the clocks
> from being disabled.

This new property would need to be documented in:
    - linux/Documentation/devicetree/bindings/arm/xen.txt
    - xen/docs/misc/arm/device-tree/guest.txt

>
> Signed-off-by: Dirk Behme <dirk.behme@de.bosch.com>
> ---
>   arch/arm/xen/enlighten.c | 35 +++++++++++++++++++++++++++++++++++
>   1 file changed, 35 insertions(+)
>
> diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c
> index 75cd734..ee6e81f 100644
> --- a/arch/arm/xen/enlighten.c
> +++ b/arch/arm/xen/enlighten.c
> @@ -22,6 +22,7 @@
>   #include <linux/of.h>
>   #include <linux/of_irq.h>
>   #include <linux/of_address.h>
> +#include <linux/clk-provider.h>
>   #include <linux/cpuidle.h>
>   #include <linux/cpufreq.h>
>   #include <linux/cpu.h>
> @@ -381,6 +382,40 @@ static int __init xen_pm_init(void)
>   }
>   late_initcall(xen_pm_init);
>
> +/*
> + * Check if we want to register some clocks, that they
> + * are not freed because unused by clk_disable_unused().
> + * E.g. the serial console clock.
> + */
> +static int __init xen_arm_register_clks(void)
> +{
> +	struct clk *clk;
> +	unsigned int i, count;
> +	int ret;
> +
> +	count = of_clk_get_parent_count(xen_node);

The code in this file has changed quite a lot with the support of ACPI. 
For instance "xen_node" is not anymore a global variable. Can you rebase 
your rework on top of the branch for-linus-4.8?

You can find the branch in:

git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip.git

> +	if (!count)
> +		return 0;
> +
> +	for (i = 0; i < count; i++) {
> +		clk = of_clk_get(xen_node, i);
> +		if (IS_ERR(clk)) {
> +			pr_err("Xen failed to register clock %i. Error: %li\n",
> +			       i, PTR_ERR(clk));
> +			return PTR_ERR(clk);
> +		}
> +
> +		ret = clk_prepare_enable(clk);

I am not sure why we would want Linux to enable the clock. Should not it 
be already done either by the firmware or Xen?

Would it be possible to use the flags CLK_IGNORE_UNUSED instead? So the 
clock will be ignored by clk_disable_unused_subtree.

> +		if (ret < 0) {
> +			pr_err("Xen failed to enable clock %i. Error: %i\n",
> +			       i, ret);
> +			return ret;
> +		}
> +	}
> +
> +	return 0;
> +}
> +late_initcall(xen_arm_register_clks);
>
>   /* empty stubs */
>   void xen_arch_pre_suspend(void) { }
>

Regards,

-- 
Julien Grall

  parent reply	other threads:[~2016-06-22 15:26 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-21 10:16 [PATCH] xen/arm: register clocks used by the hypervisor Dirk Behme
2016-06-21 10:22 ` Dirk Behme
2016-06-22 15:26 ` Julien Grall [this message]
2016-06-22 15:46   ` Mark Rutland
2016-06-29 15:49   ` Dirk Behme
2016-06-30  9:19     ` Julien Grall

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=576AAE36.9070501@arm.com \
    --to=julien.grall@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).