11599121bSAlistair Francis /* 21599121bSAlistair Francis * Register Definition API 31599121bSAlistair Francis * 41599121bSAlistair Francis * Copyright (c) 2016 Xilinx Inc. 51599121bSAlistair Francis * Copyright (c) 2013 Peter Crosthwaite <peter.crosthwaite@xilinx.com> 61599121bSAlistair Francis * 71599121bSAlistair Francis * This work is licensed under the terms of the GNU GPL, version 2. See 81599121bSAlistair Francis * the COPYING file in the top-level directory. 91599121bSAlistair Francis */ 101599121bSAlistair Francis 111599121bSAlistair Francis #ifndef REGISTER_H 121599121bSAlistair Francis #define REGISTER_H 131599121bSAlistair Francis 141599121bSAlistair Francis #include "exec/memory.h" 151599121bSAlistair Francis 161599121bSAlistair Francis typedef struct RegisterInfo RegisterInfo; 171599121bSAlistair Francis typedef struct RegisterAccessInfo RegisterAccessInfo; 18*0b73c9bbSAlistair Francis typedef struct RegisterInfoArray RegisterInfoArray; 191599121bSAlistair Francis 201599121bSAlistair Francis /** 211599121bSAlistair Francis * Access description for a register that is part of guest accessible device 221599121bSAlistair Francis * state. 231599121bSAlistair Francis * 241599121bSAlistair Francis * @name: String name of the register 251599121bSAlistair Francis * @ro: whether or not the bit is read-only 261599121bSAlistair Francis * @w1c: bits with the common write 1 to clear semantic. 271599121bSAlistair Francis * @reset: reset value. 281599121bSAlistair Francis * @cor: Bits that are clear on read 291599121bSAlistair Francis * @rsvd: Bits that are reserved and should not be changed 301599121bSAlistair Francis * 311599121bSAlistair Francis * @pre_write: Pre write callback. Passed the value that's to be written, 321599121bSAlistair Francis * immediately before the actual write. The returned value is what is written, 331599121bSAlistair Francis * giving the handler a chance to modify the written value. 341599121bSAlistair Francis * @post_write: Post write callback. Passed the written value. Most write side 351599121bSAlistair Francis * effects should be implemented here. 361599121bSAlistair Francis * 371599121bSAlistair Francis * @post_read: Post read callback. Passes the value that is about to be returned 381599121bSAlistair Francis * for a read. The return value from this function is what is ultimately read, 391599121bSAlistair Francis * allowing this function to modify the value before return to the client. 401599121bSAlistair Francis */ 411599121bSAlistair Francis 421599121bSAlistair Francis struct RegisterAccessInfo { 431599121bSAlistair Francis const char *name; 441599121bSAlistair Francis uint64_t ro; 451599121bSAlistair Francis uint64_t w1c; 461599121bSAlistair Francis uint64_t reset; 471599121bSAlistair Francis uint64_t cor; 481599121bSAlistair Francis uint64_t rsvd; 491599121bSAlistair Francis uint64_t unimp; 501599121bSAlistair Francis 511599121bSAlistair Francis uint64_t (*pre_write)(RegisterInfo *reg, uint64_t val); 521599121bSAlistair Francis void (*post_write)(RegisterInfo *reg, uint64_t val); 531599121bSAlistair Francis 541599121bSAlistair Francis uint64_t (*post_read)(RegisterInfo *reg, uint64_t val); 55*0b73c9bbSAlistair Francis 56*0b73c9bbSAlistair Francis hwaddr addr; 571599121bSAlistair Francis }; 581599121bSAlistair Francis 591599121bSAlistair Francis /** 601599121bSAlistair Francis * A register that is part of guest accessible state 611599121bSAlistair Francis * @data: pointer to the register data. Will be cast 621599121bSAlistair Francis * to the relevant uint type depending on data_size. 631599121bSAlistair Francis * @data_size: Size of the register in bytes. Must be 641599121bSAlistair Francis * 1, 2, 4 or 8 651599121bSAlistair Francis * 661599121bSAlistair Francis * @access: Access description of this register 671599121bSAlistair Francis * 681599121bSAlistair Francis * @debug: Whether or not verbose debug is enabled 691599121bSAlistair Francis * @prefix: String prefix for log and debug messages 701599121bSAlistair Francis * 711599121bSAlistair Francis * @opaque: Opaque data for the register 721599121bSAlistair Francis */ 731599121bSAlistair Francis 741599121bSAlistair Francis struct RegisterInfo { 751599121bSAlistair Francis /* <public> */ 761599121bSAlistair Francis void *data; 771599121bSAlistair Francis int data_size; 781599121bSAlistair Francis 791599121bSAlistair Francis const RegisterAccessInfo *access; 801599121bSAlistair Francis 811599121bSAlistair Francis void *opaque; 821599121bSAlistair Francis }; 831599121bSAlistair Francis 841599121bSAlistair Francis /** 85*0b73c9bbSAlistair Francis * This structure is used to group all of the individual registers which are 86*0b73c9bbSAlistair Francis * modeled using the RegisterInfo structure. 87*0b73c9bbSAlistair Francis * 88*0b73c9bbSAlistair Francis * @r is an aray containing of all the relevent RegisterInfo structures. 89*0b73c9bbSAlistair Francis * 90*0b73c9bbSAlistair Francis * @num_elements is the number of elements in the array r 91*0b73c9bbSAlistair Francis * 92*0b73c9bbSAlistair Francis * @mem: optional Memory region for the register 93*0b73c9bbSAlistair Francis */ 94*0b73c9bbSAlistair Francis 95*0b73c9bbSAlistair Francis struct RegisterInfoArray { 96*0b73c9bbSAlistair Francis int num_elements; 97*0b73c9bbSAlistair Francis RegisterInfo **r; 98*0b73c9bbSAlistair Francis 99*0b73c9bbSAlistair Francis bool debug; 100*0b73c9bbSAlistair Francis const char *prefix; 101*0b73c9bbSAlistair Francis }; 102*0b73c9bbSAlistair Francis 103*0b73c9bbSAlistair Francis /** 1041599121bSAlistair Francis * write a value to a register, subject to its restrictions 1051599121bSAlistair Francis * @reg: register to write to 1061599121bSAlistair Francis * @val: value to write 1071599121bSAlistair Francis * @we: write enable mask 1081599121bSAlistair Francis * @prefix: The device prefix that should be printed before the register name 1091599121bSAlistair Francis * @debug: Should the write operation debug information be printed? 1101599121bSAlistair Francis */ 1111599121bSAlistair Francis 1121599121bSAlistair Francis void register_write(RegisterInfo *reg, uint64_t val, uint64_t we, 1131599121bSAlistair Francis const char *prefix, bool debug); 1141599121bSAlistair Francis 1151599121bSAlistair Francis /** 1161599121bSAlistair Francis * read a value from a register, subject to its restrictions 1171599121bSAlistair Francis * @reg: register to read from 1181599121bSAlistair Francis * @re: read enable mask 1191599121bSAlistair Francis * @prefix: The device prefix that should be printed before the register name 1201599121bSAlistair Francis * @debug: Should the read operation debug information be printed? 1211599121bSAlistair Francis * returns: value read 1221599121bSAlistair Francis */ 1231599121bSAlistair Francis 1241599121bSAlistair Francis uint64_t register_read(RegisterInfo *reg, uint64_t re, const char* prefix, 1251599121bSAlistair Francis bool debug); 1261599121bSAlistair Francis 1271599121bSAlistair Francis /** 1281599121bSAlistair Francis * reset a register 1291599121bSAlistair Francis * @reg: register to reset 1301599121bSAlistair Francis */ 1311599121bSAlistair Francis 1321599121bSAlistair Francis void register_reset(RegisterInfo *reg); 1331599121bSAlistair Francis 134*0b73c9bbSAlistair Francis /** 135*0b73c9bbSAlistair Francis * Memory API MMIO write handler that will write to a Register API register. 136*0b73c9bbSAlistair Francis * @opaque: RegisterInfo to write to 137*0b73c9bbSAlistair Francis * @addr: Address to write 138*0b73c9bbSAlistair Francis * @value: Value to write 139*0b73c9bbSAlistair Francis * @size: Number of bytes to write 140*0b73c9bbSAlistair Francis */ 141*0b73c9bbSAlistair Francis 142*0b73c9bbSAlistair Francis void register_write_memory(void *opaque, hwaddr addr, uint64_t value, 143*0b73c9bbSAlistair Francis unsigned size); 144*0b73c9bbSAlistair Francis 145*0b73c9bbSAlistair Francis /** 146*0b73c9bbSAlistair Francis * Memory API MMIO read handler that will read from a Register API register. 147*0b73c9bbSAlistair Francis * @opaque: RegisterInfo to read from 148*0b73c9bbSAlistair Francis * @addr: Address to read 149*0b73c9bbSAlistair Francis * @size: Number of bytes to read 150*0b73c9bbSAlistair Francis * returns: Value read from register 151*0b73c9bbSAlistair Francis */ 152*0b73c9bbSAlistair Francis 153*0b73c9bbSAlistair Francis uint64_t register_read_memory(void *opaque, hwaddr addr, unsigned size); 154*0b73c9bbSAlistair Francis 1551599121bSAlistair Francis #endif 156