From: Jim Gettys <jg@laptop.org>
To: Neil Horman <nhorman@tuxdriver.com>
Cc: linux-kernel@vger.kernel.org, a.zummo@towertech.it,
jg@freedesktop.org, Keith Packard <keithp@keithp.com>
Subject: Re: [PATCH] RTC: Add mmap method to rtc character driver
Date: Tue, 25 Jul 2006 14:00:31 -0400 [thread overview]
Message-ID: <1153850431.5872.104.camel@localhost.localdomain> (raw)
In-Reply-To: <20060725174100.GA4608@hmsreliant.homelinux.net>
Actually, it was Keith Packard who asked for this (and we've asked for
it before in the past).
I will note, that if my memory serves me right, the first X driver we
ever did (1984) had this feature.
Regards,
- Jim
("X is an exercise in avoiding system calls.")
P.S. my name is spelled "Gettys".
On Tue, 2006-07-25 at 13:41 -0400, Neil Horman wrote:
> Hey-
> At OLS last week, During Dave Jones Userspace Sucks presentation, Jim
> Geddys and some of the Xorg guys noted that they would be able to stop using gettimeofday
> so frequently, if they had some other way to get a millisecond resolution timer
> in userspace, one that they could perhaps read from a memory mapped page. I was
> right behind them and though that seemed like a reasonable request, so I've
> taken a stab at it. This patch allows for a page to be mmaped from /dev/rtc
> character interface, the first 4 bytes of which provide a regularly increasing
> count, once every rtc interrupt. The frequency is of course controlled by the
> regular ioctls provided by the rtc driver. I've done some basic testing on it,
> and it seems to work well.
>
> Thanks And Regards
> Neil
>
> Signed-off-by: Neil Horman
>
>
>
> rtc.c | 41 ++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 40 insertions(+), 1 deletion(-)
>
>
> diff --git a/drivers/char/rtc.c b/drivers/char/rtc.c
> index 6e6a7c7..4ed673e 100644
> --- a/drivers/char/rtc.c
> +++ b/drivers/char/rtc.c
> @@ -48,9 +48,10 @@
> * CONFIG_HPET_EMULATE_RTC
> * 1.12a Maciej W. Rozycki: Handle memory-mapped chips properly.
> * 1.12ac Alan Cox: Allow read access to the day of week register
> + * 1.12b Neil Horman: Allow memory mapping of /dev/rtc
> */
>
> -#define RTC_VERSION "1.12ac"
> +#define RTC_VERSION "1.12b"
>
> /*
> * Note that *all* calls to CMOS_READ and CMOS_WRITE are done with
> @@ -183,6 +184,8 @@ static int rtc_proc_open(struct inode *i
> */
> static unsigned long rtc_status = 0; /* bitmapped status byte. */
> static unsigned long rtc_freq = 0; /* Current periodic IRQ rate */
> +#define BUF_SIZE (PAGE_SIZE/sizeof(unsigned long))
> +static unsigned long rtc_irq_buf[BUF_SIZE] __attribute__ ((aligned (PAGE_SIZE)));
> static unsigned long rtc_irq_data = 0; /* our output to the world */
> static unsigned long rtc_max_user_freq = 64; /* > this, need CAP_SYS_RESOURCE */
>
> @@ -230,6 +233,7 @@ static inline unsigned char rtc_is_updat
>
> irqreturn_t rtc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
> {
> + unsigned long *count_ptr = (unsigned long *)rtc_irq_buf;
> /*
> * Can be an alarm interrupt, update complete interrupt,
> * or a periodic interrupt. We store the status in the
> @@ -265,6 +269,7 @@ irqreturn_t rtc_interrupt(int irq, void
>
> kill_fasync (&rtc_async_queue, SIGIO, POLL_IN);
>
> + *count_ptr = (*count_ptr)++;
> return IRQ_HANDLED;
> }
> #endif
> @@ -389,6 +394,37 @@ static ssize_t rtc_read(struct file *fil
> #endif
> }
>
> +static int rtc_mmap(struct file *file, struct vm_area_struct *vma)
> +{
> + unsigned long rtc_addr;
> + unsigned long *count_ptr = rtc_irq_buf;
> +
> + if (vma->vm_end - vma->vm_start != PAGE_SIZE)
> + return -EINVAL;
> +
> + if (vma->vm_flags & VM_WRITE)
> + return -EPERM;
> +
> + if (PAGE_SIZE > (1 << 16))
> + return -ENOSYS;
> +
> + vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
> +
> + rtc_addr = __pa(rtc_irq_buf);
> + rtc_addr &= ~(PAGE_SIZE - 1);
> + rtc_addr &= -1;
> +
> + if (remap_pfn_range(vma, vma->vm_start, rtc_addr >> PAGE_SHIFT,
> + PAGE_SIZE, vma->vm_page_prot)) {
> + printk(KERN_ERR "remap_pfn_range failed in rtc.c\n");
> + return -EAGAIN;
> + }
> +
> + *count_ptr = 0;
> + return 0;
> +
> +}
> +
> static int rtc_do_ioctl(unsigned int cmd, unsigned long arg, int kernel)
> {
> struct rtc_time wtime;
> @@ -890,6 +926,7 @@ static const struct file_operations rtc_
> .owner = THIS_MODULE,
> .llseek = no_llseek,
> .read = rtc_read,
> + .mmap = rtc_mmap,
> #ifdef RTC_IRQ
> .poll = rtc_poll,
> #endif
> @@ -1082,6 +1119,8 @@ no_irq:
> no_irq2:
> #endif
>
> + memset(rtc_irq_buf,0,PAGE_SIZE);
> +
> (void) init_sysctl();
>
> printk(KERN_INFO "Real Time Clock Driver v" RTC_VERSION "\n");
--
Jim Gettys
One Laptop Per Child
next prev parent reply other threads:[~2006-07-25 18:00 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-07-25 17:41 [PATCH] RTC: Add mmap method to rtc character driver Neil Horman
2006-07-25 17:55 ` Arjan van de Ven
2006-07-25 18:01 ` Jim Gettys
2006-07-25 18:22 ` Neil Horman
2006-07-25 18:32 ` Arjan van de Ven
2006-07-25 18:43 ` Neil Horman
2006-07-25 18:53 ` Arjan van de Ven
2006-07-25 19:03 ` Neil Horman
2006-07-25 19:06 ` Arjan van de Ven
2006-07-25 19:07 ` John W. Linville
2006-07-25 19:16 ` Arjan van de Ven
2006-07-25 19:08 ` H. Peter Anvin
2006-07-25 17:57 ` Segher Boessenkool
2006-07-25 18:28 ` Neil Horman
2006-07-25 18:56 ` Segher Boessenkool
2006-07-25 19:07 ` Neil Horman
2006-07-25 19:10 ` H. Peter Anvin
2006-07-25 19:21 ` Neil Horman
2006-07-25 19:31 ` Segher Boessenkool
2006-07-25 19:47 ` Neil Horman
2006-07-25 20:04 ` Dave Airlie
2006-07-25 20:24 ` H. Peter Anvin
2006-07-25 20:47 ` Neil Horman
2006-07-25 20:50 ` H. Peter Anvin
2006-07-25 22:25 ` Neil Horman
2006-07-25 22:33 ` H. Peter Anvin
2006-07-25 23:10 ` Neil Horman
2006-07-25 23:22 ` H. Peter Anvin
2006-07-26 0:03 ` Neil Horman
2006-07-25 23:29 ` David Lang
2006-07-26 0:18 ` Neil Horman
2006-07-25 23:29 ` Segher Boessenkool
2006-07-25 23:56 ` Neil Horman
2006-07-26 0:02 ` H. Peter Anvin
2006-07-26 0:20 ` Neil Horman
2006-07-26 0:36 ` H. Peter Anvin
2006-07-26 14:45 ` A better interface, perhaps: a timed signal flag Theodore Tso
2006-07-28 13:33 ` Steven Rostedt
2006-07-28 14:52 ` Theodore Tso
2006-07-28 15:05 ` Steven Rostedt
2006-07-28 16:41 ` Alan Cox
2006-07-28 16:44 ` Steven Rostedt
2006-07-28 20:01 ` Alan Cox
2006-07-28 20:12 ` Steven Rostedt
2006-07-28 20:36 ` Alan Cox
2006-07-28 20:31 ` Steven Rostedt
2006-07-28 17:11 ` H. Peter Anvin
2006-07-25 20:58 ` [PATCH] RTC: Add mmap method to rtc character driver Jim Gettys
2006-07-25 21:04 ` H. Peter Anvin
2006-07-25 21:14 ` Jim Gettys
2006-07-25 21:18 ` H. Peter Anvin
2006-07-25 21:39 ` Jim Gettys
2006-07-29 4:28 ` Bill Huey
2006-07-29 12:54 ` Neil Horman
2006-07-29 20:41 ` Bill Huey
2006-07-29 21:43 ` Neil Horman
2006-07-29 22:45 ` Keith Packard
2006-07-29 23:18 ` Edgar Toernig
2006-07-29 21:49 ` Edgar Toernig
2006-07-29 22:51 ` itimer again (Re: [PATCH] RTC: Add mmap method to rtc character driver) Bill Huey
2006-07-29 23:35 ` Nicholas Miell
2006-07-30 1:00 ` Bill Huey
2006-07-30 1:22 ` Nicholas Miell
2006-07-30 1:39 ` Bill Huey
2006-07-30 2:02 ` Nicholas Miell
2006-07-30 14:33 ` Theodore Tso
2006-07-30 22:20 ` Bill Huey
2006-07-31 15:40 ` Theodore Tso
2006-07-30 0:16 ` Edgar Toernig
2006-07-30 0:24 ` Bill Huey
2006-07-29 14:02 ` [PATCH] RTC: Add mmap method to rtc character driver Thomas Gleixner
2006-07-26 13:17 ` Martin J. Bligh
2006-08-02 3:54 ` john stultz
2006-08-02 4:26 ` H. Peter Anvin
2006-08-02 4:34 ` john stultz
2006-07-25 23:26 ` Segher Boessenkool
2006-07-26 0:10 ` Neil Horman
2006-07-25 20:03 ` Paul Mackerras
2006-07-25 23:27 ` Segher Boessenkool
2006-07-26 0:06 ` Neil Horman
2006-07-25 18:00 ` Jim Gettys [this message]
2006-07-25 18:17 ` Neil Horman
2006-07-26 15:16 ` Andi Kleen
2006-07-26 17:25 ` Jim Gettys
2006-07-27 23:53 ` Paul Mackerras
2006-07-28 3:29 ` Jim Gettys
2006-07-28 11:59 ` Neil Horman
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=1153850431.5872.104.camel@localhost.localdomain \
--to=jg@laptop.org \
--cc=a.zummo@towertech.it \
--cc=jg@freedesktop.org \
--cc=keithp@keithp.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nhorman@tuxdriver.com \
/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.