1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * AMD MP2 1.1 communication interfaces
4 *
5 * Copyright (c) 2022, Advanced Micro Devices, Inc.
6 * All Rights Reserved.
7 *
8 * Author: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
9 */
10
11#ifndef AMD_SFH_INTERFACE_H
12#define AMD_SFH_INTERFACE_H
13
14#include "../amd_sfh_common.h"
15
16#define SENSOR_DATA_MEM_SIZE_DEFAULT		256
17#define TOTAL_STATIC_MEM_DEFAULT		1024
18#define OFFSET_SFH_INFO_BASE_DEFAULT		0
19#define OFFSET_SENSOR_DATA_DEFAULT		(OFFSET_SFH_INFO_BASE_DEFAULT + \
20							TOTAL_STATIC_MEM_DEFAULT)
21enum sensor_index {
22	ACCEL_IDX,
23	GYRO_IDX,
24	MAG_IDX,
25	ALS_IDX = 4,
26	HPD_IDX = 5,
27	MAX_IDX = 15,
28};
29
30struct sfh_cmd_base {
31	union {
32		u32 ul;
33		struct {
34			u32 sensor_id		: 4;
35			u32 cmd_id		: 4;
36			u32 sub_cmd_id		: 8;
37			u32 sub_cmd_value	: 12;
38			u32 rsvd		: 3;
39			u32 intr_disable	: 1;
40		} cmd;
41	};
42};
43
44struct sfh_cmd_response {
45	union {
46		u32 resp;
47		struct {
48			u32 response	: 8;
49			u32 sensor_id	: 4;
50			u32 cmd_id	: 4;
51			u32 sub_cmd	: 6;
52			u32 rsvd2	: 10;
53		} response;
54	};
55};
56
57struct sfh_platform_info {
58	union {
59		u32 pi;
60		struct {
61			u32 cust_id		: 16;
62			u32 plat_id		: 6;
63			u32 interface_id	: 4;
64			u32 rsvd		: 6;
65		} pinfo;
66	};
67};
68
69struct sfh_firmware_info {
70	union {
71		u32 fw_ver;
72		struct {
73			u32 minor_rev : 8;
74			u32 major_rev : 8;
75			u32 minor_ver : 8;
76			u32 major_ver : 8;
77		} fver;
78	};
79};
80
81struct sfh_sensor_list {
82	union {
83		u32 slist;
84		struct {
85			u32 sensors	: 16;
86			u32 rsvd	: 16;
87		} sl;
88	};
89};
90
91struct sfh_sensor_prop {
92	union {
93		u32 sprop;
94		struct {
95			u32 elist	: 16;
96			u32 feat	: 16;
97		} sf;
98	};
99};
100
101struct sfh_base_info {
102	union {
103		u32 sfh_base[24];
104		struct {
105			struct sfh_platform_info plat_info;
106			struct sfh_firmware_info  fw_info;
107			struct sfh_sensor_list s_list;
108			u32 rsvd;
109			struct sfh_sensor_prop s_prop[16];
110		} sbase;
111	};
112};
113
114struct sfh_common_data {
115	u64 timestamp;
116	u32 intr_cnt;
117	u32 featvalid		: 16;
118	u32 rsvd		: 13;
119	u32 sensor_state	: 3;
120};
121
122struct sfh_float32 {
123	u32 x;
124	u32 y;
125	u32 z;
126};
127
128struct sfh_accel_data {
129	struct sfh_common_data commondata;
130	struct sfh_float32 acceldata;
131	u32 accelstatus;
132};
133
134struct sfh_gyro_data {
135	struct sfh_common_data commondata;
136	struct sfh_float32 gyrodata;
137	u32 result;
138};
139
140struct sfh_mag_data {
141	struct sfh_common_data commondata;
142	struct sfh_float32 magdata;
143	u32 accuracy;
144};
145
146struct sfh_als_data {
147	struct sfh_common_data commondata;
148	u32 lux;
149	u32 light_color_temp;
150	u32 chromaticity_x;
151	u32 chromaticity_y;
152};
153
154struct hpd_status {
155	union {
156		struct {
157			u32 distance			: 16;
158			u32 probablity			: 8;
159			u32 presence			: 2;
160			u32 rsvd			: 5;
161			u32 state			: 1;
162		} shpd;
163		u32 val;
164	};
165};
166
167void sfh_interface_init(struct amd_mp2_dev *mp2);
168void sfh_deinit_emp2(void);
169void amd_sfh1_1_set_desc_ops(struct amd_mp2_ops *mp2_ops);
170int amd_sfh_float_to_int(u32 flt32_val);
171#endif
172