xref: /qemu/include/hw/register.h (revision 0b73c9bb)
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