restore lost packages from 0.2.3 + fix overwritten 0.2.4 files
- Restore 29 recipe symlinks (libdrm, qtbase, dbus, sddm, pipewire, etc.) - Restore 33 patches (KDE, libdrm, mesa, pipewire, sddm, wireplumber) - Restore 20+ local/scripts (audit, lint, test, build helpers) - Restore src/cook/scheduler.rs, status.rs, gnu-config/ - Restore scripts/patch-inclusion-gate.sh, run_mini1.sh, validate-collision-log.sh - Recover TLC source from HEAD (was overwritten by 0.2.3 checkout) - Recover 11 local/docs plans from HEAD (were overwritten) - Recover qt6-wayland-smoke symlink from HEAD - Fix MOTD: remove garbled ASCII art, use clean text - Update version: 0.2.0 -> 0.2.4 in os-release, motd, config - Reduce filesystem_size: 1536 -> 512 MiB - Add ABSOLUTE RULE to AGENTS.md: never delete/ignore packages - Reduce pcid scheme log verbosity: info -> debug
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||
/*
|
||||
* Copyright 2019 Broadcom.
|
||||
*/
|
||||
|
||||
#ifndef _BROADCOM_TEE_BNXT_FW_H
|
||||
#define _BROADCOM_TEE_BNXT_FW_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
int tee_bnxt_fw_load(void);
|
||||
int tee_bnxt_copy_coredump(void *buf, u32 offset, u32 size);
|
||||
|
||||
#endif /* _BROADCOM_TEE_BNXT_FW_H */
|
||||
@@ -0,0 +1,360 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* cs_dsp.h -- Cirrus Logic DSP firmware support
|
||||
*
|
||||
* Based on sound/soc/codecs/wm_adsp.h
|
||||
*
|
||||
* Copyright 2012 Wolfson Microelectronics plc
|
||||
* Copyright (C) 2015-2021 Cirrus Logic, Inc. and
|
||||
* Cirrus Logic International Semiconductor Ltd.
|
||||
*/
|
||||
#ifndef __CS_DSP_H
|
||||
#define __CS_DSP_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
#define CS_ADSP2_REGION_0 BIT(0)
|
||||
#define CS_ADSP2_REGION_1 BIT(1)
|
||||
#define CS_ADSP2_REGION_2 BIT(2)
|
||||
#define CS_ADSP2_REGION_3 BIT(3)
|
||||
#define CS_ADSP2_REGION_4 BIT(4)
|
||||
#define CS_ADSP2_REGION_5 BIT(5)
|
||||
#define CS_ADSP2_REGION_6 BIT(6)
|
||||
#define CS_ADSP2_REGION_7 BIT(7)
|
||||
#define CS_ADSP2_REGION_8 BIT(8)
|
||||
#define CS_ADSP2_REGION_9 BIT(9)
|
||||
#define CS_ADSP2_REGION_1_9 (CS_ADSP2_REGION_1 | \
|
||||
CS_ADSP2_REGION_2 | CS_ADSP2_REGION_3 | \
|
||||
CS_ADSP2_REGION_4 | CS_ADSP2_REGION_5 | \
|
||||
CS_ADSP2_REGION_6 | CS_ADSP2_REGION_7 | \
|
||||
CS_ADSP2_REGION_8 | CS_ADSP2_REGION_9)
|
||||
#define CS_ADSP2_REGION_ALL (CS_ADSP2_REGION_0 | CS_ADSP2_REGION_1_9)
|
||||
|
||||
#define CS_DSP_DATA_WORD_SIZE 3
|
||||
#define CS_DSP_DATA_WORD_BITS (3 * BITS_PER_BYTE)
|
||||
|
||||
#define CS_DSP_ACKED_CTL_TIMEOUT_MS 100
|
||||
#define CS_DSP_ACKED_CTL_N_QUICKPOLLS 10
|
||||
#define CS_DSP_ACKED_CTL_MIN_VALUE 0
|
||||
#define CS_DSP_ACKED_CTL_MAX_VALUE 0xFFFFFF
|
||||
|
||||
/*
|
||||
* Write sequence operation codes
|
||||
*/
|
||||
#define CS_DSP_WSEQ_FULL 0x00
|
||||
#define CS_DSP_WSEQ_ADDR8 0x02
|
||||
#define CS_DSP_WSEQ_L16 0x04
|
||||
#define CS_DSP_WSEQ_H16 0x05
|
||||
#define CS_DSP_WSEQ_UNLOCK 0xFD
|
||||
#define CS_DSP_WSEQ_END 0xFF
|
||||
|
||||
/**
|
||||
* struct cs_dsp_region - Describes a logical memory region in DSP address space
|
||||
* @type: Memory region type
|
||||
* @base: Address of region
|
||||
*/
|
||||
struct cs_dsp_region {
|
||||
int type;
|
||||
unsigned int base;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cs_dsp_alg_region - Describes a logical algorithm region in DSP address space
|
||||
* @alg: Algorithm id
|
||||
* @ver: Expected algorithm version
|
||||
* @type: Memory region type
|
||||
* @base: Address of region
|
||||
*/
|
||||
struct cs_dsp_alg_region {
|
||||
unsigned int alg;
|
||||
unsigned int ver;
|
||||
int type;
|
||||
unsigned int base;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cs_dsp_coeff_ctl - Describes a coefficient control
|
||||
* @list: List node for internal use
|
||||
* @dsp: DSP instance associated with this control
|
||||
* @cache: Cached value of the control
|
||||
* @fw_name: Name of the firmware
|
||||
* @subname: Name of the control parsed from the WMFW
|
||||
* @subname_len: Length of subname
|
||||
* @offset: Offset of control within alg_region in words
|
||||
* @len: Length of the cached value in bytes
|
||||
* @type: One of the WMFW_CTL_TYPE_ control types defined in wmfw.h
|
||||
* @flags: Bitfield of WMFW_CTL_FLAG_ control flags defined in wmfw.h
|
||||
* @set: Flag indicating the value has been written by the user
|
||||
* @enabled: Flag indicating whether control is enabled
|
||||
* @alg_region: Logical region associated with this control
|
||||
* @priv: For use by the client
|
||||
*/
|
||||
struct cs_dsp_coeff_ctl {
|
||||
struct list_head list;
|
||||
struct cs_dsp *dsp;
|
||||
void *cache;
|
||||
const char *fw_name;
|
||||
/* Subname is needed to match with firmware */
|
||||
const char *subname;
|
||||
unsigned int subname_len;
|
||||
unsigned int offset;
|
||||
unsigned int len;
|
||||
unsigned int type;
|
||||
unsigned int flags;
|
||||
unsigned int set:1;
|
||||
unsigned int enabled:1;
|
||||
struct cs_dsp_alg_region alg_region;
|
||||
|
||||
void *priv;
|
||||
};
|
||||
|
||||
struct cs_dsp_ops;
|
||||
struct cs_dsp_client_ops;
|
||||
|
||||
/**
|
||||
* struct cs_dsp - Configuration and state of a Cirrus Logic DSP
|
||||
* @name: The name of the DSP instance
|
||||
* @rev: Revision of the DSP
|
||||
* @num: DSP instance number
|
||||
* @type: Type of DSP
|
||||
* @dev: Driver model representation of the device
|
||||
* @regmap: Register map of the device
|
||||
* @ops: Function pointers for internal callbacks
|
||||
* @client_ops: Function pointers for client callbacks
|
||||
* @base: Address of the DSP registers
|
||||
* @base_sysinfo: Address of the sysinfo register (Halo only)
|
||||
* @sysclk_reg: Address of the sysclk register (ADSP1 only)
|
||||
* @sysclk_mask: Mask of frequency bits within sysclk register (ADSP1 only)
|
||||
* @sysclk_shift: Shift of frequency bits within sysclk register (ADSP1 only)
|
||||
* @alg_regions: List of currently loaded algorithm regions
|
||||
* @fw_name: Name of the current firmware
|
||||
* @fw_id: ID of the current firmware, obtained from the wmfw
|
||||
* @fw_id_version: Version of the firmware, obtained from the wmfw
|
||||
* @fw_vendor_id: Vendor of the firmware, obtained from the wmfw
|
||||
* @mem: DSP memory region descriptions
|
||||
* @num_mems: Number of memory regions in this DSP
|
||||
* @fw_ver: Version of the wmfw file format
|
||||
* @booted: Flag indicating DSP has been configured
|
||||
* @running: Flag indicating DSP is executing firmware
|
||||
* @ctl_list: Controls defined within the loaded DSP firmware
|
||||
* @lock_regions: Enable MPU traps on specified memory regions
|
||||
* @pwr_lock: Lock used to serialize accesses
|
||||
* @debugfs_root: Debugfs directory for this DSP instance
|
||||
* @wmfw_file_name: Filename of the currently loaded firmware
|
||||
* @bin_file_name: Filename of the currently loaded coefficients
|
||||
*/
|
||||
struct cs_dsp {
|
||||
const char *name;
|
||||
int rev;
|
||||
int num;
|
||||
int type;
|
||||
struct device *dev;
|
||||
struct regmap *regmap;
|
||||
|
||||
const struct cs_dsp_ops *ops;
|
||||
const struct cs_dsp_client_ops *client_ops;
|
||||
|
||||
unsigned int base;
|
||||
unsigned int base_sysinfo;
|
||||
unsigned int sysclk_reg;
|
||||
unsigned int sysclk_mask;
|
||||
unsigned int sysclk_shift;
|
||||
bool no_core_startstop;
|
||||
|
||||
struct list_head alg_regions;
|
||||
|
||||
const char *fw_name;
|
||||
unsigned int fw_id;
|
||||
unsigned int fw_id_version;
|
||||
unsigned int fw_vendor_id;
|
||||
|
||||
const struct cs_dsp_region *mem;
|
||||
int num_mems;
|
||||
|
||||
int wmfw_ver;
|
||||
|
||||
bool booted;
|
||||
bool running;
|
||||
bool hibernating;
|
||||
|
||||
struct list_head ctl_list;
|
||||
|
||||
struct mutex pwr_lock;
|
||||
|
||||
unsigned int lock_regions;
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct dentry *debugfs_root;
|
||||
const char *wmfw_file_name;
|
||||
const char *bin_file_name;
|
||||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cs_dsp_client_ops - client callbacks
|
||||
* @control_add: Called under the pwr_lock when a control is created
|
||||
* @control_remove: Called under the pwr_lock when a control is destroyed
|
||||
* @pre_run: Called under the pwr_lock by cs_dsp_run() before the core is started
|
||||
* @post_run: Called under the pwr_lock by cs_dsp_run() after the core is started
|
||||
* @pre_stop: Called under the pwr_lock by cs_dsp_stop() before the core is stopped
|
||||
* @post_stop: Called under the pwr_lock by cs_dsp_stop() after the core is stopped
|
||||
* @watchdog_expired: Called when a watchdog expiry is detected
|
||||
*
|
||||
* These callbacks give the cs_dsp client an opportunity to respond to events
|
||||
* or to perform actions atomically.
|
||||
*/
|
||||
struct cs_dsp_client_ops {
|
||||
int (*control_add)(struct cs_dsp_coeff_ctl *ctl);
|
||||
void (*control_remove)(struct cs_dsp_coeff_ctl *ctl);
|
||||
int (*pre_run)(struct cs_dsp *dsp);
|
||||
int (*post_run)(struct cs_dsp *dsp);
|
||||
void (*pre_stop)(struct cs_dsp *dsp);
|
||||
void (*post_stop)(struct cs_dsp *dsp);
|
||||
void (*watchdog_expired)(struct cs_dsp *dsp);
|
||||
};
|
||||
|
||||
int cs_dsp_adsp1_init(struct cs_dsp *dsp);
|
||||
int cs_dsp_adsp2_init(struct cs_dsp *dsp);
|
||||
int cs_dsp_halo_init(struct cs_dsp *dsp);
|
||||
|
||||
int cs_dsp_adsp1_power_up(struct cs_dsp *dsp,
|
||||
const struct firmware *wmfw_firmware, const char *wmfw_filename,
|
||||
const struct firmware *coeff_firmware, const char *coeff_filename,
|
||||
const char *fw_name);
|
||||
void cs_dsp_adsp1_power_down(struct cs_dsp *dsp);
|
||||
int cs_dsp_power_up(struct cs_dsp *dsp,
|
||||
const struct firmware *wmfw_firmware, const char *wmfw_filename,
|
||||
const struct firmware *coeff_firmware, const char *coeff_filename,
|
||||
const char *fw_name);
|
||||
void cs_dsp_power_down(struct cs_dsp *dsp);
|
||||
int cs_dsp_run(struct cs_dsp *dsp);
|
||||
void cs_dsp_stop(struct cs_dsp *dsp);
|
||||
|
||||
void cs_dsp_remove(struct cs_dsp *dsp);
|
||||
|
||||
int cs_dsp_set_dspclk(struct cs_dsp *dsp, unsigned int freq);
|
||||
void cs_dsp_adsp2_bus_error(struct cs_dsp *dsp);
|
||||
void cs_dsp_halo_bus_error(struct cs_dsp *dsp);
|
||||
void cs_dsp_halo_wdt_expire(struct cs_dsp *dsp);
|
||||
|
||||
void cs_dsp_init_debugfs(struct cs_dsp *dsp, struct dentry *debugfs_root);
|
||||
void cs_dsp_cleanup_debugfs(struct cs_dsp *dsp);
|
||||
|
||||
int cs_dsp_coeff_write_acked_control(struct cs_dsp_coeff_ctl *ctl, unsigned int event_id);
|
||||
int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl, unsigned int off,
|
||||
const void *buf, size_t len);
|
||||
int cs_dsp_coeff_lock_and_write_ctrl(struct cs_dsp_coeff_ctl *ctl, unsigned int off,
|
||||
const void *buf, size_t len);
|
||||
int cs_dsp_coeff_read_ctrl(struct cs_dsp_coeff_ctl *ctl, unsigned int off,
|
||||
void *buf, size_t len);
|
||||
int cs_dsp_coeff_lock_and_read_ctrl(struct cs_dsp_coeff_ctl *ctl, unsigned int off,
|
||||
void *buf, size_t len);
|
||||
struct cs_dsp_coeff_ctl *cs_dsp_get_ctl(struct cs_dsp *dsp, const char *name, int type,
|
||||
unsigned int alg);
|
||||
|
||||
int cs_dsp_read_raw_data_block(struct cs_dsp *dsp, int mem_type, unsigned int mem_addr,
|
||||
unsigned int num_words, __be32 *data);
|
||||
int cs_dsp_read_data_word(struct cs_dsp *dsp, int mem_type, unsigned int mem_addr, u32 *data);
|
||||
int cs_dsp_write_data_word(struct cs_dsp *dsp, int mem_type, unsigned int mem_addr, u32 data);
|
||||
void cs_dsp_remove_padding(u32 *buf, int nwords);
|
||||
|
||||
struct cs_dsp_alg_region *cs_dsp_find_alg_region(struct cs_dsp *dsp,
|
||||
int type, unsigned int id);
|
||||
|
||||
const char *cs_dsp_mem_region_name(unsigned int type);
|
||||
|
||||
/**
|
||||
* struct cs_dsp_wseq - Describes a write sequence
|
||||
* @ctl: Write sequence cs_dsp control
|
||||
* @ops: Operations contained within
|
||||
*/
|
||||
struct cs_dsp_wseq {
|
||||
struct cs_dsp_coeff_ctl *ctl;
|
||||
struct list_head ops;
|
||||
};
|
||||
|
||||
int cs_dsp_wseq_init(struct cs_dsp *dsp, struct cs_dsp_wseq *wseqs, unsigned int num_wseqs);
|
||||
int cs_dsp_wseq_write(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq, u32 addr, u32 data,
|
||||
u8 op_code, bool update);
|
||||
int cs_dsp_wseq_multi_write(struct cs_dsp *dsp, struct cs_dsp_wseq *wseq,
|
||||
const struct reg_sequence *reg_seq, int num_regs,
|
||||
u8 op_code, bool update);
|
||||
|
||||
/**
|
||||
* struct cs_dsp_chunk - Describes a buffer holding data formatted for the DSP
|
||||
* @data: Pointer to underlying buffer memory
|
||||
* @max: Pointer to end of the buffer memory
|
||||
* @bytes: Number of bytes read/written into the memory chunk
|
||||
* @cache: Temporary holding data as it is formatted
|
||||
* @cachebits: Number of bits of data currently in cache
|
||||
*/
|
||||
struct cs_dsp_chunk {
|
||||
u8 *data;
|
||||
u8 *max;
|
||||
int bytes;
|
||||
|
||||
u32 cache;
|
||||
int cachebits;
|
||||
};
|
||||
|
||||
/**
|
||||
* cs_dsp_chunk() - Create a DSP memory chunk
|
||||
* @data: Pointer to the buffer that will be used to store data
|
||||
* @size: Size of the buffer in bytes
|
||||
*
|
||||
* Return: A cs_dsp_chunk structure
|
||||
*/
|
||||
static inline struct cs_dsp_chunk cs_dsp_chunk(void *data, int size)
|
||||
{
|
||||
struct cs_dsp_chunk ch = {
|
||||
.data = data,
|
||||
.max = data + size,
|
||||
};
|
||||
|
||||
return ch;
|
||||
}
|
||||
|
||||
/**
|
||||
* cs_dsp_chunk_end() - Check if a DSP memory chunk is full
|
||||
* @ch: Pointer to the chunk structure
|
||||
*
|
||||
* Return: True if the whole buffer has been read/written
|
||||
*/
|
||||
static inline bool cs_dsp_chunk_end(struct cs_dsp_chunk *ch)
|
||||
{
|
||||
return ch->data == ch->max;
|
||||
}
|
||||
|
||||
/**
|
||||
* cs_dsp_chunk_bytes() - Number of bytes written/read from a DSP memory chunk
|
||||
* @ch: Pointer to the chunk structure
|
||||
*
|
||||
* Return: Number of bytes read/written to the buffer
|
||||
*/
|
||||
static inline int cs_dsp_chunk_bytes(struct cs_dsp_chunk *ch)
|
||||
{
|
||||
return ch->bytes;
|
||||
}
|
||||
|
||||
/**
|
||||
* cs_dsp_chunk_valid_addr() - Check if an address is in a DSP memory chunk
|
||||
* @ch: Pointer to the chunk structure
|
||||
*
|
||||
* Return: True if the given address is within the buffer
|
||||
*/
|
||||
static inline bool cs_dsp_chunk_valid_addr(struct cs_dsp_chunk *ch, void *addr)
|
||||
{
|
||||
return (u8 *)addr >= ch->data && (u8 *)addr < ch->max;
|
||||
}
|
||||
|
||||
int cs_dsp_chunk_write(struct cs_dsp_chunk *ch, int nbits, u32 val);
|
||||
int cs_dsp_chunk_flush(struct cs_dsp_chunk *ch);
|
||||
int cs_dsp_chunk_read(struct cs_dsp_chunk *ch, int nbits);
|
||||
|
||||
void cs_dsp_hibernate(struct cs_dsp *dsp, bool hibernating);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,163 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Support utilities for cs_dsp testing.
|
||||
*
|
||||
* Copyright (C) 2024 Cirrus Logic, Inc. and
|
||||
* Cirrus Logic International Semiconductor Ltd.
|
||||
*/
|
||||
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/firmware/cirrus/wmfw.h>
|
||||
|
||||
struct kunit;
|
||||
struct cs_dsp_test;
|
||||
struct cs_dsp_test_local;
|
||||
|
||||
/**
|
||||
* struct cs_dsp_test - base class for test utilities
|
||||
*
|
||||
* @test: Pointer to struct kunit instance.
|
||||
* @dsp: Pointer to struct cs_dsp instance.
|
||||
* @local: Private data for each test suite.
|
||||
*/
|
||||
struct cs_dsp_test {
|
||||
struct kunit *test;
|
||||
struct cs_dsp *dsp;
|
||||
|
||||
struct cs_dsp_test_local *local;
|
||||
|
||||
/* private: Following members are private */
|
||||
bool saw_bus_write;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cs_dsp_mock_alg_def - Info for creating a mock algorithm entry.
|
||||
*
|
||||
* @id: Algorithm ID.
|
||||
* @ver: Algorithm version.
|
||||
* @xm_base_words: XM base address in DSP words.
|
||||
* @xm_size_words: XM size in DSP words.
|
||||
* @ym_base_words: YM base address in DSP words.
|
||||
* @ym_size_words: YM size in DSP words.
|
||||
* @zm_base_words: ZM base address in DSP words.
|
||||
* @zm_size_words: ZM size in DSP words.
|
||||
*/
|
||||
struct cs_dsp_mock_alg_def {
|
||||
unsigned int id;
|
||||
unsigned int ver;
|
||||
unsigned int xm_base_words;
|
||||
unsigned int xm_size_words;
|
||||
unsigned int ym_base_words;
|
||||
unsigned int ym_size_words;
|
||||
unsigned int zm_base_words;
|
||||
unsigned int zm_size_words;
|
||||
};
|
||||
|
||||
struct cs_dsp_mock_coeff_def {
|
||||
const char *shortname;
|
||||
const char *fullname;
|
||||
const char *description;
|
||||
u16 type;
|
||||
u16 flags;
|
||||
u16 mem_type;
|
||||
unsigned int offset_dsp_words;
|
||||
unsigned int length_bytes;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct cs_dsp_mock_xm_header - XM header builder
|
||||
*
|
||||
* @test_priv: Pointer to the struct cs_dsp_test.
|
||||
* @blob_data: Pointer to the created blob data.
|
||||
* @blob_size_bytes: Size of the data at blob_data.
|
||||
*/
|
||||
struct cs_dsp_mock_xm_header {
|
||||
struct cs_dsp_test *test_priv;
|
||||
void *blob_data;
|
||||
size_t blob_size_bytes;
|
||||
};
|
||||
|
||||
struct cs_dsp_mock_wmfw_builder;
|
||||
struct cs_dsp_mock_bin_builder;
|
||||
|
||||
extern const unsigned int cs_dsp_mock_adsp2_32bit_sysbase;
|
||||
extern const unsigned int cs_dsp_mock_adsp2_16bit_sysbase;
|
||||
extern const unsigned int cs_dsp_mock_halo_core_base;
|
||||
extern const unsigned int cs_dsp_mock_halo_sysinfo_base;
|
||||
|
||||
extern const struct cs_dsp_region cs_dsp_mock_halo_dsp1_regions[];
|
||||
extern const unsigned int cs_dsp_mock_halo_dsp1_region_sizes[];
|
||||
extern const struct cs_dsp_region cs_dsp_mock_adsp2_32bit_dsp1_regions[];
|
||||
extern const unsigned int cs_dsp_mock_adsp2_32bit_dsp1_region_sizes[];
|
||||
extern const struct cs_dsp_region cs_dsp_mock_adsp2_16bit_dsp1_regions[];
|
||||
extern const unsigned int cs_dsp_mock_adsp2_16bit_dsp1_region_sizes[];
|
||||
int cs_dsp_mock_count_regions(const unsigned int *region_sizes);
|
||||
unsigned int cs_dsp_mock_size_of_region(const struct cs_dsp *dsp, int mem_type);
|
||||
unsigned int cs_dsp_mock_base_addr_for_mem(struct cs_dsp_test *priv, int mem_type);
|
||||
unsigned int cs_dsp_mock_reg_addr_inc_per_unpacked_word(struct cs_dsp_test *priv);
|
||||
unsigned int cs_dsp_mock_reg_block_length_bytes(struct cs_dsp_test *priv, int mem_type);
|
||||
unsigned int cs_dsp_mock_reg_block_length_registers(struct cs_dsp_test *priv, int mem_type);
|
||||
unsigned int cs_dsp_mock_reg_block_length_dsp_words(struct cs_dsp_test *priv, int mem_type);
|
||||
bool cs_dsp_mock_has_zm(struct cs_dsp_test *priv);
|
||||
int cs_dsp_mock_packed_to_unpacked_mem_type(int packed_mem_type);
|
||||
unsigned int cs_dsp_mock_num_dsp_words_to_num_packed_regs(unsigned int num_dsp_words);
|
||||
unsigned int cs_dsp_mock_xm_header_get_alg_base_in_words(struct cs_dsp_test *priv,
|
||||
unsigned int alg_id,
|
||||
int mem_type);
|
||||
unsigned int cs_dsp_mock_xm_header_get_fw_version(struct cs_dsp_mock_xm_header *header);
|
||||
void cs_dsp_mock_xm_header_drop_from_regmap_cache(struct cs_dsp_test *priv);
|
||||
int cs_dsp_mock_xm_header_write_to_regmap(struct cs_dsp_mock_xm_header *header);
|
||||
struct cs_dsp_mock_xm_header *cs_dsp_create_mock_xm_header(struct cs_dsp_test *priv,
|
||||
const struct cs_dsp_mock_alg_def *algs,
|
||||
size_t num_algs);
|
||||
|
||||
int cs_dsp_mock_regmap_init(struct cs_dsp_test *priv);
|
||||
void cs_dsp_mock_regmap_drop_range(struct cs_dsp_test *priv,
|
||||
unsigned int first_reg, unsigned int last_reg);
|
||||
void cs_dsp_mock_regmap_drop_regs(struct cs_dsp_test *priv,
|
||||
unsigned int first_reg, size_t num_regs);
|
||||
void cs_dsp_mock_regmap_drop_bytes(struct cs_dsp_test *priv,
|
||||
unsigned int first_reg, size_t num_bytes);
|
||||
void cs_dsp_mock_regmap_drop_system_regs(struct cs_dsp_test *priv);
|
||||
bool cs_dsp_mock_regmap_is_dirty(struct cs_dsp_test *priv, bool drop_system_regs);
|
||||
|
||||
struct cs_dsp_mock_bin_builder *cs_dsp_mock_bin_init(struct cs_dsp_test *priv,
|
||||
int format_version,
|
||||
unsigned int fw_version);
|
||||
void cs_dsp_mock_bin_add_raw_block(struct cs_dsp_mock_bin_builder *builder,
|
||||
unsigned int alg_id, unsigned int alg_ver,
|
||||
int type, u16 offset, u32 offset32,
|
||||
const void *payload_data, size_t payload_len_bytes);
|
||||
void cs_dsp_mock_bin_add_info(struct cs_dsp_mock_bin_builder *builder,
|
||||
const char *info);
|
||||
void cs_dsp_mock_bin_add_name(struct cs_dsp_mock_bin_builder *builder,
|
||||
const char *name);
|
||||
void cs_dsp_mock_bin_add_patch(struct cs_dsp_mock_bin_builder *builder,
|
||||
unsigned int alg_id, unsigned int alg_ver,
|
||||
int mem_region, unsigned int reg_addr_offset,
|
||||
const void *payload_data, size_t payload_len_bytes);
|
||||
void cs_dsp_mock_bin_add_patch_off32(struct cs_dsp_mock_bin_builder *builder,
|
||||
unsigned int alg_id, unsigned int alg_ver,
|
||||
int mem_region, unsigned int reg_addr_offset,
|
||||
const void *payload_data, size_t payload_len_bytes);
|
||||
struct firmware *cs_dsp_mock_bin_get_firmware(struct cs_dsp_mock_bin_builder *builder);
|
||||
|
||||
struct cs_dsp_mock_wmfw_builder *cs_dsp_mock_wmfw_init(struct cs_dsp_test *priv,
|
||||
int format_version);
|
||||
void cs_dsp_mock_wmfw_add_raw_block(struct cs_dsp_mock_wmfw_builder *builder,
|
||||
int mem_region, unsigned int mem_offset_dsp_words,
|
||||
const void *payload_data, size_t payload_len_bytes);
|
||||
void cs_dsp_mock_wmfw_add_info(struct cs_dsp_mock_wmfw_builder *builder,
|
||||
const char *info);
|
||||
void cs_dsp_mock_wmfw_add_data_block(struct cs_dsp_mock_wmfw_builder *builder,
|
||||
int mem_region, unsigned int mem_offset_dsp_words,
|
||||
const void *payload_data, size_t payload_len_bytes);
|
||||
void cs_dsp_mock_wmfw_start_alg_info_block(struct cs_dsp_mock_wmfw_builder *builder,
|
||||
unsigned int alg_id,
|
||||
const char *name,
|
||||
const char *description);
|
||||
void cs_dsp_mock_wmfw_add_coeff_desc(struct cs_dsp_mock_wmfw_builder *builder,
|
||||
const struct cs_dsp_mock_coeff_def *def);
|
||||
void cs_dsp_mock_wmfw_end_alg_info_block(struct cs_dsp_mock_wmfw_builder *builder);
|
||||
struct firmware *cs_dsp_mock_wmfw_get_firmware(struct cs_dsp_mock_wmfw_builder *builder);
|
||||
int cs_dsp_mock_wmfw_format_version(struct cs_dsp_mock_wmfw_builder *builder);
|
||||
@@ -0,0 +1,208 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* wmfw.h - Wolfson firmware format information
|
||||
*
|
||||
* Copyright 2012 Wolfson Microelectronics plc
|
||||
*
|
||||
* Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
||||
*/
|
||||
|
||||
#ifndef __WMFW_H
|
||||
#define __WMFW_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define WMFW_MAX_ALG_NAME 256
|
||||
#define WMFW_MAX_ALG_DESCR_NAME 256
|
||||
|
||||
#define WMFW_MAX_COEFF_NAME 256
|
||||
#define WMFW_MAX_COEFF_DESCR_NAME 256
|
||||
|
||||
#define WMFW_CTL_FLAG_SYS 0x8000
|
||||
#define WMFW_CTL_FLAG_VOLATILE 0x0004
|
||||
#define WMFW_CTL_FLAG_WRITEABLE 0x0002
|
||||
#define WMFW_CTL_FLAG_READABLE 0x0001
|
||||
|
||||
#define WMFW_CTL_TYPE_BYTES 0x0004 /* byte control */
|
||||
|
||||
/* Non-ALSA coefficient types start at 0x1000 */
|
||||
#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */
|
||||
#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
|
||||
#define WMFW_CTL_TYPE_HOST_BUFFER 0x1002 /* host buffer pointer */
|
||||
#define WMFW_CTL_TYPE_FWEVENT 0x1004 /* firmware event control */
|
||||
|
||||
struct wmfw_header {
|
||||
char magic[4];
|
||||
__le32 len;
|
||||
__le16 rev;
|
||||
u8 core;
|
||||
u8 ver;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_footer {
|
||||
__le64 timestamp;
|
||||
__le32 checksum;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp1_sizes {
|
||||
__le32 dm;
|
||||
__le32 pm;
|
||||
__le32 zm;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp2_sizes {
|
||||
__le32 xm;
|
||||
__le32 ym;
|
||||
__le32 pm;
|
||||
__le32 zm;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_region {
|
||||
union {
|
||||
__be32 type;
|
||||
__le32 offset;
|
||||
};
|
||||
__le32 len;
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
struct wmfw_id_hdr {
|
||||
__be32 core_id;
|
||||
__be32 core_rev;
|
||||
__be32 id;
|
||||
__be32 ver;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_v3_id_hdr {
|
||||
__be32 core_id;
|
||||
__be32 block_rev;
|
||||
__be32 vendor_id;
|
||||
__be32 id;
|
||||
__be32 ver;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp1_id_hdr {
|
||||
struct wmfw_id_hdr fw;
|
||||
__be32 zm;
|
||||
__be32 dm;
|
||||
__be32 n_algs;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp2_id_hdr {
|
||||
struct wmfw_id_hdr fw;
|
||||
__be32 zm;
|
||||
__be32 xm;
|
||||
__be32 ym;
|
||||
__be32 n_algs;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_halo_id_hdr {
|
||||
struct wmfw_v3_id_hdr fw;
|
||||
__be32 xm_base;
|
||||
__be32 xm_size;
|
||||
__be32 ym_base;
|
||||
__be32 ym_size;
|
||||
__be32 n_algs;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_alg_hdr {
|
||||
__be32 id;
|
||||
__be32 ver;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp1_alg_hdr {
|
||||
struct wmfw_alg_hdr alg;
|
||||
__be32 zm;
|
||||
__be32 dm;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp2_alg_hdr {
|
||||
struct wmfw_alg_hdr alg;
|
||||
__be32 zm;
|
||||
__be32 xm;
|
||||
__be32 ym;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_halo_alg_hdr {
|
||||
struct wmfw_alg_hdr alg;
|
||||
__be32 xm_base;
|
||||
__be32 xm_size;
|
||||
__be32 ym_base;
|
||||
__be32 ym_size;
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp_alg_data {
|
||||
__le32 id;
|
||||
u8 name[WMFW_MAX_ALG_NAME];
|
||||
u8 descr[WMFW_MAX_ALG_DESCR_NAME];
|
||||
__le32 ncoeff;
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
struct wmfw_adsp_coeff_data {
|
||||
struct {
|
||||
__le16 offset;
|
||||
__le16 type;
|
||||
__le32 size;
|
||||
} hdr;
|
||||
u8 name[WMFW_MAX_COEFF_NAME];
|
||||
u8 descr[WMFW_MAX_COEFF_DESCR_NAME];
|
||||
__le16 ctl_type;
|
||||
__le16 flags;
|
||||
__le32 len;
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
struct wmfw_coeff_hdr {
|
||||
u8 magic[4];
|
||||
__le32 len;
|
||||
union {
|
||||
__be32 rev;
|
||||
__le32 ver;
|
||||
};
|
||||
union {
|
||||
__be32 core;
|
||||
__le32 core_ver;
|
||||
};
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
struct wmfw_coeff_item {
|
||||
__le16 offset;
|
||||
__le16 type;
|
||||
__le32 id;
|
||||
__le32 ver;
|
||||
__le32 offset32;
|
||||
__le32 len;
|
||||
u8 data[];
|
||||
} __packed;
|
||||
|
||||
#define WMFW_ADSP1 1
|
||||
#define WMFW_ADSP2 2
|
||||
#define WMFW_HALO 4
|
||||
|
||||
#define WMFW_ABSOLUTE 0xf0
|
||||
#define WMFW_ALGORITHM_DATA 0xf2
|
||||
#define WMFW_METADATA 0xfc
|
||||
#define WMFW_NAME_TEXT 0xfe
|
||||
#define WMFW_INFO_TEXT 0xff
|
||||
|
||||
#define WMFW_ADSP1_PM 2
|
||||
#define WMFW_ADSP1_DM 3
|
||||
#define WMFW_ADSP1_ZM 4
|
||||
|
||||
#define WMFW_ADSP2_PM 2
|
||||
#define WMFW_ADSP2_ZM 4
|
||||
#define WMFW_ADSP2_XM 5
|
||||
#define WMFW_ADSP2_YM 6
|
||||
|
||||
#define WMFW_HALO_PM_PACKED 0x10
|
||||
#define WMFW_HALO_XM_PACKED 0x11
|
||||
#define WMFW_HALO_YM_PACKED 0x12
|
||||
|
||||
#define WMFW_ADSP2_XM_LONG 0xf405
|
||||
#define WMFW_ADSP2_YM_LONG 0xf406
|
||||
#define WMFW_HALO_XM_PACKED_LONG 0xf411
|
||||
#define WMFW_HALO_YM_PACKED_LONG 0xf412
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,71 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2019 NXP
|
||||
*
|
||||
* Header file for the DSP IPC implementation
|
||||
*/
|
||||
|
||||
#ifndef _IMX_DSP_IPC_H
|
||||
#define _IMX_DSP_IPC_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mailbox_client.h>
|
||||
|
||||
#define DSP_MU_CHAN_NUM 4
|
||||
|
||||
struct imx_dsp_chan {
|
||||
struct imx_dsp_ipc *ipc;
|
||||
struct mbox_client cl;
|
||||
struct mbox_chan *ch;
|
||||
char *name;
|
||||
int idx;
|
||||
};
|
||||
|
||||
struct imx_dsp_ops {
|
||||
void (*handle_reply)(struct imx_dsp_ipc *ipc);
|
||||
void (*handle_request)(struct imx_dsp_ipc *ipc);
|
||||
};
|
||||
|
||||
struct imx_dsp_ipc {
|
||||
/* Host <-> DSP communication uses 2 txdb and 2 rxdb channels */
|
||||
struct imx_dsp_chan chans[DSP_MU_CHAN_NUM];
|
||||
struct device *dev;
|
||||
struct imx_dsp_ops *ops;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
static inline void imx_dsp_set_data(struct imx_dsp_ipc *ipc, void *data)
|
||||
{
|
||||
ipc->private_data = data;
|
||||
}
|
||||
|
||||
static inline void *imx_dsp_get_data(struct imx_dsp_ipc *ipc)
|
||||
{
|
||||
return ipc->private_data;
|
||||
}
|
||||
|
||||
#if IS_ENABLED(CONFIG_IMX_DSP)
|
||||
|
||||
int imx_dsp_ring_doorbell(struct imx_dsp_ipc *dsp, unsigned int chan_idx);
|
||||
|
||||
struct mbox_chan *imx_dsp_request_channel(struct imx_dsp_ipc *ipc, int idx);
|
||||
void imx_dsp_free_channel(struct imx_dsp_ipc *ipc, int idx);
|
||||
|
||||
#else
|
||||
|
||||
static inline int imx_dsp_ring_doorbell(struct imx_dsp_ipc *ipc,
|
||||
unsigned int chan_idx)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
struct mbox_chan *imx_dsp_request_channel(struct imx_dsp_ipc *ipc, int idx)
|
||||
{
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
}
|
||||
|
||||
void imx_dsp_free_channel(struct imx_dsp_ipc *ipc, int idx) { }
|
||||
|
||||
#endif
|
||||
#endif /* _IMX_DSP_IPC_H */
|
||||
@@ -0,0 +1,71 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2018 NXP
|
||||
*
|
||||
* Header file for the IPC implementation.
|
||||
*/
|
||||
|
||||
#ifndef _SC_IPC_H
|
||||
#define _SC_IPC_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define IMX_SC_RPC_VERSION 1
|
||||
#define IMX_SC_RPC_MAX_MSG 8
|
||||
|
||||
struct imx_sc_ipc;
|
||||
|
||||
enum imx_sc_rpc_svc {
|
||||
IMX_SC_RPC_SVC_UNKNOWN = 0,
|
||||
IMX_SC_RPC_SVC_RETURN = 1,
|
||||
IMX_SC_RPC_SVC_PM = 2,
|
||||
IMX_SC_RPC_SVC_RM = 3,
|
||||
IMX_SC_RPC_SVC_TIMER = 5,
|
||||
IMX_SC_RPC_SVC_PAD = 6,
|
||||
IMX_SC_RPC_SVC_MISC = 7,
|
||||
IMX_SC_RPC_SVC_IRQ = 8,
|
||||
};
|
||||
|
||||
struct imx_sc_rpc_msg {
|
||||
uint8_t ver;
|
||||
uint8_t size;
|
||||
uint8_t svc;
|
||||
uint8_t func;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_IMX_SCU
|
||||
/*
|
||||
* This is an function to send an RPC message over an IPC channel.
|
||||
* It is called by client-side SCFW API function shims.
|
||||
*
|
||||
* @param[in] ipc IPC handle
|
||||
* @param[in,out] msg handle to a message
|
||||
* @param[in] have_resp response flag
|
||||
*
|
||||
* If have_resp is true then this function waits for a response
|
||||
* and returns the result in msg.
|
||||
*/
|
||||
int imx_scu_call_rpc(struct imx_sc_ipc *ipc, void *msg, bool have_resp);
|
||||
|
||||
/*
|
||||
* This function gets the default ipc handle used by SCU
|
||||
*
|
||||
* @param[out] ipc sc ipc handle
|
||||
*
|
||||
* @return Returns an error code (0 = success, failed if < 0)
|
||||
*/
|
||||
int imx_scu_get_handle(struct imx_sc_ipc **ipc);
|
||||
#else
|
||||
static inline int imx_scu_call_rpc(struct imx_sc_ipc *ipc, void *msg,
|
||||
bool have_resp)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_scu_get_handle(struct imx_sc_ipc **ipc)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
#endif
|
||||
#endif /* _SC_IPC_H */
|
||||
@@ -0,0 +1,20 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2021 NXP
|
||||
*
|
||||
* Header file for the IPC implementation.
|
||||
*/
|
||||
|
||||
#ifndef _S4_IPC_H
|
||||
#define _S4_IPC_H
|
||||
|
||||
struct imx_s4_ipc;
|
||||
|
||||
struct imx_s4_rpc_msg {
|
||||
uint8_t ver;
|
||||
uint8_t size;
|
||||
uint8_t cmd;
|
||||
uint8_t tag;
|
||||
} __packed;
|
||||
|
||||
#endif /* _S4_IPC_H */
|
||||
@@ -0,0 +1,57 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2016 Freescale Semiconductor, Inc.
|
||||
* Copyright 2017~2018 NXP
|
||||
*
|
||||
* Header file containing the public System Controller Interface (SCI)
|
||||
* definitions.
|
||||
*/
|
||||
|
||||
#ifndef _SC_SCI_H
|
||||
#define _SC_SCI_H
|
||||
|
||||
#include <linux/firmware/imx/ipc.h>
|
||||
|
||||
#include <linux/firmware/imx/svc/misc.h>
|
||||
#include <linux/firmware/imx/svc/pm.h>
|
||||
#include <linux/firmware/imx/svc/rm.h>
|
||||
|
||||
#if IS_ENABLED(CONFIG_IMX_SCU)
|
||||
int imx_scu_enable_general_irq_channel(struct device *dev);
|
||||
int imx_scu_irq_register_notifier(struct notifier_block *nb);
|
||||
int imx_scu_irq_unregister_notifier(struct notifier_block *nb);
|
||||
int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable);
|
||||
int imx_scu_irq_get_status(u8 group, u32 *irq_status);
|
||||
int imx_scu_soc_init(struct device *dev);
|
||||
#else
|
||||
static inline int imx_scu_soc_init(struct device *dev)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_scu_enable_general_irq_channel(struct device *dev)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_scu_irq_register_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_scu_irq_unregister_notifier(struct notifier_block *nb)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_scu_irq_get_status(u8 group, u32 *irq_status)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
#endif /* _SC_SCI_H */
|
||||
@@ -0,0 +1,99 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2024 NXP
|
||||
*/
|
||||
|
||||
#ifndef _SCMI_IMX_H
|
||||
#define _SCMI_IMX_H
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/scmi_imx_protocol.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define SCMI_IMX95_CTRL_PDM_CLK_SEL 0 /* AON PDM clock sel */
|
||||
#define SCMI_IMX95_CTRL_MQS1_SETTINGS 1 /* AON MQS settings */
|
||||
#define SCMI_IMX95_CTRL_SAI1_MCLK 2 /* AON SAI1 MCLK */
|
||||
#define SCMI_IMX95_CTRL_SAI3_MCLK 3 /* WAKE SAI3 MCLK */
|
||||
#define SCMI_IMX95_CTRL_SAI4_MCLK 4 /* WAKE SAI4 MCLK */
|
||||
#define SCMI_IMX95_CTRL_SAI5_MCLK 5 /* WAKE SAI5 MCLK */
|
||||
|
||||
#define SCMI_IMX94_CTRL_PDM_CLK_SEL 0U /*!< AON PDM clock sel */
|
||||
#define SCMI_IMX94_CTRL_MQS1_SETTINGS 1U /*!< AON MQS settings */
|
||||
#define SCMI_IMX94_CTRL_MQS2_SETTINGS 2U /*!< WAKE MQS settings */
|
||||
#define SCMI_IMX94_CTRL_SAI1_MCLK 3U /*!< AON SAI1 MCLK */
|
||||
#define SCMI_IMX94_CTRL_SAI2_MCLK 4U /*!< WAKE SAI2 MCLK */
|
||||
#define SCMI_IMX94_CTRL_SAI3_MCLK 5U /*!< WAKE SAI3 MCLK */
|
||||
#define SCMI_IMX94_CTRL_SAI4_MCLK 6U /*!< WAKE SAI4 MCLK */
|
||||
|
||||
#define SCMI_IMX952_CTRL_BYPASS_AUDMIX 8U /* WAKE AUDMIX */
|
||||
|
||||
#if IS_ENABLED(CONFIG_IMX_SCMI_MISC_DRV)
|
||||
int scmi_imx_misc_ctrl_get(u32 id, u32 *num, u32 *val);
|
||||
int scmi_imx_misc_ctrl_set(u32 id, u32 val);
|
||||
#else
|
||||
static inline int scmi_imx_misc_ctrl_get(u32 id, u32 *num, u32 *val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int scmi_imx_misc_ctrl_set(u32 id, u32 val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_IMX_SCMI_CPU_DRV)
|
||||
int scmi_imx_cpu_start(u32 cpuid, bool start);
|
||||
int scmi_imx_cpu_started(u32 cpuid, bool *started);
|
||||
int scmi_imx_cpu_reset_vector_set(u32 cpuid, u64 vector, bool start, bool boot,
|
||||
bool resume);
|
||||
#else
|
||||
static inline int scmi_imx_cpu_start(u32 cpuid, bool start)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int scmi_imx_cpu_started(u32 cpuid, bool *started)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int scmi_imx_cpu_reset_vector_set(u32 cpuid, u64 vector, bool start,
|
||||
bool boot, bool resume)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
|
||||
enum scmi_imx_lmm_op {
|
||||
SCMI_IMX_LMM_BOOT,
|
||||
SCMI_IMX_LMM_POWER_ON,
|
||||
SCMI_IMX_LMM_SHUTDOWN,
|
||||
};
|
||||
|
||||
/* For shutdown pperation */
|
||||
#define SCMI_IMX_LMM_OP_FORCEFUL 0
|
||||
#define SCMI_IMX_LMM_OP_GRACEFUL BIT(0)
|
||||
|
||||
#if IS_ENABLED(CONFIG_IMX_SCMI_LMM_DRV)
|
||||
int scmi_imx_lmm_operation(u32 lmid, enum scmi_imx_lmm_op op, u32 flags);
|
||||
int scmi_imx_lmm_info(u32 lmid, struct scmi_imx_lmm_info *info);
|
||||
int scmi_imx_lmm_reset_vector_set(u32 lmid, u32 cpuid, u32 flags, u64 vector);
|
||||
#else
|
||||
static inline int scmi_imx_lmm_operation(u32 lmid, enum scmi_imx_lmm_op op, u32 flags)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int scmi_imx_lmm_info(u32 lmid, struct scmi_imx_lmm_info *info)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int scmi_imx_lmm_reset_vector_set(u32 lmid, u32 cpuid, u32 flags, u64 vector)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,77 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2016 Freescale Semiconductor, Inc.
|
||||
* Copyright 2017~2018 NXP
|
||||
*
|
||||
* Header file containing the public API for the System Controller (SC)
|
||||
* Miscellaneous (MISC) function.
|
||||
*
|
||||
* MISC_SVC (SVC) Miscellaneous Service
|
||||
*
|
||||
* Module for the Miscellaneous (MISC) service.
|
||||
*/
|
||||
|
||||
#ifndef _SC_MISC_API_H
|
||||
#define _SC_MISC_API_H
|
||||
|
||||
#include <linux/firmware/imx/sci.h>
|
||||
|
||||
/*
|
||||
* This type is used to indicate RPC MISC function calls.
|
||||
*/
|
||||
enum imx_misc_func {
|
||||
IMX_SC_MISC_FUNC_UNKNOWN = 0,
|
||||
IMX_SC_MISC_FUNC_SET_CONTROL = 1,
|
||||
IMX_SC_MISC_FUNC_GET_CONTROL = 2,
|
||||
IMX_SC_MISC_FUNC_SET_MAX_DMA_GROUP = 4,
|
||||
IMX_SC_MISC_FUNC_SET_DMA_GROUP = 5,
|
||||
IMX_SC_MISC_FUNC_SECO_IMAGE_LOAD = 8,
|
||||
IMX_SC_MISC_FUNC_SECO_AUTHENTICATE = 9,
|
||||
IMX_SC_MISC_FUNC_DEBUG_OUT = 10,
|
||||
IMX_SC_MISC_FUNC_WAVEFORM_CAPTURE = 6,
|
||||
IMX_SC_MISC_FUNC_BUILD_INFO = 15,
|
||||
IMX_SC_MISC_FUNC_UNIQUE_ID = 19,
|
||||
IMX_SC_MISC_FUNC_SET_ARI = 3,
|
||||
IMX_SC_MISC_FUNC_BOOT_STATUS = 7,
|
||||
IMX_SC_MISC_FUNC_BOOT_DONE = 14,
|
||||
IMX_SC_MISC_FUNC_OTP_FUSE_READ = 11,
|
||||
IMX_SC_MISC_FUNC_OTP_FUSE_WRITE = 17,
|
||||
IMX_SC_MISC_FUNC_SET_TEMP = 12,
|
||||
IMX_SC_MISC_FUNC_GET_TEMP = 13,
|
||||
IMX_SC_MISC_FUNC_GET_BOOT_DEV = 16,
|
||||
IMX_SC_MISC_FUNC_GET_BUTTON_STATUS = 18,
|
||||
};
|
||||
|
||||
/*
|
||||
* Control Functions
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_IMX_SCU
|
||||
int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource,
|
||||
u8 ctrl, u32 val);
|
||||
|
||||
int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource,
|
||||
u8 ctrl, u32 *val);
|
||||
|
||||
int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
|
||||
bool enable, u64 phys_addr);
|
||||
#else
|
||||
static inline int imx_sc_misc_set_control(struct imx_sc_ipc *ipc,
|
||||
u32 resource, u8 ctrl, u32 val)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_sc_misc_get_control(struct imx_sc_ipc *ipc,
|
||||
u32 resource, u8 ctrl, u32 *val)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
|
||||
static inline int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
|
||||
bool enable, u64 phys_addr)
|
||||
{
|
||||
return -ENOTSUPP;
|
||||
}
|
||||
#endif
|
||||
#endif /* _SC_MISC_API_H */
|
||||
@@ -0,0 +1,85 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2016 Freescale Semiconductor, Inc.
|
||||
* Copyright 2017-2018 NXP
|
||||
*
|
||||
* Header file containing the public API for the System Controller (SC)
|
||||
* Power Management (PM) function. This includes functions for power state
|
||||
* control, clock control, reset control, and wake-up event control.
|
||||
*
|
||||
* PM_SVC (SVC) Power Management Service
|
||||
*
|
||||
* Module for the Power Management (PM) service.
|
||||
*/
|
||||
|
||||
#ifndef _SC_PM_API_H
|
||||
#define _SC_PM_API_H
|
||||
|
||||
#include <linux/firmware/imx/sci.h>
|
||||
|
||||
/*
|
||||
* This type is used to indicate RPC PM function calls.
|
||||
*/
|
||||
enum imx_sc_pm_func {
|
||||
IMX_SC_PM_FUNC_UNKNOWN = 0,
|
||||
IMX_SC_PM_FUNC_SET_SYS_POWER_MODE = 19,
|
||||
IMX_SC_PM_FUNC_SET_PARTITION_POWER_MODE = 1,
|
||||
IMX_SC_PM_FUNC_GET_SYS_POWER_MODE = 2,
|
||||
IMX_SC_PM_FUNC_SET_RESOURCE_POWER_MODE = 3,
|
||||
IMX_SC_PM_FUNC_GET_RESOURCE_POWER_MODE = 4,
|
||||
IMX_SC_PM_FUNC_REQ_LOW_POWER_MODE = 16,
|
||||
IMX_SC_PM_FUNC_SET_CPU_RESUME_ADDR = 17,
|
||||
IMX_SC_PM_FUNC_REQ_SYS_IF_POWER_MODE = 18,
|
||||
IMX_SC_PM_FUNC_SET_CLOCK_RATE = 5,
|
||||
IMX_SC_PM_FUNC_GET_CLOCK_RATE = 6,
|
||||
IMX_SC_PM_FUNC_CLOCK_ENABLE = 7,
|
||||
IMX_SC_PM_FUNC_SET_CLOCK_PARENT = 14,
|
||||
IMX_SC_PM_FUNC_GET_CLOCK_PARENT = 15,
|
||||
IMX_SC_PM_FUNC_RESET = 13,
|
||||
IMX_SC_PM_FUNC_RESET_REASON = 10,
|
||||
IMX_SC_PM_FUNC_BOOT = 8,
|
||||
IMX_SC_PM_FUNC_REBOOT = 9,
|
||||
IMX_SC_PM_FUNC_REBOOT_PARTITION = 12,
|
||||
IMX_SC_PM_FUNC_CPU_START = 11,
|
||||
};
|
||||
|
||||
/*
|
||||
* Defines for ALL parameters
|
||||
*/
|
||||
#define IMX_SC_PM_CLK_ALL UINT8_MAX /* All clocks */
|
||||
|
||||
/*
|
||||
* Defines for SC PM Power Mode
|
||||
*/
|
||||
#define IMX_SC_PM_PW_MODE_OFF 0 /* Power off */
|
||||
#define IMX_SC_PM_PW_MODE_STBY 1 /* Power in standby */
|
||||
#define IMX_SC_PM_PW_MODE_LP 2 /* Power in low-power */
|
||||
#define IMX_SC_PM_PW_MODE_ON 3 /* Power on */
|
||||
|
||||
/*
|
||||
* Defines for SC PM CLK
|
||||
*/
|
||||
#define IMX_SC_PM_CLK_SLV_BUS 0 /* Slave bus clock */
|
||||
#define IMX_SC_PM_CLK_MST_BUS 1 /* Master bus clock */
|
||||
#define IMX_SC_PM_CLK_PER 2 /* Peripheral clock */
|
||||
#define IMX_SC_PM_CLK_PHY 3 /* Phy clock */
|
||||
#define IMX_SC_PM_CLK_MISC 4 /* Misc clock */
|
||||
#define IMX_SC_PM_CLK_MISC0 0 /* Misc 0 clock */
|
||||
#define IMX_SC_PM_CLK_MISC1 1 /* Misc 1 clock */
|
||||
#define IMX_SC_PM_CLK_MISC2 2 /* Misc 2 clock */
|
||||
#define IMX_SC_PM_CLK_MISC3 3 /* Misc 3 clock */
|
||||
#define IMX_SC_PM_CLK_MISC4 4 /* Misc 4 clock */
|
||||
#define IMX_SC_PM_CLK_CPU 2 /* CPU clock */
|
||||
#define IMX_SC_PM_CLK_PLL 4 /* PLL */
|
||||
#define IMX_SC_PM_CLK_BYPASS 4 /* Bypass clock */
|
||||
|
||||
/*
|
||||
* Defines for SC PM CLK Parent
|
||||
*/
|
||||
#define IMX_SC_PM_PARENT_XTAL 0 /* Parent is XTAL. */
|
||||
#define IMX_SC_PM_PARENT_PLL0 1 /* Parent is PLL0 */
|
||||
#define IMX_SC_PM_PARENT_PLL1 2 /* Parent is PLL1 or PLL0/2 */
|
||||
#define IMX_SC_PM_PARENT_PLL2 3 /* Parent in PLL2 or PLL0/4 */
|
||||
#define IMX_SC_PM_PARENT_BYPS 4 /* Parent is a bypass clock. */
|
||||
|
||||
#endif /* _SC_PM_API_H */
|
||||
@@ -0,0 +1,74 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright (C) 2016 Freescale Semiconductor, Inc.
|
||||
* Copyright 2017-2020 NXP
|
||||
*
|
||||
* Header file containing the public API for the System Controller (SC)
|
||||
* Resource Management (RM) function. This includes functions for
|
||||
* partitioning resources, pads, and memory regions.
|
||||
*
|
||||
* RM_SVC (SVC) Resource Management Service
|
||||
*
|
||||
* Module for the Resource Management (RM) service.
|
||||
*/
|
||||
|
||||
#ifndef _SC_RM_API_H
|
||||
#define _SC_RM_API_H
|
||||
|
||||
#include <linux/firmware/imx/sci.h>
|
||||
|
||||
/*
|
||||
* This type is used to indicate RPC RM function calls.
|
||||
*/
|
||||
enum imx_sc_rm_func {
|
||||
IMX_SC_RM_FUNC_UNKNOWN = 0,
|
||||
IMX_SC_RM_FUNC_PARTITION_ALLOC = 1,
|
||||
IMX_SC_RM_FUNC_SET_CONFIDENTIAL = 31,
|
||||
IMX_SC_RM_FUNC_PARTITION_FREE = 2,
|
||||
IMX_SC_RM_FUNC_GET_DID = 26,
|
||||
IMX_SC_RM_FUNC_PARTITION_STATIC = 3,
|
||||
IMX_SC_RM_FUNC_PARTITION_LOCK = 4,
|
||||
IMX_SC_RM_FUNC_GET_PARTITION = 5,
|
||||
IMX_SC_RM_FUNC_SET_PARENT = 6,
|
||||
IMX_SC_RM_FUNC_MOVE_ALL = 7,
|
||||
IMX_SC_RM_FUNC_ASSIGN_RESOURCE = 8,
|
||||
IMX_SC_RM_FUNC_SET_RESOURCE_MOVABLE = 9,
|
||||
IMX_SC_RM_FUNC_SET_SUBSYS_RSRC_MOVABLE = 28,
|
||||
IMX_SC_RM_FUNC_SET_MASTER_ATTRIBUTES = 10,
|
||||
IMX_SC_RM_FUNC_SET_MASTER_SID = 11,
|
||||
IMX_SC_RM_FUNC_SET_PERIPHERAL_PERMISSIONS = 12,
|
||||
IMX_SC_RM_FUNC_IS_RESOURCE_OWNED = 13,
|
||||
IMX_SC_RM_FUNC_GET_RESOURCE_OWNER = 33,
|
||||
IMX_SC_RM_FUNC_IS_RESOURCE_MASTER = 14,
|
||||
IMX_SC_RM_FUNC_IS_RESOURCE_PERIPHERAL = 15,
|
||||
IMX_SC_RM_FUNC_GET_RESOURCE_INFO = 16,
|
||||
IMX_SC_RM_FUNC_MEMREG_ALLOC = 17,
|
||||
IMX_SC_RM_FUNC_MEMREG_SPLIT = 29,
|
||||
IMX_SC_RM_FUNC_MEMREG_FRAG = 32,
|
||||
IMX_SC_RM_FUNC_MEMREG_FREE = 18,
|
||||
IMX_SC_RM_FUNC_FIND_MEMREG = 30,
|
||||
IMX_SC_RM_FUNC_ASSIGN_MEMREG = 19,
|
||||
IMX_SC_RM_FUNC_SET_MEMREG_PERMISSIONS = 20,
|
||||
IMX_SC_RM_FUNC_IS_MEMREG_OWNED = 21,
|
||||
IMX_SC_RM_FUNC_GET_MEMREG_INFO = 22,
|
||||
IMX_SC_RM_FUNC_ASSIGN_PAD = 23,
|
||||
IMX_SC_RM_FUNC_SET_PAD_MOVABLE = 24,
|
||||
IMX_SC_RM_FUNC_IS_PAD_OWNED = 25,
|
||||
IMX_SC_RM_FUNC_DUMP = 27,
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_IMX_SCU)
|
||||
bool imx_sc_rm_is_resource_owned(struct imx_sc_ipc *ipc, u16 resource);
|
||||
int imx_sc_rm_get_resource_owner(struct imx_sc_ipc *ipc, u16 resource, u8 *pt);
|
||||
#else
|
||||
static inline bool
|
||||
imx_sc_rm_is_resource_owned(struct imx_sc_ipc *ipc, u16 resource)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
static inline int imx_sc_rm_get_resource_owner(struct imx_sc_ipc *ipc, u16 resource, u8 *pt)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,734 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2017-2018, Intel Corporation
|
||||
* Copyright (C) 2025, Altera Corporation
|
||||
*/
|
||||
|
||||
#ifndef __STRATIX10_SMC_H
|
||||
#define __STRATIX10_SMC_H
|
||||
|
||||
#include <linux/arm-smccc.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
/**
|
||||
* This file defines the Secure Monitor Call (SMC) message protocol used for
|
||||
* service layer driver in normal world (EL1) to communicate with secure
|
||||
* monitor software in Secure Monitor Exception Level 3 (EL3).
|
||||
*
|
||||
* This file is shared with secure firmware (FW) which is out of kernel tree.
|
||||
*
|
||||
* An ARM SMC instruction takes a function identifier and up to 6 64-bit
|
||||
* register values as arguments, and can return up to 4 64-bit register
|
||||
* value. The operation of the secure monitor is determined by the parameter
|
||||
* values passed in through registers.
|
||||
*
|
||||
* EL1 and EL3 communicates pointer as physical address rather than the
|
||||
* virtual address.
|
||||
*
|
||||
* Functions specified by ARM SMC Calling convention:
|
||||
*
|
||||
* FAST call executes atomic operations, returns when the requested operation
|
||||
* has completed.
|
||||
* STD call starts a operation which can be preempted by a non-secure
|
||||
* interrupt. The call can return before the requested operation has
|
||||
* completed.
|
||||
*
|
||||
* a0..a7 is used as register names in the descriptions below, on arm32
|
||||
* that translates to r0..r7 and on arm64 to w0..w7.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @func_num: function ID
|
||||
*/
|
||||
#define INTEL_SIP_SMC_STD_CALL_VAL(func_num) \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_STD_CALL, ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_SIP, (func_num))
|
||||
|
||||
#define INTEL_SIP_SMC_FAST_CALL_VAL(func_num) \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL, ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_SIP, (func_num))
|
||||
|
||||
#define INTEL_SIP_SMC_ASYNC_VAL(func_name) \
|
||||
ARM_SMCCC_CALL_VAL(ARM_SMCCC_STD_CALL, ARM_SMCCC_SMC_64, \
|
||||
ARM_SMCCC_OWNER_SIP, (func_name))
|
||||
|
||||
/**
|
||||
* Return values in INTEL_SIP_SMC_* call
|
||||
*
|
||||
* INTEL_SIP_SMC_RETURN_UNKNOWN_FUNCTION:
|
||||
* Secure monitor software doesn't recognize the request.
|
||||
*
|
||||
* INTEL_SIP_SMC_STATUS_OK:
|
||||
* Secure monitor software accepts the service client's request.
|
||||
*
|
||||
* INTEL_SIP_SMC_STATUS_BUSY:
|
||||
* Secure monitor software is still processing service client's request.
|
||||
*
|
||||
* INTEL_SIP_SMC_STATUS_REJECTED:
|
||||
* Secure monitor software reject the service client's request.
|
||||
*
|
||||
* INTEL_SIP_SMC_STATUS_ERROR:
|
||||
* There is error during the process of service request.
|
||||
*
|
||||
* INTEL_SIP_SMC_RSU_ERROR:
|
||||
* There is error during the process of remote status update request.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_RETURN_UNKNOWN_FUNCTION 0xFFFFFFFF
|
||||
#define INTEL_SIP_SMC_STATUS_OK 0x0
|
||||
#define INTEL_SIP_SMC_STATUS_BUSY 0x1
|
||||
#define INTEL_SIP_SMC_STATUS_REJECTED 0x2
|
||||
#define INTEL_SIP_SMC_STATUS_ERROR 0x4
|
||||
#define INTEL_SIP_SMC_RSU_ERROR 0x7
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FPGA_CONFIG_START
|
||||
*
|
||||
* Sync call used by service driver at EL1 to request the FPGA in EL3 to
|
||||
* be prepare to receive a new configuration.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_FPGA_CONFIG_START.
|
||||
* a1: flag for full or partial configuration. 0 for full and 1 for partial
|
||||
* configuration.
|
||||
* a2-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK, or INTEL_SIP_SMC_STATUS_ERROR.
|
||||
* a1-3: not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_START 1
|
||||
#define INTEL_SIP_SMC_FPGA_CONFIG_START \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_START)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FPGA_CONFIG_WRITE
|
||||
*
|
||||
* Async call used by service driver at EL1 to provide FPGA configuration data
|
||||
* to secure world.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_FPGA_CONFIG_WRITE.
|
||||
* a1: 64bit physical address of the configuration data memory block
|
||||
* a2: Size of configuration data block.
|
||||
* a3-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_BUSY or
|
||||
* INTEL_SIP_SMC_STATUS_ERROR.
|
||||
* a1: 64bit physical address of 1st completed memory block if any completed
|
||||
* block, otherwise zero value.
|
||||
* a2: 64bit physical address of 2nd completed memory block if any completed
|
||||
* block, otherwise zero value.
|
||||
* a3: 64bit physical address of 3rd completed memory block if any completed
|
||||
* block, otherwise zero value.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_WRITE 2
|
||||
#define INTEL_SIP_SMC_FPGA_CONFIG_WRITE \
|
||||
INTEL_SIP_SMC_STD_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_WRITE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE
|
||||
*
|
||||
* Sync call used by service driver at EL1 to track the completed write
|
||||
* transactions. This request is called after INTEL_SIP_SMC_FPGA_CONFIG_WRITE
|
||||
* call returns INTEL_SIP_SMC_STATUS_BUSY.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE.
|
||||
* a1-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_FPGA_BUSY or
|
||||
* INTEL_SIP_SMC_STATUS_ERROR.
|
||||
* a1: 64bit physical address of 1st completed memory block.
|
||||
* a2: 64bit physical address of 2nd completed memory block if
|
||||
* any completed block, otherwise zero value.
|
||||
* a3: 64bit physical address of 3rd completed memory block if
|
||||
* any completed block, otherwise zero value.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE 3
|
||||
#define INTEL_SIP_SMC_FPGA_CONFIG_COMPLETED_WRITE \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_COMPLETED_WRITE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FPGA_CONFIG_ISDONE
|
||||
*
|
||||
* Sync call used by service driver at EL1 to inform secure world that all
|
||||
* data are sent, to check whether or not the secure world had completed
|
||||
* the FPGA configuration process.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_FPGA_CONFIG_ISDONE.
|
||||
* a1-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_BUSY or
|
||||
* INTEL_SIP_SMC_STATUS_ERROR.
|
||||
* a1-3: not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_ISDONE 4
|
||||
#define INTEL_SIP_SMC_FPGA_CONFIG_ISDONE \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_ISDONE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM
|
||||
*
|
||||
* Sync call used by service driver at EL1 to query the physical address of
|
||||
* memory block reserved by secure monitor software.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0:INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM.
|
||||
* a1-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_STATUS_ERROR.
|
||||
* a1: start of physical address of reserved memory block.
|
||||
* a2: size of reserved memory block.
|
||||
* a3: not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_GET_MEM 5
|
||||
#define INTEL_SIP_SMC_FPGA_CONFIG_GET_MEM \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_GET_MEM)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FPGA_CONFIG_LOOPBACK
|
||||
*
|
||||
* For SMC loop-back mode only, used for internal integration, debugging
|
||||
* or troubleshooting.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_FPGA_CONFIG_LOOPBACK.
|
||||
* a1-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_STATUS_ERROR.
|
||||
* a1-3: not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_LOOPBACK 6
|
||||
#define INTEL_SIP_SMC_FPGA_CONFIG_LOOPBACK \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FPGA_CONFIG_LOOPBACK)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_REG_READ
|
||||
*
|
||||
* Read a protected register at EL3
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_REG_READ.
|
||||
* a1: register address.
|
||||
* a2-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_REG_ERROR.
|
||||
* a1: value in the register
|
||||
* a2-3: not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_REG_READ 7
|
||||
#define INTEL_SIP_SMC_REG_READ \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_REG_READ)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_REG_WRITE
|
||||
*
|
||||
* Write a protected register at EL3
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_REG_WRITE.
|
||||
* a1: register address
|
||||
* a2: value to program into register.
|
||||
* a3-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_REG_ERROR.
|
||||
* a1-3: not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_REG_WRITE 8
|
||||
#define INTEL_SIP_SMC_REG_WRITE \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_REG_WRITE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FUNCID_REG_UPDATE
|
||||
*
|
||||
* Update one or more bits in a protected register at EL3 using a
|
||||
* read-modify-write operation.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_REG_UPDATE.
|
||||
* a1: register address
|
||||
* a2: write Mask.
|
||||
* a3: value to write.
|
||||
* a4-7: not used.
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_REG_ERROR.
|
||||
* a1-3: Not used.
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_REG_UPDATE 9
|
||||
#define INTEL_SIP_SMC_REG_UPDATE \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_REG_UPDATE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_STATUS
|
||||
*
|
||||
* Request remote status update boot log, call is synchronous.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_STATUS
|
||||
* a1-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0: Current Image
|
||||
* a1: Last Failing Image
|
||||
* a2: Version | State
|
||||
* a3: Error details | Error location
|
||||
*
|
||||
* Or
|
||||
*
|
||||
* a0: INTEL_SIP_SMC_RSU_ERROR
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_STATUS 11
|
||||
#define INTEL_SIP_SMC_RSU_STATUS \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_STATUS)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_UPDATE
|
||||
*
|
||||
* Request to set the offset of the bitstream to boot after reboot, call
|
||||
* is synchronous.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_UPDATE
|
||||
* a1 64bit physical address of the configuration data memory in flash
|
||||
* a2-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_UPDATE 12
|
||||
#define INTEL_SIP_SMC_RSU_UPDATE \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_UPDATE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_ECC_DBE
|
||||
*
|
||||
* Sync call used by service driver at EL1 to alert EL3 that a Double
|
||||
* Bit ECC error has occurred.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_ECC_DBE
|
||||
* a1 SysManager Double Bit Error value
|
||||
* a2-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_ECC_DBE 13
|
||||
#define INTEL_SIP_SMC_ECC_DBE \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_ECC_DBE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_NOTIFY
|
||||
*
|
||||
* Sync call used by service driver at EL1 to report hard processor
|
||||
* system execution stage to firmware
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_NOTIFY
|
||||
* a1 32bit value representing hard processor system execution stage
|
||||
* a2-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_NOTIFY 14
|
||||
#define INTEL_SIP_SMC_RSU_NOTIFY \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_NOTIFY)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_RETRY_COUNTER
|
||||
*
|
||||
* Sync call used by service driver at EL1 to query RSU retry counter
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_RETRY_COUNTER
|
||||
* a1-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 the retry counter
|
||||
*
|
||||
* Or
|
||||
*
|
||||
* a0 INTEL_SIP_SMC_RSU_ERROR
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_RETRY_COUNTER 15
|
||||
#define INTEL_SIP_SMC_RSU_RETRY_COUNTER \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_RETRY_COUNTER)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_DCMF_VERSION
|
||||
*
|
||||
* Sync call used by service driver at EL1 to query DCMF (Decision
|
||||
* Configuration Management Firmware) version from FW
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_DCMF_VERSION
|
||||
* a1-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 dcmf1 | dcmf0
|
||||
* a2 dcmf3 | dcmf2
|
||||
*
|
||||
* Or
|
||||
*
|
||||
* a0 INTEL_SIP_SMC_RSU_ERROR
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_DCMF_VERSION 16
|
||||
#define INTEL_SIP_SMC_RSU_DCMF_VERSION \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_DCMF_VERSION)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_MAX_RETRY
|
||||
*
|
||||
* Sync call used by service driver at EL1 to query max retry value from FW
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_MAX_RETRY
|
||||
* a1-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 max retry value
|
||||
*
|
||||
* Or
|
||||
* a0 INTEL_SIP_SMC_RSU_ERROR
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_MAX_RETRY 18
|
||||
#define INTEL_SIP_SMC_RSU_MAX_RETRY \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_MAX_RETRY)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_RSU_DCMF_STATUS
|
||||
*
|
||||
* Sync call used by service driver at EL1 to query DCMF status from FW
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_RSU_DCMF_STATUS
|
||||
* a1-7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 dcmf3 | dcmf2 | dcmf1 | dcmf0
|
||||
*
|
||||
* Or
|
||||
*
|
||||
* a0 INTEL_SIP_SMC_RSU_ERROR
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_RSU_DCMF_STATUS 20
|
||||
#define INTEL_SIP_SMC_RSU_DCMF_STATUS \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_RSU_DCMF_STATUS)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_SERVICE_COMPLETED
|
||||
* Sync call to check if the secure world have completed service request
|
||||
* or not.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0: INTEL_SIP_SMC_SERVICE_COMPLETED
|
||||
* a1: this register is optional. If used, it is the physical address for
|
||||
* secure firmware to put output data
|
||||
* a2: this register is optional. If used, it is the size of output data
|
||||
* a3-a7: not used
|
||||
*
|
||||
* Return status:
|
||||
* a0: INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_ERROR,
|
||||
* INTEL_SIP_SMC_REJECTED or INTEL_SIP_SMC_STATUS_BUSY
|
||||
* a1: mailbox error if a0 is INTEL_SIP_SMC_STATUS_ERROR
|
||||
* a2: physical address containing the process info
|
||||
* for FCS certificate -- the data contains the certificate status
|
||||
* for FCS cryption -- the data contains the actual data size FW processes
|
||||
* a3: output data size
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_SERVICE_COMPLETED 30
|
||||
#define INTEL_SIP_SMC_SERVICE_COMPLETED \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_SERVICE_COMPLETED)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FIRMWARE_VERSION
|
||||
*
|
||||
* Sync call used to query the version of running firmware
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_FIRMWARE_VERSION
|
||||
* a1-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_STATUS_ERROR
|
||||
* a1 running firmware version
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FIRMWARE_VERSION 31
|
||||
#define INTEL_SIP_SMC_FIRMWARE_VERSION \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FIRMWARE_VERSION)
|
||||
|
||||
/**
|
||||
* SMC call protocol for Mailbox, starting FUNCID from 60
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_MBOX_SEND_CMD
|
||||
* a1 mailbox command code
|
||||
* a2 physical address that contain mailbox command data (not include header)
|
||||
* a3 mailbox command data size in word
|
||||
* a4 set to 0 for CASUAL, set to 1 for URGENT
|
||||
* a5 physical address for secure firmware to put response data
|
||||
* (not include header)
|
||||
* a6 maximum size in word of physical address to store response data
|
||||
* a7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_REJECTED or
|
||||
* INTEL_SIP_SMC_STATUS_ERROR
|
||||
* a1 mailbox error code
|
||||
* a2 response data length in word
|
||||
* a3 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_MBOX_SEND_CMD 60
|
||||
#define INTEL_SIP_SMC_MBOX_SEND_CMD \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_MBOX_SEND_CMD)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_SVC_VERSION
|
||||
*
|
||||
* Sync call used to query the SIP SMC API Version
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_SVC_VERSION
|
||||
* a1-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 Major
|
||||
* a2 Minor
|
||||
*/
|
||||
#define INTEL_SIP_SMC_SVC_FUNCID_VERSION 512
|
||||
#define INTEL_SIP_SMC_SVC_VERSION \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_SVC_FUNCID_VERSION)
|
||||
|
||||
/**
|
||||
* SMC call protocol for FPGA Crypto Service (FCS)
|
||||
* FUNCID starts from 90
|
||||
*/
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FCS_RANDOM_NUMBER
|
||||
*
|
||||
* Sync call used to query the random number generated by the firmware
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_FCS_RANDOM_NUMBER
|
||||
* a1 the physical address for firmware to write generated random data
|
||||
* a2-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_FCS_ERROR or
|
||||
* INTEL_SIP_SMC_FCS_REJECTED
|
||||
* a1 mailbox error
|
||||
* a2 the physical address of generated random number
|
||||
* a3 size
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FCS_RANDOM_NUMBER 90
|
||||
#define INTEL_SIP_SMC_FCS_RANDOM_NUMBER \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FCS_RANDOM_NUMBER)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FCS_CRYPTION
|
||||
* Async call for data encryption and HMAC signature generation, or for
|
||||
* data decryption and HMAC verification.
|
||||
*
|
||||
* Call INTEL_SIP_SMC_SERVICE_COMPLETED to get the output encrypted or
|
||||
* decrypted data
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_FCS_CRYPTION
|
||||
* a1 cryption mode (1 for encryption and 0 for decryption)
|
||||
* a2 physical address which stores to be encrypted or decrypted data
|
||||
* a3 input data size
|
||||
* a4 physical address which will hold the encrypted or decrypted output data
|
||||
* a5 output data size
|
||||
* a6-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_STATUS_ERROR or
|
||||
* INTEL_SIP_SMC_STATUS_REJECTED
|
||||
* a1-3 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FCS_CRYPTION 91
|
||||
#define INTEL_SIP_SMC_FCS_CRYPTION \
|
||||
INTEL_SIP_SMC_STD_CALL_VAL(INTEL_SIP_SMC_FUNCID_FCS_CRYPTION)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FCS_SERVICE_REQUEST
|
||||
* Async call for authentication service of HPS software
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_FCS_SERVICE_REQUEST
|
||||
* a1 the physical address of data block
|
||||
* a2 size of data block
|
||||
* a3-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_ERROR or
|
||||
* INTEL_SIP_SMC_REJECTED
|
||||
* a1-a3 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FCS_SERVICE_REQUEST 92
|
||||
#define INTEL_SIP_SMC_FCS_SERVICE_REQUEST \
|
||||
INTEL_SIP_SMC_STD_CALL_VAL(INTEL_SIP_SMC_FUNCID_FCS_SERVICE_REQUEST)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FUNCID_FCS_SEND_CERTIFICATE
|
||||
* Sync call to send a signed certificate
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_FCS_SEND_CERTIFICATE
|
||||
* a1 the physical address of CERTIFICATE block
|
||||
* a2 size of data block
|
||||
* a3-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK or INTEL_SIP_SMC_FCS_REJECTED
|
||||
* a1-a3 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FCS_SEND_CERTIFICATE 93
|
||||
#define INTEL_SIP_SMC_FCS_SEND_CERTIFICATE \
|
||||
INTEL_SIP_SMC_STD_CALL_VAL(INTEL_SIP_SMC_FUNCID_FCS_SEND_CERTIFICATE)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_FCS_GET_PROVISION_DATA
|
||||
* Sync call to dump all the fuses and key hashes
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_FCS_GET_PROVISION_DATA
|
||||
* a1 the physical address for firmware to write structure of fuse and
|
||||
* key hashes
|
||||
* a2-a7 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK, INTEL_SIP_SMC_FCS_ERROR or
|
||||
* INTEL_SIP_SMC_FCS_REJECTED
|
||||
* a1 mailbox error
|
||||
* a2 physical address for the structure of fuse and key hashes
|
||||
* a3 the size of structure
|
||||
*
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_FCS_GET_PROVISION_DATA 94
|
||||
#define INTEL_SIP_SMC_FCS_GET_PROVISION_DATA \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_FCS_GET_PROVISION_DATA)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_HWMON_READTEMP
|
||||
* Sync call to request temperature
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 Temperature Channel
|
||||
* a1-a7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 Temperature Value
|
||||
* a2-a3 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_HWMON_READTEMP 32
|
||||
#define INTEL_SIP_SMC_HWMON_READTEMP \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_HWMON_READTEMP)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_HWMON_READVOLT
|
||||
* Sync call to request voltage
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 Voltage Channel
|
||||
* a1-a7 not used
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1 Voltage Value
|
||||
* a2-a3 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_FUNCID_HWMON_READVOLT 33
|
||||
#define INTEL_SIP_SMC_HWMON_READVOLT \
|
||||
INTEL_SIP_SMC_FAST_CALL_VAL(INTEL_SIP_SMC_FUNCID_HWMON_READVOLT)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_ASYNC_POLL
|
||||
* Async call used by service driver at EL1 to query mailbox response from SDM.
|
||||
*
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_ASYNC_POLL
|
||||
* a1 transaction job id
|
||||
* a2-17 will be used to return the response data
|
||||
*
|
||||
* Return status
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK
|
||||
* a1-17 will contain the response values from mailbox for the previous send
|
||||
* transaction
|
||||
* Or
|
||||
* a0 INTEL_SIP_SMC_STATUS_NO_RESPONSE
|
||||
* a1-17 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_POLL (0xC8)
|
||||
#define INTEL_SIP_SMC_ASYNC_POLL \
|
||||
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_POLL)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_ASYNC_RSU_GET_SPT
|
||||
* Async call to get RSU SPT from SDM.
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_ASYNC_RSU_GET_SPT
|
||||
* a1 transaction job id
|
||||
* a2-a17 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK ,INTEL_SIP_SMC_STATUS_REJECTED
|
||||
* or INTEL_SIP_SMC_STATUS_BUSY
|
||||
* a1-a17 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_GET_SPT (0xEA)
|
||||
#define INTEL_SIP_SMC_ASYNC_RSU_GET_SPT \
|
||||
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_GET_SPT)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_ASYNC_RSU_GET_ERROR_STATUS
|
||||
* Async call to get RSU error status from SDM.
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_ASYNC_RSU_GET_ERROR_STATUS
|
||||
* a1 transaction job id
|
||||
* a2-a17 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK ,INTEL_SIP_SMC_STATUS_REJECTED
|
||||
* or INTEL_SIP_SMC_STATUS_BUSY
|
||||
* a1-a17 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_GET_ERROR_STATUS (0xEB)
|
||||
#define INTEL_SIP_SMC_ASYNC_RSU_GET_ERROR_STATUS \
|
||||
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_GET_ERROR_STATUS)
|
||||
|
||||
/**
|
||||
* Request INTEL_SIP_SMC_ASYNC_RSU_NOTIFY
|
||||
* Async call to send NOTIFY value to SDM.
|
||||
* Call register usage:
|
||||
* a0 INTEL_SIP_SMC_ASYNC_RSU_NOTIFY
|
||||
* a1 transaction job id
|
||||
* a2 notify value
|
||||
* a3-a17 not used
|
||||
*
|
||||
* Return status:
|
||||
* a0 INTEL_SIP_SMC_STATUS_OK ,INTEL_SIP_SMC_STATUS_REJECTED
|
||||
* or INTEL_SIP_SMC_STATUS_BUSY
|
||||
* a1-a17 not used
|
||||
*/
|
||||
#define INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_NOTIFY (0xEC)
|
||||
#define INTEL_SIP_SMC_ASYNC_RSU_NOTIFY \
|
||||
INTEL_SIP_SMC_ASYNC_VAL(INTEL_SIP_SMC_ASYNC_FUNC_ID_RSU_NOTIFY)
|
||||
#endif
|
||||
@@ -0,0 +1,392 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2017-2018, Intel Corporation
|
||||
* Copyright (C) 2025, Altera Corporation
|
||||
*/
|
||||
|
||||
#ifndef __STRATIX10_SVC_CLIENT_H
|
||||
#define __STRATIX10_SVC_CLIENT_H
|
||||
|
||||
/*
|
||||
* Service layer driver supports client names
|
||||
*
|
||||
* fpga: for FPGA configuration
|
||||
* rsu: for remote status update
|
||||
* hwmon: for hardware monitoring (voltage and temperature)
|
||||
*/
|
||||
#define SVC_CLIENT_FPGA "fpga"
|
||||
#define SVC_CLIENT_RSU "rsu"
|
||||
#define SVC_CLIENT_FCS "fcs"
|
||||
#define SVC_CLIENT_HWMON "hwmon"
|
||||
|
||||
/*
|
||||
* Status of the sent command, in bit number
|
||||
*
|
||||
* SVC_STATUS_OK:
|
||||
* Secure firmware accepts the request issued by one of service clients.
|
||||
*
|
||||
* SVC_STATUS_BUFFER_SUBMITTED:
|
||||
* Service client successfully submits data buffer to secure firmware.
|
||||
*
|
||||
* SVC_STATUS_BUFFER_DONE:
|
||||
* Secure firmware completes data process, ready to accept the
|
||||
* next WRITE transaction.
|
||||
*
|
||||
* SVC_STATUS_COMPLETED:
|
||||
* Secure firmware completes service request successfully. In case of
|
||||
* FPGA configuration, FPGA should be in user mode.
|
||||
*
|
||||
* SVC_COMMAND_STATUS_BUSY:
|
||||
* Service request is still in process.
|
||||
*
|
||||
* SVC_COMMAND_STATUS_ERROR:
|
||||
* Error encountered during the process of the service request.
|
||||
*
|
||||
* SVC_STATUS_NO_SUPPORT:
|
||||
* Secure firmware doesn't support requested features such as RSU retry
|
||||
* or RSU notify.
|
||||
*/
|
||||
#define SVC_STATUS_OK 0
|
||||
#define SVC_STATUS_BUFFER_SUBMITTED 1
|
||||
#define SVC_STATUS_BUFFER_DONE 2
|
||||
#define SVC_STATUS_COMPLETED 3
|
||||
#define SVC_STATUS_BUSY 4
|
||||
#define SVC_STATUS_ERROR 5
|
||||
#define SVC_STATUS_NO_SUPPORT 6
|
||||
#define SVC_STATUS_INVALID_PARAM 7
|
||||
|
||||
/*
|
||||
* Flag bit for COMMAND_RECONFIG
|
||||
*
|
||||
* COMMAND_RECONFIG_FLAG_PARTIAL:
|
||||
* Set to FPGA configuration type (full or partial).
|
||||
*/
|
||||
#define COMMAND_RECONFIG_FLAG_PARTIAL 0
|
||||
|
||||
/*
|
||||
* Timeout settings for service clients:
|
||||
* timeout value used in Stratix10 FPGA manager driver.
|
||||
* timeout value used in RSU driver
|
||||
*/
|
||||
#define SVC_RECONFIG_REQUEST_TIMEOUT_MS 5000
|
||||
#define SVC_RECONFIG_BUFFER_TIMEOUT_MS 5000
|
||||
#define SVC_RSU_REQUEST_TIMEOUT_MS 2000
|
||||
#define SVC_FCS_REQUEST_TIMEOUT_MS 2000
|
||||
#define SVC_COMPLETED_TIMEOUT_MS 30000
|
||||
#define SVC_HWMON_REQUEST_TIMEOUT_MS 2000
|
||||
|
||||
struct stratix10_svc_chan;
|
||||
|
||||
/**
|
||||
* enum stratix10_svc_command_code - supported service commands
|
||||
*
|
||||
* @COMMAND_NOOP: do 'dummy' request for integration/debug/trouble-shooting
|
||||
*
|
||||
* @COMMAND_RECONFIG: ask for FPGA configuration preparation, return status
|
||||
* is SVC_STATUS_OK
|
||||
*
|
||||
* @COMMAND_RECONFIG_DATA_SUBMIT: submit buffer(s) of bit-stream data for the
|
||||
* FPGA configuration, return status is SVC_STATUS_SUBMITTED or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RECONFIG_DATA_CLAIM: check the status of the configuration, return
|
||||
* status is SVC_STATUS_COMPLETED, or SVC_STATUS_BUSY, or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RECONFIG_STATUS: check the status of the configuration, return
|
||||
* status is SVC_STATUS_COMPLETED, or SVC_STATUS_BUSY, or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_STATUS: request remote system update boot log, return status
|
||||
* is log data or SVC_STATUS_RSU_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_UPDATE: set the offset of the bitstream to boot after reboot,
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_NOTIFY: report the status of hard processor system
|
||||
* software to firmware, return status is SVC_STATUS_OK or
|
||||
* SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_RETRY: query firmware for the current image's retry counter,
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_MAX_RETRY: query firmware for the max retry value,
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_DCMF_VERSION: query firmware for the DCMF version, return status
|
||||
* is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_POLL_SERVICE_STATUS: poll if the service request is complete,
|
||||
* return statis is SVC_STATUS_OK, SVC_STATUS_ERROR or SVC_STATUS_BUSY
|
||||
*
|
||||
* @COMMAND_FIRMWARE_VERSION: query running firmware version, return status
|
||||
* is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_SMC_SVC_VERSION: Non-mailbox SMC SVC API Version,
|
||||
* return status is SVC_STATUS_OK
|
||||
*
|
||||
* @COMMAND_MBOX_SEND_CMD: send generic mailbox command, return status is
|
||||
* SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_DCMF_STATUS: query firmware for the DCMF status
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_RSU_GET_SPT_TABLE: query firmware for SPT table
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_FCS_REQUEST_SERVICE: request validation of image from firmware,
|
||||
* return status is SVC_STATUS_OK, SVC_STATUS_INVALID_PARAM
|
||||
*
|
||||
* @COMMAND_FCS_SEND_CERTIFICATE: send a certificate, return status is
|
||||
* SVC_STATUS_OK, SVC_STATUS_INVALID_PARAM, SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_FCS_GET_PROVISION_DATA: read the provisioning data, return status is
|
||||
* SVC_STATUS_OK, SVC_STATUS_INVALID_PARAM, SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_FCS_DATA_ENCRYPTION: encrypt the data, return status is
|
||||
* SVC_STATUS_OK, SVC_STATUS_INVALID_PARAM, SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_FCS_DATA_DECRYPTION: decrypt the data, return status is
|
||||
* SVC_STATUS_OK, SVC_STATUS_INVALID_PARAM, SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_FCS_RANDOM_NUMBER_GEN: generate a random number, return status
|
||||
* is SVC_STATUS_OK, SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_HWMON_READTEMP: query the temperature from the hardware monitor,
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*
|
||||
* @COMMAND_HWMON_READVOLT: query the voltage from the hardware monitor,
|
||||
* return status is SVC_STATUS_OK or SVC_STATUS_ERROR
|
||||
*/
|
||||
enum stratix10_svc_command_code {
|
||||
/* for FPGA */
|
||||
COMMAND_NOOP = 0,
|
||||
COMMAND_RECONFIG,
|
||||
COMMAND_RECONFIG_DATA_SUBMIT,
|
||||
COMMAND_RECONFIG_DATA_CLAIM,
|
||||
COMMAND_RECONFIG_STATUS,
|
||||
/* for RSU */
|
||||
COMMAND_RSU_STATUS = 10,
|
||||
COMMAND_RSU_UPDATE,
|
||||
COMMAND_RSU_NOTIFY,
|
||||
COMMAND_RSU_RETRY,
|
||||
COMMAND_RSU_MAX_RETRY,
|
||||
COMMAND_RSU_DCMF_VERSION,
|
||||
COMMAND_RSU_DCMF_STATUS,
|
||||
COMMAND_FIRMWARE_VERSION,
|
||||
COMMAND_RSU_GET_SPT_TABLE,
|
||||
/* for FCS */
|
||||
COMMAND_FCS_REQUEST_SERVICE = 20,
|
||||
COMMAND_FCS_SEND_CERTIFICATE,
|
||||
COMMAND_FCS_GET_PROVISION_DATA,
|
||||
COMMAND_FCS_DATA_ENCRYPTION,
|
||||
COMMAND_FCS_DATA_DECRYPTION,
|
||||
COMMAND_FCS_RANDOM_NUMBER_GEN,
|
||||
/* for general status poll */
|
||||
COMMAND_POLL_SERVICE_STATUS = 40,
|
||||
/* for generic mailbox send command */
|
||||
COMMAND_MBOX_SEND_CMD = 100,
|
||||
/* Non-mailbox SMC Call */
|
||||
COMMAND_SMC_SVC_VERSION = 200,
|
||||
/* for HWMON */
|
||||
COMMAND_HWMON_READTEMP,
|
||||
COMMAND_HWMON_READVOLT
|
||||
};
|
||||
|
||||
/**
|
||||
* struct stratix10_svc_client_msg - message sent by client to service
|
||||
* @payload: starting address of data need be processed
|
||||
* @payload_length: to be processed data size in bytes
|
||||
* @payload_output: starting address of processed data
|
||||
* @payload_length_output: processed data size in bytes
|
||||
* @command: service command
|
||||
* @arg: args to be passed via registers and not physically mapped buffers
|
||||
*/
|
||||
struct stratix10_svc_client_msg {
|
||||
void *payload;
|
||||
size_t payload_length;
|
||||
void *payload_output;
|
||||
size_t payload_length_output;
|
||||
enum stratix10_svc_command_code command;
|
||||
u64 arg[3];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct stratix10_svc_command_config_type - config type
|
||||
* @flags: flag bit for the type of FPGA configuration
|
||||
*/
|
||||
struct stratix10_svc_command_config_type {
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct stratix10_svc_cb_data - callback data structure from service layer
|
||||
* @status: the status of sent command
|
||||
* @kaddr1: address of 1st completed data block
|
||||
* @kaddr2: address of 2nd completed data block
|
||||
* @kaddr3: address of 3rd completed data block
|
||||
*/
|
||||
struct stratix10_svc_cb_data {
|
||||
u32 status;
|
||||
void *kaddr1;
|
||||
void *kaddr2;
|
||||
void *kaddr3;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct stratix10_svc_client - service client structure
|
||||
* @dev: the client device
|
||||
* @receive_cb: callback to provide service client the received data
|
||||
* @priv: client private data
|
||||
*/
|
||||
struct stratix10_svc_client {
|
||||
struct device *dev;
|
||||
void (*receive_cb)(struct stratix10_svc_client *client,
|
||||
struct stratix10_svc_cb_data *cb_data);
|
||||
void *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* stratix10_svc_request_channel_byname() - request service channel
|
||||
* @client: identity of the client requesting the channel
|
||||
* @name: supporting client name defined above
|
||||
*
|
||||
* Return: a pointer to channel assigned to the client on success,
|
||||
* or ERR_PTR() on error.
|
||||
*/
|
||||
struct stratix10_svc_chan
|
||||
*stratix10_svc_request_channel_byname(struct stratix10_svc_client *client,
|
||||
const char *name);
|
||||
|
||||
/**
|
||||
* stratix10_svc_free_channel() - free service channel.
|
||||
* @chan: service channel to be freed
|
||||
*/
|
||||
void stratix10_svc_free_channel(struct stratix10_svc_chan *chan);
|
||||
|
||||
/**
|
||||
* stratix10_svc_allocate_memory() - allocate the momory
|
||||
* @chan: service channel assigned to the client
|
||||
* @size: number of bytes client requests
|
||||
*
|
||||
* Service layer allocates the requested number of bytes from the memory
|
||||
* pool for the client.
|
||||
*
|
||||
* Return: the starting address of allocated memory on success, or
|
||||
* ERR_PTR() on error.
|
||||
*/
|
||||
void *stratix10_svc_allocate_memory(struct stratix10_svc_chan *chan,
|
||||
size_t size);
|
||||
|
||||
/**
|
||||
* stratix10_svc_free_memory() - free allocated memory
|
||||
* @chan: service channel assigned to the client
|
||||
* @kaddr: starting address of memory to be free back to pool
|
||||
*/
|
||||
void stratix10_svc_free_memory(struct stratix10_svc_chan *chan, void *kaddr);
|
||||
|
||||
/**
|
||||
* stratix10_svc_send() - send a message to the remote
|
||||
* @chan: service channel assigned to the client
|
||||
* @msg: message data to be sent, in the format of
|
||||
* struct stratix10_svc_client_msg
|
||||
*
|
||||
* Return: 0 for success, -ENOMEM or -ENOBUFS on error.
|
||||
*/
|
||||
int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg);
|
||||
|
||||
/**
|
||||
* stratix10_svc_done() - complete service request
|
||||
* @chan: service channel assigned to the client
|
||||
*
|
||||
* This function is used by service client to inform service layer that
|
||||
* client's service requests are completed, or there is an error in the
|
||||
* request process.
|
||||
*/
|
||||
void stratix10_svc_done(struct stratix10_svc_chan *chan);
|
||||
|
||||
/**
|
||||
* typedef async_callback_t - A type definition for an asynchronous callback function.
|
||||
*
|
||||
* This type defines a function pointer for an asynchronous callback.
|
||||
* The callback function takes a single argument, which is a pointer to
|
||||
* user-defined data.
|
||||
*
|
||||
* @cb_arg: Argument to be passed to the callback function.
|
||||
*/
|
||||
typedef void (*async_callback_t)(void *cb_arg);
|
||||
|
||||
/**
|
||||
* stratix10_svc_add_async_client - Add an asynchronous client to a Stratix 10
|
||||
* service channel.
|
||||
* @chan: Pointer to the Stratix 10 service channel structure.
|
||||
* @use_unique_clientid: Boolean flag indicating whether to use a unique client ID.
|
||||
*
|
||||
* This function registers an asynchronous client with the specified Stratix 10
|
||||
* service channel. If the use_unique_clientid flag is set to true, a unique client
|
||||
* ID will be assigned to the client.
|
||||
*
|
||||
* Return: 0 on success, or a negative error code on failure:
|
||||
* -EINVAL if the channel is NULL or the async controller is not initialized.
|
||||
* -EALREADY if the async channel is already allocated.
|
||||
* -ENOMEM if memory allocation fails.
|
||||
* Other negative values if ID allocation fails
|
||||
*/
|
||||
int stratix10_svc_add_async_client(struct stratix10_svc_chan *chan, bool use_unique_clientid);
|
||||
|
||||
/**
|
||||
* stratix10_svc_remove_async_client - Remove an asynchronous client from the Stratix 10
|
||||
* service channel.
|
||||
* @chan: Pointer to the Stratix 10 service channel structure.
|
||||
*
|
||||
* This function removes an asynchronous client from the specified Stratix 10 service channel.
|
||||
* It is typically used to clean up and release resources associated with the client.
|
||||
*
|
||||
* Return: 0 on success, -EINVAL if the channel or asynchronous channel is invalid.
|
||||
*/
|
||||
int stratix10_svc_remove_async_client(struct stratix10_svc_chan *chan);
|
||||
|
||||
/**
|
||||
* stratix10_svc_async_send - Send an asynchronous message to the SDM mailbox
|
||||
* in EL3 secure firmware.
|
||||
* @chan: Pointer to the service channel structure.
|
||||
* @msg: Pointer to the message to be sent.
|
||||
* @handler: Pointer to the handler object used by caller to track the transaction.
|
||||
* @cb: Callback function to be called upon completion.
|
||||
* @cb_arg: Argument to be passed to the callback function.
|
||||
*
|
||||
* This function sends a message asynchronously to the SDM mailbox in EL3 secure firmware.
|
||||
* and registers a callback function to be invoked when the operation completes.
|
||||
*
|
||||
* Return: 0 on success,and negative error codes on failure.
|
||||
*/
|
||||
int stratix10_svc_async_send(struct stratix10_svc_chan *chan, void *msg, void **handler,
|
||||
async_callback_t cb, void *cb_arg);
|
||||
|
||||
/**
|
||||
* stratix10_svc_async_poll - Polls the status of an asynchronous service request.
|
||||
* @chan: Pointer to the service channel structure.
|
||||
* @tx_handle: Handle to the transaction being polled.
|
||||
* @data: Pointer to the callback data structure to be filled with the result.
|
||||
*
|
||||
* This function checks the status of an asynchronous service request
|
||||
* and fills the provided callback data structure with the result.
|
||||
*
|
||||
* Return: 0 on success, -EINVAL if any input parameter is invalid or if the
|
||||
* async controller is not initialized, -EAGAIN if the transaction is
|
||||
* still in progress, or other negative error codes on failure.
|
||||
*/
|
||||
int stratix10_svc_async_poll(struct stratix10_svc_chan *chan, void *tx_handle,
|
||||
struct stratix10_svc_cb_data *data);
|
||||
|
||||
/**
|
||||
* stratix10_svc_async_done - Complete an asynchronous transaction
|
||||
* @chan: Pointer to the service channel structure
|
||||
* @tx_handle: Pointer to the transaction handle
|
||||
*
|
||||
* This function completes an asynchronous transaction by removing the
|
||||
* transaction from the hash table and deallocating the associated resources.
|
||||
*
|
||||
* Return: 0 on success, -EINVAL on invalid input or errors.
|
||||
*/
|
||||
int stratix10_svc_async_done(struct stratix10_svc_chan *chan, void *tx_handle);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (c) 2022 MediaTek Inc.
|
||||
*/
|
||||
|
||||
#ifndef MTK_ADSP_IPC_H
|
||||
#define MTK_ADSP_IPC_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/mailbox_controller.h>
|
||||
#include <linux/mailbox_client.h>
|
||||
|
||||
#define MTK_ADSP_IPC_REQ 0
|
||||
#define MTK_ADSP_IPC_RSP 1
|
||||
#define MTK_ADSP_IPC_OP_REQ 0x1
|
||||
#define MTK_ADSP_IPC_OP_RSP 0x2
|
||||
|
||||
enum {
|
||||
MTK_ADSP_MBOX_REPLY,
|
||||
MTK_ADSP_MBOX_REQUEST,
|
||||
MTK_ADSP_MBOX_NUM,
|
||||
};
|
||||
|
||||
struct mtk_adsp_ipc;
|
||||
|
||||
struct mtk_adsp_ipc_ops {
|
||||
void (*handle_reply)(struct mtk_adsp_ipc *ipc);
|
||||
void (*handle_request)(struct mtk_adsp_ipc *ipc);
|
||||
};
|
||||
|
||||
struct mtk_adsp_chan {
|
||||
struct mtk_adsp_ipc *ipc;
|
||||
struct mbox_client cl;
|
||||
struct mbox_chan *ch;
|
||||
char *name;
|
||||
int idx;
|
||||
};
|
||||
|
||||
struct mtk_adsp_ipc {
|
||||
struct mtk_adsp_chan chans[MTK_ADSP_MBOX_NUM];
|
||||
struct device *dev;
|
||||
const struct mtk_adsp_ipc_ops *ops;
|
||||
void *private_data;
|
||||
};
|
||||
|
||||
static inline void mtk_adsp_ipc_set_data(struct mtk_adsp_ipc *ipc, void *data)
|
||||
{
|
||||
ipc->private_data = data;
|
||||
}
|
||||
|
||||
static inline void *mtk_adsp_ipc_get_data(struct mtk_adsp_ipc *ipc)
|
||||
{
|
||||
return ipc->private_data;
|
||||
}
|
||||
|
||||
int mtk_adsp_ipc_send(struct mtk_adsp_ipc *ipc, unsigned int idx, uint32_t op);
|
||||
|
||||
#endif /* MTK_ADSP_IPC_H */
|
||||
@@ -0,0 +1,31 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2016 Endless Mobile, Inc.
|
||||
* Author: Carlo Caione <carlo@endlessm.com>
|
||||
*/
|
||||
|
||||
#ifndef _MESON_SM_FW_H_
|
||||
#define _MESON_SM_FW_H_
|
||||
|
||||
enum {
|
||||
SM_EFUSE_READ,
|
||||
SM_EFUSE_WRITE,
|
||||
SM_EFUSE_USER_MAX,
|
||||
SM_GET_CHIP_ID,
|
||||
SM_A1_PWRC_SET,
|
||||
SM_A1_PWRC_GET,
|
||||
};
|
||||
|
||||
struct meson_sm_firmware;
|
||||
|
||||
int meson_sm_call(struct meson_sm_firmware *fw, unsigned int cmd_index,
|
||||
s32 *ret, u32 arg0, u32 arg1, u32 arg2, u32 arg3, u32 arg4);
|
||||
int meson_sm_call_write(struct meson_sm_firmware *fw, void *buffer,
|
||||
unsigned int b_size, unsigned int cmd_index, u32 arg0,
|
||||
u32 arg1, u32 arg2, u32 arg3, u32 arg4);
|
||||
int meson_sm_call_read(struct meson_sm_firmware *fw, void *buffer,
|
||||
unsigned int bsize, unsigned int cmd_index, u32 arg0,
|
||||
u32 arg1, u32 arg2, u32 arg3, u32 arg4);
|
||||
struct meson_sm_firmware *meson_sm_get(struct device_node *firmware_node);
|
||||
|
||||
#endif /* _MESON_SM_FW_H_ */
|
||||
@@ -0,0 +1,54 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Driver for Qualcomm Secure Execution Environment (SEE) interface (QSEECOM).
|
||||
* Responsible for setting up and managing QSEECOM client devices.
|
||||
*
|
||||
* Copyright (C) 2023 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef __QCOM_QSEECOM_H
|
||||
#define __QCOM_QSEECOM_H
|
||||
|
||||
#include <linux/auxiliary_bus.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/firmware/qcom/qcom_scm.h>
|
||||
|
||||
/**
|
||||
* struct qseecom_client - QSEECOM client device.
|
||||
* @aux_dev: Underlying auxiliary device.
|
||||
* @app_id: ID of the loaded application.
|
||||
*/
|
||||
struct qseecom_client {
|
||||
struct auxiliary_device aux_dev;
|
||||
u32 app_id;
|
||||
};
|
||||
|
||||
/**
|
||||
* qcom_qseecom_app_send() - Send to and receive data from a given QSEE app.
|
||||
* @client: The QSEECOM client associated with the target app.
|
||||
* @req: Request buffer sent to the app (must be TZ memory).
|
||||
* @req_size: Size of the request buffer.
|
||||
* @rsp: Response buffer, written to by the app (must be TZ memory).
|
||||
* @rsp_size: Size of the response buffer.
|
||||
*
|
||||
* Sends a request to the QSEE app associated with the given client and read
|
||||
* back its response. The caller must provide two DMA memory regions, one for
|
||||
* the request and one for the response, and fill out the @req region with the
|
||||
* respective (app-specific) request data. The QSEE app reads this and returns
|
||||
* its response in the @rsp region.
|
||||
*
|
||||
* Note: This is a convenience wrapper around qcom_scm_qseecom_app_send().
|
||||
* Clients should prefer to use this wrapper.
|
||||
*
|
||||
* Return: Zero on success, nonzero on failure.
|
||||
*/
|
||||
static inline int qcom_qseecom_app_send(struct qseecom_client *client,
|
||||
void *req, size_t req_size,
|
||||
void *rsp, size_t rsp_size)
|
||||
{
|
||||
return qcom_scm_qseecom_app_send(client->app_id, req, req_size, rsp, rsp_size);
|
||||
}
|
||||
|
||||
#endif /* __QCOM_QSEECOM_H */
|
||||
@@ -0,0 +1,198 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/* Copyright (c) 2010-2015, 2018-2019 The Linux Foundation. All rights reserved.
|
||||
* Copyright (C) 2015 Linaro Ltd.
|
||||
*/
|
||||
#ifndef __QCOM_SCM_H
|
||||
#define __QCOM_SCM_H
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/cpumask.h>
|
||||
|
||||
#include <dt-bindings/firmware/qcom,scm.h>
|
||||
|
||||
#define QCOM_SCM_VERSION(major, minor) (((major) << 16) | ((minor) & 0xFF))
|
||||
#define QCOM_SCM_CPU_PWR_DOWN_L2_ON 0x0
|
||||
#define QCOM_SCM_CPU_PWR_DOWN_L2_OFF 0x1
|
||||
#define QCOM_SCM_HDCP_MAX_REQ_CNT 5
|
||||
|
||||
struct qcom_scm_hdcp_req {
|
||||
u32 addr;
|
||||
u32 val;
|
||||
};
|
||||
|
||||
struct qcom_scm_vmperm {
|
||||
int vmid;
|
||||
int perm;
|
||||
};
|
||||
|
||||
enum qcom_scm_ocmem_client {
|
||||
QCOM_SCM_OCMEM_UNUSED_ID = 0x0,
|
||||
QCOM_SCM_OCMEM_GRAPHICS_ID,
|
||||
QCOM_SCM_OCMEM_VIDEO_ID,
|
||||
QCOM_SCM_OCMEM_LP_AUDIO_ID,
|
||||
QCOM_SCM_OCMEM_SENSORS_ID,
|
||||
QCOM_SCM_OCMEM_OTHER_OS_ID,
|
||||
QCOM_SCM_OCMEM_DEBUG_ID,
|
||||
};
|
||||
|
||||
enum qcom_scm_sec_dev_id {
|
||||
QCOM_SCM_MDSS_DEV_ID = 1,
|
||||
QCOM_SCM_OCMEM_DEV_ID = 5,
|
||||
QCOM_SCM_PCIE0_DEV_ID = 11,
|
||||
QCOM_SCM_PCIE1_DEV_ID = 12,
|
||||
QCOM_SCM_GFX_DEV_ID = 18,
|
||||
QCOM_SCM_UFS_DEV_ID = 19,
|
||||
QCOM_SCM_ICE_DEV_ID = 20,
|
||||
};
|
||||
|
||||
enum qcom_scm_ice_cipher {
|
||||
QCOM_SCM_ICE_CIPHER_AES_128_XTS = 0,
|
||||
QCOM_SCM_ICE_CIPHER_AES_128_CBC = 1,
|
||||
QCOM_SCM_ICE_CIPHER_AES_256_XTS = 3,
|
||||
QCOM_SCM_ICE_CIPHER_AES_256_CBC = 4,
|
||||
};
|
||||
|
||||
#define QCOM_SCM_PERM_READ 0x4
|
||||
#define QCOM_SCM_PERM_WRITE 0x2
|
||||
#define QCOM_SCM_PERM_EXEC 0x1
|
||||
#define QCOM_SCM_PERM_RW (QCOM_SCM_PERM_READ | QCOM_SCM_PERM_WRITE)
|
||||
#define QCOM_SCM_PERM_RWX (QCOM_SCM_PERM_RW | QCOM_SCM_PERM_EXEC)
|
||||
|
||||
bool qcom_scm_is_available(void);
|
||||
|
||||
int qcom_scm_set_cold_boot_addr(void *entry);
|
||||
int qcom_scm_set_warm_boot_addr(void *entry);
|
||||
void qcom_scm_cpu_power_down(u32 flags);
|
||||
int qcom_scm_set_remote_state(u32 state, u32 id);
|
||||
|
||||
struct qcom_scm_pas_context {
|
||||
struct device *dev;
|
||||
u32 pas_id;
|
||||
phys_addr_t mem_phys;
|
||||
size_t mem_size;
|
||||
void *ptr;
|
||||
dma_addr_t phys;
|
||||
ssize_t size;
|
||||
bool use_tzmem;
|
||||
};
|
||||
|
||||
struct qcom_scm_pas_context *devm_qcom_scm_pas_context_alloc(struct device *dev,
|
||||
u32 pas_id,
|
||||
phys_addr_t mem_phys,
|
||||
size_t mem_size);
|
||||
int qcom_scm_pas_init_image(u32 pas_id, const void *metadata, size_t size,
|
||||
struct qcom_scm_pas_context *ctx);
|
||||
void qcom_scm_pas_metadata_release(struct qcom_scm_pas_context *ctx);
|
||||
int qcom_scm_pas_mem_setup(u32 pas_id, phys_addr_t addr, phys_addr_t size);
|
||||
int qcom_scm_pas_auth_and_reset(u32 pas_id);
|
||||
int qcom_scm_pas_shutdown(u32 pas_id);
|
||||
bool qcom_scm_pas_supported(u32 pas_id);
|
||||
struct resource_table *qcom_scm_pas_get_rsc_table(struct qcom_scm_pas_context *ctx,
|
||||
void *input_rt, size_t input_rt_size,
|
||||
size_t *output_rt_size);
|
||||
|
||||
int qcom_scm_pas_prepare_and_auth_reset(struct qcom_scm_pas_context *ctx);
|
||||
|
||||
int qcom_scm_io_readl(phys_addr_t addr, unsigned int *val);
|
||||
int qcom_scm_io_writel(phys_addr_t addr, unsigned int val);
|
||||
|
||||
bool qcom_scm_restore_sec_cfg_available(void);
|
||||
int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare);
|
||||
int qcom_scm_set_gpu_smmu_aperture(unsigned int context_bank);
|
||||
bool qcom_scm_set_gpu_smmu_aperture_is_available(void);
|
||||
int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size);
|
||||
int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare);
|
||||
int qcom_scm_iommu_set_cp_pool_size(u32 spare, u32 size);
|
||||
int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size,
|
||||
u32 cp_nonpixel_start, u32 cp_nonpixel_size);
|
||||
int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, u64 *src,
|
||||
const struct qcom_scm_vmperm *newvm,
|
||||
unsigned int dest_cnt);
|
||||
|
||||
bool qcom_scm_ocmem_lock_available(void);
|
||||
int qcom_scm_ocmem_lock(enum qcom_scm_ocmem_client id, u32 offset, u32 size,
|
||||
u32 mode);
|
||||
int qcom_scm_ocmem_unlock(enum qcom_scm_ocmem_client id, u32 offset, u32 size);
|
||||
|
||||
bool qcom_scm_ice_available(void);
|
||||
int qcom_scm_ice_invalidate_key(u32 index);
|
||||
int qcom_scm_ice_set_key(u32 index, const u8 *key, u32 key_size,
|
||||
enum qcom_scm_ice_cipher cipher, u32 data_unit_size);
|
||||
bool qcom_scm_has_wrapped_key_support(void);
|
||||
int qcom_scm_derive_sw_secret(const u8 *eph_key, size_t eph_key_size,
|
||||
u8 *sw_secret, size_t sw_secret_size);
|
||||
int qcom_scm_generate_ice_key(u8 *lt_key, size_t lt_key_size);
|
||||
int qcom_scm_prepare_ice_key(const u8 *lt_key, size_t lt_key_size,
|
||||
u8 *eph_key, size_t eph_key_size);
|
||||
int qcom_scm_import_ice_key(const u8 *raw_key, size_t raw_key_size,
|
||||
u8 *lt_key, size_t lt_key_size);
|
||||
|
||||
bool qcom_scm_hdcp_available(void);
|
||||
int qcom_scm_hdcp_req(struct qcom_scm_hdcp_req *req, u32 req_cnt, u32 *resp);
|
||||
|
||||
int qcom_scm_iommu_set_pt_format(u32 sec_id, u32 ctx_num, u32 pt_fmt);
|
||||
int qcom_scm_qsmmu500_wait_safe_toggle(bool en);
|
||||
|
||||
int qcom_scm_lmh_dcvsh(u32 payload_fn, u32 payload_reg, u32 payload_val,
|
||||
u64 limit_node, u32 node_id, u64 version);
|
||||
int qcom_scm_lmh_profile_change(u32 profile_id);
|
||||
bool qcom_scm_lmh_dcvsh_available(void);
|
||||
|
||||
/*
|
||||
* Request TZ to program set of access controlled registers necessary
|
||||
* irrespective of any features
|
||||
*/
|
||||
#define QCOM_SCM_GPU_ALWAYS_EN_REQ BIT(0)
|
||||
/*
|
||||
* Request TZ to program BCL id to access controlled register when BCL is
|
||||
* enabled
|
||||
*/
|
||||
#define QCOM_SCM_GPU_BCL_EN_REQ BIT(1)
|
||||
/*
|
||||
* Request TZ to program set of access controlled register for CLX feature
|
||||
* when enabled
|
||||
*/
|
||||
#define QCOM_SCM_GPU_CLX_EN_REQ BIT(2)
|
||||
/*
|
||||
* Request TZ to program tsense ids to access controlled registers for reading
|
||||
* gpu temperature sensors
|
||||
*/
|
||||
#define QCOM_SCM_GPU_TSENSE_EN_REQ BIT(3)
|
||||
|
||||
int qcom_scm_gpu_init_regs(u32 gpu_req);
|
||||
|
||||
int qcom_scm_shm_bridge_create(u64 pfn_and_ns_perm_flags,
|
||||
u64 ipfn_and_s_perm_flags, u64 size_and_flags,
|
||||
u64 ns_vmids, u64 *handle);
|
||||
int qcom_scm_shm_bridge_delete(u64 handle);
|
||||
|
||||
#ifdef CONFIG_QCOM_QSEECOM
|
||||
|
||||
int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id);
|
||||
int qcom_scm_qseecom_app_send(u32 app_id, void *req, size_t req_size,
|
||||
void *rsp, size_t rsp_size);
|
||||
|
||||
#else /* CONFIG_QCOM_QSEECOM */
|
||||
|
||||
static inline int qcom_scm_qseecom_app_get_id(const char *app_name, u32 *app_id)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int qcom_scm_qseecom_app_send(u32 app_id,
|
||||
void *req, size_t req_size,
|
||||
void *rsp, size_t rsp_size)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_QCOM_QSEECOM */
|
||||
|
||||
int qcom_scm_qtee_invoke_smc(phys_addr_t inbuf, size_t inbuf_size,
|
||||
phys_addr_t outbuf, size_t outbuf_size,
|
||||
u64 *result, u64 *response_type);
|
||||
int qcom_scm_qtee_callback_response(phys_addr_t buf, size_t buf_size,
|
||||
u64 *result, u64 *response_type);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,80 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (C) 2023-2024 Linaro Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __QCOM_TZMEM_H
|
||||
#define __QCOM_TZMEM_H
|
||||
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct device;
|
||||
struct qcom_tzmem_pool;
|
||||
|
||||
/**
|
||||
* enum qcom_tzmem_policy - Policy for pool growth.
|
||||
*/
|
||||
enum qcom_tzmem_policy {
|
||||
/**
|
||||
* @QCOM_TZMEM_POLICY_STATIC: Static pool,
|
||||
* never grow above initial size.
|
||||
*/
|
||||
QCOM_TZMEM_POLICY_STATIC = 1,
|
||||
/**
|
||||
* @QCOM_TZMEM_POLICY_MULTIPLIER: When out of memory,
|
||||
* add increment * current size of memory.
|
||||
*/
|
||||
QCOM_TZMEM_POLICY_MULTIPLIER,
|
||||
/**
|
||||
* @QCOM_TZMEM_POLICY_ON_DEMAND: When out of memory
|
||||
* add as much as is needed until max_size.
|
||||
*/
|
||||
QCOM_TZMEM_POLICY_ON_DEMAND,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct qcom_tzmem_pool_config - TZ memory pool configuration.
|
||||
* @initial_size: Number of bytes to allocate for the pool during its creation.
|
||||
* @policy: Pool size growth policy.
|
||||
* @increment: Used with policies that allow pool growth.
|
||||
* @max_size: Size above which the pool will never grow.
|
||||
*/
|
||||
struct qcom_tzmem_pool_config {
|
||||
size_t initial_size;
|
||||
enum qcom_tzmem_policy policy;
|
||||
size_t increment;
|
||||
size_t max_size;
|
||||
};
|
||||
|
||||
struct qcom_tzmem_pool *
|
||||
qcom_tzmem_pool_new(const struct qcom_tzmem_pool_config *config);
|
||||
void qcom_tzmem_pool_free(struct qcom_tzmem_pool *pool);
|
||||
struct qcom_tzmem_pool *
|
||||
devm_qcom_tzmem_pool_new(struct device *dev,
|
||||
const struct qcom_tzmem_pool_config *config);
|
||||
|
||||
void *qcom_tzmem_alloc(struct qcom_tzmem_pool *pool, size_t size, gfp_t gfp);
|
||||
void qcom_tzmem_free(void *ptr);
|
||||
|
||||
DEFINE_FREE(qcom_tzmem, void *, if (_T) qcom_tzmem_free(_T))
|
||||
|
||||
phys_addr_t qcom_tzmem_to_phys(void *ptr);
|
||||
|
||||
#if IS_ENABLED(CONFIG_QCOM_TZMEM_MODE_SHMBRIDGE)
|
||||
int qcom_tzmem_shm_bridge_create(phys_addr_t paddr, size_t size, u64 *handle);
|
||||
void qcom_tzmem_shm_bridge_delete(u64 handle);
|
||||
#else
|
||||
static inline int qcom_tzmem_shm_bridge_create(phys_addr_t paddr,
|
||||
size_t size, u64 *handle)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void qcom_tzmem_shm_bridge_delete(u64 handle)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __QCOM_TZMEM */
|
||||
@@ -0,0 +1,64 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright 2020 Samsung Electronics Co., Ltd.
|
||||
* Copyright 2020 Google LLC.
|
||||
* Copyright 2024 Linaro Ltd.
|
||||
*/
|
||||
|
||||
#ifndef __EXYNOS_ACPM_PROTOCOL_H
|
||||
#define __EXYNOS_ACPM_PROTOCOL_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct acpm_handle;
|
||||
struct device_node;
|
||||
|
||||
struct acpm_dvfs_ops {
|
||||
int (*set_rate)(struct acpm_handle *handle, unsigned int acpm_chan_id,
|
||||
unsigned int clk_id, unsigned long rate);
|
||||
unsigned long (*get_rate)(struct acpm_handle *handle,
|
||||
unsigned int acpm_chan_id,
|
||||
unsigned int clk_id);
|
||||
};
|
||||
|
||||
struct acpm_pmic_ops {
|
||||
int (*read_reg)(struct acpm_handle *handle, unsigned int acpm_chan_id,
|
||||
u8 type, u8 reg, u8 chan, u8 *buf);
|
||||
int (*bulk_read)(struct acpm_handle *handle, unsigned int acpm_chan_id,
|
||||
u8 type, u8 reg, u8 chan, u8 count, u8 *buf);
|
||||
int (*write_reg)(struct acpm_handle *handle, unsigned int acpm_chan_id,
|
||||
u8 type, u8 reg, u8 chan, u8 value);
|
||||
int (*bulk_write)(struct acpm_handle *handle, unsigned int acpm_chan_id,
|
||||
u8 type, u8 reg, u8 chan, u8 count, const u8 *buf);
|
||||
int (*update_reg)(struct acpm_handle *handle, unsigned int acpm_chan_id,
|
||||
u8 type, u8 reg, u8 chan, u8 value, u8 mask);
|
||||
};
|
||||
|
||||
struct acpm_ops {
|
||||
struct acpm_dvfs_ops dvfs_ops;
|
||||
struct acpm_pmic_ops pmic_ops;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct acpm_handle - Reference to an initialized protocol instance
|
||||
* @ops:
|
||||
*/
|
||||
struct acpm_handle {
|
||||
struct acpm_ops ops;
|
||||
};
|
||||
|
||||
struct device;
|
||||
|
||||
#if IS_ENABLED(CONFIG_EXYNOS_ACPM_PROTOCOL)
|
||||
struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
|
||||
struct device_node *np);
|
||||
#else
|
||||
|
||||
static inline struct acpm_handle *devm_acpm_get_by_node(struct device *dev,
|
||||
struct device_node *np)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __EXYNOS_ACPM_PROTOCOL_H */
|
||||
@@ -0,0 +1,126 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2021 Alibaba Group Holding Limited.
|
||||
*/
|
||||
|
||||
#ifndef _THEAD_AON_H
|
||||
#define _THEAD_AON_H
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#define AON_RPC_MSG_MAGIC (0xef)
|
||||
#define TH1520_AON_RPC_VERSION 2
|
||||
#define TH1520_AON_RPC_MSG_NUM 7
|
||||
|
||||
struct th1520_aon_chan;
|
||||
|
||||
enum th1520_aon_rpc_svc {
|
||||
TH1520_AON_RPC_SVC_UNKNOWN = 0,
|
||||
TH1520_AON_RPC_SVC_PM = 1,
|
||||
TH1520_AON_RPC_SVC_MISC = 2,
|
||||
TH1520_AON_RPC_SVC_AVFS = 3,
|
||||
TH1520_AON_RPC_SVC_SYS = 4,
|
||||
TH1520_AON_RPC_SVC_WDG = 5,
|
||||
TH1520_AON_RPC_SVC_LPM = 6,
|
||||
TH1520_AON_RPC_SVC_MAX = 0x3F,
|
||||
};
|
||||
|
||||
enum th1520_aon_misc_func {
|
||||
TH1520_AON_MISC_FUNC_UNKNOWN = 0,
|
||||
TH1520_AON_MISC_FUNC_SET_CONTROL = 1,
|
||||
TH1520_AON_MISC_FUNC_GET_CONTROL = 2,
|
||||
TH1520_AON_MISC_FUNC_REGDUMP_CFG = 3,
|
||||
};
|
||||
|
||||
enum th1520_aon_wdg_func {
|
||||
TH1520_AON_WDG_FUNC_UNKNOWN = 0,
|
||||
TH1520_AON_WDG_FUNC_START = 1,
|
||||
TH1520_AON_WDG_FUNC_STOP = 2,
|
||||
TH1520_AON_WDG_FUNC_PING = 3,
|
||||
TH1520_AON_WDG_FUNC_TIMEOUTSET = 4,
|
||||
TH1520_AON_WDG_FUNC_RESTART = 5,
|
||||
TH1520_AON_WDG_FUNC_GET_STATE = 6,
|
||||
TH1520_AON_WDG_FUNC_POWER_OFF = 7,
|
||||
TH1520_AON_WDG_FUNC_AON_WDT_ON = 8,
|
||||
TH1520_AON_WDG_FUNC_AON_WDT_OFF = 9,
|
||||
};
|
||||
|
||||
enum th1520_aon_sys_func {
|
||||
TH1520_AON_SYS_FUNC_UNKNOWN = 0,
|
||||
TH1520_AON_SYS_FUNC_AON_RESERVE_MEM = 1,
|
||||
};
|
||||
|
||||
enum th1520_aon_lpm_func {
|
||||
TH1520_AON_LPM_FUNC_UNKNOWN = 0,
|
||||
TH1520_AON_LPM_FUNC_REQUIRE_STR = 1,
|
||||
TH1520_AON_LPM_FUNC_RESUME_STR = 2,
|
||||
TH1520_AON_LPM_FUNC_REQUIRE_STD = 3,
|
||||
TH1520_AON_LPM_FUNC_CPUHP = 4,
|
||||
TH1520_AON_LPM_FUNC_REGDUMP_CFG = 5,
|
||||
};
|
||||
|
||||
enum th1520_aon_pm_func {
|
||||
TH1520_AON_PM_FUNC_UNKNOWN = 0,
|
||||
TH1520_AON_PM_FUNC_SET_RESOURCE_REGULATOR = 1,
|
||||
TH1520_AON_PM_FUNC_GET_RESOURCE_REGULATOR = 2,
|
||||
TH1520_AON_PM_FUNC_SET_RESOURCE_POWER_MODE = 3,
|
||||
TH1520_AON_PM_FUNC_PWR_SET = 4,
|
||||
TH1520_AON_PM_FUNC_PWR_GET = 5,
|
||||
TH1520_AON_PM_FUNC_CHECK_FAULT = 6,
|
||||
TH1520_AON_PM_FUNC_GET_TEMPERATURE = 7,
|
||||
};
|
||||
|
||||
struct th1520_aon_rpc_msg_hdr {
|
||||
u8 ver; /* version of msg hdr */
|
||||
u8 size; /* msg size ,uinit in bytes,the size includes rpc msg header self */
|
||||
u8 svc; /* rpc main service id */
|
||||
u8 func; /* rpc sub func id of specific service, sent by caller */
|
||||
} __packed __aligned(1);
|
||||
|
||||
struct th1520_aon_rpc_ack_common {
|
||||
struct th1520_aon_rpc_msg_hdr hdr;
|
||||
u8 err_code;
|
||||
} __packed __aligned(1);
|
||||
|
||||
#define RPC_SVC_MSG_TYPE_DATA 0
|
||||
#define RPC_SVC_MSG_TYPE_ACK 1
|
||||
#define RPC_SVC_MSG_NEED_ACK 0
|
||||
#define RPC_SVC_MSG_NO_NEED_ACK 1
|
||||
|
||||
#define RPC_GET_VER(MESG) ((MESG)->ver)
|
||||
#define RPC_SET_VER(MESG, VER) ((MESG)->ver = (VER))
|
||||
#define RPC_GET_SVC_ID(MESG) ((MESG)->svc & 0x3F)
|
||||
#define RPC_SET_SVC_ID(MESG, ID) ((MESG)->svc |= 0x3F & (ID))
|
||||
#define RPC_GET_SVC_FLAG_MSG_TYPE(MESG) (((MESG)->svc & 0x80) >> 7)
|
||||
#define RPC_SET_SVC_FLAG_MSG_TYPE(MESG, TYPE) ((MESG)->svc |= (TYPE) << 7)
|
||||
#define RPC_GET_SVC_FLAG_ACK_TYPE(MESG) (((MESG)->svc & 0x40) >> 6)
|
||||
#define RPC_SET_SVC_FLAG_ACK_TYPE(MESG, ACK) ((MESG)->svc |= (ACK) << 6)
|
||||
|
||||
/*
|
||||
* Defines for SC PM Power Mode
|
||||
*/
|
||||
#define TH1520_AON_PM_PW_MODE_OFF 0 /* Power off */
|
||||
#define TH1520_AON_PM_PW_MODE_STBY 1 /* Power in standby */
|
||||
#define TH1520_AON_PM_PW_MODE_LP 2 /* Power in low-power */
|
||||
#define TH1520_AON_PM_PW_MODE_ON 3 /* Power on */
|
||||
|
||||
/*
|
||||
* Defines for AON power islands
|
||||
*/
|
||||
#define TH1520_AON_AUDIO_PD 0
|
||||
#define TH1520_AON_VDEC_PD 1
|
||||
#define TH1520_AON_NPU_PD 2
|
||||
#define TH1520_AON_VENC_PD 3
|
||||
#define TH1520_AON_GPU_PD 4
|
||||
#define TH1520_AON_DSP0_PD 5
|
||||
#define TH1520_AON_DSP1_PD 6
|
||||
|
||||
struct th1520_aon_chan *th1520_aon_init(struct device *dev);
|
||||
void th1520_aon_deinit(struct th1520_aon_chan *aon_chan);
|
||||
|
||||
int th1520_aon_call_rpc(struct th1520_aon_chan *aon_chan, void *msg);
|
||||
int th1520_aon_power_update(struct th1520_aon_chan *aon_chan, u16 rsrc,
|
||||
bool power_on);
|
||||
|
||||
#endif /* _THEAD_AON_H */
|
||||
@@ -0,0 +1,92 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
/*
|
||||
* Copyright (c) 2013, NVIDIA Corporation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Support for the Trusted Foundations secure monitor.
|
||||
*
|
||||
* Trusted Foundation comes active on some ARM consumer devices (most
|
||||
* Tegra-based devices sold on the market are concerned). Such devices can only
|
||||
* perform some basic operations, like setting the CPU reset vector, through
|
||||
* SMC calls to the secure monitor. The calls are completely specific to
|
||||
* Trusted Foundations, and do *not* follow the SMC calling convention or the
|
||||
* PSCI standard.
|
||||
*/
|
||||
|
||||
#ifndef __FIRMWARE_TRUSTED_FOUNDATIONS_H
|
||||
#define __FIRMWARE_TRUSTED_FOUNDATIONS_H
|
||||
|
||||
#include <linux/printk.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <asm/outercache.h>
|
||||
|
||||
#define TF_PM_MODE_LP0 0
|
||||
#define TF_PM_MODE_LP1 1
|
||||
#define TF_PM_MODE_LP1_NO_MC_CLK 2
|
||||
#define TF_PM_MODE_LP2 3
|
||||
#define TF_PM_MODE_LP2_NOFLUSH_L2 4
|
||||
#define TF_PM_MODE_NONE 5
|
||||
|
||||
struct trusted_foundations_platform_data {
|
||||
unsigned int version_major;
|
||||
unsigned int version_minor;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_TRUSTED_FOUNDATIONS)
|
||||
|
||||
void register_trusted_foundations(struct trusted_foundations_platform_data *pd);
|
||||
void of_register_trusted_foundations(void);
|
||||
bool trusted_foundations_registered(void);
|
||||
|
||||
#else /* CONFIG_TRUSTED_FOUNDATIONS */
|
||||
static inline void tf_dummy_write_sec(unsigned long val, unsigned int reg)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void register_trusted_foundations(
|
||||
struct trusted_foundations_platform_data *pd)
|
||||
{
|
||||
/*
|
||||
* If the system requires TF and we cannot provide it, continue booting
|
||||
* but disable features that cannot be provided.
|
||||
*/
|
||||
pr_err("No support for Trusted Foundations, continuing in degraded mode.\n");
|
||||
pr_err("Secondary processors as well as CPU PM will be disabled.\n");
|
||||
#if IS_ENABLED(CONFIG_CACHE_L2X0)
|
||||
pr_err("L2X0 cache will be kept disabled.\n");
|
||||
outer_cache.write_sec = tf_dummy_write_sec;
|
||||
#endif
|
||||
#if IS_ENABLED(CONFIG_SMP)
|
||||
setup_max_cpus = 0;
|
||||
#endif
|
||||
cpu_idle_poll_ctrl(true);
|
||||
}
|
||||
|
||||
static inline void of_register_trusted_foundations(void)
|
||||
{
|
||||
struct device_node *np = of_find_compatible_node(NULL, NULL, "tlm,trusted-foundations");
|
||||
|
||||
if (!np)
|
||||
return;
|
||||
of_node_put(np);
|
||||
/*
|
||||
* If we find the target should enable TF but does not support it,
|
||||
* fail as the system won't be able to do much anyway
|
||||
*/
|
||||
register_trusted_foundations(NULL);
|
||||
}
|
||||
|
||||
static inline bool trusted_foundations_registered(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
#endif /* CONFIG_TRUSTED_FOUNDATIONS */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,46 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Xilinx Event Management Driver
|
||||
*
|
||||
* Copyright (C) 2024, Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#ifndef _FIRMWARE_XLNX_EVENT_MANAGER_H_
|
||||
#define _FIRMWARE_XLNX_EVENT_MANAGER_H_
|
||||
|
||||
#include <linux/firmware/xlnx-zynqmp.h>
|
||||
|
||||
#define CB_MAX_PAYLOAD_SIZE (4U) /*In payload maximum 32bytes */
|
||||
|
||||
#define EVENT_SUBSYSTEM_RESTART (4U)
|
||||
|
||||
#define PM_DEV_ACPU_0_0 (0x1810c0afU)
|
||||
#define PM_DEV_ACPU_0 (0x1810c003U)
|
||||
|
||||
/************************** Exported Function *****************************/
|
||||
|
||||
typedef void (*event_cb_func_t)(const u32 *payload, void *data);
|
||||
|
||||
#if IS_REACHABLE(CONFIG_XLNX_EVENT_MANAGER)
|
||||
int xlnx_register_event(const enum pm_api_cb_id cb_type, const u32 node_id,
|
||||
const u32 event, const bool wake,
|
||||
event_cb_func_t cb_fun, void *data);
|
||||
|
||||
int xlnx_unregister_event(const enum pm_api_cb_id cb_type, const u32 node_id,
|
||||
const u32 event, event_cb_func_t cb_fun, void *data);
|
||||
#else
|
||||
static inline int xlnx_register_event(const enum pm_api_cb_id cb_type, const u32 node_id,
|
||||
const u32 event, const bool wake,
|
||||
event_cb_func_t cb_fun, void *data)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int xlnx_unregister_event(const enum pm_api_cb_id cb_type, const u32 node_id,
|
||||
const u32 event, event_cb_func_t cb_fun, void *data)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _FIRMWARE_XLNX_EVENT_MANAGER_H_ */
|
||||
@@ -0,0 +1,119 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Firmware layer for XilSECURE APIs.
|
||||
*
|
||||
* Copyright (C) 2014-2022 Xilinx, Inc.
|
||||
* Copyright (C) 2022-2025 Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#ifndef __FIRMWARE_XLNX_ZYNQMP_CRYPTO_H__
|
||||
#define __FIRMWARE_XLNX_ZYNQMP_CRYPTO_H__
|
||||
|
||||
/**
|
||||
* struct xlnx_feature - Feature data
|
||||
* @family: Family code of platform
|
||||
* @subfamily: Subfamily code of platform
|
||||
* @feature_id: Feature id of module
|
||||
* @data: Collection of all supported platform data
|
||||
*/
|
||||
struct xlnx_feature {
|
||||
u32 family;
|
||||
u32 feature_id;
|
||||
void *data;
|
||||
};
|
||||
|
||||
/* xilSecure API commands module id + api id */
|
||||
#define XSECURE_API_AES_INIT 0x509
|
||||
#define XSECURE_API_AES_OP_INIT 0x50a
|
||||
#define XSECURE_API_AES_UPDATE_AAD 0x50b
|
||||
#define XSECURE_API_AES_ENCRYPT_UPDATE 0x50c
|
||||
#define XSECURE_API_AES_ENCRYPT_FINAL 0x50d
|
||||
#define XSECURE_API_AES_DECRYPT_UPDATE 0x50e
|
||||
#define XSECURE_API_AES_DECRYPT_FINAL 0x50f
|
||||
#define XSECURE_API_AES_KEY_ZERO 0x510
|
||||
#define XSECURE_API_AES_WRITE_KEY 0x511
|
||||
|
||||
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
||||
int zynqmp_pm_aes_engine(const u64 address, u32 *out);
|
||||
int zynqmp_pm_sha_hash(const u64 address, const u32 size, const u32 flags);
|
||||
void *xlnx_get_crypto_dev_data(struct xlnx_feature *feature_map);
|
||||
int versal_pm_aes_key_write(const u32 keylen,
|
||||
const u32 keysrc, const u64 keyaddr);
|
||||
int versal_pm_aes_key_zero(const u32 keysrc);
|
||||
int versal_pm_aes_op_init(const u64 hw_req);
|
||||
int versal_pm_aes_update_aad(const u64 aad_addr, const u32 aad_len);
|
||||
int versal_pm_aes_enc_update(const u64 in_params, const u64 in_addr);
|
||||
int versal_pm_aes_dec_update(const u64 in_params, const u64 in_addr);
|
||||
int versal_pm_aes_dec_final(const u64 gcm_addr);
|
||||
int versal_pm_aes_enc_final(const u64 gcm_addr);
|
||||
int versal_pm_aes_init(void);
|
||||
|
||||
#else
|
||||
static inline int zynqmp_pm_aes_engine(const u64 address, u32 *out)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_sha_hash(const u64 address, const u32 size,
|
||||
const u32 flags)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline void *xlnx_get_crypto_dev_data(struct xlnx_feature *feature_map)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_key_write(const u32 keylen,
|
||||
const u32 keysrc, const u64 keyaddr)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_key_zero(const u32 keysrc)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_op_init(const u64 hw_req)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_update_aad(const u64 aad_addr,
|
||||
const u32 aad_len)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_enc_update(const u64 in_params,
|
||||
const u64 in_addr)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_dec_update(const u64 in_params,
|
||||
const u64 in_addr)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_enc_final(const u64 gcm_addr)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_dec_final(const u64 gcm_addr)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int versal_pm_aes_init(void)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __FIRMWARE_XLNX_ZYNQMP_CRYPTO_H__ */
|
||||
@@ -0,0 +1,38 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Firmware layer for UFS APIs.
|
||||
*
|
||||
* Copyright (c) 2025 Advanced Micro Devices, Inc.
|
||||
*/
|
||||
|
||||
#ifndef __FIRMWARE_XLNX_ZYNQMP_UFS_H__
|
||||
#define __FIRMWARE_XLNX_ZYNQMP_UFS_H__
|
||||
|
||||
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
||||
int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready);
|
||||
int zynqmp_pm_is_sram_init_done(bool *is_done);
|
||||
int zynqmp_pm_set_sram_bypass(void);
|
||||
int zynqmp_pm_get_ufs_calibration_values(u32 *val);
|
||||
#else
|
||||
static inline int zynqmp_pm_is_mphy_tx_rx_config_ready(bool *is_ready)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_is_sram_init_done(bool *is_done)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_sram_bypass(void)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_ufs_calibration_values(u32 *val)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __FIRMWARE_XLNX_ZYNQMP_UFS_H__ */
|
||||
@@ -0,0 +1,958 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Xilinx Zynq MPSoC Firmware layer
|
||||
*
|
||||
* Copyright (C) 2014-2021 Xilinx
|
||||
* Copyright (C) 2022 - 2025 Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Michal Simek <michal.simek@amd.com>
|
||||
* Davorin Mista <davorin.mista@aggios.com>
|
||||
* Jolly Shah <jollys@xilinx.com>
|
||||
* Rajan Vaja <rajanv@xilinx.com>
|
||||
*/
|
||||
|
||||
#ifndef __FIRMWARE_ZYNQMP_H__
|
||||
#define __FIRMWARE_ZYNQMP_H__
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/firmware/xlnx-zynqmp-ufs.h>
|
||||
#include <linux/firmware/xlnx-zynqmp-crypto.h>
|
||||
|
||||
#define ZYNQMP_PM_VERSION_MAJOR 1
|
||||
#define ZYNQMP_PM_VERSION_MINOR 0
|
||||
|
||||
#define ZYNQMP_PM_VERSION ((ZYNQMP_PM_VERSION_MAJOR << 16) | \
|
||||
ZYNQMP_PM_VERSION_MINOR)
|
||||
|
||||
#define ZYNQMP_TZ_VERSION_MAJOR 1
|
||||
#define ZYNQMP_TZ_VERSION_MINOR 0
|
||||
|
||||
#define ZYNQMP_TZ_VERSION ((ZYNQMP_TZ_VERSION_MAJOR << 16) | \
|
||||
ZYNQMP_TZ_VERSION_MINOR)
|
||||
|
||||
/* SMC SIP service Call Function Identifier Prefix */
|
||||
#define PM_SIP_SVC 0xC2000000
|
||||
|
||||
/* SMC function ID to get SiP SVC version */
|
||||
#define GET_SIP_SVC_VERSION (0x8200ff03U)
|
||||
|
||||
/* SiP Service Calls version numbers */
|
||||
#define SIP_SVC_VERSION_MAJOR (0U)
|
||||
#define SIP_SVC_VERSION_MINOR (2U)
|
||||
|
||||
#define SIP_SVC_PASSTHROUGH_VERSION ((SIP_SVC_VERSION_MAJOR << 16) | \
|
||||
SIP_SVC_VERSION_MINOR)
|
||||
|
||||
/* Fixed ID for FW specific APIs */
|
||||
#define PASS_THROUGH_FW_CMD_ID GENMASK(11, 0)
|
||||
|
||||
/* PM API versions */
|
||||
#define PM_API_VERSION_1 1
|
||||
#define PM_API_VERSION_2 2
|
||||
|
||||
#define PM_PINCTRL_PARAM_SET_VERSION 2
|
||||
|
||||
/* Family codes */
|
||||
#define PM_ZYNQMP_FAMILY_CODE 0x1 /* ZynqMP family code */
|
||||
#define PM_VERSAL_FAMILY_CODE 0x2 /* Versal family code */
|
||||
#define PM_VERSAL_NET_FAMILY_CODE 0x3 /* Versal NET family code */
|
||||
|
||||
#define API_ID_MASK GENMASK(7, 0)
|
||||
#define MODULE_ID_MASK GENMASK(11, 8)
|
||||
#define PLM_MODULE_ID_MASK GENMASK(15, 8)
|
||||
|
||||
/* Firmware feature check version mask */
|
||||
#define FIRMWARE_VERSION_MASK 0xFFFFU
|
||||
|
||||
/* ATF only commands */
|
||||
#define TF_A_PM_REGISTER_SGI 0xa04
|
||||
#define PM_GET_TRUSTZONE_VERSION 0xa03
|
||||
#define PM_SET_SUSPEND_MODE 0xa02
|
||||
#define GET_CALLBACK_DATA 0xa01
|
||||
|
||||
/* Number of 32bits values in payload */
|
||||
#define PAYLOAD_ARG_CNT 7U
|
||||
|
||||
/* Number of 64bits arguments for SMC call */
|
||||
#define SMC_ARG_CNT_64 8U
|
||||
|
||||
/* Number of 32bits arguments for SMC call */
|
||||
#define SMC_ARG_CNT_32 13U
|
||||
|
||||
/* Number of arguments for a callback */
|
||||
#define CB_ARG_CNT 4
|
||||
|
||||
/* Payload size (consists of callback API ID + arguments) */
|
||||
#define CB_PAYLOAD_SIZE (CB_ARG_CNT + 1)
|
||||
|
||||
#define ZYNQMP_PM_MAX_QOS 100U
|
||||
|
||||
#define GSS_NUM_REGS (4)
|
||||
|
||||
/* Node capabilities */
|
||||
#define ZYNQMP_PM_CAPABILITY_ACCESS 0x1U
|
||||
#define ZYNQMP_PM_CAPABILITY_CONTEXT 0x2U
|
||||
#define ZYNQMP_PM_CAPABILITY_WAKEUP 0x4U
|
||||
#define ZYNQMP_PM_CAPABILITY_UNUSABLE 0x8U
|
||||
|
||||
/* Loader commands */
|
||||
#define PM_LOAD_PDI 0x701
|
||||
#define PDI_SRC_DDR 0xF
|
||||
|
||||
/*
|
||||
* Firmware FPGA Manager flags
|
||||
* XILINX_ZYNQMP_PM_FPGA_FULL: FPGA full reconfiguration
|
||||
* XILINX_ZYNQMP_PM_FPGA_PARTIAL: FPGA partial reconfiguration
|
||||
*/
|
||||
#define XILINX_ZYNQMP_PM_FPGA_FULL 0x0U
|
||||
#define XILINX_ZYNQMP_PM_FPGA_PARTIAL BIT(0)
|
||||
|
||||
/* FPGA Status Reg */
|
||||
#define XILINX_ZYNQMP_PM_FPGA_CONFIG_STAT_OFFSET 7U
|
||||
#define XILINX_ZYNQMP_PM_FPGA_READ_CONFIG_REG 0U
|
||||
|
||||
/*
|
||||
* Node IDs for the Error Events.
|
||||
*/
|
||||
#define VERSAL_EVENT_ERROR_PMC_ERR1 (0x28100000U)
|
||||
#define VERSAL_EVENT_ERROR_PMC_ERR2 (0x28104000U)
|
||||
#define VERSAL_EVENT_ERROR_PSM_ERR1 (0x28108000U)
|
||||
#define VERSAL_EVENT_ERROR_PSM_ERR2 (0x2810C000U)
|
||||
|
||||
#define VERSAL_NET_EVENT_ERROR_PMC_ERR1 (0x28100000U)
|
||||
#define VERSAL_NET_EVENT_ERROR_PMC_ERR2 (0x28104000U)
|
||||
#define VERSAL_NET_EVENT_ERROR_PMC_ERR3 (0x28108000U)
|
||||
#define VERSAL_NET_EVENT_ERROR_PSM_ERR1 (0x2810C000U)
|
||||
#define VERSAL_NET_EVENT_ERROR_PSM_ERR2 (0x28110000U)
|
||||
#define VERSAL_NET_EVENT_ERROR_PSM_ERR3 (0x28114000U)
|
||||
#define VERSAL_NET_EVENT_ERROR_PSM_ERR4 (0x28118000U)
|
||||
|
||||
/* ZynqMP SD tap delay tuning */
|
||||
#define SD_ITAPDLY 0xFF180314
|
||||
#define SD_OTAPDLYSEL 0xFF180318
|
||||
|
||||
/**
|
||||
* XPM_EVENT_ERROR_MASK_DDRMC_CR: Error event mask for DDRMC MC Correctable ECC Error.
|
||||
*/
|
||||
#define XPM_EVENT_ERROR_MASK_DDRMC_CR BIT(18)
|
||||
|
||||
/**
|
||||
* XPM_EVENT_ERROR_MASK_DDRMC_NCR: Error event mask for DDRMC MC Non-Correctable ECC Error.
|
||||
*/
|
||||
#define XPM_EVENT_ERROR_MASK_DDRMC_NCR BIT(19)
|
||||
#define XPM_EVENT_ERROR_MASK_NOC_NCR BIT(13)
|
||||
#define XPM_EVENT_ERROR_MASK_NOC_CR BIT(12)
|
||||
|
||||
enum pm_module_id {
|
||||
PM_MODULE_ID = 0x0,
|
||||
XPM_MODULE_ID = 0x2,
|
||||
XSEM_MODULE_ID = 0x3,
|
||||
TF_A_MODULE_ID = 0xa,
|
||||
};
|
||||
|
||||
enum pm_api_cb_id {
|
||||
PM_INIT_SUSPEND_CB = 30,
|
||||
PM_ACKNOWLEDGE_CB = 31,
|
||||
PM_NOTIFY_CB = 32,
|
||||
};
|
||||
|
||||
enum pm_api_id {
|
||||
PM_API_FEATURES = 0,
|
||||
PM_GET_API_VERSION = 1,
|
||||
PM_GET_NODE_STATUS = 3,
|
||||
PM_REGISTER_NOTIFIER = 5,
|
||||
PM_FORCE_POWERDOWN = 8,
|
||||
PM_REQUEST_WAKEUP = 10,
|
||||
PM_SYSTEM_SHUTDOWN = 12,
|
||||
PM_REQUEST_NODE = 13,
|
||||
PM_RELEASE_NODE = 14,
|
||||
PM_SET_REQUIREMENT = 15,
|
||||
PM_RESET_ASSERT = 17,
|
||||
PM_RESET_GET_STATUS = 18,
|
||||
PM_MMIO_WRITE = 19,
|
||||
PM_MMIO_READ = 20,
|
||||
PM_PM_INIT_FINALIZE = 21,
|
||||
PM_FPGA_LOAD = 22,
|
||||
PM_FPGA_GET_STATUS = 23,
|
||||
PM_GET_CHIPID = 24,
|
||||
PM_SECURE_SHA = 26,
|
||||
PM_PINCTRL_REQUEST = 28,
|
||||
PM_PINCTRL_RELEASE = 29,
|
||||
PM_PINCTRL_SET_FUNCTION = 31,
|
||||
PM_PINCTRL_CONFIG_PARAM_GET = 32,
|
||||
PM_PINCTRL_CONFIG_PARAM_SET = 33,
|
||||
PM_IOCTL = 34,
|
||||
PM_QUERY_DATA = 35,
|
||||
PM_CLOCK_ENABLE = 36,
|
||||
PM_CLOCK_DISABLE = 37,
|
||||
PM_CLOCK_GETSTATE = 38,
|
||||
PM_CLOCK_SETDIVIDER = 39,
|
||||
PM_CLOCK_GETDIVIDER = 40,
|
||||
PM_CLOCK_SETPARENT = 43,
|
||||
PM_CLOCK_GETPARENT = 44,
|
||||
PM_FPGA_READ = 46,
|
||||
PM_SECURE_AES = 47,
|
||||
PM_EFUSE_ACCESS = 53,
|
||||
PM_FEATURE_CHECK = 63,
|
||||
};
|
||||
|
||||
/* PMU-FW return status codes */
|
||||
enum pm_ret_status {
|
||||
XST_PM_SUCCESS = 0,
|
||||
XST_PM_INVALID_VERSION = 4,
|
||||
XST_PM_NO_FEATURE = 19,
|
||||
XST_PM_INVALID_CRC = 301,
|
||||
XST_PM_INTERNAL = 2000,
|
||||
XST_PM_CONFLICT = 2001,
|
||||
XST_PM_NO_ACCESS = 2002,
|
||||
XST_PM_INVALID_NODE = 2003,
|
||||
XST_PM_DOUBLE_REQ = 2004,
|
||||
XST_PM_ABORT_SUSPEND = 2005,
|
||||
XST_PM_MULT_USER = 2008,
|
||||
};
|
||||
|
||||
enum pm_ioctl_id {
|
||||
IOCTL_GET_RPU_OPER_MODE = 0,
|
||||
IOCTL_SET_RPU_OPER_MODE = 1,
|
||||
IOCTL_RPU_BOOT_ADDR_CONFIG = 2,
|
||||
IOCTL_TCM_COMB_CONFIG = 3,
|
||||
IOCTL_SET_TAPDELAY_BYPASS = 4,
|
||||
IOCTL_SD_DLL_RESET = 6,
|
||||
IOCTL_SET_SD_TAPDELAY = 7,
|
||||
IOCTL_SET_PLL_FRAC_MODE = 8,
|
||||
IOCTL_GET_PLL_FRAC_MODE = 9,
|
||||
IOCTL_SET_PLL_FRAC_DATA = 10,
|
||||
IOCTL_GET_PLL_FRAC_DATA = 11,
|
||||
IOCTL_WRITE_GGS = 12,
|
||||
IOCTL_READ_GGS = 13,
|
||||
IOCTL_WRITE_PGGS = 14,
|
||||
IOCTL_READ_PGGS = 15,
|
||||
/* Set healthy bit value */
|
||||
IOCTL_SET_BOOT_HEALTH_STATUS = 17,
|
||||
IOCTL_OSPI_MUX_SELECT = 21,
|
||||
/* Register SGI to ATF */
|
||||
IOCTL_REGISTER_SGI = 25,
|
||||
/* Runtime feature configuration */
|
||||
IOCTL_SET_FEATURE_CONFIG = 26,
|
||||
IOCTL_GET_FEATURE_CONFIG = 27,
|
||||
/* IOCTL for Secure Read/Write Interface */
|
||||
IOCTL_READ_REG = 28,
|
||||
IOCTL_MASK_WRITE_REG = 29,
|
||||
/* Dynamic SD/GEM configuration */
|
||||
IOCTL_SET_SD_CONFIG = 30,
|
||||
IOCTL_SET_GEM_CONFIG = 31,
|
||||
/* IOCTL to get default/current QoS */
|
||||
IOCTL_GET_QOS = 34,
|
||||
};
|
||||
|
||||
enum pm_query_id {
|
||||
PM_QID_INVALID = 0,
|
||||
PM_QID_CLOCK_GET_NAME = 1,
|
||||
PM_QID_CLOCK_GET_TOPOLOGY = 2,
|
||||
PM_QID_CLOCK_GET_FIXEDFACTOR_PARAMS = 3,
|
||||
PM_QID_CLOCK_GET_PARENTS = 4,
|
||||
PM_QID_CLOCK_GET_ATTRIBUTES = 5,
|
||||
PM_QID_PINCTRL_GET_NUM_PINS = 6,
|
||||
PM_QID_PINCTRL_GET_NUM_FUNCTIONS = 7,
|
||||
PM_QID_PINCTRL_GET_NUM_FUNCTION_GROUPS = 8,
|
||||
PM_QID_PINCTRL_GET_FUNCTION_NAME = 9,
|
||||
PM_QID_PINCTRL_GET_FUNCTION_GROUPS = 10,
|
||||
PM_QID_PINCTRL_GET_PIN_GROUPS = 11,
|
||||
PM_QID_CLOCK_GET_NUM_CLOCKS = 12,
|
||||
PM_QID_CLOCK_GET_MAX_DIVISOR = 13,
|
||||
PM_QID_PINCTRL_GET_ATTRIBUTES = 15,
|
||||
};
|
||||
|
||||
enum rpu_oper_mode {
|
||||
PM_RPU_MODE_LOCKSTEP = 0,
|
||||
PM_RPU_MODE_SPLIT = 1,
|
||||
};
|
||||
|
||||
enum rpu_boot_mem {
|
||||
PM_RPU_BOOTMEM_LOVEC = 0,
|
||||
PM_RPU_BOOTMEM_HIVEC = 1,
|
||||
};
|
||||
|
||||
enum rpu_tcm_comb {
|
||||
PM_RPU_TCM_SPLIT = 0,
|
||||
PM_RPU_TCM_COMB = 1,
|
||||
};
|
||||
|
||||
enum zynqmp_pm_reset_action {
|
||||
PM_RESET_ACTION_RELEASE = 0,
|
||||
PM_RESET_ACTION_ASSERT = 1,
|
||||
PM_RESET_ACTION_PULSE = 2,
|
||||
};
|
||||
|
||||
enum zynqmp_pm_reset {
|
||||
ZYNQMP_PM_RESET_START = 1000,
|
||||
ZYNQMP_PM_RESET_PCIE_CFG = ZYNQMP_PM_RESET_START,
|
||||
ZYNQMP_PM_RESET_PCIE_BRIDGE = 1001,
|
||||
ZYNQMP_PM_RESET_PCIE_CTRL = 1002,
|
||||
ZYNQMP_PM_RESET_DP = 1003,
|
||||
ZYNQMP_PM_RESET_SWDT_CRF = 1004,
|
||||
ZYNQMP_PM_RESET_AFI_FM5 = 1005,
|
||||
ZYNQMP_PM_RESET_AFI_FM4 = 1006,
|
||||
ZYNQMP_PM_RESET_AFI_FM3 = 1007,
|
||||
ZYNQMP_PM_RESET_AFI_FM2 = 1008,
|
||||
ZYNQMP_PM_RESET_AFI_FM1 = 1009,
|
||||
ZYNQMP_PM_RESET_AFI_FM0 = 1010,
|
||||
ZYNQMP_PM_RESET_GDMA = 1011,
|
||||
ZYNQMP_PM_RESET_GPU_PP1 = 1012,
|
||||
ZYNQMP_PM_RESET_GPU_PP0 = 1013,
|
||||
ZYNQMP_PM_RESET_GPU = 1014,
|
||||
ZYNQMP_PM_RESET_GT = 1015,
|
||||
ZYNQMP_PM_RESET_SATA = 1016,
|
||||
ZYNQMP_PM_RESET_ACPU3_PWRON = 1017,
|
||||
ZYNQMP_PM_RESET_ACPU2_PWRON = 1018,
|
||||
ZYNQMP_PM_RESET_ACPU1_PWRON = 1019,
|
||||
ZYNQMP_PM_RESET_ACPU0_PWRON = 1020,
|
||||
ZYNQMP_PM_RESET_APU_L2 = 1021,
|
||||
ZYNQMP_PM_RESET_ACPU3 = 1022,
|
||||
ZYNQMP_PM_RESET_ACPU2 = 1023,
|
||||
ZYNQMP_PM_RESET_ACPU1 = 1024,
|
||||
ZYNQMP_PM_RESET_ACPU0 = 1025,
|
||||
ZYNQMP_PM_RESET_DDR = 1026,
|
||||
ZYNQMP_PM_RESET_APM_FPD = 1027,
|
||||
ZYNQMP_PM_RESET_SOFT = 1028,
|
||||
ZYNQMP_PM_RESET_GEM0 = 1029,
|
||||
ZYNQMP_PM_RESET_GEM1 = 1030,
|
||||
ZYNQMP_PM_RESET_GEM2 = 1031,
|
||||
ZYNQMP_PM_RESET_GEM3 = 1032,
|
||||
ZYNQMP_PM_RESET_QSPI = 1033,
|
||||
ZYNQMP_PM_RESET_UART0 = 1034,
|
||||
ZYNQMP_PM_RESET_UART1 = 1035,
|
||||
ZYNQMP_PM_RESET_SPI0 = 1036,
|
||||
ZYNQMP_PM_RESET_SPI1 = 1037,
|
||||
ZYNQMP_PM_RESET_SDIO0 = 1038,
|
||||
ZYNQMP_PM_RESET_SDIO1 = 1039,
|
||||
ZYNQMP_PM_RESET_CAN0 = 1040,
|
||||
ZYNQMP_PM_RESET_CAN1 = 1041,
|
||||
ZYNQMP_PM_RESET_I2C0 = 1042,
|
||||
ZYNQMP_PM_RESET_I2C1 = 1043,
|
||||
ZYNQMP_PM_RESET_TTC0 = 1044,
|
||||
ZYNQMP_PM_RESET_TTC1 = 1045,
|
||||
ZYNQMP_PM_RESET_TTC2 = 1046,
|
||||
ZYNQMP_PM_RESET_TTC3 = 1047,
|
||||
ZYNQMP_PM_RESET_SWDT_CRL = 1048,
|
||||
ZYNQMP_PM_RESET_NAND = 1049,
|
||||
ZYNQMP_PM_RESET_ADMA = 1050,
|
||||
ZYNQMP_PM_RESET_GPIO = 1051,
|
||||
ZYNQMP_PM_RESET_IOU_CC = 1052,
|
||||
ZYNQMP_PM_RESET_TIMESTAMP = 1053,
|
||||
ZYNQMP_PM_RESET_RPU_R50 = 1054,
|
||||
ZYNQMP_PM_RESET_RPU_R51 = 1055,
|
||||
ZYNQMP_PM_RESET_RPU_AMBA = 1056,
|
||||
ZYNQMP_PM_RESET_OCM = 1057,
|
||||
ZYNQMP_PM_RESET_RPU_PGE = 1058,
|
||||
ZYNQMP_PM_RESET_USB0_CORERESET = 1059,
|
||||
ZYNQMP_PM_RESET_USB1_CORERESET = 1060,
|
||||
ZYNQMP_PM_RESET_USB0_HIBERRESET = 1061,
|
||||
ZYNQMP_PM_RESET_USB1_HIBERRESET = 1062,
|
||||
ZYNQMP_PM_RESET_USB0_APB = 1063,
|
||||
ZYNQMP_PM_RESET_USB1_APB = 1064,
|
||||
ZYNQMP_PM_RESET_IPI = 1065,
|
||||
ZYNQMP_PM_RESET_APM_LPD = 1066,
|
||||
ZYNQMP_PM_RESET_RTC = 1067,
|
||||
ZYNQMP_PM_RESET_SYSMON = 1068,
|
||||
ZYNQMP_PM_RESET_AFI_FM6 = 1069,
|
||||
ZYNQMP_PM_RESET_LPD_SWDT = 1070,
|
||||
ZYNQMP_PM_RESET_FPD = 1071,
|
||||
ZYNQMP_PM_RESET_RPU_DBG1 = 1072,
|
||||
ZYNQMP_PM_RESET_RPU_DBG0 = 1073,
|
||||
ZYNQMP_PM_RESET_DBG_LPD = 1074,
|
||||
ZYNQMP_PM_RESET_DBG_FPD = 1075,
|
||||
ZYNQMP_PM_RESET_APLL = 1076,
|
||||
ZYNQMP_PM_RESET_DPLL = 1077,
|
||||
ZYNQMP_PM_RESET_VPLL = 1078,
|
||||
ZYNQMP_PM_RESET_IOPLL = 1079,
|
||||
ZYNQMP_PM_RESET_RPLL = 1080,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_0 = 1081,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_1 = 1082,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_2 = 1083,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_3 = 1084,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_4 = 1085,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_5 = 1086,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_6 = 1087,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_7 = 1088,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_8 = 1089,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_9 = 1090,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_10 = 1091,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_11 = 1092,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_12 = 1093,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_13 = 1094,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_14 = 1095,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_15 = 1096,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_16 = 1097,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_17 = 1098,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_18 = 1099,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_19 = 1100,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_20 = 1101,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_21 = 1102,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_22 = 1103,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_23 = 1104,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_24 = 1105,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_25 = 1106,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_26 = 1107,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_27 = 1108,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_28 = 1109,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_29 = 1110,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_30 = 1111,
|
||||
ZYNQMP_PM_RESET_GPO3_PL_31 = 1112,
|
||||
ZYNQMP_PM_RESET_RPU_LS = 1113,
|
||||
ZYNQMP_PM_RESET_PS_ONLY = 1114,
|
||||
ZYNQMP_PM_RESET_PL = 1115,
|
||||
ZYNQMP_PM_RESET_PS_PL0 = 1116,
|
||||
ZYNQMP_PM_RESET_PS_PL1 = 1117,
|
||||
ZYNQMP_PM_RESET_PS_PL2 = 1118,
|
||||
ZYNQMP_PM_RESET_PS_PL3 = 1119,
|
||||
ZYNQMP_PM_RESET_END = ZYNQMP_PM_RESET_PS_PL3
|
||||
};
|
||||
|
||||
enum zynqmp_pm_suspend_reason {
|
||||
SUSPEND_POWER_REQUEST = 201,
|
||||
SUSPEND_ALERT = 202,
|
||||
SUSPEND_SYSTEM_SHUTDOWN = 203,
|
||||
};
|
||||
|
||||
enum zynqmp_pm_request_ack {
|
||||
ZYNQMP_PM_REQUEST_ACK_NO = 1,
|
||||
ZYNQMP_PM_REQUEST_ACK_BLOCKING = 2,
|
||||
ZYNQMP_PM_REQUEST_ACK_NON_BLOCKING = 3,
|
||||
};
|
||||
|
||||
enum pm_node_id {
|
||||
NODE_SD_0 = 39,
|
||||
NODE_SD_1 = 40,
|
||||
};
|
||||
|
||||
enum tap_delay_type {
|
||||
PM_TAPDELAY_INPUT = 0,
|
||||
PM_TAPDELAY_OUTPUT = 1,
|
||||
};
|
||||
|
||||
enum dll_reset_type {
|
||||
PM_DLL_RESET_ASSERT = 0,
|
||||
PM_DLL_RESET_RELEASE = 1,
|
||||
PM_DLL_RESET_PULSE = 2,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_config_param {
|
||||
PM_PINCTRL_CONFIG_SLEW_RATE = 0,
|
||||
PM_PINCTRL_CONFIG_BIAS_STATUS = 1,
|
||||
PM_PINCTRL_CONFIG_PULL_CTRL = 2,
|
||||
PM_PINCTRL_CONFIG_SCHMITT_CMOS = 3,
|
||||
PM_PINCTRL_CONFIG_DRIVE_STRENGTH = 4,
|
||||
PM_PINCTRL_CONFIG_VOLTAGE_STATUS = 5,
|
||||
PM_PINCTRL_CONFIG_TRI_STATE = 6,
|
||||
PM_PINCTRL_CONFIG_MAX = 7,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_slew_rate {
|
||||
PM_PINCTRL_SLEW_RATE_FAST = 0,
|
||||
PM_PINCTRL_SLEW_RATE_SLOW = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_bias_status {
|
||||
PM_PINCTRL_BIAS_DISABLE = 0,
|
||||
PM_PINCTRL_BIAS_ENABLE = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_pull_ctrl {
|
||||
PM_PINCTRL_BIAS_PULL_DOWN = 0,
|
||||
PM_PINCTRL_BIAS_PULL_UP = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_schmitt_cmos {
|
||||
PM_PINCTRL_INPUT_TYPE_CMOS = 0,
|
||||
PM_PINCTRL_INPUT_TYPE_SCHMITT = 1,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_drive_strength {
|
||||
PM_PINCTRL_DRIVE_STRENGTH_2MA = 0,
|
||||
PM_PINCTRL_DRIVE_STRENGTH_4MA = 1,
|
||||
PM_PINCTRL_DRIVE_STRENGTH_8MA = 2,
|
||||
PM_PINCTRL_DRIVE_STRENGTH_12MA = 3,
|
||||
};
|
||||
|
||||
enum pm_pinctrl_tri_state {
|
||||
PM_PINCTRL_TRI_STATE_DISABLE = 0,
|
||||
PM_PINCTRL_TRI_STATE_ENABLE = 1,
|
||||
};
|
||||
|
||||
enum zynqmp_pm_shutdown_type {
|
||||
ZYNQMP_PM_SHUTDOWN_TYPE_SHUTDOWN = 0,
|
||||
ZYNQMP_PM_SHUTDOWN_TYPE_RESET = 1,
|
||||
ZYNQMP_PM_SHUTDOWN_TYPE_SETSCOPE_ONLY = 2,
|
||||
};
|
||||
|
||||
enum zynqmp_pm_shutdown_subtype {
|
||||
ZYNQMP_PM_SHUTDOWN_SUBTYPE_SUBSYSTEM = 0,
|
||||
ZYNQMP_PM_SHUTDOWN_SUBTYPE_PS_ONLY = 1,
|
||||
ZYNQMP_PM_SHUTDOWN_SUBTYPE_SYSTEM = 2,
|
||||
};
|
||||
|
||||
enum tap_delay_signal_type {
|
||||
PM_TAPDELAY_NAND_DQS_IN = 0,
|
||||
PM_TAPDELAY_NAND_DQS_OUT = 1,
|
||||
PM_TAPDELAY_QSPI = 2,
|
||||
PM_TAPDELAY_MAX = 3,
|
||||
};
|
||||
|
||||
enum tap_delay_bypass_ctrl {
|
||||
PM_TAPDELAY_BYPASS_DISABLE = 0,
|
||||
PM_TAPDELAY_BYPASS_ENABLE = 1,
|
||||
};
|
||||
|
||||
enum ospi_mux_select_type {
|
||||
PM_OSPI_MUX_SEL_DMA = 0,
|
||||
PM_OSPI_MUX_SEL_LINEAR = 1,
|
||||
};
|
||||
|
||||
enum pm_feature_config_id {
|
||||
PM_FEATURE_INVALID = 0,
|
||||
PM_FEATURE_OVERTEMP_STATUS = 1,
|
||||
PM_FEATURE_OVERTEMP_VALUE = 2,
|
||||
PM_FEATURE_EXTWDT_STATUS = 3,
|
||||
PM_FEATURE_EXTWDT_VALUE = 4,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum pm_sd_config_type - PM SD configuration.
|
||||
* @SD_CONFIG_EMMC_SEL: To set SD_EMMC_SEL in CTRL_REG_SD and SD_SLOTTYPE
|
||||
* @SD_CONFIG_BASECLK: To set SD_BASECLK in SD_CONFIG_REG1
|
||||
* @SD_CONFIG_8BIT: To set SD_8BIT in SD_CONFIG_REG2
|
||||
* @SD_CONFIG_FIXED: To set fixed config registers
|
||||
*/
|
||||
enum pm_sd_config_type {
|
||||
SD_CONFIG_EMMC_SEL = 1,
|
||||
SD_CONFIG_BASECLK = 2,
|
||||
SD_CONFIG_8BIT = 3,
|
||||
SD_CONFIG_FIXED = 4,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum pm_gem_config_type - PM GEM configuration.
|
||||
* @GEM_CONFIG_SGMII_MODE: To set GEM_SGMII_MODE in GEM_CLK_CTRL register
|
||||
* @GEM_CONFIG_FIXED: To set fixed config registers
|
||||
*/
|
||||
enum pm_gem_config_type {
|
||||
GEM_CONFIG_SGMII_MODE = 1,
|
||||
GEM_CONFIG_FIXED = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct zynqmp_pm_query_data - PM query data
|
||||
* @qid: query ID
|
||||
* @arg1: Argument 1 of query data
|
||||
* @arg2: Argument 2 of query data
|
||||
* @arg3: Argument 3 of query data
|
||||
*/
|
||||
struct zynqmp_pm_query_data {
|
||||
u32 qid;
|
||||
u32 arg1;
|
||||
u32 arg2;
|
||||
u32 arg3;
|
||||
};
|
||||
|
||||
int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 *ret_payload, u32 num_args, ...);
|
||||
int zynqmp_pm_invoke_fw_fn(u32 pm_api_id, u32 *ret_payload, u32 num_args, ...);
|
||||
|
||||
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
||||
int zynqmp_pm_get_api_version(u32 *version);
|
||||
int zynqmp_pm_get_chipid(u32 *idcode, u32 *version);
|
||||
int zynqmp_pm_get_family_info(u32 *family);
|
||||
int zynqmp_pm_query_data(struct zynqmp_pm_query_data qdata, u32 *out);
|
||||
int zynqmp_pm_clock_enable(u32 clock_id);
|
||||
int zynqmp_pm_clock_disable(u32 clock_id);
|
||||
int zynqmp_pm_clock_getstate(u32 clock_id, u32 *state);
|
||||
int zynqmp_pm_clock_setdivider(u32 clock_id, u32 divider);
|
||||
int zynqmp_pm_clock_getdivider(u32 clock_id, u32 *divider);
|
||||
int zynqmp_pm_clock_setparent(u32 clock_id, u32 parent_id);
|
||||
int zynqmp_pm_clock_getparent(u32 clock_id, u32 *parent_id);
|
||||
int zynqmp_pm_set_pll_frac_mode(u32 clk_id, u32 mode);
|
||||
int zynqmp_pm_get_pll_frac_mode(u32 clk_id, u32 *mode);
|
||||
int zynqmp_pm_set_pll_frac_data(u32 clk_id, u32 data);
|
||||
int zynqmp_pm_get_pll_frac_data(u32 clk_id, u32 *data);
|
||||
int zynqmp_pm_set_sd_tapdelay(u32 node_id, u32 type, u32 value);
|
||||
int zynqmp_pm_sd_dll_reset(u32 node_id, u32 type);
|
||||
int zynqmp_pm_ospi_mux_select(u32 dev_id, u32 select);
|
||||
int zynqmp_pm_reset_assert(const u32 reset,
|
||||
const enum zynqmp_pm_reset_action assert_flag);
|
||||
int zynqmp_pm_reset_get_status(const u32 reset, u32 *status);
|
||||
unsigned int zynqmp_pm_bootmode_read(u32 *ps_mode);
|
||||
int zynqmp_pm_bootmode_write(u32 ps_mode);
|
||||
int zynqmp_pm_set_suspend_mode(u32 mode);
|
||||
int zynqmp_pm_request_node(const u32 node, const u32 capabilities,
|
||||
const u32 qos, const enum zynqmp_pm_request_ack ack);
|
||||
int zynqmp_pm_release_node(const u32 node);
|
||||
int zynqmp_pm_set_requirement(const u32 node, const u32 capabilities,
|
||||
const u32 qos,
|
||||
const enum zynqmp_pm_request_ack ack);
|
||||
int zynqmp_pm_efuse_access(const u64 address, u32 *out);
|
||||
int zynqmp_pm_fpga_load(const u64 address, const u32 size, const u32 flags);
|
||||
int zynqmp_pm_fpga_get_status(u32 *value);
|
||||
int zynqmp_pm_fpga_get_config_status(u32 *value);
|
||||
int zynqmp_pm_write_ggs(u32 index, u32 value);
|
||||
int zynqmp_pm_read_ggs(u32 index, u32 *value);
|
||||
int zynqmp_pm_write_pggs(u32 index, u32 value);
|
||||
int zynqmp_pm_read_pggs(u32 index, u32 *value);
|
||||
int zynqmp_pm_set_tapdelay_bypass(u32 index, u32 value);
|
||||
int zynqmp_pm_system_shutdown(const u32 type, const u32 subtype);
|
||||
int zynqmp_pm_set_boot_health_status(u32 value);
|
||||
int zynqmp_pm_pinctrl_request(const u32 pin);
|
||||
int zynqmp_pm_pinctrl_release(const u32 pin);
|
||||
int zynqmp_pm_pinctrl_set_function(const u32 pin, const u32 id);
|
||||
int zynqmp_pm_pinctrl_get_config(const u32 pin, const u32 param,
|
||||
u32 *value);
|
||||
int zynqmp_pm_pinctrl_set_config(const u32 pin, const u32 param,
|
||||
u32 value);
|
||||
int zynqmp_pm_load_pdi(const u32 src, const u64 address);
|
||||
int zynqmp_pm_register_notifier(const u32 node, const u32 event,
|
||||
const u32 wake, const u32 enable);
|
||||
int zynqmp_pm_feature(const u32 api_id);
|
||||
int zynqmp_pm_is_function_supported(const u32 api_id, const u32 id);
|
||||
int zynqmp_pm_set_feature_config(enum pm_feature_config_id id, u32 value);
|
||||
int zynqmp_pm_get_feature_config(enum pm_feature_config_id id, u32 *payload);
|
||||
int zynqmp_pm_sec_read_reg(u32 node_id, u32 offset, u32 *ret_value);
|
||||
int zynqmp_pm_sec_mask_write_reg(const u32 node_id, const u32 offset,
|
||||
u32 mask, u32 value);
|
||||
int zynqmp_pm_register_sgi(u32 sgi_num, u32 reset);
|
||||
int zynqmp_pm_force_pwrdwn(const u32 target,
|
||||
const enum zynqmp_pm_request_ack ack);
|
||||
int zynqmp_pm_request_wake(const u32 node,
|
||||
const bool set_addr,
|
||||
const u64 address,
|
||||
const enum zynqmp_pm_request_ack ack);
|
||||
int zynqmp_pm_get_rpu_mode(u32 node_id, enum rpu_oper_mode *rpu_mode);
|
||||
int zynqmp_pm_set_rpu_mode(u32 node_id, enum rpu_oper_mode rpu_mode);
|
||||
int zynqmp_pm_set_tcm_config(u32 node_id, enum rpu_tcm_comb tcm_mode);
|
||||
int zynqmp_pm_get_node_status(const u32 node, u32 *const status,
|
||||
u32 *const requirements, u32 *const usage);
|
||||
int zynqmp_pm_set_sd_config(u32 node, enum pm_sd_config_type config, u32 value);
|
||||
int zynqmp_pm_set_gem_config(u32 node, enum pm_gem_config_type config,
|
||||
u32 value);
|
||||
#else
|
||||
static inline int zynqmp_pm_get_api_version(u32 *version)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_chipid(u32 *idcode, u32 *version)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_family_info(u32 *family)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_query_data(struct zynqmp_pm_query_data qdata,
|
||||
u32 *out)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_enable(u32 clock_id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_disable(u32 clock_id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_getstate(u32 clock_id, u32 *state)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_setdivider(u32 clock_id, u32 divider)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_getdivider(u32 clock_id, u32 *divider)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_setparent(u32 clock_id, u32 parent_id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_clock_getparent(u32 clock_id, u32 *parent_id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_pll_frac_mode(u32 clk_id, u32 mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_pll_frac_mode(u32 clk_id, u32 *mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_pll_frac_data(u32 clk_id, u32 data)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_pll_frac_data(u32 clk_id, u32 *data)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_sd_tapdelay(u32 node_id, u32 type, u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_sd_dll_reset(u32 node_id, u32 type)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_ospi_mux_select(u32 dev_id, u32 select)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_reset_assert(const u32 reset,
|
||||
const enum zynqmp_pm_reset_action assert_flag)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_reset_get_status(const u32 reset, u32 *status)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline unsigned int zynqmp_pm_bootmode_read(u32 *ps_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_bootmode_write(u32 ps_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_suspend_mode(u32 mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_request_node(const u32 node, const u32 capabilities,
|
||||
const u32 qos,
|
||||
const enum zynqmp_pm_request_ack ack)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_release_node(const u32 node)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_requirement(const u32 node,
|
||||
const u32 capabilities,
|
||||
const u32 qos,
|
||||
const enum zynqmp_pm_request_ack ack)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_efuse_access(const u64 address, u32 *out)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_fpga_load(const u64 address, const u32 size,
|
||||
const u32 flags)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_fpga_get_status(u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_fpga_get_config_status(u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_write_ggs(u32 index, u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_read_ggs(u32 index, u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_write_pggs(u32 index, u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_read_pggs(u32 index, u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_tapdelay_bypass(u32 index, u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_system_shutdown(const u32 type, const u32 subtype)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_boot_health_status(u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_request(const u32 pin)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_release(const u32 pin)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_is_function_supported(const u32 api_id, const u32 id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_set_function(const u32 pin, const u32 id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_get_config(const u32 pin, const u32 param,
|
||||
u32 *value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_pinctrl_set_config(const u32 pin, const u32 param,
|
||||
u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_load_pdi(const u32 src, const u64 address)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_register_notifier(const u32 node, const u32 event,
|
||||
const u32 wake, const u32 enable)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_feature(const u32 api_id)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_feature_config(enum pm_feature_config_id id,
|
||||
u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_feature_config(enum pm_feature_config_id id,
|
||||
u32 *payload)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_register_sgi(u32 sgi_num, u32 reset)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_force_pwrdwn(const u32 target,
|
||||
const enum zynqmp_pm_request_ack ack)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_request_wake(const u32 node,
|
||||
const bool set_addr,
|
||||
const u64 address,
|
||||
const enum zynqmp_pm_request_ack ack)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_sec_read_reg(u32 node_id, u32 offset, u32 *ret_value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_sec_mask_write_reg(const u32 node_id, const u32 offset,
|
||||
u32 mask, u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_rpu_mode(u32 node_id, enum rpu_oper_mode *rpu_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_rpu_mode(u32 node_id, enum rpu_oper_mode rpu_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_tcm_config(u32 node_id, enum rpu_tcm_comb tcm_mode)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_get_node_status(const u32 node, u32 *const status,
|
||||
u32 *const requirements,
|
||||
u32 *const usage)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_sd_config(u32 node,
|
||||
enum pm_sd_config_type config,
|
||||
u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_set_gem_config(u32 node,
|
||||
enum pm_gem_config_type config,
|
||||
u32 value)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif /* __FIRMWARE_ZYNQMP_H__ */
|
||||
Reference in New Issue
Block a user