root/sound/x86/intel_hdmi_lpe_audio.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  *   intel_hdmi_lpe_audio.h - Intel HDMI LPE audio driver
   4  *
   5  *  Copyright (C) 2016 Intel Corp
   6  *  Authors:    Sailaja Bandarupalli <sailaja.bandarupalli@intel.com>
   7  *              Ramesh Babu K V <ramesh.babu@intel.com>
   8  *              Vaibhav Agarwal <vaibhav.agarwal@intel.com>
   9  *              Jerome Anand <jerome.anand@intel.com>
  10  *              Aravind Siddappaji <aravindx.siddappaji@intel.com>
  11  *  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  12  *
  13  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  14  */
  15 #ifndef __INTEL_HDMI_LPE_AUDIO_H
  16 #define __INTEL_HDMI_LPE_AUDIO_H
  17 
  18 #define HAD_MIN_CHANNEL         2
  19 #define HAD_MAX_CHANNEL         8
  20 #define HAD_NUM_OF_RING_BUFS    4
  21 
  22 /* max 20bit address, aligned to 64 */
  23 #define HAD_MAX_BUFFER          ((1024 * 1024 - 1) & ~0x3f)
  24 #define HAD_DEFAULT_BUFFER      (600 * 1024) /* default prealloc size */
  25 #define HAD_MAX_PERIODS         256     /* arbitrary, but should suffice */
  26 #define HAD_MIN_PERIODS         1
  27 #define HAD_MAX_PERIOD_BYTES    ((HAD_MAX_BUFFER / HAD_MIN_PERIODS) & ~0x3f)
  28 #define HAD_MIN_PERIOD_BYTES    1024    /* might be smaller */
  29 #define HAD_FIFO_SIZE           0 /* fifo not being used */
  30 #define MAX_SPEAKERS            8
  31 
  32 #define AUD_SAMPLE_RATE_32      32000
  33 #define AUD_SAMPLE_RATE_44_1    44100
  34 #define AUD_SAMPLE_RATE_48      48000
  35 #define AUD_SAMPLE_RATE_88_2    88200
  36 #define AUD_SAMPLE_RATE_96      96000
  37 #define AUD_SAMPLE_RATE_176_4   176400
  38 #define AUD_SAMPLE_RATE_192     192000
  39 
  40 #define HAD_MIN_RATE            AUD_SAMPLE_RATE_32
  41 #define HAD_MAX_RATE            AUD_SAMPLE_RATE_192
  42 
  43 #define DIS_SAMPLE_RATE_25_2    25200
  44 #define DIS_SAMPLE_RATE_27      27000
  45 #define DIS_SAMPLE_RATE_54      54000
  46 #define DIS_SAMPLE_RATE_74_25   74250
  47 #define DIS_SAMPLE_RATE_148_5   148500
  48 #define HAD_REG_WIDTH           0x08
  49 #define HAD_MAX_DIP_WORDS               16
  50 
  51 /* DP Link Rates */
  52 #define DP_2_7_GHZ                      270000
  53 #define DP_1_62_GHZ                     162000
  54 
  55 /* Maud Values */
  56 #define AUD_SAMPLE_RATE_32_DP_2_7_MAUD_VAL              1988
  57 #define AUD_SAMPLE_RATE_44_1_DP_2_7_MAUD_VAL            2740
  58 #define AUD_SAMPLE_RATE_48_DP_2_7_MAUD_VAL              2982
  59 #define AUD_SAMPLE_RATE_88_2_DP_2_7_MAUD_VAL            5480
  60 #define AUD_SAMPLE_RATE_96_DP_2_7_MAUD_VAL              5965
  61 #define AUD_SAMPLE_RATE_176_4_DP_2_7_MAUD_VAL           10961
  62 #define HAD_MAX_RATE_DP_2_7_MAUD_VAL                    11930
  63 #define AUD_SAMPLE_RATE_32_DP_1_62_MAUD_VAL             3314
  64 #define AUD_SAMPLE_RATE_44_1_DP_1_62_MAUD_VAL           4567
  65 #define AUD_SAMPLE_RATE_48_DP_1_62_MAUD_VAL             4971
  66 #define AUD_SAMPLE_RATE_88_2_DP_1_62_MAUD_VAL           9134
  67 #define AUD_SAMPLE_RATE_96_DP_1_62_MAUD_VAL             9942
  68 #define AUD_SAMPLE_RATE_176_4_DP_1_62_MAUD_VAL          18268
  69 #define HAD_MAX_RATE_DP_1_62_MAUD_VAL                   19884
  70 
  71 /* Naud Value */
  72 #define DP_NAUD_VAL                                     32768
  73 
  74 /* HDMI Controller register offsets - audio domain common */
  75 /* Base address for below regs = 0x65000 */
  76 enum hdmi_ctrl_reg_offset_common {
  77         AUDIO_HDMI_CONFIG_A = 0x000,
  78         AUDIO_HDMI_CONFIG_B = 0x800,
  79         AUDIO_HDMI_CONFIG_C = 0x900,
  80 };
  81 /* HDMI controller register offsets */
  82 enum hdmi_ctrl_reg_offset {
  83         AUD_CONFIG              = 0x0,
  84         AUD_CH_STATUS_0         = 0x08,
  85         AUD_CH_STATUS_1         = 0x0C,
  86         AUD_HDMI_CTS            = 0x10,
  87         AUD_N_ENABLE            = 0x14,
  88         AUD_SAMPLE_RATE         = 0x18,
  89         AUD_BUF_CONFIG          = 0x20,
  90         AUD_BUF_CH_SWAP         = 0x24,
  91         AUD_BUF_A_ADDR          = 0x40,
  92         AUD_BUF_A_LENGTH        = 0x44,
  93         AUD_BUF_B_ADDR          = 0x48,
  94         AUD_BUF_B_LENGTH        = 0x4c,
  95         AUD_BUF_C_ADDR          = 0x50,
  96         AUD_BUF_C_LENGTH        = 0x54,
  97         AUD_BUF_D_ADDR          = 0x58,
  98         AUD_BUF_D_LENGTH        = 0x5c,
  99         AUD_CNTL_ST             = 0x60,
 100         AUD_HDMI_STATUS         = 0x64, /* v2 */
 101         AUD_HDMIW_INFOFR        = 0x68, /* v2 */
 102 };
 103 
 104 /* Audio configuration */
 105 union aud_cfg {
 106         struct {
 107                 u32 aud_en:1;
 108                 u32 layout:1;           /* LAYOUT[01], see below */
 109                 u32 fmt:2;
 110                 u32 num_ch:3;
 111                 u32 set:1;
 112                 u32 flat:1;
 113                 u32 val_bit:1;
 114                 u32 user_bit:1;
 115                 u32 underrun:1;         /* 0: send null packets,
 116                                          * 1: send silence stream
 117                                          */
 118                 u32 packet_mode:1;      /* 0: 32bit container, 1: 16bit */
 119                 u32 left_align:1;       /* 0: MSB bits 0-23, 1: bits 8-31 */
 120                 u32 bogus_sample:1;     /* bogus sample for odd channels */
 121                 u32 dp_modei:1;         /* 0: HDMI, 1: DP */
 122                 u32 rsvd:16;
 123         } regx;
 124         u32 regval;
 125 };
 126 
 127 #define AUD_CONFIG_VALID_BIT                    (1 << 9)
 128 #define AUD_CONFIG_DP_MODE                      (1 << 15)
 129 #define AUD_CONFIG_CH_MASK      0x70
 130 #define LAYOUT0                 0               /* interleaved stereo */
 131 #define LAYOUT1                 1               /* for channels > 2 */
 132 
 133 /* Audio Channel Status 0 Attributes */
 134 union aud_ch_status_0 {
 135         struct {
 136                 u32 ch_status:1;
 137                 u32 lpcm_id:1;
 138                 u32 cp_info:1;
 139                 u32 format:3;
 140                 u32 mode:2;
 141                 u32 ctg_code:8;
 142                 u32 src_num:4;
 143                 u32 ch_num:4;
 144                 u32 samp_freq:4;        /* CH_STATUS_MAP_XXX */
 145                 u32 clk_acc:2;
 146                 u32 rsvd:2;
 147         } regx;
 148         u32 regval;
 149 };
 150 
 151 /* samp_freq values - Sampling rate as per IEC60958 Ver 3 */
 152 #define CH_STATUS_MAP_32KHZ     0x3
 153 #define CH_STATUS_MAP_44KHZ     0x0
 154 #define CH_STATUS_MAP_48KHZ     0x2
 155 #define CH_STATUS_MAP_88KHZ     0x8
 156 #define CH_STATUS_MAP_96KHZ     0xA
 157 #define CH_STATUS_MAP_176KHZ    0xC
 158 #define CH_STATUS_MAP_192KHZ    0xE
 159 
 160 /* Audio Channel Status 1 Attributes */
 161 union aud_ch_status_1 {
 162         struct {
 163                 u32 max_wrd_len:1;
 164                 u32 wrd_len:3;
 165                 u32 rsvd:28;
 166         } regx;
 167         u32 regval;
 168 };
 169 
 170 #define MAX_SMPL_WIDTH_20       0x0
 171 #define MAX_SMPL_WIDTH_24       0x1
 172 #define SMPL_WIDTH_16BITS       0x1
 173 #define SMPL_WIDTH_24BITS       0x5
 174 
 175 /* CTS register */
 176 union aud_hdmi_cts {
 177         struct {
 178                 u32 cts_val:24;
 179                 u32 en_cts_prog:1;
 180                 u32 rsvd:7;
 181         } regx;
 182         u32 regval;
 183 };
 184 
 185 /* N register */
 186 union aud_hdmi_n_enable {
 187         struct {
 188                 u32 n_val:24;
 189                 u32 en_n_prog:1;
 190                 u32 rsvd:7;
 191         } regx;
 192         u32 regval;
 193 };
 194 
 195 /* Audio Buffer configurations */
 196 union aud_buf_config {
 197         struct {
 198                 u32 audio_fifo_watermark:8;
 199                 u32 dma_fifo_watermark:3;
 200                 u32 rsvd0:5;
 201                 u32 aud_delay:8;
 202                 u32 rsvd1:8;
 203         } regx;
 204         u32 regval;
 205 };
 206 
 207 #define FIFO_THRESHOLD          0xFE
 208 #define DMA_FIFO_THRESHOLD      0x7
 209 
 210 /* Audio Sample Swapping offset */
 211 union aud_buf_ch_swap {
 212         struct {
 213                 u32 first_0:3;
 214                 u32 second_0:3;
 215                 u32 first_1:3;
 216                 u32 second_1:3;
 217                 u32 first_2:3;
 218                 u32 second_2:3;
 219                 u32 first_3:3;
 220                 u32 second_3:3;
 221                 u32 rsvd:8;
 222         } regx;
 223         u32 regval;
 224 };
 225 
 226 #define SWAP_LFE_CENTER         0x00fac4c8      /* octal 76543210 */
 227 
 228 /* Address for Audio Buffer */
 229 union aud_buf_addr {
 230         struct {
 231                 u32 valid:1;
 232                 u32 intr_en:1;
 233                 u32 rsvd:4;
 234                 u32 addr:26;
 235         } regx;
 236         u32 regval;
 237 };
 238 
 239 #define AUD_BUF_VALID           (1U << 0)
 240 #define AUD_BUF_INTR_EN         (1U << 1)
 241 
 242 /* Length of Audio Buffer */
 243 union aud_buf_len {
 244         struct {
 245                 u32 buf_len:20;
 246                 u32 rsvd:12;
 247         } regx;
 248         u32 regval;
 249 };
 250 
 251 /* Audio Control State Register offset */
 252 union aud_ctrl_st {
 253         struct {
 254                 u32 ram_addr:4;
 255                 u32 eld_ack:1;
 256                 u32 eld_addr:4;
 257                 u32 eld_buf_size:5;
 258                 u32 eld_valid:1;
 259                 u32 cp_ready:1;
 260                 u32 dip_freq:2;
 261                 u32 dip_idx:3;
 262                 u32 dip_en_sta:4;
 263                 u32 rsvd:7;
 264         } regx;
 265         u32 regval;
 266 };
 267 
 268 /* Audio HDMI Widget Data Island Packet offset */
 269 union aud_info_frame1 {
 270         struct {
 271                 u32 pkt_type:8;
 272                 u32 ver_num:8;
 273                 u32 len:5;
 274                 u32 rsvd:11;
 275         } regx;
 276         u32 regval;
 277 };
 278 
 279 #define HDMI_INFO_FRAME_WORD1   0x000a0184
 280 #define DP_INFO_FRAME_WORD1     0x00441b84
 281 
 282 /* DIP frame 2 */
 283 union aud_info_frame2 {
 284         struct {
 285                 u32 chksum:8;
 286                 u32 chnl_cnt:3;
 287                 u32 rsvd0:1;
 288                 u32 coding_type:4;
 289                 u32 smpl_size:2;
 290                 u32 smpl_freq:3;
 291                 u32 rsvd1:3;
 292                 u32 format:8;
 293         } regx;
 294         u32 regval;
 295 };
 296 
 297 /* DIP frame 3 */
 298 union aud_info_frame3 {
 299         struct {
 300                 u32 chnl_alloc:8;
 301                 u32 rsvd0:3;
 302                 u32 lsv:4;
 303                 u32 dm_inh:1;
 304                 u32 rsvd1:16;
 305         } regx;
 306         u32 regval;
 307 };
 308 
 309 #define VALID_DIP_WORDS         3
 310 
 311 /* AUD_HDMI_STATUS bits */
 312 #define HDMI_AUDIO_UNDERRUN             (1U << 31)
 313 #define HDMI_AUDIO_BUFFER_DONE          (1U << 29)
 314 
 315 /* AUD_HDMI_STATUS register mask */
 316 #define AUD_HDMI_STATUS_MASK_UNDERRUN   0xC0000000
 317 #define AUD_HDMI_STATUS_MASK_SRDBG      0x00000002
 318 #define AUD_HDMI_STATUSG_MASK_FUNCRST   0x00000001
 319 
 320 #endif

/* [<][>][^][v][top][bottom][index][help] */