/* SPDX-License-Identifier: GPL-2.0 */
/*
* Thunderbolt driver - NHI registers
*
* Copyright ( c ) 2014 Andreas Noever < andreas . noever @ gmail . com >
* Copyright ( C ) 2018 , Intel Corporation
*/
#ifndef NHI_REGS_H_
#define NHI_REGS_H_
#include <linux/types.h>
enum ring_flags {
RING_FLAG_ISOCH_ENABLE = 1 << 27 , /* TX only? */
RING_FLAG_E2E_FLOW_CONTROL = 1 << 28 ,
RING_FLAG_PCI_NO_SNOOP = 1 << 29 ,
RING_FLAG_RAW = 1 << 30 , /* ignore EOF/SOF mask, include checksum */
RING_FLAG_ENABLE = 1 << 31 ,
};
/**
* struct ring_desc - TX / RX ring entry
*
* For TX set length / eof / sof .
* For RX length / eof / sof are set by the NHI .
*/
struct ring_desc {
u64 phys;
u32 length:12 ;
u32 eof:4 ;
u32 sof:4 ;
enum ring_desc_flags flags:12 ;
u32 time; /* write zero */
} __packed;
/* NHI registers in bar 0 */
/*
* 16 bytes per entry , one entry for every hop ( REG_CAPS )
* 00 : physical pointer to an array of struct ring_desc
* 08 : ring tail ( set by NHI )
* 10 : ring head ( index of first non posted descriptor )
* 12 : descriptor count
*/
#define REG_TX_RING_BASE 0 x00000
/*
* 16 bytes per entry , one entry for every hop ( REG_CAPS )
* 00 : physical pointer to an array of struct ring_desc
* 08 : ring head ( index of first not posted descriptor )
* 10 : ring tail ( set by NHI )
* 12 : descriptor count
* 14 : max frame sizes ( anything larger than 0 x100 has no effect )
*/
#define REG_RX_RING_BASE 0 x08000
/*
* 32 bytes per entry , one entry for every hop ( REG_CAPS )
* 00 : enum_ring_flags
* 04 : isoch time stamp ? ? ( write 0 )
* . . : unknown
*/
#define REG_TX_OPTIONS_BASE 0 x19800
/*
* 32 bytes per entry , one entry for every hop ( REG_CAPS )
* 00 : enum ring_flags
* If RING_FLAG_E2E_FLOW_CONTROL is set then bits 13 - 23 must be set to
* the corresponding TX hop id .
* 04 : EOF / SOF mask ( ignored for RING_FLAG_RAW rings )
* . . : unknown
*/
#define REG_RX_OPTIONS_BASE 0 x29800
#define REG_RX_OPTIONS_E2E_HOP_MASK GENMASK(22 , 12 )
#define REG_RX_OPTIONS_E2E_HOP_SHIFT 12
/*
* three bitfields : tx , rx , rx overflow
* Every bitfield contains one bit for every hop ( REG_CAPS ) .
* New interrupts are fired only after ALL registers have been
* read ( even those containing only disabled rings ) .
*/
#define REG_RING_NOTIFY_BASE 0 x37800
#define RING_NOTIFY_REG_COUNT(nhi) ((31 + 3 * nhi->hop_count) / 32 )
#define REG_RING_INT_CLEAR 0 x37808
/*
* two bitfields : rx , tx
* Both bitfields contains one bit for every hop ( REG_CAPS ) . To
* enable / disable interrupts set / clear the corresponding bits .
*/
#define REG_RING_INTERRUPT_BASE 0 x38200
#define RING_INTERRUPT_REG_COUNT(nhi) ((31 + 2 * nhi->hop_count) / 32 )
#define REG_RING_INTERRUPT_MASK_CLEAR_BASE 0 x38208
#define REG_INT_THROTTLING_RATE 0 x38c00
/* Interrupt Vector Allocation */
#define REG_INT_VEC_ALLOC_BASE 0 x38c40
#define REG_INT_VEC_ALLOC_BITS 4
#define REG_INT_VEC_ALLOC_MASK GENMASK(3 , 0 )
#define REG_INT_VEC_ALLOC_REGS (32 / REG_INT_VEC_ALLOC_BITS)
/* The last 11 bits contain the number of hops supported by the NHI port. */
#define REG_CAPS 0 x39640
#define REG_CAPS_VERSION_MASK GENMASK(23 , 16 )
#define REG_CAPS_VERSION_2 0 x40
#define REG_DMA_MISC 0 x39864
#define REG_DMA_MISC_INT_AUTO_CLEAR BIT(2 )
#define REG_DMA_MISC_DISABLE_AUTO_CLEAR BIT(17 )
#define REG_RESET 0 x39898
#define REG_RESET_HRR BIT(0 )
#define REG_INMAIL_DATA 0 x39900
#define REG_INMAIL_CMD 0 x39904
#define REG_INMAIL_CMD_MASK GENMASK(7 , 0 )
#define REG_INMAIL_ERROR BIT(30 )
#define REG_INMAIL_OP_REQUEST BIT(31 )
#define REG_OUTMAIL_CMD 0 x3990c
#define REG_OUTMAIL_CMD_OPMODE_SHIFT 8
#define REG_OUTMAIL_CMD_OPMODE_MASK GENMASK(11 , 8 )
#define REG_FW_STS 0 x39944
#define REG_FW_STS_NVM_AUTH_DONE BIT(31 )
#define REG_FW_STS_CIO_RESET_REQ BIT(30 )
#define REG_FW_STS_ICM_EN_CPU BIT(2 )
#define REG_FW_STS_ICM_EN_INVERT BIT(1 )
#define REG_FW_STS_ICM_EN BIT(0 )
/* ICL NHI VSEC registers */
/* FW ready */
#define VS_CAP_9 0 xc8
#define VS_CAP_9_FW_READY BIT(31 )
/* UUID */
#define VS_CAP_10 0 xcc
#define VS_CAP_11 0 xd0
/* LTR */
#define VS_CAP_15 0 xe0
#define VS_CAP_16 0 xe4
/* TBT2PCIe */
#define VS_CAP_18 0 xec
#define VS_CAP_18_DONE BIT(0 )
/* PCIe2TBT */
#define VS_CAP_19 0 xf0
#define VS_CAP_19_VALID BIT(0 )
#define VS_CAP_19_CMD_SHIFT 1
#define VS_CAP_19_CMD_MASK GENMASK(7 , 1 )
/* Force power */
#define VS_CAP_22 0 xfc
#define VS_CAP_22_FORCE_POWER BIT(1 )
#define VS_CAP_22_DMA_DELAY_MASK GENMASK(31 , 24 )
#define VS_CAP_22_DMA_DELAY_SHIFT 24
/**
* enum icl_lc_mailbox_cmd - ICL specific LC mailbox commands
* @ ICL_LC_GO2SX : Ask LC to enter Sx without wake
* @ ICL_LC_GO2SX_NO_WAKE : Ask LC to enter Sx with wake
* @ ICL_LC_PREPARE_FOR_RESET : Prepare LC for reset
*/
enum icl_lc_mailbox_cmd {
ICL_LC_GO2SX = 0 x02,
ICL_LC_GO2SX_NO_WAKE = 0 x03,
ICL_LC_PREPARE_FOR_RESET = 0 x21,
};
#endif
Messung V0.5 in Prozent C=93 H=99 G=95
¤ Dauer der Verarbeitung: 0.15 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland