| /* SPDX-License-Identifier: GPL-2.0-only OR MIT */ |
| /* |
| * Apple Silicon hardware tunable support |
| * |
| * Each tunable is a list with each entry containing a offset into the MMIO |
| * region, a mask of bits to be cleared and a set of bits to be set. These |
| * tunables are passed along by the previous boot stages and vary from device |
| * to device such that they cannot be hardcoded in the individual drivers. |
| * |
| * Copyright (C) The Asahi Linux Contributors |
| */ |
| |
| #ifndef _LINUX_SOC_APPLE_TUNABLE_H_ |
| #define _LINUX_SOC_APPLE_TUNABLE_H_ |
| |
| #include <linux/device.h> |
| #include <linux/types.h> |
| |
| /** |
| * Struct to store an Apple Silicon hardware tunable. |
| * |
| * Each tunable is a list with each entry containing a offset into the MMIO |
| * region, a mask of bits to be cleared and a set of bits to be set. These |
| * tunables are passed along by the previous boot stages and vary from device |
| * to device such that they cannot be hardcoded in the individual drivers. |
| * |
| * @param sz Number of [offset, mask, value] tuples stored in values. |
| * @param values [offset, mask, value] array. |
| */ |
| struct apple_tunable { |
| size_t sz; |
| struct { |
| u32 offset; |
| u32 mask; |
| u32 value; |
| } values[] __counted_by(sz); |
| }; |
| |
| /** |
| * Parse an array of hardware tunables from the device tree. |
| * |
| * @dev: Device node used for devm_kzalloc internally. |
| * @np: Device node which contains the tunable array. |
| * @name: Name of the device tree property which contains the tunables. |
| * @res: Resource to which the tunables will be applied, used for bound checking |
| * |
| * @return: devres allocated struct on success or PTR_ERR on failure. |
| */ |
| struct apple_tunable *devm_apple_tunable_parse(struct device *dev, |
| struct device_node *np, |
| const char *name, |
| struct resource *res); |
| |
| /** |
| * Apply a previously loaded hardware tunable. |
| * |
| * @param regs: MMIO to which the tunable will be applied. |
| * @param tunable: Pointer to the tunable. |
| */ |
| void apple_tunable_apply(void __iomem *regs, struct apple_tunable *tunable); |
| |
| #endif |