Commit 8b9c1152 authored by Lv Zheng's avatar Lv Zheng Committed by Rafael J. Wysocki

ACPICA: OSL: Add configurability for generic external functions.

OSPMs like Linux trend to include all header files but leave empty inline
stub functions for a feature that is not configured during build.
This patch adds wrappers mechanism to be used around ACPICA external
interfaces to facilitate OSPM with such configurability.

This patch doesn't include code for Linux to use this new mechanism, thus
no functional change.  Lv Zheng.
Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 0dedb3c4
...@@ -81,6 +81,33 @@ extern u8 acpi_gbl_permanent_mmap; ...@@ -81,6 +81,33 @@ extern u8 acpi_gbl_permanent_mmap;
#endif #endif
#endif #endif
/* ACPICA prototypes */
#ifndef ACPI_EXTERNAL_RETURN_STATUS
#define ACPI_EXTERNAL_RETURN_STATUS(prototype) \
prototype;
#endif
#ifndef ACPI_EXTERNAL_RETURN_OK
#define ACPI_EXTERNAL_RETURN_OK(prototype) \
prototype;
#endif
#ifndef ACPI_EXTERNAL_RETURN_VOID
#define ACPI_EXTERNAL_RETURN_VOID(prototype) \
prototype;
#endif
#ifndef ACPI_EXTERNAL_RETURN_UINT32
#define ACPI_EXTERNAL_RETURN_UINT32(prototype) \
prototype;
#endif
#ifndef ACPI_EXTERNAL_RETURN_PTR
#define ACPI_EXTERNAL_RETURN_PTR(prototype) \
prototype;
#endif
/* Public globals, available from outside ACPICA subsystem */ /* Public globals, available from outside ACPICA subsystem */
/***************************************************************************** /*****************************************************************************
...@@ -220,13 +247,13 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running); ...@@ -220,13 +247,13 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running);
*/ */
#if (!ACPI_REDUCED_HARDWARE) #if (!ACPI_REDUCED_HARDWARE)
#define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \ #define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \
prototype; ACPI_EXTERNAL_RETURN_STATUS(prototype)
#define ACPI_HW_DEPENDENT_RETURN_OK(prototype) \ #define ACPI_HW_DEPENDENT_RETURN_OK(prototype) \
prototype; ACPI_EXTERNAL_RETURN_OK(prototype)
#define ACPI_HW_DEPENDENT_RETURN_VOID(prototype) \ #define ACPI_HW_DEPENDENT_RETURN_VOID(prototype) \
prototype; ACPI_EXTERNAL_RETURN_VOID(prototype)
#else #else
#define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \ #define ACPI_HW_DEPENDENT_RETURN_STATUS(prototype) \
...@@ -273,17 +300,18 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running); ...@@ -273,17 +300,18 @@ ACPI_GLOBAL(u8, acpi_gbl_system_awake_and_running);
/* /*
* Initialization * Initialization
*/ */
acpi_status __init ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
acpi_initialize_tables(struct acpi_table_desc *initial_storage, acpi_initialize_tables(struct acpi_table_desc
u32 initial_table_count, u8 allow_resize); *initial_storage,
u32 initial_table_count,
acpi_status __init acpi_initialize_subsystem(void); u8 allow_resize))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_initialize_subsystem(void))
acpi_status __init acpi_enable_subsystem(u32 flags); ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_enable_subsystem(u32 flags))
acpi_status __init acpi_initialize_objects(u32 flags); ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
acpi_initialize_objects(u32 flags))
acpi_status __init acpi_terminate(void); ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_terminate(void))
/* /*
* Miscellaneous global interfaces * Miscellaneous global interfaces
...@@ -291,145 +319,170 @@ acpi_status __init acpi_terminate(void); ...@@ -291,145 +319,170 @@ acpi_status __init acpi_terminate(void);
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable(void)) ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enable(void))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable(void)) ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_disable(void))
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
acpi_status acpi_subsystem_status(void); ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_subsystem_status(void))
#endif #endif
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
acpi_status acpi_get_system_info(struct acpi_buffer *ret_buffer); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_system_info(struct acpi_buffer
*ret_buffer))
#endif #endif
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_get_statistics(struct acpi_statistics *stats); acpi_get_statistics(struct acpi_statistics *stats))
ACPI_EXTERNAL_RETURN_PTR(const char
const char *acpi_format_exception(acpi_status exception); *acpi_format_exception(acpi_status exception))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_purge_cached_objects(void))
acpi_status acpi_purge_cached_objects(void);
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_install_interface(acpi_string interface_name); acpi_install_interface(acpi_string interface_name))
acpi_status acpi_remove_interface(acpi_string interface_name); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_remove_interface(acpi_string interface_name))
acpi_status acpi_update_interfaces(u8 action); ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_update_interfaces(u8 action))
u32 ACPI_EXTERNAL_RETURN_UINT32(u32
acpi_check_address_range(acpi_adr_space_type space_id, acpi_check_address_range(acpi_adr_space_type
acpi_physical_address address, space_id,
acpi_size length, u8 warn); acpi_physical_address
address, acpi_size length,
acpi_status u8 warn))
acpi_decode_pld_buffer(u8 *in_buffer, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_size length, struct acpi_pld_info **return_buffer); acpi_decode_pld_buffer(u8 *in_buffer,
acpi_size length,
struct acpi_pld_info
**return_buffer))
/* /*
* ACPI table load/unload interfaces * ACPI table load/unload interfaces
*/ */
acpi_status __init ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
acpi_install_table(acpi_physical_address address, u8 physical); acpi_install_table(acpi_physical_address address,
u8 physical))
acpi_status acpi_load_table(struct acpi_table_header *table); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_load_table(struct acpi_table_header *table))
acpi_status acpi_unload_parent_table(acpi_handle object); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_unload_parent_table(acpi_handle object))
acpi_status __init acpi_load_tables(void); ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_load_tables(void))
/* /*
* ACPI table manipulation interfaces * ACPI table manipulation interfaces
*/ */
acpi_status __init acpi_reallocate_root_table(void); ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init acpi_reallocate_root_table(void))
acpi_status __init acpi_find_root_pointer(acpi_size *rsdp_address); ACPI_EXTERNAL_RETURN_STATUS(acpi_status __init
acpi_find_root_pointer(acpi_size * rsdp_address))
acpi_status
acpi_get_table_header(acpi_string signature, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
u32 instance, struct acpi_table_header *out_table_header); acpi_get_table_header(acpi_string signature,
u32 instance,
acpi_status struct acpi_table_header
acpi_get_table(acpi_string signature, *out_table_header))
u32 instance, struct acpi_table_header **out_table); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_table(acpi_string signature, u32 instance,
acpi_status struct acpi_table_header
acpi_get_table_by_index(u32 table_index, struct acpi_table_header **out_table); **out_table))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_get_table_by_index(u32 table_index,
acpi_install_table_handler(acpi_table_handler handler, void *context); struct acpi_table_header
**out_table))
acpi_status acpi_remove_table_handler(acpi_table_handler handler); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_install_table_handler(acpi_table_handler
handler, void *context))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_remove_table_handler(acpi_table_handler
handler))
/* /*
* Namespace and name interfaces * Namespace and name interfaces
*/ */
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_walk_namespace(acpi_object_type type, acpi_walk_namespace(acpi_object_type type,
acpi_handle start_object, acpi_handle start_object,
u32 max_depth, u32 max_depth,
acpi_walk_callback descending_callback, acpi_walk_callback
acpi_walk_callback ascending_callback, descending_callback,
void *context, void **return_value); acpi_walk_callback
ascending_callback,
acpi_status void *context,
acpi_get_devices(const char *HID, void **return_value))
acpi_walk_callback user_function, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
void *context, void **return_value); acpi_get_devices(const char *HID,
acpi_walk_callback user_function,
acpi_status void *context,
acpi_get_name(acpi_handle object, void **return_value))
u32 name_type, struct acpi_buffer *ret_path_ptr); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_name(acpi_handle object, u32 name_type,
acpi_status struct acpi_buffer *ret_path_ptr))
acpi_get_handle(acpi_handle parent, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_string pathname, acpi_handle * ret_handle); acpi_get_handle(acpi_handle parent,
acpi_string pathname,
acpi_status acpi_handle * ret_handle))
acpi_attach_data(acpi_handle object, acpi_object_handler handler, void *data); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_attach_data(acpi_handle object,
acpi_status acpi_detach_data(acpi_handle object, acpi_object_handler handler); acpi_object_handler handler,
void *data))
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_data(acpi_handle object, acpi_object_handler handler, void **data); acpi_detach_data(acpi_handle object,
acpi_object_handler handler))
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_debug_trace(char *name, u32 debug_level, u32 debug_layer, u32 flags); acpi_get_data(acpi_handle object,
acpi_object_handler handler,
void **data))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_debug_trace(char *name, u32 debug_level,
u32 debug_layer, u32 flags))
/* /*
* Object manipulation and enumeration * Object manipulation and enumeration
*/ */
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_evaluate_object(acpi_handle object, acpi_evaluate_object(acpi_handle object,
acpi_string pathname, acpi_string pathname,
struct acpi_object_list *parameter_objects, struct acpi_object_list
struct acpi_buffer *return_object_buffer); *parameter_objects,
struct acpi_buffer
acpi_status *return_object_buffer))
acpi_evaluate_object_typed(acpi_handle object, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_string pathname, acpi_evaluate_object_typed(acpi_handle object,
struct acpi_object_list *external_params, acpi_string pathname,
struct acpi_buffer *return_buffer, struct acpi_object_list
acpi_object_type return_type); *external_params,
struct acpi_buffer
acpi_status *return_buffer,
acpi_get_object_info(acpi_handle object, acpi_object_type
struct acpi_device_info **return_buffer); return_type))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_install_method(u8 *buffer); acpi_get_object_info(acpi_handle object,
struct acpi_device_info
acpi_status **return_buffer))
acpi_get_next_object(acpi_object_type type, ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_install_method(u8 *buffer))
acpi_handle parent,
acpi_handle child, acpi_handle * out_handle); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_next_object(acpi_object_type type,
acpi_status acpi_get_type(acpi_handle object, acpi_object_type * out_type); acpi_handle parent,
acpi_handle child,
acpi_status acpi_get_parent(acpi_handle object, acpi_handle * out_handle); acpi_handle * out_handle))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_type(acpi_handle object,
acpi_object_type * out_type))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_parent(acpi_handle object,
acpi_handle * out_handle))
/* /*
* Handler interfaces * Handler interfaces
*/ */
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_install_initialization_handler(acpi_init_handler handler, u32 function); acpi_install_initialization_handler
(acpi_init_handler handler, u32 function))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_install_sci_handler(acpi_sci_handler acpi_install_sci_handler(acpi_sci_handler
address, address,
void *context)) void *context))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_remove_sci_handler(acpi_sci_handler acpi_remove_sci_handler(acpi_sci_handler
address)) address))
...@@ -461,30 +514,42 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ...@@ -461,30 +514,42 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
u32 gpe_number, u32 gpe_number,
acpi_gpe_handler acpi_gpe_handler
address)) address))
acpi_status acpi_install_notify_handler(acpi_handle device, u32 handler_type, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_notify_handler handler, acpi_install_notify_handler(acpi_handle device,
void *context); u32 handler_type,
acpi_notify_handler
acpi_status handler,
acpi_remove_notify_handler(acpi_handle device, void *context))
u32 handler_type, acpi_notify_handler handler); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_remove_notify_handler(acpi_handle device,
acpi_status u32 handler_type,
acpi_install_address_space_handler(acpi_handle device, acpi_notify_handler
acpi_adr_space_type space_id, handler))
acpi_adr_space_handler handler, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_adr_space_setup setup, void *context); acpi_install_address_space_handler(acpi_handle
device,
acpi_status acpi_adr_space_type
acpi_remove_address_space_handler(acpi_handle device, space_id,
acpi_adr_space_type space_id, acpi_adr_space_handler
acpi_adr_space_handler handler); handler,
acpi_adr_space_setup
setup,
void *context))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_remove_address_space_handler(acpi_handle
device,
acpi_adr_space_type
space_id,
acpi_adr_space_handler
handler))
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
acpi_status acpi_install_exception_handler(acpi_exception_handler handler); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_install_exception_handler
(acpi_exception_handler handler))
#endif #endif
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_install_interface_handler(acpi_interface_handler handler); acpi_install_interface_handler
(acpi_interface_handler handler))
/* /*
* Global Lock interfaces * Global Lock interfaces
...@@ -499,10 +564,14 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ...@@ -499,10 +564,14 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
/* /*
* Interfaces to AML mutex objects * Interfaces to AML mutex objects
*/ */
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_acquire_mutex(acpi_handle handle, acpi_string pathname, u16 timeout); acpi_acquire_mutex(acpi_handle handle,
acpi_string pathname,
u16 timeout))
acpi_status acpi_release_mutex(acpi_handle handle, acpi_string pathname); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_release_mutex(acpi_handle handle,
acpi_string pathname))
/* /*
* Fixed Event interfaces * Fixed Event interfaces
...@@ -582,57 +651,69 @@ typedef ...@@ -582,57 +651,69 @@ typedef
acpi_status(*acpi_walk_resource_callback) (struct acpi_resource * resource, acpi_status(*acpi_walk_resource_callback) (struct acpi_resource * resource,
void *context); void *context);
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_vendor_resource(acpi_handle device, acpi_get_vendor_resource(acpi_handle device,
char *name, char *name,
struct acpi_vendor_uuid *uuid, struct acpi_vendor_uuid
struct acpi_buffer *ret_buffer); *uuid,
struct acpi_buffer
acpi_status *ret_buffer))
acpi_get_current_resources(acpi_handle device, struct acpi_buffer *ret_buffer); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_current_resources(acpi_handle device,
struct acpi_buffer
*ret_buffer))
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_possible_resources(acpi_handle device, struct acpi_buffer *ret_buffer); acpi_get_possible_resources(acpi_handle device,
struct acpi_buffer
*ret_buffer))
#endif #endif
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_get_event_resources(acpi_handle device_handle,
acpi_get_event_resources(acpi_handle device_handle, struct acpi_buffer
struct acpi_buffer *ret_buffer); *ret_buffer))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_walk_resource_buffer(struct acpi_buffer
acpi_walk_resource_buffer(struct acpi_buffer *buffer, *buffer,
acpi_walk_resource_callback user_function, acpi_walk_resource_callback
void *context); user_function,
void *context))
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_walk_resources(acpi_handle device, acpi_walk_resources(acpi_handle device, char *name,
char *name, acpi_walk_resource_callback
acpi_walk_resource_callback user_function, void *context); user_function, void *context))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_status acpi_set_current_resources(acpi_handle device,
acpi_set_current_resources(acpi_handle device, struct acpi_buffer *in_buffer); struct acpi_buffer
*in_buffer))
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_irq_routing_table(acpi_handle device, struct acpi_buffer *ret_buffer); acpi_get_irq_routing_table(acpi_handle device,
struct acpi_buffer
acpi_status *ret_buffer))
acpi_resource_to_address64(struct acpi_resource *resource, ACPI_EXTERNAL_RETURN_STATUS(acpi_status
struct acpi_resource_address64 *out); acpi_resource_to_address64(struct acpi_resource
*resource,
acpi_status struct
acpi_buffer_to_resource(u8 *aml_buffer, acpi_resource_address64
u16 aml_buffer_length, *out))
struct acpi_resource **resource_ptr); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_buffer_to_resource(u8 *aml_buffer,
u16 aml_buffer_length,
struct acpi_resource
**resource_ptr))
/* /*
* Hardware (ACPI device) interfaces * Hardware (ACPI device) interfaces
*/ */
acpi_status acpi_reset(void); ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_reset(void))
acpi_status acpi_read(u64 *value, struct acpi_generic_address *reg); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_read(u64 *value,
struct acpi_generic_address *reg))
acpi_status acpi_write(u64 value, struct acpi_generic_address *reg); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_write(u64 value,
struct acpi_generic_address *reg))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_read_bit_register(u32 register_id, acpi_read_bit_register(u32 register_id,
...@@ -645,18 +726,20 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ...@@ -645,18 +726,20 @@ ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
/* /*
* Sleep/Wake interfaces * Sleep/Wake interfaces
*/ */
acpi_status ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_get_sleep_type_data(u8 sleep_state, u8 *slp_typ_a, u8 *slp_typ_b); acpi_get_sleep_type_data(u8 sleep_state,
u8 *slp_typ_a,
acpi_status acpi_enter_sleep_state_prep(u8 sleep_state); u8 *slp_typ_b))
acpi_status acpi_enter_sleep_state(u8 sleep_state); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_enter_sleep_state_prep(u8 sleep_state))
ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_enter_sleep_state(u8 sleep_state))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enter_sleep_state_s4bios(void)) ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status acpi_enter_sleep_state_s4bios(void))
acpi_status acpi_leave_sleep_state_prep(u8 sleep_state); ACPI_EXTERNAL_RETURN_STATUS(acpi_status
acpi_leave_sleep_state_prep(u8 sleep_state))
acpi_status acpi_leave_sleep_state(u8 sleep_state); ACPI_EXTERNAL_RETURN_STATUS(acpi_status acpi_leave_sleep_state(u8 sleep_state))
ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status ACPI_HW_DEPENDENT_RETURN_STATUS(acpi_status
acpi_set_firmware_waking_vector(u32 acpi_set_firmware_waking_vector(u32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment