Ignore:
File:
1 edited

Legend:

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

    r314f3a3c r86a34d3e  
    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 IA64_IOSPACE_ADDRESS  0xE001000000000000ULL
     45
    4446#define IO_SPACE_BOUNDARY       ((void *) (64 * 1024))
    4547
    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        
    5448NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v)
    5549{
    56         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    57                 *((ioport8_t *) p2a(port)) = v;
    58         else
     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 {
    5956                *port = v;
    60        
    61         asm volatile (
    62                 "mf\n"
    63                 "mf.a\n"
     57        }
     58       
     59        asm volatile (
     60                "mf\n"
    6461                ::: "memory"
    6562        );
     
    6865NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
    6966{
    70         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    71                 *((ioport16_t *) p2a(port)) = v;
    72         else
     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 {
    7373                *port = v;
    74        
    75         asm volatile (
    76                 "mf\n"
    77                 "mf.a\n"
     74        }
     75       
     76        asm volatile (
     77                "mf\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                 *((ioport32_t *) p2a(port)) = v;
    86         else
     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 {
    8790                *port = v;
    88        
    89         asm volatile (
    90                 "mf\n"
    91                 "mf.a\n"
     91        }
     92       
     93        asm volatile (
     94                "mf\n"
    9295                ::: "memory"
    9396        );
     
    103106        );
    104107
    105         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    106                 v = *((ioport8_t *) p2a(port));
    107         else
     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 {
    108114                v = *port;
    109 
    110         asm volatile (
    111                 "mf.a\n"
    112                 ::: "memory"
    113         );
     115        }
    114116       
    115117        return v;
     
    125127        );
    126128
    127         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    128                 v = *((ioport16_t *) p2a(port));
    129         else
     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 {
    130135                v = *port;
    131 
    132         asm volatile (
    133                 "mf.a\n"
    134                 ::: "memory"
    135         );
     136        }
    136137       
    137138        return v;
     
    147148        );
    148149       
    149         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    150                 v = *((ioport32_t *) p2a(port));
    151         else
     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 {
    152156                v = *port;
    153 
    154         asm volatile (
    155                 "mf.a\n"
    156                 ::: "memory"
    157         );
     157        }
    158158
    159159        return v;
Note: See TracChangeset for help on using the changeset viewer.