arch/x86/acpigen: Add new helper routines for XOR and get_rx_gpio

Add new helper function in the acpigen library, that use the underlying
soc routines.

Change-Id: I8d65699d3c806007a50adcb51c5d84567ce451b7
Signed-off-by: Rajat Jain <rajatja@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/39145
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Mathew King <mathewk@chromium.org>
This commit is contained in:
Rajat Jain 2020-02-26 11:02:53 -08:00 committed by Patrick Georgi
parent 4d9dd22bd1
commit 310623b2dd
3 changed files with 36 additions and 0 deletions

View File

@ -73,6 +73,15 @@ calling the platform specific acpigen_soc_{set,clear}_tx_gpio
functions internally. Thus, all the ACPI AML calling conventions for functions internally. Thus, all the ACPI AML calling conventions for
the platform functions apply to these helper functions as well. the platform functions apply to these helper functions as well.
3. Get Rx GPIO
int acpigen_get_rx_gpio(struct acpi_gpio gpio)
This function takes as input, an struct acpi_gpio type and outputs
AML code to read the *logical* value of a gpio (after taking its
polarity into consideration), into the Local0 variable. It calls
the platform specific acpigen_soc_read_rx_gpio() to actually read
the raw Rx gpio value.
## Implementation Details ## Implementation Details
ACPI library in coreboot will provide weak definitions for all the ACPI library in coreboot will provide weak definitions for all the

View File

@ -1203,6 +1203,15 @@ void acpigen_write_or(uint8_t arg1, uint8_t arg2, uint8_t res)
acpigen_emit_byte(res); acpigen_emit_byte(res);
} }
/* Xor (arg1, arg2, res) */
void acpigen_write_xor(uint8_t arg1, uint8_t arg2, uint8_t res)
{
acpigen_emit_byte(XOR_OP);
acpigen_emit_byte(arg1);
acpigen_emit_byte(arg2);
acpigen_emit_byte(res);
}
/* And (arg1, arg2, res) */ /* And (arg1, arg2, res) */
void acpigen_write_and(uint8_t arg1, uint8_t arg2, uint8_t res) void acpigen_write_and(uint8_t arg1, uint8_t arg2, uint8_t res)
{ {
@ -1759,6 +1768,14 @@ int acpigen_disable_tx_gpio(struct acpi_gpio *gpio)
return acpigen_soc_clear_tx_gpio(gpio->pins[0]); return acpigen_soc_clear_tx_gpio(gpio->pins[0]);
} }
void acpigen_get_rx_gpio(struct acpi_gpio *gpio)
{
acpigen_soc_read_rx_gpio(gpio->pins[0]);
if (gpio->polarity == ACPI_GPIO_ACTIVE_LOW)
acpigen_write_xor(LOCAL0_OP, 1, LOCAL0_OP);
}
/* refer to ACPI 6.4.3.5.3 Word Address Space Descriptor section for details */ /* refer to ACPI 6.4.3.5.3 Word Address Space Descriptor section for details */
void acpigen_resource_word(u16 res_type, u16 gen_flags, u16 type_flags, u16 gran, void acpigen_resource_word(u16 res_type, u16 gen_flags, u16 type_flags, u16 gran,
u16 range_min, u16 range_max, u16 translation, u16 length) u16 range_min, u16 range_max, u16 translation, u16 length)

View File

@ -361,6 +361,7 @@ void acpigen_write_sleep(uint64_t sleep_ms);
void acpigen_write_store(void); void acpigen_write_store(void);
void acpigen_write_store_ops(uint8_t src, uint8_t dst); void acpigen_write_store_ops(uint8_t src, uint8_t dst);
void acpigen_write_or(uint8_t arg1, uint8_t arg2, uint8_t res); void acpigen_write_or(uint8_t arg1, uint8_t arg2, uint8_t res);
void acpigen_write_xor(uint8_t arg1, uint8_t arg2, uint8_t res);
void acpigen_write_and(uint8_t arg1, uint8_t arg2, uint8_t res); void acpigen_write_and(uint8_t arg1, uint8_t arg2, uint8_t res);
void acpigen_write_not(uint8_t arg, uint8_t res); void acpigen_write_not(uint8_t arg, uint8_t res);
void acpigen_write_debug_string(const char *str); void acpigen_write_debug_string(const char *str);
@ -472,6 +473,14 @@ int acpigen_soc_clear_tx_gpio(unsigned int gpio_num);
int acpigen_enable_tx_gpio(struct acpi_gpio *gpio); int acpigen_enable_tx_gpio(struct acpi_gpio *gpio);
int acpigen_disable_tx_gpio(struct acpi_gpio *gpio); int acpigen_disable_tx_gpio(struct acpi_gpio *gpio);
/*
* Helper function for getting a RX GPIO value based on the GPIO polarity.
* The return value is stored in Local0 variable.
* This function ends up calling acpigen_soc_get_rx_gpio to make callbacks
* into SoC acpigen code
*/
void acpigen_get_rx_gpio(struct acpi_gpio *gpio);
/* refer to ACPI 6.4.3.5.3 Word Address Space Descriptor section for details */ /* refer to ACPI 6.4.3.5.3 Word Address Space Descriptor section for details */
void acpigen_resource_word(u16 res_type, u16 gen_flags, u16 type_flags, u16 gran, void acpigen_resource_word(u16 res_type, u16 gen_flags, u16 type_flags, u16 gran,
u16 range_min, u16 range_max, u16 translation, u16 length); u16 range_min, u16 range_max, u16 translation, u16 length);
@ -481,4 +490,5 @@ void acpigen_resource_dword(u16 res_type, u16 gen_flags, u16 type_flags,
/* refer to ACPI 6.4.3.5.1 QWord Address Space Descriptor section for details */ /* refer to ACPI 6.4.3.5.1 QWord Address Space Descriptor section for details */
void acpigen_resource_qword(u16 res_type, u16 gen_flags, u16 type_flags, void acpigen_resource_qword(u16 res_type, u16 gen_flags, u16 type_flags,
u64 gran, u64 range_min, u64 range_max, u64 translation, u64 length); u64 gran, u64 range_min, u64 range_max, u64 translation, u64 length);
#endif #endif