You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
862 lines
18 KiB
862 lines
18 KiB
/* Copyright (c) 2022 Intel Corporation |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#ifndef INTEL_COMM_WIDGET_H |
|
#define INTEL_COMM_WIDGET_H |
|
|
|
#include <zephyr/cache.h> |
|
#include <zephyr/kernel.h> |
|
|
|
#define CW_DT_NODE DT_NODELABEL(ace_comm_widget) |
|
#define CW_BASE DT_REG_ADDR(CW_DT_NODE) |
|
|
|
/* |
|
* @brief DSP Communication Widget for Intel ADSP |
|
* |
|
* These registers control the DSP Communication Widget for generic sideband message transmit / |
|
* receive. |
|
*/ |
|
|
|
/* |
|
* Downstream Attributes |
|
* Attribute register for downstream message. |
|
*/ |
|
#define DSATTR 0x00 |
|
|
|
/* |
|
* Destination Port ID |
|
* type: RO/V, rst: 00h |
|
* |
|
* Destination Port ID received in message. |
|
*/ |
|
#define DSATTR_DSTPID GENMASK(7, 0) |
|
|
|
/* |
|
* Source Port ID |
|
* type: RO/V, rst: 00h |
|
* |
|
* Source Port ID received in message. |
|
*/ |
|
#define DSATTR_SRCPID GENMASK(15, 8) |
|
|
|
/* |
|
* Opcode |
|
* type: RO/V, rst: 00h |
|
* |
|
* Opcode received in message. |
|
*/ |
|
#define DSATTR_OPC GENMASK(23, 16) |
|
|
|
/* |
|
* Byte Enable |
|
* type: RO/V, rst: 0h |
|
* |
|
* Byte enables received in message. |
|
*/ |
|
#define DSATTR_BE GENMASK(27, 24) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0h |
|
*/ |
|
#define DSATTR_RSVD31 GENMASK(31, 28) |
|
|
|
|
|
/* |
|
* Downstream Lower Address |
|
* Address register (lower 32 bits) for downstream message. |
|
* |
|
* type: RO/V, rst: 0000 0000h |
|
* |
|
* LSB 32 address bits received in message. Bits 32:16 of the LSB address only |
|
* valid when DSUADDR.ADDRLEN bit is set to 1. |
|
*/ |
|
#define DSLADDR 0x04 |
|
|
|
|
|
/* |
|
* Downstream Upper Address |
|
* Address register (upper 32 bits) for downstream message. |
|
*/ |
|
#define DSUADDR 0x08 |
|
|
|
/* |
|
* Upper Address |
|
* type: RO/V, rst: 0000h |
|
* |
|
* MSB 16 address bits received in message. Valid only when ADDRLEN bit is set to 1. |
|
*/ |
|
#define DSUADDR_UADDR GENMASK(15, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0000h |
|
*/ |
|
#define DSUADDR_RSVD30 GENMASK(30, 16) |
|
|
|
/* |
|
* Address Length |
|
* type: RO/V, rst: 0b |
|
* |
|
* Address length indication received in message. |
|
* 0: 16-bit address |
|
* 1: 48-bit address |
|
*/ |
|
#define DSUADDR_ADDRLEN BIT(31) |
|
|
|
|
|
/* |
|
* Downstream SAI |
|
* Extended header (SAI / RS) register for downstream message. |
|
*/ |
|
#define DSSAI 0x0C |
|
|
|
/* |
|
* SAI |
|
* type: RO/V, rst: 0000h |
|
* |
|
* SAI received in message. Valid if EHP bit set to 1. |
|
*/ |
|
#define DSSAI_SAI GENMASK(15, 0) |
|
|
|
/* |
|
* Root Space |
|
* type: RO/V, rst: 0h |
|
* |
|
* Root space received in message. Valid if EHP bit set to 1. |
|
*/ |
|
#define DSSAI_RS GENMASK(19, 16) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000h |
|
*/ |
|
#define DSSAI_RSVD30 GENMASK(30, 20) |
|
|
|
/* |
|
* Extended Header Present |
|
* type: RO/V, rst: 0b |
|
* |
|
* Extended header present indication received in message. When set to 1 indicates |
|
* extended header is present, and RS / SAI fields are valid. |
|
*/ |
|
#define DSSAI_EHP BIT(31) |
|
|
|
|
|
/* |
|
* Downstream Data |
|
* Receive data register for downstream message. |
|
* |
|
* type: RO/V, rst: 0000 0000h |
|
* |
|
* Data received in message. |
|
*/ |
|
#define DSDATA 0x10 |
|
|
|
|
|
/* |
|
* Downstream Control & Status |
|
* Control & status register for downstream message. |
|
*/ |
|
#define DSCTLSTS 0x14 |
|
|
|
/* |
|
* Transaction Type |
|
* type: RO/V, rst: 00b |
|
* |
|
* Indicates type of transaction received as follows: |
|
* 01: Posted message |
|
* 10: Non-posted message |
|
* 11: Completion message. |
|
*/ |
|
#define DSCTLSTS_TRANTYP GENMASK(1, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000 0000h |
|
*/ |
|
#define DSCTLSTS_RSVD29 GENMASK(29, 2) |
|
|
|
/* |
|
* Interrupt GENMASK |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* Interrupt GENMASK register for message received interrupt. When set to 1 interrupt |
|
* is not generated to DSP Core. GENMASK does not affect interrupt status bit. |
|
*/ |
|
#define DSCTLSTS_IM BIT(30) |
|
|
|
/* |
|
* Message Received |
|
* type: RO/V, rst: 0b |
|
* |
|
* Message received interrupt status register. Set by HW when message is received, |
|
* and cleared by HW when FW writes to upstream completion control register |
|
* indicating completion is available. |
|
*/ |
|
#define DSCTLSTS_MSGRCV BIT(31) |
|
|
|
|
|
/* |
|
* Downstream Source Port ID |
|
* Source port ID register for ACE IP. |
|
*/ |
|
#define ACESRCPID 0x18 |
|
|
|
/* |
|
* Source Port ID |
|
* type: RO/V, rst: ACE_SRCID |
|
* |
|
* Source Port ID of ACE IP. Default value is hardcoded to parameter ACE_SRCID. |
|
*/ |
|
#define ACESRCPID_SRCPID GENMASK(7, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 00 0000h |
|
*/ |
|
#define ACESRCPID_RSVD31 GENMASK(31, 8) |
|
|
|
|
|
/* |
|
* Downstream Completion Data |
|
* |
|
* type: RO/V, rst: 0000 0000h |
|
* |
|
* Completion data received for upstream non-posted read. |
|
*/ |
|
#define DSCPDATA 0x20 |
|
|
|
|
|
/* |
|
* Downstream Completion SAI |
|
* |
|
* type: RO/V, rst: 0000 0000h |
|
* |
|
* Completion SAI received for upstream non-posted message. |
|
*/ |
|
#define DSCPSAI 0x24 |
|
|
|
|
|
/* |
|
* Downstream Completion Control & Status |
|
*/ |
|
#define DSCPCTLSTS 0x28 |
|
|
|
/* |
|
* Completion Status |
|
* type: RO/V, rst: 0b |
|
* |
|
* Completion status received for upstream non-posted message |
|
* 000: Successful Completion (SC) |
|
* 001: Unsupported Request (UR). |
|
*/ |
|
#define DSCPCTLSTS_CPSTS GENMASK(2, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0b |
|
*/ |
|
#define DSCPCTLSTS_RSVD7 GENMASK(7, 3) |
|
|
|
/* |
|
* Completion Extended Header Present |
|
* type: RO/V, rst: 0b |
|
* |
|
* Completion EH present indication received for upstream non-posted message. |
|
*/ |
|
#define DSCPCTLSTS_CPEHP BIT(8) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 00 0000h |
|
*/ |
|
#define DSCPCTLSTS_RSVD29 GENMASK(29, 9) |
|
|
|
/* |
|
* Interrupt GENMASK |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* Interrupt GENMASK register for completion received interrupt. When set to 1 |
|
* interrupt is not generated to DSP Core. GENMASK does not affect interrupt status |
|
* bit. |
|
*/ |
|
#define DSCPCTLSTS_IM BIT(30) |
|
|
|
/* |
|
* Completion Received |
|
* type: RW/1C, rst: 0b, rst domain: gHSTRST |
|
* |
|
* Completion received status register. Set by HW when completion is received, and |
|
* cleared by FW when writing 1 to it. |
|
*/ |
|
#define DSCPCTLSTS_CPRCV BIT(31) |
|
|
|
|
|
/* |
|
* Upstream Status |
|
* Status register for upstream message. |
|
*/ |
|
#define USSTS 0x40 |
|
|
|
/* |
|
* State Machine Status |
|
* type: RO/V, rst: 0b |
|
* |
|
* 0: The Endpoint Status Machine is idle |
|
* 1: The Endpoint State Machine is busy |
|
* This is OR of posted SM and non-posted SM busy signals. |
|
*/ |
|
#define USSTS_SMSTS BIT(0) |
|
|
|
/* |
|
* Message Sent |
|
* type: RW/1C, rst: 0b, rst domain: gHSTRST |
|
* |
|
* Upstream message sent interrupt status. Set by HW when upstream message has been |
|
* sent out, and cleared by FW when writing 1 to it. |
|
*/ |
|
#define USSTS_MSGSENT BIT(1) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0000 0000h |
|
*/ |
|
#define USSTS_RSVD31 GENMASK(31, 2) |
|
|
|
|
|
/* |
|
* Upstream Command |
|
* Command register for upstream message. |
|
*/ |
|
#define USCMD 0x44 |
|
|
|
/* |
|
* Send Sideband Transaction |
|
* type: WO, rst: 0b |
|
* |
|
* DSP FW writes a 1 to this bit to cause an IOSF SB Transaction. The type of |
|
* transaction is determined by Bit 1 in this register. This bit will always be |
|
* read as 0 but FW can write it to 1 to start the upstream transaction. In that way |
|
* it won't be readable as 1 after writing to. The write to this bit is ignored by |
|
* hardware if opcode is 0x20 - 0x2F. |
|
*/ |
|
#define USCMD_SSBTRAN BIT(0) |
|
|
|
/* |
|
* Transaction Type |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* 0: Transaction will be a Write |
|
* 1: Transaction will be a Read |
|
* For posted message this register bit value will be ignored and hardcoded to 0 in |
|
* the actual message as reads cannot be posted. |
|
*/ |
|
#define USCMD_TRANTYP BIT(1) |
|
|
|
/* |
|
* Message Type |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* 0: Transaction will be non-posted |
|
* 1: Transaction will be posted |
|
*/ |
|
#define USCMD_MSGTYP BIT(2) |
|
|
|
/* |
|
* Interrupt Enable |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* Interrupt enable register for message sent interrupt. When cleared to 0 interrupt |
|
* is not generated to DSP Core. Enable does not affect interrupt status bit. |
|
*/ |
|
#define USCMD_IE BIT(3) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000 0000h |
|
*/ |
|
#define USCMD_RSVD31 GENMASK(31, 4) |
|
|
|
|
|
/* |
|
* Upstream Lower Address |
|
* Address register (lower 32 bits) for upstream message. |
|
* |
|
* type: RW, rst: 0000 0000h, rst domain: gHSTRST |
|
* |
|
* LSB 32 address bits for message to be sent. Bits 32:16 of the LSB address only |
|
* valid when USUADDR.ADDRLEN bit is set to 1. |
|
*/ |
|
#define USLADDR 0x48 |
|
|
|
|
|
/* |
|
* Upstream Upper Address |
|
* Address register (upper 32 bits) for upstream message. |
|
*/ |
|
#define USUADDR 0x4C |
|
|
|
/* |
|
* Upper Address |
|
* type: RW, rst: 0000h, rst domain: gHSTRST |
|
* |
|
* MSB 16 address bits for message to be sent. Valid only when ADDRLEN bit is set |
|
* to 1. |
|
*/ |
|
#define USUADDR_UADDR GENMASK(15, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0000h |
|
*/ |
|
#define USUADDR_RSVD30 GENMASK(30, 16) |
|
|
|
/* |
|
* Address Length |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* Address length indication for message to be sent. |
|
* 0: 16-bit address |
|
* 1: 48-bit address |
|
* For simple message / message with data, this field will carry the MISC[3] of the |
|
* IOSF 1.2 message format. |
|
*/ |
|
#define USUADDR_ADDRLEN BIT(31) |
|
|
|
|
|
/* |
|
* Upstream Data |
|
* Transmit data register for upstream message. |
|
* |
|
* type: RW, rst: 0000 0000h, rst domain: gHSTRST |
|
* |
|
* Data for message to be sent. |
|
*/ |
|
#define USDATA 0x50 |
|
|
|
|
|
/* |
|
* Upstream Attributes |
|
* Attribute register for upstream message. |
|
*/ |
|
#define USATTR 0x54 |
|
|
|
/* |
|
* Destination Port ID |
|
* type: RW, rst: 00h, rst domain: gHSTRST |
|
* |
|
* Destination ID for message to be sent. |
|
*/ |
|
#define USATTR_DSTPID GENMASK(7, 0) |
|
|
|
/* |
|
* Opcode |
|
* type: RW, rst: 00h, rst domain: gHSTRST |
|
* |
|
* Opcode for message to be sent. |
|
*/ |
|
#define USATTR_OPC GENMASK(15, 8) |
|
|
|
/* |
|
* Byte Enable |
|
* type: RW, rst: 0h, rst domain: gHSTRST |
|
* |
|
* Byte enables for message to be sent. |
|
*/ |
|
#define USATTR_BE GENMASK(19, 16) |
|
|
|
/* |
|
* Base Address Register |
|
* type: RW, rst: 0h, rst domain: gHSTRST |
|
* |
|
* BAR for register access to be sent. For simple message / message with data, this |
|
* field will carry the MISC[2:0] of the IOSF 1.2 message format. Note: MSB of this |
|
* register field is not used given the IOSF Sideband message BAR field is ONLY 3 |
|
* bits wide; and MISC[3] of the IOSF 1.2 message format is supplied by |
|
* USUADDR.ADDRLEN. |
|
*/ |
|
#define USATTR_BAR GENMASK(23, 20) |
|
|
|
/* |
|
* Function ID |
|
* type: RW, rst: 00h, rst domain: gHSTRST |
|
* |
|
* Function ID for register access to be sent. |
|
*/ |
|
#define USATTR_FID GENMASK(31, 24) |
|
|
|
|
|
/* |
|
* Upstream SAI |
|
* Extended header (SAI / RS) register for upstream message. |
|
*/ |
|
#define USSAI 0x58 |
|
|
|
/* |
|
* SAI |
|
* type: RO, rst: DSPISAI_2SB |
|
* |
|
* SAI for message to be sent, if EHP bit set to 1. Reset value is hardcoded to |
|
* parameter DSPISAI_2SB. |
|
*/ |
|
#define USSAI_SAI GENMASK(7, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 00h |
|
*/ |
|
#define USSAI_RSVD15 GENMASK(15, 8) |
|
|
|
/* |
|
* Root Space |
|
* type: RW, rst: 0h, rst domain: gHSTRST |
|
* |
|
* Root space for message to be sent, if EHP bit set to 1. |
|
*/ |
|
#define USSAI_RS GENMASK(19, 16) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000h |
|
*/ |
|
#define USSAI_RSVD30 GENMASK(30, 20) |
|
|
|
/* |
|
* Extended Header Present |
|
* type: RO, rst: 1b |
|
* |
|
* Extended header present indication for message to be sent. When set to 1 |
|
* indicates extended header is present. Currently tied to 1 in RTL as ACE IP |
|
* supports only EH=1 transactions. |
|
*/ |
|
#define USSAI_EHP BIT(31) |
|
|
|
|
|
/* |
|
* Upstream Completion Data |
|
* |
|
* type: RW, rst: 0000 0000h, rst domain: gHSTRST |
|
* |
|
* Completion data to be sent for downstream non-posted read. |
|
*/ |
|
#define USCPDATA 0x5C |
|
|
|
|
|
/* |
|
* Upstream Completion Control & Status |
|
*/ |
|
#define USCPCTLSTS 0x60 |
|
|
|
/* |
|
* Completion Status |
|
* type: RW, rst: 0h, rst domain: gHSTRST |
|
* |
|
* Completion status to be sent for downstream non-posted message. |
|
* 000: Successful Completion (SC) |
|
* 001: Unsupported Request (UR). |
|
*/ |
|
#define USCPCTLSTS_CPSTS GENMASK(2, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000 0000h |
|
*/ |
|
#define USCPCTLSTS_RSVD30 GENMASK(30, 3) |
|
|
|
/* |
|
* Sideband Completion |
|
* type: RW/1S, rst: 0h, rst domain: gHSTRST |
|
* |
|
* Completion for downstream request handling. DSP FW writes a 1 to this bit to |
|
* indicate downstream message received is consumed. This internally causes an IOSF |
|
* SB completion transaction if original downstream request is non-posted. If |
|
* original message is posted then upstream completion is not generated by HW. This |
|
* bit is cleared by HW. |
|
*/ |
|
#define USCPCTLSTS_SBCP BIT(31) |
|
|
|
|
|
/* |
|
* Upstream completion SAI |
|
*/ |
|
#define USCPSAI 0x64 |
|
|
|
/* |
|
* SAI |
|
* type: RO, rst: DSPISAI_2SB |
|
* |
|
* Completion SAI to be sent for downstream non-posted message. Reset value is |
|
* hardcoded to parameter DSPISAI_2SB. |
|
*/ |
|
#define USCPSAI_CPSAI GENMASK(7, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 00h |
|
*/ |
|
#define USCPSAI_RSVD15 GENMASK(15, 8) |
|
|
|
/* |
|
* Spare 1 |
|
* type: RW, rst: 0h, rst domain: gHSTRST |
|
* |
|
* 4 Spare bits. |
|
*/ |
|
#define USCPSAI_SPARE1 GENMASK(19, 16) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000h |
|
*/ |
|
#define USCPSAI_RSVD30 GENMASK(30, 20) |
|
|
|
/* |
|
* Spare 0 |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* 1 Spare bit. |
|
*/ |
|
#define USCPSAI_SPARE0 BIT(31) |
|
|
|
|
|
/* |
|
* SAI Width |
|
*/ |
|
#define SAIWDTH 0x68 |
|
|
|
/* |
|
* SAI Width |
|
* type: RO, rst: SAI_WIDTH |
|
* |
|
* Specifies the SAI width value. |
|
* 0-based value. |
|
*/ |
|
#define SAIWDTH_SAIWDTH GENMASK(3, 0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 000 0000h |
|
*/ |
|
#define SAIWDTH_RSVD31 GENMASK(31, 4) |
|
|
|
|
|
/* |
|
* Side Clock Gate |
|
* Sideband clock gating enable register. |
|
*/ |
|
#define SCLKG 0x6C |
|
|
|
/* |
|
* Local Clock Gate |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* 0: Clk is un-gated |
|
* 1: Clk is gated |
|
* Implementation Note: Local clock gating is not implemented as there are only ~10 |
|
* flops in the design. |
|
*/ |
|
#define SCLKG_LCG BIT(0) |
|
|
|
/* |
|
* Trunk Clock Gate |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* 0: Clk request enabled |
|
* 1: Clk is gated |
|
* Implementation Note: This FW managed TCG bit is not used as HW has been improved |
|
* to support trunk clock gating based on FSM operation. |
|
*/ |
|
#define SCLKG_TCG BIT(1) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0000 0000h |
|
*/ |
|
#define SCLKG_RSVD31 GENMASK(31, 2) |
|
|
|
|
|
/* |
|
* Downstream Data 2 |
|
* Receive data (second DW) register for downstream message. |
|
* |
|
* type: RW, rst: 0000 0000h, rst domain: gHSTRST |
|
* |
|
* Data received in message. Second DW, if valid. |
|
*/ |
|
#define DSDATA2 0x74 |
|
|
|
|
|
/* |
|
* Downstream Access Enable |
|
* |
|
* Note: boot prep handling is an artifact of re-using the component from ISH. There is no usage |
|
* model in ACE IP to support any boot prep message handling by FW. |
|
*/ |
|
#define DSACCEN 0x80 |
|
|
|
/* |
|
* Access Enable |
|
* type: RW, rst: 0b, rst domain: gHSTRST |
|
* |
|
* This bit is set by DSP FW to enable SBEP HW to accept downstream cycles from |
|
* Sideband peer agents (as well as access control policy owner for survivability). |
|
* NOTE: If a BOOTPREP message is received, DSP FW is interrupted unconditionally, |
|
* i.e. irrespective of this bit being 1 or 0. |
|
*/ |
|
#define DSACCEN_ACCEN BIT(0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0000 0000h |
|
*/ |
|
#define DSACCEN_RSVD31 GENMASK(31, 1) |
|
|
|
|
|
/* |
|
* Boot Prep Control |
|
* Boot prep message control register. |
|
* Note: boot prep handling is an artifact of re-using the component from ISH. There is no usage |
|
* model in ACE IP to support any boot prep message handling by FW. |
|
*/ |
|
#define BPCTL 0x84 |
|
|
|
/* |
|
* type: RW/1C, rst: 0b, rst domain: gHSTRST |
|
* Boot Prep Received Status |
|
* |
|
* This bit is set by SBEP HW upon the reception of BOOTPREP message. DSP FW is |
|
* required to clear this status bit by writing a 0 to the bit, upon issuing |
|
* BOOTPREPACK message on the upstream path of SBEP HW. SBEP HW will clear this bit, |
|
* upon auto ack'ing of BOOTPREP due to timeout condition. |
|
*/ |
|
#define BPCTL_BPRCVSTS BIT(0) |
|
|
|
/* |
|
* Reserved |
|
* type: RO, rst: 0000 0000h |
|
*/ |
|
#define BPCTL_RSVD31 GENMASK(31, 1) |
|
|
|
|
|
#define CW_TRANSACTION_NONPOSTED 0 |
|
#define CW_TRANSACTION_POSTED 1 |
|
|
|
#define CW_TRANSACTION_WRITE 0 |
|
#define CW_TRANSACTION_READ 1 |
|
|
|
/* |
|
* @brief Check the endpoint state machine is idle |
|
* |
|
* @retval false The Endpoint State Machine is busy |
|
* @retval true The Endpoint State Machine is idle |
|
*/ |
|
static inline bool cw_upstream_ready(void) |
|
{ |
|
uint32_t status = sys_read32(CW_BASE + USSTS); |
|
|
|
status &= ~USSTS_SMSTS; |
|
sys_write32(status, CW_BASE + USSTS); |
|
return !(sys_read32(CW_BASE + USSTS) & USSTS_SMSTS); |
|
} |
|
|
|
/* |
|
* @brief Configure attributes of upstream message |
|
* |
|
* @param dest Destination Port ID for message to be sent. |
|
* @param func Function ID for register access to be sent. |
|
* @param opcode Opcode for message to be sent. |
|
* @param be Byte enables for message to be sent. |
|
* @param bar Base Address Register for register access to be sent. |
|
*/ |
|
static inline void cw_upstream_set_attr(uint32_t dest, uint32_t func, uint32_t opcode, |
|
uint32_t be, uint32_t bar) |
|
{ |
|
uint32_t attr = FIELD_PREP(USATTR_DSTPID, dest) | FIELD_PREP(USATTR_FID, func) | |
|
FIELD_PREP(USATTR_OPC, opcode) | FIELD_PREP(USATTR_BE, be) | |
|
FIELD_PREP(USATTR_BAR, bar); |
|
sys_write32(attr, CW_BASE + USATTR); |
|
} |
|
|
|
/* |
|
* @brief Set 16bit address for upstream message. |
|
* |
|
* @param address Address for message to be sent. |
|
*/ |
|
static inline void cw_upstream_set_address16(uint16_t address) |
|
{ |
|
sys_write32(address, CW_BASE + USLADDR); |
|
sys_write32(0, CW_BASE + USUADDR); |
|
} |
|
|
|
/* |
|
* @brief Set transmit data for upstream message. |
|
* |
|
* @param data Data for message to be sent. |
|
*/ |
|
static inline void cw_upstream_set_data(uint32_t data) |
|
{ |
|
sys_write32(data, CW_BASE + USDATA); |
|
} |
|
|
|
/* |
|
* @brief Interrupt enable / disable for message sent interrupt. |
|
* |
|
* @param enable Interrupt state |
|
*/ |
|
static inline void cw_upstream_enable_sent_intr(bool enable) |
|
{ |
|
uint32_t cmd = sys_read32(CW_BASE + USCMD); |
|
|
|
if (enable) |
|
cmd |= USCMD_IE; |
|
else |
|
cmd &= ~USCMD_IE; |
|
|
|
sys_write32(cmd, CW_BASE + USCMD); |
|
} |
|
|
|
/* |
|
* @brief Write posted message. |
|
*/ |
|
static inline void cw_upstream_do_pw(void) |
|
{ |
|
uint32_t cmd = sys_read32(CW_BASE + USCMD); |
|
|
|
cmd &= ~(USCMD_MSGTYP | USCMD_TRANTYP); |
|
cmd |= FIELD_PREP(USCMD_MSGTYP, CW_TRANSACTION_POSTED) | |
|
FIELD_PREP(USCMD_TRANTYP, CW_TRANSACTION_WRITE) | |
|
USCMD_SSBTRAN; |
|
|
|
sys_write32(cmd, CW_BASE + USCMD); |
|
} |
|
|
|
/* |
|
* @brief Clear message send interrupt status |
|
*/ |
|
static inline void cw_upstream_clear_msgsent(void) |
|
{ |
|
uint32_t sts = sys_read32(CW_BASE + USSTS); |
|
|
|
sts |= USSTS_MSGSENT; |
|
sys_write32(sts, CW_BASE + USSTS); |
|
} |
|
|
|
/* |
|
* @brief Wait for message to be send. |
|
*/ |
|
static inline void cw_upstream_wait_for_sent(void) |
|
{ |
|
WAIT_FOR(sys_read32(CW_BASE + USSTS) & USSTS_MSGSENT, 100, k_busy_wait(1)); |
|
|
|
cw_upstream_clear_msgsent(); |
|
} |
|
|
|
/* |
|
* @brief Write a sideband message. |
|
*/ |
|
void cw_sb_write(uint32_t dest, uint32_t func, uint16_t address, uint32_t data); |
|
|
|
|
|
#endif /* INTEL_COMM_WIDGET_H */
|
|
|