1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * cx18 System Control Block initialization 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> 6*4882a593Smuzhiyun * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net> 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef CX18_SCB_H 10*4882a593Smuzhiyun #define CX18_SCB_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include "cx18-mailbox.h" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /* NOTE: All ACK interrupts are in the SW2 register. All non-ACK interrupts 15*4882a593Smuzhiyun are in the SW1 register. */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define IRQ_APU_TO_CPU 0x00000001 18*4882a593Smuzhiyun #define IRQ_CPU_TO_APU_ACK 0x00000001 19*4882a593Smuzhiyun #define IRQ_HPU_TO_CPU 0x00000002 20*4882a593Smuzhiyun #define IRQ_CPU_TO_HPU_ACK 0x00000002 21*4882a593Smuzhiyun #define IRQ_PPU_TO_CPU 0x00000004 22*4882a593Smuzhiyun #define IRQ_CPU_TO_PPU_ACK 0x00000004 23*4882a593Smuzhiyun #define IRQ_EPU_TO_CPU 0x00000008 24*4882a593Smuzhiyun #define IRQ_CPU_TO_EPU_ACK 0x00000008 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define IRQ_CPU_TO_APU 0x00000010 27*4882a593Smuzhiyun #define IRQ_APU_TO_CPU_ACK 0x00000010 28*4882a593Smuzhiyun #define IRQ_HPU_TO_APU 0x00000020 29*4882a593Smuzhiyun #define IRQ_APU_TO_HPU_ACK 0x00000020 30*4882a593Smuzhiyun #define IRQ_PPU_TO_APU 0x00000040 31*4882a593Smuzhiyun #define IRQ_APU_TO_PPU_ACK 0x00000040 32*4882a593Smuzhiyun #define IRQ_EPU_TO_APU 0x00000080 33*4882a593Smuzhiyun #define IRQ_APU_TO_EPU_ACK 0x00000080 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define IRQ_CPU_TO_HPU 0x00000100 36*4882a593Smuzhiyun #define IRQ_HPU_TO_CPU_ACK 0x00000100 37*4882a593Smuzhiyun #define IRQ_APU_TO_HPU 0x00000200 38*4882a593Smuzhiyun #define IRQ_HPU_TO_APU_ACK 0x00000200 39*4882a593Smuzhiyun #define IRQ_PPU_TO_HPU 0x00000400 40*4882a593Smuzhiyun #define IRQ_HPU_TO_PPU_ACK 0x00000400 41*4882a593Smuzhiyun #define IRQ_EPU_TO_HPU 0x00000800 42*4882a593Smuzhiyun #define IRQ_HPU_TO_EPU_ACK 0x00000800 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun #define IRQ_CPU_TO_PPU 0x00001000 45*4882a593Smuzhiyun #define IRQ_PPU_TO_CPU_ACK 0x00001000 46*4882a593Smuzhiyun #define IRQ_APU_TO_PPU 0x00002000 47*4882a593Smuzhiyun #define IRQ_PPU_TO_APU_ACK 0x00002000 48*4882a593Smuzhiyun #define IRQ_HPU_TO_PPU 0x00004000 49*4882a593Smuzhiyun #define IRQ_PPU_TO_HPU_ACK 0x00004000 50*4882a593Smuzhiyun #define IRQ_EPU_TO_PPU 0x00008000 51*4882a593Smuzhiyun #define IRQ_PPU_TO_EPU_ACK 0x00008000 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #define IRQ_CPU_TO_EPU 0x00010000 54*4882a593Smuzhiyun #define IRQ_EPU_TO_CPU_ACK 0x00010000 55*4882a593Smuzhiyun #define IRQ_APU_TO_EPU 0x00020000 56*4882a593Smuzhiyun #define IRQ_EPU_TO_APU_ACK 0x00020000 57*4882a593Smuzhiyun #define IRQ_HPU_TO_EPU 0x00040000 58*4882a593Smuzhiyun #define IRQ_EPU_TO_HPU_ACK 0x00040000 59*4882a593Smuzhiyun #define IRQ_PPU_TO_EPU 0x00080000 60*4882a593Smuzhiyun #define IRQ_EPU_TO_PPU_ACK 0x00080000 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define SCB_OFFSET 0xDC0000 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* If Firmware uses fixed memory map, it shall not allocate the area 65*4882a593Smuzhiyun between SCB_OFFSET and SCB_OFFSET+SCB_RESERVED_SIZE-1 inclusive */ 66*4882a593Smuzhiyun #define SCB_RESERVED_SIZE 0x10000 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* This structure is used by EPU to provide memory descriptors in its memory */ 70*4882a593Smuzhiyun struct cx18_mdl_ent { 71*4882a593Smuzhiyun u32 paddr; /* Physical address of a buffer segment */ 72*4882a593Smuzhiyun u32 length; /* Length of the buffer segment */ 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct cx18_scb { 76*4882a593Smuzhiyun /* These fields form the System Control Block which is used at boot time 77*4882a593Smuzhiyun for localizing the IPC data as well as the code positions for all 78*4882a593Smuzhiyun processors. The offsets are from the start of this struct. */ 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* Offset where to find the Inter-Processor Communication data */ 81*4882a593Smuzhiyun u32 ipc_offset; 82*4882a593Smuzhiyun u32 reserved01[7]; 83*4882a593Smuzhiyun /* Offset where to find the start of the CPU code */ 84*4882a593Smuzhiyun u32 cpu_code_offset; 85*4882a593Smuzhiyun u32 reserved02[3]; 86*4882a593Smuzhiyun /* Offset where to find the start of the APU code */ 87*4882a593Smuzhiyun u32 apu_code_offset; 88*4882a593Smuzhiyun u32 reserved03[3]; 89*4882a593Smuzhiyun /* Offset where to find the start of the HPU code */ 90*4882a593Smuzhiyun u32 hpu_code_offset; 91*4882a593Smuzhiyun u32 reserved04[3]; 92*4882a593Smuzhiyun /* Offset where to find the start of the PPU code */ 93*4882a593Smuzhiyun u32 ppu_code_offset; 94*4882a593Smuzhiyun u32 reserved05[3]; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /* These fields form Inter-Processor Communication data which is used 97*4882a593Smuzhiyun by all processors to locate the information needed for communicating 98*4882a593Smuzhiyun with other processors */ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun /* Fields for CPU: */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* bit 0: 1/0 processor ready/not ready. Set other bits to 0. */ 103*4882a593Smuzhiyun u32 cpu_state; 104*4882a593Smuzhiyun u32 reserved1[7]; 105*4882a593Smuzhiyun /* Offset to the mailbox used for sending commands from APU to CPU */ 106*4882a593Smuzhiyun u32 apu2cpu_mb_offset; 107*4882a593Smuzhiyun /* Value to write to register SW1 register set (0xC7003100) after the 108*4882a593Smuzhiyun command is ready */ 109*4882a593Smuzhiyun u32 apu2cpu_irq; 110*4882a593Smuzhiyun /* Value to write to register SW2 register set (0xC7003140) after the 111*4882a593Smuzhiyun command is cleared */ 112*4882a593Smuzhiyun u32 cpu2apu_irq_ack; 113*4882a593Smuzhiyun u32 reserved2[13]; 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun u32 hpu2cpu_mb_offset; 116*4882a593Smuzhiyun u32 hpu2cpu_irq; 117*4882a593Smuzhiyun u32 cpu2hpu_irq_ack; 118*4882a593Smuzhiyun u32 reserved3[13]; 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun u32 ppu2cpu_mb_offset; 121*4882a593Smuzhiyun u32 ppu2cpu_irq; 122*4882a593Smuzhiyun u32 cpu2ppu_irq_ack; 123*4882a593Smuzhiyun u32 reserved4[13]; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun u32 epu2cpu_mb_offset; 126*4882a593Smuzhiyun u32 epu2cpu_irq; 127*4882a593Smuzhiyun u32 cpu2epu_irq_ack; 128*4882a593Smuzhiyun u32 reserved5[13]; 129*4882a593Smuzhiyun u32 reserved6[8]; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /* Fields for APU: */ 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun u32 apu_state; 134*4882a593Smuzhiyun u32 reserved11[7]; 135*4882a593Smuzhiyun u32 cpu2apu_mb_offset; 136*4882a593Smuzhiyun u32 cpu2apu_irq; 137*4882a593Smuzhiyun u32 apu2cpu_irq_ack; 138*4882a593Smuzhiyun u32 reserved12[13]; 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun u32 hpu2apu_mb_offset; 141*4882a593Smuzhiyun u32 hpu2apu_irq; 142*4882a593Smuzhiyun u32 apu2hpu_irq_ack; 143*4882a593Smuzhiyun u32 reserved13[13]; 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun u32 ppu2apu_mb_offset; 146*4882a593Smuzhiyun u32 ppu2apu_irq; 147*4882a593Smuzhiyun u32 apu2ppu_irq_ack; 148*4882a593Smuzhiyun u32 reserved14[13]; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun u32 epu2apu_mb_offset; 151*4882a593Smuzhiyun u32 epu2apu_irq; 152*4882a593Smuzhiyun u32 apu2epu_irq_ack; 153*4882a593Smuzhiyun u32 reserved15[13]; 154*4882a593Smuzhiyun u32 reserved16[8]; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* Fields for HPU: */ 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun u32 hpu_state; 159*4882a593Smuzhiyun u32 reserved21[7]; 160*4882a593Smuzhiyun u32 cpu2hpu_mb_offset; 161*4882a593Smuzhiyun u32 cpu2hpu_irq; 162*4882a593Smuzhiyun u32 hpu2cpu_irq_ack; 163*4882a593Smuzhiyun u32 reserved22[13]; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun u32 apu2hpu_mb_offset; 166*4882a593Smuzhiyun u32 apu2hpu_irq; 167*4882a593Smuzhiyun u32 hpu2apu_irq_ack; 168*4882a593Smuzhiyun u32 reserved23[13]; 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun u32 ppu2hpu_mb_offset; 171*4882a593Smuzhiyun u32 ppu2hpu_irq; 172*4882a593Smuzhiyun u32 hpu2ppu_irq_ack; 173*4882a593Smuzhiyun u32 reserved24[13]; 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun u32 epu2hpu_mb_offset; 176*4882a593Smuzhiyun u32 epu2hpu_irq; 177*4882a593Smuzhiyun u32 hpu2epu_irq_ack; 178*4882a593Smuzhiyun u32 reserved25[13]; 179*4882a593Smuzhiyun u32 reserved26[8]; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* Fields for PPU: */ 182*4882a593Smuzhiyun 183*4882a593Smuzhiyun u32 ppu_state; 184*4882a593Smuzhiyun u32 reserved31[7]; 185*4882a593Smuzhiyun u32 cpu2ppu_mb_offset; 186*4882a593Smuzhiyun u32 cpu2ppu_irq; 187*4882a593Smuzhiyun u32 ppu2cpu_irq_ack; 188*4882a593Smuzhiyun u32 reserved32[13]; 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun u32 apu2ppu_mb_offset; 191*4882a593Smuzhiyun u32 apu2ppu_irq; 192*4882a593Smuzhiyun u32 ppu2apu_irq_ack; 193*4882a593Smuzhiyun u32 reserved33[13]; 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun u32 hpu2ppu_mb_offset; 196*4882a593Smuzhiyun u32 hpu2ppu_irq; 197*4882a593Smuzhiyun u32 ppu2hpu_irq_ack; 198*4882a593Smuzhiyun u32 reserved34[13]; 199*4882a593Smuzhiyun 200*4882a593Smuzhiyun u32 epu2ppu_mb_offset; 201*4882a593Smuzhiyun u32 epu2ppu_irq; 202*4882a593Smuzhiyun u32 ppu2epu_irq_ack; 203*4882a593Smuzhiyun u32 reserved35[13]; 204*4882a593Smuzhiyun u32 reserved36[8]; 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun /* Fields for EPU: */ 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun u32 epu_state; 209*4882a593Smuzhiyun u32 reserved41[7]; 210*4882a593Smuzhiyun u32 cpu2epu_mb_offset; 211*4882a593Smuzhiyun u32 cpu2epu_irq; 212*4882a593Smuzhiyun u32 epu2cpu_irq_ack; 213*4882a593Smuzhiyun u32 reserved42[13]; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun u32 apu2epu_mb_offset; 216*4882a593Smuzhiyun u32 apu2epu_irq; 217*4882a593Smuzhiyun u32 epu2apu_irq_ack; 218*4882a593Smuzhiyun u32 reserved43[13]; 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun u32 hpu2epu_mb_offset; 221*4882a593Smuzhiyun u32 hpu2epu_irq; 222*4882a593Smuzhiyun u32 epu2hpu_irq_ack; 223*4882a593Smuzhiyun u32 reserved44[13]; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun u32 ppu2epu_mb_offset; 226*4882a593Smuzhiyun u32 ppu2epu_irq; 227*4882a593Smuzhiyun u32 epu2ppu_irq_ack; 228*4882a593Smuzhiyun u32 reserved45[13]; 229*4882a593Smuzhiyun u32 reserved46[8]; 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun u32 semaphores[8]; /* Semaphores */ 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun u32 reserved50[32]; /* Reserved for future use */ 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun struct cx18_mailbox apu2cpu_mb; 236*4882a593Smuzhiyun struct cx18_mailbox hpu2cpu_mb; 237*4882a593Smuzhiyun struct cx18_mailbox ppu2cpu_mb; 238*4882a593Smuzhiyun struct cx18_mailbox epu2cpu_mb; 239*4882a593Smuzhiyun 240*4882a593Smuzhiyun struct cx18_mailbox cpu2apu_mb; 241*4882a593Smuzhiyun struct cx18_mailbox hpu2apu_mb; 242*4882a593Smuzhiyun struct cx18_mailbox ppu2apu_mb; 243*4882a593Smuzhiyun struct cx18_mailbox epu2apu_mb; 244*4882a593Smuzhiyun 245*4882a593Smuzhiyun struct cx18_mailbox cpu2hpu_mb; 246*4882a593Smuzhiyun struct cx18_mailbox apu2hpu_mb; 247*4882a593Smuzhiyun struct cx18_mailbox ppu2hpu_mb; 248*4882a593Smuzhiyun struct cx18_mailbox epu2hpu_mb; 249*4882a593Smuzhiyun 250*4882a593Smuzhiyun struct cx18_mailbox cpu2ppu_mb; 251*4882a593Smuzhiyun struct cx18_mailbox apu2ppu_mb; 252*4882a593Smuzhiyun struct cx18_mailbox hpu2ppu_mb; 253*4882a593Smuzhiyun struct cx18_mailbox epu2ppu_mb; 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun struct cx18_mailbox cpu2epu_mb; 256*4882a593Smuzhiyun struct cx18_mailbox apu2epu_mb; 257*4882a593Smuzhiyun struct cx18_mailbox hpu2epu_mb; 258*4882a593Smuzhiyun struct cx18_mailbox ppu2epu_mb; 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun struct cx18_mdl_ack cpu_mdl_ack[CX18_MAX_STREAMS][CX18_MAX_MDL_ACKS]; 261*4882a593Smuzhiyun struct cx18_mdl_ent cpu_mdl[1]; 262*4882a593Smuzhiyun }; 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun void cx18_init_scb(struct cx18 *cx); 265*4882a593Smuzhiyun 266*4882a593Smuzhiyun #endif 267