drivers: Add AXI uclass

Add a uclass for AXI (Advanced eXtensible Interface) busses, and a
driver for the gdsys IHS AXI bus on IHS FPGAs.

Signed-off-by: Mario Six <mario.six@gdsys.cc>
Reviewed-by: Simon Glass <sjg@chromium.org>
lime2-spi
Mario Six 6 years ago committed by Anatolij Gustschin
parent f05ebbf47a
commit a63e54ab5f
  1. 2
      drivers/Kconfig
  2. 1
      drivers/Makefile
  3. 13
      drivers/axi/Kconfig
  4. 8
      drivers/axi/Makefile
  5. 39
      drivers/axi/axi-uclass.c
  6. 78
      include/axi.h
  7. 1
      include/dm/uclass-id.h

@ -8,6 +8,8 @@ source "drivers/adc/Kconfig"
source "drivers/ata/Kconfig"
source "drivers/axi/Kconfig"
source "drivers/block/Kconfig"
source "drivers/bootcount/Kconfig"

@ -103,6 +103,7 @@ obj-y += smem/
obj-y += soc/
obj-$(CONFIG_REMOTEPROC) += remoteproc/
obj-y += thermal/
obj-y += axi/
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
endif

@ -0,0 +1,13 @@
menuconfig AXI
bool "AXI bus drivers"
help
Support AXI (Advanced eXtensible Interface) busses, a on-chip
interconnect specification for managing functional blocks in SoC
designs, which is also often used in designs involving FPGAs (e.g.
communication with IP cores in Xilinx FPGAs).
These types of busses expose a virtual address space that can be
accessed using different address widths (8, 16, and 32 are supported
for now).
Other similar bus architectures may be compatible as well.

@ -0,0 +1,8 @@
#
# (C) Copyright 2017
# Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
#
# SPDX-License-Identifier: GPL-2.0+
#
obj-$(CONFIG_AXI) += axi-uclass.o

@ -0,0 +1,39 @@
// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright 2017
* Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
*/
#include <common.h>
#include <dm.h>
#include <axi.h>
int axi_read(struct udevice *dev, ulong address, void *data,
enum axi_size_t size)
{
struct axi_ops *ops = axi_get_ops(dev);
if (!ops->read)
return -ENOSYS;
return ops->read(dev, address, data, size);
}
int axi_write(struct udevice *dev, ulong address, void *data,
enum axi_size_t size)
{
struct axi_ops *ops = axi_get_ops(dev);
if (!ops->write)
return -ENOSYS;
return ops->write(dev, address, data, size);
}
UCLASS_DRIVER(axi) = {
.id = UCLASS_AXI,
.name = "axi",
.post_bind = dm_scan_fdt_dev,
.flags = DM_UC_FLAG_SEQ_ALIAS,
};

@ -0,0 +1,78 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
* (C) Copyright 2017
* Mario Six, Guntermann & Drunck GmbH, mario.six@gdsys.cc
*/
#ifndef _AXI_H_
#define _AXI_H_
enum axi_size_t {
AXI_SIZE_8,
AXI_SIZE_16,
AXI_SIZE_32,
};
/**
* struct axi_ops - driver operations for AXI uclass
*
* Drivers should support these operations unless otherwise noted. These
* operations are intended to be used by uclass code, not directly from
* other code.
*/
struct axi_ops {
/**
* read() - Read a single value from a specified address on a AXI bus
*
* @dev: AXI bus to read from.
* @address: The address to read from.
* @data: Pointer to a variable that takes the data value read
* from the address on the AXI bus.
* @size: The size of the data to be read.
* @return 0 if OK, -ve on error.
*/
int (*read)(struct udevice *dev, ulong address, void *data,
enum axi_size_t size);
/**
* write() - Write a single value to a specified address on a AXI bus
*
* @dev: AXI bus to write to.
* @address: The address to write to.
* @data: Pointer to the data value to be written to the address
* on the AXI bus.
* @size: The size of the data to write.
* @return 0 if OK, -ve on error.
*/
int (*write)(struct udevice *dev, ulong address, void *data,
enum axi_size_t size);
};
#define axi_get_ops(dev) ((struct axi_ops *)(dev)->driver->ops)
/**
* axi_read() - Read a single value from a specified address on a AXI bus
*
* @dev: AXI bus to read from.
* @address: The address to read from.
* @data: Pointer to a variable that takes the data value read from the
* address on the AXI bus.
* @size: The size of the data to write.
* @return 0 if OK, -ve on error.
*/
int axi_read(struct udevice *dev, ulong address, void *data,
enum axi_size_t size);
/**
* axi_write() - Write a single value to a specified address on a AXI bus
*
* @dev: AXI bus to write to.
* @address: The address to write to.
* @data: Pointer to the data value to be written to the address on the
* AXI bus.
* @size: The size of the data to write.
* @return 0 if OK, -ve on error.
*/
int axi_write(struct udevice *dev, ulong address, void *data,
enum axi_size_t size);
#endif

@ -43,6 +43,7 @@ enum uclass_id {
UCLASS_I2C_GENERIC, /* Generic I2C device */
UCLASS_I2C_MUX, /* I2C multiplexer */
UCLASS_IDE, /* IDE device */
UCLASS_AXI, /* AXI bus */
UCLASS_IRQ, /* Interrupt controller */
UCLASS_KEYBOARD, /* Keyboard input device */
UCLASS_LED, /* Light-emitting diode (LED) */

Loading…
Cancel
Save