iPXE
acpi_settings.c File Reference

ACPI settings. More...

#include <string.h>
#include <errno.h>
#include <ipxe/init.h>
#include <ipxe/settings.h>
#include <ipxe/acpi.h>

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 FILE_SECBOOT (PERMITTED)
static int acpi_settings_applies (struct settings *settings __unused, const struct setting *setting)
 Check applicability of ACPI setting.
static int acpi_settings_fetch (struct settings *settings, struct setting *setting, void *data, size_t len)
 Fetch value of ACPI setting.
static void acpi_settings_init (void)
 Initialise ACPI settings.
struct init_fn acpi_settings_init_fn __init_fn (INIT_NORMAL)
 ACPI settings initialiser.

Variables

static const struct settings_scope acpi_settings_scope
 ACPI settings scope.
static struct settings_operations acpi_settings_operations
 ACPI settings operations.
static struct settings acpi_settings
 ACPI settings.

Detailed Description

ACPI settings.

Definition in file acpi_settings.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

◆ FILE_SECBOOT()

FILE_SECBOOT ( PERMITTED )

◆ acpi_settings_applies()

int acpi_settings_applies ( struct settings *settings __unused,
const struct setting * setting )
static

Check applicability of ACPI setting.

Parameters
settingsSettings block
settingSetting
Return values
appliesSetting applies within this settings block

Definition at line 50 of file acpi_settings.c.

51 {
52
53 return ( setting->scope == &acpi_settings_scope );
54}
static const struct settings_scope acpi_settings_scope
ACPI settings scope.
A setting.
Definition settings.h:24
const struct settings_scope * scope
Setting scope (or NULL)
Definition settings.h:50

References __unused, acpi_settings_scope, and setting::scope.

◆ acpi_settings_fetch()

int acpi_settings_fetch ( struct settings * settings,
struct setting * setting,
void * data,
size_t len )
static

Fetch value of ACPI setting.

Parameters
settingsSettings block
settingSetting to fetch
dataBuffer to fill with setting data
lenLength of buffer
Return values
lenLength of setting data, or negative error

Definition at line 65 of file acpi_settings.c.

67 {
68 const struct acpi_header *acpi;
69 const uint8_t *src;
70 uint8_t *dst;
71 uint32_t tag_high;
72 uint32_t tag_low;
73 uint32_t tag_signature;
74 unsigned int tag_index;
75 size_t tag_offset;
76 size_t tag_len;
77 size_t offset;
78 size_t max_len;
79 int delta;
80 unsigned int i;
81
82 /* Parse settings tag */
83 tag_high = ( setting->tag >> 32 );
84 tag_low = setting->tag;
85 tag_signature = bswap_32 ( tag_high );
86 tag_index = ( ( tag_low >> 24 ) & 0xff );
87 tag_offset = ( ( tag_low >> 8 ) & 0xffff );
88 tag_len = ( ( tag_low >> 0 ) & 0xff );
89 DBGC ( settings, "ACPI %s.%d offset %#zx length %#zx\n",
90 acpi_name ( tag_signature ), tag_index, tag_offset, tag_len );
91
92 /* Locate ACPI table */
93 acpi = acpi_table ( tag_signature, tag_index );
94 if ( ! acpi )
95 return -ENOENT;
96
97 /* Calculate starting offset and maximum available length */
98 max_len = le32_to_cpu ( acpi->length );
99 if ( tag_offset > max_len )
100 return -ENOENT;
101 offset = tag_offset;
102 max_len -= offset;
103
104 /* Restrict to requested length, if specified */
105 if ( tag_len && ( tag_len < max_len ) )
106 max_len = tag_len;
107
108 /* Invert endianness for numeric settings */
109 if ( setting->type && setting->type->numerate ) {
110 offset += ( max_len - 1 );
111 delta = -1;
112 } else {
113 delta = +1;
114 }
115
116 /* Read data */
117 src = ( ( ( const void * ) acpi ) + offset );
118 dst = data;
119 for ( i = 0 ; ( ( i < max_len ) && ( i < len ) ) ; i++ ) {
120 *(dst++) = *src;
121 src += delta;
122 }
123
124 /* Set type if not already specified */
125 if ( ! setting->type )
126 setting->type = &setting_type_hexraw;
127
128 return max_len;
129}
const struct acpi_header * acpi_table(uint32_t signature, unsigned int index)
Locate ACPI table.
Definition acpi.c:93
unsigned int uint32_t
Definition stdint.h:12
unsigned char uint8_t
Definition stdint.h:10
static const void * src
Definition string.h:48
uint16_t offset
Offset to command line.
Definition bzimage.h:3
ring len
Length.
Definition dwmac.h:226
static EFI_ACPI_TABLE_PROTOCOL * acpi
ACPI table protocol protocol.
Definition efi_block.c:67
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define DBGC(...)
Definition compiler.h:505
#define ENOENT
No such file or directory.
Definition errno.h:515
#define bswap_32(value)
Definition byteswap.h:71
#define le32_to_cpu(value)
Definition byteswap.h:114
static const char * acpi_name(uint32_t signature)
Transcribe ACPI table signature (for debugging)
Definition acpi.h:207
An ACPI description header.
Definition acpi.h:180
int(* numerate)(const struct setting_type *type, const void *raw, size_t raw_len, unsigned long *value)
Convert setting value to number.
Definition settings.h:238
const struct setting_type * type
Setting type.
Definition settings.h:37
uint64_t tag
Setting tag, if applicable.
Definition settings.h:44
A settings block.
Definition settings.h:133

References acpi, acpi_name(), acpi_table(), bswap_32, data, DBGC, ENOENT, le32_to_cpu, len, setting_type::numerate, offset, src, setting::tag, and setting::type.

◆ acpi_settings_init()

void acpi_settings_init ( void )
static

Initialise ACPI settings.

Definition at line 147 of file acpi_settings.c.

147 {
148 int rc;
149
151 "acpi" ) ) != 0 ) {
152 DBG ( "ACPI could not register settings: %s\n",
153 strerror ( rc ) );
154 return;
155 }
156}
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
static struct settings acpi_settings
ACPI settings.
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
#define DBG(...)
Print a debugging message.
Definition compiler.h:498
int register_settings(struct settings *settings, struct settings *parent, const char *name)
Register settings block.
Definition settings.c:476
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79

References acpi_settings, DBG, NULL, rc, register_settings(), and strerror().

Referenced by __init_fn().

◆ __init_fn()

struct init_fn acpi_settings_init_fn __init_fn ( INIT_NORMAL )

ACPI settings initialiser.

References __init_fn, acpi_settings_init(), and INIT_NORMAL.

Variable Documentation

◆ acpi_settings_scope

const struct settings_scope acpi_settings_scope
static

ACPI settings scope.

Definition at line 41 of file acpi_settings.c.

Referenced by acpi_settings_applies().

◆ acpi_settings_operations

struct settings_operations acpi_settings_operations
static
Initial value:
= {
}
static int acpi_settings_applies(struct settings *settings __unused, const struct setting *setting)
Check applicability of ACPI setting.
static int acpi_settings_fetch(struct settings *settings, struct setting *setting, void *data, size_t len)
Fetch value of ACPI setting.

ACPI settings operations.

Definition at line 132 of file acpi_settings.c.

132 {
133 .applies = acpi_settings_applies,
134 .fetch = acpi_settings_fetch,
135};

◆ acpi_settings

struct settings acpi_settings
static
Initial value:
= {
.refcnt = NULL,
.siblings = LIST_HEAD_INIT ( acpi_settings.siblings ),
.children = LIST_HEAD_INIT ( acpi_settings.children ),
.default_scope = &acpi_settings_scope,
}
static struct settings_operations acpi_settings_operations
ACPI settings operations.
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition list.h:31

ACPI settings.

Definition at line 138 of file acpi_settings.c.

138 {
139 .refcnt = NULL,
140 .siblings = LIST_HEAD_INIT ( acpi_settings.siblings ),
141 .children = LIST_HEAD_INIT ( acpi_settings.children ),
143 .default_scope = &acpi_settings_scope,
144};

Referenced by acpi_settings_init(), and REQUIRE_OBJECT().