Ignore:
File:
1 edited

Legend:

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

    r22f0561 rd8db519  
    3939#include <typedefs.h>
    4040#include <arch/register.h>
    41 #include <arch/legacyio.h>
    4241#include <trace.h>
    4342
     43#define IA64_IOSPACE_ADDRESS  0xE001000000000000ULL
     44
    4445#define IO_SPACE_BOUNDARY       ((void *) (64 * 1024))
    4546
    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        
    5447NO_TRACE static inline void pio_write_8(ioport8_t *port, uint8_t v)
    5548{
    56         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    57                 *((ioport8_t *) p2a(port)) = v;
    58         else
     49        if (port < (ioport8_t *) IO_SPACE_BOUNDARY) {
     50                uintptr_t prt = (uintptr_t) port;
     51       
     52                *((ioport8_t *) (IA64_IOSPACE_ADDRESS +
     53                    ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     54        } else {
    5955                *port = v;
     56        }
    6057       
    6158        asm volatile (
     
    6764NO_TRACE static inline void pio_write_16(ioport16_t *port, uint16_t v)
    6865{
    69         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    70                 *((ioport16_t *) p2a(port)) = v;
    71         else
     66        if (port < (ioport16_t *) IO_SPACE_BOUNDARY) {
     67                uintptr_t prt = (uintptr_t) port;
     68       
     69                *((ioport16_t *) (IA64_IOSPACE_ADDRESS +
     70                    ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     71        } else {
    7272                *port = v;
     73        }
    7374       
    7475        asm volatile (
     
    8081NO_TRACE static inline void pio_write_32(ioport32_t *port, uint32_t v)
    8182{
    82         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    83                 *((ioport32_t *) p2a(port)) = v;
    84         else
     83        if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
     84                uintptr_t prt = (uintptr_t) port;
     85       
     86                *((ioport32_t *) (IA64_IOSPACE_ADDRESS +
     87                    ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
     88        } else {
    8589                *port = v;
     90        }
    8691       
    8792        asm volatile (
     
    100105        );
    101106
    102         if (port < (ioport8_t *) IO_SPACE_BOUNDARY)
    103                 v = *((ioport8_t *) p2a(port));
    104         else
     107        if (port < (ioport8_t *) IO_SPACE_BOUNDARY) {
     108                uintptr_t prt = (uintptr_t) port;
     109
     110                v = *((ioport8_t *) (IA64_IOSPACE_ADDRESS +
     111                    ((prt & 0xfff) | ((prt >> 2) << 12))));
     112        } else {
    105113                v = *port;
     114        }
    106115       
    107116        return v;
     
    117126        );
    118127
    119         if (port < (ioport16_t *) IO_SPACE_BOUNDARY)
    120                 v = *((ioport16_t *) p2a(port));
    121         else
     128        if (port < (ioport16_t *) IO_SPACE_BOUNDARY) {
     129                uintptr_t prt = (uintptr_t) port;
     130
     131                v = *((ioport16_t *) (IA64_IOSPACE_ADDRESS +
     132                    ((prt & 0xfff) | ((prt >> 2) << 12))));
     133        } else {
    122134                v = *port;
     135        }
    123136       
    124137        return v;
     
    134147        );
    135148       
    136         if (port < (ioport32_t *) IO_SPACE_BOUNDARY)
    137                 v = *((ioport32_t *) p2a(port));
    138         else
     149        if (port < (ioport32_t *) IO_SPACE_BOUNDARY) {
     150                uintptr_t prt = (uintptr_t) port;
     151               
     152                v = *((ioport32_t *) (IA64_IOSPACE_ADDRESS +
     153                    ((prt & 0xfff) | ((prt >> 2) << 12))));
     154        } else {
    139155                v = *port;
     156        }
    140157
    141158        return v;
Note: See TracChangeset for help on using the changeset viewer.