mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-21 20:34:38 +00:00
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>
This commit is contained in:
parent
f05ebbf47a
commit
a63e54ab5f
7 changed files with 142 additions and 0 deletions
|
@ -8,6 +8,8 @@ source "drivers/adc/Kconfig"
|
||||||
|
|
||||||
source "drivers/ata/Kconfig"
|
source "drivers/ata/Kconfig"
|
||||||
|
|
||||||
|
source "drivers/axi/Kconfig"
|
||||||
|
|
||||||
source "drivers/block/Kconfig"
|
source "drivers/block/Kconfig"
|
||||||
|
|
||||||
source "drivers/bootcount/Kconfig"
|
source "drivers/bootcount/Kconfig"
|
||||||
|
|
|
@ -103,6 +103,7 @@ obj-y += smem/
|
||||||
obj-y += soc/
|
obj-y += soc/
|
||||||
obj-$(CONFIG_REMOTEPROC) += remoteproc/
|
obj-$(CONFIG_REMOTEPROC) += remoteproc/
|
||||||
obj-y += thermal/
|
obj-y += thermal/
|
||||||
|
obj-y += axi/
|
||||||
|
|
||||||
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
|
obj-$(CONFIG_MACH_PIC32) += ddr/microchip/
|
||||||
endif
|
endif
|
||||||
|
|
13
drivers/axi/Kconfig
Normal file
13
drivers/axi/Kconfig
Normal file
|
@ -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.
|
8
drivers/axi/Makefile
Normal file
8
drivers/axi/Makefile
Normal file
|
@ -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
|
39
drivers/axi/axi-uclass.c
Normal file
39
drivers/axi/axi-uclass.c
Normal file
|
@ -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,
|
||||||
|
};
|
||||||
|
|
78
include/axi.h
Normal file
78
include/axi.h
Normal file
|
@ -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_GENERIC, /* Generic I2C device */
|
||||||
UCLASS_I2C_MUX, /* I2C multiplexer */
|
UCLASS_I2C_MUX, /* I2C multiplexer */
|
||||||
UCLASS_IDE, /* IDE device */
|
UCLASS_IDE, /* IDE device */
|
||||||
|
UCLASS_AXI, /* AXI bus */
|
||||||
UCLASS_IRQ, /* Interrupt controller */
|
UCLASS_IRQ, /* Interrupt controller */
|
||||||
UCLASS_KEYBOARD, /* Keyboard input device */
|
UCLASS_KEYBOARD, /* Keyboard input device */
|
||||||
UCLASS_LED, /* Light-emitting diode (LED) */
|
UCLASS_LED, /* Light-emitting diode (LED) */
|
||||||
|
|
Loading…
Add table
Reference in a new issue