Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/root/root.c

    r6f9e7fea raf6b5157  
    22 * Copyright (c) 2010 Lenka Trochtova
    33 * Copyright (c) 2010 Vojtech Horky
     4 * Copyright (c) 2011 Jiri Svoboda
    45 * All rights reserved.
    56 *
     
    4445#include <stdlib.h>
    4546#include <str.h>
     47#include <str_error.h>
    4648#include <ctype.h>
    4749#include <macros.h>
    48 
    49 #include <driver.h>
     50#include <inttypes.h>
     51#include <sysinfo.h>
     52
     53#include <ddf/driver.h>
    5054#include <devman.h>
    5155#include <ipc/devman.h>
     
    5357#define NAME "root"
    5458
    55 #define PLATFORM_DEVICE_NAME "hw"
    56 #define PLATFORM_DEVICE_MATCH_ID STRING(UARCH)
    57 #define PLATFORM_DEVICE_MATCH_SCORE 100
    58 
    59 #define VIRTUAL_DEVICE_NAME "virt"
    60 #define VIRTUAL_DEVICE_MATCH_ID "rootvirt"
    61 #define VIRTUAL_DEVICE_MATCH_SCORE 100
    62 
    63 static int root_add_device(device_t *dev);
     59#define PLATFORM_FUN_NAME "hw"
     60#define PLATFORM_FUN_MATCH_ID_FMT "platform/%s"
     61#define PLATFORM_FUN_MATCH_SCORE 100
     62
     63#define VIRTUAL_FUN_NAME "virt"
     64#define VIRTUAL_FUN_MATCH_ID "rootvirt"
     65#define VIRTUAL_FUN_MATCH_SCORE 100
     66
     67static int root_add_device(ddf_dev_t *dev);
    6468
    6569/** The root device driver's standard operations. */
     
    7478};
    7579
    76 /** Create the device which represents the root of virtual device tree.
    77  *
    78  * @param parent Parent of the newly created device.
    79  * @return Error code.
    80  */
    81 static int add_virtual_root_child(device_t *parent)
    82 {
    83         printf(NAME ": adding new child for virtual devices.\n");
    84         printf(NAME ":   device node is `%s' (%d %s)\n", VIRTUAL_DEVICE_NAME,
    85             VIRTUAL_DEVICE_MATCH_SCORE, VIRTUAL_DEVICE_MATCH_ID);
    86 
    87         int res = child_device_register_wrapper(parent, VIRTUAL_DEVICE_NAME,
    88             VIRTUAL_DEVICE_MATCH_ID, VIRTUAL_DEVICE_MATCH_SCORE);
    89 
    90         return res;
    91 }
    92 
    93 /** Create the device which represents the root of HW device tree.
    94  *
    95  * @param parent        Parent of the newly created device.
    96  * @return 0 on success, negative error number otherwise.
    97  */
    98 static int add_platform_child(device_t *parent)
    99 {
    100         printf(NAME ": adding new child for platform device.\n");
    101         printf(NAME ":   device node is `%s' (%d %s)\n", PLATFORM_DEVICE_NAME,
    102             PLATFORM_DEVICE_MATCH_SCORE, PLATFORM_DEVICE_MATCH_ID);
    103        
    104         int res = child_device_register_wrapper(parent, PLATFORM_DEVICE_NAME,
    105             PLATFORM_DEVICE_MATCH_ID, PLATFORM_DEVICE_MATCH_SCORE);
    106 
    107         return res;
     80/** Create the function which represents the root of virtual device tree.
     81 *
     82 * @param dev   Device
     83 * @return      EOK on success or negative error code
     84 */
     85static int add_virtual_root_fun(ddf_dev_t *dev)
     86{
     87        const char *name = VIRTUAL_FUN_NAME;
     88        ddf_fun_t *fun;
     89        int rc;
     90
     91        printf(NAME ": adding new function for virtual devices.\n");
     92        printf(NAME ":   function node is `%s' (%d %s)\n", name,
     93            VIRTUAL_FUN_MATCH_SCORE, VIRTUAL_FUN_MATCH_ID);
     94
     95        fun = ddf_fun_create(dev, fun_inner, name);
     96        if (fun == NULL) {
     97                printf(NAME ": error creating function %s\n", name);
     98                return ENOMEM;
     99        }
     100
     101        rc = ddf_fun_add_match_id(fun, VIRTUAL_FUN_MATCH_ID,
     102            VIRTUAL_FUN_MATCH_SCORE);
     103        if (rc != EOK) {
     104                printf(NAME ": error adding match IDs to function %s\n", name);
     105                ddf_fun_destroy(fun);
     106                return rc;
     107        }
     108
     109        rc = ddf_fun_bind(fun);
     110        if (rc != EOK) {
     111                printf(NAME ": error binding function %s: %s\n", name,
     112                    str_error(rc));
     113                ddf_fun_destroy(fun);
     114                return rc;
     115        }
     116
     117        return EOK;
     118}
     119
     120/** Create the function which represents the root of HW device tree.
     121 *
     122 * @param dev   Device
     123 * @return      EOK on success or negative error code
     124 */
     125static int add_platform_fun(ddf_dev_t *dev)
     126{
     127        char *match_id;
     128        char *platform;
     129        size_t platform_size;
     130
     131        const char *name = PLATFORM_FUN_NAME;
     132        ddf_fun_t *fun;
     133        int rc;
     134
     135        /* Get platform name from sysinfo. */
     136        platform = sysinfo_get_data("platform", &platform_size);
     137        if (platform == NULL) {
     138                printf(NAME ": Failed to obtain platform name.\n");
     139                return ENOENT;
     140        }
     141
     142        /* Null-terminate string. */
     143        platform = realloc(platform, platform_size + 1);
     144        if (platform == NULL) {
     145                printf(NAME ": Memory allocation failed.\n");
     146                return ENOMEM;
     147        }
     148
     149        platform[platform_size] = '\0';
     150
     151        /* Construct match ID. */
     152        if (asprintf(&match_id, PLATFORM_FUN_MATCH_ID_FMT, platform) == -1) {
     153                printf(NAME ": Memory allocation failed.\n");
     154                return ENOMEM;
     155        }
     156
     157        /* Add function. */
     158        printf(NAME ": adding platform function\n");
     159        printf(NAME ":   function node is `%s' (%d %s)\n", PLATFORM_FUN_NAME,
     160            PLATFORM_FUN_MATCH_SCORE, match_id);
     161
     162        fun = ddf_fun_create(dev, fun_inner, name);
     163        if (fun == NULL) {
     164                printf(NAME ": error creating function %s\n", name);
     165                return ENOMEM;
     166        }
     167
     168        rc = ddf_fun_add_match_id(fun, match_id, PLATFORM_FUN_MATCH_SCORE);
     169        if (rc != EOK) {
     170                printf(NAME ": error adding match IDs to function %s\n", name);
     171                ddf_fun_destroy(fun);
     172                return rc;
     173        }
     174
     175        rc = ddf_fun_bind(fun);
     176        if (rc != EOK) {
     177                printf(NAME ": error binding function %s: %s\n", name,
     178                    str_error(rc));
     179                ddf_fun_destroy(fun);
     180                return rc;
     181        }
     182
     183        return EOK;
    108184}
    109185
     
    113189 *                      of HW and pseudo devices).
    114190 */
    115 static int root_add_device(device_t *dev)
    116 {
    117         printf(NAME ": root_add_device, device handle = %d\n", dev->handle);
    118        
     191static int root_add_device(ddf_dev_t *dev)
     192{
     193        printf(NAME ": root_add_device, device handle=%" PRIun "\n",
     194            dev->handle);
     195
    119196        /*
    120197         * Register virtual devices root.
     
    122199         * vital for the system.
    123200         */
    124         add_virtual_root_child(dev);
     201        add_virtual_root_fun(dev);
    125202
    126203        /* Register root device's children. */
    127         int res = add_platform_child(dev);
     204        int res = add_platform_fun(dev);
    128205        if (EOK != res)
    129206                printf(NAME ": failed to add child device for platform.\n");
    130        
     207
    131208        return res;
    132209}
     
    135212{
    136213        printf(NAME ": HelenOS root device driver\n");
    137         return driver_main(&root_driver);
     214        return ddf_driver_main(&root_driver);
    138215}
    139216
Note: See TracChangeset for help on using the changeset viewer.