iPXE
Data Structures | Defines | Functions
acpi.h File Reference

ACPI data structures. More...

#include <stdint.h>
#include <byteswap.h>
#include <ipxe/refcnt.h>
#include <ipxe/list.h>
#include <ipxe/interface.h>
#include <ipxe/uaccess.h>
#include <ipxe/tables.h>
#include <ipxe/api.h>
#include <config/general.h>
#include <ipxe/null_acpi.h>
#include <ipxe/efi/efi_acpi.h>
#include <bits/acpi.h>

Go to the source code of this file.

Data Structures

struct  acpi_header
 An ACPI description header. More...
struct  acpi_rsdp
 Root System Description Pointer. More...
struct  acpi_rsdt
 ACPI Root System Description Table (RSDT) More...
struct  acpi_fadt
 Fixed ACPI Description Table (FADT) More...
struct  acpi_descriptor
 An ACPI descriptor (used to construct ACPI tables) More...
struct  acpi_model
 An ACPI table model. More...

Defines

#define ACPI_SIGNATURE(a, b, c, d)   ( ( (a) << 0 ) | ( (b) << 8 ) | ( (c) << 16 ) | ( (d) << 24 ) )
 Build ACPI signature.
#define RSDP_SIGNATURE   { 'R', 'S', 'D', ' ', 'P', 'T', 'R', ' ' }
 Root System Description Pointer signature.
#define RSDT_SIGNATURE   ACPI_SIGNATURE ( 'R', 'S', 'D', 'T' )
 Root System Description Table (RSDT) signature.
#define FADT_SIGNATURE   ACPI_SIGNATURE ( 'F', 'A', 'C', 'P' )
 Fixed ACPI Description Table (FADT) signature.
#define ACPI_PM1_CNT   0
 ACPI PM1 Control Register (within PM1a_CNT_BLK or PM1A_CNT_BLK)
#define ACPI_PM1_CNT_SLP_TYP(x)   ( (x) << 10 )
 Sleep type.
#define ACPI_PM1_CNT_SLP_EN   ( 1 << 13 )
 Sleep enable.
#define ACPI_PM_TMR   0
 ACPI PM Timer Register (within PM_TMR_BLK)
#define DSDT_SIGNATURE   ACPI_SIGNATURE ( 'D', 'S', 'D', 'T' )
 Differentiated System Description Table (DSDT) signature.
#define SSDT_SIGNATURE   ACPI_SIGNATURE ( 'S', 'S', 'D', 'T' )
 Secondary System Description Table (SSDT) signature.
#define ACPI_MODELS   __table ( struct acpi_model, "acpi_models" )
 ACPI models.
#define __acpi_model   __table_entry ( ACPI_MODELS, 01 )
 Declare an ACPI model.
#define ACPI_INLINE(_subsys, _api_func)   SINGLE_API_INLINE ( ACPI_PREFIX_ ## _subsys, _api_func )
 Calculate static inline ACPI API function name.
#define PROVIDE_ACPI(_subsys, _api_func, _func)   PROVIDE_SINGLE_API ( ACPI_PREFIX_ ## _subsys, _api_func, _func )
 Provide an ACPI API implementation.
#define PROVIDE_ACPI_INLINE(_subsys, _api_func)   PROVIDE_SINGLE_API_INLINE ( ACPI_PREFIX_ ## _subsys, _api_func )
 Provide a static inline ACPI API implementation.
#define acpi_describe_TYPE(object_type)   typeof ( struct acpi_descriptor * ( object_type ) )

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
static const char * acpi_name (uint32_t signature)
 Transcribe ACPI table signature (for debugging)
static void acpi_init (struct acpi_descriptor *desc, struct acpi_model *model, struct refcnt *refcnt)
 Initialise ACPI descriptor.
userptr_t acpi_find_rsdt (void)
 Locate ACPI root system description table.
struct acpi_descriptoracpi_describe (struct interface *interface)
 Get object's ACPI descriptor.
void acpi_fix_checksum (struct acpi_header *acpi)
 Fix up ACPI table checksum.
userptr_t acpi_find (uint32_t signature, unsigned int index)
 Locate ACPI table.
int acpi_sx (uint32_t signature)
 Extract value from DSDT/SSDT.
void acpi_add (struct acpi_descriptor *desc)
 Add ACPI descriptor.
void acpi_del (struct acpi_descriptor *desc)
 Remove ACPI descriptor.
int acpi_install (int(*install)(struct acpi_header *acpi))
 Install ACPI tables.

Detailed Description

ACPI data structures.

Definition in file acpi.h.


Define Documentation

#define ACPI_SIGNATURE (   a,
  b,
  c,
 
)    ( ( (a) << 0 ) | ( (b) << 8 ) | ( (c) << 16 ) | ( (d) << 24 ) )

Build ACPI signature.

Parameters:
aFirst character of ACPI signature
bSecond character of ACPI signature
cThird character of ACPI signature
dFourth character of ACPI signature
Return values:
signatureACPI signature

Definition at line 74 of file acpi.h.

#define RSDP_SIGNATURE   { 'R', 'S', 'D', ' ', 'P', 'T', 'R', ' ' }

Root System Description Pointer signature.

Definition at line 78 of file acpi.h.

Referenced by rsdp_find_rsdt_range().

#define RSDT_SIGNATURE   ACPI_SIGNATURE ( 'R', 'S', 'D', 'T' )

Root System Description Table (RSDT) signature.

Definition at line 95 of file acpi.h.

Referenced by acpi_find().

#define FADT_SIGNATURE   ACPI_SIGNATURE ( 'F', 'A', 'C', 'P' )

Fixed ACPI Description Table (FADT) signature.

Definition at line 106 of file acpi.h.

Referenced by acpi_poweroff(), acpi_sx(), and acpi_timer_probe().

#define ACPI_PM1_CNT   0

ACPI PM1 Control Register (within PM1a_CNT_BLK or PM1A_CNT_BLK)

Definition at line 129 of file acpi.h.

Referenced by acpi_poweroff().

#define ACPI_PM1_CNT_SLP_TYP (   x)    ( (x) << 10 )

Sleep type.

Definition at line 130 of file acpi.h.

Referenced by acpi_poweroff().

#define ACPI_PM1_CNT_SLP_EN   ( 1 << 13 )

Sleep enable.

Definition at line 131 of file acpi.h.

Referenced by acpi_poweroff().

#define ACPI_PM_TMR   0

ACPI PM Timer Register (within PM_TMR_BLK)

Definition at line 134 of file acpi.h.

Referenced by acpi_timer_probe().

#define DSDT_SIGNATURE   ACPI_SIGNATURE ( 'D', 'S', 'D', 'T' )

Differentiated System Description Table (DSDT) signature.

Definition at line 137 of file acpi.h.

#define SSDT_SIGNATURE   ACPI_SIGNATURE ( 'S', 'S', 'D', 'T' )

Secondary System Description Table (SSDT) signature.

Definition at line 140 of file acpi.h.

Referenced by acpi_sx().

#define ACPI_MODELS   __table ( struct acpi_model, "acpi_models" )

ACPI models.

Definition at line 189 of file acpi.h.

Referenced by acpi_install().

struct acpi_model ib_sbft_model __acpi_model   __table_entry ( ACPI_MODELS, 01 )

Declare an ACPI model.

IB sBFT model.

aBFT model

Definition at line 192 of file acpi.h.

#define ACPI_INLINE (   _subsys,
  _api_func 
)    SINGLE_API_INLINE ( ACPI_PREFIX_ ## _subsys, _api_func )

Calculate static inline ACPI API function name.

Parameters:
_prefixSubsystem prefix
_api_funcAPI function
Return values:
_subsys_funcSubsystem API function

Definition at line 201 of file acpi.h.

#define PROVIDE_ACPI (   _subsys,
  _api_func,
  _func 
)    PROVIDE_SINGLE_API ( ACPI_PREFIX_ ## _subsys, _api_func, _func )

Provide an ACPI API implementation.

Parameters:
_prefixSubsystem prefix
_api_funcAPI function
_funcImplementing function

Definition at line 211 of file acpi.h.

#define PROVIDE_ACPI_INLINE (   _subsys,
  _api_func 
)    PROVIDE_SINGLE_API_INLINE ( ACPI_PREFIX_ ## _subsys, _api_func )

Provide a static inline ACPI API implementation.

Parameters:
_prefixSubsystem prefix
_api_funcAPI function

Definition at line 220 of file acpi.h.

#define acpi_describe_TYPE (   object_type)    typeof ( struct acpi_descriptor * ( object_type ) )

Definition at line 239 of file acpi.h.

Referenced by acpi_describe().


Function Documentation

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )
static const char* acpi_name ( uint32_t  signature) [inline, static]

Transcribe ACPI table signature (for debugging)

Parameters:
signatureACPI table signature
Return values:
nameACPI table signature name

Definition at line 55 of file acpi.h.

References cpu_to_le32, name, signature, and u.

Referenced by acpi_find(), acpi_settings_fetch(), acpi_sx(), acpi_sx_zsdt(), dummy_install(), efi_block_install(), and int13_install().

                                                            {
        static union {
                uint32_t signature;
                char name[5];
        } u;

        u.signature = cpu_to_le32 ( signature );
        return u.name;
}
static void acpi_init ( struct acpi_descriptor desc,
struct acpi_model model,
struct refcnt refcnt 
) [inline, static]

Initialise ACPI descriptor.

Parameters:
descACPI descriptor
modelTable model
refcntReference count

Definition at line 160 of file acpi.h.

References INIT_LIST_HEAD.

Referenced by aoedev_open(), ib_srp_open(), and iscsi_open().

                                    {

        desc->refcnt = refcnt;
        desc->model = model;
        INIT_LIST_HEAD ( &desc->list );
}

Locate ACPI root system description table.

Return values:
rsdtACPI root system description table, or UNULL

Referenced by acpi_find(), and acpi_sx().

struct acpi_descriptor* acpi_describe ( struct interface intf) [read]

Get object's ACPI descriptor.

Parameters:
intfInterface
Return values:
descACPI descriptor, or NULL

Definition at line 334 of file acpi.c.

References acpi_describe(), acpi_describe_TYPE, dest, intf_get_dest_op, intf_object(), intf_put(), NULL, and op.

Referenced by acpi_describe(), and sanpath_open().

                                                                  {
        struct interface *dest;
        acpi_describe_TYPE ( void * ) *op =
                intf_get_dest_op ( intf, acpi_describe, &dest );
        void *object = intf_object ( dest );
        struct acpi_descriptor *desc;

        if ( op ) {
                desc = op ( object );
        } else {
                desc = NULL;
        }

        intf_put ( dest );
        return desc;
}
void acpi_fix_checksum ( struct acpi_header acpi)

Fix up ACPI table checksum.

Parameters:
acpiACPI table header

Definition at line 76 of file acpi.c.

References acpi_checksum(), acpi_header::checksum, and virt_to_user().

Referenced by efi_block_install(), and int13_install().

                                                    {

        /* Update checksum */
        acpi->checksum -= acpi_checksum ( virt_to_user ( acpi ) );
}
userptr_t acpi_find ( uint32_t  signature,
unsigned int  index 
)

Locate ACPI table.

Parameters:
signatureRequested table signature
indexRequested index of table with this signature
Return values:
tableTable, or UNULL if not found

Definition at line 89 of file acpi.c.

References acpi_rsdt::acpi, acpi_checksum(), acpi_find_rsdt(), acpi_name(), copy_from_user(), count, cpu_to_le32, DBG, DBGC, DBGC_HDA, acpi_rsdt::entry, entry, le32_to_cpu, len, acpi_header::length, offsetof, phys_to_user(), RSDT_SIGNATURE, acpi_header::signature, UNULL, and user_to_phys().

Referenced by acpi_poweroff(), acpi_settings_fetch(), acpi_sx(), and acpi_timer_probe().

                                                               {
        struct acpi_header acpi;
        struct acpi_rsdt *rsdtab;
        typeof ( rsdtab->entry[0] ) entry;
        userptr_t rsdt;
        userptr_t table;
        size_t len;
        unsigned int count;
        unsigned int i;

        /* Locate RSDT */
        rsdt = acpi_find_rsdt();
        if ( ! rsdt ) {
                DBG ( "RSDT not found\n" );
                return UNULL;
        }

        /* Read RSDT header */
        copy_from_user ( &acpi, rsdt, 0, sizeof ( acpi ) );
        if ( acpi.signature != cpu_to_le32 ( RSDT_SIGNATURE ) ) {
                DBGC ( rsdt, "RSDT %#08lx has invalid signature:\n",
                       user_to_phys ( rsdt, 0 ) );
                DBGC_HDA ( rsdt, user_to_phys ( rsdt, 0 ), &acpi,
                           sizeof ( acpi ) );
                return UNULL;
        }
        len = le32_to_cpu ( acpi.length );
        if ( len < sizeof ( rsdtab->acpi ) ) {
                DBGC ( rsdt, "RSDT %#08lx has invalid length:\n",
                       user_to_phys ( rsdt, 0 ) );
                DBGC_HDA ( rsdt, user_to_phys ( rsdt, 0 ), &acpi,
                           sizeof ( acpi ) );
                return UNULL;
        }

        /* Calculate number of entries */
        count = ( ( len - sizeof ( rsdtab->acpi ) ) / sizeof ( entry ) );

        /* Search through entries */
        for ( i = 0 ; i < count ; i++ ) {

                /* Get table address */
                copy_from_user ( &entry, rsdt,
                                 offsetof ( typeof ( *rsdtab ), entry[i] ),
                                 sizeof ( entry ) );

                /* Read table header */
                table = phys_to_user ( entry );
                copy_from_user ( &acpi.signature, table, 0,
                                 sizeof ( acpi.signature ) );

                /* Check table signature */
                if ( acpi.signature != cpu_to_le32 ( signature ) )
                        continue;

                /* Check index */
                if ( index-- )
                        continue;

                /* Check table integrity */
                if ( acpi_checksum ( table ) != 0 ) {
                        DBGC ( rsdt, "RSDT %#08lx found %s with bad checksum "
                               "at %08lx\n", user_to_phys ( rsdt, 0 ),
                               acpi_name ( signature ),
                               user_to_phys ( table, 0 ) );
                        break;
                }

                DBGC ( rsdt, "RSDT %#08lx found %s at %08lx\n",
                       user_to_phys ( rsdt, 0 ), acpi_name ( signature ),
                       user_to_phys ( table, 0 ) );
                return table;
        }

        DBGC ( rsdt, "RSDT %#08lx could not find %s\n",
               user_to_phys ( rsdt, 0 ), acpi_name ( signature ) );
        return UNULL;
}
int acpi_sx ( uint32_t  signature)

Extract value from DSDT/SSDT.

Parameters:
signatureSignature (e.g. "_S5_")
Return values:
sxvalue, or negative error

Definition at line 257 of file acpi.c.

References acpi_find(), acpi_find_rsdt(), acpi_name(), acpi_sx_zsdt(), copy_from_user(), DBG, DBGC, acpi_fadt::dsdt, ENOENT, FADT_SIGNATURE, phys_to_user(), SSDT_SIGNATURE, and user_to_phys().

Referenced by acpi_poweroff().

                                   {
        struct acpi_fadt fadtab;
        userptr_t rsdt;
        userptr_t fadt;
        userptr_t dsdt;
        userptr_t ssdt;
        unsigned int i;
        int sx;

        /* Locate RSDT */
        rsdt = acpi_find_rsdt();
        if ( ! rsdt ) {
                DBG ( "RSDT not found\n" );
                return -ENOENT;
        }

        /* Try DSDT first */
        fadt = acpi_find ( FADT_SIGNATURE, 0 );
        if ( fadt ) {
                copy_from_user ( &fadtab, fadt, 0, sizeof ( fadtab ) );
                dsdt = phys_to_user ( fadtab.dsdt );
                if ( ( sx = acpi_sx_zsdt ( dsdt, signature ) ) >= 0 )
                        return sx;
        }

        /* Try all SSDTs */
        for ( i = 0 ; ; i++ ) {
                ssdt = acpi_find ( SSDT_SIGNATURE, i );
                if ( ! ssdt )
                        break;
                if ( ( sx = acpi_sx_zsdt ( ssdt, signature ) ) >= 0 )
                        return sx;
        }

        DBGC ( rsdt, "RSDT %#08lx could not find \\_Sx \"%s\"\n",
               user_to_phys ( rsdt, 0 ), acpi_name ( signature ) );
        return -ENOENT;
}
void acpi_add ( struct acpi_descriptor desc)

Add ACPI descriptor.

Parameters:
descACPI descriptor

Definition at line 308 of file acpi.c.

References acpi_model::descs, acpi_descriptor::list, list_add_tail, acpi_descriptor::model, ref_get, and acpi_descriptor::refcnt.

Referenced by sanpath_open().

                                               {

        /* Add to list of descriptors */
        ref_get ( desc->refcnt );
        list_add_tail ( &desc->list, &desc->model->descs );
}
void acpi_del ( struct acpi_descriptor desc)

Remove ACPI descriptor.

Parameters:
descACPI descriptor

Definition at line 320 of file acpi.c.

References acpi_model::descs, acpi_descriptor::list, list_check_contains_entry, list_del, acpi_descriptor::model, ref_put, and acpi_descriptor::refcnt.

Referenced by sandev_undescribe(), and sanpath_open().

                                               {

        /* Remove from list of descriptors */
        list_check_contains_entry ( desc, &desc->model->descs, list );
        list_del ( &desc->list );
        ref_put ( desc->refcnt );
}
int acpi_install ( int(*)(struct acpi_header *acpi install)

Install ACPI tables.

Parameters:
installTable installation method
Return values:
rcReturn status code

Definition at line 357 of file acpi.c.

References ACPI_MODELS, for_each_table_entry, acpi_model::install, and rc.

Referenced by dummy_san_describe(), efi_block_describe(), and int13_describe().

                                                                   {
        struct acpi_model *model;
        int rc;

        for_each_table_entry ( model, ACPI_MODELS ) {
                if ( ( rc = model->install ( install ) ) != 0 )
                        return rc;
        }

        return 0;
}