ReactOS 0.4.16-dev-1946-g52006dd
io.h File Reference
#include <uacpi/internal/types.h>
#include <uacpi/acpi.h>
#include <uacpi/io.h>
Include dependency graph for io.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  uacpi_mapped_gas
 

Typedefs

typedef struct uacpi_mapped_gas uacpi_mapped_gas
 

Functions

uacpi_status uacpi_map_gas_noalloc (const struct acpi_gas *gas, uacpi_mapped_gas *out_mapped)
 
void uacpi_unmap_gas_nofree (uacpi_mapped_gas *gas)
 
uacpi_size uacpi_round_up_bits_to_bytes (uacpi_size bit_length)
 
void uacpi_read_buffer_field (const uacpi_buffer_field *field, void *dst)
 
void uacpi_write_buffer_field (uacpi_buffer_field *field, const void *src, uacpi_size size)
 
uacpi_status uacpi_field_unit_get_read_type (struct uacpi_field_unit *field, uacpi_object_type *out_type)
 
uacpi_status uacpi_field_unit_get_bit_length (struct uacpi_field_unit *field, uacpi_size *out_length)
 
uacpi_status uacpi_read_field_unit (uacpi_field_unit *field, void *dst, uacpi_size size, uacpi_data_view *wtr_response)
 
uacpi_status uacpi_write_field_unit (uacpi_field_unit *field, const void *src, uacpi_size size, uacpi_data_view *wtr_response)
 
uacpi_status uacpi_system_memory_read (void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
 
uacpi_status uacpi_system_memory_write (void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
 
uacpi_status uacpi_system_io_read (uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
 
uacpi_status uacpi_system_io_write (uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
 
uacpi_status uacpi_pci_read (uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
 
uacpi_status uacpi_pci_write (uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
 

Typedef Documentation

◆ uacpi_mapped_gas

Function Documentation

◆ uacpi_field_unit_get_bit_length()

uacpi_status uacpi_field_unit_get_bit_length ( struct uacpi_field_unit field,
uacpi_size out_length 
)

Definition at line 626 of file io.c.

629{
631
633 goto out_basic_field;
634
637 );
640
641 if (uacpi_is_buffer_access_address_space(obj->op_region->space)) {
642 /*
643 * Bit length is protocol specific, the data will be returned
644 * via the write-then-read response buffer.
645 */
646 *out_length = 0;
647 return UACPI_STATUS_OK;
648 }
649
650out_basic_field:
651 *out_length = field->bit_length;
652 return UACPI_STATUS_OK;
653}
uacpi_object * uacpi_namespace_node_get_object_typed(const uacpi_namespace_node *node, uacpi_object_type_bits type_mask)
Definition: namespace.c:654
@ UACPI_FIELD_UNIT_KIND_INDEX
Definition: types.h:205
#define uacpi_unlikely(expr)
Definition: compiler.h:58
#define UACPI_NULL
Definition: types.h:33
@ UACPI_STATUS_INVALID_ARGUMENT
Definition: status.h:18
@ UACPI_STATUS_OK
Definition: status.h:11
@ UACPI_OBJECT_OPERATION_REGION_BIT
Definition: types.h:138
uacpi_bool uacpi_is_buffer_access_address_space(uacpi_address_space space)
Definition: opregion.c:828
Definition: parser.c:44

Referenced by field_byte_size().

◆ uacpi_field_unit_get_read_type()

uacpi_status uacpi_field_unit_get_read_type ( struct uacpi_field_unit field,
uacpi_object_type out_type 
)

Definition at line 597 of file io.c.

600{
602
604 goto out_basic_field;
605
608 );
611
612 if (uacpi_is_buffer_access_address_space(obj->op_region->space)) {
613 *out_type = UACPI_OBJECT_BUFFER;
614 return UACPI_STATUS_OK;
615 }
616
617out_basic_field:
618 if (field->bit_length > (g_uacpi_rt_ctx.is_rev1 ? 32u : 64u))
619 *out_type = UACPI_OBJECT_BUFFER;
620 else
621 *out_type = UACPI_OBJECT_INTEGER;
622
623 return UACPI_STATUS_OK;
624}
struct uacpi_runtime_context g_uacpi_rt_ctx
Definition: uacpi.c:17
@ UACPI_OBJECT_BUFFER
Definition: types.h:108
@ UACPI_OBJECT_INTEGER
Definition: types.h:106

Referenced by field_get_read_type().

◆ uacpi_map_gas_noalloc()

uacpi_status uacpi_map_gas_noalloc ( const struct acpi_gas *  gas,
uacpi_mapped_gas out_mapped 
)

Definition at line 832 of file io.c.

835{
837 uacpi_u8 access_bit_width, total_width;
838
839 ret = gas_validate(gas, &access_bit_width, &total_width);
840 if (ret != UACPI_STATUS_OK)
841 return ret;
842
843 if (gas->address_space_id == UACPI_ADDRESS_SPACE_SYSTEM_MEMORY) {
844 out_mapped->mapping = uacpi_kernel_map(gas->address, total_width / 8);
845 if (uacpi_unlikely(out_mapped->mapping == UACPI_NULL))
847
848 out_mapped->read = uacpi_system_memory_read;
849 out_mapped->write = uacpi_system_memory_write;
850 out_mapped->unmap = uacpi_kernel_unmap;
851 } else { // IO, validated by gas_validate above
852 ret = uacpi_kernel_io_map(gas->address, total_width / 8, &out_mapped->mapping);
854 return ret;
855
856 out_mapped->read = uacpi_system_io_read;
857 out_mapped->write = uacpi_system_io_write;
858 out_mapped->unmap = unmap_gas_io;
859 }
860
861 out_mapped->access_bit_width = access_bit_width;
862 out_mapped->total_bit_width = total_width;
863 out_mapped->bit_offset = gas->register_bit_offset;
864
865 return UACPI_STATUS_OK;
866}
uint8_t uacpi_u8
Definition: types.h:19
#define uacpi_unlikely_error(expr)
Definition: status.h:49
uacpi_status
Definition: status.h:10
@ UACPI_STATUS_MAPPING_FAILED
Definition: status.h:12
@ UACPI_ADDRESS_SPACE_SYSTEM_MEMORY
Definition: types.h:37
uacpi_status uacpi_system_io_write(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:1021
uacpi_status uacpi_system_memory_read(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:930
uacpi_status uacpi_system_io_read(uacpi_handle handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.c:989
static void unmap_gas_io(uacpi_handle io_handle, uacpi_size size)
Definition: io.c:826
uacpi_status uacpi_system_memory_write(void *ptr, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.c:956
static uacpi_status gas_validate(const struct acpi_gas *gas, uacpi_u8 *access_bit_width, uacpi_u8 *bit_width)
Definition: io.c:701
return ret
Definition: mutex.c:146
uacpi_status uacpi_kernel_io_map(uacpi_io_addr base, uacpi_size len, uacpi_handle *out_handle)
Definition: uacpiosl.c:165
void uacpi_kernel_unmap(void *addr, uacpi_size len)
Definition: uacpiosl.c:198
void * uacpi_kernel_map(uacpi_phys_addr addr, uacpi_size len)
Definition: uacpiosl.c:191
uacpi_u8 access_bit_width
Definition: io.h:11
uacpi_u8 total_bit_width
Definition: io.h:12
uacpi_handle mapping
Definition: io.h:10
void(* unmap)(uacpi_handle, uacpi_size)
Definition: io.h:22
uacpi_status(* write)(uacpi_handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 in)
Definition: io.h:18
uacpi_u8 bit_offset
Definition: io.h:13
uacpi_status(* read)(uacpi_handle, uacpi_size offset, uacpi_u8 width, uacpi_u64 *out)
Definition: io.h:15

Referenced by create_gpe_block(), map_one(), uacpi_gas_read(), uacpi_gas_write(), and uacpi_map_gas().

◆ uacpi_pci_read()

uacpi_status uacpi_pci_read ( uacpi_handle  handle,
uacpi_size  offset,
uacpi_u8  width,
uacpi_u64 out 
)

Definition at line 1048 of file io.c.

1051{
1053 union integer_data data = {
1054 .qword = 0,
1055 };
1056
1057 switch (width) {
1058 case 1:
1060 break;
1061 case 2:
1063 break;
1064 case 4:
1066 break;
1067 default:
1069 "invalid PCI_Config read %p@%zu width=%d\n",
1071 );
1073 }
1074
1076 *out = data.qword;
1077 return ret;
1078}
#define uacpi_error(...)
Definition: log.h:21
#define uacpi_likely_success(expr)
Definition: status.h:53
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei width
Definition: gl.h:1546
GLintptr offset
Definition: glext.h:5920
uacpi_status uacpi_kernel_pci_read8(uacpi_handle device, uacpi_size offset, uacpi_u8 *value)
Definition: uacpiosl.c:257
uacpi_status uacpi_kernel_pci_read16(uacpi_handle device, uacpi_size offset, uacpi_u16 *value)
Definition: uacpiosl.c:264
uacpi_status uacpi_kernel_pci_read32(uacpi_handle device, uacpi_size offset, uacpi_u32 *value)
Definition: uacpiosl.c:271
uacpi_u64 qword
Definition: io.c:986
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
Definition: wcsftime.cpp:383

Referenced by pci_region_do_rw().

◆ uacpi_pci_write()

uacpi_status uacpi_pci_write ( uacpi_handle  handle,
uacpi_size  offset,
uacpi_u8  width,
uacpi_u64  in 
)

Definition at line 1080 of file io.c.

1083{
1085
1086 switch (width) {
1087 case 1:
1089 break;
1090 case 2:
1092 break;
1093 case 4:
1095 break;
1096 default:
1098 "invalid PCI_Config write %p@%zu width=%d\n",
1100 );
1102 }
1103
1104 return ret;
1105}
GLuint in
Definition: glext.h:9616
uacpi_status uacpi_kernel_pci_write16(uacpi_handle device, uacpi_size offset, uacpi_u16 value)
Definition: uacpiosl.c:285
uacpi_status uacpi_kernel_pci_write8(uacpi_handle device, uacpi_size offset, uacpi_u8 value)
Definition: uacpiosl.c:278
uacpi_status uacpi_kernel_pci_write32(uacpi_handle device, uacpi_size offset, uacpi_u32 value)
Definition: uacpiosl.c:292

Referenced by pci_region_do_rw().

◆ uacpi_read_buffer_field()

void uacpi_read_buffer_field ( const uacpi_buffer_field field,
void dst 
)

Definition at line 114 of file io.c.

117{
118 if (!(field->bit_index & 7)) {
119 uacpi_u8 *src = field->backing->data;
121
123 uacpi_memcpy(dst, src + (field->bit_index / 8), count);
124 cut_misaligned_tail(dst, count - 1, field->bit_length);
125 return;
126 }
127
129}
#define uacpi_memcpy
Definition: stdlib.h:34
size_t uacpi_size
Definition: types.h:37
uacpi_size uacpi_round_up_bits_to_bytes(uacpi_size bit_length)
Definition: io.c:11
static void do_misaligned_buffer_read(const uacpi_buffer_field *field, uacpi_u8 *dst)
Definition: io.c:97
static void cut_misaligned_tail(uacpi_u8 *data, uacpi_size offset, uacpi_u32 bit_length)
Definition: io.c:16
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum src
Definition: glext.h:6340
GLenum GLenum dst
Definition: glext.h:6340

Referenced by handle_field_read(), and handle_inc_dec().

◆ uacpi_read_field_unit()

uacpi_status uacpi_read_field_unit ( uacpi_field_unit field,
void dst,
uacpi_size  size,
uacpi_data_view wtr_response 
)

Definition at line 459 of file io.c.

463{
465 uacpi_u32 field_byte_length;
466 uacpi_bool did_handle;
467
470 .data = dst,
471 .length = size,
473 wtr_response, &did_handle
474 );
475 if (did_handle)
476 return ret;
477
478 field_byte_length = uacpi_round_up_bits_to_bytes(field->bit_length);
479
480 /*
481 * Very simple fast case:
482 * - Bit offset within first byte is 0
483 * AND
484 * - Field size is <= access width
485 */
486 if (field->bit_offset_within_first_byte == 0 &&
487 field_byte_length <= field->access_width_bytes)
488 {
490
492 field, field->byte_offset, UACPI_REGION_OP_READ,
494 );
496 return ret;
497
498 uacpi_memcpy_zerout(dst, &out, size, field_byte_length);
499 if (size >= field_byte_length)
500 cut_misaligned_tail(dst, field_byte_length - 1, field->bit_length);
501
502 return UACPI_STATUS_OK;
503 }
504
505 // Slow case
507}
void uacpi_memcpy_zerout(void *dst, const void *src, uacpi_size dst_size, uacpi_size src_size)
Definition: stdlib.c:112
uint32_t uacpi_u32
Definition: types.h:21
bool uacpi_bool
Definition: types.h:31
uint64_t uacpi_u64
Definition: types.h:22
@ UACPI_REGION_OP_READ
Definition: types.h:374
static uacpi_status access_field_unit(uacpi_field_unit *field, uacpi_u32 offset, uacpi_region_op op, union uacpi_opregion_io_data data)
Definition: io.c:179
static uacpi_status do_read_misaligned_field_unit(uacpi_field_unit *field, uacpi_u8 *dst, uacpi_size size)
Definition: io.c:408
#define OPREGION_IO_U64(x)
Definition: io.c:247
static uacpi_status handle_special_field(uacpi_field_unit *field, uacpi_data_view buf, uacpi_region_op op, uacpi_data_view *wtr_response, uacpi_bool *did_handle)
Definition: io.c:313
GLsizeiptr size
Definition: glext.h:5919

Referenced by access_field_unit(), handle_field_read(), and handle_inc_dec().

◆ uacpi_round_up_bits_to_bytes()

uacpi_size uacpi_round_up_bits_to_bytes ( uacpi_size  bit_length)

Definition at line 11 of file io.c.

12{
13 return UACPI_ALIGN_UP(bit_length, 8, uacpi_size) / 8;
14}
#define UACPI_ALIGN_UP(x, val, type)
Definition: stdlib.h:106

Referenced by do_misaligned_buffer_read(), field_byte_size(), uacpi_read_buffer_field(), uacpi_read_field_unit(), and uacpi_write_buffer_field().

◆ uacpi_system_io_read()

uacpi_status uacpi_system_io_read ( uacpi_handle  handle,
uacpi_size  offset,
uacpi_u8  width,
uacpi_u64 out 
)

Definition at line 989 of file io.c.

992{
994 union integer_data data = {
995 .qword = 0,
996 };
997
998 switch (width) {
999 case 1:
1001 break;
1002 case 2:
1004 break;
1005 case 4:
1007 break;
1008 default:
1010 "invalid SystemIO read %p@%zu width=%d\n",
1012 );
1014 }
1015
1017 *out = data.qword;
1018 return ret;
1019}
uacpi_status uacpi_kernel_io_read32(uacpi_handle, uacpi_size offset, uacpi_u32 *out_value)
Definition: uacpiosl.c:313
uacpi_status uacpi_kernel_io_read8(uacpi_handle, uacpi_size offset, uacpi_u8 *out_value)
Definition: uacpiosl.c:299
uacpi_status uacpi_kernel_io_read16(uacpi_handle, uacpi_size offset, uacpi_u16 *out_value)
Definition: uacpiosl.c:306

Referenced by io_region_do_rw(), and uacpi_map_gas_noalloc().

◆ uacpi_system_io_write()

uacpi_status uacpi_system_io_write ( uacpi_handle  handle,
uacpi_size  offset,
uacpi_u8  width,
uacpi_u64  in 
)

Definition at line 1021 of file io.c.

1024{
1026
1027 switch (width) {
1028 case 1:
1030 break;
1031 case 2:
1033 break;
1034 case 4:
1036 break;
1037 default:
1039 "invalid SystemIO write %p@%zu width=%d\n",
1041 );
1043 }
1044
1045 return ret;
1046}
uacpi_status uacpi_kernel_io_write8(uacpi_handle, uacpi_size offset, uacpi_u8 in_value)
Definition: uacpiosl.c:320
uacpi_status uacpi_kernel_io_write32(uacpi_handle, uacpi_size offset, uacpi_u32 in_value)
Definition: uacpiosl.c:334
uacpi_status uacpi_kernel_io_write16(uacpi_handle, uacpi_size offset, uacpi_u16 in_value)
Definition: uacpiosl.c:327

Referenced by io_region_do_rw(), and uacpi_map_gas_noalloc().

◆ uacpi_system_memory_read()

uacpi_status uacpi_system_memory_read ( void ptr,
uacpi_size  offset,
uacpi_u8  width,
uacpi_u64 out 
)

Definition at line 930 of file io.c.

933{
935
936 switch (width) {
937 case 1:
938 *out = *(volatile uacpi_u8*)ptr;
939 break;
940 case 2:
941 *out = *(volatile uacpi_u16*)ptr;
942 break;
943 case 4:
944 *out = *(volatile uacpi_u32*)ptr;
945 break;
946 case 8:
947 *out = *(volatile uacpi_u64*)ptr;
948 break;
949 default:
951 }
952
953 return UACPI_STATUS_OK;
954}
uint16_t uacpi_u16
Definition: types.h:20
#define UACPI_PTR_ADD(ptr, value)
Definition: utilities.h:23
static PVOID ptr
Definition: dispmode.c:27

Referenced by memory_region_do_rw(), table_data_region_do_rw(), and uacpi_map_gas_noalloc().

◆ uacpi_system_memory_write()

uacpi_status uacpi_system_memory_write ( void ptr,
uacpi_size  offset,
uacpi_u8  width,
uacpi_u64  in 
)

Definition at line 956 of file io.c.

959{
961
962 switch (width) {
963 case 1:
964 *(volatile uacpi_u8*)ptr = in;
965 break;
966 case 2:
967 *(volatile uacpi_u16*)ptr = in;
968 break;
969 case 4:
970 *(volatile uacpi_u32*)ptr = in;
971 break;
972 case 8:
973 *(volatile uacpi_u64*)ptr = in;
974 break;
975 default:
977 }
978
979 return UACPI_STATUS_OK;
980}

Referenced by memory_region_do_rw(), table_data_region_do_rw(), and uacpi_map_gas_noalloc().

◆ uacpi_unmap_gas_nofree()

void uacpi_unmap_gas_nofree ( uacpi_mapped_gas gas)

Definition at line 889 of file io.c.

890{
891 gas->unmap(gas->mapping, gas->access_bit_width / 8);
892}

Referenced by uacpi_deinitialize_registers(), uacpi_gas_read(), uacpi_gas_write(), uacpi_unmap_gas(), and uninstall_gpe_block().

◆ uacpi_write_buffer_field()

void uacpi_write_buffer_field ( uacpi_buffer_field field,
const void src,
uacpi_size  size 
)

Definition at line 149 of file io.c.

153{
154 if (!(field->bit_index & 7)) {
155 uacpi_u8 *dst, last_byte, tail_shift;
157
158 dst = field->backing->data;
159 dst += field->bit_index / 8;
161
162 last_byte = dst[count - 1];
163 tail_shift = field->bit_length & 7;
164
166 if (tail_shift) {
167 uacpi_u8 last_shift = 8 - tail_shift;
168 dst[count - 1] = dst[count - 1] << last_shift;
169 dst[count - 1] >>= last_shift;
170 dst[count - 1] |= (last_byte >> tail_shift) << tail_shift;
171 }
172
173 return;
174 }
175
177}
static void do_write_misaligned_buffer_field(uacpi_buffer_field *field, const void *src, uacpi_size size)
Definition: io.c:131

Referenced by object_assign_with_implicit_cast().

◆ uacpi_write_field_unit()

uacpi_status uacpi_write_field_unit ( uacpi_field_unit field,
const void src,
uacpi_size  size,
uacpi_data_view wtr_response 
)

Definition at line 576 of file io.c.

580{
582 uacpi_bool did_handle;
583
586 .const_data = src,
587 .length = size,
589 wtr_response, &did_handle
590 );
591 if (did_handle)
592 return ret;
593
595}
@ UACPI_REGION_OP_WRITE
Definition: types.h:375
static uacpi_status write_generic_field_unit(uacpi_field_unit *field, const void *src, uacpi_size size)
Definition: io.c:509

Referenced by access_field_unit(), and object_assign_with_implicit_cast().