RTEMS 6.1-rc4
Loading...
Searching...
No Matches
drvmgr.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-2-Clause */
2
9/*
10 * COPYRIGHT (c) 2009 Cobham Gaisler AB.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 * notice, this list of conditions and the following disclaimer in the
19 * documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#ifndef _DRIVER_MANAGER_H_
35#define _DRIVER_MANAGER_H_
36
37#include <rtems.h>
38#include <drvmgr/drvmgr_list.h>
39#include <stdint.h>
41#include <rtems/score/smpimpl.h>
42
43#ifdef __cplusplus
44extern "C" {
45#endif
46
47/*** Configure Driver manager ***/
48
49/* Define the number of initialization levels of device drivers */
50#define DRVMGR_LEVEL_MAX 4
51
52/* Default to use semahpores for protection. Initialization works without
53 * locks and after initialization too if devices are not removed.
54 */
55#ifndef DRVMGR_USE_LOCKS
56#define DRVMGR_USE_LOCKS 1
57#endif
58
59struct drvmgr_dev; /* Device */
60struct drvmgr_bus; /* Bus */
61struct drvmgr_drv; /* Driver */
62
63/*** List Interface shortcuts ***/
64#define BUS_LIST_HEAD(list) LIST_HEAD(list, struct drvmgr_bus)
65#define BUS_LIST_TAIL(list) LIST_TAIL(list, struct drvmgr_bus)
66#define DEV_LIST_HEAD(list) LIST_HEAD(list, struct drvmgr_dev)
67#define DEV_LIST_TAIL(list) LIST_TAIL(list, struct drvmgr_dev)
68#define DRV_LIST_HEAD(list) LIST_HEAD(list, struct drvmgr_drv)
69#define DRV_LIST_TAIL(list) LIST_TAIL(list, struct drvmgr_drv)
70
71/*** Bus indentification ***/
72#define DRVMGR_BUS_TYPE_NONE 0 /* Not a valid bus */
73#define DRVMGR_BUS_TYPE_ROOT 1 /* Hard coded bus */
74#define DRVMGR_BUS_TYPE_PCI 2 /* PCI bus */
75#define DRVMGR_BUS_TYPE_AMBAPP 3 /* AMBA Plug & Play bus */
76#define DRVMGR_BUS_TYPE_LEON2_AMBA 4 /* LEON2 hardcoded bus */
77#define DRVMGR_BUS_TYPE_AMBAPP_DIST 5 /* Distibuted AMBA Plug & Play bus accessed using a communication interface */
78#define DRVMGR_BUS_TYPE_SPW_RMAP 6 /* SpaceWire Network bus */
79#define DRVMGR_BUS_TYPE_AMBAPP_RMAP 7 /* SpaceWire RMAP accessed AMBA Plug & Play bus */
80
81enum {
82 DRVMGR_OBJ_NONE = 0,
83 DRVMGR_OBJ_DRV = 1,
84 DRVMGR_OBJ_BUS = 2,
85 DRVMGR_OBJ_DEV = 3,
86};
87
88/*** Driver indentification ***
89 *
90 * 64-bit identification integer definition
91 * * Bus ID 8-bit [7..0]
92 * * Reserved 8-bit field [63..56]
93 * * Device ID specific for bus type 48-bit [55..8] (Different buses have
94 * different unique identifications for hardware/driver.)
95 *
96 * ID Rules
97 * * A root bus driver must always have device ID set to 0. There can only by
98 * one root bus driver for a certain bus type.
99 * * A Driver ID must identify a unique hardware core
100 *
101 */
102
103/* Bus ID Mask */
104#define DRIVER_ID_BUS_MASK 0x00000000000000FFULL
105
106/* Reserved Mask for future use */
107#define DRIVER_ID_RSV_MASK 0xFF00000000000000ULL
108
109/* Reserved Mask for future use */
110#define DRIVER_ID_DEV_MASK 0x00FFFFFFFFFFFF00ULL
111
112/* Set Bus ID Mask. */
113#define DRIVER_ID(busid, devid) ((unsigned long long) \
114 ((((unsigned long long)(devid) << 8) & DRIVER_ID_DEV_MASK) | \
115 ((unsigned long long)(busid) & DRIVER_ID_BUS_MASK)))
116
117/* Get IDs */
118#define DRIVER_BUSID_GET(id) ((unsigned long long)(id) & DRIVER_ID_BUS_MASK)
119#define DRIVER_DEVID_GET(id) (((unsigned long long)(id) & DRIVER_ID_DEV_MASK) >> 8)
120
121#define DRIVER_ROOTBUS_ID(bus_type) DRIVER_ID(bus_type, 0)
122
123/*** Root Bus drivers ***/
124
125/* Generic Hard coded Root bus: Driver ID */
126#define DRIVER_ROOT_ID DRIVER_ROOTBUS_ID(DRVMGR_BUS_TYPE_ROOT)
127
128/* PCI Plug & Play bus: Driver ID */
129#define DRIVER_PCIBUS_ID DRIVER_ROOTBUS_ID(DRVMGR_BUS_TYPE_PCI)
130
131/* AMBA Plug & Play bus: Driver ID */
132#define DRIVER_GRLIB_AMBAPP_ID DRIVER_ROOTBUS_ID(DRVMGR_BUS_TYPE_AMBAPP)
133
134/* AMBA Hard coded bus: Driver ID */
135#define DRIVER_LEON2_AMBA_ID DRIVER_ROOTBUS_ID(DRVMGR_BUS_TYPE_LEON2_AMBA)
136
137/* Distributed AMBA Plug & Play bus: Driver ID */
138#define DRIVER_AMBAPP_DIST_ID DRIVER_ROOTBUS_ID(DRVMGR_BUS_TYPE_AMBAPP_DIST)
139
147};
148
149/* Interrupt Service Routine (ISR) */
150typedef void (*drvmgr_isr)(void *arg);
151
154 /* Functions used internally within driver manager */
155 int (*init[DRVMGR_LEVEL_MAX])(struct drvmgr_bus *);
156 int (*remove)(struct drvmgr_bus *);
157 int (*unite)(struct drvmgr_drv *, struct drvmgr_dev *);
159 /* Functions called indirectly from drivers */
160 int (*int_register)(struct drvmgr_dev *, int index, const char *info, drvmgr_isr isr, void *arg);
161 int (*int_unregister)(struct drvmgr_dev *, int index, drvmgr_isr isr, void *arg);
162 int (*int_clear)(struct drvmgr_dev *, int index);
163 int (*int_mask)(struct drvmgr_dev *, int index);
164 int (*int_unmask)(struct drvmgr_dev *, int index);
165#ifdef RTEMS_SMP
166 int (*int_set_affinity)(struct drvmgr_dev *, int index,
167 const Processor_mask *cpus);
168#endif
169
170 /* Get Parameters */
171 int (*get_params)(struct drvmgr_dev *, struct drvmgr_bus_params *);
172 /* Get Frequency of Bus */
173 int (*get_freq)(struct drvmgr_dev*, int, unsigned int*);
177 void (*get_info_dev)(struct drvmgr_dev *,
178 void (*print)(void *p, char *str), void *p);
179};
180#define BUS_OPS_NUM (sizeof(struct drvmgr_bus_ops)/sizeof(void (*)(void)))
181
183 int funcid;
184 void *func;
185};
186#define DRVMGR_FUNC(_ID_, _FUNC_) {(int)(_ID_), (void *)(_FUNC_)}
187#define DRVMGR_FUNC_END {0, NULL}
188
189/*** Resource definitions ***
190 *
191 * Overview of structures:
192 * All bus resources entries (_bus_res) are linked together per bus
193 * (bus_info->reslist). One bus resource entry has a pointer to an array of
194 * driver resources (_drv_res). One driver resouces is made out of an array
195 * of keys (drvmgr_key). All keys belongs to the same driver and harwdare
196 * device. Each key has a Name, Type ID and Data interpreted differently
197 * depending on the Type ID (union drvmgr_key_value).
198 *
199 */
200
201/* Key Data Types */
202enum drvmgr_kt {
203 DRVMGR_KT_ANY = -1,
204 DRVMGR_KT_NONE = 0,
205 DRVMGR_KT_INT = 1,
206 DRVMGR_KT_STRING = 2,
207 DRVMGR_KT_POINTER = 3,
208};
209
210#define DRVMGR_KEY_EMPTY {NULL, DRVMGR_KT_NONE, {0}}
211#define DRVMGR_RES_EMPTY {0, 0, NULL}
212#define MMAP_EMPTY {0, 0, 0}
213
216 unsigned int i;
217 char *str;
218 void *ptr;
219};
220
221/* One key. One Value. Holding information relevant to the driver. */
223 char *key_name; /* Name of key */
224 enum drvmgr_kt key_type; /* How to interpret key_value */
225 union drvmgr_key_value key_value; /* The value or pointer to value */
226};
227
232 uint64_t drv_id;
234 struct drvmgr_key *keys;
235};
236
241};
242
250 char *name;
251 unsigned int size;
252 char *from_adr;
254 char *to_adr;
256};
257#define DRVMGR_TRANSLATE_ONE2ONE NULL
258#define DRVMGR_TRANSLATE_NO_BRIDGE ((void *)1) /* No bridge, error */
259
263 unsigned char bus_type;
264 unsigned char depth;
265 struct drvmgr_bus *next;
266 struct drvmgr_dev *dev;
267 void *priv;
276 /* Bus status */
277 int level;
278 int state;
279 int error;
280};
281
282/* States of a bus */
283#define BUS_STATE_INIT_FAILED 0x00000001 /* Initialization Failed */
284#define BUS_STATE_LIST_INACTIVE 0x00001000 /* In inactive bus list */
285#define BUS_STATE_DEPEND_FAILED 0x00000004 /* Device init failed */
286
287/* States of a device */
288#define DEV_STATE_INIT_FAILED 0x00000001 /* Initialization Failed */
289#define DEV_STATE_INIT_DONE 0x00000002 /* All init levels completed */
290#define DEV_STATE_DEPEND_FAILED 0x00000004 /* Parent Bus init failed */
291#define DEV_STATE_UNITED 0x00000100 /* Device United with Device Driver */
292#define DEV_STATE_REMOVED 0x00000200 /* Device has been removed (unregistered) */
293#define DEV_STATE_IGNORED 0x00000400 /* Device was ignored according to user's request, the device
294 * was never reported to it's driver (as expected).
295 */
296#define DEV_STATE_LIST_INACTIVE 0x00001000 /* In inactive device list */
301 struct drvmgr_dev *next;
302 struct drvmgr_dev *next_in_bus;
305 struct drvmgr_drv *drv;
307 short minor_drv;
308 short minor_bus;
309 char *name;
310 void *priv;
311 void *businfo;
312 struct drvmgr_bus *bus;
314 /* Device Status */
315 unsigned int state;
316 int level;
317 int error;
318};
322 int (*init[DRVMGR_LEVEL_MAX])(struct drvmgr_dev *);
323 int (*remove)(struct drvmgr_dev *);
324 int (*info)(struct drvmgr_dev *, void (*print)(void *p, char *str), void *p, int, char *argv[]);
325};
326#define DRVMGR_OPS_NUM(x) (sizeof(x)/sizeof(void (*)(void)))
331 struct drvmgr_drv *next;
332 struct drvmgr_dev *dev;
334 uint64_t drv_id;
335 char *name;
339 unsigned int dev_cnt;
340 unsigned int dev_priv_size;
341};
342
347typedef void (*drvmgr_drv_reg_func)(void);
348
349/*** DRIVER | DEVICE | BUS FUNCTIONS ***/
350
351/* Return Codes */
352enum {
353 DRVMGR_OK = 0, /* Sucess */
354 DRVMGR_NOMEM = 1, /* Memory allocation error */
355 DRVMGR_EIO = 2, /* I/O error */
356 DRVMGR_EINVAL = 3, /* Invalid parameter */
357 DRVMGR_ENOSYS = 4,
358 DRVMGR_TIMEDOUT = 5, /* Operation timeout error */
359 DRVMGR_EBUSY = 6,
360 DRVMGR_ENORES = 7, /* Not enough resources */
361 DRVMGR_FAIL = -1 /* Unspecified failure */
362};
363
368extern void _DRV_Manager_initialization(void);
369
375extern void _DRV_Manager_init_level(int level);
376
382extern int drvmgr_init(void);
383
384/* Take registered buses and devices into the correct init level,
385 * this function is called from _init_level() so normally
386 * we don't need to call it directly.
387 */
388extern void drvmgr_init_update(void);
389
391extern int drvmgr_root_drv_register(struct drvmgr_drv *drv);
392
394extern int drvmgr_drv_register(struct drvmgr_drv *drv);
395
397extern int drvmgr_dev_register(struct drvmgr_dev *dev);
398
409extern int drvmgr_dev_unregister(struct drvmgr_dev *dev);
410
412extern int drvmgr_bus_register(struct drvmgr_bus *bus);
413
415extern int drvmgr_bus_unregister(struct drvmgr_bus *bus);
416
422extern int drvmgr_children_unregister(struct drvmgr_bus *bus);
423
424/* Separate a device from the driver it has been united with */
425extern int drvmgr_dev_drv_separate(struct drvmgr_dev *dev);
426
433extern int drvmgr_alloc_dev(struct drvmgr_dev **pdev, int extra);
434
441extern int drvmgr_alloc_bus(struct drvmgr_bus **pbus, int extra);
442
443/*** DRIVER RESOURCE FUNCTIONS ***/
444
451extern void drvmgr_bus_res_add(struct drvmgr_bus *bus,
452 struct drvmgr_bus_res *bres);
453
460extern int drvmgr_keys_get(struct drvmgr_dev *dev, struct drvmgr_key **keys);
461
468extern struct drvmgr_key *drvmgr_key_get(struct drvmgr_key *keys, char *key_name);
469
483 struct drvmgr_key *keys,
484 char *key_name,
485 enum drvmgr_kt key_type);
486
500 struct drvmgr_dev *dev,
501 char *key_name,
502 enum drvmgr_kt key_type);
503
504/*** DRIVER INTERACE USED TO REQUEST INFORMATION/SERVICES FROM BUS DRIVER ***/
505
507static inline struct drvmgr_bus *drvmgr_get_parent(
508 struct drvmgr_dev *dev)
509{
510 if (dev)
511 return dev->parent;
512 else
513 return NULL;
514}
515
517static inline struct drvmgr_drv *drvmgr_get_drv(struct drvmgr_dev *dev)
518{
519 if (dev)
520 return dev->drv;
521 else
522 return NULL;
523}
524
537#define DRVMGR_FED_BF 1 /* Breadth-first search */
538#define DRVMGR_FED_DF 0 /* Depth first search */
539extern intptr_t drvmgr_for_each_dev(
540 intptr_t (*func)(struct drvmgr_dev *dev, void *arg),
541 void *arg,
542 int options);
543
552extern int drvmgr_get_dev(
553 struct drvmgr_drv *drv,
554 int minor,
555 struct drvmgr_dev **pdev);
556
563extern int drvmgr_freq_get(
564 struct drvmgr_dev *dev,
565 int options,
566 unsigned int *freq_hz);
567
569extern int drvmgr_on_rootbus(struct drvmgr_dev *dev);
570
577extern int drvmgr_get_dev_prefix(struct drvmgr_dev *dev, char *dev_prefix);
578
593 struct drvmgr_dev *dev,
594 int index,
595 const char *info,
596 drvmgr_isr isr,
597 void *arg);
598
610 struct drvmgr_dev *dev,
611 int index,
612 drvmgr_isr isr,
613 void *arg);
614
624extern int drvmgr_interrupt_clear(
625 struct drvmgr_dev *dev,
626 int index);
627
638extern int drvmgr_interrupt_unmask(
639 struct drvmgr_dev *dev,
640 int index);
641
650extern int drvmgr_interrupt_mask(
651 struct drvmgr_dev *dev,
652 int index);
653
662#ifdef RTEMS_SMP
663extern int drvmgr_interrupt_set_affinity(
664 struct drvmgr_dev *dev,
665 int index,
666 const Processor_mask *cpus);
667#endif
670enum drvmgr_tr_opts {
671 /* Translate CPU RAM Address (input) to DMA unit accessible address
672 * (output), this is an upstreams translation in reverse order.
673 *
674 * Typical Usage:
675 * It is common to translate a CPU accessible RAM address to an
676 * address that DMA units can access over bridges.
677 */
678 CPUMEM_TO_DMA = 0x0,
679
680 /* Translate DMA Unit Accessible address mapped to CPU RAM (input) to
681 * CPU accessible address (output). This is an upstreams translation.
682 *
683 * Typical Usage (not often used):
684 * The DMA unit descriptors contain pointers to DMA buffers located at
685 * CPU RAM addresses that the DMA unit can access, the CPU processes
686 * the descriptors and want to access the data but a translation back
687 * to CPU address is required.
688 */
689 CPUMEM_FROM_DMA = 0x1,
690
691 /* Translate DMA Memory Address (input) to CPU accessible address
692 * (output), this is a downstreams translation in reverse order.
693 *
694 * Typical Usage:
695 * A PCI network card puts packets into its memory not doing DMA over
696 * PCI, in order for the CPU to access them the PCI address must be
697 * translated.
698 */
699 DMAMEM_TO_CPU = 0x2,
700
701 /* Translate CPU accessible address (input) mapped to DMA Memory Address
702 * to DMA Unit accessible address (output). This is a downstreams
703 * translation.
704 */
705 DMAMEM_FROM_CPU = 0x3,
706};
707#define DRVMGR_TR_REVERSE 0x1 /* do reverse translation direction order */
708#define DRVMGR_TR_PATH 0x2 /* 0x0=down-stream 0x2=up-stream address path */
709
746extern unsigned int drvmgr_translate(
747 struct drvmgr_dev *dev,
748 unsigned int options,
749 void *src_address,
750 void **dst_address);
751
752/* Translate addresses between buses, used internally to implement
753 * drvmgr_translate. Function is not limited to translate from/to root bus
754 * where CPU is resident, however buses must be on a straight path relative
755 * to each other (parent of parent of parent and so on).
756 *
757 * \param from src_address is given for this bus
758 * \param to src_address is translated to this bus
759 * \param reverse Selects translation method, if map entries are used in
760 * the reverse order (map_up->to is used as map_up->from)
761 * \param src_address Address to be translated
762 * \param dst_address Translated address is stored here on success (return=0)
763 *
764 * Returns 0 if unable to translate. The remaining length from the given
765 * address of the map is returned on success and the result is stored into
766 * *dst_address. For example if a map starts at 0x40000000 of size 0x100000
767 * the result will be 0x40000 if the address was translated into 0x400C0000.
768 * If dev is on root-bus no translation is performed 0xffffffff is returned.
769 * and src_address is stored in *dst_address.
770 */
771extern unsigned int drvmgr_translate_bus(
772 struct drvmgr_bus *from,
773 struct drvmgr_bus *to,
774 int reverse,
775 void *src_address,
776 void **dst_address);
777
778/* Calls drvmgr_translate() to translate an address range and checks the result,
779 * a printout is generated if the check fails. All parameters are passed on to
780 * drvmgr_translate() except for size, see paramters of drvmgr_translate().
781 *
782 * If size=0 only the starting address is not checked.
783 *
784 * If mapping failes a non-zero result is returned.
785 */
786extern int drvmgr_translate_check(
787 struct drvmgr_dev *dev,
788 unsigned int options,
789 void *src_address,
790 void **dst_address,
791 unsigned int size);
792
797extern int drvmgr_func_get(void *obj, int funcid, void **func);
798
800extern int drvmgr_func_call(void *obj, int funcid, void *a, void *b, void *c, void *d);
801
802/* Builds a Function ID.
803 *
804 * Used to request optional functions by a bus or device driver
805 */
806#define DRVMGR_FUNCID(major, minor) ((((major) & 0xfff) << 20) | ((minor) & 0xfffff))
807#define DRVMGR_FUNCID_NONE 0
808#define DRVMGR_FUNCID_END DRVMGR_FUNCID(DRVMGR_FUNCID_NONE, 0)
809
810/* Major Function ID. Most significant 12-bits. */
811enum {
812 FUNCID_NONE = 0x000,
813 FUNCID_RW = 0x001, /* Read/Write functions */
814};
815
816/* Select Sub-Function Read/Write function by ID */
817#define RW_SIZE_1 0x00001 /* Access Size */
818#define RW_SIZE_2 0x00002
819#define RW_SIZE_4 0x00004
820#define RW_SIZE_8 0x00008
821#define RW_SIZE_ANY 0x00000
822#define RW_SIZE(id) ((unsigned int)(id) & 0xf)
823
824#define RW_DIR_ANY 0x00000 /* Access Direction */
825#define RW_READ 0x00000 /* Read */
826#define RW_WRITE 0x00010 /* Write */
827#define RW_SET 0x00020 /* Write with same value (memset) */
828#define RW_DIR(id) (((unsigned int)(id) >> 4) & 0x3)
829
830#define RW_RAW 0x00000 /* Raw access - no swapping (machine default) */
831#define RW_LITTLE 0x00040 /* Little Endian */
832#define RW_BIG 0x00080 /* Big Endian */
833#define RW_ENDIAN(id) (((unsigned int)(id) >> 6) & 0x3)
834
835#define RW_TYPE_ANY 0x00000 /* Access type */
836#define RW_REG 0x00100
837#define RW_MEM 0x00200
838#define RW_MEMREG 0x00300
839#define RW_CFG 0x00400
840#define RW_TYPE(id) (((unsigned int)(id) >> 8) & 0xf)
841
842#define RW_ARG 0x01000 /* Optional Argument */
843#define RW_ERR 0x02000 /* Optional Error Handler */
844
845/* Build a Read/Write function ID */
846#define DRVMGR_RWFUNC(minor) DRVMGR_FUNCID(FUNCID_RW, minor)
847
848/* Argument to Read/Write functions, the "void *arg" pointer is returned by
849 * RW_ARG. If NULL is returned no argument is needed.
850 */
851struct drvmgr_rw_arg {
852 void *arg;
853 struct drvmgr_dev *dev;
854};
855
856/* Standard Read/Write function types */
857typedef uint8_t (*drvmgr_r8)(uint8_t *srcadr);
858typedef uint16_t (*drvmgr_r16)(uint16_t *srcadr);
859typedef uint32_t (*drvmgr_r32)(uint32_t *srcadr);
860typedef uint64_t (*drvmgr_r64)(uint64_t *srcadr);
861typedef void (*drvmgr_w8)(uint8_t *dstadr, uint8_t data);
862typedef void (*drvmgr_w16)(uint16_t *dstadr, uint16_t data);
863typedef void (*drvmgr_w32)(uint32_t *dstadr, uint32_t data);
864typedef void (*drvmgr_w64)(uint64_t *dstadr, uint64_t data);
865/* READ/COPY a memory area located on bus into CPU memory.
866 * From 'src' (remote) to the destination 'dest' (local), n=number of bytes
867 */
868typedef int (*drvmgr_rmem)(void *dest, const void *src, int n);
869/* WRITE/COPY a user buffer located in CPU memory to a location on the bus.
870 * From 'src' (local) to the destination 'dest' (remote), n=number of bytes
871 */
872typedef int (*drvmgr_wmem)(void *dest, const void *src, int n);
873/* Set a memory area to the byte value given in c, see LIBC memset(). Memset is
874 * implemented by calling wmem() multiple times with a "large" buffer.
875 */
876typedef int (*drvmgr_memset)(void *dstadr, int c, size_t n);
877
878/* Read/Write function types with additional argument */
879typedef uint8_t (*drvmgr_r8_arg)(uint8_t *srcadr, void *a);
880typedef uint16_t (*drvmgr_r16_arg)(uint16_t *srcadr, void *a);
881typedef uint32_t (*drvmgr_r32_arg)(uint32_t *srcadr, void *a);
882typedef uint64_t (*drvmgr_r64_arg)(uint64_t *srcadr, void *a);
883typedef void (*drvmgr_w8_arg)(uint8_t *dstadr, uint8_t data, void *a);
884typedef void (*drvmgr_w16_arg)(uint16_t *dstadr, uint16_t data, void *a);
885typedef void (*drvmgr_w32_arg)(uint32_t *dstadr, uint32_t data, void *a);
886typedef void (*drvmgr_w64_arg)(uint64_t *dstadr, uint64_t data, void *a);
887typedef int (*drvmgr_rmem_arg)(void *dest, const void *src, int n, void *a);
888typedef int (*drvmgr_wmem_arg)(void *dest, const void *src, int n, void *a);
889typedef int (*drvmgr_memset_arg)(void *dstadr, int c, size_t n, void *a);
890
891/* Report an error to the parent bus of the device */
892typedef void (*drvmgr_rw_err)(struct drvmgr_rw_arg *a, struct drvmgr_bus *bus,
893 int funcid, void *adr);
894
895/* Helper function for buses that implement the memset() over wmem() */
896extern void drvmgr_rw_memset(
897 void *dstadr,
898 int c,
899 size_t n,
900 void *a,
901 drvmgr_wmem_arg wmem
902 );
903
904/*** PRINT INFORMATION ABOUT DRIVER MANAGER ***/
905
930extern int drvmgr_for_each_listdev(
931 struct drvmgr_list *devlist,
932 unsigned int state_set_mask,
933 unsigned int state_clr_mask,
934 int (*func)(struct drvmgr_dev *dev, void *arg),
935 void *arg);
936
937/* Print all devices */
938#define PRINT_DEVS_FAILED 0x01 /* Failed during initialization */
939#define PRINT_DEVS_ASSIGNED 0x02 /* Driver assigned */
940#define PRINT_DEVS_UNASSIGNED 0x04 /* Driver not assigned */
941#define PRINT_DEVS_IGNORED 0x08 /* Device ignored on user's request */
942#define PRINT_DEVS_ALL (PRINT_DEVS_FAILED | \
943 PRINT_DEVS_ASSIGNED | \
944 PRINT_DEVS_UNASSIGNED |\
945 PRINT_DEVS_IGNORED)
946
948extern void drvmgr_summary(void);
949
951extern void drvmgr_print_devs(unsigned int options);
952
954extern void drvmgr_print_topo(void);
955
959extern void drvmgr_print_mem(void);
960
961#define OPTION_DEV_GENINFO 0x00000001
962#define OPTION_DEV_BUSINFO 0x00000002
963#define OPTION_DEV_DRVINFO 0x00000004
964#define OPTION_DRV_DEVS 0x00000100
965#define OPTION_BUS_DEVS 0x00010000
966#define OPTION_RECURSIVE 0x01000000
967#define OPTION_INFO_ALL 0xffffffff
968
970extern void drvmgr_info(void *id, unsigned int options);
971
973extern void drvmgr_info_dev(struct drvmgr_dev *dev, unsigned int options);
974
976extern void drvmgr_info_bus(struct drvmgr_bus *bus, unsigned int options);
977
979extern void drvmgr_info_drv(struct drvmgr_drv *drv, unsigned int options);
980
982extern void drvmgr_info_devs_on_bus(struct drvmgr_bus *bus, unsigned int options);
983
985extern void drvmgr_info_devs(unsigned int options);
986
988extern void drvmgr_info_drvs(unsigned int options);
989
991extern void drvmgr_info_buses(unsigned int options);
992
994extern struct drvmgr_drv *drvmgr_drv_by_id(uint64_t id);
995
997extern struct drvmgr_drv *drvmgr_drv_by_name(const char *name);
998
1000extern struct drvmgr_dev *drvmgr_dev_by_name(const char *name);
1001
1002#ifdef __cplusplus
1003}
1004#endif
1005
1006#endif
This header file provides basic definitions used by the API and the implementation.
struct drvmgr_drv * drvmgr_drv_by_id(uint64_t id)
Definition: drvmgr_by_id.c:33
void drvmgr_print_topo(void)
Definition: drvmgr_print.c:116
int drvmgr_alloc_bus(struct drvmgr_bus **pbus, int extra)
Definition: drvmgr.c:631
int drvmgr_bus_register(struct drvmgr_bus *bus)
Definition: drvmgr.c:585
int drvmgr_for_each_listdev(struct drvmgr_list *devlist, unsigned int state_set_mask, unsigned int state_clr_mask, int(*func)(struct drvmgr_dev *dev, void *arg), void *arg)
Definition: drvmgr_for_each_list_dev.c:33
int drvmgr_keys_get(struct drvmgr_dev *dev, struct drvmgr_key **keys)
Definition: drvmgr_res.c:33
void drvmgr_info(void *id, unsigned int options)
Definition: drvmgr_print.c:394
int drvmgr_func_call(void *obj, int funcid, void *a, void *b, void *c, void *d)
Definition: drvmgr_func_call.c:32
int drvmgr_interrupt_register(struct drvmgr_dev *dev, int index, const char *info, drvmgr_isr isr, void *arg)
Definition: drvmgr_drvinf.c:98
union drvmgr_key_value * drvmgr_dev_key_get(struct drvmgr_dev *dev, char *key_name, enum drvmgr_kt key_type)
Definition: drvmgr_res.c:108
int drvmgr_drv_register(struct drvmgr_drv *drv)
Definition: drvmgr.c:363
int drvmgr_init(void)
Definition: drvmgr_init.c:34
int drvmgr_get_dev_prefix(struct drvmgr_dev *dev, char *dev_prefix)
Definition: drvmgr_drvinf.c:83
int drvmgr_root_drv_register(struct drvmgr_drv *drv)
Definition: drvmgr.c:334
void drvmgr_info_drvs(unsigned int options)
Definition: drvmgr_print.c:444
int drvmgr_dev_unregister(struct drvmgr_dev *dev)
Definition: drvmgr_unregister.c:169
int drvmgr_get_dev(struct drvmgr_drv *drv, int minor, struct drvmgr_dev **pdev)
Definition: drvmgr_drvinf.c:46
int drvmgr_interrupt_unmask(struct drvmgr_dev *dev, int index)
Definition: drvmgr_drvinf.c:140
void drvmgr_print_mem(void)
Definition: drvmgr_print.c:125
drvmgr_tr_opts
Definition: drvmgr.h:668
unsigned int drvmgr_translate(struct drvmgr_dev *dev, unsigned int options, void *src_address, void **dst_address)
Definition: drvmgr_translate.c:148
int drvmgr_interrupt_clear(struct drvmgr_dev *dev, int index)
Definition: drvmgr_drvinf.c:130
int drvmgr_freq_get(struct drvmgr_dev *dev, int options, unsigned int *freq_hz)
Definition: drvmgr_drvinf.c:71
void drvmgr_info_dev(struct drvmgr_dev *dev, unsigned int options)
Definition: drvmgr_print.c:257
void _DRV_Manager_init_level(int level)
Definition: drvmgr.c:88
int drvmgr_on_rootbus(struct drvmgr_dev *dev)
Definition: drvmgr_drvinf.c:173
struct drvmgr_key * drvmgr_key_get(struct drvmgr_key *keys, char *key_name)
Definition: drvmgr_res.c:73
int drvmgr_alloc_dev(struct drvmgr_dev **pdev, int extra)
Definition: drvmgr.c:612
int drvmgr_bus_unregister(struct drvmgr_bus *bus)
Definition: drvmgr_unregister.c:62
int drvmgr_dev_register(struct drvmgr_dev *dev)
Definition: drvmgr.c:490
void drvmgr_bus_res_add(struct drvmgr_bus *bus, struct drvmgr_bus_res *bres)
Definition: drvmgr.c:650
int drvmgr_children_unregister(struct drvmgr_bus *bus)
Definition: drvmgr_unregister.c:40
void drvmgr_info_devs(unsigned int options)
Definition: drvmgr_print.c:433
void _DRV_Manager_initialization(void)
Definition: drvmgr.c:105
struct drvmgr_drv * drvmgr_drv_by_name(const char *name)
Definition: drvmgr_by_name.c:34
void drvmgr_info_bus(struct drvmgr_bus *bus, unsigned int options)
Definition: drvmgr_print.c:320
int drvmgr_interrupt_unregister(struct drvmgr_dev *dev, int index, drvmgr_isr isr, void *arg)
Definition: drvmgr_drvinf.c:115
struct drvmgr_dev * drvmgr_dev_by_name(const char *name)
Definition: drvmgr_dev_by_name.c:45
void drvmgr_summary(void)
Definition: drvmgr_print.c:201
int drvmgr_func_get(void *obj, int funcid, void **func)
Definition: drvmgr_func.c:32
void(* drvmgr_drv_reg_func)(void)
Definition: drvmgr.h:345
void drvmgr_info_buses(unsigned int options)
Definition: drvmgr_print.c:457
void drvmgr_print_devs(unsigned int options)
Definition: drvmgr_print.c:60
int drvmgr_interrupt_mask(struct drvmgr_dev *dev, int index)
Definition: drvmgr_drvinf.c:150
void drvmgr_info_drv(struct drvmgr_drv *drv, unsigned int options)
Definition: drvmgr_print.c:357
void drvmgr_info_devs_on_bus(struct drvmgr_bus *bus, unsigned int options)
Definition: drvmgr_print.c:408
union drvmgr_key_value * drvmgr_key_val_get(struct drvmgr_key *keys, char *key_name, enum drvmgr_kt key_type)
Definition: drvmgr_res.c:91
Linked list help functions used by driver manager.
This header file defines the RTEMS Classic API.
This header file provides interfaces of the SMP Support which are only used by the implementation.
Definition: drvmgr.h:153
void(* get_info_dev)(struct drvmgr_dev *, void(*print)(void *p, char *str), void *p)
Definition: drvmgr.h:177
int(* unite)(struct drvmgr_drv *, struct drvmgr_dev *)
Definition: drvmgr.h:157
Definition: drvmgr.h:145
char * dev_prefix
Definition: drvmgr.h:146
Definition: drvmgr.h:238
struct drvmgr_drv_res resource[]
Definition: drvmgr.h:240
struct drvmgr_bus_res * next
Definition: drvmgr.h:239
Definition: drvmgr.h:261
struct drvmgr_func * funcs
Definition: drvmgr.h:270
int error
Definition: drvmgr.h:279
int state
Definition: drvmgr.h:278
int obj_type
Definition: drvmgr.h:262
void * priv
Definition: drvmgr.h:267
struct drvmgr_map_entry * maps_down
Definition: drvmgr.h:274
struct drvmgr_dev * dev
Definition: drvmgr.h:266
struct drvmgr_bus_res * reslist
Definition: drvmgr.h:272
unsigned char depth
Definition: drvmgr.h:264
struct drvmgr_bus * next
Definition: drvmgr.h:265
int dev_cnt
Definition: drvmgr.h:271
struct drvmgr_bus_ops * ops
Definition: drvmgr.h:269
struct drvmgr_map_entry * maps_up
Definition: drvmgr.h:273
int level
Definition: drvmgr.h:277
unsigned char bus_type
Definition: drvmgr.h:263
struct drvmgr_dev * children
Definition: drvmgr.h:268
Definition: drvmgr.h:297
struct drvmgr_bus * bus
Definition: drvmgr.h:310
int level
Definition: drvmgr.h:314
struct drvmgr_dev * next
Definition: drvmgr.h:299
char * name
Definition: drvmgr.h:307
unsigned int state
Definition: drvmgr.h:313
struct drvmgr_dev * next_in_bus
Definition: drvmgr.h:300
struct drvmgr_drv * drv
Definition: drvmgr.h:303
void * priv
Definition: drvmgr.h:308
struct drvmgr_dev * next_in_drv
Definition: drvmgr.h:301
struct drvmgr_bus * parent
Definition: drvmgr.h:304
int obj_type
Definition: drvmgr.h:298
int error
Definition: drvmgr.h:315
short minor_drv
Definition: drvmgr.h:305
void * businfo
Definition: drvmgr.h:309
short minor_bus
Definition: drvmgr.h:306
Definition: drvmgr.h:319
int(* info)(struct drvmgr_dev *, void(*print)(void *p, char *str), void *p, int, char *argv[])
Definition: drvmgr.h:322
int(* remove)(struct drvmgr_dev *)
Definition: drvmgr.h:321
Definition: drvmgr.h:231
int minor_bus
Definition: drvmgr.h:233
struct drvmgr_key * keys
Definition: drvmgr.h:234
uint64_t drv_id
Definition: drvmgr.h:232
Definition: drvmgr.h:327
char * name
Definition: drvmgr.h:333
struct drvmgr_drv * next
Definition: drvmgr.h:329
unsigned int dev_cnt
Definition: drvmgr.h:337
struct drvmgr_drv_ops * ops
Definition: drvmgr.h:335
struct drvmgr_func * funcs
Definition: drvmgr.h:336
unsigned int dev_priv_size
Definition: drvmgr.h:338
struct drvmgr_dev * dev
Definition: drvmgr.h:330
int obj_type
Definition: drvmgr.h:328
uint64_t drv_id
Definition: drvmgr.h:332
int bus_type
Definition: drvmgr.h:334
Definition: drvmgr.h:182
Definition: drvmgr.h:222
Definition: drvmgr_list.h:48
Definition: drvmgr.h:249
unsigned int size
Definition: drvmgr.h:251
char * name
Definition: drvmgr.h:250
char * to_adr
Definition: drvmgr.h:254
char * from_adr
Definition: drvmgr.h:252
Definition: drvmgr.h:849
unsigned p
Definition: tte.h:17
Definition: drvmgr.h:215
unsigned int i
Definition: drvmgr.h:216
char * str
Definition: drvmgr.h:217
void * ptr
Definition: drvmgr.h:218