Ignore:
File:
1 edited

Legend:

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

    r22f0561 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;
     57        }
    6058       
    6159        asm volatile (
     
    6765NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
    6866{
    69         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    70                 *((ioport16_t *) p2a(port)) = v;
    71         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 {
    7273                *port = v;
     74        }
    7375       
    7476        asm volatile (
     
    8082NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v)
    8183{
    82         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    83                 *((ioport32_t *) p2a(port)) = v;
    84         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 {
    8590                *port = v;
     91        }
    8692       
    8793        asm volatile (
     
    100106        );
    101107
    102         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    103                 v = *((ioport8_t *) p2a(port));
    104         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 {
    105114                v = *port;
     115        }
    106116       
    107117        return v;
     
    117127        );
    118128
    119         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    120                 v = *((ioport16_t *) p2a(port));
    121         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 {
    122135                v = *port;
     136        }
    123137       
    124138        return v;
     
    134148        );
    135149       
    136         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    137                 v = *((ioport32_t *) p2a(port));
    138         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 {
    139156                v = *port;
     157        }
    140158
    141159        return v;
Note: See TracChangeset for help on using the changeset viewer.