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 119