VME Device Drivers¶
Driver registration¶
As with other subsystems within the Linux kernel, VME device drivers register
with the VME subsystem, typically called from the devices init routine. This is
achieved via a call to vme_register_driver()
.
A pointer to a structure of type struct vme_driver
must
be provided to the registration function. Along with the maximum number of
devices your driver is able to support.
At the minimum, the ‘.name’, ‘.match’ and ‘.probe’ elements of
struct vme_driver
should be correctly set. The ‘.name’
element is a pointer to a string holding the device driver’s name.
The ‘.match’ function allows control over which VME devices should be registered with the driver. The match function should return 1 if a device should be probed and 0 otherwise. This example match function (from vme_user.c) limits the number of devices probed to one:
#define USER_BUS_MAX 1
...
static int vme_user_match(struct vme_dev *vdev)
{
if (vdev->id.num >= USER_BUS_MAX)
return 0;
return 1;
}
The ‘.probe’ element should contain a pointer to the probe routine. The
probe routine is passed a struct vme_dev
pointer as an
argument.
Here, the ‘num’ field refers to the sequential device ID for this specific driver. The bridge number (or bus number) can be accessed using dev->bridge->num.
A function is also provided to unregister the driver from the VME core called
vme_unregister_driver()
and should usually be called from the device
driver’s exit routine.
Resource management¶
Once a driver has registered with the VME core the provided match routine will be called the number of times specified during the registration. If a match succeeds, a non-zero value should be returned. A zero return value indicates failure. For all successful matches, the probe routine of the corresponding driver is called. The probe routine is passed a pointer to the devices device structure. This pointer should be saved, it will be required for requesting VME resources.
The driver can request ownership of one or more master windows
(vme_master_request()
), slave windows (vme_slave_request()
)
and/or dma channels (vme_dma_request()
). Rather than allowing the device
driver to request a specific window or DMA channel (which may be used by a
different driver) the API allows a resource to be assigned based on the required
attributes of the driver in question. For slave windows these attributes are
split into the VME address spaces that need to be accessed in ‘aspace’ and VME
bus cycle types required in ‘cycle’. Master windows add a further set of
attributes in ‘width’ specifying the required data transfer widths. These
attributes are defined as bitmasks and as such any combination of the
attributes can be requested for a single window, the core will assign a window
that meets the requirements, returning a pointer of type vme_resource that
should be used to identify the allocated resource when it is used. For DMA
controllers, the request function requires the potential direction of any
transfers to be provided in the route attributes. This is typically VME-to-MEM
and/or MEM-to-VME, though some hardware can support VME-to-VME and MEM-to-MEM
transfers as well as test pattern generation. If an unallocated window fitting
the requirements can not be found a NULL pointer will be returned.
Functions are also provided to free window allocations once they are no longer
required. These functions (vme_master_free()
, vme_slave_free()
and vme_dma_free()
) should be passed the pointer to the resource
provided during resource allocation.
Master windows¶
Master windows provide access from the local processor[s] out onto the VME bus. The number of windows available and the available access modes is dependent on the underlying chipset. A window must be configured before it can be used.
Master window configuration¶
Once a master window has been assigned vme_master_set()
can be used to
configure it and vme_master_get()
to retrieve the current settings. The
address spaces, transfer widths and cycle types are the same as described
under resource management, however some of the options are mutually exclusive.
For example, only one address space may be specified.
Master window access¶
The function vme_master_read()
can be used to read from and
vme_master_write()
used to write to configured master windows.
In addition to simple reads and writes, vme_master_rmw()
is provided to
do a read-modify-write transaction. Parts of a VME window can also be mapped
into user space memory using vme_master_mmap()
.
Slave windows¶
Slave windows provide devices on the VME bus access into mapped portions of the local memory. The number of windows available and the access modes that can be used is dependent on the underlying chipset. A window must be configured before it can be used.
Slave window configuration¶
Once a slave window has been assigned vme_slave_set()
can be used to
configure it and vme_slave_get()
to retrieve the current settings.
The address spaces, transfer widths and cycle types are the same as described under resource management, however some of the options are mutually exclusive. For example, only one address space may be specified.
Slave window buffer allocation¶
Functions are provided to allow the user to allocate
(vme_alloc_consistent()
) and free (vme_free_consistent()
)
contiguous buffers which will be accessible by the VME bridge. These functions
do not have to be used, other methods can be used to allocate a buffer, though
care must be taken to ensure that they are contiguous and accessible by the VME
bridge.
Slave window access¶
Slave windows map local memory onto the VME bus, the standard methods for accessing memory should be used.
DMA channels¶
The VME DMA transfer provides the ability to run link-list DMA transfers. The API introduces the concept of DMA lists. Each DMA list is a link-list which can be passed to a DMA controller. Multiple lists can be created, extended, executed, reused and destroyed.
List Management¶
The function vme_new_dma_list()
is provided to create and
vme_dma_list_free()
to destroy DMA lists. Execution of a list will not
automatically destroy the list, thus enabling a list to be reused for repetitive
tasks.
List Population¶
An item can be added to a list using vme_dma_list_add()
(the source and
destination attributes need to be created before calling this function, this is
covered under “Transfer Attributes”).
Note
The detailed attributes of the transfers source and destination are not checked until an entry is added to a DMA list, the request for a DMA channel purely checks the directions in which the controller is expected to transfer data. As a result it is possible for this call to return an error, for example if the source or destination is in an unsupported VME address space.
Transfer Attributes¶
The attributes for the source and destination are handled separately from adding an item to a list. This is due to the diverse attributes required for each type of source and destination. There are functions to create attributes for PCI, VME and pattern sources and destinations (where appropriate):
PCI source or destination:
vme_dma_pci_attribute()
VME source or destination:
vme_dma_vme_attribute()
Pattern source:
vme_dma_pattern_attribute()
The function vme_dma_free_attribute()
should be used to free an
attribute.
List Execution¶
The function vme_dma_list_exec()
queues a list for execution and will
return once the list has been executed.
Interrupts¶
The VME API provides functions to attach and detach callbacks to specific VME level and status ID combinations and for the generation of VME interrupts with specific VME level and status IDs.
Attaching Interrupt Handlers¶
The function vme_irq_request()
can be used to attach and
vme_irq_free()
to free a specific VME level and status ID combination.
Any given combination can only be assigned a single callback function. A void
pointer parameter is provided, the value of which is passed to the callback
function, the use of this pointer is user undefined. The callback parameters are
as follows. Care must be taken in writing a callback function, callback
functions run in interrupt context:
void callback(int level, int statid, void *priv);
Interrupt Generation¶
The function vme_irq_generate()
can be used to generate a VME interrupt
at a given VME level and VME status ID.
Location monitors¶
The VME API provides the following functionality to configure the location monitor.
Location Monitor Management¶
The function vme_lm_request()
is provided to request the use of a block
of location monitors and vme_lm_free()
to free them after they are no
longer required. Each block may provide a number of location monitors,
monitoring adjacent locations. The function vme_lm_count()
can be used
to determine how many locations are provided.
Location Monitor Configuration¶
Once a bank of location monitors has been allocated, the function
vme_lm_set()
is provided to configure the location and mode of the
location monitor. The function vme_lm_get()
can be used to retrieve
existing settings.
Location Monitor Use¶
The function vme_lm_attach()
enables a callback to be attached and
vme_lm_detach()
allows on to be detached from each location monitor
location. Each location monitor can monitor a number of adjacent locations. The
callback function is declared as follows.
void callback(void *data);
Slot Detection¶
The function vme_slot_num()
returns the slot ID of the provided bridge.
Bus Detection¶
The function vme_bus_num()
returns the bus ID of the provided bridge.
VME API¶
- struct vme_dev
Structure representing a VME device
Definition
struct vme_dev {
int num;
struct vme_bridge *bridge;
struct device dev;
struct list_head drv_list;
struct list_head bridge_list;
};
Members
num
The device number
bridge
Pointer to the bridge device this device is on
dev
Internal device structure
drv_list
List of devices (per driver)
bridge_list
List of devices (per bridge)
- struct vme_driver
Structure representing a VME driver
Definition
struct vme_driver {
const char *name;
int (*match)(struct vme_dev *);
int (*probe)(struct vme_dev *);
int (*remove)(struct vme_dev *);
struct device_driver driver;
struct list_head devices;
};
Members
name
Driver name, should be unique among VME drivers and usually the same as the module name.
match
Callback used to determine whether probe should be run.
probe
Callback for device binding, called when new device is detected.
remove
Callback, called on device removal.
driver
Underlying generic device driver structure.
devices
List of VME devices (struct vme_dev) associated with this driver.
-
void *vme_alloc_consistent(struct vme_resource *resource, size_t size, dma_addr_t *dma)¶
Allocate contiguous memory.
Parameters
struct vme_resource * resource
Pointer to VME resource.
size_t size
Size of allocation required.
dma_addr_t * dma
Pointer to variable to store physical address of allocation.
Description
Allocate a contiguous block of memory for use by the driver. This is used to create the buffers for the slave windows.
Return
Virtual address of allocation on success, NULL on failure.
-
void vme_free_consistent(struct vme_resource *resource, size_t size, void *vaddr, dma_addr_t dma)¶
Free previously allocated memory.
Parameters
struct vme_resource * resource
Pointer to VME resource.
size_t size
Size of allocation to free.
void * vaddr
Virtual address of allocation.
dma_addr_t dma
Physical address of allocation.
Description
Free previously allocated block of contiguous memory.
-
size_t vme_get_size(struct vme_resource *resource)¶
Helper function returning size of a VME window
Parameters
struct vme_resource * resource
Pointer to VME slave or master resource.
Description
Determine the size of the VME window provided. This is a helper function, wrappering the call to vme_master_get or vme_slave_get depending on the type of window resource handed to it.
Return
Size of the window on success, zero on failure.
-
struct vme_resource *vme_slave_request(struct vme_dev *vdev, u32 address, u32 cycle)¶
Request a VME slave window resource.
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
u32 address
Required VME address space.
u32 cycle
Required VME data transfer cycle type.
Description
Request use of a VME window resource capable of being set for the requested address space and data transfer cycle.
Return
Pointer to VME resource on success, NULL on failure.
-
int vme_slave_set(struct vme_resource *resource, int enabled, unsigned long long vme_base, unsigned long long size, dma_addr_t buf_base, u32 aspace, u32 cycle)¶
Set VME slave window configuration.
Parameters
struct vme_resource * resource
Pointer to VME slave resource.
int enabled
State to which the window should be configured.
unsigned long long vme_base
Base address for the window.
unsigned long long size
Size of the VME window.
dma_addr_t buf_base
Based address of buffer used to provide VME slave window storage.
u32 aspace
VME address space for the VME window.
u32 cycle
VME data transfer cycle type for the VME window.
Description
Set configuration for provided VME slave window.
Return
- Zero on success, -EINVAL if operation is not supported on this
device, if an invalid resource has been provided or invalid attributes are provided. Hardware specific errors may also be returned.
-
int vme_slave_get(struct vme_resource *resource, int *enabled, unsigned long long *vme_base, unsigned long long *size, dma_addr_t *buf_base, u32 *aspace, u32 *cycle)¶
Retrieve VME slave window configuration.
Parameters
struct vme_resource * resource
Pointer to VME slave resource.
int * enabled
Pointer to variable for storing state.
unsigned long long * vme_base
Pointer to variable for storing window base address.
unsigned long long * size
Pointer to variable for storing window size.
dma_addr_t * buf_base
Pointer to variable for storing slave buffer base address.
u32 * aspace
Pointer to variable for storing VME address space.
u32 * cycle
Pointer to variable for storing VME data transfer cycle type.
Description
Return configuration for provided VME slave window.
Return
- Zero on success, -EINVAL if operation is not supported on this
device or if an invalid resource has been provided.
-
void vme_slave_free(struct vme_resource *resource)¶
Free VME slave window
Parameters
struct vme_resource * resource
Pointer to VME slave resource.
Description
Free the provided slave resource so that it may be reallocated.
-
struct vme_resource *vme_master_request(struct vme_dev *vdev, u32 address, u32 cycle, u32 dwidth)¶
Request a VME master window resource.
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
u32 address
Required VME address space.
u32 cycle
Required VME data transfer cycle type.
u32 dwidth
Required VME data transfer width.
Description
Request use of a VME window resource capable of being set for the requested address space, data transfer cycle and width.
Return
Pointer to VME resource on success, NULL on failure.
-
int vme_master_set(struct vme_resource *resource, int enabled, unsigned long long vme_base, unsigned long long size, u32 aspace, u32 cycle, u32 dwidth)¶
Set VME master window configuration.
Parameters
struct vme_resource * resource
Pointer to VME master resource.
int enabled
State to which the window should be configured.
unsigned long long vme_base
Base address for the window.
unsigned long long size
Size of the VME window.
u32 aspace
VME address space for the VME window.
u32 cycle
VME data transfer cycle type for the VME window.
u32 dwidth
VME data transfer width for the VME window.
Description
Set configuration for provided VME master window.
Return
- Zero on success, -EINVAL if operation is not supported on this
device, if an invalid resource has been provided or invalid attributes are provided. Hardware specific errors may also be returned.
-
int vme_master_get(struct vme_resource *resource, int *enabled, unsigned long long *vme_base, unsigned long long *size, u32 *aspace, u32 *cycle, u32 *dwidth)¶
Retrieve VME master window configuration.
Parameters
struct vme_resource * resource
Pointer to VME master resource.
int * enabled
Pointer to variable for storing state.
unsigned long long * vme_base
Pointer to variable for storing window base address.
unsigned long long * size
Pointer to variable for storing window size.
u32 * aspace
Pointer to variable for storing VME address space.
u32 * cycle
Pointer to variable for storing VME data transfer cycle type.
u32 * dwidth
Pointer to variable for storing VME data transfer width.
Description
Return configuration for provided VME master window.
Return
- Zero on success, -EINVAL if operation is not supported on this
device or if an invalid resource has been provided.
-
ssize_t vme_master_read(struct vme_resource *resource, void *buf, size_t count, loff_t offset)¶
Read data from VME space into a buffer.
Parameters
struct vme_resource * resource
Pointer to VME master resource.
void * buf
Pointer to buffer where data should be transferred.
size_t count
Number of bytes to transfer.
loff_t offset
Offset into VME master window at which to start transfer.
Description
Perform read of count bytes of data from location on VME bus which maps into the VME master window at offset to buf.
Return
- Number of bytes read, -EINVAL if resource is not a VME master
resource or read operation is not supported. -EFAULT returned if invalid offset is provided. Hardware specific errors may also be returned.
-
ssize_t vme_master_write(struct vme_resource *resource, void *buf, size_t count, loff_t offset)¶
Write data out to VME space from a buffer.
Parameters
struct vme_resource * resource
Pointer to VME master resource.
void * buf
Pointer to buffer holding data to transfer.
size_t count
Number of bytes to transfer.
loff_t offset
Offset into VME master window at which to start transfer.
Description
Perform write of count bytes of data from buf to location on VME bus which maps into the VME master window at offset.
Return
- Number of bytes written, -EINVAL if resource is not a VME master
resource or write operation is not supported. -EFAULT returned if invalid offset is provided. Hardware specific errors may also be returned.
-
unsigned int vme_master_rmw(struct vme_resource *resource, unsigned int mask, unsigned int compare, unsigned int swap, loff_t offset)¶
Perform read-modify-write cycle.
Parameters
struct vme_resource * resource
Pointer to VME master resource.
unsigned int mask
Bits to be compared and swapped in operation.
unsigned int compare
Bits to be compared with data read from offset.
unsigned int swap
Bits to be swapped in data read from offset.
loff_t offset
Offset into VME master window at which to perform operation.
Description
Perform read-modify-write cycle on provided location: - Location on VME bus is read. - Bits selected by mask are compared with compare. - Where a selected bit matches that in compare and are selected in swap, the bit is swapped. - Result written back to location on VME bus.
Return
- Bytes written on success, -EINVAL if resource is not a VME master
resource or RMW operation is not supported. Hardware specific errors may also be returned.
-
int vme_master_mmap(struct vme_resource *resource, struct vm_area_struct *vma)¶
Mmap region of VME master window.
Parameters
struct vme_resource * resource
Pointer to VME master resource.
struct vm_area_struct * vma
Pointer to definition of user mapping.
Description
Memory map a region of the VME master window into user space.
Return
- Zero on success, -EINVAL if resource is not a VME master
resource or -EFAULT if map exceeds window size. Other generic mmap errors may also be returned.
-
void vme_master_free(struct vme_resource *resource)¶
Free VME master window
Parameters
struct vme_resource * resource
Pointer to VME master resource.
Description
Free the provided master resource so that it may be reallocated.
-
struct vme_resource *vme_dma_request(struct vme_dev *vdev, u32 route)¶
Request a DMA controller.
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
u32 route
Required src/destination combination.
Description
Request a VME DMA controller with capability to perform transfers bewteen requested source/destination combination.
Return
Pointer to VME DMA resource on success, NULL on failure.
-
struct vme_dma_list *vme_new_dma_list(struct vme_resource *resource)¶
Create new VME DMA list.
Parameters
struct vme_resource * resource
Pointer to VME DMA resource.
Description
Create a new VME DMA list. It is the responsibility of the user to free
the list once it is no longer required with vme_dma_list_free()
.
Return
- Pointer to new VME DMA list, NULL on allocation failure or invalid
VME DMA resource.
-
struct vme_dma_attr *vme_dma_pattern_attribute(u32 pattern, u32 type)¶
Create “Pattern” type VME DMA list attribute.
Parameters
u32 pattern
Value to use used as pattern
u32 type
Type of pattern to be written.
Description
Create VME DMA list attribute for pattern generation. It is the
responsibility of the user to free used attributes using
vme_dma_free_attribute()
.
Return
Pointer to VME DMA attribute, NULL on failure.
-
struct vme_dma_attr *vme_dma_pci_attribute(dma_addr_t address)¶
Create “PCI” type VME DMA list attribute.
Parameters
dma_addr_t address
PCI base address for DMA transfer.
Description
Create VME DMA list attribute pointing to a location on PCI for DMA
transfers. It is the responsibility of the user to free used attributes
using vme_dma_free_attribute()
.
Return
Pointer to VME DMA attribute, NULL on failure.
-
struct vme_dma_attr *vme_dma_vme_attribute(unsigned long long address, u32 aspace, u32 cycle, u32 dwidth)¶
Create “VME” type VME DMA list attribute.
Parameters
unsigned long long address
VME base address for DMA transfer.
u32 aspace
VME address space to use for DMA transfer.
u32 cycle
VME bus cycle to use for DMA transfer.
u32 dwidth
VME data width to use for DMA transfer.
Description
Create VME DMA list attribute pointing to a location on the VME bus for DMA
transfers. It is the responsibility of the user to free used attributes
using vme_dma_free_attribute()
.
Return
Pointer to VME DMA attribute, NULL on failure.
-
void vme_dma_free_attribute(struct vme_dma_attr *attributes)¶
Free DMA list attribute.
Parameters
struct vme_dma_attr * attributes
Pointer to DMA list attribute.
Description
Free VME DMA list attribute. VME DMA list attributes can be safely freed
once vme_dma_list_add()
has returned.
-
int vme_dma_list_add(struct vme_dma_list *list, struct vme_dma_attr *src, struct vme_dma_attr *dest, size_t count)¶
Add enty to a VME DMA list.
Parameters
struct vme_dma_list * list
Pointer to VME list.
struct vme_dma_attr * src
Pointer to DMA list attribute to use as source.
struct vme_dma_attr * dest
Pointer to DMA list attribute to use as destination.
size_t count
Number of bytes to transfer.
Description
Add an entry to the provided VME DMA list. Entry requires pointers to source and destination DMA attributes and a count.
Please note, the attributes supported as source and destinations for transfers are hardware dependent.
Return
- Zero on success, -EINVAL if operation is not supported on this
device or if the link list has already been submitted for execution. Hardware specific errors also possible.
-
int vme_dma_list_exec(struct vme_dma_list *list)¶
Queue a VME DMA list for execution.
Parameters
struct vme_dma_list * list
Pointer to VME list.
Description
Queue the provided VME DMA list for execution. The call will return once the list has been executed.
Return
- Zero on success, -EINVAL if operation is not supported on this
device. Hardware specific errors also possible.
-
int vme_dma_list_free(struct vme_dma_list *list)¶
Free a VME DMA list.
Parameters
struct vme_dma_list * list
Pointer to VME list.
Description
Free the provided DMA list and all its entries.
Return
- Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource
is still in use. Hardware specific errors also possible.
-
int vme_dma_free(struct vme_resource *resource)¶
Free a VME DMA resource.
Parameters
struct vme_resource * resource
Pointer to VME DMA resource.
Description
Free the provided DMA resource so that it may be reallocated.
Return
- Zero on success, -EINVAL on invalid VME resource, -EBUSY if resource
is still active.
-
int vme_irq_request(struct vme_dev *vdev, int level, int statid, void (*callback)(int, int, void*), void *priv_data)¶
Request a specific VME interrupt.
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
int level
Interrupt priority being requested.
int statid
Interrupt vector being requested.
void (*)(int, int, void *) callback
Pointer to callback function called when VME interrupt/vector received.
void * priv_data
Generic pointer that will be passed to the callback function.
Description
Request callback to be attached as a handler for VME interrupts with provided level and statid.
Return
- Zero on success, -EINVAL on invalid vme device, level or if the
function is not supported, -EBUSY if the level/statid combination is already in use. Hardware specific errors also possible.
-
void vme_irq_free(struct vme_dev *vdev, int level, int statid)¶
Free a VME interrupt.
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
int level
Interrupt priority of interrupt being freed.
int statid
Interrupt vector of interrupt being freed.
Description
Remove previously attached callback from VME interrupt priority/vector.
-
int vme_irq_generate(struct vme_dev *vdev, int level, int statid)¶
Generate VME interrupt.
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
int level
Interrupt priority at which to assert the interrupt.
int statid
Interrupt vector to associate with the interrupt.
Description
Generate a VME interrupt of the provided level and with the provided statid.
Return
- Zero on success, -EINVAL on invalid vme device, level or if the
function is not supported. Hardware specific errors also possible.
-
struct vme_resource *vme_lm_request(struct vme_dev *vdev)¶
Request a VME location monitor
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
Description
Allocate a location monitor resource to the driver. A location monitor allows the driver to monitor accesses to a contiguous number of addresses on the VME bus.
Return
Pointer to a VME resource on success or NULL on failure.
-
int vme_lm_count(struct vme_resource *resource)¶
Determine number of VME Addresses monitored
Parameters
struct vme_resource * resource
Pointer to VME location monitor resource.
Description
The number of contiguous addresses monitored is hardware dependent. Return the number of contiguous addresses monitored by the location monitor.
Return
- Count of addresses monitored or -EINVAL when provided with an
invalid location monitor resource.
-
int vme_lm_set(struct vme_resource *resource, unsigned long long lm_base, u32 aspace, u32 cycle)¶
Configure location monitor
Parameters
struct vme_resource * resource
Pointer to VME location monitor resource.
unsigned long long lm_base
Base address to monitor.
u32 aspace
VME address space to monitor.
u32 cycle
VME bus cycle type to monitor.
Description
Set the base address, address space and cycle type of accesses to be monitored by the location monitor.
Return
- Zero on success, -EINVAL when provided with an invalid location
monitor resource or function is not supported. Hardware specific errors may also be returned.
-
int vme_lm_get(struct vme_resource *resource, unsigned long long *lm_base, u32 *aspace, u32 *cycle)¶
Retrieve location monitor settings
Parameters
struct vme_resource * resource
Pointer to VME location monitor resource.
unsigned long long * lm_base
Pointer used to output the base address monitored.
u32 * aspace
Pointer used to output the address space monitored.
u32 * cycle
Pointer used to output the VME bus cycle type monitored.
Description
Retrieve the base address, address space and cycle type of accesses to be monitored by the location monitor.
Return
- Zero on success, -EINVAL when provided with an invalid location
monitor resource or function is not supported. Hardware specific errors may also be returned.
-
int vme_lm_attach(struct vme_resource *resource, int monitor, void (*callback)(void*), void *data)¶
Provide callback for location monitor address
Parameters
struct vme_resource * resource
Pointer to VME location monitor resource.
int monitor
Offset to which callback should be attached.
void (*)(void *) callback
Pointer to callback function called when triggered.
void * data
Generic pointer that will be passed to the callback function.
Description
Attach a callback to the specificed offset into the location monitors monitored addresses. A generic pointer is provided to allow data to be passed to the callback when called.
Return
- Zero on success, -EINVAL when provided with an invalid location
monitor resource or function is not supported. Hardware specific errors may also be returned.
-
int vme_lm_detach(struct vme_resource *resource, int monitor)¶
Remove callback for location monitor address
Parameters
struct vme_resource * resource
Pointer to VME location monitor resource.
int monitor
Offset to which callback should be removed.
Description
Remove the callback associated with the specificed offset into the location monitors monitored addresses.
Return
- Zero on success, -EINVAL when provided with an invalid location
monitor resource or function is not supported. Hardware specific errors may also be returned.
-
void vme_lm_free(struct vme_resource *resource)¶
Free allocated VME location monitor
Parameters
struct vme_resource * resource
Pointer to VME location monitor resource.
Description
Free allocation of a VME location monitor.
- WARNING: This function currently expects that any callbacks that have
been attached to the location monitor have been removed.
Return
- Zero on success, -EINVAL when provided with an invalid location
monitor resource.
-
int vme_slot_num(struct vme_dev *vdev)¶
Retrieve slot ID
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
Description
Retrieve the slot ID associated with the provided VME device.
Return
- The slot ID on success, -EINVAL if VME bridge cannot be determined
or the function is not supported. Hardware specific errors may also be returned.
-
int vme_bus_num(struct vme_dev *vdev)¶
Retrieve bus number
Parameters
struct vme_dev * vdev
Pointer to VME device struct vme_dev assigned to driver instance.
Description
Retrieve the bus enumeration associated with the provided VME device.
Return
- The bus number on success, -EINVAL if VME bridge cannot be
determined.
-
int vme_register_driver(struct vme_driver *drv, unsigned int ndevs)¶
Register a VME driver
Parameters
struct vme_driver * drv
Pointer to VME driver structure to register.
unsigned int ndevs
Maximum number of devices to allow to be enumerated.
Description
Register a VME device driver with the VME subsystem.
Return
Zero on success, error value on registration failure.
-
void vme_unregister_driver(struct vme_driver *drv)¶
Unregister a VME driver
Parameters
struct vme_driver * drv
Pointer to VME driver structure to unregister.
Description
Unregister a VME device driver from the VME subsystem.