Changeset f834dd81 in mainline for uspace/drv/intctl/obio/obio.c


Ignore:
Timestamp:
2017-10-31T19:24:58Z (7 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3654684
Parents:
eca820c (diff), 2b11c3c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge OBIO DDF conversion.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • uspace/drv/intctl/obio/obio.c

    reca820c rf834dd81  
    4242 */
    4343
     44#include <align.h>
     45#include <as.h>
     46#include <async.h>
     47#include <ddf/driver.h>
     48#include <ddf/log.h>
     49#include <ddi.h>
     50#include <errno.h>
     51#include <inttypes.h>
    4452#include <ipc/irc.h>
    45 #include <loc.h>
    46 #include <as.h>
    47 #include <ddi.h>
    48 #include <align.h>
    49 #include <inttypes.h>
    5053#include <stdbool.h>
    51 #include <errno.h>
    52 #include <async.h>
    53 #include <align.h>
    54 #include <async.h>
    5554#include <stdio.h>
     55
     56#include "obio.h"
    5657
    5758#define NAME "obio"
     
    6768#define INO_MASK        0x1f
    6869
    69 static uintptr_t base_phys;
    70 static volatile uint64_t *base_virt = (volatile uint64_t *) AS_AREA_ANY;
    71 
    7270/** Handle one connection to obio.
    7371 *
     
    8078        ipc_callid_t callid;
    8179        ipc_call_t call;
     80        obio_t *obio;
    8281
    8382        /*
     
    8685        async_answer_0(iid, EOK);
    8786
     87        obio = (obio_t *)ddf_dev_data_get(ddf_fun_get_dev((ddf_fun_t *)arg));
     88
    8889        while (1) {
    8990                int inr;
    90        
     91
    9192                callid = async_get_call(&call);
    9293                switch (IPC_GET_IMETHOD(call)) {
    9394                case IRC_ENABLE_INTERRUPT:
    9495                        inr = IPC_GET_ARG1(call);
    95                         base_virt[OBIO_IMR(inr & INO_MASK)] |= (1UL << 31);
     96                        ((volatile uint64_t *)(obio->regs))[OBIO_IMR(inr & INO_MASK)] |= (1UL << 31);
    9697                        async_answer_0(callid, EOK);
    9798                        break;
     
    102103                case IRC_CLEAR_INTERRUPT:
    103104                        inr = IPC_GET_ARG1(call);
    104                         base_virt[OBIO_CIR(inr & INO_MASK)] = 0;
     105                        ((volatile uint64_t *)(obio->regs))[OBIO_CIR(inr & INO_MASK)] = 0;
    105106                        async_answer_0(callid, EOK);
    106107                        break;
     
    112113}
    113114
    114 /** Initialize the OBIO driver.
    115  *
    116  * In the future, the OBIO driver should be integrated with the sun4u platform driver.
    117  */
    118 static bool obio_init(void)
     115/** Add OBIO device. */
     116int obio_add(obio_t *obio, obio_res_t *res)
    119117{
    120         category_id_t irc_cat;
    121         service_id_t svc_id;
     118        ddf_fun_t *fun_a = NULL;
     119        int flags;
     120        int retval;
    122121        int rc;
    123        
    124         base_phys = (uintptr_t) 0x1fe00000000ULL;
    125        
    126         int flags = AS_AREA_READ | AS_AREA_WRITE;
    127         int retval = physmem_map(base_phys,
     122
     123        flags = AS_AREA_READ | AS_AREA_WRITE;
     124        obio->regs = (volatile uint64_t *)AS_AREA_ANY;
     125        retval = physmem_map(res->base,
    128126            ALIGN_UP(OBIO_SIZE, PAGE_SIZE) >> PAGE_WIDTH, flags,
    129             (void *) &base_virt);
    130        
     127            (void *) &obio->regs);
     128
    131129        if (retval < 0) {
    132                 printf("%s: Error mapping OBIO registers\n", NAME);
    133                 return false;
     130                ddf_msg(LVL_ERROR, "Error mapping OBIO registers");
     131                rc = EIO;
     132                goto error;
    134133        }
    135        
    136         printf("%s: OBIO registers with base at 0x%" PRIun "\n", NAME, base_phys);
    137        
    138         async_set_fallback_port_handler(obio_connection, NULL);
    139        
    140         rc = loc_server_register(NAME);
     134
     135        ddf_msg(LVL_NOTE, "OBIO registers with base at 0x%" PRIun, res->base);
     136
     137        fun_a = ddf_fun_create(obio->dev, fun_exposed, "a");
     138        if (fun_a == NULL) {
     139                ddf_msg(LVL_ERROR, "Failed creating function 'a'.");
     140                rc = ENOMEM;
     141                goto error;
     142        }
     143
     144        ddf_fun_set_conn_handler(fun_a, obio_connection);
     145
     146        rc = ddf_fun_bind(fun_a);
    141147        if (rc != EOK) {
    142                 printf("%s: Failed registering server. (%d)\n", NAME, rc);
    143                 return false;
     148                ddf_msg(LVL_ERROR, "Failed binding function 'a'. (%d)", rc);
     149                goto error;
    144150        }
    145        
    146         rc = loc_service_register("irc/" NAME, &svc_id);
    147         if (rc != EOK) {
    148                 printf("%s: Failed registering service. (%d)\n", NAME, rc);
    149                 return false;
    150         }
    151        
    152         rc = loc_category_get_id("irc", &irc_cat, IPC_FLAG_BLOCKING);
    153         if (rc != EOK) {
    154                 printf("%s: Failed resolving category 'iplink' (%d).\n", NAME,
    155                     rc);
    156                 return false;
    157         }
    158        
    159         rc = loc_service_add_to_cat(svc_id, irc_cat);
    160         if (rc != EOK) {
    161                 printf("%s: Failed adding service to category (%d).\n", NAME,
    162                     rc);
    163                 return false;
    164         }
    165        
    166         return true;
     151
     152        rc = ddf_fun_add_to_category(fun_a, "irc");
     153        if (rc != EOK)
     154                goto error;
     155
     156        return EOK;
     157error:
     158        if (fun_a != NULL)
     159                ddf_fun_destroy(fun_a);
     160        return rc;
    167161}
    168162
    169 int main(int argc, char **argv)
     163/** Remove OBIO device */
     164int obio_remove(obio_t *obio)
    170165{
    171         printf("%s: HelenOS OBIO driver\n", NAME);
    172        
    173         if (!obio_init())
    174                 return -1;
    175        
    176         printf("%s: Accepting connections\n", NAME);
    177         task_retval(0);
    178         async_manager();
    179        
    180         /* Never reached */
    181         return 0;
     166        return ENOTSUP;
    182167}
     168
     169/** OBIO device gone */
     170int obio_gone(obio_t *obio)
     171{
     172        return ENOTSUP;
     173}
     174
    183175
    184176/**
Note: See TracChangeset for help on using the changeset viewer.