Subversion Repositories HelenOS

Rev

Rev 3675 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3675 Rev 4377
Line 1... Line 1...
1
/*
1
/*
2
 * Copyright (c) 2005 Jakub Jermar, Jakub Vana
2
 * Copyright (c) 2005 Jakub Vana
3
 * All rights reserved.
3
 * All rights reserved.
4
 *
4
 *
5
 * Redistribution and use in source and binary forms, with or without
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
6
 * modification, are permitted provided that the following conditions
7
 * are met:
7
 * are met:
Line 24... Line 24...
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
/** @addtogroup ia64   
29
/** @addtogroup libcia64   
30
 * @{
30
 * @{
31
 */
31
 */
32
/** @file
32
/** @file
33
 */
33
 */
34
 
34
 
35
#ifndef LIBC_ia64_DDI_H_
35
#ifndef LIBC_ia64_DDI_H_
36
#define LIBC_ia64_DDI_H_
36
#define LIBC_ia64_DDI_H_
37
 
37
 
-
 
38
#include <sys/types.h>
38
#include <libarch/types.h>
39
#include <libarch/types.h>
39
 
40
 
40
typedef uint64_t ioport_t;
41
#define IO_SPACE_BOUNDARY   (64 * 1024)
41
 
42
 
42
uint64_t get_ia64_iospace_address(void);
43
uint64_t get_ia64_iospace_address(void);
43
 
44
 
44
extern uint64_t ia64_iospace_address;
45
extern uint64_t ia64_iospace_address;
45
 
46
 
-
 
47
#define IA64_IOSPACE_ADDRESS \
-
 
48
    (ia64_iospace_address ? \
-
 
49
        ia64_iospace_address : \
46
#define IA64_IOSPACE_ADDRESS (ia64_iospace_address?ia64_iospace_address:(ia64_iospace_address=get_ia64_iospace_address()))
50
        (ia64_iospace_address = get_ia64_iospace_address()))
47
 
51
 
48
static inline void  outb(ioport_t port,uint8_t v)
52
static inline void pio_write_8(ioport8_t *port, uint8_t v)
49
{
53
{
-
 
54
    uintptr_t prt = (uintptr_t) port;
-
 
55
 
-
 
56
    *((ioport8_t *)(IA64_IOSPACE_ADDRESS +
50
    *((uint8_t *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 )))) = v;
57
        ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
51
 
58
 
52
    asm volatile ("mf\n" ::: "memory");
59
    asm volatile ("mf\n" ::: "memory");
53
}
60
}
54
 
61
 
55
static inline void  outw(ioport_t port,uint16_t v)
62
static inline void pio_write_16(ioport16_t *port, uint16_t v)
56
{
63
{
-
 
64
    uintptr_t prt = (uintptr_t) port;
-
 
65
 
-
 
66
    *((ioport16_t *)(IA64_IOSPACE_ADDRESS +
57
    *((uint16_t *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 )))) = v;
67
        ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
58
 
68
 
59
    asm volatile ("mf\n" ::: "memory");
69
    asm volatile ("mf\n" ::: "memory");
60
}
70
}
61
 
71
 
62
static inline void  outl(ioport_t port,uint32_t v)
72
static inline void pio_write_32(ioport32_t *port, uint32_t v)
63
{
73
{
-
 
74
    uintptr_t prt = (uintptr_t) port;
-
 
75
 
-
 
76
    *((ioport32_t *)(IA64_IOSPACE_ADDRESS +
64
    *((uint32_t *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 )))) = v;
77
        ((prt & 0xfff) | ((prt >> 2) << 12)))) = v;
65
 
78
 
66
    asm volatile ("mf\n" ::: "memory");
79
    asm volatile ("mf\n" ::: "memory");
67
}
80
}
68
 
81
 
69
 
-
 
70
 
-
 
71
static inline uint8_t inb(ioport_t port)
82
static inline uint8_t pio_read_8(ioport8_t *port)
72
{
83
{
-
 
84
    uintptr_t prt = (uintptr_t) port;
-
 
85
 
73
    asm volatile ("mf\n" ::: "memory");
86
    asm volatile ("mf\n" ::: "memory");
74
 
87
 
-
 
88
    return *((ioport8_t *)(IA64_IOSPACE_ADDRESS +
75
    return *((uint8_t *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 ))));
89
        ((prt & 0xfff) | ((prt >> 2) << 12))));
76
}
90
}
77
 
91
 
78
static inline uint16_t inw(ioport_t port)
92
static inline uint16_t pio_read_16(ioport16_t *port)
79
{
93
{
-
 
94
    uintptr_t prt = (uintptr_t) port;
-
 
95
 
80
    asm volatile ("mf\n" ::: "memory");
96
    asm volatile ("mf\n" ::: "memory");
81
 
97
 
-
 
98
    return *((ioport16_t *)(IA64_IOSPACE_ADDRESS +
82
    return *((uint16_t *)(IA64_IOSPACE_ADDRESS + ( (port & 0xffE) | ( (port >> 2) << 12 ))));
99
        ((prt & 0xfff) | ((prt >> 2) << 12))));
83
}
100
}
84
 
101
 
85
static inline uint32_t inl(ioport_t port)
102
static inline uint32_t pio_read_32(ioport32_t *port)
86
{
103
{
-
 
104
    uintptr_t prt = (uintptr_t) port;
-
 
105
 
87
    asm volatile ("mf\n" ::: "memory");
106
    asm volatile ("mf\n" ::: "memory");
88
 
107
 
-
 
108
    return *((ioport32_t *)(IA64_IOSPACE_ADDRESS +
89
    return *((uint32_t *)(IA64_IOSPACE_ADDRESS + ( (port & 0xfff) | ( (port >> 2) << 12 ))));
109
        ((prt & 0xfff) | ((prt >> 2) << 12))));
90
}
110
}
91
 
111
 
92
 
-
 
93
 
-
 
94
 
-
 
95
#endif
112
#endif
96
 
113
 
97
/** @}
114
/** @}
98
 */
115
 */