Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/ddi.c

    rfbcdeb8 rc0699467  
    3333 */
    3434
    35 #include <assert.h>
    36 #include <unistd.h>
    37 #include <errno.h>
    3835#include <sys/types.h>
    3936#include <abi/ddi/arg.h>
     
    4542#include <align.h>
    4643#include <libarch/config.h>
    47 #include "private/libc.h"
    4844
    4945/** Return unique device number.
     
    5753}
    5854
    59 /** Map a piece of physical memory to task.
     55/** Map piece of physical memory to task.
    6056 *
    6157 * Caller of this function must have the CAP_MEM_MANAGER capability.
    6258 *
    63  * @param phys  Physical address of the starting frame.
    64  * @param pages Number of pages to map.
    65  * @param flags Flags for the new address space area.
    66  * @param virt  Virtual address of the starting page.
     59 * @param pf            Physical address of the starting frame.
     60 * @param vp            Virtual address of the starting page.
     61 * @param pages         Number of pages to map.
     62 * @param flags         Flags for the new address space area.
    6763 *
    68  * @return EOK on success
    69  * @return EPERM if the caller lacks the CAP_MEM_MANAGER capability
    70  * @return ENOENT if there is no task with specified ID
    71  * @return ENOMEM if there was some problem in creating
    72  *         the address space area.
    73  *
     64 * @return              0 on success, EPERM if the caller lacks the
     65 *                      CAP_MEM_MANAGER capability, ENOENT if there is no task
     66 *                      with specified ID and ENOMEM if there was some problem
     67 *                      in creating address space area.
    7468 */
    75 int physmem_map(void *phys, size_t pages, unsigned int flags, void **virt)
     69int physmem_map(void *pf, void *vp, unsigned long pages, int flags)
    7670{
    77         return __SYSCALL5(SYS_PHYSMEM_MAP, (sysarg_t) phys,
    78             pages, flags, (sysarg_t) virt, (sysarg_t) __entry);
    79 }
    80 
    81 int dmamem_map(void *virt, size_t size, unsigned int map_flags,
    82     unsigned int flags, void **phys)
    83 {
    84         return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size,
    85             (sysarg_t) map_flags, (sysarg_t) flags & ~DMAMEM_FLAGS_ANONYMOUS,
    86             (sysarg_t) phys, (sysarg_t) virt, 0);
    87 }
    88 
    89 int dmamem_map_anonymous(size_t size, unsigned int map_flags,
    90     unsigned int flags, void **phys, void **virt)
    91 {
    92         return (int) __SYSCALL6(SYS_DMAMEM_MAP, (sysarg_t) size,
    93             (sysarg_t) map_flags, (sysarg_t) flags | DMAMEM_FLAGS_ANONYMOUS,
    94             (sysarg_t) phys, (sysarg_t) virt, (sysarg_t) __entry);
    95 }
    96 
    97 int dmamem_unmap(void *virt, size_t size)
    98 {
    99         return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, (sysarg_t) size, 0);
    100 }
    101 
    102 int dmamem_unmap_anonymous(void *virt)
    103 {
    104         return __SYSCALL3(SYS_DMAMEM_UNMAP, (sysarg_t) virt, 0,
    105             DMAMEM_FLAGS_ANONYMOUS);
     71        return __SYSCALL4(SYS_PHYSMEM_MAP, (sysarg_t) pf, (sysarg_t) vp, pages,
     72            flags);
    10673}
    10774
     
    11077 * Caller of this function must have the IO_MEM_MANAGER capability.
    11178 *
    112  * @param id     Task ID.
    113  * @param ioaddr Starting address of the I/O range.
    114  * @param size   Size of the range.
     79 * @param id            Task ID.
     80 * @param ioaddr        Starting address of the I/O range.
     81 * @param size          Size of the range.
    11582 *
    116  * @return EOK on success
    117  * @return EPERM if the caller lacks the CAP_IO_MANAGER capability
    118  * @return ENOENT if there is no task with specified ID
    119  * @return ENOMEM if there was some problem in allocating memory.
    120  *
     83 * @return              0 on success, EPERM if the caller lacks the
     84 *                      CAP_IO_MANAGER capability, ENOENT if there is no task
     85 *                      with specified ID and ENOMEM if there was some problem
     86 *                      in allocating memory.
    12187 */
    12288int iospace_enable(task_id_t id, void *ioaddr, unsigned long size)
    12389{
    12490        ddi_ioarg_t arg;
    125        
     91
    12692        arg.task_id = id;
    12793        arg.ioaddr = ioaddr;
    12894        arg.size = size;
    129        
     95
    13096        return __SYSCALL1(SYS_IOSPACE_ENABLE, (sysarg_t) &arg);
    13197}
     
    13399/** Enable PIO for specified I/O range.
    134100 *
    135  * @param pio_addr I/O start address.
    136  * @param size     Size of the I/O region.
    137  * @param virt     Virtual address for application's
    138  *                 PIO operations.
     101 * @param pio_addr      I/O start address.
     102 * @param size          Size of the I/O region.
     103 * @param use_addr      Address where the final address for application's PIO
     104 *                      will be stored.
    139105 *
    140  * @return EOK on success.
    141  * @return Negative error code on failure.
    142  *
     106 * @return              Zero on success or negative error code.
    143107 */
    144 int pio_enable(void *pio_addr, size_t size, void **virt)
     108int pio_enable(void *pio_addr, size_t size, void **use_addr)
    145109{
     110        void *phys;
     111        void *virt;
     112        size_t offset;
     113        unsigned int pages;
     114
    146115#ifdef IO_SPACE_BOUNDARY
    147116        if (pio_addr < IO_SPACE_BOUNDARY) {
    148                 *virt = pio_addr;
     117                *use_addr = pio_addr;
    149118                return iospace_enable(task_get_id(), pio_addr, size);
    150119        }
    151120#endif
    152        
    153         void *phys_frame =
    154             (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE);
    155         size_t offset = pio_addr - phys_frame;
    156         size_t pages = SIZE2PAGES(offset + size);
    157        
    158         void *virt_page;
    159         int rc = physmem_map(phys_frame, pages,
    160             AS_AREA_READ | AS_AREA_WRITE, &virt_page);
    161         if (rc != EOK)
    162                 return rc;
    163        
    164         *virt = virt_page + offset;
    165         return EOK;
     121
     122        phys = (void *) ALIGN_DOWN((uintptr_t) pio_addr, PAGE_SIZE);
     123        offset = pio_addr - phys;
     124        pages = ALIGN_UP(offset + size, PAGE_SIZE) >> PAGE_WIDTH;
     125        virt = as_get_mappable_page(pages << PAGE_WIDTH);
     126        *use_addr = virt + offset;
     127        return physmem_map(phys, virt, pages, AS_AREA_READ | AS_AREA_WRITE);
    166128}
    167129
     
    176138 *
    177139 */
    178 int irq_register(int inr, int devno, int method, irq_code_t *ucode)
     140int register_irq(int inr, int devno, int method, irq_code_t *ucode)
    179141{
    180         return __SYSCALL4(SYS_IRQ_REGISTER, inr, devno, method,
     142        return __SYSCALL4(SYS_REGISTER_IRQ, inr, devno, method,
    181143            (sysarg_t) ucode);
    182144}
     
    190152 *
    191153 */
    192 int irq_unregister(int inr, int devno)
     154int unregister_irq(int inr, int devno)
    193155{
    194         return __SYSCALL2(SYS_IRQ_UNREGISTER, inr, devno);
     156        return __SYSCALL2(SYS_UNREGISTER_IRQ, inr, devno);
    195157}
    196158
Note: See TracChangeset for help on using the changeset viewer.