1 #ifndef __S5PC1XX_ONEDRAM_H__
2 #define __S5PC1XX_ONEDRAM_H__
7 #include "qemu-timer.h"
15 #define SZ_4K 0x00001000
16 #define SZ_1K 0x00000400
17 #define SZ_16M 0x01000000
20 #define S5PC11X_PA_SDRAM (0x30000000)
23 * OneDRAM memory map specific definitions
25 #define ONEDRAM_BASE 0x30000000
26 #define ONEDRAM_AP_BASE (ONEDRAM_BASE)
27 #define ONEDRAM_AP_SIZE 0x05000000 /* 80MB */
28 #define ONEDRAM_SHARED_BASE (ONEDRAM_BASE + ONEDRAM_AP_SIZE)
29 #define ONEDRAM_SHARED_SIZE 0x00500000 /* 0x400000*/
32 #define ONEDRAM_REGISTER_SIZE 0x800
35 * OneDRAM Interrupt related definitions
37 #define ONEDRAM_SFR 0xFFF800
38 #define ONEDRAM_IO_BASE (ONEDRAM_SHARED_BASE + ONEDRAM_SFR)
40 /* A is Modem, B is Application Processor */
41 #define ONEDRAM_SEM 0x00 /* semaphore */
42 #define ONEDRAM_MBX_AB 0x20 /* mailbox AtoB */
43 #define ONEDRAM_MBX_BA 0x40 /* mailbox BtoA */
44 #define ONEDRAM_CHECK_AB 0xa0 /* check AtoB */
45 #define ONEDRAM_CHECK_BA 0xc0 /* check BtoA */
47 #define IPC_MAGIC_PTR 0x0
48 #define IPC_ACCESS_PTR 0x4
50 #define ONEDRAM_START_ADDRESS 0
51 #define ONEDRAM_MAGIC_CODE_ADDRESS (ONEDRAM_START_ADDRESS + IPC_MAGIC_PTR)
52 #define ONEDRAM_ACCESS_ENABLE_ADDRESS (ONEDRAM_START_ADDRESS + IPC_ACCESS_PTR)
54 #define IPC_PART_PTR_SIZE 0x4
56 /* formatted region */
57 #define FMT_OUT_HEAD_PTR 0x10
58 #define FMT_OUT_TAIL_PTR (FMT_OUT_HEAD_PTR + IPC_PART_PTR_SIZE)
59 #define FMT_IN_HEAD_PTR 0x18
60 #define FMT_IN_TAIL_PTR (FMT_IN_HEAD_PTR + IPC_PART_PTR_SIZE)
63 #define RAW_OUT_HEAD_PTR 0x20
64 #define RAW_OUT_TAIL_PTR (RAW_OUT_HEAD_PTR + IPC_PART_PTR_SIZE)
65 #define RAW_IN_HEAD_PTR 0x28
66 #define RAW_IN_TAIL_PTR (RAW_IN_HEAD_PTR + IPC_PART_PTR_SIZE)
68 /* remote file system region */
69 #define RFS_OUT_HEAD_PTR 0x30
70 #define RFS_OUT_TAIL_PTR (RFS_OUT_HEAD_PTR + IPC_PART_PTR_SIZE)
71 #define RFS_IN_HEAD_PTR 0x38
72 #define RFS_IN_TAIL_PTR (RFS_IN_HEAD_PTR + IPC_PART_PTR_SIZE)
74 #define CP_FATAL_DISP_SIZE 0xA0
75 #define CP_FATAL_DISP_PTR 0x1000
77 #define FMT_BUF_SIZE 0x1000
78 #define FMT_OUT_BUF_PTR 0xFE000
79 #define FMT_IN_BUF_PTR 0xFF000
81 #define RAW_BUF_SIZE 0x100000
82 #define RAW_OUT_BUF_PTR 0x100000
83 #define RAW_IN_BUF_PTR 0x200000
85 #define RFS_BUF_SIZE 0x100000
86 #define RFS_OUT_BUF_PTR 0x300000
87 #define RFS_IN_BUF_PTR 0x400000
89 #define IPC_PART_SIZE 0x500000
91 #define ONEDRAM_OUT_FMT_BASE FMT_OUT_BUF_PTR
92 #define ONEDRAM_OUT_FMT_SIZE FMT_BUF_SIZE
94 #define ONEDRAM_OUT_RAW_BASE RAW_OUT_BUF_PTR
95 #define ONEDRAM_OUT_RAW_SIZE RAW_BUF_SIZE
97 #define ONEDRAM_OUT_RFS_BASE RFS_OUT_BUF_PTR
98 #define ONEDRAM_OUT_RFS_SIZE RFS_BUF_SIZE
100 #define ONEDRAM_IN_FMT_BASE FMT_IN_BUF_PTR
101 #define ONEDRAM_IN_FMT_SIZE FMT_BUF_SIZE
103 #define ONEDRAM_IN_RAW_BASE RAW_IN_BUF_PTR
104 #define ONEDRAM_IN_RAW_SIZE RAW_BUF_SIZE
106 #define ONEDRAM_IN_RFS_BASE RFS_IN_BUF_PTR
107 #define ONEDRAM_IN_RFS_SIZE RFS_BUF_SIZE
110 #define MAGIC_CODE 0x00aa
111 #define ACCESS_ENABLE 0x0001
113 #define IRQ_ONEDRAM_INT_AP 11
114 #define IRQ_PHONE_ACTIVE 15
116 #define MAX_BUFFER 1024
118 #define CONNECT_LENGTH 4
120 #define TCP_CMD_LENGTH 2
124 #define IPC_AP_CONNECT_ACK 0xABCD1234
125 #define IPC_AP_SEND_FMT_ACK 0xCDAB1234
129 #define IPC_CP_CONNECT_APP 0x1234ABCD
130 #define IPC_CP_READY_FOR_LOADING 0x12341234
131 #define IPC_CP_IMG_LOADED 0x45674567
132 #define IPC_CP_READY 0xABCDABCD
135 * IPC 4.0 specific definitions
137 #define INT_MASK_VALID 0x0080
138 #define INT_MASK_COMMAND 0x0040
140 #define INT_MASK_REQ_ACK_RFS 0x0400
141 #define INT_MASK_RES_ACK_RFS 0x0200
142 #define INT_MASK_SEND_RFS 0x0100
143 #define INT_MASK_REQ_ACK_FMT 0x0020
144 #define INT_MASK_REQ_ACK_RAW 0x0010
145 #define INT_MASK_RES_ACK_FMT 0x0008
146 #define INT_MASK_RES_ACK_RAW 0x0004
147 #define INT_MASK_SEND_FMT 0x0002
148 #define INT_MASK_SEND_RAW 0x0001
150 #define INT_MASK_CMD_NONE 0x0000
151 #define INT_MASK_CMD_INIT_START 0x0001
152 #define INT_MASK_CMD_INIT_END 0x0002
153 /* CMD_INIT_END extended bit */
155 #define REQ_ONLINE_BOOT 0x0000
156 #define REQ_AIRPLANE_BOOT 0x1000
158 #define AP_OS_ANDROID 0x0100
159 #define AP_OS_WINMOBILE 0x0200
160 #define AP_OS_LINUX 0x0300
161 #define AP_OS_SYMBIAN 0x0400
162 #define INT_MASK_CMD_REQ_ACTIVE 0x0003
163 #define INT_MASK_CMD_RES_ACTIVE 0x0004
164 #define INT_MASK_CMD_REQ_TIME_SYNC 0x0005
165 #define INT_MASK_CMD_PHONE_START 0x0008
166 /* CMD_PHONE_START extended bit */
168 #define CP_CHIP_QUALCOMM 0x0100
169 #define CP_CHIP_INFINEON 0x0200
170 #define CP_CHIP_BROADCOM 0x0300
171 #define INT_MASK_CMD_ERR_DISPLAY 0x0009
172 #define INT_MASK_CMD_PHONE_DEEP_SLEEP 0x000A
173 #define INT_MASK_CMD_NV_REBUILDING 0x000B
174 #define INT_MASK_CMD_EMER_DOWN 0x000C
175 #define INT_MASK_CMD_SMP_REQ 0x000D
176 #define INT_MASK_CMD_SMP_REP 0x000E
177 #define INT_MASK_CMD_MAX 0x000F
179 #define INT_COMMAND(x) (INT_MASK_VALID | INT_MASK_COMMAND | x)
180 #define INT_NON_COMMAND(x) (INT_MASK_VALID | x)
182 #define BIT_INT_MASK_CMD_REQ_ACTIVE 0x001
183 #define BIT_INT_MASK_CMD_ERR_DISPLAY 0x002
184 #define BIT_INT_MASK_CMD_PHONE_START 0x004
185 #define BIT_INT_MASK_CMD_REQ_TIME_SYNC 0x008
186 #define BIT_INT_MASK_CMD_PHONE_DEEP_SLEEP 0x010
187 #define BIT_INT_MASK_CMD_NV_REBUILDING 0x020
188 #define BIT_INT_MASK_CMD_EMER_DOWN 0x040
189 #define BIT_INT_MASK_CMD_SMP_REQ 0x080
190 #define BIT_INT_MASK_CMD_SMP_REP 0x100
191 #define BIT_MAX 0x200
193 #define FMT_SERVICE 0
194 #define RAW_SERVICE 1
195 #define RFS_SERVICE 2
199 #define IRQ_HANDLED (1)
200 #define IRQ_RETVAL(x) ((x) != 0)
203 * Modem deivce partitions.
210 #define MESG_PHONE_OFF 1
211 #define MESG_PHONE_RESET 2
214 #define TIME_RESOLUTION 10
216 #define COMMAND_SUCCESS 0x00
217 #define COMMAND_GET_AUTHORITY_FAIL 0x01
218 #define COMMAND_FAIL 0x02
220 #define CONFIG_MODEM_CORE_FMT_SERVICE
222 typedef struct ModemServiceOps {
223 int (*send_cmd_handler)(uint16_t);
224 void (*resp_cmd_handler)(void);
227 typedef struct ModemInfo {
228 /* DPRAM memory addresses */
229 uint32_t in_head_addr;
230 uint32_t in_tail_addr;
231 uint32_t in_buff_addr;
232 uint32_t in_buff_size;
234 uint32_t out_head_addr;
235 uint32_t out_tail_addr;
236 uint32_t out_buff_addr;
237 uint32_t out_buff_size;
241 uint16_t mask_req_ack;
242 uint16_t mask_res_ack;
246 typedef struct ModemPlatformData {
248 uint32_t booting_type;
249 uint32_t irq_onedram_int_ap;
250 uint32_t out_fmt_base;
251 uint32_t out_fmt_size;
253 uint32_t in_fmt_base;
254 uint32_t in_fmt_size;
259 /* Booting type definitions */
264 #define QEMU_MODEM XMM
266 #define SOCKET_BUFFER_MAX_SIZE SZ_1K
268 typedef struct OneDRAMState {
269 uint16_t waiting_authority;
270 uint16_t waiting_sem_rep;
271 uint16_t waiting_check;
274 uint16_t interruptable;
281 typedef struct S5pc1xxOneDRAMState {
291 qemu_irq irq_onedram_int_ap;
292 uint32_t irq_onedram_int_ap_pending;
293 uint32_t irq_onedram_int_cp_pending;
295 CharDriverState *socket;
296 uint32_t vmodem_connected;
297 uint32_t vmodem_bootup;
298 QEMUTimer *bootup_timer;
299 QEMUTimer *sem_timer;
301 /* OneDRAM memory addresses */
304 uint8_t *socket_buffer;
307 OneDRAMState onedram_state;
308 } S5pc1xxOneDRAMState;
311 static struct ModemPlatformData aquila_xmm_modem_data = {
312 .name = "aquila-XMM6160",
314 .irq_onedram_int_ap = 11,
317 .out_fmt_base = FMT_OUT_HEAD_PTR,
318 .out_fmt_size = FMT_BUF_SIZE,
319 .in_fmt_base = FMT_IN_HEAD_PTR,
320 .in_fmt_size = FMT_BUF_SIZE,
321 .ptr_fmt_size = IPC_PART_PTR_SIZE,
325 /* Command handler */
326 static int onedram_req_active_handler(S5pc1xxOneDRAMState *s);
327 static int onedram_smp_req_handler(S5pc1xxOneDRAMState *s);
328 static int onedram_fmt_try_send_cmd(S5pc1xxOneDRAMState *s);
329 static int onedram_fmt_send_cmd(S5pc1xxOneDRAMState *s);
330 static void onedram_data_handler_fmt_autonomous(S5pc1xxOneDRAMState *s);
331 /*static*/ void onedram_command_handler(S5pc1xxOneDRAMState *s,
333 /*static*/ void onedram_data_handler(S5pc1xxOneDRAMState *s,
335 static uint32_t onedram_can_access_shm(S5pc1xxOneDRAMState *s);
336 static int onedram_read_shm(S5pc1xxOneDRAMState *s, uint8_t *buf,
337 uint32_t offset, uint32_t size);
338 static int onedram_write_shm(S5pc1xxOneDRAMState *s,
339 const uint8_t *buf, uint32_t offset,
341 /*static*/ uint32_t onedram_read_outhead(S5pc1xxOneDRAMState *s);
342 /*static*/ uint32_t onedram_read_inhead(S5pc1xxOneDRAMState *s);
343 /*static*/ uint32_t onedram_read_outtail(S5pc1xxOneDRAMState *s);
344 /*static*/ uint32_t onedram_read_intail(S5pc1xxOneDRAMState *s);
345 /*static*/ uint32_t onedram_write_outhead(S5pc1xxOneDRAMState *s,
347 /*static*/ uint32_t onedram_write_inhead(S5pc1xxOneDRAMState *s,
349 /*static*/ uint32_t onedram_write_outtail(S5pc1xxOneDRAMState *s,
351 /*static*/ uint32_t onedram_write_intail(S5pc1xxOneDRAMState *s,
353 /*static*/ int onedram_read_fmt(S5pc1xxOneDRAMState *s,
355 /*static*/ void onedram_read_fmt_wrapup(S5pc1xxOneDRAMState *s,
356 const uint16_t non_cmd);
357 static int onedram_insert_socket(S5pc1xxOneDRAMState *s,
358 uint32_t psrc, uint16_t size);
359 void onedram_socket_push(S5pc1xxOneDRAMState *s);
360 int onedram_write_fmt(S5pc1xxOneDRAMState *s, const uint8_t *buf,
362 static uint32_t onedram_irq_cp_raise_32(S5pc1xxOneDRAMState *s);
363 static uint32_t onedram_irq_cp_raise_16(S5pc1xxOneDRAMState *s);
364 void onedram_disable_interrupt(S5pc1xxOneDRAMState *s);
365 void onedram_enable_interrupt(S5pc1xxOneDRAMState *s);
366 uint16_t onedram_interruptable(S5pc1xxOneDRAMState *s);
367 static void onedram_irq_cp_lower(S5pc1xxOneDRAMState *s);
368 static uint32_t onedram_irq_cp_pending(S5pc1xxOneDRAMState *s);
369 static void onedram_irq_ap_raise(S5pc1xxOneDRAMState *s);
370 static void onedram_irq_ap_lower(S5pc1xxOneDRAMState *s);
371 static uint32_t onedram_irq_ap_pending(S5pc1xxOneDRAMState *s);
372 unsigned int onedram_read_sem(S5pc1xxOneDRAMState *s);
373 static void onedram_put_authority(S5pc1xxOneDRAMState *s);
374 int onedram_try_get_authority(S5pc1xxOneDRAMState *s);
375 void onedram_disable_write(S5pc1xxOneDRAMState *s);
376 void onedram_enable_write(S5pc1xxOneDRAMState *s);
377 uint16_t onedram_writable(S5pc1xxOneDRAMState *s);
378 void onedram_send_cmd_to_pda(S5pc1xxOneDRAMState *s, uint16_t val);
379 static void onedram_bootup(void *opaque);
380 static void onedram_register_modem(S5pc1xxOneDRAMState *s,
381 ModemPlatformData *mp);
382 static uint32_t onedram_io_readb(void *opaque,
383 target_phys_addr_t offset);
384 static uint32_t onedram_io_readl(void *opaque,
385 target_phys_addr_t offset);
386 static void onedram_io_writeb(void *opaque, target_phys_addr_t offset,
388 static void onedram_io_writel(void *opaque, target_phys_addr_t offset,
390 static int onedram_tcp_can_read(void *opaque);
391 static void onedram_tcp_read(void *opaque, const uint8_t *buf,
393 void onedram_tcp_write(void *opaque, const uint8_t *buf, uint32_t size);
394 static void onedram_tcp_event(void *opaque, int event);
395 static void onedram_tcp_init(void *opaque);