brintos

brintos / linux-shallow public Read only

0
0
Text · 44.7 KiB · 4d5ee84 Raw
1592 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 * acpi.h - ACPI Interface4 *5 * Copyright (C) 2001 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>6 */7 8#ifndef _LINUX_ACPI_H9#define _LINUX_ACPI_H10 11#include <linux/errno.h>12#include <linux/ioport.h>	/* for struct resource */13#include <linux/resource_ext.h>14#include <linux/device.h>15#include <linux/mod_devicetable.h>16#include <linux/property.h>17#include <linux/uuid.h>18#include <linux/node.h>19 20struct irq_domain;21struct irq_domain_ops;22 23#ifndef _LINUX24#define _LINUX25#endif26#include <acpi/acpi.h>27#include <acpi/acpi_numa.h>28 29#ifdef	CONFIG_ACPI30 31#include <linux/list.h>32#include <linux/dynamic_debug.h>33#include <linux/module.h>34#include <linux/mutex.h>35#include <linux/fw_table.h>36 37#include <acpi/acpi_bus.h>38#include <acpi/acpi_drivers.h>39#include <acpi/acpi_io.h>40#include <asm/acpi.h>41 42#ifdef CONFIG_ACPI_TABLE_LIB43#define EXPORT_SYMBOL_ACPI_LIB(x) EXPORT_SYMBOL_NS_GPL(x, ACPI)44#define __init_or_acpilib45#define __initdata_or_acpilib46#else47#define EXPORT_SYMBOL_ACPI_LIB(x)48#define __init_or_acpilib __init49#define __initdata_or_acpilib __initdata50#endif51 52static inline acpi_handle acpi_device_handle(struct acpi_device *adev)53{54	return adev ? adev->handle : NULL;55}56 57#define ACPI_COMPANION(dev)		to_acpi_device_node((dev)->fwnode)58#define ACPI_COMPANION_SET(dev, adev)	set_primary_fwnode(dev, (adev) ? \59	acpi_fwnode_handle(adev) : NULL)60#define ACPI_HANDLE(dev)		acpi_device_handle(ACPI_COMPANION(dev))61#define ACPI_HANDLE_FWNODE(fwnode)	\62				acpi_device_handle(to_acpi_device_node(fwnode))63 64static inline struct fwnode_handle *acpi_alloc_fwnode_static(void)65{66	struct fwnode_handle *fwnode;67 68	fwnode = kzalloc(sizeof(struct fwnode_handle), GFP_KERNEL);69	if (!fwnode)70		return NULL;71 72	fwnode_init(fwnode, &acpi_static_fwnode_ops);73 74	return fwnode;75}76 77static inline void acpi_free_fwnode_static(struct fwnode_handle *fwnode)78{79	if (WARN_ON(!is_acpi_static_node(fwnode)))80		return;81 82	kfree(fwnode);83}84 85static inline bool has_acpi_companion(struct device *dev)86{87	return is_acpi_device_node(dev->fwnode);88}89 90static inline void acpi_preset_companion(struct device *dev,91					 struct acpi_device *parent, u64 addr)92{93	ACPI_COMPANION_SET(dev, acpi_find_child_device(parent, addr, false));94}95 96static inline const char *acpi_dev_name(struct acpi_device *adev)97{98	return dev_name(&adev->dev);99}100 101struct device *acpi_get_first_physical_node(struct acpi_device *adev);102 103enum acpi_irq_model_id {104	ACPI_IRQ_MODEL_PIC = 0,105	ACPI_IRQ_MODEL_IOAPIC,106	ACPI_IRQ_MODEL_IOSAPIC,107	ACPI_IRQ_MODEL_PLATFORM,108	ACPI_IRQ_MODEL_GIC,109	ACPI_IRQ_MODEL_LPIC,110	ACPI_IRQ_MODEL_RINTC,111	ACPI_IRQ_MODEL_COUNT112};113 114extern enum acpi_irq_model_id	acpi_irq_model;115 116enum acpi_interrupt_id {117	ACPI_INTERRUPT_PMI	= 1,118	ACPI_INTERRUPT_INIT,119	ACPI_INTERRUPT_CPEI,120	ACPI_INTERRUPT_COUNT121};122 123#define	ACPI_SPACE_MEM		0124 125enum acpi_address_range_id {126	ACPI_ADDRESS_RANGE_MEMORY = 1,127	ACPI_ADDRESS_RANGE_RESERVED = 2,128	ACPI_ADDRESS_RANGE_ACPI = 3,129	ACPI_ADDRESS_RANGE_NVS	= 4,130	ACPI_ADDRESS_RANGE_COUNT131};132 133 134/* Table Handlers */135typedef int (*acpi_tbl_table_handler)(struct acpi_table_header *table);136 137/* Debugger support */138 139struct acpi_debugger_ops {140	int (*create_thread)(acpi_osd_exec_callback function, void *context);141	ssize_t (*write_log)(const char *msg);142	ssize_t (*read_cmd)(char *buffer, size_t length);143	int (*wait_command_ready)(bool single_step, char *buffer, size_t length);144	int (*notify_command_complete)(void);145};146 147struct acpi_debugger {148	const struct acpi_debugger_ops *ops;149	struct module *owner;150	struct mutex lock;151};152 153#ifdef CONFIG_ACPI_DEBUGGER154int __init acpi_debugger_init(void);155int acpi_register_debugger(struct module *owner,156			   const struct acpi_debugger_ops *ops);157void acpi_unregister_debugger(const struct acpi_debugger_ops *ops);158int acpi_debugger_create_thread(acpi_osd_exec_callback function, void *context);159ssize_t acpi_debugger_write_log(const char *msg);160ssize_t acpi_debugger_read_cmd(char *buffer, size_t buffer_length);161int acpi_debugger_wait_command_ready(void);162int acpi_debugger_notify_command_complete(void);163#else164static inline int acpi_debugger_init(void)165{166	return -ENODEV;167}168 169static inline int acpi_register_debugger(struct module *owner,170					 const struct acpi_debugger_ops *ops)171{172	return -ENODEV;173}174 175static inline void acpi_unregister_debugger(const struct acpi_debugger_ops *ops)176{177}178 179static inline int acpi_debugger_create_thread(acpi_osd_exec_callback function,180					      void *context)181{182	return -ENODEV;183}184 185static inline int acpi_debugger_write_log(const char *msg)186{187	return -ENODEV;188}189 190static inline int acpi_debugger_read_cmd(char *buffer, u32 buffer_length)191{192	return -ENODEV;193}194 195static inline int acpi_debugger_wait_command_ready(void)196{197	return -ENODEV;198}199 200static inline int acpi_debugger_notify_command_complete(void)201{202	return -ENODEV;203}204#endif205 206#define BAD_MADT_ENTRY(entry, end) (					    \207		(!entry) || (unsigned long)entry + sizeof(*entry) > end ||  \208		((struct acpi_subtable_header *)entry)->length < sizeof(*entry))209 210void __iomem *__acpi_map_table(unsigned long phys, unsigned long size);211void __acpi_unmap_table(void __iomem *map, unsigned long size);212int early_acpi_boot_init(void);213int acpi_boot_init (void);214void acpi_boot_table_prepare (void);215void acpi_boot_table_init (void);216int acpi_mps_check (void);217int acpi_numa_init (void);218 219int acpi_locate_initial_tables (void);220void acpi_reserve_initial_tables (void);221void acpi_table_init_complete (void);222int acpi_table_init (void);223 224int acpi_table_parse(char *id, acpi_tbl_table_handler handler);225int __init_or_acpilib acpi_table_parse_entries(char *id,226		unsigned long table_size, int entry_id,227		acpi_tbl_entry_handler handler, unsigned int max_entries);228int __init_or_acpilib acpi_table_parse_entries_array(char *id,229		unsigned long table_size, struct acpi_subtable_proc *proc,230		int proc_num, unsigned int max_entries);231int acpi_table_parse_madt(enum acpi_madt_type id,232			  acpi_tbl_entry_handler handler,233			  unsigned int max_entries);234int __init_or_acpilib235acpi_table_parse_cedt(enum acpi_cedt_type id,236		      acpi_tbl_entry_handler_arg handler_arg, void *arg);237 238int acpi_parse_mcfg (struct acpi_table_header *header);239void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);240 241#if defined(CONFIG_X86) || defined(CONFIG_LOONGARCH)242void acpi_numa_processor_affinity_init (struct acpi_srat_cpu_affinity *pa);243#else244static inline void245acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa) { }246#endif247 248void acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa);249 250#if defined(CONFIG_ARM64) || defined(CONFIG_LOONGARCH)251void acpi_arch_dma_setup(struct device *dev);252#else253static inline void acpi_arch_dma_setup(struct device *dev) { }254#endif255 256#ifdef CONFIG_ARM64257void acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa);258#else259static inline void260acpi_numa_gicc_affinity_init(struct acpi_srat_gicc_affinity *pa) { }261#endif262 263#ifdef CONFIG_RISCV264void acpi_numa_rintc_affinity_init(struct acpi_srat_rintc_affinity *pa);265#else266static inline void acpi_numa_rintc_affinity_init(struct acpi_srat_rintc_affinity *pa) { }267#endif268 269#ifndef PHYS_CPUID_INVALID270typedef u32 phys_cpuid_t;271#define PHYS_CPUID_INVALID (phys_cpuid_t)(-1)272#endif273 274static inline bool invalid_logical_cpuid(u32 cpuid)275{276	return (int)cpuid < 0;277}278 279static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id)280{281	return phys_id == PHYS_CPUID_INVALID;282}283 284 285int __init acpi_get_madt_revision(void);286 287/* Validate the processor object's proc_id */288bool acpi_duplicate_processor_id(int proc_id);289/* Processor _CTS control */290struct acpi_processor_power;291 292#ifdef CONFIG_ACPI_PROCESSOR_CSTATE293bool acpi_processor_claim_cst_control(void);294int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,295				struct acpi_processor_power *info);296#else297static inline bool acpi_processor_claim_cst_control(void) { return false; }298static inline int acpi_processor_evaluate_cst(acpi_handle handle, u32 cpu,299					      struct acpi_processor_power *info)300{301	return -ENODEV;302}303#endif304 305#ifdef CONFIG_ACPI_HOTPLUG_CPU306/* Arch dependent functions for cpu hotplug support */307int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id,308		 int *pcpu);309int acpi_unmap_cpu(int cpu);310#endif /* CONFIG_ACPI_HOTPLUG_CPU */311 312acpi_handle acpi_get_processor_handle(int cpu);313 314#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC315int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);316#endif317 318int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);319int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base);320int acpi_ioapic_registered(acpi_handle handle, u32 gsi_base);321void acpi_irq_stats_init(void);322extern u32 acpi_irq_handled;323extern u32 acpi_irq_not_handled;324extern unsigned int acpi_sci_irq;325extern bool acpi_no_s5;326#define INVALID_ACPI_IRQ	((unsigned)-1)327static inline bool acpi_sci_irq_valid(void)328{329	return acpi_sci_irq != INVALID_ACPI_IRQ;330}331 332extern int sbf_port;333extern unsigned long acpi_realmode_flags;334 335int acpi_register_gsi (struct device *dev, u32 gsi, int triggering, int polarity);336int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);337int acpi_isa_irq_to_gsi (unsigned isa_irq, u32 *gsi);338 339void acpi_set_irq_model(enum acpi_irq_model_id model,340			struct fwnode_handle *(*)(u32));341void acpi_set_gsi_to_irq_fallback(u32 (*)(u32));342 343struct irq_domain *acpi_irq_create_hierarchy(unsigned int flags,344					     unsigned int size,345					     struct fwnode_handle *fwnode,346					     const struct irq_domain_ops *ops,347					     void *host_data);348 349#ifdef CONFIG_X86_IO_APIC350extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity);351#else352static inline int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity)353{354	return -1;355}356#endif357/*358 * This function undoes the effect of one call to acpi_register_gsi().359 * If this matches the last registration, any IRQ resources for gsi360 * are freed.361 */362void acpi_unregister_gsi (u32 gsi);363 364struct pci_dev;365 366struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin);367int acpi_pci_irq_enable (struct pci_dev *dev);368void acpi_penalize_isa_irq(int irq, int active);369bool acpi_isa_irq_available(int irq);370#ifdef CONFIG_PCI371void acpi_penalize_sci_irq(int irq, int trigger, int polarity);372#else373static inline void acpi_penalize_sci_irq(int irq, int trigger,374					int polarity)375{376}377#endif378void acpi_pci_irq_disable (struct pci_dev *dev);379 380extern int ec_read(u8 addr, u8 *val);381extern int ec_write(u8 addr, u8 val);382extern int ec_transaction(u8 command,383                          const u8 *wdata, unsigned wdata_len,384                          u8 *rdata, unsigned rdata_len);385extern acpi_handle ec_get_handle(void);386 387extern bool acpi_is_pnp_device(struct acpi_device *);388 389#if defined(CONFIG_ACPI_WMI) || defined(CONFIG_ACPI_WMI_MODULE)390 391typedef void (*wmi_notify_handler) (union acpi_object *data, void *context);392 393int wmi_instance_count(const char *guid);394 395extern acpi_status wmi_evaluate_method(const char *guid, u8 instance,396					u32 method_id,397					const struct acpi_buffer *in,398					struct acpi_buffer *out);399extern acpi_status wmi_query_block(const char *guid, u8 instance,400					struct acpi_buffer *out);401extern acpi_status wmi_set_block(const char *guid, u8 instance,402					const struct acpi_buffer *in);403extern acpi_status wmi_install_notify_handler(const char *guid,404					wmi_notify_handler handler, void *data);405extern acpi_status wmi_remove_notify_handler(const char *guid);406extern bool wmi_has_guid(const char *guid);407extern char *wmi_get_acpi_device_uid(const char *guid);408 409#endif	/* CONFIG_ACPI_WMI */410 411#define ACPI_VIDEO_OUTPUT_SWITCHING			0x0001412#define ACPI_VIDEO_DEVICE_POSTING			0x0002413#define ACPI_VIDEO_ROM_AVAILABLE			0x0004414#define ACPI_VIDEO_BACKLIGHT				0x0008415#define ACPI_VIDEO_BACKLIGHT_FORCE_VENDOR		0x0010416#define ACPI_VIDEO_BACKLIGHT_FORCE_VIDEO		0x0020417#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VENDOR	0x0040418#define ACPI_VIDEO_OUTPUT_SWITCHING_FORCE_VIDEO		0x0080419#define ACPI_VIDEO_BACKLIGHT_DMI_VENDOR			0x0100420#define ACPI_VIDEO_BACKLIGHT_DMI_VIDEO			0x0200421#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VENDOR		0x0400422#define ACPI_VIDEO_OUTPUT_SWITCHING_DMI_VIDEO		0x0800423 424extern char acpi_video_backlight_string[];425extern long acpi_is_video_device(acpi_handle handle);426 427extern void acpi_osi_setup(char *str);428extern bool acpi_osi_is_win8(void);429 430#ifdef CONFIG_ACPI_THERMAL_LIB431int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp);432int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp);433int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp);434int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp);435#endif436 437#ifdef CONFIG_ACPI_HMAT438int acpi_get_genport_coordinates(u32 uid, struct access_coordinate *coord);439#else440static inline int acpi_get_genport_coordinates(u32 uid,441					       struct access_coordinate *coord)442{443	return -EOPNOTSUPP;444}445#endif446 447#ifdef CONFIG_ACPI_NUMA448int acpi_map_pxm_to_node(int pxm);449int acpi_get_node(acpi_handle handle);450 451/**452 * pxm_to_online_node - Map proximity ID to online node453 * @pxm: ACPI proximity ID454 *455 * This is similar to pxm_to_node(), but always returns an online456 * node.  When the mapped node from a given proximity ID is offline, it457 * looks up the node distance table and returns the nearest online node.458 *459 * ACPI device drivers, which are called after the NUMA initialization has460 * completed in the kernel, can call this interface to obtain their device461 * NUMA topology from ACPI tables.  Such drivers do not have to deal with462 * offline nodes.  A node may be offline when SRAT memory entry does not exist,463 * or NUMA is disabled, ex. "numa=off" on x86.464 */465static inline int pxm_to_online_node(int pxm)466{467	int node = pxm_to_node(pxm);468 469	return numa_map_to_online_node(node);470}471#else472static inline int pxm_to_online_node(int pxm)473{474	return 0;475}476static inline int acpi_map_pxm_to_node(int pxm)477{478	return 0;479}480static inline int acpi_get_node(acpi_handle handle)481{482	return 0;483}484#endif485extern int pnpacpi_disabled;486 487#define PXM_INVAL	(-1)488 489bool acpi_dev_resource_memory(struct acpi_resource *ares, struct resource *res);490bool acpi_dev_resource_io(struct acpi_resource *ares, struct resource *res);491bool acpi_dev_resource_address_space(struct acpi_resource *ares,492				     struct resource_win *win);493bool acpi_dev_resource_ext_address_space(struct acpi_resource *ares,494					 struct resource_win *win);495unsigned long acpi_dev_irq_flags(u8 triggering, u8 polarity, u8 shareable, u8 wake_capable);496unsigned int acpi_dev_get_irq_type(int triggering, int polarity);497bool acpi_dev_resource_interrupt(struct acpi_resource *ares, int index,498				 struct resource *res);499 500void acpi_dev_free_resource_list(struct list_head *list);501int acpi_dev_get_resources(struct acpi_device *adev, struct list_head *list,502			   int (*preproc)(struct acpi_resource *, void *),503			   void *preproc_data);504int acpi_dev_get_dma_resources(struct acpi_device *adev,505			       struct list_head *list);506int acpi_dev_get_memory_resources(struct acpi_device *adev, struct list_head *list);507int acpi_dev_filter_resource_type(struct acpi_resource *ares,508				  unsigned long types);509 510static inline int acpi_dev_filter_resource_type_cb(struct acpi_resource *ares,511						   void *arg)512{513	return acpi_dev_filter_resource_type(ares, (unsigned long)arg);514}515 516struct acpi_device *acpi_resource_consumer(struct resource *res);517 518int acpi_check_resource_conflict(const struct resource *res);519 520int acpi_check_region(resource_size_t start, resource_size_t n,521		      const char *name);522 523int acpi_resources_are_enforced(void);524 525#ifdef CONFIG_HIBERNATION526extern int acpi_check_s4_hw_signature;527#endif528 529#ifdef CONFIG_PM_SLEEP530void __init acpi_old_suspend_ordering(void);531void __init acpi_nvs_nosave(void);532void __init acpi_nvs_nosave_s3(void);533void __init acpi_sleep_no_blacklist(void);534#endif /* CONFIG_PM_SLEEP */535 536int acpi_register_wakeup_handler(537	int wake_irq, bool (*wakeup)(void *context), void *context);538void acpi_unregister_wakeup_handler(539	bool (*wakeup)(void *context), void *context);540 541struct acpi_osc_context {542	char *uuid_str;			/* UUID string */543	int rev;544	struct acpi_buffer cap;		/* list of DWORD capabilities */545	struct acpi_buffer ret;		/* free by caller if success */546};547 548acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);549 550/* Number of _OSC capability DWORDS depends on bridge type */551#define OSC_PCI_CAPABILITY_DWORDS		3552#define OSC_CXL_CAPABILITY_DWORDS		5553 554/* Indexes into _OSC Capabilities Buffer (DWORDs 2 to 5 are device-specific) */555#define OSC_QUERY_DWORD				0	/* DWORD 1 */556#define OSC_SUPPORT_DWORD			1	/* DWORD 2 */557#define OSC_CONTROL_DWORD			2	/* DWORD 3 */558#define OSC_EXT_SUPPORT_DWORD			3	/* DWORD 4 */559#define OSC_EXT_CONTROL_DWORD			4	/* DWORD 5 */560 561/* _OSC Capabilities DWORD 1: Query/Control and Error Returns (generic) */562#define OSC_QUERY_ENABLE			0x00000001  /* input */563#define OSC_REQUEST_ERROR			0x00000002  /* return */564#define OSC_INVALID_UUID_ERROR			0x00000004  /* return */565#define OSC_INVALID_REVISION_ERROR		0x00000008  /* return */566#define OSC_CAPABILITIES_MASK_ERROR		0x00000010  /* return */567 568/* Platform-Wide Capabilities _OSC: Capabilities DWORD 2: Support Field */569#define OSC_SB_PAD_SUPPORT			0x00000001570#define OSC_SB_PPC_OST_SUPPORT			0x00000002571#define OSC_SB_PR3_SUPPORT			0x00000004572#define OSC_SB_HOTPLUG_OST_SUPPORT		0x00000008573#define OSC_SB_APEI_SUPPORT			0x00000010574#define OSC_SB_CPC_SUPPORT			0x00000020575#define OSC_SB_CPCV2_SUPPORT			0x00000040576#define OSC_SB_PCLPI_SUPPORT			0x00000080577#define OSC_SB_OSLPI_SUPPORT			0x00000100578#define OSC_SB_FAST_THERMAL_SAMPLING_SUPPORT	0x00000200579#define OSC_SB_OVER_16_PSTATES_SUPPORT		0x00000400580#define OSC_SB_GED_SUPPORT			0x00000800581#define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT		0x00001000582#define OSC_SB_IRQ_RESOURCE_SOURCE_SUPPORT	0x00002000583#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE		0x00004000584#define OSC_SB_GENERIC_INITIATOR_SUPPORT	0x00020000585#define OSC_SB_NATIVE_USB4_SUPPORT		0x00040000586#define OSC_SB_BATTERY_CHARGE_LIMITING_SUPPORT	0x00080000587#define OSC_SB_PRM_SUPPORT			0x00200000588#define OSC_SB_FFH_OPR_SUPPORT			0x00400000589 590extern bool osc_sb_apei_support_acked;591extern bool osc_pc_lpi_support_confirmed;592extern bool osc_sb_native_usb4_support_confirmed;593extern bool osc_sb_cppc2_support_acked;594extern bool osc_cpc_flexible_adr_space_confirmed;595 596/* USB4 Capabilities */597#define OSC_USB_USB3_TUNNELING			0x00000001598#define OSC_USB_DP_TUNNELING			0x00000002599#define OSC_USB_PCIE_TUNNELING			0x00000004600#define OSC_USB_XDOMAIN				0x00000008601 602extern u32 osc_sb_native_usb4_control;603 604/* PCI Host Bridge _OSC: Capabilities DWORD 2: Support Field */605#define OSC_PCI_EXT_CONFIG_SUPPORT		0x00000001606#define OSC_PCI_ASPM_SUPPORT			0x00000002607#define OSC_PCI_CLOCK_PM_SUPPORT		0x00000004608#define OSC_PCI_SEGMENT_GROUPS_SUPPORT		0x00000008609#define OSC_PCI_MSI_SUPPORT			0x00000010610#define OSC_PCI_EDR_SUPPORT			0x00000080611#define OSC_PCI_HPX_TYPE_3_SUPPORT		0x00000100612 613/* PCI Host Bridge _OSC: Capabilities DWORD 3: Control Field */614#define OSC_PCI_EXPRESS_NATIVE_HP_CONTROL	0x00000001615#define OSC_PCI_SHPC_NATIVE_HP_CONTROL		0x00000002616#define OSC_PCI_EXPRESS_PME_CONTROL		0x00000004617#define OSC_PCI_EXPRESS_AER_CONTROL		0x00000008618#define OSC_PCI_EXPRESS_CAPABILITY_CONTROL	0x00000010619#define OSC_PCI_EXPRESS_LTR_CONTROL		0x00000020620#define OSC_PCI_EXPRESS_DPC_CONTROL		0x00000080621 622/* CXL _OSC: Capabilities DWORD 4: Support Field */623#define OSC_CXL_1_1_PORT_REG_ACCESS_SUPPORT	0x00000001624#define OSC_CXL_2_0_PORT_DEV_REG_ACCESS_SUPPORT	0x00000002625#define OSC_CXL_PROTOCOL_ERR_REPORTING_SUPPORT	0x00000004626#define OSC_CXL_NATIVE_HP_SUPPORT		0x00000008627 628/* CXL _OSC: Capabilities DWORD 5: Control Field */629#define OSC_CXL_ERROR_REPORTING_CONTROL		0x00000001630 631static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)632{633	u32 *ret = context->ret.pointer;634 635	return ret[OSC_CONTROL_DWORD];636}637 638static inline u32 acpi_osc_ctx_get_cxl_control(struct acpi_osc_context *context)639{640	u32 *ret = context->ret.pointer;641 642	return ret[OSC_EXT_CONTROL_DWORD];643}644 645#define ACPI_GSB_ACCESS_ATTRIB_QUICK		0x00000002646#define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV         0x00000004647#define ACPI_GSB_ACCESS_ATTRIB_BYTE		0x00000006648#define ACPI_GSB_ACCESS_ATTRIB_WORD		0x00000008649#define ACPI_GSB_ACCESS_ATTRIB_BLOCK		0x0000000A650#define ACPI_GSB_ACCESS_ATTRIB_MULTIBYTE	0x0000000B651#define ACPI_GSB_ACCESS_ATTRIB_WORD_CALL	0x0000000C652#define ACPI_GSB_ACCESS_ATTRIB_BLOCK_CALL	0x0000000D653#define ACPI_GSB_ACCESS_ATTRIB_RAW_BYTES	0x0000000E654#define ACPI_GSB_ACCESS_ATTRIB_RAW_PROCESS	0x0000000F655 656/* Enable _OST when all relevant hotplug operations are enabled */657#if defined(CONFIG_ACPI_HOTPLUG_CPU) &&			\658	defined(CONFIG_ACPI_HOTPLUG_MEMORY) &&		\659	defined(CONFIG_ACPI_CONTAINER)660#define ACPI_HOTPLUG_OST661#endif662 663/* _OST Source Event Code (OSPM Action) */664#define ACPI_OST_EC_OSPM_SHUTDOWN		0x100665#define ACPI_OST_EC_OSPM_EJECT			0x103666#define ACPI_OST_EC_OSPM_INSERTION		0x200667 668/* _OST General Processing Status Code */669#define ACPI_OST_SC_SUCCESS			0x0670#define ACPI_OST_SC_NON_SPECIFIC_FAILURE	0x1671#define ACPI_OST_SC_UNRECOGNIZED_NOTIFY		0x2672 673/* _OST OS Shutdown Processing (0x100) Status Code */674#define ACPI_OST_SC_OS_SHUTDOWN_DENIED		0x80675#define ACPI_OST_SC_OS_SHUTDOWN_IN_PROGRESS	0x81676#define ACPI_OST_SC_OS_SHUTDOWN_COMPLETED	0x82677#define ACPI_OST_SC_OS_SHUTDOWN_NOT_SUPPORTED	0x83678 679/* _OST Ejection Request (0x3, 0x103) Status Code */680#define ACPI_OST_SC_EJECT_NOT_SUPPORTED		0x80681#define ACPI_OST_SC_DEVICE_IN_USE		0x81682#define ACPI_OST_SC_DEVICE_BUSY			0x82683#define ACPI_OST_SC_EJECT_DEPENDENCY_BUSY	0x83684#define ACPI_OST_SC_EJECT_IN_PROGRESS		0x84685 686/* _OST Insertion Request (0x200) Status Code */687#define ACPI_OST_SC_INSERT_IN_PROGRESS		0x80688#define ACPI_OST_SC_DRIVER_LOAD_FAILURE		0x81689#define ACPI_OST_SC_INSERT_NOT_SUPPORTED	0x82690 691enum acpi_predicate {692	all_versions,693	less_than_or_equal,694	equal,695	greater_than_or_equal,696};697 698/* Table must be terminted by a NULL entry */699struct acpi_platform_list {700	char	oem_id[ACPI_OEM_ID_SIZE+1];701	char	oem_table_id[ACPI_OEM_TABLE_ID_SIZE+1];702	u32	oem_revision;703	char	*table;704	enum acpi_predicate pred;705	char	*reason;706	u32	data;707};708int acpi_match_platform_list(const struct acpi_platform_list *plat);709 710extern void acpi_early_init(void);711extern void acpi_subsystem_init(void);712 713extern int acpi_nvs_register(__u64 start, __u64 size);714 715extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),716				    void *data);717 718const struct acpi_device_id *acpi_match_acpi_device(const struct acpi_device_id *ids,719						    const struct acpi_device *adev);720 721const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,722					       const struct device *dev);723 724const void *acpi_device_get_match_data(const struct device *dev);725extern bool acpi_driver_match_device(struct device *dev,726				     const struct device_driver *drv);727int acpi_device_uevent_modalias(const struct device *, struct kobj_uevent_env *);728int acpi_device_modalias(struct device *, char *, int);729 730struct platform_device *acpi_create_platform_device(struct acpi_device *,731						    const struct property_entry *);732#define ACPI_PTR(_ptr)	(_ptr)733 734static inline void acpi_device_set_enumerated(struct acpi_device *adev)735{736	adev->flags.visited = true;737}738 739static inline void acpi_device_clear_enumerated(struct acpi_device *adev)740{741	adev->flags.visited = false;742}743 744enum acpi_reconfig_event  {745	ACPI_RECONFIG_DEVICE_ADD = 0,746	ACPI_RECONFIG_DEVICE_REMOVE,747};748 749int acpi_reconfig_notifier_register(struct notifier_block *nb);750int acpi_reconfig_notifier_unregister(struct notifier_block *nb);751 752#ifdef CONFIG_ACPI_GTDT753int acpi_gtdt_init(struct acpi_table_header *table, int *platform_timer_count);754int acpi_gtdt_map_ppi(int type);755bool acpi_gtdt_c3stop(int type);756int acpi_arch_timer_mem_init(struct arch_timer_mem *timer_mem, int *timer_count);757#endif758 759#ifndef ACPI_HAVE_ARCH_SET_ROOT_POINTER760static inline void acpi_arch_set_root_pointer(u64 addr)761{762}763#endif764 765#ifndef ACPI_HAVE_ARCH_GET_ROOT_POINTER766static inline u64 acpi_arch_get_root_pointer(void)767{768	return 0;769}770#endif771 772int acpi_get_local_u64_address(acpi_handle handle, u64 *addr);773int acpi_get_local_address(acpi_handle handle, u32 *addr);774const char *acpi_get_subsystem_id(acpi_handle handle);775 776#else	/* !CONFIG_ACPI */777 778#define acpi_disabled 1779 780#define ACPI_COMPANION(dev)		(NULL)781#define ACPI_COMPANION_SET(dev, adev)	do { } while (0)782#define ACPI_HANDLE(dev)		(NULL)783#define ACPI_HANDLE_FWNODE(fwnode)	(NULL)784 785/* Get rid of the -Wunused-variable for adev */786#define acpi_dev_uid_match(adev, uid2)			(adev && false)787#define acpi_dev_hid_uid_match(adev, hid2, uid2)	(adev && false)788 789struct fwnode_handle;790 791static inline bool acpi_dev_found(const char *hid)792{793	return false;794}795 796static inline bool acpi_dev_present(const char *hid, const char *uid, s64 hrv)797{798	return false;799}800 801struct acpi_device;802 803static inline int acpi_dev_uid_to_integer(struct acpi_device *adev, u64 *integer)804{805	return -ENODEV;806}807 808static inline struct acpi_device *809acpi_dev_get_first_match_dev(const char *hid, const char *uid, s64 hrv)810{811	return NULL;812}813 814static inline bool acpi_reduced_hardware(void)815{816	return false;817}818 819static inline void acpi_dev_put(struct acpi_device *adev) {}820 821static inline bool is_acpi_node(const struct fwnode_handle *fwnode)822{823	return false;824}825 826static inline bool is_acpi_device_node(const struct fwnode_handle *fwnode)827{828	return false;829}830 831static inline struct acpi_device *to_acpi_device_node(const struct fwnode_handle *fwnode)832{833	return NULL;834}835 836static inline bool is_acpi_data_node(const struct fwnode_handle *fwnode)837{838	return false;839}840 841static inline struct acpi_data_node *to_acpi_data_node(const struct fwnode_handle *fwnode)842{843	return NULL;844}845 846static inline bool acpi_data_node_match(const struct fwnode_handle *fwnode,847					const char *name)848{849	return false;850}851 852static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)853{854	return NULL;855}856 857static inline bool has_acpi_companion(struct device *dev)858{859	return false;860}861 862static inline void acpi_preset_companion(struct device *dev,863					 struct acpi_device *parent, u64 addr)864{865}866 867static inline const char *acpi_dev_name(struct acpi_device *adev)868{869	return NULL;870}871 872static inline struct device *acpi_get_first_physical_node(struct acpi_device *adev)873{874	return NULL;875}876 877static inline void acpi_early_init(void) { }878static inline void acpi_subsystem_init(void) { }879 880static inline int early_acpi_boot_init(void)881{882	return 0;883}884static inline int acpi_boot_init(void)885{886	return 0;887}888 889static inline void acpi_boot_table_prepare(void)890{891}892 893static inline void acpi_boot_table_init(void)894{895}896 897static inline int acpi_mps_check(void)898{899	return 0;900}901 902static inline int acpi_check_resource_conflict(struct resource *res)903{904	return 0;905}906 907static inline int acpi_check_region(resource_size_t start, resource_size_t n,908				    const char *name)909{910	return 0;911}912 913struct acpi_table_header;914static inline int acpi_table_parse(char *id,915				int (*handler)(struct acpi_table_header *))916{917	return -ENODEV;918}919 920static inline int acpi_nvs_register(__u64 start, __u64 size)921{922	return 0;923}924 925static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),926					   void *data)927{928	return 0;929}930 931struct acpi_device_id;932 933static inline const struct acpi_device_id *acpi_match_acpi_device(934	const struct acpi_device_id *ids, const struct acpi_device *adev)935{936	return NULL;937}938 939static inline const struct acpi_device_id *acpi_match_device(940	const struct acpi_device_id *ids, const struct device *dev)941{942	return NULL;943}944 945static inline const void *acpi_device_get_match_data(const struct device *dev)946{947	return NULL;948}949 950static inline bool acpi_driver_match_device(struct device *dev,951					    const struct device_driver *drv)952{953	return false;954}955 956static inline bool acpi_check_dsm(acpi_handle handle, const guid_t *guid,957				  u64 rev, u64 funcs)958{959	return false;960}961 962static inline union acpi_object *acpi_evaluate_dsm(acpi_handle handle,963						   const guid_t *guid,964						   u64 rev, u64 func,965						   union acpi_object *argv4)966{967	return NULL;968}969 970static inline union acpi_object *acpi_evaluate_dsm_typed(acpi_handle handle,971							 const guid_t *guid,972							 u64 rev, u64 func,973							 union acpi_object *argv4,974							 acpi_object_type type)975{976	return NULL;977}978 979static inline int acpi_device_uevent_modalias(const struct device *dev,980				struct kobj_uevent_env *env)981{982	return -ENODEV;983}984 985static inline int acpi_device_modalias(struct device *dev,986				char *buf, int size)987{988	return -ENODEV;989}990 991static inline struct platform_device *992acpi_create_platform_device(struct acpi_device *adev,993			    const struct property_entry *properties)994{995	return NULL;996}997 998static inline bool acpi_dma_supported(const struct acpi_device *adev)999{1000	return false;1001}1002 1003static inline enum dev_dma_attr acpi_get_dma_attr(struct acpi_device *adev)1004{1005	return DEV_DMA_NOT_SUPPORTED;1006}1007 1008static inline int acpi_dma_get_range(struct device *dev, const struct bus_dma_region **map)1009{1010	return -ENODEV;1011}1012 1013static inline int acpi_dma_configure(struct device *dev,1014				     enum dev_dma_attr attr)1015{1016	return 0;1017}1018 1019static inline int acpi_dma_configure_id(struct device *dev,1020					enum dev_dma_attr attr,1021					const u32 *input_id)1022{1023	return 0;1024}1025 1026#define ACPI_PTR(_ptr)	(NULL)1027 1028static inline void acpi_device_set_enumerated(struct acpi_device *adev)1029{1030}1031 1032static inline void acpi_device_clear_enumerated(struct acpi_device *adev)1033{1034}1035 1036static inline int acpi_reconfig_notifier_register(struct notifier_block *nb)1037{1038	return -EINVAL;1039}1040 1041static inline int acpi_reconfig_notifier_unregister(struct notifier_block *nb)1042{1043	return -EINVAL;1044}1045 1046static inline struct acpi_device *acpi_resource_consumer(struct resource *res)1047{1048	return NULL;1049}1050 1051static inline int acpi_get_local_address(acpi_handle handle, u32 *addr)1052{1053	return -ENODEV;1054}1055 1056static inline const char *acpi_get_subsystem_id(acpi_handle handle)1057{1058	return ERR_PTR(-ENODEV);1059}1060 1061static inline int acpi_register_wakeup_handler(int wake_irq,1062	bool (*wakeup)(void *context), void *context)1063{1064	return -ENXIO;1065}1066 1067static inline void acpi_unregister_wakeup_handler(1068	bool (*wakeup)(void *context), void *context) { }1069 1070struct acpi_osc_context;1071static inline u32 acpi_osc_ctx_get_pci_control(struct acpi_osc_context *context)1072{1073	return 0;1074}1075 1076static inline u32 acpi_osc_ctx_get_cxl_control(struct acpi_osc_context *context)1077{1078	return 0;1079}1080 1081static inline bool acpi_sleep_state_supported(u8 sleep_state)1082{1083	return false;1084}1085 1086static inline acpi_handle acpi_get_processor_handle(int cpu)1087{1088	return NULL;1089}1090 1091#endif	/* !CONFIG_ACPI */1092 1093extern void arch_post_acpi_subsys_init(void);1094 1095#ifdef CONFIG_ACPI_HOTPLUG_IOAPIC1096int acpi_ioapic_add(acpi_handle root);1097#else1098static inline int acpi_ioapic_add(acpi_handle root) { return 0; }1099#endif1100 1101#ifdef CONFIG_ACPI1102void acpi_os_set_prepare_sleep(int (*func)(u8 sleep_state,1103			       u32 pm1a_ctrl,  u32 pm1b_ctrl));1104 1105acpi_status acpi_os_prepare_sleep(u8 sleep_state,1106				  u32 pm1a_control, u32 pm1b_control);1107 1108void acpi_os_set_prepare_extended_sleep(int (*func)(u8 sleep_state,1109				        u32 val_a,  u32 val_b));1110 1111acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state,1112					   u32 val_a, u32 val_b);1113#if defined(CONFIG_SUSPEND) && defined(CONFIG_X86)1114struct acpi_s2idle_dev_ops {1115	struct list_head list_node;1116	void (*prepare)(void);1117	void (*check)(void);1118	void (*restore)(void);1119};1120int acpi_register_lps0_dev(struct acpi_s2idle_dev_ops *arg);1121void acpi_unregister_lps0_dev(struct acpi_s2idle_dev_ops *arg);1122int acpi_get_lps0_constraint(struct acpi_device *adev);1123#else /* CONFIG_SUSPEND && CONFIG_X86 */1124static inline int acpi_get_lps0_constraint(struct device *dev)1125{1126	return ACPI_STATE_UNKNOWN;1127}1128#endif /* CONFIG_SUSPEND && CONFIG_X86 */1129void arch_reserve_mem_area(acpi_physical_address addr, size_t size);1130#else1131#define acpi_os_set_prepare_sleep(func, pm1a_ctrl, pm1b_ctrl) do { } while (0)1132#endif1133 1134#if defined(CONFIG_ACPI) && defined(CONFIG_PM)1135int acpi_dev_suspend(struct device *dev, bool wakeup);1136int acpi_dev_resume(struct device *dev);1137int acpi_subsys_runtime_suspend(struct device *dev);1138int acpi_subsys_runtime_resume(struct device *dev);1139int acpi_dev_pm_attach(struct device *dev, bool power_on);1140bool acpi_storage_d3(struct device *dev);1141bool acpi_dev_state_d0(struct device *dev);1142#else1143static inline int acpi_subsys_runtime_suspend(struct device *dev) { return 0; }1144static inline int acpi_subsys_runtime_resume(struct device *dev) { return 0; }1145static inline int acpi_dev_pm_attach(struct device *dev, bool power_on)1146{1147	return 0;1148}1149static inline bool acpi_storage_d3(struct device *dev)1150{1151	return false;1152}1153static inline bool acpi_dev_state_d0(struct device *dev)1154{1155	return true;1156}1157#endif1158 1159#if defined(CONFIG_ACPI) && defined(CONFIG_PM_SLEEP)1160int acpi_subsys_prepare(struct device *dev);1161void acpi_subsys_complete(struct device *dev);1162int acpi_subsys_suspend_late(struct device *dev);1163int acpi_subsys_suspend_noirq(struct device *dev);1164int acpi_subsys_suspend(struct device *dev);1165int acpi_subsys_freeze(struct device *dev);1166int acpi_subsys_poweroff(struct device *dev);1167void acpi_ec_mark_gpe_for_wake(void);1168void acpi_ec_set_gpe_wake_mask(u8 action);1169int acpi_subsys_restore_early(struct device *dev);1170#else1171static inline int acpi_subsys_prepare(struct device *dev) { return 0; }1172static inline void acpi_subsys_complete(struct device *dev) {}1173static inline int acpi_subsys_suspend_late(struct device *dev) { return 0; }1174static inline int acpi_subsys_suspend_noirq(struct device *dev) { return 0; }1175static inline int acpi_subsys_suspend(struct device *dev) { return 0; }1176static inline int acpi_subsys_freeze(struct device *dev) { return 0; }1177static inline int acpi_subsys_poweroff(struct device *dev) { return 0; }1178static inline int acpi_subsys_restore_early(struct device *dev) { return 0; }1179static inline void acpi_ec_mark_gpe_for_wake(void) {}1180static inline void acpi_ec_set_gpe_wake_mask(u8 action) {}1181#endif1182 1183#ifdef CONFIG_ACPI1184char *acpi_handle_path(acpi_handle handle);1185__printf(3, 4)1186void acpi_handle_printk(const char *level, acpi_handle handle,1187			const char *fmt, ...);1188void acpi_evaluation_failure_warn(acpi_handle handle, const char *name,1189				  acpi_status status);1190#else	/* !CONFIG_ACPI */1191static inline __printf(3, 4) void1192acpi_handle_printk(const char *level, void *handle, const char *fmt, ...) {}1193static inline void acpi_evaluation_failure_warn(acpi_handle handle,1194						const char *name,1195						acpi_status status) {}1196#endif	/* !CONFIG_ACPI */1197 1198#if defined(CONFIG_ACPI) && defined(CONFIG_DYNAMIC_DEBUG)1199__printf(3, 4)1200void __acpi_handle_debug(struct _ddebug *descriptor, acpi_handle handle, const char *fmt, ...);1201#endif1202 1203/*1204 * acpi_handle_<level>: Print message with ACPI prefix and object path1205 *1206 * These interfaces acquire the global namespace mutex to obtain an object1207 * path.  In interrupt context, it shows the object path as <n/a>.1208 */1209#define acpi_handle_emerg(handle, fmt, ...)				\1210	acpi_handle_printk(KERN_EMERG, handle, fmt, ##__VA_ARGS__)1211#define acpi_handle_alert(handle, fmt, ...)				\1212	acpi_handle_printk(KERN_ALERT, handle, fmt, ##__VA_ARGS__)1213#define acpi_handle_crit(handle, fmt, ...)				\1214	acpi_handle_printk(KERN_CRIT, handle, fmt, ##__VA_ARGS__)1215#define acpi_handle_err(handle, fmt, ...)				\1216	acpi_handle_printk(KERN_ERR, handle, fmt, ##__VA_ARGS__)1217#define acpi_handle_warn(handle, fmt, ...)				\1218	acpi_handle_printk(KERN_WARNING, handle, fmt, ##__VA_ARGS__)1219#define acpi_handle_notice(handle, fmt, ...)				\1220	acpi_handle_printk(KERN_NOTICE, handle, fmt, ##__VA_ARGS__)1221#define acpi_handle_info(handle, fmt, ...)				\1222	acpi_handle_printk(KERN_INFO, handle, fmt, ##__VA_ARGS__)1223 1224#if defined(DEBUG)1225#define acpi_handle_debug(handle, fmt, ...)				\1226	acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__)1227#else1228#if defined(CONFIG_DYNAMIC_DEBUG)1229#define acpi_handle_debug(handle, fmt, ...)				\1230	_dynamic_func_call(fmt, __acpi_handle_debug,			\1231			   handle, pr_fmt(fmt), ##__VA_ARGS__)1232#else1233#define acpi_handle_debug(handle, fmt, ...)				\1234({									\1235	if (0)								\1236		acpi_handle_printk(KERN_DEBUG, handle, fmt, ##__VA_ARGS__); \1237	0;								\1238})1239#endif1240#endif1241 1242#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)1243bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,1244				struct acpi_resource_gpio **agpio);1245bool acpi_gpio_get_io_resource(struct acpi_resource *ares,1246			       struct acpi_resource_gpio **agpio);1247int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id, int index,1248				  bool *wake_capable);1249#else1250static inline bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,1251					      struct acpi_resource_gpio **agpio)1252{1253	return false;1254}1255static inline bool acpi_gpio_get_io_resource(struct acpi_resource *ares,1256					     struct acpi_resource_gpio **agpio)1257{1258	return false;1259}1260static inline int acpi_dev_gpio_irq_wake_get_by(struct acpi_device *adev, const char *con_id,1261						int index, bool *wake_capable)1262{1263	return -ENXIO;1264}1265#endif1266 1267static inline int acpi_dev_gpio_irq_wake_get(struct acpi_device *adev, int index,1268					     bool *wake_capable)1269{1270	return acpi_dev_gpio_irq_wake_get_by(adev, NULL, index, wake_capable);1271}1272 1273static inline int acpi_dev_gpio_irq_get_by(struct acpi_device *adev, const char *con_id,1274					   int index)1275{1276	return acpi_dev_gpio_irq_wake_get_by(adev, con_id, index, NULL);1277}1278 1279static inline int acpi_dev_gpio_irq_get(struct acpi_device *adev, int index)1280{1281	return acpi_dev_gpio_irq_wake_get_by(adev, NULL, index, NULL);1282}1283 1284/* Device properties */1285 1286#ifdef CONFIG_ACPI1287int acpi_dev_get_property(const struct acpi_device *adev, const char *name,1288			  acpi_object_type type, const union acpi_object **obj);1289int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode,1290				const char *name, size_t index, size_t num_args,1291				struct fwnode_reference_args *args);1292 1293static inline int acpi_node_get_property_reference(1294				const struct fwnode_handle *fwnode,1295				const char *name, size_t index,1296				struct fwnode_reference_args *args)1297{1298	return __acpi_node_get_property_reference(fwnode, name, index,1299		NR_FWNODE_REFERENCE_ARGS, args);1300}1301 1302static inline bool acpi_dev_has_props(const struct acpi_device *adev)1303{1304	return !list_empty(&adev->data.properties);1305}1306 1307struct acpi_device_properties *1308acpi_data_add_props(struct acpi_device_data *data, const guid_t *guid,1309		    union acpi_object *properties);1310 1311int acpi_node_prop_get(const struct fwnode_handle *fwnode, const char *propname,1312		       void **valptr);1313 1314struct fwnode_handle *acpi_get_next_subnode(const struct fwnode_handle *fwnode,1315					    struct fwnode_handle *child);1316 1317struct acpi_probe_entry;1318typedef bool (*acpi_probe_entry_validate_subtbl)(struct acpi_subtable_header *,1319						 struct acpi_probe_entry *);1320 1321#define ACPI_TABLE_ID_LEN	51322 1323/**1324 * struct acpi_probe_entry - boot-time probing entry1325 * @id:			ACPI table name1326 * @type:		Optional subtable type to match1327 *			(if @id contains subtables)1328 * @subtable_valid:	Optional callback to check the validity of1329 *			the subtable1330 * @probe_table:	Callback to the driver being probed when table1331 *			match is successful1332 * @probe_subtbl:	Callback to the driver being probed when table and1333 *			subtable match (and optional callback is successful)1334 * @driver_data:	Sideband data provided back to the driver1335 */1336struct acpi_probe_entry {1337	__u8 id[ACPI_TABLE_ID_LEN];1338	__u8 type;1339	acpi_probe_entry_validate_subtbl subtable_valid;1340	union {1341		acpi_tbl_table_handler probe_table;1342		acpi_tbl_entry_handler probe_subtbl;1343	};1344	kernel_ulong_t driver_data;1345};1346 1347void arch_sort_irqchip_probe(struct acpi_probe_entry *ap_head, int nr);1348 1349#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable,	\1350				 valid, data, fn)			\1351	static const struct acpi_probe_entry __acpi_probe_##name	\1352		__used __section("__" #table "_acpi_probe_table") = {	\1353			.id = table_id,					\1354			.type = subtable,				\1355			.subtable_valid = valid,			\1356			.probe_table = fn,				\1357			.driver_data = data,				\1358		}1359 1360#define ACPI_DECLARE_SUBTABLE_PROBE_ENTRY(table, name, table_id,	\1361					  subtable, valid, data, fn)	\1362	static const struct acpi_probe_entry __acpi_probe_##name	\1363		__used __section("__" #table "_acpi_probe_table") = {	\1364			.id = table_id,					\1365			.type = subtable,				\1366			.subtable_valid = valid,			\1367			.probe_subtbl = fn,				\1368			.driver_data = data,				\1369		}1370 1371#define ACPI_PROBE_TABLE(name)		__##name##_acpi_probe_table1372#define ACPI_PROBE_TABLE_END(name)	__##name##_acpi_probe_table_end1373 1374int __acpi_probe_device_table(struct acpi_probe_entry *start, int nr);1375 1376#define acpi_probe_device_table(t)					\1377	({ 								\1378		extern struct acpi_probe_entry ACPI_PROBE_TABLE(t),	\1379			                       ACPI_PROBE_TABLE_END(t);	\1380		__acpi_probe_device_table(&ACPI_PROBE_TABLE(t),		\1381					  (&ACPI_PROBE_TABLE_END(t) -	\1382					   &ACPI_PROBE_TABLE(t)));	\1383	})1384#else1385static inline int acpi_dev_get_property(struct acpi_device *adev,1386					const char *name, acpi_object_type type,1387					const union acpi_object **obj)1388{1389	return -ENXIO;1390}1391 1392static inline int1393__acpi_node_get_property_reference(const struct fwnode_handle *fwnode,1394				const char *name, size_t index, size_t num_args,1395				struct fwnode_reference_args *args)1396{1397	return -ENXIO;1398}1399 1400static inline int1401acpi_node_get_property_reference(const struct fwnode_handle *fwnode,1402				 const char *name, size_t index,1403				 struct fwnode_reference_args *args)1404{1405	return -ENXIO;1406}1407 1408static inline int acpi_node_prop_get(const struct fwnode_handle *fwnode,1409				     const char *propname,1410				     void **valptr)1411{1412	return -ENXIO;1413}1414 1415static inline struct fwnode_handle *1416acpi_get_next_subnode(const struct fwnode_handle *fwnode,1417		      struct fwnode_handle *child)1418{1419	return NULL;1420}1421 1422static inline struct fwnode_handle *1423acpi_graph_get_next_endpoint(const struct fwnode_handle *fwnode,1424			     struct fwnode_handle *prev)1425{1426	return ERR_PTR(-ENXIO);1427}1428 1429static inline int1430acpi_graph_get_remote_endpoint(const struct fwnode_handle *fwnode,1431			       struct fwnode_handle **remote,1432			       struct fwnode_handle **port,1433			       struct fwnode_handle **endpoint)1434{1435	return -ENXIO;1436}1437 1438#define ACPI_DECLARE_PROBE_ENTRY(table, name, table_id, subtable, valid, data, fn) \1439	static const void * __acpi_table_##name[]			\1440		__attribute__((unused))					\1441		 = { (void *) table_id,					\1442		     (void *) subtable,					\1443		     (void *) valid,					\1444		     (void *) fn,					\1445		     (void *) data }1446 1447#define acpi_probe_device_table(t)	({ int __r = 0; __r;})1448#endif1449 1450#ifdef CONFIG_ACPI_TABLE_UPGRADE1451void acpi_table_upgrade(void);1452#else1453static inline void acpi_table_upgrade(void) { }1454#endif1455 1456#if defined(CONFIG_ACPI) && defined(CONFIG_ACPI_WATCHDOG)1457extern bool acpi_has_watchdog(void);1458#else1459static inline bool acpi_has_watchdog(void) { return false; }1460#endif1461 1462#ifdef CONFIG_ACPI_SPCR_TABLE1463extern bool qdf2400_e44_present;1464int acpi_parse_spcr(bool enable_earlycon, bool enable_console);1465#else1466static inline int acpi_parse_spcr(bool enable_earlycon, bool enable_console)1467{1468	return 0;1469}1470#endif1471 1472#if IS_ENABLED(CONFIG_ACPI_GENERIC_GSI)1473int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res);1474#else1475static inline1476int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res)1477{1478	return -EINVAL;1479}1480#endif1481 1482#ifdef CONFIG_ACPI_LPIT1483int lpit_read_residency_count_address(u64 *address);1484#else1485static inline int lpit_read_residency_count_address(u64 *address)1486{1487	return -EINVAL;1488}1489#endif1490 1491#ifdef CONFIG_ACPI_PROCESSOR_IDLE1492#ifndef arch_get_idle_state_flags1493static inline unsigned int arch_get_idle_state_flags(u32 arch_flags)1494{1495	return 0;1496}1497#endif1498#endif /* CONFIG_ACPI_PROCESSOR_IDLE */1499 1500#ifdef CONFIG_ACPI_PPTT1501int acpi_pptt_cpu_is_thread(unsigned int cpu);1502int find_acpi_cpu_topology(unsigned int cpu, int level);1503int find_acpi_cpu_topology_cluster(unsigned int cpu);1504int find_acpi_cpu_topology_package(unsigned int cpu);1505int find_acpi_cpu_topology_hetero_id(unsigned int cpu);1506#else1507static inline int acpi_pptt_cpu_is_thread(unsigned int cpu)1508{1509	return -EINVAL;1510}1511static inline int find_acpi_cpu_topology(unsigned int cpu, int level)1512{1513	return -EINVAL;1514}1515static inline int find_acpi_cpu_topology_cluster(unsigned int cpu)1516{1517	return -EINVAL;1518}1519static inline int find_acpi_cpu_topology_package(unsigned int cpu)1520{1521	return -EINVAL;1522}1523static inline int find_acpi_cpu_topology_hetero_id(unsigned int cpu)1524{1525	return -EINVAL;1526}1527#endif1528 1529#ifdef CONFIG_ARM641530void acpi_arm_init(void);1531#else1532static inline void acpi_arm_init(void) { }1533#endif1534 1535#ifdef CONFIG_RISCV1536void acpi_riscv_init(void);1537#else1538static inline void acpi_riscv_init(void) { }1539#endif1540 1541#ifdef CONFIG_ACPI_PCC1542void acpi_init_pcc(void);1543#else1544static inline void acpi_init_pcc(void) { }1545#endif1546 1547#ifdef CONFIG_ACPI_FFH1548void acpi_init_ffh(void);1549extern int acpi_ffh_address_space_arch_setup(void *handler_ctxt,1550					     void **region_ctxt);1551extern int acpi_ffh_address_space_arch_handler(acpi_integer *value,1552					       void *region_context);1553#else1554static inline void acpi_init_ffh(void) { }1555#endif1556 1557#ifdef CONFIG_ACPI1558extern void acpi_device_notify(struct device *dev);1559extern void acpi_device_notify_remove(struct device *dev);1560#else1561static inline void acpi_device_notify(struct device *dev) { }1562static inline void acpi_device_notify_remove(struct device *dev) { }1563#endif1564 1565static inline void acpi_use_parent_companion(struct device *dev)1566{1567	ACPI_COMPANION_SET(dev, ACPI_COMPANION(dev->parent));1568}1569 1570#ifdef CONFIG_ACPI_HMAT1571int hmat_update_target_coordinates(int nid, struct access_coordinate *coord,1572				   enum access_coordinate_class access);1573#else1574static inline int hmat_update_target_coordinates(int nid,1575						 struct access_coordinate *coord,1576						 enum access_coordinate_class access)1577{1578	return -EOPNOTSUPP;1579}1580#endif1581 1582#ifdef CONFIG_ACPI_NUMA1583bool acpi_node_backed_by_real_pxm(int nid);1584#else1585static inline bool acpi_node_backed_by_real_pxm(int nid)1586{1587	return false;1588}1589#endif1590 1591#endif	/*_LINUX_ACPI_H*/1592