1 /* SPDX-License-Identifier: GPL-2.0 */
7 /* DEBI transfer mode defs */
9 #define DEBINOSWAP 0x000e0000
10 #define DEBISWAB 0x001e0000
11 #define DEBISWAP 0x002e0000
13 #define ARM_WAIT_FREE (HZ)
14 #define ARM_WAIT_SHAKE (HZ/5)
15 #define ARM_WAIT_OSD (HZ)
20 BOOTSTATE_BUFFER_EMPTY
= 0,
21 BOOTSTATE_BUFFER_FULL
= 1,
22 BOOTSTATE_AV7110_BOOT_COMPLETE
= 2
25 enum av7110_type_rec_play_format
34 enum av7110_osd_palette_type
36 NoPalet
= 0, /* No palette */
37 Pal1Bit
= 2, /* 2 colors for 1 Bit Palette */
38 Pal2Bit
= 4, /* 4 colors for 2 bit palette */
39 Pal4Bit
= 16, /* 16 colors for 4 bit palette */
40 Pal8Bit
= 256 /* 256 colors for 16 bit palette */
45 #define SB_OFF SAA7146_GPIO_OUTLO /* SlowBlank off (TV-Mode) */
46 #define SB_ON SAA7146_GPIO_INPUT /* SlowBlank on (AV-Mode) */
47 #define SB_WIDE SAA7146_GPIO_OUTHI /* SlowBlank 6V (16/9-Mode) (not implemented) */
50 #define FB_OFF SAA7146_GPIO_LO /* FastBlank off (CVBS-Mode) */
51 #define FB_ON SAA7146_GPIO_OUTHI /* FastBlank on (RGB-Mode) */
52 #define FB_LOOP SAA7146_GPIO_INPUT /* FastBlank loop-through (PC graphics ???) */
54 enum av7110_video_output_mode
56 NO_OUT
= 0, /* disable analog output */
62 /* firmware internal msg q status: */
63 #define GPMQFull 0x0001 /* Main Message Queue Full */
64 #define GPMQOver 0x0002 /* Main Message Queue Overflow */
65 #define HPQFull 0x0004 /* High Priority Msg Queue Full */
66 #define HPQOver 0x0008
67 #define OSDQFull 0x0010 /* OSD Queue Full */
68 #define OSDQOver 0x0020
69 #define GPMQBusy 0x0040 /* Queue not empty, FW >= 261d */
70 #define HPQBusy 0x0080
71 #define OSDQBusy 0x0100
73 /* hw section filter flags */
74 #define SECTION_EIT 0x01
75 #define SECTION_SINGLE 0x00
76 #define SECTION_CYCLE 0x02
77 #define SECTION_CONTINUOS 0x04
78 #define SECTION_MODE 0x06
79 #define SECTION_IPMPE 0x0C /* size up to 4k */
80 #define SECTION_HIGH_SPEED 0x1C /* larger buffer */
81 #define DATA_PIPING_FLAG 0x20 /* for Data Piping Filter */
83 #define PBUFSIZE_NONE 0x0000
84 #define PBUFSIZE_1P 0x0100
85 #define PBUFSIZE_2P 0x0200
86 #define PBUFSIZE_1K 0x0300
87 #define PBUFSIZE_2K 0x0400
88 #define PBUFSIZE_4K 0x0500
89 #define PBUFSIZE_8K 0x0600
90 #define PBUFSIZE_16K 0x0700
91 #define PBUFSIZE_32K 0x0800
94 /* firmware command codes */
95 enum av7110_osd_command
{
119 enum av7110_pid_command
{
135 enum av7110_mpeg_command
{
139 enum av7110_audio_command
{
151 enum av7110_request_command
{
165 enum av7110_encoder_command
{
175 enum av7110_rec_play_state
{
186 enum av7110_fw_cmd_misc
{
187 AV7110_FW_VIDEO_ZOOM
= 1,
188 AV7110_FW_VIDEO_COMMAND
,
189 AV7110_FW_AUDIO_COMMAND
192 enum av7110_command_type
{
213 #define VID_NONE_PREF 0x00 /* No aspect ration processing preferred */
214 #define VID_PAN_SCAN_PREF 0x01 /* Pan and Scan Display preferred */
215 #define VID_VERT_COMP_PREF 0x02 /* Vertical compression display preferred */
216 #define VID_VC_AND_PS_PREF 0x03 /* PanScan and vertical Compression if allowed */
217 #define VID_CENTRE_CUT_PREF 0x05 /* PanScan with zero vector */
219 /* MPEG video decoder commands */
220 #define AV_VIDEO_CMD_STOP 0x000e
221 #define AV_VIDEO_CMD_PLAY 0x000d
222 #define AV_VIDEO_CMD_FREEZE 0x0102
223 #define AV_VIDEO_CMD_FFWD 0x0016
224 #define AV_VIDEO_CMD_SLOW 0x0022
226 /* MPEG audio decoder commands */
227 #define AUDIO_CMD_MUTE 0x0001
228 #define AUDIO_CMD_UNMUTE 0x0002
229 #define AUDIO_CMD_PCM16 0x0010
230 #define AUDIO_CMD_STEREO 0x0080
231 #define AUDIO_CMD_MONO_L 0x0100
232 #define AUDIO_CMD_MONO_R 0x0200
233 #define AUDIO_CMD_SYNC_OFF 0x000e
234 #define AUDIO_CMD_SYNC_ON 0x000f
236 /* firmware data interface codes */
237 #define DATA_NONE 0x00
238 #define DATA_FSECTION 0x01
239 #define DATA_IPMPE 0x02
240 #define DATA_MPEG_RECORD 0x03
241 #define DATA_DEBUG_MESSAGE 0x04
242 #define DATA_COMMON_INTERFACE 0x05
243 #define DATA_MPEG_PLAY 0x06
244 #define DATA_BMP_LOAD 0x07
245 #define DATA_IRCOMMAND 0x08
246 #define DATA_PIPING 0x09
247 #define DATA_STREAMING 0x0a
248 #define DATA_CI_GET 0x0b
249 #define DATA_CI_PUT 0x0c
250 #define DATA_MPEG_VIDEO_EVENT 0x0d
252 #define DATA_PES_RECORD 0x10
253 #define DATA_PES_PLAY 0x11
254 #define DATA_TS_RECORD 0x12
255 #define DATA_TS_PLAY 0x13
257 /* ancient CI command codes, only two are actually still used
258 * by the link level CI firmware */
259 #define CI_CMD_ERROR 0x00
260 #define CI_CMD_ACK 0x01
261 #define CI_CMD_SYSTEM_READY 0x02
262 #define CI_CMD_KEYPRESS 0x03
263 #define CI_CMD_ON_TUNED 0x04
264 #define CI_CMD_ON_SWITCH_PROGRAM 0x05
265 #define CI_CMD_SECTION_ARRIVED 0x06
266 #define CI_CMD_SECTION_TIMEOUT 0x07
267 #define CI_CMD_TIME 0x08
268 #define CI_CMD_ENTER_MENU 0x09
269 #define CI_CMD_FAST_PSI 0x0a
270 #define CI_CMD_GET_SLOT_INFO 0x0b
272 #define CI_MSG_NONE 0x00
273 #define CI_MSG_CI_INFO 0x01
274 #define CI_MSG_MENU 0x02
275 #define CI_MSG_LIST 0x03
276 #define CI_MSG_TEXT 0x04
277 #define CI_MSG_REQUEST_INPUT 0x05
278 #define CI_MSG_INPUT_COMPLETE 0x06
279 #define CI_MSG_LIST_MORE 0x07
280 #define CI_MSG_MENU_MORE 0x08
281 #define CI_MSG_CLOSE_MMI_IMM 0x09
282 #define CI_MSG_SECTION_REQUEST 0x0a
283 #define CI_MSG_CLOSE_FILTER 0x0b
284 #define CI_PSI_COMPLETE 0x0c
285 #define CI_MODULE_READY 0x0d
286 #define CI_SWITCH_PRG_REPLY 0x0e
287 #define CI_MSG_TEXT_MORE 0x0f
289 #define CI_MSG_CA_PMT 0xe0
290 #define CI_MSG_ERROR 0xf0
293 /* base address of the dual ported RAM which serves as communication
294 * area between PCI bus and av7110,
295 * as seen by the DEBI bus of the saa7146 */
296 #define DPRAM_BASE 0x4000
298 /* boot protocol area */
299 #define AV7110_BOOT_STATE (DPRAM_BASE + 0x3F8)
300 #define AV7110_BOOT_SIZE (DPRAM_BASE + 0x3FA)
301 #define AV7110_BOOT_BASE (DPRAM_BASE + 0x3FC)
302 #define AV7110_BOOT_BLOCK (DPRAM_BASE + 0x400)
303 #define AV7110_BOOT_MAX_SIZE 0xc00
305 /* firmware command protocol area */
306 #define IRQ_STATE (DPRAM_BASE + 0x0F4)
307 #define IRQ_STATE_EXT (DPRAM_BASE + 0x0F6)
308 #define MSGSTATE (DPRAM_BASE + 0x0F8)
309 #define COMMAND (DPRAM_BASE + 0x0FC)
310 #define COM_BUFF (DPRAM_BASE + 0x100)
311 #define COM_BUFF_SIZE 0x20
313 /* various data buffers */
314 #define BUFF1_BASE (DPRAM_BASE + 0x120)
315 #define BUFF1_SIZE 0xE0
317 #define DATA_BUFF0_BASE (DPRAM_BASE + 0x200)
318 #define DATA_BUFF0_SIZE 0x0800
320 #define DATA_BUFF1_BASE (DATA_BUFF0_BASE+DATA_BUFF0_SIZE)
321 #define DATA_BUFF1_SIZE 0x0800
323 #define DATA_BUFF2_BASE (DATA_BUFF1_BASE+DATA_BUFF1_SIZE)
324 #define DATA_BUFF2_SIZE 0x0800
326 #define DATA_BUFF3_BASE (DATA_BUFF2_BASE+DATA_BUFF2_SIZE)
327 #define DATA_BUFF3_SIZE 0x0400
329 #define Reserved (DPRAM_BASE + 0x1E00)
330 #define Reserved_SIZE 0x1C0
333 /* firmware status area */
334 #define STATUS_BASE (DPRAM_BASE + 0x1FC0)
335 #define STATUS_LOOPS (STATUS_BASE + 0x08)
337 #define STATUS_MPEG_WIDTH (STATUS_BASE + 0x0C)
338 /* ((aspect_ratio & 0xf) << 12) | (height & 0xfff) */
339 #define STATUS_MPEG_HEIGHT_AR (STATUS_BASE + 0x0E)
341 /* firmware data protocol area */
342 #define RX_TYPE (DPRAM_BASE + 0x1FE8)
343 #define RX_LEN (DPRAM_BASE + 0x1FEA)
344 #define TX_TYPE (DPRAM_BASE + 0x1FEC)
345 #define TX_LEN (DPRAM_BASE + 0x1FEE)
347 #define RX_BUFF (DPRAM_BASE + 0x1FF4)
348 #define TX_BUFF (DPRAM_BASE + 0x1FF6)
350 #define HANDSHAKE_REG (DPRAM_BASE + 0x1FF8)
351 #define COM_IF_LOCK (DPRAM_BASE + 0x1FFA)
353 #define IRQ_RX (DPRAM_BASE + 0x1FFC)
354 #define IRQ_TX (DPRAM_BASE + 0x1FFE)
356 /* used by boot protocol to load firmware into av7110 DRAM */
357 #define DRAM_START_CODE 0x2e000404
358 #define DRAM_MAX_CODE_SIZE 0x00100000
360 /* saa7146 gpio lines */
362 #define DEBI_DONE_LINE 1
363 #define ARM_IRQ_LINE 0
367 extern int av7110_bootarm(struct av7110
*av7110
);
368 extern int av7110_firmversion(struct av7110
*av7110
);
369 #define FW_CI_LL_SUPPORT(arm_app) ((arm_app) & 0x80000000)
370 #define FW_4M_SDRAM(arm_app) ((arm_app) & 0x40000000)
371 #define FW_VERSION(arm_app) ((arm_app) & 0x0000FFFF)
373 extern int av7110_wait_msgstate(struct av7110
*av7110
, u16 flags
);
374 extern int av7110_fw_cmd(struct av7110
*av7110
, int type
, int com
, int num
, ...);
375 extern int av7110_fw_request(struct av7110
*av7110
, u16
*request_buf
,
376 int request_buf_len
, u16
*reply_buf
, int reply_buf_len
);
379 /* DEBI (saa7146 data extension bus interface) access */
380 extern int av7110_debiwrite(struct av7110
*av7110
, u32 config
,
381 int addr
, u32 val
, unsigned int count
);
382 extern u32
av7110_debiread(struct av7110
*av7110
, u32 config
,
383 int addr
, unsigned int count
);
386 /* DEBI during interrupt */
387 /* single word writes */
388 static inline void iwdebi(struct av7110
*av7110
, u32 config
, int addr
, u32 val
, unsigned int count
)
390 av7110_debiwrite(av7110
, config
, addr
, val
, count
);
394 static inline void mwdebi(struct av7110
*av7110
, u32 config
, int addr
,
395 const u8
*val
, int count
)
397 memcpy(av7110
->debi_virt
, val
, count
);
398 av7110_debiwrite(av7110
, config
, addr
, 0, count
);
401 static inline u32
irdebi(struct av7110
*av7110
, u32 config
, int addr
, u32 val
, unsigned int count
)
405 res
=av7110_debiread(av7110
, config
, addr
, count
);
407 memcpy(av7110
->debi_virt
, (char *) &res
, count
);
411 /* DEBI outside interrupts, only for count <= 4! */
412 static inline void wdebi(struct av7110
*av7110
, u32 config
, int addr
, u32 val
, unsigned int count
)
416 spin_lock_irqsave(&av7110
->debilock
, flags
);
417 av7110_debiwrite(av7110
, config
, addr
, val
, count
);
418 spin_unlock_irqrestore(&av7110
->debilock
, flags
);
421 static inline u32
rdebi(struct av7110
*av7110
, u32 config
, int addr
, u32 val
, unsigned int count
)
426 spin_lock_irqsave(&av7110
->debilock
, flags
);
427 res
=av7110_debiread(av7110
, config
, addr
, count
);
428 spin_unlock_irqrestore(&av7110
->debilock
, flags
);
432 /* handle mailbox registers of the dual ported RAM */
433 static inline void ARM_ResetMailBox(struct av7110
*av7110
)
437 spin_lock_irqsave(&av7110
->debilock
, flags
);
438 av7110_debiread(av7110
, DEBINOSWAP
, IRQ_RX
, 2);
439 av7110_debiwrite(av7110
, DEBINOSWAP
, IRQ_RX
, 0, 2);
440 spin_unlock_irqrestore(&av7110
->debilock
, flags
);
443 static inline void ARM_ClearMailBox(struct av7110
*av7110
)
445 iwdebi(av7110
, DEBINOSWAP
, IRQ_RX
, 0, 2);
448 static inline void ARM_ClearIrq(struct av7110
*av7110
)
450 irdebi(av7110
, DEBINOSWAP
, IRQ_RX
, 0, 2);
453 /****************************************************************************
455 ****************************************************************************/
457 static inline int SendDAC(struct av7110
*av7110
, u8 addr
, u8 data
)
459 return av7110_fw_cmd(av7110
, COMTYPE_AUDIODAC
, AudioDAC
, 2, addr
, data
);
462 static inline int av7710_set_video_mode(struct av7110
*av7110
, int mode
)
464 return av7110_fw_cmd(av7110
, COMTYPE_ENCODER
, SetVidMode
, 1, mode
);
467 static inline int vidcom(struct av7110
*av7110
, u32 com
, u32 arg
)
469 return av7110_fw_cmd(av7110
, COMTYPE_MISC
, AV7110_FW_VIDEO_COMMAND
, 4,
470 (com
>>16), (com
&0xffff),
471 (arg
>>16), (arg
&0xffff));
474 static inline int audcom(struct av7110
*av7110
, u32 com
)
476 return av7110_fw_cmd(av7110
, COMTYPE_MISC
, AV7110_FW_AUDIO_COMMAND
, 2,
477 (com
>>16), (com
&0xffff));
480 static inline int Set22K(struct av7110
*av7110
, int state
)
482 return av7110_fw_cmd(av7110
, COMTYPE_AUDIODAC
, (state
? ON22K
: OFF22K
), 0);
486 extern int av7110_diseqc_send(struct av7110
*av7110
, int len
, u8
*msg
, unsigned long burst
);
489 #ifdef CONFIG_DVB_AV7110_OSD
490 extern int av7110_osd_cmd(struct av7110
*av7110
, osd_cmd_t
*dc
);
491 extern int av7110_osd_capability(struct av7110
*av7110
, osd_cap_t
*cap
);
492 #endif /* CONFIG_DVB_AV7110_OSD */
496 #endif /* _AV7110_HW_H_ */