summaryrefslogtreecommitdiff
path: root/drivers/soc/aspeed/aspeed-espi-oob.h
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