1ff6f83cb6fd18e7abb7ba22701a2d554ec84133
[linux-2.6-microblaze.git] / drivers / hid / amd-sfh-hid / amd_sfh_pcie.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * AMD MP2 PCIe communication driver
4  * Copyright 2020 Advanced Micro Devices, Inc.
5  * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
6  *          Sandeep Singh <Sandeep.singh@amd.com>
7  */
8
9 #ifndef PCIE_MP2_AMD_H
10 #define PCIE_MP2_AMD_H
11
12 #include <linux/pci.h>
13 #include "amd_sfh_hid.h"
14
15 #define PCI_DEVICE_ID_AMD_MP2   0x15E4
16
17 #define ENABLE_SENSOR           1
18 #define DISABLE_SENSOR          2
19 #define STOP_ALL_SENSORS        8
20
21 /* MP2 C2P Message Registers */
22 #define AMD_C2P_MSG0    0x10500
23 #define AMD_C2P_MSG1    0x10504
24 #define AMD_C2P_MSG2    0x10508
25
26 #define AMD_C2P_MSG(regno) (0x10500 + ((regno) * 4))
27 #define AMD_P2C_MSG(regno) (0x10680 + ((regno) * 4))
28
29 /* MP2 P2C Message Registers */
30 #define AMD_P2C_MSG3    0x1068C /* Supported Sensors info */
31
32 #define V2_STATUS       0x2
33
34 #define SENSOR_ENABLED     4
35 #define SENSOR_DISABLED    5
36
37 #define HPD_IDX         16
38
39 #define AMD_SFH_IDLE_LOOP       200
40
41 /* SFH Command register */
42 union sfh_cmd_base {
43         u32 ul;
44         struct {
45                 u32 cmd_id : 8;
46                 u32 sensor_id : 8;
47                 u32 period : 16;
48         } s;
49         struct {
50                 u32 cmd_id : 4;
51                 u32 intr_enable : 1;
52                 u32 rsvd1 : 3;
53                 u32 length : 7;
54                 u32 mem_type : 1;
55                 u32 sensor_id : 8;
56                 u32 period : 8;
57         } cmd_v2;
58 };
59
60 union cmd_response {
61         u32 resp;
62         struct {
63                 u32 status      : 2;
64                 u32 out_in_c2p  : 1;
65                 u32 rsvd1       : 1;
66                 u32 response    : 4;
67                 u32 sub_cmd     : 8;
68                 u32 sensor_id   : 6;
69                 u32 rsvd2       : 10;
70         } response_v2;
71 };
72
73 union sfh_cmd_param {
74         u32 ul;
75         struct {
76                 u32 buf_layout : 2;
77                 u32 buf_length : 6;
78                 u32 rsvd : 24;
79         } s;
80 };
81
82 struct sfh_cmd_reg {
83         union sfh_cmd_base cmd_base;
84         union sfh_cmd_param cmd_param;
85         phys_addr_t phys_addr;
86 };
87
88 enum sensor_idx {
89         accel_idx = 0,
90         gyro_idx = 1,
91         mag_idx = 2,
92         als_idx = 19
93 };
94
95 struct amd_mp2_dev {
96         struct pci_dev *pdev;
97         struct amdtp_cl_data *cl_data;
98         void __iomem *mmio;
99         const struct amd_mp2_ops *mp2_ops;
100         struct amd_input_data in_data;
101         /* mp2 active control status */
102         u32 mp2_acs;
103 };
104
105 struct amd_mp2_sensor_info {
106         u8 sensor_idx;
107         u32 period;
108         dma_addr_t dma_address;
109 };
110
111 enum mem_use_type {
112         USE_DRAM,
113         USE_C2P_REG,
114 };
115
116 struct hpd_status {
117         union {
118                 struct {
119                         u32 human_presence_report : 4;
120                         u32 human_presence_actual : 4;
121                         u32 probablity            : 8;
122                         u32 object_distance       : 16;
123                 } shpd;
124                 u32 val;
125         };
126 };
127
128 void amd_start_sensor(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info);
129 void amd_stop_sensor(struct amd_mp2_dev *privdata, u16 sensor_idx);
130 void amd_stop_all_sensors(struct amd_mp2_dev *privdata);
131 int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id);
132 int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata);
133 int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata);
134 u32 amd_sfh_wait_for_response(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
135 void amd_mp2_suspend(struct amd_mp2_dev *mp2);
136 void amd_mp2_resume(struct amd_mp2_dev *mp2);
137
138 struct amd_mp2_ops {
139          void (*start)(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info);
140          void (*stop)(struct amd_mp2_dev *privdata, u16 sensor_idx);
141          void (*stop_all)(struct amd_mp2_dev *privdata);
142          int (*response)(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
143 };
144 #endif