Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/devman/devman.h

    rd0dd7b5 rb72efe8  
    11/*
    22 * Copyright (c) 2010 Lenka Trochtova
    3  * Copyright (c) 2011 Jiri Svoboda
    43 * All rights reserved.
    54 *
     
    4241#include <adt/hash_table.h>
    4342#include <ipc/devman.h>
    44 #include <ipc/loc.h>
     43#include <ipc/devmap.h>
    4544#include <fibril_synch.h>
    4645#include <atomic.h>
     
    5453#define DEVICE_BUCKETS 256
    5554
    56 #define LOC_DEVICE_NAMESPACE "devices"
    57 #define LOC_SEPARATOR '\\'
     55#define DEVMAP_CLASS_NAMESPACE "class"
     56#define DEVMAP_DEVICE_NAMESPACE "devices"
     57#define DEVMAP_SEPARATOR '\\'
    5858
    5959struct dev_node;
     
    155155        /** Name of the function, assigned by the device driver */
    156156        char *name;
    157         /** Function type */
    158         fun_type_t ftype;
    159157       
    160158        /** Full path and name of the device in device hierarchy */
     
    172170        match_id_list_t match_ids;
    173171       
    174         /** Service ID if the device function is registered with loc. */
    175         service_id_t service_id;
     172        /** List of device classes to which this device function belongs. */
     173        list_t classes;
     174        /** Devmap handle if the device function is registered by devmap. */
     175        devmap_handle_t devmap_handle;
    176176       
    177177        /**
     
    181181       
    182182        /**
    183          * Used by the hash table of functions indexed by service IDs.
    184          */
    185         link_t loc_fun;
     183         * Used by the hash table of functions indexed by devmap device handles.
     184         */
     185        link_t devmap_fun;
    186186};
    187187
     
    208208       
    209209        /**
    210          * Hash table of services registered with location service, indexed by
    211          * service IDs.
    212          */
    213         hash_table_t loc_functions;
     210         * Hash table of devices registered by devmapper, indexed by devmap
     211         * handles.
     212         */
     213        hash_table_t devmap_functions;
    214214} dev_tree_t;
     215
     216typedef struct dev_class {
     217        /** The name of the class. */
     218        const char *name;
     219       
     220        /**
     221         * Pointer to the previous and next class in the list of registered
     222         * classes.
     223         */
     224        link_t link;
     225       
     226        /**
     227         * List of dev_class_info structures - one for each device registered by
     228         * this class.
     229         */
     230        list_t devices;
     231       
     232        /**
     233         * Default base name for the device within the class, might be overrided
     234         * by the driver.
     235         */
     236        const char *base_dev_name;
     237       
     238        /** Unique numerical identifier of the newly added device. */
     239        size_t curr_dev_idx;
     240        /** Synchronize access to the list of devices in this class. */
     241        fibril_mutex_t mutex;
     242} dev_class_t;
     243
     244/**
     245 * Provides n-to-m mapping between function nodes and classes - each function
     246 * can register in an arbitrary number of classes and each class can contain
     247 * an arbitrary number of device functions.
     248 */
     249typedef struct dev_class_info {
     250        /** The class. */
     251        dev_class_t *dev_class;
     252        /** The device. */
     253        fun_node_t *fun;
     254       
     255        /**
     256         * Pointer to the previous and next class info in the list of devices
     257         * registered by the class.
     258         */
     259        link_t link;
     260       
     261        /**
     262         * Pointer to the previous and next class info in the list of classes
     263         * by which the device is registered.
     264         */
     265        link_t dev_classes;
     266       
     267        /** The name of the device function within the class. */
     268        char *dev_name;
     269        /** The handle of the device by device mapper in the class namespace. */
     270        devmap_handle_t devmap_handle;
     271       
     272        /**
     273         * Link in the hash table of devices registered by the devmapper using
     274         * their class names.
     275         */
     276        link_t devmap_link;
     277} dev_class_info_t;
     278
     279/** The list of device classes. */
     280typedef struct class_list {
     281        /** List of classes. */
     282        list_t classes;
     283       
     284        /**
     285         * Hash table of devices registered by devmapper using their class name,
     286         * indexed by devmap handles.
     287         */
     288        hash_table_t devmap_functions;
     289       
     290        /** Fibril mutex for list of classes. */
     291        fibril_rwlock_t rwlock;
     292} class_list_t;
    215293
    216294/* Match ids and scores */
     
    261339extern fun_node_t *find_fun_node_by_path(dev_tree_t *, char *);
    262340extern fun_node_t *find_fun_node_in_device(dev_node_t *, const char *);
     341extern fun_node_t *find_fun_node_by_class(class_list_t *, const char *, const char *);
    263342
    264343/* Device tree */
     
    268347extern bool insert_dev_node(dev_tree_t *, dev_node_t *, fun_node_t *);
    269348extern bool insert_fun_node(dev_tree_t *, fun_node_t *, char *, dev_node_t *);
    270 extern void remove_fun_node(dev_tree_t *, fun_node_t *);
    271 
    272 /* Loc services */
    273 
    274 extern void loc_register_tree_function(fun_node_t *, dev_tree_t *);
    275 
    276 extern fun_node_t *find_loc_tree_function(dev_tree_t *, service_id_t);
    277 
    278 extern void tree_add_loc_function(dev_tree_t *, fun_node_t *);
     349
     350/* Device classes */
     351
     352extern dev_class_t *create_dev_class(void);
     353extern dev_class_info_t *create_dev_class_info(void);
     354extern size_t get_new_class_dev_idx(dev_class_t *);
     355extern char *create_dev_name_for_class(dev_class_t *, const char *);
     356extern dev_class_info_t *add_function_to_class(fun_node_t *, dev_class_t *,
     357    const char *);
     358
     359extern void init_class_list(class_list_t *);
     360
     361extern dev_class_t *get_dev_class(class_list_t *, char *);
     362extern dev_class_t *find_dev_class_no_lock(class_list_t *, const char *);
     363extern dev_class_info_t *find_dev_in_class(dev_class_t *, const char *);
     364extern void add_dev_class_no_lock(class_list_t *, dev_class_t *);
     365
     366/* Devmap devices */
     367
     368extern void devmap_register_tree_function(fun_node_t *, dev_tree_t *);
     369
     370extern fun_node_t *find_devmap_tree_function(dev_tree_t *, devmap_handle_t);
     371extern fun_node_t *find_devmap_class_function(class_list_t *, devmap_handle_t);
     372
     373extern void class_add_devmap_function(class_list_t *, dev_class_info_t *);
     374extern void tree_add_devmap_function(dev_tree_t *, fun_node_t *);
    279375
    280376#endif
Note: See TracChangeset for help on using the changeset viewer.