LCOV - code coverage report
Current view: top level - zephyr/acpi - acpi.h Coverage Total Hit
Test: new.info Lines: 32.4 % 71 23
Test Date: 2025-09-05 16:43:28

            Line data    Source code
       1            0 : /*
       2              :  * Copyright (c) 2023 Intel Corporation.
       3              :  *
       4              :  * SPDX-License-Identifier: Apache-2.0
       5              :  */
       6              : #ifndef ZEPHYR_INCLUDE_DRIVERS_ACPI_H_
       7              : #define ZEPHYR_INCLUDE_DRIVERS_ACPI_H_
       8              : #include <acpica/source/include/acpi.h>
       9              : #include <zephyr/drivers/pcie/pcie.h>
      10              : 
      11            0 : #define ACPI_RES_INVALID ACPI_RESOURCE_TYPE_MAX
      12              : 
      13            0 : #define ACPI_DRHD_FLAG_INCLUDE_PCI_ALL                  BIT(0)
      14            0 : #define ACPI_DMAR_FLAG_INTR_REMAP                               BIT(0)
      15            0 : #define ACPI_DMAR_FLAG_X2APIC_OPT_OUT                   BIT(1)
      16            0 : #define ACPI_DMAR_FLAG_DMA_CTRL_PLATFORM_OPT_IN BIT(2)
      17              : 
      18            0 : #define ACPI_MMIO_GET(res) (res)->reg_base[0].mmio
      19            0 : #define ACPI_IO_GET(res) (res)->reg_base[0].port
      20            0 : #define ACPI_RESOURCE_SIZE_GET(res) (res)->reg_base[0].length
      21            0 : #define ACPI_RESOURCE_TYPE_GET(res) (res)->reg_base[0].type
      22              : 
      23            0 : #define ACPI_MULTI_MMIO_GET(res, idx) (res)->reg_base[idx].mmio
      24            0 : #define ACPI_MULTI_IO_GET(res, idx) (res)->reg_base[idx].port
      25            0 : #define ACPI_MULTI_RESOURCE_SIZE_GET(res, idx) (res)->reg_base[idx].length
      26            0 : #define ACPI_MULTI_RESOURCE_TYPE_GET(res, idx) (res)->reg_base[idx].type
      27              : 
      28            0 : #define ACPI_RESOURCE_COUNT_GET(res) (res)->mmio_max
      29              : 
      30            0 : enum acpi_res_type {
      31              :         /** IO mapped Resource type */
      32              :         ACPI_RES_TYPE_IO,
      33              :         /** Memory mapped Resource type */
      34              :         ACPI_RES_TYPE_MEM,
      35              :         /** Unknown Resource type */
      36              :         ACPI_RES_TYPE_UNKNOWN,
      37              : };
      38              : 
      39            0 : struct acpi_dev {
      40            0 :         ACPI_HANDLE handle;
      41            0 :         char *path;
      42            0 :         ACPI_RESOURCE *res_lst;
      43            0 :         int res_type;
      44            0 :         ACPI_DEVICE_INFO *dev_info;
      45              : };
      46              : 
      47            0 : union acpi_dmar_id {
      48              :         struct {
      49            0 :                 uint16_t function: 3;
      50            0 :                 uint16_t device: 5;
      51            0 :                 uint16_t bus: 8;
      52            0 :         } bits;
      53              : 
      54            0 :         uint16_t raw;
      55              : };
      56              : 
      57            0 : struct acpi_mcfg {
      58            0 :         ACPI_TABLE_HEADER header;
      59              :         uint64_t _reserved;
      60            0 :         ACPI_MCFG_ALLOCATION pci_segs[];
      61              : } __packed;
      62              : 
      63            0 : struct acpi_irq_resource {
      64            0 :         uint32_t flags;
      65            0 :         uint8_t irq_vector_max;
      66            0 :         uint16_t *irqs;
      67              : };
      68              : 
      69            0 : struct acpi_reg_base {
      70            0 :         enum acpi_res_type type;
      71              :         union {
      72            0 :                 uintptr_t mmio;
      73            0 :                 uintptr_t port;
      74            0 :         };
      75            0 :         uint32_t length;
      76              : };
      77              : 
      78            0 : struct acpi_mmio_resource {
      79            0 :         uint8_t mmio_max;
      80            0 :         struct acpi_reg_base *reg_base;
      81              : };
      82              : 
      83              : /**
      84              :  * @brief Get the ACPI HID for a node
      85              :  *
      86              :  * @param node_id DTS node identifier
      87              :  * @return The HID of the ACPI node
      88              :  */
      89            1 : #define ACPI_DT_HID(node_id) DT_PROP(node_id, acpi_hid)
      90              : 
      91              : /**
      92              :  * @brief Get the ACPI UID for a node if one exist
      93              :  *
      94              :  * @param node_id DTS node identifier
      95              :  * @return The UID of the ACPI node else NULL if does not exist
      96              :  */
      97            1 : #define ACPI_DT_UID(node_id) DT_PROP_OR(node_id, acpi_uid, NULL)
      98              : 
      99              : /**
     100              :  * @brief check whether the node has ACPI HID property or not
     101              :  *
     102              :  * @param node_id DTS node identifier
     103              :  * @return 1 if the node has the HID, 0 otherwise.
     104              :  */
     105            1 : #define ACPI_DT_HAS_HID(node_id) DT_NODE_HAS_PROP(node_id, acpi_hid)
     106              : 
     107              : /**
     108              :  * @brief check whether the node has ACPI UID property or not
     109              :  *
     110              :  * @param node_id DTS node identifier
     111              :  * @return 1 if the node has the UID, 0 otherwise.
     112              :  */
     113            1 : #define ACPI_DT_HAS_UID(node_id) DT_NODE_HAS_PROP(node_id, acpi_uid)
     114              : 
     115              : /**
     116              :  * @brief Init legacy interrupt routing table information from ACPI.
     117              :  * Currently assume platform have only one PCI bus.
     118              :  *
     119              :  * @param hid the hardware id of the ACPI child device
     120              :  * @param uid the unique id of the ACPI child device. The uid can be
     121              :  * NULL if only one device with given hid present in the platform.
     122              :  * @return return 0 on success or error code
     123              :  */
     124            1 : int acpi_legacy_irq_init(const char *hid, const char *uid);
     125              : 
     126              : /**
     127              :  * @brief Retrieve a legacy interrupt number for a PCI device.
     128              :  *
     129              :  * @param bdf the BDF of endpoint/PCI device
     130              :  * @return return IRQ number or UINT_MAX if not found
     131              :  */
     132            1 : uint32_t acpi_legacy_irq_get(pcie_bdf_t bdf);
     133              : 
     134              : /**
     135              :  * @brief Retrieve the current resource settings of a device.
     136              :  *
     137              :  * @param dev_name the name of the device
     138              :  * @param res the list of acpi resource list
     139              :  * @return return 0 on success or error code
     140              :  */
     141            1 : int acpi_current_resource_get(char *dev_name, ACPI_RESOURCE **res);
     142              : 
     143              : /**
     144              :  * @brief Retrieve possible resource settings of a device.
     145              :  *
     146              :  * @param dev_name the name of the device
     147              :  * @param res the list of acpi resource list
     148              :  * @return return 0 on success or error code
     149              :  */
     150            1 : int acpi_possible_resource_get(char *dev_name, ACPI_RESOURCE **res);
     151              : 
     152              : /**
     153              :  * @brief Free current resource list memory which is retrieved by
     154              :  * acpi_current_resource_get().
     155              :  *
     156              :  * @param res the list of acpi resource list
     157              :  * @return return 0 on success or error code
     158              :  */
     159            1 : int acpi_current_resource_free(ACPI_RESOURCE *res);
     160              : 
     161              : /**
     162              :  * @brief Parse resource table for a given resource type.
     163              :  *
     164              :  * @param res the list of acpi resource list
     165              :  * @param res_type the acpi resource type
     166              :  * @return resource list for the given type on success or NULL
     167              :  */
     168            1 : ACPI_RESOURCE *acpi_resource_parse(ACPI_RESOURCE *res, int res_type);
     169              : 
     170              : /**
     171              :  * @brief Retrieve ACPI device info for given hardware id and unique id.
     172              :  *
     173              :  * @param hid the hardware id of the ACPI child device
     174              :  * @param uid the unique id of the ACPI child device. The uid can be
     175              :  * NULL if only one device with given HID present in the platform.
     176              :  * @return ACPI child device info on success or NULL
     177              :  */
     178            1 : struct acpi_dev *acpi_device_get(const char *hid, const char *uid);
     179              : 
     180              : /**
     181              :  * @brief Retrieve acpi device info from the index.
     182              :  *
     183              :  * @param index the device index of an acpi child device
     184              :  * @return acpi child device info on success or NULL
     185              :  */
     186            1 : struct acpi_dev *acpi_device_by_index_get(int index);
     187              : 
     188              : /**
     189              :  * @brief Parse resource table for irq info.
     190              :  *
     191              :  * @param res_lst the list of acpi resource list
     192              :  * @return irq resource list on success or NULL
     193              :  */
     194            1 : static inline ACPI_RESOURCE_IRQ *acpi_irq_res_get(ACPI_RESOURCE *res_lst)
     195              : {
     196              :         ACPI_RESOURCE *res = acpi_resource_parse(res_lst, ACPI_RESOURCE_TYPE_IRQ);
     197              : 
     198              :         return res ? &res->Data.Irq : NULL;
     199              : }
     200              : 
     201              : /**
     202              :  * @brief Parse resource table for irq info.
     203              :  *
     204              :  * @param child_dev the device object of the ACPI node
     205              :  * @param irq_res irq resource info
     206              :  * @return return 0 on success or error code
     207              :  */
     208            1 : int acpi_device_irq_get(struct acpi_dev *child_dev, struct acpi_irq_resource *irq_res);
     209              : 
     210              : /**
     211              :  * @brief Parse resource table for MMIO info.
     212              :  *
     213              :  * @param child_dev the device object of the ACPI node
     214              :  * @param mmio_res MMIO resource info
     215              :  * @return return 0 on success or error code
     216              :  */
     217            1 : int acpi_device_mmio_get(struct acpi_dev *child_dev, struct acpi_mmio_resource *mmio_res);
     218              : 
     219              : /**
     220              :  * @brief Parse resource table for identify resource type.
     221              :  *
     222              :  * @param res the list of acpi resource list
     223              :  * @return resource type on success or invalid resource type
     224              :  */
     225            1 : int acpi_device_type_get(ACPI_RESOURCE *res);
     226              : 
     227              : /**
     228              :  * @brief Retrieve acpi table for the given signature.
     229              :  *
     230              :  * @param signature pointer to the 4-character ACPI signature for the requested table
     231              :  * @param inst instance number for the requested table
     232              :  * @return acpi_table pointer to the acpi table on success else return NULL
     233              :  */
     234            1 : void *acpi_table_get(char *signature, int inst);
     235              : 
     236              : /**
     237              :  * @brief retrieve acpi MAD table for the given type.
     238              :  *
     239              :  * @param type type of requested MAD table
     240              :  * @param tables pointer to the MAD table
     241              :  * @param num_inst number of instance for the requested table
     242              :  * @return return 0 on success or error code
     243              :  */
     244            1 : int acpi_madt_entry_get(int type, ACPI_SUBTABLE_HEADER **tables, int *num_inst);
     245              : 
     246              : /**
     247              :  * @brief retrieve DMA remapping structure for the given type.
     248              :  *
     249              :  * @param type type of remapping structure
     250              :  * @param tables pointer to the dmar id structure
     251              :  * @return return 0 on success or error code
     252              :  */
     253            1 : int acpi_dmar_entry_get(enum AcpiDmarType type, ACPI_SUBTABLE_HEADER **tables);
     254              : 
     255              : /**
     256              :  * @brief retrieve acpi DRHD info for the given scope.
     257              :  *
     258              :  * @param scope scope of requested DHRD table
     259              :  * @param dev_scope pointer to the sub table (optional)
     260              :  * @param dmar_id pointer to the DHRD info
     261              :  * @param num_inst number of instance for the requested table
     262              :  * @param max_inst maximum number of entry for the given dmar_id buffer
     263              :  * @return return 0 on success or error code
     264              :  */
     265            1 : int acpi_drhd_get(enum AcpiDmarScopeType scope, ACPI_DMAR_DEVICE_SCOPE *dev_scope,
     266              :                   union acpi_dmar_id *dmar_id, int *num_inst, int max_inst);
     267              : 
     268            0 : typedef void (*dmar_foreach_subtable_func_t)(ACPI_DMAR_HEADER *subtable, void *arg);
     269            0 : typedef void (*dmar_foreach_devscope_func_t)(ACPI_DMAR_DEVICE_SCOPE *devscope, void *arg);
     270              : 
     271            0 : void acpi_dmar_foreach_subtable(ACPI_TABLE_DMAR *dmar, dmar_foreach_subtable_func_t func,
     272              :                                 void *arg);
     273            0 : void acpi_dmar_foreach_devscope(ACPI_DMAR_HARDWARE_UNIT *hu,
     274              :                                 dmar_foreach_devscope_func_t func, void *arg);
     275              : 
     276              : /**
     277              :  * @brief Retrieve IOAPIC id
     278              :  *
     279              :  * @param ioapic_id IOAPIC id
     280              :  * @return return 0 on success or error code
     281              :  */
     282            1 : int acpi_dmar_ioapic_get(uint16_t *ioapic_id);
     283              : 
     284              : /**
     285              :  * @brief Retrieve the 'n'th enabled local apic info.
     286              :  *
     287              :  * @param cpu_num the cpu number
     288              :  * @return local apic info on success or NULL otherwise
     289              :  */
     290            1 : ACPI_MADT_LOCAL_APIC *acpi_local_apic_get(int cpu_num);
     291              : 
     292              : /**
     293              :  * @brief invoke an ACPI method and return the result.
     294              :  *
     295              :  * @param path the path name of the ACPI object
     296              :  * @param arg_list the list of arguments to be pass down
     297              :  * @param ret_obj the ACPI result to be return
     298              :  * @return return 0 on success or error code
     299              :  */
     300            1 : int acpi_invoke_method(char *path, ACPI_OBJECT_LIST *arg_list, ACPI_OBJECT *ret_obj);
     301              : 
     302              : #endif
        

Generated by: LCOV version 2.0-1