Merge branch 'master' of git://git.denx.de/u-boot-sh
[platform/kernel/u-boot.git] / include / axi.h
1 /* SPDX-License-Identifier: GPL-2.0+ */
2 /*
3  * (C) Copyright 2017, 2018
4  * Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
5  */
6
7 #ifndef _AXI_H_
8 #define _AXI_H_
9
10 /**
11  * enum axi_size_t - Determine size of AXI transfer
12  * @AXI_SIZE_8:  AXI sransfer is 8-bit wide
13  * @AXI_SIZE_16: AXI sransfer is 16-bit wide
14  * @AXI_SIZE_32: AXI sransfer is 32-bit wide
15  */
16 enum axi_size_t {
17         AXI_SIZE_8,
18         AXI_SIZE_16,
19         AXI_SIZE_32,
20 };
21
22 struct axi_ops {
23         /**
24          * read() - Read a single value from a specified address on a AXI bus
25          * @dev:        AXI bus to read from.
26          * @address:    The address to read from.
27          * @data:       Pointer to a variable that takes the data value read
28          *              from the address on the AXI bus.
29          * @size:       The size of the data to be read.
30          *
31          * Return: 0 if OK, -ve on error.
32          */
33         int (*read)(struct udevice *dev, ulong address, void *data,
34                     enum axi_size_t size);
35
36         /**
37          * write() - Write a single value to a specified address on a AXI bus
38          * @dev:        AXI bus to write to.
39          * @address:    The address to write to.
40          * @data:       Pointer to the data value to be written to the address
41          *              on the AXI bus.
42          * @size:       The size of the data to write.
43          *
44          * Return 0 if OK, -ve on error.
45          */
46         int (*write)(struct udevice *dev, ulong address, void *data,
47                      enum axi_size_t size);
48 };
49
50 #define axi_get_ops(dev)        ((struct axi_ops *)(dev)->driver->ops)
51
52 /**
53  * axi_read() - Read a single value from a specified address on a AXI bus
54  * @dev:        AXI bus to read from.
55  * @address:    The address to read from.
56  * @data:       Pointer to a variable that takes the data value read from the
57  *              address on the AXI bus.
58  * @size:       The size of the data to write.
59  *
60  * Return: 0 if OK, -ve on error.
61  */
62 int axi_read(struct udevice *dev, ulong address, void *data,
63              enum axi_size_t size);
64
65 /**
66  * axi_write() - Write a single value to a specified address on a AXI bus
67  * @dev:        AXI bus to write to.
68  * @address:    The address to write to.
69  * @data:       Pointer to the data value to be written to the address on the
70  *              AXI bus.
71  * @size:       The size of the data to write.
72  *
73  * Return: 0 if OK, -ve on error.
74  */
75 int axi_write(struct udevice *dev, ulong address, void *data,
76               enum axi_size_t size);
77
78 struct axi_emul_ops {
79         /**
80          * read() - Read a single value from a specified address on a AXI bus
81          * @dev:        AXI bus to read from.
82          * @address:    The address to read from.
83          * @data:       Pointer to a variable that takes the data value read
84          *              from the address on the AXI bus.
85          * @size:       The size of the data to be read.
86          *
87          * Return: 0 if OK, -ve on error.
88          */
89         int (*read)(struct udevice *dev, ulong address, void *data,
90                     enum axi_size_t size);
91
92         /**
93          * write() - Write a single value to a specified address on a AXI bus
94          * @dev:        AXI bus to write to.
95          * @address:    The address to write to.
96          * @data:       Pointer to the data value to be written to the address
97          *              on the AXI bus.
98          * @size:       The size of the data to write.
99          *
100          * Return: 0 if OK, -ve on error.
101          */
102         int (*write)(struct udevice *dev, ulong address, void *data,
103                      enum axi_size_t size);
104
105         /**
106          * get_store() - Get address of internal storage of a emulated AXI
107          *               device
108          * @dev:        Emulated AXI device to get the pointer of the internal
109          *              storage for.
110          * @storep:     Pointer to the internal storage of the emulated AXI
111          *              device.
112          *
113          * Return: 0 if OK, -ve on error.
114          */
115         int (*get_store)(struct udevice *dev, u8 **storep);
116 };
117
118 #endif