diff options
Diffstat (limited to 'protocols/software_registers.c')
| -rw-r--r-- | protocols/software_registers.c | 114 |
1 files changed, 0 insertions, 114 deletions
diff --git a/protocols/software_registers.c b/protocols/software_registers.c deleted file mode 100644 index ab5d31d..0000000 --- a/protocols/software_registers.c +++ /dev/null @@ -1,114 +0,0 @@ -#include <string.h> -#include <sys/file.h> -#include <unistd.h> - -#include "model.h" -#include "error.h" -#include "kmem.h" -#include "pcilib.h" -#include "pci.h" - -#include <stdio.h> - -/** - * pcilib_software_registers_open - * this function initializes the kernel space memory and stores in it the default values of the registers of the given bank index, if it was not initialized by a concurrent process, and return a bank context containing the adress of this kernel space. It the kernel space memory was already initialized by a concurrent process, then this function just return the bank context with the adress of this kernel space already used - *@param[in] ctx the pcilib_t structure running - * @param[in] bank the bank index that will permits to get the bank we want registers from - * @param[in] model not used - * @param[in] args not used - *@return a bank context with the adress of the kernel space memory related to it - */ -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 *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"); - - bank_ctx->kmem_base_address=handle; - - 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){ - /* !!!!!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; -} - - -/** - * pcilib_software_registers_close - * this function clear the kernel memory space that could have been allocated for software registers - * @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){ - /*!!!!! to check!!!! - - 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); -} - -/** - * pcilib_software_registers_read - * this function read the value of a said register in the kernel space - * @param[in] ctx the pcilib_t structure runnning - * @param[in] bank_ctx the bank context that was returned by the initialisation function - * @param[in] addr the adress of the register we want to read - *@param[out] value the value of the register - * @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){ - 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; -} - -/** - * pcilib_software_registers_write - * this function write the said value to a said register in the kernel space - * @param[in] ctx the pcilib_t structure runnning - * @param[in] bank_ctx the bank context that was returned by the initialisation function - * @param[in] addr the adress of the register we want to write in - *@param[out] value the value we want to write in the register - * @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){ - 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; -} |
