Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/include/asm.h

    r86a34d3e r314f3a3c  
    3838#include <config.h>
    3939#include <typedefs.h>
    40 #include <typedefs.h>
    4140#include <arch/register.h>
     41#include <arch/legacyio.h>
    4242#include <trace.h>
    4343
    44 #define IA64_IOSPACE_ADDRESS  0xE001000000000000ULL
    45 
    4644#define IO_SPACE_BOUNDARY       ((void *) (64 * 1024))
    4745
     46/** Map the I/O port address to a legacy I/O address. */
     47NO_TRACE static inline uintptr_t p2a(volatile void *p)
     48{
     49        uintptr_t prt = (uintptr_t) p;
     50
     51        return legacyio_virt_base + (((prt >> 2) << 12) | (prt & 0xfff));
     52}
     53       
    4854NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v)
    4955{
    50         if (port < (ioport8_t *) IO_SPACE_BOUNDARY) {
    51                 uintptr_t prt = (uintptr_t) port;
    52        
    53                 *((ioport8_t *) (IA64_IOSPACE_ADDRESS +
    54                     ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
    55         } else {
     56        if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
     57                *((ioport8_t *) p2a(port)) = v;
     58        else
    5659                *port = v;
    57         }
    58        
    59         asm volatile (
    60                 "mf\n"
     60       
     61        asm volatile (
     62                "mf\n"
     63                "mf.a\n"
    6164                ::: "memory"
    6265        );
     
    6568NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
    6669{
    67         if (port < (ioport16_t *) IO_SPACE_BOUNDARY) {
    68                 uintptr_t prt = (uintptr_t) port;
    69        
    70                 *((ioport16_t *) (IA64_IOSPACE_ADDRESS +
    71                     ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
    72         } else {
     70        if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
     71                *((ioport16_t *) p2a(port)) = v;
     72        else
    7373                *port = v;
    74         }
    75        
    76         asm volatile (
    77                 "mf\n"
     74       
     75        asm volatile (
     76                "mf\n"
     77                "mf.a\n"
    7878                ::: "memory"
    7979        );
     
    8282NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v)
    8383{
    84         if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
    85                 uintptr_t prt = (uintptr_t) port;
    86        
    87                 *((ioport32_t *) (IA64_IOSPACE_ADDRESS +
    88                     ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
    89         } else {
     84        if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
     85                *((ioport32_t *) p2a(port)) = v;
     86        else
    9087                *port = v;
    91         }
    92        
    93         asm volatile (
    94                 "mf\n"
     88       
     89        asm volatile (
     90                "mf\n"
     91                "mf.a\n"
    9592                ::: "memory"
    9693        );
     
    106103        );
    107104
    108         if (port < (ioport8_t *) IO_SPACE_BOUNDARY) {
    109                 uintptr_t prt = (uintptr_t) port;
    110 
    111                 v = *((ioport8_t *) (IA64_IOSPACE_ADDRESS +
    112                     ((prt & 0xfff) | ((prt >> 2) << 12))));
    113         } else {
     105        if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
     106                v = *((ioport8_t *) p2a(port));
     107        else
    114108                v = *port;
    115         }
     109
     110        asm volatile (
     111                "mf.a\n"
     112                ::: "memory"
     113        );
    116114       
    117115        return v;
     
    127125        );
    128126
    129         if (port < (ioport16_t *) IO_SPACE_BOUNDARY) {
    130                 uintptr_t prt = (uintptr_t) port;
    131 
    132                 v = *((ioport16_t *) (IA64_IOSPACE_ADDRESS +
    133                     ((prt & 0xfff) | ((prt >> 2) << 12))));
    134         } else {
     127        if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
     128                v = *((ioport16_t *) p2a(port));
     129        else
    135130                v = *port;
    136         }
     131
     132        asm volatile (
     133                "mf.a\n"
     134                ::: "memory"
     135        );
    137136       
    138137        return v;
     
    148147        );
    149148       
    150         if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
    151                 uintptr_t prt = (uintptr_t) port;
    152                
    153                 v = *((ioport32_t *) (IA64_IOSPACE_ADDRESS +
    154                     ((prt & 0xfff) | ((prt >> 2) << 12))));
    155         } else {
     149        if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
     150                v = *((ioport32_t *) p2a(port));
     151        else
    156152                v = *port;
    157         }
     153
     154        asm volatile (
     155                "mf.a\n"
     156                ::: "memory"
     157        );
    158158
    159159        return v;
Note: See TracChangeset for help on using the changeset viewer.