167 lines · 5.6 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. * Copyright (C) 2018-2024 Linaro Ltd. */#ifndef _IPA_H_#define _IPA_H_ #include <linux/notifier.h>#include <linux/types.h> #include "gsi.h"#include "ipa_endpoint.h"#include "ipa_mem.h"#include "ipa_qmi.h"#include "ipa_version.h" struct net_device; struct ipa_interrupt;struct ipa_power;struct ipa_smp2p; /** * struct ipa - IPA information * @gsi:		Embedded GSI structure * @version:		IPA hardware version * @dev:		IPA device pointer * @completion:		Used to signal pipeline clear transfer complete * @nb:			Notifier block used for remoteproc SSR * @notifier:		Remoteproc SSR notifier * @smp2p:		SMP2P information * @power:		IPA power information * @table_addr:		DMA address of filter/route table content * @table_virt:		Virtual address of filter/route table content * @route_count:	Total number of entries in a routing table * @modem_route_count:	Number of modem entries in a routing table * @filter_count:	Maximum number of entries in a filter table * @interrupt:		IPA Interrupt information * @uc_powered:		true if power is active by proxy for microcontroller * @uc_loaded:		true after microcontroller has reported it's ready * @reg_virt:		Virtual address used for IPA register access * @regs:		IPA register definitions * @mem_addr:		DMA address of IPA-local memory space * @mem_virt:		Virtual address of IPA-local memory space * @mem_offset:		Offset from @mem_virt used for access to IPA memory * @mem_size:		Total size (bytes) of memory at @mem_virt * @mem_count:		Number of entries in the mem array * @mem:		Array of IPA-local memory region descriptors * @imem_iova:		I/O virtual address of IPA region in IMEM * @imem_size:		Size of IMEM region * @smem_iova:		I/O virtual address of IPA region in SMEM * @smem_size:		Size of SMEM region * @zero_addr:		DMA address of preallocated zero-filled memory * @zero_virt:		Virtual address of preallocated zero-filled memory * @zero_size:		Size (bytes) of preallocated zero-filled memory * @endpoint_count:	Number of defined bits in most bitmaps below * @available_count:	Number of defined bits in the available bitmap * @defined:		Bitmap of endpoints defined in config data * @available:		Bitmap of endpoints supported by hardware * @filtered:		Bitmap of endpoints that support filtering * @set_up:		Bitmap of endpoints that are set up for use * @enabled:		Bitmap of currently enabled endpoints * @modem_tx_count:	Number of defined modem TX endoints * @endpoint:		Array of endpoint information * @channel_map:	Mapping of GSI channel to IPA endpoint * @name_map:		Mapping of IPA endpoint name to IPA endpoint * @setup_complete:	Flag indicating whether setup stage has completed * @modem_state:	State of modem (stopped, running) * @modem_netdev:	Network device structure used for modem * @qmi:		QMI information */struct ipa {	struct gsi gsi;	enum ipa_version version;	struct device *dev;	struct completion completion;	struct notifier_block nb;	void *notifier;	struct ipa_smp2p *smp2p;	struct ipa_power *power; 	dma_addr_t table_addr;	__le64 *table_virt;	u32 route_count;	u32 modem_route_count;	u32 filter_count; 	struct ipa_interrupt *interrupt;	bool uc_powered;	bool uc_loaded; 	void __iomem *reg_virt;	const struct regs *regs; 	dma_addr_t mem_addr;	void *mem_virt;	u32 mem_offset;	u32 mem_size;	u32 mem_count;	const struct ipa_mem *mem; 	unsigned long imem_iova;	size_t imem_size; 	unsigned long smem_iova;	size_t smem_size; 	dma_addr_t zero_addr;	void *zero_virt;	size_t zero_size; 	/* Bitmaps indicating endpoint state */	u32 endpoint_count;	u32 available_count;	unsigned long *defined;		/* Defined in configuration data */	unsigned long *available;	/* Supported by hardware */	u64 filtered;			/* Support filtering (AP and modem) */	unsigned long *set_up;	unsigned long *enabled; 	u32 modem_tx_count;	struct ipa_endpoint endpoint[IPA_ENDPOINT_MAX];	struct ipa_endpoint *channel_map[GSI_CHANNEL_COUNT_MAX];	struct ipa_endpoint *name_map[IPA_ENDPOINT_COUNT]; 	bool setup_complete; 	atomic_t modem_state;		/* enum ipa_modem_state */	struct net_device *modem_netdev;	struct ipa_qmi qmi;}; /** * ipa_setup() - Perform IPA setup * @ipa:		IPA pointer * * IPA initialization is broken into stages:  init; config; and setup. * (These have inverses exit, deconfig, and teardown.) * * Activities performed at the init stage can be done without requiring * any access to IPA hardware.  Activities performed at the config stage * require IPA power, because they involve access to IPA registers. * The setup stage is performed only after the GSI hardware is ready * (more on this below).  The setup stage allows the AP to perform * more complex initialization by issuing "immediate commands" using * a special interface to the IPA. * * This function, @ipa_setup(), starts the setup stage. * * In order for the GSI hardware to be functional it needs firmware to be * loaded (in addition to some other low-level initialization).  This early * GSI initialization can be done either by Trust Zone on the AP or by the * modem. * * If it's done by Trust Zone, the AP loads the GSI firmware and supplies * it to Trust Zone to verify and install.  When this completes, if * verification was successful, the GSI layer is ready and ipa_setup() * implements the setup phase of initialization. * * If the modem performs early GSI initialization, the AP needs to know * when this has occurred.  An SMP2P interrupt is used for this purpose, * and receipt of that interrupt triggers the call to ipa_setup(). */int ipa_setup(struct ipa *ipa); #endif /* _IPA_H_ */