1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*
3   *  fw_tables.h - Parsing support for ACPI and ACPI-like tables provided by
4   *                platform or device firmware
5   *
6   *  Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
7   *  Copyright (C) 2023 Intel Corp.
8   */
9  #ifndef _FW_TABLE_H_
10  #define _FW_TABLE_H_
11  
12  union acpi_subtable_headers;
13  
14  typedef int (*acpi_tbl_entry_handler)(union acpi_subtable_headers *header,
15  				      const unsigned long end);
16  
17  typedef int (*acpi_tbl_entry_handler_arg)(union acpi_subtable_headers *header,
18  					  void *arg, const unsigned long end);
19  
20  struct acpi_subtable_proc {
21  	int id;
22  	acpi_tbl_entry_handler handler;
23  	acpi_tbl_entry_handler_arg handler_arg;
24  	void *arg;
25  	int count;
26  };
27  
28  union fw_table_header {
29  	struct acpi_table_header acpi;
30  	struct acpi_table_cdat cdat;
31  };
32  
33  union acpi_subtable_headers {
34  	struct acpi_subtable_header common;
35  	struct acpi_hmat_structure hmat;
36  	struct acpi_prmt_module_header prmt;
37  	struct acpi_cedt_header cedt;
38  	struct acpi_cdat_header cdat;
39  };
40  
41  int acpi_parse_entries_array(char *id, unsigned long table_size,
42  			     union fw_table_header *table_header,
43  			     unsigned long max_length,
44  			     struct acpi_subtable_proc *proc,
45  			     int proc_num, unsigned int max_entries);
46  
47  int cdat_table_parse(enum acpi_cdat_type type,
48  		     acpi_tbl_entry_handler_arg handler_arg, void *arg,
49  		     struct acpi_table_cdat *table_header,
50  		     unsigned long length);
51  
52  /* CXL is the only non-ACPI consumer of the FIRMWARE_TABLE library */
53  #if IS_ENABLED(CONFIG_ACPI) && !IS_ENABLED(CONFIG_CXL_BUS)
54  #define EXPORT_SYMBOL_FWTBL_LIB(x) EXPORT_SYMBOL_ACPI_LIB(x)
55  #define __init_or_fwtbl_lib __init_or_acpilib
56  #else
57  #define EXPORT_SYMBOL_FWTBL_LIB(x) EXPORT_SYMBOL_NS_GPL(x, CXL)
58  #define __init_or_fwtbl_lib
59  #endif
60  
61  #endif
62