/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright 2019 Google LLC * Copyright 2020 B&R Industrial Automation GmbH - http://www.br-automation.com */ #ifndef __ASM_ARCH_FSP_BINDINGS_H #define __ASM_ARCH_FSP_BINDINGS_H #include #include #define ARRAY_SIZE_OF_MEMBER(s, m) (ARRAY_SIZE((((s *)0)->m))) #define SIZE_OF_MEMBER(s, m) (sizeof((((s *)0)->m))) enum conf_type { FSP_UINT8, FSP_UINT16, FSP_UINT32, FSP_UINT64, FSP_STRING, FSP_LPDDR4_SWIZZLE, }; /** * struct fsp_binding - Binding describing devicetree/FSP relationships * @offset: Offset within the FSP config structure * @propname: Name of property to read * @type: Type of the property to read * @count: If the property is expected to be an array, this is the * number of expected elements * Set to 0 if the property is expected to be a scalar * * The struct fsp_binding is used to describe the relationship between * values stored in devicetree and where they are placed in the FSP * configuration structure. */ struct fsp_binding { size_t offset; char *propname; enum conf_type type; size_t count; }; /* * LPDDR4 helper routines for configuring the memory UPD for LPDDR4 operation. * There are four physical LPDDR4 channels, each 32-bits wide. There are two * logical channels using two physical channels together to form a 64-bit * interface to memory for each logical channel. */ enum { LP4_PHYS_CH0A, LP4_PHYS_CH0B, LP4_PHYS_CH1A, LP4_PHYS_CH1B, LP4_NUM_PHYS_CHANNELS, }; /* * The DQs within a physical channel can be bit-swizzled within each byte. * Within a channel the bytes can be swapped, but the DQs need to be routed * with the corresponding DQS (strobe). */ enum { LP4_DQS0, LP4_DQS1, LP4_DQS2, LP4_DQS3, LP4_NUM_BYTE_LANES, DQ_BITS_PER_DQS = 8, }; /* Provide bit swizzling per DQS and byte swapping within a channel */ struct lpddr4_chan_swizzle_cfg { u8 dqs[LP4_NUM_BYTE_LANES][DQ_BITS_PER_DQS]; }; struct lpddr4_swizzle_cfg { struct lpddr4_chan_swizzle_cfg phys[LP4_NUM_PHYS_CHANNELS]; }; /** * fsp_m_update_config_from_dtb() - Read FSP-M config from devicetree node * @node: Valid node reference to read property from * @cfg: Pointer to FSP-M config structure * Return: 0 on success, -ve on error * * This function reads the configuration for FSP-M from the provided * devicetree node and saves it in the FSP-M configuration structure. * Configuration options that are not present in the devicetree are * left at their current value. */ int fsp_m_update_config_from_dtb(ofnode node, struct fsp_m_config *cfg); /** * fsp_s_update_config_from_dtb() - Read FSP-S config from devicetree node * @node: Valid node reference to read property from * @cfg: Pointer to FSP-S config structure * Return: 0 on success, -ve on error * * This function reads the configuration for FSP-S from the provided * devicetree node and saves it in the FSP-S configuration structure. * Configuration options that are not present in the devicetree are * left at their current value. */ int fsp_s_update_config_from_dtb(ofnode node, struct fsp_s_config *cfg); #endif