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 <[email protected]> 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) 21 enum sensor_index { 22 ACCEL_IDX, 23 GYRO_IDX, 24 MAG_IDX, 25 SRA_IDX, 26 ALS_IDX, 27 HPD_IDX, 28 MAX_IDX = 15, 29 }; 30 31 struct sfh_cmd_base { 32 union { 33 u32 ul; 34 struct { 35 u32 sensor_id : 4; 36 u32 cmd_id : 4; 37 u32 sub_cmd_id : 8; 38 u32 sub_cmd_value : 12; 39 u32 rsvd : 3; 40 u32 intr_disable : 1; 41 } cmd; 42 }; 43 }; 44 45 struct sfh_cmd_response { 46 union { 47 u32 resp; 48 struct { 49 u32 response : 8; 50 u32 sensor_id : 4; 51 u32 cmd_id : 4; 52 u32 sub_cmd : 6; 53 u32 rsvd2 : 10; 54 } response; 55 }; 56 }; 57 58 struct sfh_platform_info { 59 union { 60 u32 pi; 61 struct { 62 u32 cust_id : 16; 63 u32 plat_id : 6; 64 u32 interface_id : 4; 65 u32 rsvd : 6; 66 } pinfo; 67 }; 68 }; 69 70 struct sfh_firmware_info { 71 union { 72 u32 fw_ver; 73 struct { 74 u32 minor_rev : 8; 75 u32 major_rev : 8; 76 u32 minor_ver : 8; 77 u32 major_ver : 8; 78 } fver; 79 }; 80 }; 81 82 struct sfh_sensor_list { 83 union { 84 u32 slist; 85 struct { 86 u32 sensors : 16; 87 u32 rsvd : 16; 88 } sl; 89 }; 90 }; 91 92 struct sfh_sensor_prop { 93 union { 94 u32 sprop; 95 struct { 96 u32 elist : 16; 97 u32 feat : 16; 98 } sf; 99 }; 100 }; 101 102 struct sfh_base_info { 103 union { 104 u32 sfh_base[24]; 105 struct { 106 struct sfh_platform_info plat_info; 107 struct sfh_firmware_info fw_info; 108 struct sfh_sensor_list s_list; 109 u32 rsvd; 110 struct sfh_sensor_prop s_prop[16]; 111 } sbase; 112 }; 113 }; 114 115 struct sfh_common_data { 116 u64 timestamp; 117 u32 intr_cnt; 118 u32 featvalid : 16; 119 u32 rsvd : 13; 120 u32 sensor_state : 3; 121 }; 122 123 struct sfh_float32 { 124 u32 x; 125 u32 y; 126 u32 z; 127 }; 128 129 struct sfh_accel_data { 130 struct sfh_common_data commondata; 131 struct sfh_float32 acceldata; 132 u32 accelstatus; 133 }; 134 135 struct sfh_gyro_data { 136 struct sfh_common_data commondata; 137 struct sfh_float32 gyrodata; 138 u32 result; 139 }; 140 141 struct sfh_mag_data { 142 struct sfh_common_data commondata; 143 struct sfh_float32 magdata; 144 u32 accuracy; 145 }; 146 147 struct sfh_als_data { 148 struct sfh_common_data commondata; 149 u32 lux; 150 u32 light_color_temp; 151 u32 chromaticity_x; 152 u32 chromaticity_y; 153 }; 154 155 struct hpd_status { 156 union { 157 struct { 158 u32 distance : 16; 159 u32 probablity : 8; 160 u32 presence : 2; 161 u32 rsvd : 5; 162 u32 state : 1; 163 } shpd; 164 u32 val; 165 }; 166 }; 167 168 struct sfh_op_mode { 169 union { 170 u32 val; 171 struct { 172 u32 mode : 3; 173 u32 lidstatus : 1; 174 u32 angle : 10; 175 u32 inbagstatedbg : 2; 176 u32 ontablestate : 2; 177 u32 inbagstate : 2; 178 u32 outbagstate : 2; 179 u32 inbagmlcstate : 1; 180 u32 powerstate : 2; 181 u32 data : 3; 182 u32 devicemode : 4; 183 } op_mode; 184 }; 185 }; 186 187 void sfh_interface_init(struct amd_mp2_dev *mp2); 188 void sfh_deinit_emp2(void); 189 void amd_sfh1_1_set_desc_ops(struct amd_mp2_ops *mp2_ops); 190 int amd_sfh_float_to_int(u32 flt32_val); 191 #endif 192