summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dma/ipe.h8
-rw-r--r--pcilib/bank.h3
-rw-r--r--pcilib/pcilib.h1
-rw-r--r--protocols/software_registers.c55
4 files changed, 47 insertions, 20 deletions
diff --git a/dma/ipe.h b/dma/ipe.h
index e341a53..cf773d8 100644
--- a/dma/ipe.h
+++ b/dma/ipe.h
@@ -39,7 +39,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_REGISTER_PROTOCOL_DEFAULT, PCILIB_BAR0, 0, 0, 32, 0x0200, PCILIB_LITTLE_ENDIAN, PCILIB_LITTLE_ENDIAN, "0x%lx", "dma", "DMA Registers"},
- { PCILIB_REGISTER_BANK0, PCILIB_REGISTER_PROTOCOL_SOFTWARE_REGISTERS, PCILIB_BAR1, 0, 0, 32, 0x0003, PCILIB_LITTLE_ENDIAN, PCILIB_LITTLE_ENDIAN, "0x%lx", "test", "test Registers"},
+ { PCILIB_REGISTER_BANK_DMA + 1, PCILIB_REGISTER_PROTOCOL_SOFTWARE_REGISTERS, PCILIB_BARUNDEF, 0, 0, 32, 0x0003, PCILIB_LITTLE_ENDIAN, PCILIB_LITTLE_ENDIAN, "0x%lx", "test", "test Registers"},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL }
};
@@ -78,9 +78,9 @@ static const pcilib_register_description_t ipe_dma_registers[] = {
{0x0058, 0, 32, 0, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK_DMA, "last_descriptor_read", "Last descriptor read by the host"},
{0x005C, 0, 32, 0, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK_DMA, "desc_mem_addr", "Number of descriptors configured"},
{0x0060, 0, 32, 0, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK_DMA, "update_thresh", "Update threshold of progress register"},
- {0x0001, 0, 32, 0x1, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "test1", "ister"},
- {0x0002, 0, 32, 0, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "test2", "ter"},
- {0x0003, 0, 32, 0x020, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK0, "test3", "er"},
+ {0x0001, 0, 32, 0x1, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK_DMA +1, "test1", "ister"},
+ {0x0002, 0, 32, 0, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK_DMA +1, "test2", "ter"},
+ {0x0003, 0, 32, 0x020, 0x00000000, PCILIB_REGISTER_RW , PCILIB_REGISTER_STANDARD, PCILIB_REGISTER_BANK_DMA +1, "test3", "er"},
{0, 0, 0, 0, 0x00000000, 0, 0, 0, NULL, NULL}
};
#endif /* _PCILIB_EXPORT_C */
diff --git a/pcilib/bank.h b/pcilib/bank.h
index df4df83..dfd2adb 100644
--- a/pcilib/bank.h
+++ b/pcilib/bank.h
@@ -15,7 +15,6 @@
#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_KERNEL 32 /**< Protocol with registers registered in kernel directly*/
#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_PROTOCOL_SOFTWARE_REGISTERS 32
@@ -88,7 +87,7 @@ 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 */
xmlNodeSetPtr banks_nodes;
- void *bank_software_register_adress;
+ void *kmem_base_address;
pcilib_t *ctx;
};
diff --git a/pcilib/pcilib.h b/pcilib/pcilib.h
index 6d241c6..6c1d592 100644
--- a/pcilib/pcilib.h
+++ b/pcilib/pcilib.h
@@ -87,6 +87,7 @@ typedef struct {
#define PCILIB_BAR_INVALID ((pcilib_bar_t)-1)
#define PCILIB_BAR0 0
#define PCILIB_BAR1 1
+#define PCILIB_BARUNDEF -1
#define PCILIB_DMA_ENGINE_INVALID ((pcilib_dma_engine_t)-1)
#define PCILIB_DMA_ENGINE_ALL ((pcilib_dma_engine_t)-1)
#define PCILIB_DMA_FLAGS_DEFAULT ((pcilib_dma_flags_t)0)
diff --git a/protocols/software_registers.c b/protocols/software_registers.c
index 68655e0..ab5d31d 100644
--- a/protocols/software_registers.c
+++ b/protocols/software_registers.c
@@ -8,6 +8,7 @@
#include "pcilib.h"
#include "pci.h"
+#include <stdio.h>
/**
* pcilib_software_registers_open
@@ -20,27 +21,39 @@
*/
pcilib_register_bank_context_t* pcilib_software_registers_open(pcilib_t *ctx, pcilib_register_bank_t bank,const char* model, const void *args){
pcilib_register_bank_context_t* bank_ctx;
- pcilib_kmem_handle_t *test;
+ pcilib_kmem_handle_t *handle;
int j;
+ /* the protocol thing is here to make sure to avoid segfault in write_registers_internal, but is not useful as it is now*/
+ pcilib_register_protocol_t protocol;
+ protocol = pcilib_find_register_protocol_by_addr(ctx, ctx->banks[bank].protocol);
bank_ctx=calloc(1,sizeof(pcilib_register_bank_context_t));
bank_ctx->bank=ctx->banks + bank;
+ bank_ctx->ctx=ctx;
+ bank_ctx->api=ctx->protocols[protocol].api;
+ ctx->bank_ctx[bank]=bank_ctx;
+
+ handle=pcilib_alloc_kernel_memory(ctx, PCILIB_KMEM_TYPE_PAGE, 1, 0, 1,PCILIB_KMEM_USE_STANDARD,PCILIB_KMEM_FLAG_REUSE|PCILIB_KMEM_FLAG_PERSISTENT);
+
+ if (!handle)pcilib_error("allocation of kernel memory for registers has failed");
- test=pcilib_alloc_kernel_memory(ctx, 0, 0, 0, 0,PCILIB_KMEM_USE_STANDARD,PCILIB_KMEM_FLAG_REUSE|PCILIB_KMEM_FLAG_PERSISTENT);
- if (!test)pcilib_error("allocation of kernel memory for registers has failed");
+ bank_ctx->kmem_base_address=handle;
- if(pcilib_kmem_is_reused(ctx,test)== PCILIB_KMEM_REUSE_ALLOCATED){
- bank_ctx->bank_software_register_adress=test;
- }else{
- bank_ctx->bank_software_register_adress=test;
+ if(pcilib_kmem_is_reused(ctx,handle)!= PCILIB_KMEM_REUSE_ALLOCATED){
j=0;
while(ctx->model_info.registers[j].name!=NULL){
if(ctx->model_info.registers[j].bank==(ctx->banks+bank)->addr){
- pcilib_write_register_by_id(ctx,ctx->model_info.registers[j].addr,ctx->model_info.registers[j].defvalue);
+ /* !!!!!warning!!!!!
+ hey suren,
+ you may check here too :the programm seems to always go this path, so pcilib_write_register_by_id always write the original value, kmem_is_reused working?
+ */
+ pcilib_write_register_by_id(ctx,j,ctx->model_info.registers[j].defvalue);
+
}
j++;
}
}
+
return bank_ctx;
}
@@ -51,11 +64,11 @@ pcilib_register_bank_context_t* pcilib_software_registers_open(pcilib_t *ctx, pc
* @param[in] bank_ctx the bank context running that we get from the initialisation function
*/
void pcilib_software_registers_close(pcilib_register_bank_context_t *bank_ctx){
- int err=1;
-
- err=pcilib_clean_kernel_memory(bank_ctx->ctx, 0, 0);
+ /*!!!!! to check!!!!
- if(err) pcilib_error("Error closing register kernel space");
+ ps: i am using uint32_t to calculate registers adress, may it change in the future? should we define some #define?
+ */
+ pcilib_free_kernel_memory(bank_ctx->ctx,bank_ctx->kmem_base_address, 0);
}
/**
@@ -68,7 +81,14 @@ void pcilib_software_registers_close(pcilib_register_bank_context_t *bank_ctx){
* @return 0 in case of success
*/
int pcilib_software_registers_read(pcilib_t *ctx, pcilib_register_bank_context_t *bank_ctx,pcilib_register_addr_t addr, pcilib_register_value_t *value){
- *value= *(pcilib_register_value_t*) bank_ctx->bank_software_register_adress+addr;
+ int i;
+ void* base_addr;
+
+ base_addr=pcilib_kmem_get_block_ua(ctx,bank_ctx->kmem_base_address,0);
+ for(i=0;ctx->registers[i].name!=NULL;i++){
+ if(ctx->registers[i].addr==addr) break;
+ }
+ *value=*(pcilib_register_value_t*)(base_addr+i*sizeof(uint32_t));
return 0;
}
@@ -82,6 +102,13 @@ int pcilib_software_registers_read(pcilib_t *ctx, pcilib_register_bank_context_t
* @return 0 in case of success
*/
int pcilib_software_registers_write(pcilib_t *ctx, pcilib_register_bank_context_t *bank_ctx, pcilib_register_addr_t addr, pcilib_register_value_t value){
- *(pcilib_register_value_t*)(bank_ctx->bank_software_register_adress+addr)=value;
+ int i;
+ void* base_addr;
+
+ base_addr=pcilib_kmem_get_block_ua(ctx,bank_ctx->kmem_base_address,0);
+ for(i=0;ctx->registers[i].name!=NULL;i++){
+ if(ctx->registers[i].addr==addr) break;
+ }
+ *(pcilib_register_value_t*)(base_addr+i*sizeof(uint32_t))=value;
return 0;
}