1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * IBM ASM Service Processor Device Driver
4 *
5 * Copyright (C) IBM Corporation, 2004
6 *
7 * Author: Max Asb��ck <amax@us.ibm.com>
8 */
9
10#ifndef __DOT_COMMAND_H__
11#define __DOT_COMMAND_H__
12
13/*
14 * dot commands are the protocol used to communicate with the service
15 * processor.
16 * They consist of header, a command of variable length and data of
17 * variable length.
18 */
19
20/* dot command types */
21#define sp_write		0
22#define sp_write_next		1
23#define sp_read			2
24#define sp_read_next		3
25#define sp_command_response	4
26#define sp_event		5
27#define sp_heartbeat		6
28
29#pragma pack(1)
30struct dot_command_header {
31	u8	type;
32	u8	command_size;
33	u16	data_size;
34	u8	status;
35	u8	reserved;
36};
37#pragma pack()
38
39static inline size_t get_dot_command_size(void *buffer)
40{
41	struct dot_command_header *cmd = (struct dot_command_header *)buffer;
42	return sizeof(struct dot_command_header) + cmd->command_size + cmd->data_size;
43}
44
45static inline unsigned int get_dot_command_timeout(void *buffer)
46{
47	struct dot_command_header *header = (struct dot_command_header *)buffer;
48	unsigned char *cmd = buffer + sizeof(struct dot_command_header);
49
50	/* dot commands 6.3.1, 7.1 and 8.x need a longer timeout */
51
52	if (header->command_size == 3) {
53		if ((cmd[0] == 6) && (cmd[1] == 3) && (cmd[2] == 1))
54			return IBMASM_CMD_TIMEOUT_EXTRA;
55	} else if (header->command_size == 2) {
56		if ((cmd[0] == 7) && (cmd[1] == 1))
57			return IBMASM_CMD_TIMEOUT_EXTRA;
58		if (cmd[0] == 8)
59			return IBMASM_CMD_TIMEOUT_EXTRA;
60	}
61	return IBMASM_CMD_TIMEOUT_NORMAL;
62}
63
64#endif /* __DOT_COMMAND_H__ */
65