summaryrefslogtreecommitdiff
path: root/arch/x86/include/asm/arch-quark/msg_port.h
blob: 9527fdad3fd42ee0e5e7563a61dfa947333901f0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
 */

#ifndef _QUARK_MSG_PORT_H_
#define _QUARK_MSG_PORT_H_

/*
 * In the Quark SoC, some chipset commands are accomplished by utilizing
 * the internal message network within the host bridge (D0:F0). Accesses
 * to this network are accomplished by populating the message control
 * register (MCR), Message Control Register eXtension (MCRX) and the
 * message data register (MDR).
 */
#define MSG_CTRL_REG		0xd0	/* Message Control Register */
#define MSG_DATA_REG		0xd4	/* Message Data Register */
#define MSG_CTRL_EXT_REG	0xd8	/* Message Control Register EXT */

/* Normal Read/Write OpCodes */
#define MSG_OP_READ		0x10
#define MSG_OP_WRITE		0x11

/* Alternative Read/Write OpCodes */
#define MSG_OP_ALT_READ		0x06
#define MSG_OP_ALT_WRITE	0x07

/* IO Read/Write OpCodes */
#define MSG_OP_IO_READ		0x02
#define MSG_OP_IO_WRITE		0x03

/* All byte enables */
#define MSG_BYTE_ENABLE		0xf0

#ifndef __ASSEMBLY__

/**
 * msg_port_setup - set up the message port control register
 *
 * @op:     message bus access opcode
 * @port:   port number on the message bus
 * @reg:    register number within a port
 */
void msg_port_setup(int op, int port, int reg);

/**
 * msg_port_read - read a message port register using normal opcode
 *
 * @port:   port number on the message bus
 * @reg:    register number within a port
 *
 * @return: message port register value
 */
u32 msg_port_read(u8 port, u32 reg);

/**
 * msg_port_write - write a message port register using normal opcode
 *
 * @port:   port number on the message bus
 * @reg:    register number within a port
 * @value:  register value to write
 */
void msg_port_write(u8 port, u32 reg, u32 value);

/**
 * msg_port_alt_read - read a message port register using alternative opcode
 *
 * @port:   port number on the message bus
 * @reg:    register number within a port
 *
 * @return: message port register value
 */
u32 msg_port_alt_read(u8 port, u32 reg);

/**
 * msg_port_alt_write - write a message port register using alternative opcode
 *
 * @port:   port number on the message bus
 * @reg:    register number within a port
 * @value:  register value to write
 */
void msg_port_alt_write(u8 port, u32 reg, u32 value);

/**
 * msg_port_io_read - read a message port register using I/O opcode
 *
 * @port:   port number on the message bus
 * @reg:    register number within a port
 *
 * @return: message port register value
 */
u32 msg_port_io_read(u8 port, u32 reg);

/**
 * msg_port_io_write - write a message port register using I/O opcode
 *
 * @port:   port number on the message bus
 * @reg:    register number within a port
 * @value:  register value to write
 */
void msg_port_io_write(u8 port, u32 reg, u32 value);

/* clrbits, setbits, clrsetbits macros for message port access */

#define msg_port_normal_read	msg_port_read
#define msg_port_normal_write	msg_port_write

#define msg_port_generic_clrsetbits(type, port, reg, clr, set)		\
	msg_port_##type##_write(port, reg,				\
				(msg_port_##type##_read(port, reg)	\
				& ~(clr)) | (set))

#define msg_port_clrbits(port, reg, clr)		\
	msg_port_generic_clrsetbits(normal, port, reg, clr, 0)
#define msg_port_setbits(port, reg, set)		\
	msg_port_generic_clrsetbits(normal, port, reg, 0, set)
#define msg_port_clrsetbits(port, reg, clr, set)	\
	msg_port_generic_clrsetbits(normal, port, reg, clr, set)

#define msg_port_alt_clrbits(port, reg, clr)		\
	msg_port_generic_clrsetbits(alt, port, reg, clr, 0)
#define msg_port_alt_setbits(port, reg, set)		\
	msg_port_generic_clrsetbits(alt, port, reg, 0, set)
#define msg_port_alt_clrsetbits(port, reg, clr, set)	\
	msg_port_generic_clrsetbits(alt, port, reg, clr, set)

#define msg_port_io_clrbits(port, reg, clr)		\
	msg_port_generic_clrsetbits(io, port, reg, clr, 0)
#define msg_port_io_setbits(port, reg, set)		\
	msg_port_generic_clrsetbits(io, port, reg, 0, set)
#define msg_port_io_clrsetbits(port, reg, clr, set)	\
	msg_port_generic_clrsetbits(io, port, reg, clr, set)

#endif /* __ASSEMBLY__ */

#endif /* _QUARK_MSG_PORT_H_ */