/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
/*
 * Copyright (C) 2021-2024 Advanced Micro Devices, Inc.
 */
#ifndef _AMD_APML_H_
#define _AMD_APML_H_

#include <linux/types.h>

/* Mailbox data size for data_in and data_out */
#define AMD_SBI_MB_DATA_SIZE		4

struct apml_mbox_msg {
	/*
	 * Mailbox Message ID
	 */
	__u32 cmd;
	/*
	 * [0]...[3] mailbox 32bit input/output data
	 */
	__u32 mb_in_out;
	/*
	 * Error code is returned in case of soft mailbox error
	 */
	__u32 fw_ret_code;
};

struct apml_cpuid_msg {
	/*
	 * CPUID input
	 * [0]...[3] cpuid func,
	 * [4][5] cpuid: thread
	 * [6] cpuid: ext function & read eax/ebx or ecx/edx
	 *	[7:0] -> bits [7:4] -> ext function &
	 *	bit [0] read eax/ebx or ecx/edx
	 * CPUID output
	 */
	__u64 cpu_in_out;
	/*
	 * Status code for CPUID read
	 */
	__u32 fw_ret_code;
	__u32 pad;
};

struct apml_mcamsr_msg {
	/*
	 * MCAMSR input
	 * [0]...[3] mca msr func,
	 * [4][5] thread
	 * MCAMSR output
	 */
	__u64 mcamsr_in_out;
	/*
	 * Status code for MCA/MSR access
	 */
	__u32 fw_ret_code;
	__u32 pad;
};

struct apml_reg_xfer_msg {
	/*
	 * RMI register address offset
	 */
	__u16 reg_addr;
	/*
	 * Register data for read/write
	 */
	__u8 data_in_out;
	/*
	 * Register read or write
	 */
	__u8 rflag;
};

struct apml_tsi_xfer_msg {
	__u8 reg_addr;		/* TSI register address offset */
	__u8 data_in_out;	/* Register data for read/write */
	__u8 rflag;		/* Register read or write */
	__u8 pad;		/* Explicit padding */
};

/*
 * AMD sideband interface base IOCTL
 */
#define SB_BASE_IOCTL_NR	0xF9

/**
 * DOC: SBRMI_IOCTL_MBOX_CMD
 *
 * @Parameters
 *
 * @struct apml_mbox_msg
 *	Pointer to the &struct apml_mbox_msg that will contain the protocol
 *	information
 *
 * @Description
 * IOCTL command for APML messages using generic _IOWR
 * The IOCTL provides userspace access to AMD sideband mailbox protocol
 * - Mailbox message read/write(0x0~0xFF)
 * - returning "-EFAULT" if none of the above
 * "-EPROTOTYPE" error is returned to provide additional error details
 */
#define SBRMI_IOCTL_MBOX_CMD		_IOWR(SB_BASE_IOCTL_NR, 0, struct apml_mbox_msg)

/**
 * DOC: SBRMI_IOCTL_CPUID_CMD
 *
 * @Parameters
 *
 * @struct apml_cpuid_msg
 *	Pointer to the &struct apml_cpuid_msg that will contain the protocol
 *	information
 *
 * @Description
 * IOCTL command for APML messages using generic _IOWR
 * The IOCTL provides userspace access to AMD sideband cpuid protocol
 * - CPUID protocol to get CPU details for Function/Ext Function
 * at thread level
 * - returning "-EFAULT" if none of the above
 * "-EPROTOTYPE" error is returned to provide additional error details
 */
#define SBRMI_IOCTL_CPUID_CMD		_IOWR(SB_BASE_IOCTL_NR, 1, struct apml_cpuid_msg)

/**
 * DOC: SBRMI_IOCTL_MCAMSR_CMD
 *
 * @Parameters
 *
 * @struct apml_mcamsr_msg
 *	Pointer to the &struct apml_mcamsr_msg that will contain the protocol
 *	information
 *
 * @Description
 * IOCTL command for APML messages using generic _IOWR
 * The IOCTL provides userspace access to AMD sideband MCAMSR protocol
 * - MCAMSR protocol to get MCA bank details for Function at thread level
 * - returning "-EFAULT" if none of the above
 * "-EPROTOTYPE" error is returned to provide additional error details
 */
#define SBRMI_IOCTL_MCAMSR_CMD		_IOWR(SB_BASE_IOCTL_NR, 2, struct apml_mcamsr_msg)

/**
 * DOC: SBRMI_IOCTL_REG_XFER_CMD
 *
 * @Parameters
 *
 * @struct apml_reg_xfer_msg
 *	Pointer to the &struct apml_reg_xfer_msg that will contain the protocol
 *	information
 *
 * @Description
 * IOCTL command for APML messages using generic _IOWR
 * The IOCTL provides userspace access to AMD sideband register xfer protocol
 * - Register xfer protocol to get/set hardware register for given offset
 */
#define SBRMI_IOCTL_REG_XFER_CMD	_IOWR(SB_BASE_IOCTL_NR, 3, struct apml_reg_xfer_msg)

/**
 * DOC: SBTSI_IOCTL_REG_XFER_CMD
 *
 * @Parameters
 *
 * @struct apml_tsi_xfer_msg
 *	Pointer to the &struct apml_tsi_xfer_msg that will contain the protocol
 *	information
 *
 * @Description
 * IOCTL command for APML TSI messages using generic _IOWR
 * The IOCTL provides userspace access to AMD sideband TSI register xfer protocol
 * - TSI protocol to read/write temperature sensor registers
 */
#define SBTSI_IOCTL_REG_XFER_CMD	_IOWR(SB_BASE_IOCTL_NR, 4, struct apml_tsi_xfer_msg)

#endif /*_AMD_APML_H_*/
