All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnd Bergmann <arnd@arndb.de>
To: Richard Kuo <rkuo@codeaurora.org>
Cc: linux-kernel@vger.kernel.org, linux-hexagon@vger.kernel.org
Subject: Re: [patch v2 18/35] Hexagon: Add time and timer functions
Date: Wed, 31 Aug 2011 16:04:52 +0200	[thread overview]
Message-ID: <201108311604.52634.arnd@arndb.de> (raw)
In-Reply-To: <20110830190801.448257740@codeaurora.org>

On Tuesday 30 August 2011, Richard Kuo wrote:
> Signed-off-by: Richard Kuo <rkuo@codeaurora.org>

> +#ifdef CONFIG_SMP
> +void setup_percpu_clockdev(void);
> +void ipi_timer(void);
> +#endif

You should never need to wrap declarations with #ifdef like this.

> +
> +#ifndef _ASM_TIMER_REGS_H
> +#define _ASM_TIMER_REGS_H
> +
> +/*  This stuff should go into a platform specific file  */
> +#define TCX0_CLK_RATE		19200
> +#define TIMER_ENABLE		0
> +#define TIMER_CLR_ON_MATCH	1

Same comment as for NR_IRQS. If this is platform specific, it should
not be a compile-time constant.


>+/*
>+ * For now, hard wire the simulated CPU/pcycle frequency.
>+ * XXX TODO fish it out of device tree!
>+ */
>+#define CPU_MHZ 600
>+
>+static struct resource rtos_timer_resources[] = {
>+       {
>+               .start  = RTOS_TIMER_REGS_ADDR,
>+               .end    = RTOS_TIMER_REGS_ADDR+PAGE_SIZE-1,
>+               .flags  = IORESOURCE_MEM,
>+       },
>+};

Yes, please do get it out of the device tree before merging the driver
upstream.

> +/*  A lot of this stuff should move into a platform specific section.  */
> +struct adsp_hw_timer_struct {
> +	unsigned int match;   /*  Match value  */
> +	unsigned int count;
> +	unsigned int enable;  /*  [1] - CLR_ON_MATCH_EN, [0] - EN  */
> +	unsigned int clear;   /*  one-shot register that clears the count  */
> +};
> +
> +/*  Look for "TCX0" for related constants.  */
> +static volatile struct adsp_hw_timer_struct *rtos_timer = (void *) 0x0;

There are multiple things wrong with this:

* No need to initialize static variables to zero

* This is an MMIO register, so the pointer must be "__iomem", not "volatile",
  see Documentation/volatile-considered-harmful.txt

* You should have found this when building with 'make C=1' using sparse.
  I would hope that all your code was compiled this way to find common
  errors. If not, please do so now.

* Use u32 instead of unsigned int when describing hardware structures.
  They are always identical, but u32 is more descriptive. Alternatively,
  use no structure at all but constant register numbers.

> +static struct clock_event_device hexagon_clockevent_dev = {
> +	.name		= "clockevent",
> +	.features	= CLOCK_EVT_FEAT_ONESHOT,
> +	.rating		= 400,
> +	.shift		= 32,
> +	.irq		= RTOS_TIMER_INT,
> +	.set_next_event = set_next_event,
> +	.set_mode	= set_mode,
> +#ifdef CONFIG_SMP
> +	.broadcast	= broadcast
> +#endif
> +};

Always put a comma at the last entry, to allow adding more members
as necessary.

> +/*
> + * time_init_deferred - called by start_kernel to set up timer/clock source
> + *
> + * Install the IRQ handler for the clock, setup timers.
> + * This is done late, as that way, we can use ioremap().
> + *
> + * This runs just before the delay loop is calibrated, and
> + * is used for delay calibration.
> + */
> +void __init time_init_deferred(void)
> +{
> +	struct resource *resource = NULL;
> +	struct clock_event_device *ce_dev = &hexagon_clockevent_dev;
> +	struct device_node *dn;
> +	struct resource r;
> +	int err;
> +
> +#ifdef CONFIG_SMP
> +	ce_dev->cpumask = cpu_all_mask;
> +#else
> +	ce_dev->cpumask = cpumask_of(0);
> +#endif

No need for the #ifdef AFAICT, because the two cases are the same.

> +	if (!resource)
> +		resource = rtos_timer_device.resource;
> +
> +	/*  ioremap here means this has to run later, after paging init  */
> +	rtos_timer = ioremap(resource->start, resource->end
> +		- resource->start + 1);

When the device is in the device tree, you can simplify this a lot
by using of_iomap().

> +void __udelay(unsigned long usecs)
> +{
> +	unsigned long long start = __vmgettime();
> +	unsigned long long finish = (CPU_MHZ * usecs) - fudgefactor;
> +
> +	while ((__vmgettime() - start) < finish)
> +		; /*  not sure how this improves readability  */
> +}

Better use cpu_relax() or a direct hypervisor yield call here instead of
the ';'. It should improve both readability and power consumption during
long delays.

	Arnd

  reply	other threads:[~2011-08-31 14:04 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-08-30 19:07 [patch v2 00/35] Hexagon: Add support for Qualcomm Hexagon architecture Richard Kuo
2011-08-30 19:07 ` [patch v2 01/35] Hexagon: Add generic headers Richard Kuo
2011-08-31 13:24   ` Arnd Bergmann
2011-08-31 19:51     ` David Brown
2011-08-31 20:00       ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 02/35] Hexagon: Core arch-specific header files Richard Kuo
2011-08-31 13:25   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 03/35] Hexagon: Add bitops support Richard Kuo
2011-08-31 13:26   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 04/35] Hexagon: Add atomic ops support Richard Kuo
2011-08-31 13:26   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 05/35] Hexagon: Add syscalls Richard Kuo
2011-08-31 13:34   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 06/35] Hexagon: Add processor and system headers Richard Kuo
2011-08-31 13:35   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 07/35] Hexagon: Add threadinfo Richard Kuo
2011-08-31 13:36   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 08/35] Hexagon: Add delay functions Richard Kuo
2011-08-31 13:39   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 09/35] Hexagon: Add checksum functions Richard Kuo
2011-08-30 19:34   ` Joe Perches
2011-08-30 19:52     ` Sam Ravnborg
2011-08-31 14:49   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 10/35] Hexagon: Add memcpy and memset accelerated functions Richard Kuo
2011-08-31 13:40   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 11/35] Hexagon: Add hypervisor interface Richard Kuo
2011-08-31 13:41   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 12/35] Hexagon: Export ksyms defined in assembly files Richard Kuo
2011-08-31 13:41   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 13/35] Hexagon: Support dynamic module loading Richard Kuo
2011-08-31 13:41   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 14/35] Hexagon: Add signal functions Richard Kuo
2011-08-31 13:42   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 15/35] Hexagon: Add init_task and process functions Richard Kuo
2011-08-31 13:45   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 16/35] Hexagon: Add startup code Richard Kuo
2011-08-31 13:46   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 17/35] Hexagon: Add interrupts Richard Kuo
2011-08-31 13:50   ` Arnd Bergmann
2011-08-31 16:16     ` Linas Vepstas (Code Aurora)
2011-08-30 19:07 ` [patch v2 18/35] Hexagon: Add time and timer functions Richard Kuo
2011-08-31 14:04   ` Arnd Bergmann [this message]
2011-08-30 19:07 ` [patch v2 19/35] Hexagon: Add ptrace support Richard Kuo
2011-08-31 14:07   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 20/35] Hexagon: Provide basic debugging and system trap support Richard Kuo
2011-08-31 14:08   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 21/35] Hexagon: Add SMP support Richard Kuo
2011-08-30 19:30   ` Joe Perches
2011-08-30 20:50     ` Richard Kuo
2011-08-31 15:00   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 22/35] Hexagon: Add locking types and functions Richard Kuo
2011-08-31 14:09   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 23/35] Hexagon: Add user access functions Richard Kuo
2011-08-31 14:10   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 24/35] Hexagon: Provide basic implementation and/or stubs for I/O routines Richard Kuo
2011-08-31 14:28   ` Arnd Bergmann
2011-08-31 14:47   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 25/35] Hexagon: Implement basic cache-flush support Richard Kuo
2011-08-31 14:49   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 26/35] Hexagon: Implement basic TLB management routines for Hexagon Richard Kuo
2011-08-31 14:49   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 27/35] Hexagon: Provide DMA implementation Richard Kuo
2011-08-31 14:51   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 28/35] Hexagon: Add ioremap support Richard Kuo
2011-08-31 14:53   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 29/35] Hexagon: Add page table header files & etc Richard Kuo
2011-08-31 14:57   ` Arnd Bergmann
2011-08-30 19:07 ` [patch v2 30/35] Hexagon: Add page-fault support Richard Kuo
2011-08-31 14:58   ` Arnd Bergmann
2011-08-30 19:08 ` [patch v2 31/35] Hexagon: kgdb support files Richard Kuo
2011-08-31 14:58   ` Arnd Bergmann
2011-08-30 19:08 ` [patch v2 32/35] Hexagon: Comet platform support Richard Kuo
2011-08-31 15:00   ` Arnd Bergmann
2011-08-30 19:08 ` [patch v2 33/35] Hexagon: Add configuration and makefiles for the Hexagon architecture Richard Kuo
2011-08-31 14:59   ` Arnd Bergmann
2011-08-30 19:08 ` [patch v2 34/35] Hexagon: Add basic stacktrace functionality for " Richard Kuo
2011-08-31 14:59   ` Arnd Bergmann
2011-08-30 19:08 ` [patch v2 35/35] Hexagon: Add self to MAINTAINERS Richard Kuo
2011-08-31 14:59   ` Arnd Bergmann
2011-08-30 20:18 ` [patch v2 00/35] Hexagon: Add support for Qualcomm Hexagon architecture Pekka Enberg
2011-08-30 20:18   ` Pekka Enberg
2011-08-30 20:48   ` Linas Vepstas (Code Aurora)
2011-08-30 20:48     ` Linas Vepstas (Code Aurora)
2011-08-31 15:08 ` Arnd Bergmann

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=201108311604.52634.arnd@arndb.de \
    --to=arnd@arndb.de \
    --cc=linux-hexagon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rkuo@codeaurora.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.