162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * AMD MP2 PCIe communication driver
462306a36Sopenharmony_ci * Copyright 2020-2021 Advanced Micro Devices, Inc.
562306a36Sopenharmony_ci * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
662306a36Sopenharmony_ci *	    Sandeep Singh <Sandeep.singh@amd.com>
762306a36Sopenharmony_ci *	    Basavaraj Natikar <Basavaraj.Natikar@amd.com>
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef PCIE_MP2_AMD_H
1162306a36Sopenharmony_ci#define PCIE_MP2_AMD_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "amd_sfh_common.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* MP2 C2P Message Registers */
1662306a36Sopenharmony_ci#define AMD_C2P_MSG0	0x10500
1762306a36Sopenharmony_ci#define AMD_C2P_MSG1	0x10504
1862306a36Sopenharmony_ci#define AMD_C2P_MSG2	0x10508
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* MP2 P2C Message Registers */
2162306a36Sopenharmony_ci#define AMD_P2C_MSG3	0x1068C /* Supported Sensors info */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define V2_STATUS	0x2
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define HPD_IDX		16
2662306a36Sopenharmony_ci#define ACS_IDX		22
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define SENSOR_DISCOVERY_STATUS_MASK		GENMASK(5, 3)
2962306a36Sopenharmony_ci#define SENSOR_DISCOVERY_STATUS_SHIFT		3
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci/* SFH Command register */
3262306a36Sopenharmony_ciunion sfh_cmd_base {
3362306a36Sopenharmony_ci	u32 ul;
3462306a36Sopenharmony_ci	struct {
3562306a36Sopenharmony_ci		u32 cmd_id : 8;
3662306a36Sopenharmony_ci		u32 sensor_id : 8;
3762306a36Sopenharmony_ci		u32 period : 16;
3862306a36Sopenharmony_ci	} s;
3962306a36Sopenharmony_ci	struct {
4062306a36Sopenharmony_ci		u32 cmd_id : 4;
4162306a36Sopenharmony_ci		u32 intr_disable : 1;
4262306a36Sopenharmony_ci		u32 rsvd1 : 3;
4362306a36Sopenharmony_ci		u32 length : 7;
4462306a36Sopenharmony_ci		u32 mem_type : 1;
4562306a36Sopenharmony_ci		u32 sensor_id : 8;
4662306a36Sopenharmony_ci		u32 period : 8;
4762306a36Sopenharmony_ci	} cmd_v2;
4862306a36Sopenharmony_ci};
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ciunion cmd_response {
5162306a36Sopenharmony_ci	u32 resp;
5262306a36Sopenharmony_ci	struct {
5362306a36Sopenharmony_ci		u32 status	: 2;
5462306a36Sopenharmony_ci		u32 out_in_c2p	: 1;
5562306a36Sopenharmony_ci		u32 rsvd1	: 1;
5662306a36Sopenharmony_ci		u32 response	: 4;
5762306a36Sopenharmony_ci		u32 sub_cmd	: 8;
5862306a36Sopenharmony_ci		u32 sensor_id	: 6;
5962306a36Sopenharmony_ci		u32 rsvd2	: 10;
6062306a36Sopenharmony_ci	} response_v2;
6162306a36Sopenharmony_ci};
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciunion sfh_cmd_param {
6462306a36Sopenharmony_ci	u32 ul;
6562306a36Sopenharmony_ci	struct {
6662306a36Sopenharmony_ci		u32 buf_layout : 2;
6762306a36Sopenharmony_ci		u32 buf_length : 6;
6862306a36Sopenharmony_ci		u32 rsvd : 24;
6962306a36Sopenharmony_ci	} s;
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct sfh_cmd_reg {
7362306a36Sopenharmony_ci	union sfh_cmd_base cmd_base;
7462306a36Sopenharmony_ci	union sfh_cmd_param cmd_param;
7562306a36Sopenharmony_ci	phys_addr_t phys_addr;
7662306a36Sopenharmony_ci};
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_cienum sensor_idx {
7962306a36Sopenharmony_ci	accel_idx = 0,
8062306a36Sopenharmony_ci	gyro_idx = 1,
8162306a36Sopenharmony_ci	mag_idx = 2,
8262306a36Sopenharmony_ci	als_idx = 19
8362306a36Sopenharmony_ci};
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cienum mem_use_type {
8662306a36Sopenharmony_ci	USE_DRAM,
8762306a36Sopenharmony_ci	USE_C2P_REG,
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistruct hpd_status {
9162306a36Sopenharmony_ci	union {
9262306a36Sopenharmony_ci		struct {
9362306a36Sopenharmony_ci			u32 object_distance       : 16;
9462306a36Sopenharmony_ci			u32 probablity		  : 8;
9562306a36Sopenharmony_ci			u32 human_presence_actual : 4;
9662306a36Sopenharmony_ci			u32 human_presence_report : 4;
9762306a36Sopenharmony_ci		} shpd;
9862306a36Sopenharmony_ci		u32 val;
9962306a36Sopenharmony_ci	};
10062306a36Sopenharmony_ci};
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciint amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id);
10362306a36Sopenharmony_ciint amd_sfh_hid_client_init(struct amd_mp2_dev *privdata);
10462306a36Sopenharmony_ciint amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata);
10562306a36Sopenharmony_civoid amd_sfh_set_desc_ops(struct amd_mp2_ops *mp2_ops);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci#endif
108