1 /*
2  * _chnl_sm.h
3  *
4  * DSP-BIOS Bridge driver support functions for TI OMAP processors.
5  *
6  * Private header file defining channel manager and channel objects for
7  * a shared memory channel driver.
8  *
9  * Shared between the modules implementing the shared memory channel class
10  * library.
11  *
12  * Copyright (C) 2005-2006 Texas Instruments, Inc.
13  *
14  * This package is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License version 2 as
16  * published by the Free Software Foundation.
17  *
18  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
20  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21  */
22 
23 #ifndef _CHNL_SM_
24 #define _CHNL_SM_
25 
26 #include <dspbridge/dspapi.h>
27 #include <dspbridge/dspdefs.h>
28 
29 #include <linux/list.h>
30 #include <dspbridge/ntfy.h>
31 
32 /*
33  *  These target side symbols define the beginning and ending addresses
34  *  of shared memory buffer. They are defined in the *cfg.cmd file by
35  *  cdb code.
36  */
37 #define CHNL_SHARED_BUFFER_BASE_SYM "_SHM_BEG"
38 #define CHNL_SHARED_BUFFER_LIMIT_SYM "_SHM_END"
39 #define BRIDGEINIT_BIOSGPTIMER "_BRIDGEINIT_BIOSGPTIMER"
40 #define BRIDGEINIT_LOADMON_GPTIMER "_BRIDGEINIT_LOADMON_GPTIMER"
41 
42 #ifndef _CHNL_WORDSIZE
43 #define _CHNL_WORDSIZE 4	/* default _CHNL_WORDSIZE is 2 bytes/word */
44 #endif
45 
46 #define MAXOPPS 16
47 
48 /* Shared memory config options */
49 #define SHM_CURROPP	0	/* Set current OPP in shm */
50 #define SHM_OPPINFO	1	/* Set dsp voltage and freq table values */
51 #define SHM_GETOPP	2	/* Get opp requested by DSP */
52 
53 struct opp_table_entry {
54 	u32 voltage;
55 	u32 frequency;
56 	u32 min_freq;
57 	u32 max_freq;
58 };
59 
60 struct opp_struct {
61 	u32 curr_opp_pt;
62 	u32 num_opp_pts;
63 	struct opp_table_entry opp_point[MAXOPPS];
64 };
65 
66 /* Request to MPU */
67 struct opp_rqst_struct {
68 	u32 rqst_dsp_freq;
69 	u32 rqst_opp_pt;
70 };
71 
72 /* Info to MPU */
73 struct load_mon_struct {
74 	u32 curr_dsp_load;
75 	u32 curr_dsp_freq;
76 	u32 pred_dsp_load;
77 	u32 pred_dsp_freq;
78 };
79 
80 /* Structure in shared between DSP and PC for communication. */
81 struct shm {
82 	u32 dsp_free_mask;	/* Written by DSP, read by PC. */
83 	u32 host_free_mask;	/* Written by PC, read by DSP */
84 
85 	u32 input_full;		/* Input channel has unread data. */
86 	u32 input_id;		/* Channel for which input is available. */
87 	u32 input_size;		/* Size of data block (in DSP words). */
88 
89 	u32 output_full;	/* Output channel has unread data. */
90 	u32 output_id;		/* Channel for which output is available. */
91 	u32 output_size;	/* Size of data block (in DSP words). */
92 
93 	u32 arg;		/* Arg for Issue/Reclaim (23 bits for 55x). */
94 	u32 resvd;		/* Keep structure size even for 32-bit DSPs */
95 
96 	/* Operating Point structure */
97 	struct opp_struct opp_table_struct;
98 	/* Operating Point Request structure */
99 	struct opp_rqst_struct opp_request;
100 	/* load monitor information structure */
101 	struct load_mon_struct load_mon_info;
102 #ifdef CONFIG_TIDSPBRIDGE_WDT3
103 	/* Flag for WDT enable/disable F/I clocks */
104 	u32 wdt_setclocks;
105 	u32 wdt_overflow;	/* WDT overflow time */
106 	char dummy[176];	/* padding to 256 byte boundary */
107 #else
108 	char dummy[184];	/* padding to 256 byte boundary */
109 #endif
110 	u32 shm_dbg_var[64];	/* shared memory debug variables */
111 };
112 
113 	/* Channel Manager: only one created per board: */
114 struct chnl_mgr {
115 	/* Function interface to Bridge driver */
116 	struct bridge_drv_interface *intf_fxns;
117 	struct io_mgr *iomgr;	/* IO manager */
118 	/* Device this board represents */
119 	struct dev_object *dev_obj;
120 
121 	/* These fields initialized in bridge_chnl_create(): */
122 	u32 output_mask;	/* Host output channels w/ full buffers */
123 	u32 last_output;	/* Last output channel fired from DPC */
124 	/* Critical section object handle */
125 	spinlock_t chnl_mgr_lock;
126 	u32 word_size;		/* Size in bytes of DSP word */
127 	u8 max_channels;	/* Total number of channels */
128 	u8 open_channels;	/* Total number of open channels */
129 	struct chnl_object **channels;		/* Array of channels */
130 	u8 type;		/* Type of channel class library */
131 	/* If no shm syms, return for CHNL_Open */
132 	int chnl_open_status;
133 };
134 
135 /*
136  *  Channel: up to CHNL_MAXCHANNELS per board or if DSP-DMA supported then
137  *     up to CHNL_MAXCHANNELS + CHNL_MAXDDMACHNLS per board.
138  */
139 struct chnl_object {
140 	/* Pointer back to channel manager */
141 	struct chnl_mgr *chnl_mgr_obj;
142 	u32 chnl_id;		/* Channel id */
143 	u8 state;		/* Current channel state */
144 	s8 chnl_mode;		/* Chnl mode and attributes */
145 	/* Chnl I/O completion event (user mode) */
146 	void *user_event;
147 	/* Abstract synchronization object */
148 	struct sync_object *sync_event;
149 	u32 process;		/* Process which created this channel */
150 	u32 cb_arg;		/* Argument to use with callback */
151 	struct list_head io_requests;	/* List of IOR's to driver */
152 	s32 cio_cs;		/* Number of IOC's in queue */
153 	s32 cio_reqs;		/* Number of IORequests in queue */
154 	s32 chnl_packets;	/* Initial number of free Irps */
155 	/* List of IOC's from driver */
156 	struct list_head io_completions;
157 	struct list_head free_packets_list;	/* List of free Irps */
158 	struct ntfy_object *ntfy_obj;
159 	u32 bytes_moved;	/* Total number of bytes transferred */
160 
161 	/* For DSP-DMA */
162 
163 	/* Type of chnl transport:CHNL_[PCPY][DDMA] */
164 	u32 chnl_type;
165 };
166 
167 /* I/O Request/completion packet: */
168 struct chnl_irp {
169 	struct list_head link;	/* Link to next CHIRP in queue. */
170 	/* Buffer to be filled/emptied. (User) */
171 	u8 *host_user_buf;
172 	/* Buffer to be filled/emptied. (System) */
173 	u8 *host_sys_buf;
174 	u32 arg;		/* Issue/Reclaim argument. */
175 	u32 dsp_tx_addr;	/* Transfer address on DSP side. */
176 	u32 byte_size;		/* Bytes transferred. */
177 	u32 buf_size;		/* Actual buffer size when allocated. */
178 	u32 status;		/* Status of IO completion. */
179 };
180 
181 #endif /* _CHNL_SM_ */
182