ReactOS 0.4.16-dev-1946-g52006dd
registers.c File Reference
Include dependency graph for registers.c:

Go to the source code of this file.

Classes

struct  register_spec
 
struct  register_mapping
 
struct  register_field
 

Enumerations

enum  register_kind { REGISTER_KIND_GAS , REGISTER_KIND_IO }
 
enum  register_access_kind { REGISTER_ACCESS_KIND_PRESERVE , REGISTER_ACCESS_KIND_WRITE_TO_CLEAR , REGISTER_ACCESS_KIND_NORMAL }
 
enum  register_mapping_state { REGISTER_MAPPING_STATE_NONE = 0 , REGISTER_MAPPING_STATE_NOT_NEEDED , REGISTER_MAPPING_STATE_MAPPED }
 

Functions

static uacpi_status map_one (const struct register_spec *spec, struct register_mapping *mapping, uacpi_u8 idx)
 
static uacpi_status ensure_register_mapped (const struct register_spec *spec, struct register_mapping *mapping)
 
static uacpi_status get_reg (uacpi_u8 idx, const struct register_spec **out_spec, struct register_mapping **out_mapping)
 
static uacpi_status do_read_one (struct register_mapping *mapping, uacpi_u8 idx, uacpi_u64 *out_value)
 
static uacpi_status do_read_register (const struct register_spec *reg, struct register_mapping *mapping, uacpi_u64 *out_value)
 
uacpi_status uacpi_read_register (enum uacpi_register reg_enum, uacpi_u64 *out_value)
 
static uacpi_status do_write_one (struct register_mapping *mapping, uacpi_u8 idx, uacpi_u64 in_value)
 
static uacpi_status do_write_register (const struct register_spec *reg, struct register_mapping *mapping, uacpi_u64 in_value)
 
uacpi_status uacpi_write_register (enum uacpi_register reg_enum, uacpi_u64 in_value)
 
uacpi_status uacpi_write_registers (enum uacpi_register reg_enum, uacpi_u64 in_value0, uacpi_u64 in_value1)
 
uacpi_status uacpi_initialize_registers (void)
 
void uacpi_deinitialize_registers (void)
 
uacpi_status uacpi_read_register_field (enum uacpi_register_field field_enum, uacpi_u64 *out_value)
 
uacpi_status uacpi_write_register_field (enum uacpi_register_field field_enum, uacpi_u64 in_value)
 

Variables

static uacpi_handle g_reg_lock
 
static const struct register_spec g_registers [UACPI_REGISTER_MAX+1]
 
static struct register_mapping g_register_mappings [UACPI_REGISTER_MAX+1]
 
static const struct register_field g_fields [UACPI_REGISTER_FIELD_MAX+1]
 

Enumeration Type Documentation

◆ register_access_kind

Enumerator
REGISTER_ACCESS_KIND_PRESERVE 
REGISTER_ACCESS_KIND_WRITE_TO_CLEAR 
REGISTER_ACCESS_KIND_NORMAL 

Definition at line 18 of file registers.c.

18 {
22};
@ REGISTER_ACCESS_KIND_PRESERVE
Definition: registers.c:19
@ REGISTER_ACCESS_KIND_NORMAL
Definition: registers.c:21
@ REGISTER_ACCESS_KIND_WRITE_TO_CLEAR
Definition: registers.c:20

◆ register_kind

Enumerator
REGISTER_KIND_GAS 
REGISTER_KIND_IO 

Definition at line 13 of file registers.c.

13 {
16};
@ REGISTER_KIND_IO
Definition: registers.c:15
@ REGISTER_KIND_GAS
Definition: registers.c:14

◆ register_mapping_state

Enumerator
REGISTER_MAPPING_STATE_NONE 
REGISTER_MAPPING_STATE_NOT_NEEDED 
REGISTER_MAPPING_STATE_MAPPED 

Definition at line 99 of file registers.c.

99 {
103};
@ REGISTER_MAPPING_STATE_NOT_NEEDED
Definition: registers.c:101
@ REGISTER_MAPPING_STATE_MAPPED
Definition: registers.c:102
@ REGISTER_MAPPING_STATE_NONE
Definition: registers.c:100

Function Documentation

◆ do_read_one()

static uacpi_status do_read_one ( struct register_mapping mapping,
uacpi_u8  idx,
uacpi_u64 out_value 
)
static

Definition at line 194 of file registers.c.

197{
199 return UACPI_STATUS_OK;
200
201 return uacpi_gas_read_mapped(&mapping->mappings[idx], out_value);
202}
unsigned int idx
Definition: utils.c:41
uacpi_status uacpi_gas_read_mapped(const uacpi_mapped_gas *gas, uacpi_u64 *value)
Definition: io.c:751
@ UACPI_STATUS_OK
Definition: status.h:11
GLenum GLenum GLenum GLenum mapping
Definition: glext.h:9031

Referenced by do_read_register().

◆ do_read_register()

static uacpi_status do_read_register ( const struct register_spec reg,
struct register_mapping mapping,
uacpi_u64 out_value 
)
static

Definition at line 204 of file registers.c.

208{
210 uacpi_u64 value0 = 0, value1 = 0;
211
212 ret = do_read_one(mapping, 0, &value0);
214 return ret;
215
216 ret = do_read_one(mapping, 1, &value1);
218 return ret;
219
220 *out_value = value0 | value1;
221 if (reg->write_only_mask)
222 *out_value &= ~reg->write_only_mask;
223
224 return UACPI_STATUS_OK;
225}
uint64_t uacpi_u64
Definition: types.h:22
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
return ret
Definition: mutex.c:146
static uacpi_status do_read_one(struct register_mapping *mapping, uacpi_u8 idx, uacpi_u64 *out_value)
Definition: registers.c:194
static int reg
Definition: i386-dis.c:1290

Referenced by do_write_register(), uacpi_read_register(), uacpi_read_register_field(), and uacpi_write_register_field().

◆ do_write_one()

static uacpi_status do_write_one ( struct register_mapping mapping,
uacpi_u8  idx,
uacpi_u64  in_value 
)
static

Definition at line 248 of file registers.c.

251{
253 return UACPI_STATUS_OK;
254
255 return uacpi_gas_write_mapped(&mapping->mappings[idx], in_value);
256}
uacpi_status uacpi_gas_write_mapped(const uacpi_mapped_gas *gas, uacpi_u64 value)
Definition: io.c:790

Referenced by do_write_register(), and uacpi_write_registers().

◆ do_write_register()

static uacpi_status do_write_register ( const struct register_spec reg,
struct register_mapping mapping,
uacpi_u64  in_value 
)
static

Definition at line 258 of file registers.c.

262{
264
265 if (reg->preserve_mask) {
266 in_value &= ~reg->preserve_mask;
267
268 if (reg->access_kind == REGISTER_ACCESS_KIND_PRESERVE) {
270
273 return ret;
274
275 in_value |= data & reg->preserve_mask;
276 }
277 }
278
279 ret = do_write_one(mapping, 0, in_value);
281 return ret;
282
283 return do_write_one(mapping, 1, in_value);
284}
static uacpi_status do_write_one(struct register_mapping *mapping, uacpi_u8 idx, uacpi_u64 in_value)
Definition: registers.c:248
static uacpi_status do_read_register(const struct register_spec *reg, struct register_mapping *mapping, uacpi_u64 *out_value)
Definition: registers.c:204
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950

Referenced by uacpi_write_register(), and uacpi_write_register_field().

◆ ensure_register_mapped()

static uacpi_status ensure_register_mapped ( const struct register_spec spec,
struct register_mapping mapping 
)
static

Definition at line 151 of file registers.c.

154{
156 uacpi_bool needs_mapping = UACPI_FALSE;
159
160 state = uacpi_atomic_load8(&mapping->states[0]);
161 needs_mapping |= state == REGISTER_MAPPING_STATE_NONE;
162
163 state = uacpi_atomic_load8(&mapping->states[1]);
164 needs_mapping |= state == REGISTER_MAPPING_STATE_NONE;
165
166 if (!needs_mapping)
167 return UACPI_STATUS_OK;
168
170
171 ret = map_one(spec, mapping, 0);
173 goto out;
174
175 ret = map_one(spec, mapping, 1);
176out:
178 return ret;
179}
static int state
Definition: maze.c:121
unsigned long uacpi_cpu_flags
Definition: arch_helpers.h:13
#define uacpi_atomic_load8(ptr)
Definition: atomic.h:102
bool uacpi_bool
Definition: types.h:31
#define UACPI_FALSE
Definition: types.h:30
uint8_t uacpi_u8
Definition: types.h:19
static uacpi_handle g_reg_lock
Definition: registers.c:11
static uacpi_status map_one(const struct register_spec *spec, struct register_mapping *mapping, uacpi_u8 idx)
Definition: registers.c:111
GLbitfield flags
Definition: glext.h:7161
uacpi_cpu_flags uacpi_kernel_lock_spinlock(uacpi_handle)
Definition: uacpiosl.c:98
void uacpi_kernel_unlock_spinlock(uacpi_handle, uacpi_cpu_flags)
Definition: uacpiosl.c:105
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by uacpi_read_register(), uacpi_read_register_field(), uacpi_write_register(), uacpi_write_register_field(), and uacpi_write_registers().

◆ get_reg()

static uacpi_status get_reg ( uacpi_u8  idx,
const struct register_spec **  out_spec,
struct register_mapping **  out_mapping 
)
static

Definition at line 181 of file registers.c.

185{
188
189 *out_spec = &g_registers[idx];
190 *out_mapping = &g_register_mappings[idx];
191 return UACPI_STATUS_OK;
192}
@ UACPI_REGISTER_MAX
Definition: registers.h:26
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
static struct register_mapping g_register_mappings[UACPI_REGISTER_MAX+1]
Definition: registers.c:109
static const struct register_spec g_registers[UACPI_REGISTER_MAX+1]
Definition: registers.c:33

Referenced by uacpi_read_register(), uacpi_write_register(), and uacpi_write_registers().

◆ map_one()

static uacpi_status map_one ( const struct register_spec spec,
struct register_mapping mapping,
uacpi_u8  idx 
)
static

Definition at line 111 of file registers.c.

115{
117
119 return ret;
120
121 if (spec->kind == REGISTER_KIND_GAS) {
122 struct acpi_gas *gas = spec->accessors[idx];
123
124 if (gas == UACPI_NULL || gas->address == 0) {
126 return ret;
127 }
128
129 ret = uacpi_map_gas_noalloc(gas, &mapping->mappings[idx]);
130 } else {
131 if (idx != 0) {
133 return ret;
134 }
135
136 struct acpi_gas temp_gas = {
137 .address_space_id = UACPI_ADDRESS_SPACE_SYSTEM_IO,
138 .address = *(uacpi_u32*)spec->accessors[0],
139 .register_bit_width = spec->access_width * 8,
140 };
141
142 ret = uacpi_map_gas_noalloc(&temp_gas, &mapping->mappings[idx]);
143 }
144
147
148 return ret;
149}
uacpi_status uacpi_map_gas_noalloc(const struct acpi_gas *gas, uacpi_mapped_gas *out_mapped)
Definition: io.c:832
uint32_t uacpi_u32
Definition: types.h:21
#define UACPI_NULL
Definition: types.h:33
#define uacpi_likely_success(expr)
Definition: status.h:53
@ UACPI_ADDRESS_SPACE_SYSTEM_IO
Definition: types.h:38
uacpi_u8 access_width
Definition: registers.c:27
void * accessors[2]
Definition: registers.c:28
uacpi_u8 kind
Definition: registers.c:25

Referenced by ensure_register_mapped().

◆ uacpi_deinitialize_registers()

void uacpi_deinitialize_registers ( void  )

Definition at line 465 of file registers.c.

466{
467 uacpi_u8 i;
469
470 if (g_reg_lock != UACPI_NULL) {
473 }
474
475 for (i = 0; i <= UACPI_REGISTER_MAX; ++i) {
477
478 if (mapping->states[0] == REGISTER_MAPPING_STATE_MAPPED)
479 uacpi_unmap_gas_nofree(&mapping->mappings[0]);
480 if (mapping->states[1] == REGISTER_MAPPING_STATE_MAPPED)
481 uacpi_unmap_gas_nofree(&mapping->mappings[1]);
482 }
483
485}
void uacpi_unmap_gas_nofree(uacpi_mapped_gas *gas)
Definition: io.c:889
#define uacpi_memzero(ptr, size)
Definition: stdlib.h:99
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
void uacpi_kernel_free_spinlock(uacpi_handle)
Definition: uacpiosl.c:92

Referenced by uacpi_state_reset().

◆ uacpi_initialize_registers()

uacpi_status uacpi_initialize_registers ( void  )

Definition at line 456 of file registers.c.

457{
461
462 return UACPI_STATUS_OK;
463}
#define uacpi_unlikely(expr)
Definition: compiler.h:58
@ UACPI_STATUS_OUT_OF_MEMORY
Definition: status.h:13
uacpi_handle uacpi_kernel_create_spinlock(void)
Definition: uacpiosl.c:85

Referenced by uacpi_initialize().

◆ uacpi_read_register()

uacpi_status uacpi_read_register ( enum uacpi_register  reg_enum,
uacpi_u64 out_value 
)

Definition at line 227 of file registers.c.

230{
232 const struct register_spec *reg;
234
236
237 ret = get_reg(reg_enum, &reg, &mapping);
239 return ret;
240
243 return ret;
244
245 return do_read_register(reg, mapping, out_value);
246}
#define UACPI_ENSURE_INIT_LEVEL_AT_LEAST(lvl)
Definition: context.h:127
@ UACPI_INIT_LEVEL_SUBSYSTEM_INITIALIZED
Definition: types.h:66
static uacpi_status ensure_register_mapped(const struct register_spec *spec, struct register_mapping *mapping)
Definition: registers.c:151
static uacpi_status get_reg(uacpi_u8 idx, const struct register_spec **out_spec, struct register_mapping **out_mapping)
Definition: registers.c:181

Referenced by enter_sleep_state_hw_full(), handle_fixed_events(), and prepare_for_wake_from_sleep_state_hw_full().

◆ uacpi_read_register_field()

uacpi_status uacpi_read_register_field ( enum uacpi_register_field  field_enum,
uacpi_u64 out_value 
)

Definition at line 487 of file registers.c.

490{
492 uacpi_u8 field_idx = field_enum;
493 const struct register_field *field;
494 const struct register_spec *reg;
496
498
501
502 field = &g_fields[field_idx];
503 reg = &g_registers[field->reg];
505
508 return ret;
509
510 ret = do_read_register(reg, mapping, out_value);
512 return ret;
513
514 *out_value = (*out_value & field->mask) >> field->offset;
515 return UACPI_STATUS_OK;
516}
@ UACPI_REGISTER_FIELD_MAX
Definition: registers.h:80
static const struct register_field g_fields[UACPI_REGISTER_FIELD_MAX+1]
Definition: registers.c:338
Definition: parser.c:44

Referenced by enter_sleep_state_hw_full(), enter_sleep_state_hw_reduced(), read_mode(), set_event(), and uacpi_fixed_event_info().

◆ uacpi_write_register()

uacpi_status uacpi_write_register ( enum uacpi_register  reg_enum,
uacpi_u64  in_value 
)

Definition at line 286 of file registers.c.

289{
291 const struct register_spec *reg;
293
295
296 ret = get_reg(reg_enum, &reg, &mapping);
298 return ret;
299
302 return ret;
303
304 return do_write_register(reg, mapping, in_value);
305}
static uacpi_status do_write_register(const struct register_spec *reg, struct register_mapping *mapping, uacpi_u64 in_value)
Definition: registers.c:258

Referenced by enter_sleep_state_hw_reduced(), prepare_for_wake_from_sleep_state_hw_reduced(), set_mode(), uacpi_clear_all_events(), and uacpi_reboot().

◆ uacpi_write_register_field()

uacpi_status uacpi_write_register_field ( enum uacpi_register_field  field_enum,
uacpi_u64  in_value 
)

Definition at line 518 of file registers.c.

521{
523 uacpi_u8 field_idx = field_enum;
524 const struct register_field *field;
525 const struct register_spec *reg;
527
530
532
535
536 field = &g_fields[field_idx];
537 reg = &g_registers[field->reg];
539
542 return ret;
543
544 in_value = (in_value << field->offset) & field->mask;
545
547
549 if (in_value == 0) {
551 goto out;
552 }
553
554 ret = do_write_register(reg, mapping, in_value);
555 goto out;
556 }
557
560 goto out;
561
562 data &= ~field->mask;
563 data |= in_value;
564
566
567out:
569 return ret;
570}

Referenced by dispatch_fixed_event(), enter_sleep_state_hw_full(), enter_sleep_state_hw_reduced(), initialize_fixed_events(), set_event(), uacpi_clear_fixed_event(), uacpi_release_global_lock_to_firmware(), wake_from_sleep_state_hw_full(), and wake_from_sleep_state_hw_reduced().

◆ uacpi_write_registers()

uacpi_status uacpi_write_registers ( enum uacpi_register  reg_enum,
uacpi_u64  in_value0,
uacpi_u64  in_value1 
)

Definition at line 307 of file registers.c.

310{
312 const struct register_spec *reg;
314
316
317 ret = get_reg(reg_enum, &reg, &mapping);
319 return ret;
320
323 return ret;
324
325 ret = do_write_one(mapping, 0, in_value0);
327 return ret;
328
329 return do_write_one(mapping, 1, in_value1);
330}

Referenced by enter_sleep_state_hw_full(), and prepare_for_wake_from_sleep_state_hw_full().

Variable Documentation

◆ g_fields

◆ g_reg_lock

◆ g_register_mappings

◆ g_registers

Definition at line 33 of file registers.c.

Referenced by get_reg(), uacpi_read_register_field(), and uacpi_write_register_field().