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 struct udevice; 11 12 /** 13 * enum axi_size_t - Determine size of AXI transfer 14 * @AXI_SIZE_8: AXI sransfer is 8-bit wide 15 * @AXI_SIZE_16: AXI sransfer is 16-bit wide 16 * @AXI_SIZE_32: AXI sransfer is 32-bit wide 17 */ 18 enum axi_size_t { 19 AXI_SIZE_8, 20 AXI_SIZE_16, 21 AXI_SIZE_32, 22 }; 23 24 struct axi_ops { 25 /** 26 * read() - Read a single value from a specified address on a AXI bus 27 * @dev: AXI bus to read from. 28 * @address: The address to read from. 29 * @data: Pointer to a variable that takes the data value read 30 * from the address on the AXI bus. 31 * @size: The size of the data to be read. 32 * 33 * Return: 0 if OK, -ve on error. 34 */ 35 int (*read)(struct udevice *dev, ulong address, void *data, 36 enum axi_size_t size); 37 38 /** 39 * write() - Write a single value to a specified address on a AXI bus 40 * @dev: AXI bus to write to. 41 * @address: The address to write to. 42 * @data: Pointer to the data value to be written to the address 43 * on the AXI bus. 44 * @size: The size of the data to write. 45 * 46 * Return 0 if OK, -ve on error. 47 */ 48 int (*write)(struct udevice *dev, ulong address, void *data, 49 enum axi_size_t size); 50 }; 51 52 #define axi_get_ops(dev) ((struct axi_ops *)(dev)->driver->ops) 53 54 /** 55 * axi_read() - Read a single value from a specified address on a AXI bus 56 * @dev: AXI bus to read from. 57 * @address: The address to read from. 58 * @data: Pointer to a variable that takes the data value read from the 59 * address on the AXI bus. 60 * @size: The size of the data to write. 61 * 62 * Return: 0 if OK, -ve on error. 63 */ 64 int axi_read(struct udevice *dev, ulong address, void *data, 65 enum axi_size_t size); 66 67 /** 68 * axi_write() - Write a single value to a specified address on a AXI bus 69 * @dev: AXI bus to write to. 70 * @address: The address to write to. 71 * @data: Pointer to the data value to be written to the address on the 72 * AXI bus. 73 * @size: The size of the data to write. 74 * 75 * Return: 0 if OK, -ve on error. 76 */ 77 int axi_write(struct udevice *dev, ulong address, void *data, 78 enum axi_size_t size); 79 80 struct axi_emul_ops { 81 /** 82 * read() - Read a single value from a specified address on a AXI bus 83 * @dev: AXI bus to read from. 84 * @address: The address to read from. 85 * @data: Pointer to a variable that takes the data value read 86 * from the address on the AXI bus. 87 * @size: The size of the data to be read. 88 * 89 * Return: 0 if OK, -ve on error. 90 */ 91 int (*read)(struct udevice *dev, ulong address, void *data, 92 enum axi_size_t size); 93 94 /** 95 * write() - Write a single value to a specified address on a AXI bus 96 * @dev: AXI bus to write to. 97 * @address: The address to write to. 98 * @data: Pointer to the data value to be written to the address 99 * on the AXI bus. 100 * @size: The size of the data to write. 101 * 102 * Return: 0 if OK, -ve on error. 103 */ 104 int (*write)(struct udevice *dev, ulong address, void *data, 105 enum axi_size_t size); 106 107 /** 108 * get_store() - Get address of internal storage of a emulated AXI 109 * device 110 * @dev: Emulated AXI device to get the pointer of the internal 111 * storage for. 112 * @storep: Pointer to the internal storage of the emulated AXI 113 * device. 114 * 115 * Return: 0 if OK, -ve on error. 116 */ 117 int (*get_store)(struct udevice *dev, u8 **storep); 118 }; 119 120 #endif 121