All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] FW: rtdm_iomap_to_user() I-pipe error
@ 2011-04-14  6:14 Asier Tamayo
  2011-04-14  7:34 ` Jan Kiszka
  0 siblings, 1 reply; 9+ messages in thread
From: Asier Tamayo @ 2011-04-14  6:14 UTC (permalink / raw)
  To: xenomai


Hello,

I'm porting a PCI driver to a RTDM. Until now, I have successfully done most of the job.

I'm using Xenomai version 2.4.7 and Linux 2.6.27, from the ELinOS 5.0 distribution.

My problem appears with the rtdm_iomap_to_user() function. I want to allow a RT task to access the PCI memory directly, via mmap. As the RTDM has no mmap() function, I'm trying to use rtdm_iomap_to_user, but it always gives me the following error:

	I-pipe: Detected illicit call from domain 'Xenomai'
	        into a service reserved for domain 'Linux' and below.
	Pid: 991, comm: demo Not tainted 2.6.27.31-ELinOS-59 #66
	 [<c013682b>] ipipe_check_context+0x90/0x9a
	 [<c017ca34>] kmem_cache_alloc+0x23/0xd2
	 [<c0180038>] ? get_empty_filp+0x51/0xc0
	 [<c010db8f>] ? mcount+0x1f/0x23
	 [<c0180038>] get_empty_filp+0x51/0xc0
	 [<c0186ba9>] __path_lookup_intent_open+0x1e/0x7b
	 [<c0186c1b>] path_lookup_open+0x15/0x17
	 [<c01875aa>] do_filp_open+0x82/0x5c8
	 [<c010db8f>] ? mcount+0x1f/0x23
	 [<c0187af8>] ? filp_open+0x8/0x1c
	 [<c0187b07>] filp_open+0x17/0x1c
	 [<c016383d>] rtdm_do_mmap+0x27/0xb3
	 [<c01638f8>] rtdm_iomap_to_user+0x2f/0x31
	(...)
	 =======================
	I-pipe tracer log (100 points):
	    + func                    0 ipipe_trace_panic_freeze+0x9 (ipipe_check_context+0x3f)
	    + func                    0 ipipe_check_context+0x9 (kmem_cache_alloc+0x23)
	    + func                    0 kmem_cache_alloc+0xe (get_empty_filp+0x51)
	    + func                   -1 get_empty_filp+0xa (__path_lookup_intent_open+0x1e)
	    + func                   -2 __path_lookup_intent_open+0xe (path_lookup_open+0x15)
	    + func                   -2 path_lookup_open+0x8 (do_filp_open+0x82)
	    + func                   -3 do_filp_open+0xe (filp_open+0x17)
	    + func                   -4 filp_open+0x8 (rtdm_do_mmap+0x27)
	    + func                   -4 rtdm_do_mmap+0xe (rtdm_iomap_to_user+0x2f)
	    + func                   -5 rtdm_iomap_to_user+0xb (filstrup_rt_ioctl+0x102 [filstrup1_drv])
	(...)
	filstrup1_drv: rtdm_mmap = b5f02000 (retval 0)
	filstrup1_drv: rtdm_mmap = b5f02000 (retval 0)

My code is the following (simplified):

	struct xen_mydriver_context *xen_mydriver;

	int mydriver_rt_ioctl(struct rtdm_dev_context *context, rtdm_user_info_t *user_info, unsigned int cmd, void *arg)
	{
		(...)
		my_context = (struct xen_mydriver_context *)context->dev_private;
		switch(cmd) 
		{
		case IOCTL_MMAP:
			retval = rtdm_iomap_to_user(user_info,my_context->location, 300, PROT_READ|PROT_WRITE, (void**)arg, NULL, NULL);
			break;
		(...)
	}

	static int __devinit mydriver_probe(struct pci_dev *dev, const struct pci_device_id *id)
	{
		struct rtdm_device *rtdm_dev;
		(...)
		ret_val = pci_enable_device(dev);
		(...)
		xen_mydriver->location = pci_resource_start(dev,0);	// Physical address
		xen_mydriver->mem_size = pci_resource_len(dev,0);
		rtdm_dev = rtdm_malloc(sizeof(struct rtdm_device));
		(...)
		request_mem_region(xen_mydriver->location, xen_mydriver->mem_size, rtdm_dev->device_name);
		xen_mydriver->base_address = ioremap(xen_mydriver->location, xen_mydriver->mem_size);
		(...)
		ret_val = rtdm_dev_register(rtdm_dev);
	}

The value of xen_mydriver->location is 0x20000000. The value of xen_mydriver->base_address is 0xe0a00000.

My driver runs correctly until I call the IOCTL_MMAP ioctl. I can write to the PCI device directly in the RTDM driver by using the xen_mydriver->base_address pointer, but can't do it from the RT task.

I have searched the lists, but found no piece of information that could help me. I've found some clues (pci_alloc_consistent, rt_heap_*, /dev/rtheap, ...), but it has been impossible for me to solve this problem.

Can anyone help me with this issue? Has anyone got an example of how to use rtdm_iomap_to_user()? 

Thanks in advance, 

Asier





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2011-04-28  8:54 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-14  6:14 [Xenomai-help] FW: rtdm_iomap_to_user() I-pipe error Asier Tamayo
2011-04-14  7:34 ` Jan Kiszka
2011-04-14  9:38   ` Asier Tamayo
2011-04-26 10:05     ` Asier Tamayo
2011-04-26 11:15       ` Gilles Chanteperdrix
2011-04-27  7:05         ` Asier Tamayo
2011-04-27  7:42           ` Gilles Chanteperdrix
2011-04-27 17:36             ` Gilles Chanteperdrix
2011-04-28  8:54               ` Asier Tamayo

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.