blob: 8a9c544c27aefae5c15fde55d22227fe193c6640 [file] [log] [blame]
Sandeep Singh4f567b92020-10-10 01:31:36 +05301/* SPDX-License-Identifier: GPL-2.0-or-later */
2/*
3 * AMD MP2 PCIe communication driver
Basavaraj Natikarf75203c2021-09-23 17:59:30 +05304 * Copyright 2020-2021 Advanced Micro Devices, Inc.
Sandeep Singh4f567b92020-10-10 01:31:36 +05305 * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
6 * Sandeep Singh <Sandeep.singh@amd.com>
Basavaraj Natikarf75203c2021-09-23 17:59:30 +05307 * Basavaraj Natikar <Basavaraj.Natikar@amd.com>
Sandeep Singh4f567b92020-10-10 01:31:36 +05308 */
9
10#ifndef PCIE_MP2_AMD_H
11#define PCIE_MP2_AMD_H
12
13#include <linux/pci.h>
Basavaraj Natikar0aad9c92021-06-18 13:48:37 +053014#include "amd_sfh_hid.h"
Sandeep Singh4f567b92020-10-10 01:31:36 +053015
16#define PCI_DEVICE_ID_AMD_MP2 0x15E4
17
18#define ENABLE_SENSOR 1
19#define DISABLE_SENSOR 2
20#define STOP_ALL_SENSORS 8
21
22/* MP2 C2P Message Registers */
23#define AMD_C2P_MSG0 0x10500
24#define AMD_C2P_MSG1 0x10504
25#define AMD_C2P_MSG2 0x10508
26
Basavaraj Natikarf2644812021-06-18 13:48:36 +053027#define AMD_C2P_MSG(regno) (0x10500 + ((regno) * 4))
Basavaraj Natikar173709f2021-08-02 19:33:38 +053028#define AMD_P2C_MSG(regno) (0x10680 + ((regno) * 4))
Basavaraj Natikarf2644812021-06-18 13:48:36 +053029
Sandeep Singh4f567b92020-10-10 01:31:36 +053030/* MP2 P2C Message Registers */
31#define AMD_P2C_MSG3 0x1068C /* Supported Sensors info */
32
Basavaraj Natikarf2644812021-06-18 13:48:36 +053033#define V2_STATUS 0x2
34
Basavaraj Natikar173709f2021-08-02 19:33:38 +053035#define SENSOR_ENABLED 4
36#define SENSOR_DISABLED 5
37
Basavaraj Natikar24a31ea2021-06-18 13:48:38 +053038#define HPD_IDX 16
39
Basavaraj Natikar0873d1a2021-08-02 19:33:40 +053040#define AMD_SFH_IDLE_LOOP 200
41
Sandeep Singh4f567b92020-10-10 01:31:36 +053042/* SFH Command register */
43union sfh_cmd_base {
44 u32 ul;
45 struct {
46 u32 cmd_id : 8;
47 u32 sensor_id : 8;
48 u32 period : 16;
49 } s;
Basavaraj Natikarf2644812021-06-18 13:48:36 +053050 struct {
51 u32 cmd_id : 4;
Basavaraj Natikaraa0b7242022-02-08 17:51:09 +053052 u32 intr_disable : 1;
Basavaraj Natikarf2644812021-06-18 13:48:36 +053053 u32 rsvd1 : 3;
54 u32 length : 7;
55 u32 mem_type : 1;
56 u32 sensor_id : 8;
57 u32 period : 8;
58 } cmd_v2;
Sandeep Singh4f567b92020-10-10 01:31:36 +053059};
60
Basavaraj Natikar173709f2021-08-02 19:33:38 +053061union cmd_response {
62 u32 resp;
63 struct {
64 u32 status : 2;
65 u32 out_in_c2p : 1;
66 u32 rsvd1 : 1;
67 u32 response : 4;
68 u32 sub_cmd : 8;
69 u32 sensor_id : 6;
70 u32 rsvd2 : 10;
71 } response_v2;
72};
73
Sandeep Singh4f567b92020-10-10 01:31:36 +053074union sfh_cmd_param {
75 u32 ul;
76 struct {
77 u32 buf_layout : 2;
78 u32 buf_length : 6;
79 u32 rsvd : 24;
80 } s;
81};
82
83struct sfh_cmd_reg {
84 union sfh_cmd_base cmd_base;
85 union sfh_cmd_param cmd_param;
86 phys_addr_t phys_addr;
87};
88
89enum sensor_idx {
90 accel_idx = 0,
91 gyro_idx = 1,
92 mag_idx = 2,
93 als_idx = 19
94};
95
96struct amd_mp2_dev {
97 struct pci_dev *pdev;
98 struct amdtp_cl_data *cl_data;
99 void __iomem *mmio;
Basavaraj Natikarf2644812021-06-18 13:48:36 +0530100 const struct amd_mp2_ops *mp2_ops;
Basavaraj Natikar0aad9c92021-06-18 13:48:37 +0530101 struct amd_input_data in_data;
Basavaraj Natikarf2644812021-06-18 13:48:36 +0530102 /* mp2 active control status */
103 u32 mp2_acs;
Sandeep Singh4f567b92020-10-10 01:31:36 +0530104};
105
106struct amd_mp2_sensor_info {
107 u8 sensor_idx;
108 u32 period;
Arnd Bergmannde304912021-01-03 14:53:55 +0100109 dma_addr_t dma_address;
Sandeep Singh4f567b92020-10-10 01:31:36 +0530110};
111
Basavaraj Natikarf2644812021-06-18 13:48:36 +0530112enum mem_use_type {
113 USE_DRAM,
114 USE_C2P_REG,
115};
116
Basavaraj Natikar24a31ea2021-06-18 13:48:38 +0530117struct hpd_status {
118 union {
119 struct {
120 u32 human_presence_report : 4;
121 u32 human_presence_actual : 4;
122 u32 probablity : 8;
123 u32 object_distance : 16;
124 } shpd;
125 u32 val;
126 };
127};
128
Sandeep Singh4f567b92020-10-10 01:31:36 +0530129void amd_start_sensor(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info);
130void amd_stop_sensor(struct amd_mp2_dev *privdata, u16 sensor_idx);
131void amd_stop_all_sensors(struct amd_mp2_dev *privdata);
132int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id);
133int amd_sfh_hid_client_init(struct amd_mp2_dev *privdata);
134int amd_sfh_hid_client_deinit(struct amd_mp2_dev *privdata);
Basavaraj Natikar0873d1a2021-08-02 19:33:40 +0530135u32 amd_sfh_wait_for_response(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
136void amd_mp2_suspend(struct amd_mp2_dev *mp2);
137void amd_mp2_resume(struct amd_mp2_dev *mp2);
Basavaraj Natikarf2644812021-06-18 13:48:36 +0530138
139struct amd_mp2_ops {
140 void (*start)(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info);
141 void (*stop)(struct amd_mp2_dev *privdata, u16 sensor_idx);
142 void (*stop_all)(struct amd_mp2_dev *privdata);
Basavaraj Natikar173709f2021-08-02 19:33:38 +0530143 int (*response)(struct amd_mp2_dev *mp2, u8 sid, u32 sensor_sts);
Basavaraj Natikarf2644812021-06-18 13:48:36 +0530144};
Sandeep Singh4f567b92020-10-10 01:31:36 +0530145#endif