Ignore:
File:
1 edited

Legend:

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

    r314f3a3c r2f23341  
    3838#include <config.h>
    3939#include <typedefs.h>
     40#include <typedefs.h>
    4041#include <arch/register.h>
    41 #include <arch/legacyio.h>
    4242#include <trace.h>
    4343
    44 #define IO_SPACE_BOUNDARY       ((void *) (64 * 1024))
    45 
    46 /** Map the I/O port address to a legacy I/O address. */
    47 NO_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        
     44#define IA64_IOSPACE_ADDRESS  0xE001000000000000ULL
     45
    5446NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v)
    5547{
    56         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    57                 *((ioport8_t *) p2a(port)) = v;
    58         else
    59                 *port = v;
    60        
    61         asm volatile (
    62                 "mf\n"
    63                 "mf.a\n"
     48        uintptr_t prt = (uintptr_t) port;
     49       
     50        *((ioport8_t *) (IA64_IOSPACE_ADDRESS +
     51            ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     52       
     53        asm volatile (
     54                "mf\n"
    6455                ::: "memory"
    6556        );
     
    6859NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
    6960{
    70         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    71                 *((ioport16_t *) p2a(port)) = v;
    72         else
    73                 *port = v;
    74        
    75         asm volatile (
    76                 "mf\n"
    77                 "mf.a\n"
     61        uintptr_t prt = (uintptr_t) port;
     62       
     63        *((ioport16_t *) (IA64_IOSPACE_ADDRESS +
     64            ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     65       
     66        asm volatile (
     67                "mf\n"
    7868                ::: "memory"
    7969        );
     
    8272NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v)
    8373{
    84         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    85                 *((ioport32_t *) p2a(port)) = v;
    86         else
    87                 *port = v;
    88        
    89         asm volatile (
    90                 "mf\n"
    91                 "mf.a\n"
     74        uintptr_t prt = (uintptr_t) port;
     75       
     76        *((ioport32_t *) (IA64_IOSPACE_ADDRESS +
     77            ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     78       
     79        asm volatile (
     80                "mf\n"
    9281                ::: "memory"
    9382        );
     
    9685NO_TRACE static inline uint8_t pio_read_8(ioport8_t *port)
    9786{
    98         uint8_t v;
    99 
    100         asm volatile (
    101                 "mf\n"
    102                 ::: "memory"
    103         );
    104 
    105         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    106                 v = *((ioport8_t *) p2a(port));
    107         else
    108                 v = *port;
    109 
    110         asm volatile (
    111                 "mf.a\n"
    112                 ::: "memory"
    113         );
    114        
    115         return v;
     87        uintptr_t prt = (uintptr_t) port;
     88       
     89        asm volatile (
     90                "mf\n"
     91                ::: "memory"
     92        );
     93       
     94        return *((ioport8_t *) (IA64_IOSPACE_ADDRESS +
     95            ((prt & 0xfff) | ((prt >> 2) << 12))));
    11696}
    11797
    11898NO_TRACE static inline uint16_t pio_read_16(ioport16_t *port)
    11999{
    120         uint16_t v;
    121 
    122         asm volatile (
    123                 "mf\n"
    124                 ::: "memory"
    125         );
    126 
    127         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    128                 v = *((ioport16_t *) p2a(port));
    129         else
    130                 v = *port;
    131 
    132         asm volatile (
    133                 "mf.a\n"
    134                 ::: "memory"
    135         );
    136        
    137         return v;
     100        uintptr_t prt = (uintptr_t) port;
     101       
     102        asm volatile (
     103                "mf\n"
     104                ::: "memory"
     105        );
     106       
     107        return *((ioport16_t *) (IA64_IOSPACE_ADDRESS +
     108            ((prt & 0xfff) | ((prt >> 2) << 12))));
    138109}
    139110
    140111NO_TRACE static inline uint32_t pio_read_32(ioport32_t *port)
    141112{
    142         uint32_t v;
    143        
    144         asm volatile (
    145                 "mf\n"
    146                 ::: "memory"
    147         );
    148        
    149         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    150                 v = *((ioport32_t *) p2a(port));
    151         else
    152                 v = *port;
    153 
    154         asm volatile (
    155                 "mf.a\n"
    156                 ::: "memory"
    157         );
    158 
    159         return v;
     113        uintptr_t prt = (uintptr_t) port;
     114       
     115        asm volatile (
     116                "mf\n"
     117                ::: "memory"
     118        );
     119       
     120        return *((ioport32_t *) (IA64_IOSPACE_ADDRESS +
     121            ((prt & 0xfff) | ((prt >> 2) << 12))));
    160122}
    161123
Note: See TracChangeset for help on using the changeset viewer.