blob: ee5fb3d0977099a0cc763314e89fabaf751e9b67 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* Copyright 2021 Aspeed Technology Inc.
*/
#ifndef _ASPEED_ESPI_OOB_H_
#define _ASPEED_ESPI_OOB_H_
struct oob_tx_dma_desc {
u32 data_addr;
u8 cyc;
u16 tag : 4;
u16 len : 12;
u8 msg_type : 3;
u8 raz0 : 1;
u8 pec : 1;
u8 int_en : 1;
u8 pause : 1;
u8 raz1 : 1;
u32 raz2;
u32 raz3;
} __packed;
struct oob_rx_dma_desc {
u32 data_addr;
u8 cyc;
u16 tag : 4;
u16 len : 12;
u8 raz : 7;
u8 dirty : 1;
} __packed;
struct aspeed_espi_oob_dma {
u32 tx_desc_num;
u32 rx_desc_num;
struct oob_tx_dma_desc *tx_desc;
dma_addr_t tx_desc_addr;
struct oob_rx_dma_desc *rx_desc;
dma_addr_t rx_desc_addr;
void *tx_virt;
dma_addr_t tx_addr;
void *rx_virt;
dma_addr_t rx_addr;
};
struct aspeed_espi_oob {
u32 dma_mode;
struct aspeed_espi_oob_dma dma;
u32 rx_ready;
wait_queue_head_t wq;
/* Locks rx resources and allow one receive at a time */
struct mutex get_rx_mtx;
/* Locks tx resources and allow one transmit at a time */
struct mutex put_tx_mtx;
/* Lock to synchronize receive in irq context */
spinlock_t lock;
struct miscdevice mdev;
struct aspeed_espi_ctrl *ctrl;
};
void aspeed_espi_oob_event(u32 sts, struct aspeed_espi_oob *espi_oob);
void aspeed_espi_oob_enable(struct aspeed_espi_oob *espi_oob);
void *aspeed_espi_oob_alloc(struct device *dev, struct aspeed_espi_ctrl *espi_ctrl);
void aspeed_espi_oob_free(struct device *dev, struct aspeed_espi_oob *espi_oob);
#endif
|