diff options
| -rw-r--r-- | .bzrignore | 1 | ||||
| -rw-r--r-- | CMakeLists.txt | 48 | ||||
| -rw-r--r-- | apps/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | bank.h | 97 | ||||
| -rw-r--r-- | config.h | 30 | ||||
| -rw-r--r-- | dma.h | 86 | ||||
| -rw-r--r-- | dma/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | dma/ipe.h | 4 | ||||
| -rw-r--r-- | dma/nwl.h | 4 | ||||
| -rw-r--r-- | pcilib/CMakeLists.txt | 21 | ||||
| -rw-r--r-- | pcilib/bank.c (renamed from bank.c) | 9 | ||||
| -rw-r--r-- | pcilib/bank.h | 102 | ||||
| -rw-r--r-- | pcilib/config.c (renamed from config.c) | 17 | ||||
| -rw-r--r-- | pcilib/config.h | 17 | ||||
| -rw-r--r-- | pcilib/dma.c (renamed from dma.c) | 86 | ||||
| -rw-r--r-- | pcilib/dma.h | 85 | ||||
| -rw-r--r-- | pcilib/error.c (renamed from error.c) | 0 | ||||
| -rw-r--r-- | pcilib/error.h (renamed from error.h) | 0 | ||||
| -rw-r--r-- | pcilib/event.c (renamed from event.c) | 1 | ||||
| -rw-r--r-- | pcilib/event.h (renamed from event.h) | 2 | ||||
| -rw-r--r-- | pcilib/irq.c (renamed from irq.c) | 0 | ||||
| -rw-r--r-- | pcilib/irq.h (renamed from irq.h) | 0 | ||||
| -rw-r--r-- | pcilib/kmem.c (renamed from kmem.c) | 0 | ||||
| -rw-r--r-- | pcilib/kmem.h (renamed from kmem.h) | 0 | ||||
| -rw-r--r-- | pcilib/linux-3.10.h (renamed from linux-3.10.h) | 0 | ||||
| -rw-r--r-- | pcilib/model.c (renamed from model.c) | 0 | ||||
| -rw-r--r-- | pcilib/model.h (renamed from model.h) | 16 | ||||
| -rw-r--r-- | pcilib/pci.c (renamed from pci.c) | 4 | ||||
| -rw-r--r-- | pcilib/pci.h (renamed from pci.h) | 0 | ||||
| -rw-r--r-- | pcilib/pcilib.h (renamed from pcilib.h) | 0 | ||||
| -rw-r--r-- | pcilib/register.c (renamed from register.c) | 0 | ||||
| -rw-r--r-- | pcilib/register.h (renamed from register.h) | 2 | ||||
| -rw-r--r-- | pcilib/tools.c (renamed from tools.c) | 0 | ||||
| -rw-r--r-- | pcilib/tools.h (renamed from tools.h) | 0 | ||||
| -rw-r--r-- | pcitool/CMakeLists.txt | 28 | ||||
| -rw-r--r-- | pcitool/cli.c (renamed from cli.c) | 10 | ||||
| -rw-r--r-- | protocols/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | protocols/default.h | 2 | ||||
| -rwxr-xr-x | tests/grab.sh | 4 | ||||
| -rwxr-xr-x | tests/ipedma/ipecamera-frame.sh | 2 | ||||
| -rwxr-xr-x | tests/ipedma/ipecamera-test.sh | 2 | ||||
| -rwxr-xr-x | tests/ipedma/test.sh | 2 | ||||
| -rwxr-xr-x | tests/nwldma/bench.sh | 4 | ||||
| -rwxr-xr-x | tests/nwldma/cleanup.sh | 4 | ||||
| -rwxr-xr-x | tests/test-iommu.sh | 5 | ||||
| -rwxr-xr-x | tests/xilinxdma/xilinx_dma.sh | 4 | ||||
| -rwxr-xr-x | tests/xilinxdma/xilinx_dma_static_mem.sh | 2 | 
47 files changed, 352 insertions, 358 deletions
| @@ -25,3 +25,4 @@ apps/heb_strip_bad_values  *.out  apps/check_counter  apps/lorenzo_ipedma_test +pci diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eb4c26..faed5aa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,66 +16,20 @@ if (NOT DISABLE_PCITOOL)      pkg_check_modules(FASTWRITER fastwriter REQUIRED)  endif (NOT DISABLE_PCITOOL) -set(HEADERS pcilib.h pci.h config.h model.h bank.h register.h kmem.h irq.h dma.h event.h tools.h error.h)  add_definitions("-fPIC --std=c99 -Wall -O2 -gdwarf-2 -g3")  #add_definitions("-fPIC --std=c99 -Wall -O2")  add_subdirectory(dma)  add_subdirectory(protocols) +add_subdirectory(pcilib)  add_subdirectory(pcitool)  add_subdirectory(apps) -include_directories( -    . -    ${FASTWRITER_INCLUDE_DIRS} -) - -link_directories( -    ${FASTWRITER_LIBRARY_DIRS} -    ${UFODECODE_LIBRARY_DIRS} -) - -add_library(pcilib SHARED pci.c config.c model.c bank.c register.c kmem.c irq.c dma.c event.c tools.c error.c)  -target_link_libraries(pcilib dma protocols ${CMAKE_THREAD_LIBS_INIT} ${UFODECODE_LIBRARIES} ) -add_dependencies(pcilib dma protocols pcitool) -  set_target_properties(pcilib PROPERTIES      VERSION ${PCILIB_VERSION}      SOVERSION ${PCILIB_ABI_VERSION}  ) -if (NOT DISABLE_PCITOOL) -    add_executable(pci cli.c) -    add_dependencies(pci pcitool) -    target_link_libraries(pci pcilib pcitool ${FASTWRITER_LIBRARIES}) -    set_target_properties(pci PROPERTIES -	LINK_FLAGS ${CMAKE_THREAD_LIBS_INIT} -    ) -endif (NOT DISABLE_PCITOOL) - -#set_target_properties(pci PROPERTIES -#    LINK_FLAGS "-Wl,pcitool/libpcitool.a" -#) -if(NOT DEFINED BIN_INSTALL_DIR) -    set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin") -endif(NOT DEFINED BIN_INSTALL_DIR) -install(TARGETS pcilib -    LIBRARY DESTINATION lib${LIB_SUFFIX} -) - -if (NOT DISABLE_PCITOOL) -    install(TARGETS pci -	DESTINATION ${BIN_INSTALL_DIR} -    ) -endif (NOT DISABLE_PCITOOL) - -install(FILES pcilib.h -    DESTINATION include -) - -install(FILES bank.h register.h dma.h event.h model.h error.h tools.h -    DESTINATION include/pcilib -) diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index de652b5..32aac62 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1,8 +1,11 @@  include_directories(      ${CMAKE_SOURCE_DIR} +    ${CMAKE_SOURCE_DIR}/pcilib  ) -link_directories(${UFODECODE_LIBRARY_DIRS}) +link_directories( +    ${CMAKE_SOURCE_DIR}/pcilib +)  add_executable(xilinx xilinx.c)  target_link_libraries(xilinx pcilib rt) @@ -1,97 +0,0 @@ -#ifndef _PCILIB_BANK_H -#define _PCILIB_BANK_H - -#include <pcilib.h> - -#define PCILIB_REGISTER_BANK_INVALID		((pcilib_register_bank_t)-1) -#define PCILIB_REGISTER_BANK0 			0					/**< First BANK to be used in the event engine */ -#define PCILIB_REGISTER_BANK1 			1 -#define PCILIB_REGISTER_BANK2 			2 -#define PCILIB_REGISTER_BANK3 			3 -#define PCILIB_REGISTER_BANK_DMA		64					/**< First BANK address to be used by DMA engines */ -#define PCILIB_REGISTER_BANK_DYNAMIC		128					/**< First BANK address to map dynamic XML configuration */ -#define PCILIB_REGISTER_PROTOCOL_INVALID	((pcilib_register_protocol_t)-1) -#define PCILIB_REGISTER_PROTOCOL0		0					/**< First PROTOCOL address to be used in the event engine */ -#define PCILIB_REGISTER_PROTOCOL_DEFAULT	64					/**< Default memmap based protocol */ -#define PCILIB_REGISTER_PROTOCOL_DMA		96					/**< First PROTOCOL address to be used by DMA engines */ -#define PCILIB_REGISTER_PROTOCOL_DYNAMIC	128					/**< First PROTOCOL address to be used by plugins */ - -#define PCILIB_REGISTER_NO_BITS			0 -#define PCILIB_REGISTER_ALL_BITS		((pcilib_register_value_t)-1) - -typedef uint8_t pcilib_register_bank_t;						/**< Type holding the bank position within the field listing register banks in the model */ -typedef uint8_t pcilib_register_bank_addr_t;					/**< Type holding the bank address number */ -typedef uint8_t pcilib_register_protocol_t;					/**< Type holding the protocol position within the field listing register protocols in the model */ -typedef uint8_t pcilib_register_protocol_addr_t;				/**< Type holding the protocol address */ - - -typedef struct pcilib_register_bank_context_s pcilib_register_bank_context_t; - -typedef struct { -    pcilib_register_bank_context_t *(*init)(pcilib_t *ctx, pcilib_register_bank_t bank, const char *model, const void *args); -    void (*free)(pcilib_register_bank_context_t *ctx); -    int (*read)(pcilib_t *pcilib, pcilib_register_bank_context_t *ctx, pcilib_register_addr_t addr, pcilib_register_value_t *value); -    int (*write)(pcilib_t *pcilib, pcilib_register_bank_context_t *ctx, pcilib_register_addr_t addr, pcilib_register_value_t value); -} pcilib_register_protocol_api_description_t; - -typedef struct { -    pcilib_register_protocol_addr_t addr; -    const pcilib_register_protocol_api_description_t *api; -    const char *model; -    const void *args; -    const char *name; -    const char *description; -} pcilib_register_protocol_description_t; - -typedef struct { -    pcilib_register_bank_addr_t addr; - -    pcilib_bar_t bar;				// optional -    size_t size; -     -    pcilib_register_protocol_addr_t protocol; - -    uintptr_t read_addr;			// or offset if bar specified -    uintptr_t write_addr;			// or offset if bar specified -    pcilib_endianess_t raw_endianess; - -    uint8_t access; -    pcilib_endianess_t endianess; -     -    const char *format; -    const char *name; -    const char *description; -} pcilib_register_bank_description_t; - -/** -  * Default mappings -  */ -typedef struct { -    uintptr_t start; -    uintptr_t end; -    pcilib_register_bank_addr_t bank; -    long addr_shift; -} pcilib_register_range_t; - - - -struct pcilib_register_bank_context_s { -    const pcilib_register_bank_description_t *bank; -    const pcilib_register_protocol_api_description_t *api; -}; - - -    // we don't copy strings, they should be statically allocated -int pcilib_init_register_banks(pcilib_t *ctx); -void pcilib_free_register_banks(pcilib_t *ctx); -int pcilib_add_register_banks(pcilib_t *ctx, size_t n, const pcilib_register_bank_description_t *banks); - -pcilib_register_bank_t pcilib_find_register_bank_by_addr(pcilib_t *ctx, pcilib_register_bank_addr_t bank); -pcilib_register_bank_t pcilib_find_register_bank_by_name(pcilib_t *ctx, const char *bankname); -pcilib_register_bank_t pcilib_find_register_bank(pcilib_t *ctx, const char *bank); - -pcilib_register_protocol_t pcilib_find_register_protocol_by_addr(pcilib_t *ctx, pcilib_register_protocol_addr_t protocol); -pcilib_register_protocol_t pcilib_find_register_protocol_by_name(pcilib_t *ctx, const char *name); -pcilib_register_protocol_t pcilib_find_register_protocol(pcilib_t *ctx, const char *name); - -#endif /* _PCILIB_BANK_H */ diff --git a/config.h b/config.h deleted file mode 100644 index 3ba92ee..0000000 --- a/config.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _PCILIB_CONFIG_H -#define _PCILIB_CONFIG_H - - -#include "register.h" -#include "dma.h" - -/* -typedef struct { -    const char *alias; -    pcilib_register_protocol_description_t *protocol; -} pcilib_register_protocol_alias_t; - - -typedef struct { -    const char *alias; -    pcilib_dma_description_t dma; -} pcilib_dma_alias_t; - -extern pcilib_register_protocol_alias_t pcilib_protocols[]; -extern pcilib_dma_alias_t pcilib_dma[]; -*/ - -extern const pcilib_register_protocol_description_t pcilib_protocols[]; -extern const pcilib_dma_description_t pcilib_dma[]; - - -//extern const pcilib_register_protocol_description_t *pcilib_protocol_default; - -#endif /* _PCILIB_CONFIG_H */ @@ -1,86 +0,0 @@ -#ifndef _PCILIB_DMA_H -#define _PCILIB_DMA_H - -#define PCILIB_DMA_BUFFER_INVALID ((size_t)-1) - - -typedef struct { -    int started; -    size_t ring_size, buffer_size; -    size_t ring_head, ring_tail; -} pcilib_dma_engine_status_t; - -typedef enum { -    PCILIB_DMA_TYPE_BLOCK, -    PCILIB_DMA_TYPE_PACKET, -    PCILIB_DMA_TYPE_UNKNOWN -} pcilib_dma_engine_type_t; - -typedef struct { -    pcilib_dma_engine_addr_t addr; -    pcilib_dma_engine_type_t type; -    pcilib_dma_direction_t direction; -    size_t addr_bits; - -    const char *name; -    const char *description; -} pcilib_dma_engine_description_t; - -typedef struct { -    int used; -    int error; -    int first; -    int last; -    size_t size; -} pcilib_dma_buffer_status_t; - -/* -typedef struct { -    int ignore_eop; -} pcilib_dma_parameters_t; -*/ - -typedef struct { -//    pcilib_dma_parameters_t params; -    pcilib_t *pcilib; -} pcilib_dma_context_t; - -typedef struct { -    pcilib_dma_context_t *(*init)(pcilib_t *ctx, const char *model, const void *arg); -    void (*free)(pcilib_dma_context_t *ctx); -     -    int (*status)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers); - -    int (*enable_irq)(pcilib_dma_context_t *ctx, pcilib_irq_type_t irq_type, pcilib_dma_flags_t flags); -    int (*disable_irq)(pcilib_dma_context_t *ctx, pcilib_dma_flags_t flags); -    int (*acknowledge_irq)(pcilib_dma_context_t *ctx, pcilib_irq_type_t irq_type, pcilib_irq_source_t irq_source); - -    int (*start_dma)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags); -    int (*stop_dma)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags); - -    int (*push)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *written); -    int (*stream)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, pcilib_dma_callback_t cb, void *cbattr); - -    double (*benchmark)(pcilib_dma_context_t *ctx, pcilib_dma_engine_addr_t dma, uintptr_t addr, size_t size, size_t iterations, pcilib_dma_direction_t direction); -} pcilib_dma_api_description_t; - - -typedef struct { -    const pcilib_dma_api_description_t *api; -    const pcilib_register_bank_description_t *banks; -    const pcilib_register_description_t *registers; -    const pcilib_dma_engine_description_t *engines; -    const char *model; -    const void *args; -    const char *name; -    const char *description; -} pcilib_dma_description_t; - - -const pcilib_dma_description_t *pcilib_get_dma_info(pcilib_t *ctx); -pcilib_dma_engine_t pcilib_add_dma_engine(pcilib_t *ctx, pcilib_dma_engine_description_t *desc); -int pcilib_get_dma_status(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers); -int pcilib_init_dma(pcilib_t *ctx); - - -#endif /* _PCILIB_DMA_H */ diff --git a/dma/CMakeLists.txt b/dma/CMakeLists.txt index 9bbfacd..8a3a8e1 100644 --- a/dma/CMakeLists.txt +++ b/dma/CMakeLists.txt @@ -1,8 +1,8 @@  include_directories(      ${CMAKE_SOURCE_DIR} +    ${CMAKE_SOURCE_DIR}/pcilib  ) -  set(HEADERS ${HEADERS} nwl.h nwl_private.h nwl_engine.h nwl_irq.h nwl_loopback.h ipe.h ipe_private.h)  add_library(dma STATIC nwl.c nwl_engine.c nwl_irq.c nwl_loopback.c ipe.c) @@ -2,7 +2,7 @@  #define _PCILIB_DMA_IPE_H  #include <stdio.h> -#include "../pcilib.h" +#include "pcilib.h"  //#define PCILIB_NWL_MODIFICATION_IPECAMERA 0x100 @@ -38,7 +38,7 @@ static const pcilib_dma_engine_description_t ipe_dma_engines[] = {  };  static const pcilib_register_bank_description_t ipe_dma_banks[] = { -    { PCILIB_REGISTER_BANK_DMA, PCILIB_BAR0, 0xA000, PCILIB_REGISTER_PROTOCOL_DEFAULT, 0,                        0,                        PCILIB_LITTLE_ENDIAN, 32, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"}, +    { PCILIB_REGISTER_BANK_DMA, PCILIB_REGISTER_PROTOCOL_DEFAULT, PCILIB_BAR0, 0, 0, 32, 0x0200, PCILIB_LITTLE_ENDIAN, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"},      { 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }  }; @@ -2,7 +2,7 @@  #define _PCILIB_DMA_NWL_H  #include <stdio.h> -#include "../pcilib.h" +#include "pcilib.h"  pcilib_dma_context_t *dma_nwl_init(pcilib_t *ctx, const char *model, const void *arg);  void  dma_nwl_free(pcilib_dma_context_t *vctx); @@ -36,7 +36,7 @@ static const pcilib_dma_api_description_t nwl_dma_api = {  };  static pcilib_register_bank_description_t nwl_dma_banks[] = { -    { PCILIB_REGISTER_BANK_DMA, PCILIB_BAR0, 0xA000, PCILIB_REGISTER_PROTOCOL_DEFAULT    , 0,                        0,                        PCILIB_LITTLE_ENDIAN, 32, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"}, +    { PCILIB_REGISTER_BANK_DMA, PCILIB_REGISTER_PROTOCOL_DEFAULT, PCILIB_BAR0, 0, 0, 32, 0xA000, PCILIB_LITTLE_ENDIAN, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"},      { 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }  }; diff --git a/pcilib/CMakeLists.txt b/pcilib/CMakeLists.txt new file mode 100644 index 0000000..c5297ab --- /dev/null +++ b/pcilib/CMakeLists.txt @@ -0,0 +1,21 @@ +include_directories( +    ${CMAKE_SOURCE_DIR} +    ${CMAKE_SOURCE_DIR}/pcilib +) + +set(HEADERS pcilib.h pci.h config.h model.h bank.h register.h kmem.h irq.h dma.h event.h tools.h error.h) +add_library(pcilib SHARED pci.c config.c model.c bank.c register.c kmem.c irq.c dma.c event.c tools.c error.c) +target_link_libraries(pcilib dma protocols ${CMAKE_THREAD_LIBS_INIT} ${UFODECODE_LIBRARIES} ) +add_dependencies(pcilib dma protocols) + +install(TARGETS pcilib +    LIBRARY DESTINATION lib${LIB_SUFFIX} +) + +install(FILES pcilib.h +    DESTINATION include +) + +install(FILES bank.h register.h dma.h event.h model.h error.h tools.h config.h +    DESTINATION include/pcilib +) @@ -38,9 +38,12 @@ int pcilib_init_register_banks(pcilib_t *ctx) {  	bapi = ctx->protocols[protocol].api; -	if (bapi->init)  -	    bank_ctx = bapi->init(ctx, ctx->num_banks_init, ctx->protocols[protocol].model, ctx->protocols[protocol].args); -	else +	if (bapi->init) { +	    const char *model = ctx->protocols[protocol].model; +	    if (!model) model = ctx->model; + +	    bank_ctx = bapi->init(ctx, ctx->num_banks_init, model, ctx->protocols[protocol].args); +	} else  	    bank_ctx = (pcilib_register_bank_context_t*)malloc(sizeof(pcilib_register_bank_context_t));  	if (!bank_ctx) diff --git a/pcilib/bank.h b/pcilib/bank.h new file mode 100644 index 0000000..f673169 --- /dev/null +++ b/pcilib/bank.h @@ -0,0 +1,102 @@ +#ifndef _PCILIB_BANK_H +#define _PCILIB_BANK_H + +#include <pcilib.h> + +#define PCILIB_REGISTER_BANK_INVALID		((pcilib_register_bank_t)-1) +#define PCILIB_REGISTER_BANK0 			0					/**< First BANK to be used in the event engine */ +#define PCILIB_REGISTER_BANK1 			1 +#define PCILIB_REGISTER_BANK2 			2 +#define PCILIB_REGISTER_BANK3 			3 +#define PCILIB_REGISTER_BANK_DMA		64					/**< First BANK address to be used by DMA engines */ +#define PCILIB_REGISTER_BANK_DYNAMIC		128					/**< First BANK address to map dynamic XML configuration */ +#define PCILIB_REGISTER_PROTOCOL_INVALID	((pcilib_register_protocol_t)-1) +#define PCILIB_REGISTER_PROTOCOL0		0					/**< First PROTOCOL address to be used in the event engine */ +#define PCILIB_REGISTER_PROTOCOL_DEFAULT	64					/**< Default memmap based protocol */ +#define PCILIB_REGISTER_PROTOCOL_DMA		96					/**< First PROTOCOL address to be used by DMA engines */ +#define PCILIB_REGISTER_PROTOCOL_DYNAMIC	128					/**< First PROTOCOL address to be used by plugins */ + +#define PCILIB_REGISTER_NO_BITS			0 +#define PCILIB_REGISTER_ALL_BITS		((pcilib_register_value_t)-1) + +typedef uint8_t pcilib_register_bank_t;						/**< Type holding the bank position within the field listing register banks in the model */ +typedef uint8_t pcilib_register_bank_addr_t;					/**< Type holding the bank address number */ +typedef uint8_t pcilib_register_protocol_t;					/**< Type holding the protocol position within the field listing register protocols in the model */ +typedef uint8_t pcilib_register_protocol_addr_t;				/**< Type holding the protocol address */ + + +typedef struct pcilib_register_bank_context_s pcilib_register_bank_context_t; + +typedef struct { +    pcilib_register_bank_context_t *(*init)(pcilib_t *ctx, pcilib_register_bank_t bank, const char *model, const void *args);			/**< Optional API call to initialize bank context */ +    void (*free)(pcilib_register_bank_context_t *ctx);												/**< Optional API call to cleanup bank context */ +    int (*read)(pcilib_t *pcilib, pcilib_register_bank_context_t *ctx, pcilib_register_addr_t addr, pcilib_register_value_t *value);		/**< Read from register, mandatory for RO/RW registers */ +    int (*write)(pcilib_t *pcilib, pcilib_register_bank_context_t *ctx, pcilib_register_addr_t addr, pcilib_register_value_t value);		/**< Write to register, mandatory for WO/RW registers */ +} pcilib_register_protocol_api_description_t; + +typedef struct { +    pcilib_register_protocol_addr_t addr;					/**< Protocol address used in model for addressing the described protocol */ +    const pcilib_register_protocol_api_description_t *api;			/**< Defines all API functions for protocol */ +    const char *model;								/**< If NULL, the actually used model is used instead */ +    const void *args;								/**< Custom protocol-specific arguments. The actual structure may depend on the specified model */ +    const char *name;								/**< Short protocol name */ +    const char *description;							/**< A bit longer protocol description */ +} pcilib_register_protocol_description_t; + +typedef struct { +    pcilib_register_bank_addr_t addr;						/**< Bank address used in model for addressing the described register bank */ + +    pcilib_register_protocol_addr_t protocol;					/**< Defines a protocol to access registers */ +    pcilib_bar_t bar;								/**< Specifies the PCI BAR through which an access to the registers is provided (autodetcted if PCILIB_BAR_DETECT is specified) */ +    uintptr_t read_addr;							/**< protocol specific (normally offset in the BAR of the first address used to read registers) */ +    uintptr_t write_addr;							/**< protocol specific (normally offset in the BAR of the first address used to write registers) */ + +    uint8_t access;								/**< Default register size in bits (or word-size in plain addressing mode) */ +    size_t size;								/**< Number of register addresses (plain addressing) in the bank (more register names can be defined if bit-fields/views are used) */ +    pcilib_endianess_t raw_endianess;						/**< Specifies endianess in the plain-addressing mode, PCILIB_HOST_ENDIAN have to be specified if no conversion desired.  +										Conversion applied after protocol. This value does not get into the account in register-access mode */ +    pcilib_endianess_t endianess;						/**< Specifies endianess in the register-access mode, this may differ from raw_endianess if multi-word registers are used.  +										This is fully independent from raw_endianess. No double conversion is either performed */ +     +    const char *format;								/**< printf format for the registers, either %lu for decimal output or 0x%lx for hexdecimal */ +    const char *name;								/**< short bank name */ +    const char *description;							/**< longer bank description */ +} pcilib_register_bank_description_t; + +/** +  * Default mappings: defines virtual address to register mappings, i.e. how 0x9000 in the following command  +  * will be mapped to the actual register. By comparing with start and end-addresses, we find to which range  +  * 0x9000 belongs to and detect actual bank and offset in it. +  * Simple example: pci -r 0x9000 +  * if we specify range { 0x9000, 0x9100, 10, -0x9000}, the example command we print the value of the first +  * register in the bank 10. +  */ +typedef struct { +    uintptr_t start;								/**< The first virtual address of the register range */ +    uintptr_t end;								/**< The last virtual address of the register range */ +    pcilib_register_bank_addr_t bank;						/**< The bank mapped to the specified range */ +    long addr_shift;								/**< Address shift, i.e. how much we should add/substract to the virtual address to get address in the register bank */ +} pcilib_register_range_t; + + + +struct pcilib_register_bank_context_s { +    const pcilib_register_bank_description_t *bank;				/**< Corresponding bank description */ +    const pcilib_register_protocol_api_description_t *api;			/**< API functions */ +}; + + +    // we don't copy strings, they should be statically allocated +int pcilib_init_register_banks(pcilib_t *ctx); +void pcilib_free_register_banks(pcilib_t *ctx); +int pcilib_add_register_banks(pcilib_t *ctx, size_t n, const pcilib_register_bank_description_t *banks); + +pcilib_register_bank_t pcilib_find_register_bank_by_addr(pcilib_t *ctx, pcilib_register_bank_addr_t bank); +pcilib_register_bank_t pcilib_find_register_bank_by_name(pcilib_t *ctx, const char *bankname); +pcilib_register_bank_t pcilib_find_register_bank(pcilib_t *ctx, const char *bank); + +pcilib_register_protocol_t pcilib_find_register_protocol_by_addr(pcilib_t *ctx, pcilib_register_protocol_addr_t protocol); +pcilib_register_protocol_t pcilib_find_register_protocol_by_name(pcilib_t *ctx, const char *name); +pcilib_register_protocol_t pcilib_find_register_protocol(pcilib_t *ctx, const char *name); + +#endif /* _PCILIB_BANK_H */ diff --git a/config.c b/pcilib/config.c index 642c505..21a0e53 100644 --- a/config.c +++ b/pcilib/config.c @@ -2,7 +2,6 @@  #include <stdio.h> -#include "model.h"  #include "error.h"  #include "config.h" @@ -18,23 +17,21 @@ const pcilib_register_protocol_description_t pcilib_protocols[] = {      { 0 }  }; -//static const pcilib_register_protocol_description_t *pcilib_protocol_default = NULL;//{0};//&pcilib_protocols[0]; -  #include "dma/nwl.h"  #include "dma/ipe.h" -/* -pcilib_register_protocol_alias_t pcilib_protocols[] = { -    { "default", 	{ &pcilib_default_protocol_api, PCILIB_REGISTER_PROTOCOL_MODIFICATION_DEFAULT, NULL } }, -    { NULL, 		{0} } -}; -*/ +const pcilib_dma_description_t pcilib_ipedma =  +    { &ipe_dma_api, ipe_dma_banks, ipe_dma_registers, ipe_dma_engines, NULL, NULL, "ipedma", "DMA engine developed by M. Caselle" }; +const pcilib_dma_description_t pcilib_nwldma = +    { &nwl_dma_api, nwl_dma_banks, nwl_dma_registers, NULL, NULL, NULL, "nwldma", "North West Logic DMA Engine" }; -const pcilib_dma_description_t pcilib_dma[] = { +const pcilib_dma_description_t pcilib_dma[] = {       { &ipe_dma_api, ipe_dma_banks, ipe_dma_registers, ipe_dma_engines, NULL, NULL, "ipedma", "DMA engine developed by M. Caselle" },      { &nwl_dma_api, nwl_dma_banks, nwl_dma_registers, NULL, NULL, NULL, "nwldma", "North West Logic DMA Engine" },      { &nwl_dma_api, nwl_dma_banks, nwl_dma_registers, NULL, "ipecamera", NULL, "nwldma-ipe", "North West Logic DMA Engine" },      { 0 }  }; + + diff --git a/pcilib/config.h b/pcilib/config.h new file mode 100644 index 0000000..710bff8 --- /dev/null +++ b/pcilib/config.h @@ -0,0 +1,17 @@ +#ifndef _PCILIB_CONFIG_H +#define _PCILIB_CONFIG_H + + +#include <pcilib/register.h> +#include <pcilib/bank.h> +#include <pcilib/dma.h> + +extern const pcilib_register_protocol_description_t pcilib_protocols[]; +extern const pcilib_dma_description_t pcilib_dma[]; + +extern const pcilib_register_protocol_api_description_t pcilib_default_protocol_api; + +extern const pcilib_dma_description_t pcilib_ipedma; +extern const pcilib_dma_description_t pcilib_nwldma; + +#endif /* _PCILIB_CONFIG_H */ @@ -18,7 +18,7 @@  #include "pci.h"  #include "dma.h" -const pcilib_dma_description_t *pcilib_get_dma_info(pcilib_t *ctx) { +const pcilib_dma_description_t *pcilib_get_dma_description(pcilib_t *ctx) {      int err;      err = pcilib_init_dma(ctx); @@ -29,24 +29,24 @@ const pcilib_dma_description_t *pcilib_get_dma_info(pcilib_t *ctx) {      if (!ctx->dma_ctx) return NULL; -    return ctx->model_info.dma; +    return &ctx->dma;  }  pcilib_dma_engine_t pcilib_find_dma_by_addr(pcilib_t *ctx, pcilib_dma_direction_t direction, pcilib_dma_engine_addr_t dma) {      pcilib_dma_engine_t i; -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); -    if (!info) { +    const pcilib_dma_description_t *dma_info =  pcilib_get_dma_description(ctx); +    if (!dma_info) {  	pcilib_error("DMA Engine is not configured in the current model");  	return PCILIB_ERROR_NOTSUPPORTED;      } -    for (i = 0; info->engines[i].addr_bits; i++) { -	if ((info->engines[i].addr == dma)&&((info->engines[i].direction&direction)==direction)) break; +    for (i = 0; dma_info->engines[i].addr_bits; i++) { +	if ((dma_info->engines[i].addr == dma)&&((dma_info->engines[i].direction&direction)==direction)) break;      } -    if (info->engines[i].addr_bits) return i; +    if (dma_info->engines[i].addr_bits) return i;      return PCILIB_DMA_ENGINE_INVALID;  } @@ -75,16 +75,14 @@ int pcilib_init_dma(pcilib_t *ctx) {  	}  	dma_ctx = model_info->api->init_dma(ctx->event_ctx); -    } else if ((model_info->dma)&&(model_info->dma->api)&&(model_info->dma->api->init)) { -	const pcilib_dma_description_t *dma = model_info->dma; -	 +    } else if ((ctx->dma.api)&&(ctx->dma.api->init)) {  	err = pcilib_init_register_banks(ctx);  	if (err) {  	    pcilib_error("Error (%i) while initializing register banks", err);  	    return err;  	} -	dma_ctx = dma->api->init(ctx, (dma->model?dma->model:ctx->model), dma->args); +	dma_ctx = ctx->dma.api->init(ctx, (ctx->dma.model?ctx->dma.model:ctx->model), ctx->dma.args);      }      if (dma_ctx) { @@ -97,66 +95,66 @@ int pcilib_init_dma(pcilib_t *ctx) {  }  int pcilib_start_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx);      if (!info) {  	pcilib_error("DMA is not supported by the device");  	return PCILIB_ERROR_NOTSUPPORTED;      } -    if (!ctx->model_info.dma->api) { +    if (!info->api) {  	pcilib_error("DMA Engine is not configured in the current model");  	return PCILIB_ERROR_NOTAVAILABLE;      } -    if (!ctx->model_info.dma->api->start_dma) { +    if (!info->api->start_dma) {  	return 0;      } -    return ctx->model_info.dma->api->start_dma(ctx->dma_ctx, dma, flags); +    return info->api->start_dma(ctx->dma_ctx, dma, flags);  }  int pcilib_stop_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx);      if (!info) {  	pcilib_error("DMA is not supported by the device");  	return PCILIB_ERROR_NOTSUPPORTED;      } -    if (!ctx->model_info.dma->api) { +    if (!info->api) {  	pcilib_error("DMA Engine is not configured in the current model");  	return PCILIB_ERROR_NOTAVAILABLE;      } -    if (!ctx->model_info.dma->api->stop_dma) { +    if (!info->api->stop_dma) {  	return 0;      } -    return ctx->model_info.dma->api->stop_dma(ctx->dma_ctx, dma, flags); +    return info->api->stop_dma(ctx->dma_ctx, dma, flags);  }  int pcilib_enable_irq(pcilib_t *ctx, pcilib_irq_type_t irq_type, pcilib_dma_flags_t flags) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx); -    if ((!info)||(!ctx->model_info.dma->api)||(!ctx->model_info.dma->api->enable_irq)) return 0; +    if ((!info)||(!info->api)||(!info->api->enable_irq)) return 0; -    return ctx->model_info.dma->api->enable_irq(ctx->dma_ctx, irq_type, flags); +    return info->api->enable_irq(ctx->dma_ctx, irq_type, flags);  }  int pcilib_disable_irq(pcilib_t *ctx, pcilib_dma_flags_t flags) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx); -    if ((!info)||(!ctx->model_info.dma->api)||(!ctx->model_info.dma->api->disable_irq)) return 0; +    if ((!info)||(!info->api)||(!info->api->disable_irq)) return 0; -    return ctx->model_info.dma->api->disable_irq(ctx->dma_ctx, flags); +    return info->api->disable_irq(ctx->dma_ctx, flags);  }  int pcilib_acknowledge_irq(pcilib_t *ctx, pcilib_irq_type_t irq_type, pcilib_irq_source_t irq_source) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx); -    if ((!info)||(!ctx->model_info.dma->api)||(!ctx->model_info.dma->api->acknowledge_irq)) return 0; +    if ((!info)||(!info->api)||(!info->api->acknowledge_irq)) return 0; -    return ctx->model_info.dma->api->acknowledge_irq(ctx->dma_ctx, irq_type, irq_source); +    return info->api->acknowledge_irq(ctx->dma_ctx, irq_type, irq_source);  }  typedef struct { @@ -203,18 +201,18 @@ static int pcilib_dma_skip_callback(void *arg, pcilib_dma_flags_t flags, size_t  }  int pcilib_stream_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, pcilib_dma_callback_t cb, void *cbattr) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx);      if (!info) {  	pcilib_error("DMA is not supported by the device");  	return PCILIB_ERROR_NOTSUPPORTED;      } -    if (!ctx->model_info.dma->api) { +    if (!info->api) {  	pcilib_error("DMA Engine is not configured in the current model");  	return PCILIB_ERROR_NOTAVAILABLE;      } -    if (!ctx->model_info.dma->api->stream) { +    if (!info->api->stream) {  	pcilib_error("The DMA read is not supported by configured DMA engine");  	return PCILIB_ERROR_NOTSUPPORTED;      } @@ -230,7 +228,7 @@ int pcilib_stream_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, si  	return PCILIB_ERROR_NOTSUPPORTED;      } -    return ctx->model_info.dma->api->stream(ctx->dma_ctx, dma, addr, size, flags, timeout, cb, cbattr); +    return info->api->stream(ctx->dma_ctx, dma, addr, size, flags, timeout, cb, cbattr);  }  int pcilib_read_dma_custom(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *read_bytes) { @@ -280,18 +278,18 @@ int pcilib_skip_dma(pcilib_t *ctx, pcilib_dma_engine_t dma) {  int pcilib_push_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *written) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx);      if (!info) {  	pcilib_error("DMA is not supported by the device");  	return PCILIB_ERROR_NOTSUPPORTED;      } -    if (!ctx->model_info.dma->api) { +    if (!info->api) {  	pcilib_error("DMA Engine is not configured in the current model");  	return PCILIB_ERROR_NOTAVAILABLE;      } -    if (!ctx->model_info.dma->api->push) { +    if (!info->api->push) {  	pcilib_error("The DMA write is not supported by configured DMA engine");  	return PCILIB_ERROR_NOTSUPPORTED;      } @@ -307,7 +305,7 @@ int pcilib_push_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size  	return PCILIB_ERROR_NOTSUPPORTED;      } -    return ctx->model_info.dma->api->push(ctx->dma_ctx, dma, addr, size, flags, timeout, buf, written); +    return info->api->push(ctx->dma_ctx, dma, addr, size, flags, timeout, buf, written);  } @@ -316,38 +314,38 @@ int pcilib_write_dma(pcilib_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, siz  }  double pcilib_benchmark_dma(pcilib_t *ctx, pcilib_dma_engine_addr_t dma, uintptr_t addr, size_t size, size_t iterations, pcilib_dma_direction_t direction) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx);      if (!info) {  	pcilib_error("DMA is not supported by the device");  	return 0;      } -    if (!ctx->model_info.dma->api) { +    if (!info->api) {  	pcilib_error("DMA Engine is not configured in the current model");  	return -1;      } -    if (!ctx->model_info.dma->api->benchmark) { +    if (!info->api->benchmark) {  	pcilib_error("The DMA benchmark is not supported by configured DMA engine");  	return -1;      } -    return ctx->model_info.dma->api->benchmark(ctx->dma_ctx, dma, addr, size, iterations, direction); +    return info->api->benchmark(ctx->dma_ctx, dma, addr, size, iterations, direction);  }  int pcilib_get_dma_status(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers) { -    const pcilib_dma_description_t *info =  pcilib_get_dma_info(ctx); +    const pcilib_dma_description_t *info =  pcilib_get_dma_description(ctx);      if (!info) {  	pcilib_error("DMA is not supported by the device");  	return 0;      } -    if (!ctx->model_info.dma->api) { +    if (!info->api) {  	pcilib_error("DMA Engine is not configured in the current model");  	return -1;      } -    if (!ctx->model_info.dma->api->status) { +    if (!info->api->status) {  	memset(status, 0, sizeof(pcilib_dma_engine_status_t));  	return -1;     } @@ -358,5 +356,5 @@ int pcilib_get_dma_status(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_eng  	return -1;      } -    return ctx->model_info.dma->api->status(ctx->dma_ctx, dma, status, n_buffers, buffers); +    return info->api->status(ctx->dma_ctx, dma, status, n_buffers, buffers);  } diff --git a/pcilib/dma.h b/pcilib/dma.h new file mode 100644 index 0000000..83bc0fd --- /dev/null +++ b/pcilib/dma.h @@ -0,0 +1,85 @@ +#ifndef _PCILIB_DMA_H +#define _PCILIB_DMA_H + +#define PCILIB_DMA_BUFFER_INVALID ((size_t)-1) + +typedef struct { +    int used;					/**< Indicates if buffer has unread data or empty and ready for DMA */ +    int error;					/**< Indicates if data is complete and correctly transfered or some error occured during the DMA transfer */ +    int first;					/**< Indicates the first buffer of the packet */ +    int last;					/**< Indicates the last buffer of the packet */ +    size_t size;				/**< Indicates number of bytes actually written to the buffer */ +} pcilib_dma_buffer_status_t; + +typedef struct { +    int started;				/**< Informs if the engine is currently started or not */ +    size_t ring_size, buffer_size;		/**< The number of allocated DMA buffers and size of each buffer in bytes */ +    size_t ring_head, ring_tail;		/**< The first and the last buffer containing the data */ +} pcilib_dma_engine_status_t; + +typedef enum { +    PCILIB_DMA_TYPE_BLOCK,			/**< Simple DMA engine */ +    PCILIB_DMA_TYPE_PACKET,			/**< Streaming (scatter-gather) DMA engine */ +    PCILIB_DMA_TYPE_UNKNOWN +} pcilib_dma_engine_type_t; + +typedef struct { +    pcilib_dma_engine_addr_t addr;		/**< Address of DMA engine (from 0) */ +    pcilib_dma_engine_type_t type;		/**< Type of DMA engine */ +    pcilib_dma_direction_t direction;		/**< Defines which kind of transfer does engine support: C2S, S2C, or both */ +    size_t addr_bits;				/**< Number of addressable bits in the system memory (we currently work with 32-bits only) */ + +    const char *name;				/**< Defines a short name of engine (its main use, i.e. main, auxilliary, etc.) */ +    const char *description;			/**< Defines a longer description of the engine */ +} pcilib_dma_engine_description_t; + +/* +typedef struct { +    int ignore_eop; +} pcilib_dma_parameters_t; +*/ + +typedef struct { +//    pcilib_dma_parameters_t params; +    pcilib_t *pcilib;				/**< Reference to the pcilib context */ +} pcilib_dma_context_t; + +typedef struct { +    pcilib_dma_context_t *(*init)(pcilib_t *ctx, const char *model, const void *arg); +    void (*free)(pcilib_dma_context_t *ctx); +     +    int (*status)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers); + +    int (*enable_irq)(pcilib_dma_context_t *ctx, pcilib_irq_type_t irq_type, pcilib_dma_flags_t flags); +    int (*disable_irq)(pcilib_dma_context_t *ctx, pcilib_dma_flags_t flags); +    int (*acknowledge_irq)(pcilib_dma_context_t *ctx, pcilib_irq_type_t irq_type, pcilib_irq_source_t irq_source); + +    int (*start_dma)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags); +    int (*stop_dma)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_flags_t flags); + +    int (*push)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, void *buf, size_t *written); +    int (*stream)(pcilib_dma_context_t *ctx, pcilib_dma_engine_t dma, uintptr_t addr, size_t size, pcilib_dma_flags_t flags, pcilib_timeout_t timeout, pcilib_dma_callback_t cb, void *cbattr); + +    double (*benchmark)(pcilib_dma_context_t *ctx, pcilib_dma_engine_addr_t dma, uintptr_t addr, size_t size, size_t iterations, pcilib_dma_direction_t direction); +} pcilib_dma_api_description_t; + + +typedef struct { +    const pcilib_dma_api_description_t *api;				/**< Defines all API functions for DMA operation */ +    const pcilib_register_bank_description_t *banks;			/**< Pre-defined register banks exposed by DMA interface, additional banks can be defined during DMA initialization */ +    const pcilib_register_description_t *registers;			/**< Pre-defined registers exposed by DMA interface, additional registers can be defined during DMA initialization */ +    const pcilib_dma_engine_description_t *engines;			/**< List of DMA engines exposed by DMA interface, alternatively engines can be added during DMA initialization */ +    const char *model;							/**< If NULL, the actually used event model is used instead */ +    const void *args;							/**< Custom DMA-specific arguments. The actual structure may depend on the specified model */ +    const char *name;							/**< Short name of DMA interface */ +    const char *description;						/**< A bit longer description of DMA interface */ +} pcilib_dma_description_t; + + +const pcilib_dma_description_t *pcilib_get_dma_description(pcilib_t *ctx); +pcilib_dma_engine_t pcilib_add_dma_engine(pcilib_t *ctx, pcilib_dma_engine_description_t *desc); +int pcilib_get_dma_status(pcilib_t *ctx, pcilib_dma_engine_t dma, pcilib_dma_engine_status_t *status, size_t n_buffers, pcilib_dma_buffer_status_t *buffers); +int pcilib_init_dma(pcilib_t *ctx); + + +#endif /* _PCILIB_DMA_H */ @@ -59,7 +59,6 @@ int pcilib_init_event_engine(pcilib_t *ctx) {      api = model_info->api; -//    api = pcilib_model[model].api;      if ((api)&&(api->init)) {  	ctx->event_ctx = api->init(ctx);  	if (ctx->event_ctx) { @@ -1,7 +1,7 @@  #ifndef _PCILIB_EVENT_H  #define _PCILIB_EVENT_H -#include "pcilib.h" +#include <pcilib.h>  typedef struct {      size_t max_events; diff --git a/linux-3.10.h b/pcilib/linux-3.10.h index 161d2aa..161d2aa 100644 --- a/linux-3.10.h +++ b/pcilib/linux-3.10.h @@ -1,14 +1,15 @@  #ifndef _PCILIB_MODEL_H  #define _PCILIB_MODEL_H -#include <bank.h> -#include <register.h> -#include <dma.h> -#include <event.h> +#include <pcilib/bank.h> +#include <pcilib/register.h> +#include <pcilib/dma.h> +#include <pcilib/event.h> +#include <pcilib/config.h>  typedef struct { -    uint8_t access; -    pcilib_endianess_t endianess; +    const pcilib_event_api_description_t *api; +    const pcilib_dma_description_t *dma;      const pcilib_register_description_t *registers;      const pcilib_register_bank_description_t *banks; @@ -18,9 +19,6 @@ typedef struct {      const pcilib_event_description_t *events;      const pcilib_event_data_type_description_t *data_types; -    const pcilib_dma_description_t *dma; -    const pcilib_event_api_description_t *api; -      const char *name;      const char *description;  } pcilib_model_description_t; @@ -444,10 +444,8 @@ void pcilib_close(pcilib_t *ctx) {      if (ctx) {  	const pcilib_model_description_t *model_info = pcilib_get_model_description(ctx);  	const pcilib_event_api_description_t *eapi = model_info->api; -	const pcilib_dma_api_description_t *dapi = NULL; +	const pcilib_dma_api_description_t *dapi = ctx->dma.api; -	if (model_info->dma) dapi = model_info->dma->api; -          if ((eapi)&&(eapi->free)) eapi->free(ctx->event_ctx);          if ((dapi)&&(dapi->free)) dapi->free(ctx->dma_ctx); diff --git a/pcilib.h b/pcilib/pcilib.h index 3518f75..3518f75 100644 --- a/pcilib.h +++ b/pcilib/pcilib.h diff --git a/register.c b/pcilib/register.c index 8d138b8..8d138b8 100644 --- a/register.c +++ b/pcilib/register.c diff --git a/register.h b/pcilib/register.h index cd13522..89673ec 100644 --- a/register.h +++ b/pcilib/register.h @@ -2,7 +2,7 @@  #define _PCILIB_REGISTER_H  #include <pcilib.h> -#include <bank.h> +#include <pcilib/bank.h>  typedef enum {      PCILIB_REGISTER_R = 1,			/**< reading from register is allowed */ diff --git a/pcitool/CMakeLists.txt b/pcitool/CMakeLists.txt index 6dc7942..1b21041 100644 --- a/pcitool/CMakeLists.txt +++ b/pcitool/CMakeLists.txt @@ -1,8 +1,32 @@  include_directories(      ${CMAKE_SOURCE_DIR} +    ${CMAKE_SOURCE_DIR}/pcilib +    ${FASTWRITER_INCLUDE_DIRS}  ) -set(HEADERS ${HEADERS} sysinfo.h formaters.h) +link_directories( +    ${FASTWRITER_LIBRARY_DIRS} +    ${CMAKE_SOURCE_DIR}/pcilib +) + +if (NOT DISABLE_PCITOOL) +    add_executable(pci cli.c sysinfo.c formaters.c) +    set(HEADERS ${HEADERS} sysinfo.h formaters.h) +    add_dependencies(pci pcitool) +    target_link_libraries(pci pcilib ${FASTWRITER_LIBRARIES}) +    set_target_properties(pci PROPERTIES +	LINK_FLAGS ${CMAKE_THREAD_LIBS_INIT} +    ) + +#set_target_properties(pci PROPERTIES +#    LINK_FLAGS "-Wl,pcitool/libpcitool.a" +#) -add_library(pcitool STATIC sysinfo.c formaters.c) +    if(NOT DEFINED BIN_INSTALL_DIR) +	set(BIN_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/bin") +    endif(NOT DEFINED BIN_INSTALL_DIR) +    install(TARGETS pci +	DESTINATION ${BIN_INSTALL_DIR} +    ) +endif (NOT DISABLE_PCITOOL) @@ -362,7 +362,7 @@ void List(pcilib_t *handle, const pcilib_model_description_t *model_info, const      const pcilib_event_data_type_description_t *types;      const pcilib_board_info_t *board_info = pcilib_get_board_info(handle); -    const pcilib_dma_description_t *dma_info = pcilib_get_dma_info(handle); +    const pcilib_dma_description_t *dma_info = pcilib_get_dma_description(handle);      for (i = 0; i < PCILIB_MAX_BARS; i++) {  	if (board_info->bar_length[i] > 0) { @@ -922,7 +922,7 @@ int ReadRegister(pcilib_t *handle, const pcilib_model_description_t *model_info,  	}      } else {  	    // Adding DMA registers -	pcilib_get_dma_info(handle);	 +	pcilib_get_dma_description(handle);	  	if (model_info->registers) {  	    if (bank) { @@ -1762,7 +1762,7 @@ int StartStopDMA(pcilib_t *handle,  const pcilib_model_description_t *model_info      pcilib_dma_engine_t dmaid;      if (dma == PCILIB_DMA_ENGINE_ADDR_INVALID) { -        const pcilib_dma_description_t *dma_info = pcilib_get_dma_info(handle); +        const pcilib_dma_description_t *dma_info = pcilib_get_dma_description(handle);          if (start) Error("DMA engine should be specified"); @@ -2370,6 +2370,7 @@ int main(int argc, char **argv) {      const char *model = NULL;      const pcilib_model_description_t *model_info; +    const pcilib_dma_description_t *dma_info;      MODE mode = MODE_INVALID;      GRAB_MODE grab_mode = 0;      size_t trigger_time = 0; @@ -2847,6 +2848,7 @@ int main(int argc, char **argv) {      if (handle < 0) Error("Failed to open FPGA device: %s", fpga_device);      model_info = pcilib_get_model_description(handle); +    dma_info = pcilib_get_dma_description(handle);      switch (mode) {       case MODE_WRITE: @@ -2873,7 +2875,7 @@ int main(int argc, char **argv) {          else Usage(argc, argv, "The %i data values is specified, but %i required", argc - optind, size);       case MODE_READ:          if (!addr) { -	    if (((!model_info->dma)||(!model_info->dma->api))&&(!model_info->api)) { +	    if (((!dma_info)||(!dma_info->api))&&(!model_info->api)) {  //	    if (model == PCILIB_MODEL_PCI) {  		if ((amode != ACCESS_DMA)&&(amode != ACCESS_CONFIG))   		    Usage(argc, argv, "The address is not specified"); diff --git a/protocols/CMakeLists.txt b/protocols/CMakeLists.txt index 5f64a43..3c1d75b 100644 --- a/protocols/CMakeLists.txt +++ b/protocols/CMakeLists.txt @@ -1,8 +1,8 @@  include_directories(      ${CMAKE_SOURCE_DIR} +    ${CMAKE_SOURCE_DIR}/pcilib  ) -  set(HEADERS ${HEADERS} default.h)  add_library(protocols STATIC default.c) diff --git a/protocols/default.h b/protocols/default.h index f8685f1..f535550 100644 --- a/protocols/default.h +++ b/protocols/default.h @@ -8,7 +8,7 @@ int pcilib_default_read(pcilib_t *ctx, pcilib_register_bank_context_t *bank, pci  int pcilib_default_write(pcilib_t *ctx, pcilib_register_bank_context_t *bank, pcilib_register_addr_t addr, pcilib_register_value_t value);  #ifdef _PCILIB_CONFIG_C -static pcilib_register_protocol_api_description_t pcilib_default_protocol_api = +const pcilib_register_protocol_api_description_t pcilib_default_protocol_api =      { NULL, NULL, pcilib_default_read, pcilib_default_write };  #endif /* _PCILIB_CONFIG_C */ diff --git a/tests/grab.sh b/tests/grab.sh index daf142e..daa08c1 100755 --- a/tests/grab.sh +++ b/tests/grab.sh @@ -1,8 +1,8 @@  #! /bin/bash  function pci { -    PCILIB_PATH="/root/pcitool" -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci $* +    PCILIB_PATH=".." +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $*  }  rm -f images.raw diff --git a/tests/ipedma/ipecamera-frame.sh b/tests/ipedma/ipecamera-frame.sh index 9862432..5e72c6c 100755 --- a/tests/ipedma/ipecamera-frame.sh +++ b/tests/ipedma/ipecamera-frame.sh @@ -5,7 +5,7 @@ TESTS_PATH="`( cd \"$TESTS_PATH\" && pwd )`"  function pci {      PCILIB_PATH=$TESTS_PATH/../.. -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci -m ipedma $* +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci -m ipedma $*  } diff --git a/tests/ipedma/ipecamera-test.sh b/tests/ipedma/ipecamera-test.sh index 3984c82..cd21391 100755 --- a/tests/ipedma/ipecamera-test.sh +++ b/tests/ipedma/ipecamera-test.sh @@ -4,7 +4,7 @@ size=65536  function pci {      PCILIB_PATH=`pwd`/../.. -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci -m ipedma $* +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci -m ipedma $*  } diff --git a/tests/ipedma/test.sh b/tests/ipedma/test.sh index 4054f8a..62c391a 100755 --- a/tests/ipedma/test.sh +++ b/tests/ipedma/test.sh @@ -4,7 +4,7 @@ size=65536  function pci {      PCILIB_PATH=`pwd`/../.. -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci -m ipedma $* +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci -m ipedma $*  } diff --git a/tests/nwldma/bench.sh b/tests/nwldma/bench.sh index b36c251..d0bf323 100755 --- a/tests/nwldma/bench.sh +++ b/tests/nwldma/bench.sh @@ -1,8 +1,8 @@  #!/bin/bash  function pci { -    PCILIB_PATH="/root/pcitool" -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci $* +    PCILIB_PATH="../.." +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $*  }  size=16 diff --git a/tests/nwldma/cleanup.sh b/tests/nwldma/cleanup.sh index 5ef568e..87e1517 100755 --- a/tests/nwldma/cleanup.sh +++ b/tests/nwldma/cleanup.sh @@ -1,8 +1,8 @@  #!/bin/bash  function pci { -    PCILIB_PATH="/root/pcitool" -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci $* +    PCILIB_PATH="../.." +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $*  }  pci --start-dma dma1r diff --git a/tests/test-iommu.sh b/tests/test-iommu.sh index 74e3ece..5a5924b 100755 --- a/tests/test-iommu.sh +++ b/tests/test-iommu.sh @@ -1,5 +1,10 @@  #! /bin/bash +function pci { +    PCILIB_PATH=".." +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $* +} +  i=1  while [ 1 ]; do      pci --start-dma dma1r diff --git a/tests/xilinxdma/xilinx_dma.sh b/tests/xilinxdma/xilinx_dma.sh index 6aada8b..4fedac3 100755 --- a/tests/xilinxdma/xilinx_dma.sh +++ b/tests/xilinxdma/xilinx_dma.sh @@ -6,8 +6,8 @@ ITERATIONS=2  BUFFERS=16  function pci { -    PCILIB_PATH=`pwd`/.. -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci $* +    PCILIB_PATH=`pwd`/../.. +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $*  } diff --git a/tests/xilinxdma/xilinx_dma_static_mem.sh b/tests/xilinxdma/xilinx_dma_static_mem.sh index e3ba0f5..23ee5c9 100755 --- a/tests/xilinxdma/xilinx_dma_static_mem.sh +++ b/tests/xilinxdma/xilinx_dma_static_mem.sh @@ -8,7 +8,7 @@ BUFFER_SIZE=8  function pci {      PCILIB_PATH=`pwd`/.. -    LD_LIBRARY_PATH="$PCILIB_PATH" $PCILIB_PATH/pci $* +    LD_LIBRARY_PATH="$PCILIB_PATH/pcilib" $PCILIB_PATH/pcitool/pci $*  } | 
