18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * IBM ASM Service Processor Device Driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) IBM Corporation, 2004
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Max Asböck <amax@us.ibm.com>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef __DOT_COMMAND_H__
118c2ecf20Sopenharmony_ci#define __DOT_COMMAND_H__
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci/*
148c2ecf20Sopenharmony_ci * dot commands are the protocol used to communicate with the service
158c2ecf20Sopenharmony_ci * processor.
168c2ecf20Sopenharmony_ci * They consist of header, a command of variable length and data of
178c2ecf20Sopenharmony_ci * variable length.
188c2ecf20Sopenharmony_ci */
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/* dot command types */
218c2ecf20Sopenharmony_ci#define sp_write		0
228c2ecf20Sopenharmony_ci#define sp_write_next		1
238c2ecf20Sopenharmony_ci#define sp_read			2
248c2ecf20Sopenharmony_ci#define sp_read_next		3
258c2ecf20Sopenharmony_ci#define sp_command_response	4
268c2ecf20Sopenharmony_ci#define sp_event		5
278c2ecf20Sopenharmony_ci#define sp_heartbeat		6
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci#pragma pack(1)
308c2ecf20Sopenharmony_cistruct dot_command_header {
318c2ecf20Sopenharmony_ci	u8	type;
328c2ecf20Sopenharmony_ci	u8	command_size;
338c2ecf20Sopenharmony_ci	u16	data_size;
348c2ecf20Sopenharmony_ci	u8	status;
358c2ecf20Sopenharmony_ci	u8	reserved;
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci#pragma pack()
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic inline size_t get_dot_command_size(void *buffer)
408c2ecf20Sopenharmony_ci{
418c2ecf20Sopenharmony_ci	struct dot_command_header *cmd = (struct dot_command_header *)buffer;
428c2ecf20Sopenharmony_ci	return sizeof(struct dot_command_header) + cmd->command_size + cmd->data_size;
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic inline unsigned int get_dot_command_timeout(void *buffer)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	struct dot_command_header *header = (struct dot_command_header *)buffer;
488c2ecf20Sopenharmony_ci	unsigned char *cmd = buffer + sizeof(struct dot_command_header);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci	/* dot commands 6.3.1, 7.1 and 8.x need a longer timeout */
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	if (header->command_size == 3) {
538c2ecf20Sopenharmony_ci		if ((cmd[0] == 6) && (cmd[1] == 3) && (cmd[2] == 1))
548c2ecf20Sopenharmony_ci			return IBMASM_CMD_TIMEOUT_EXTRA;
558c2ecf20Sopenharmony_ci	} else if (header->command_size == 2) {
568c2ecf20Sopenharmony_ci		if ((cmd[0] == 7) && (cmd[1] == 1))
578c2ecf20Sopenharmony_ci			return IBMASM_CMD_TIMEOUT_EXTRA;
588c2ecf20Sopenharmony_ci		if (cmd[0] == 8)
598c2ecf20Sopenharmony_ci			return IBMASM_CMD_TIMEOUT_EXTRA;
608c2ecf20Sopenharmony_ci	}
618c2ecf20Sopenharmony_ci	return IBMASM_CMD_TIMEOUT_NORMAL;
628c2ecf20Sopenharmony_ci}
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#endif /* __DOT_COMMAND_H__ */
65