137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
/* 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_ */
 |