162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * cx18 System Control Block initialization 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2007 Hans Verkuil <hverkuil@xs4all.nl> 662306a36Sopenharmony_ci * Copyright (C) 2008 Andy Walls <awalls@md.metrocast.net> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef CX18_SCB_H 1062306a36Sopenharmony_ci#define CX18_SCB_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "cx18-mailbox.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci/* NOTE: All ACK interrupts are in the SW2 register. All non-ACK interrupts 1562306a36Sopenharmony_ci are in the SW1 register. */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define IRQ_APU_TO_CPU 0x00000001 1862306a36Sopenharmony_ci#define IRQ_CPU_TO_APU_ACK 0x00000001 1962306a36Sopenharmony_ci#define IRQ_HPU_TO_CPU 0x00000002 2062306a36Sopenharmony_ci#define IRQ_CPU_TO_HPU_ACK 0x00000002 2162306a36Sopenharmony_ci#define IRQ_PPU_TO_CPU 0x00000004 2262306a36Sopenharmony_ci#define IRQ_CPU_TO_PPU_ACK 0x00000004 2362306a36Sopenharmony_ci#define IRQ_EPU_TO_CPU 0x00000008 2462306a36Sopenharmony_ci#define IRQ_CPU_TO_EPU_ACK 0x00000008 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci#define IRQ_CPU_TO_APU 0x00000010 2762306a36Sopenharmony_ci#define IRQ_APU_TO_CPU_ACK 0x00000010 2862306a36Sopenharmony_ci#define IRQ_HPU_TO_APU 0x00000020 2962306a36Sopenharmony_ci#define IRQ_APU_TO_HPU_ACK 0x00000020 3062306a36Sopenharmony_ci#define IRQ_PPU_TO_APU 0x00000040 3162306a36Sopenharmony_ci#define IRQ_APU_TO_PPU_ACK 0x00000040 3262306a36Sopenharmony_ci#define IRQ_EPU_TO_APU 0x00000080 3362306a36Sopenharmony_ci#define IRQ_APU_TO_EPU_ACK 0x00000080 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define IRQ_CPU_TO_HPU 0x00000100 3662306a36Sopenharmony_ci#define IRQ_HPU_TO_CPU_ACK 0x00000100 3762306a36Sopenharmony_ci#define IRQ_APU_TO_HPU 0x00000200 3862306a36Sopenharmony_ci#define IRQ_HPU_TO_APU_ACK 0x00000200 3962306a36Sopenharmony_ci#define IRQ_PPU_TO_HPU 0x00000400 4062306a36Sopenharmony_ci#define IRQ_HPU_TO_PPU_ACK 0x00000400 4162306a36Sopenharmony_ci#define IRQ_EPU_TO_HPU 0x00000800 4262306a36Sopenharmony_ci#define IRQ_HPU_TO_EPU_ACK 0x00000800 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define IRQ_CPU_TO_PPU 0x00001000 4562306a36Sopenharmony_ci#define IRQ_PPU_TO_CPU_ACK 0x00001000 4662306a36Sopenharmony_ci#define IRQ_APU_TO_PPU 0x00002000 4762306a36Sopenharmony_ci#define IRQ_PPU_TO_APU_ACK 0x00002000 4862306a36Sopenharmony_ci#define IRQ_HPU_TO_PPU 0x00004000 4962306a36Sopenharmony_ci#define IRQ_PPU_TO_HPU_ACK 0x00004000 5062306a36Sopenharmony_ci#define IRQ_EPU_TO_PPU 0x00008000 5162306a36Sopenharmony_ci#define IRQ_PPU_TO_EPU_ACK 0x00008000 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci#define IRQ_CPU_TO_EPU 0x00010000 5462306a36Sopenharmony_ci#define IRQ_EPU_TO_CPU_ACK 0x00010000 5562306a36Sopenharmony_ci#define IRQ_APU_TO_EPU 0x00020000 5662306a36Sopenharmony_ci#define IRQ_EPU_TO_APU_ACK 0x00020000 5762306a36Sopenharmony_ci#define IRQ_HPU_TO_EPU 0x00040000 5862306a36Sopenharmony_ci#define IRQ_EPU_TO_HPU_ACK 0x00040000 5962306a36Sopenharmony_ci#define IRQ_PPU_TO_EPU 0x00080000 6062306a36Sopenharmony_ci#define IRQ_EPU_TO_PPU_ACK 0x00080000 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#define SCB_OFFSET 0xDC0000 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* If Firmware uses fixed memory map, it shall not allocate the area 6562306a36Sopenharmony_ci between SCB_OFFSET and SCB_OFFSET+SCB_RESERVED_SIZE-1 inclusive */ 6662306a36Sopenharmony_ci#define SCB_RESERVED_SIZE 0x10000 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci/* This structure is used by EPU to provide memory descriptors in its memory */ 7062306a36Sopenharmony_cistruct cx18_mdl_ent { 7162306a36Sopenharmony_ci u32 paddr; /* Physical address of a buffer segment */ 7262306a36Sopenharmony_ci u32 length; /* Length of the buffer segment */ 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistruct cx18_scb { 7662306a36Sopenharmony_ci /* These fields form the System Control Block which is used at boot time 7762306a36Sopenharmony_ci for localizing the IPC data as well as the code positions for all 7862306a36Sopenharmony_ci processors. The offsets are from the start of this struct. */ 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci /* Offset where to find the Inter-Processor Communication data */ 8162306a36Sopenharmony_ci u32 ipc_offset; 8262306a36Sopenharmony_ci u32 reserved01[7]; 8362306a36Sopenharmony_ci /* Offset where to find the start of the CPU code */ 8462306a36Sopenharmony_ci u32 cpu_code_offset; 8562306a36Sopenharmony_ci u32 reserved02[3]; 8662306a36Sopenharmony_ci /* Offset where to find the start of the APU code */ 8762306a36Sopenharmony_ci u32 apu_code_offset; 8862306a36Sopenharmony_ci u32 reserved03[3]; 8962306a36Sopenharmony_ci /* Offset where to find the start of the HPU code */ 9062306a36Sopenharmony_ci u32 hpu_code_offset; 9162306a36Sopenharmony_ci u32 reserved04[3]; 9262306a36Sopenharmony_ci /* Offset where to find the start of the PPU code */ 9362306a36Sopenharmony_ci u32 ppu_code_offset; 9462306a36Sopenharmony_ci u32 reserved05[3]; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci /* These fields form Inter-Processor Communication data which is used 9762306a36Sopenharmony_ci by all processors to locate the information needed for communicating 9862306a36Sopenharmony_ci with other processors */ 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci /* Fields for CPU: */ 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci /* bit 0: 1/0 processor ready/not ready. Set other bits to 0. */ 10362306a36Sopenharmony_ci u32 cpu_state; 10462306a36Sopenharmony_ci u32 reserved1[7]; 10562306a36Sopenharmony_ci /* Offset to the mailbox used for sending commands from APU to CPU */ 10662306a36Sopenharmony_ci u32 apu2cpu_mb_offset; 10762306a36Sopenharmony_ci /* Value to write to register SW1 register set (0xC7003100) after the 10862306a36Sopenharmony_ci command is ready */ 10962306a36Sopenharmony_ci u32 apu2cpu_irq; 11062306a36Sopenharmony_ci /* Value to write to register SW2 register set (0xC7003140) after the 11162306a36Sopenharmony_ci command is cleared */ 11262306a36Sopenharmony_ci u32 cpu2apu_irq_ack; 11362306a36Sopenharmony_ci u32 reserved2[13]; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci u32 hpu2cpu_mb_offset; 11662306a36Sopenharmony_ci u32 hpu2cpu_irq; 11762306a36Sopenharmony_ci u32 cpu2hpu_irq_ack; 11862306a36Sopenharmony_ci u32 reserved3[13]; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci u32 ppu2cpu_mb_offset; 12162306a36Sopenharmony_ci u32 ppu2cpu_irq; 12262306a36Sopenharmony_ci u32 cpu2ppu_irq_ack; 12362306a36Sopenharmony_ci u32 reserved4[13]; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci u32 epu2cpu_mb_offset; 12662306a36Sopenharmony_ci u32 epu2cpu_irq; 12762306a36Sopenharmony_ci u32 cpu2epu_irq_ack; 12862306a36Sopenharmony_ci u32 reserved5[13]; 12962306a36Sopenharmony_ci u32 reserved6[8]; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci /* Fields for APU: */ 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci u32 apu_state; 13462306a36Sopenharmony_ci u32 reserved11[7]; 13562306a36Sopenharmony_ci u32 cpu2apu_mb_offset; 13662306a36Sopenharmony_ci u32 cpu2apu_irq; 13762306a36Sopenharmony_ci u32 apu2cpu_irq_ack; 13862306a36Sopenharmony_ci u32 reserved12[13]; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci u32 hpu2apu_mb_offset; 14162306a36Sopenharmony_ci u32 hpu2apu_irq; 14262306a36Sopenharmony_ci u32 apu2hpu_irq_ack; 14362306a36Sopenharmony_ci u32 reserved13[13]; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci u32 ppu2apu_mb_offset; 14662306a36Sopenharmony_ci u32 ppu2apu_irq; 14762306a36Sopenharmony_ci u32 apu2ppu_irq_ack; 14862306a36Sopenharmony_ci u32 reserved14[13]; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci u32 epu2apu_mb_offset; 15162306a36Sopenharmony_ci u32 epu2apu_irq; 15262306a36Sopenharmony_ci u32 apu2epu_irq_ack; 15362306a36Sopenharmony_ci u32 reserved15[13]; 15462306a36Sopenharmony_ci u32 reserved16[8]; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ci /* Fields for HPU: */ 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci u32 hpu_state; 15962306a36Sopenharmony_ci u32 reserved21[7]; 16062306a36Sopenharmony_ci u32 cpu2hpu_mb_offset; 16162306a36Sopenharmony_ci u32 cpu2hpu_irq; 16262306a36Sopenharmony_ci u32 hpu2cpu_irq_ack; 16362306a36Sopenharmony_ci u32 reserved22[13]; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci u32 apu2hpu_mb_offset; 16662306a36Sopenharmony_ci u32 apu2hpu_irq; 16762306a36Sopenharmony_ci u32 hpu2apu_irq_ack; 16862306a36Sopenharmony_ci u32 reserved23[13]; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci u32 ppu2hpu_mb_offset; 17162306a36Sopenharmony_ci u32 ppu2hpu_irq; 17262306a36Sopenharmony_ci u32 hpu2ppu_irq_ack; 17362306a36Sopenharmony_ci u32 reserved24[13]; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci u32 epu2hpu_mb_offset; 17662306a36Sopenharmony_ci u32 epu2hpu_irq; 17762306a36Sopenharmony_ci u32 hpu2epu_irq_ack; 17862306a36Sopenharmony_ci u32 reserved25[13]; 17962306a36Sopenharmony_ci u32 reserved26[8]; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci /* Fields for PPU: */ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci u32 ppu_state; 18462306a36Sopenharmony_ci u32 reserved31[7]; 18562306a36Sopenharmony_ci u32 cpu2ppu_mb_offset; 18662306a36Sopenharmony_ci u32 cpu2ppu_irq; 18762306a36Sopenharmony_ci u32 ppu2cpu_irq_ack; 18862306a36Sopenharmony_ci u32 reserved32[13]; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci u32 apu2ppu_mb_offset; 19162306a36Sopenharmony_ci u32 apu2ppu_irq; 19262306a36Sopenharmony_ci u32 ppu2apu_irq_ack; 19362306a36Sopenharmony_ci u32 reserved33[13]; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci u32 hpu2ppu_mb_offset; 19662306a36Sopenharmony_ci u32 hpu2ppu_irq; 19762306a36Sopenharmony_ci u32 ppu2hpu_irq_ack; 19862306a36Sopenharmony_ci u32 reserved34[13]; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci u32 epu2ppu_mb_offset; 20162306a36Sopenharmony_ci u32 epu2ppu_irq; 20262306a36Sopenharmony_ci u32 ppu2epu_irq_ack; 20362306a36Sopenharmony_ci u32 reserved35[13]; 20462306a36Sopenharmony_ci u32 reserved36[8]; 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci /* Fields for EPU: */ 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci u32 epu_state; 20962306a36Sopenharmony_ci u32 reserved41[7]; 21062306a36Sopenharmony_ci u32 cpu2epu_mb_offset; 21162306a36Sopenharmony_ci u32 cpu2epu_irq; 21262306a36Sopenharmony_ci u32 epu2cpu_irq_ack; 21362306a36Sopenharmony_ci u32 reserved42[13]; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci u32 apu2epu_mb_offset; 21662306a36Sopenharmony_ci u32 apu2epu_irq; 21762306a36Sopenharmony_ci u32 epu2apu_irq_ack; 21862306a36Sopenharmony_ci u32 reserved43[13]; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci u32 hpu2epu_mb_offset; 22162306a36Sopenharmony_ci u32 hpu2epu_irq; 22262306a36Sopenharmony_ci u32 epu2hpu_irq_ack; 22362306a36Sopenharmony_ci u32 reserved44[13]; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci u32 ppu2epu_mb_offset; 22662306a36Sopenharmony_ci u32 ppu2epu_irq; 22762306a36Sopenharmony_ci u32 epu2ppu_irq_ack; 22862306a36Sopenharmony_ci u32 reserved45[13]; 22962306a36Sopenharmony_ci u32 reserved46[8]; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci u32 semaphores[8]; /* Semaphores */ 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci u32 reserved50[32]; /* Reserved for future use */ 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci struct cx18_mailbox apu2cpu_mb; 23662306a36Sopenharmony_ci struct cx18_mailbox hpu2cpu_mb; 23762306a36Sopenharmony_ci struct cx18_mailbox ppu2cpu_mb; 23862306a36Sopenharmony_ci struct cx18_mailbox epu2cpu_mb; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci struct cx18_mailbox cpu2apu_mb; 24162306a36Sopenharmony_ci struct cx18_mailbox hpu2apu_mb; 24262306a36Sopenharmony_ci struct cx18_mailbox ppu2apu_mb; 24362306a36Sopenharmony_ci struct cx18_mailbox epu2apu_mb; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci struct cx18_mailbox cpu2hpu_mb; 24662306a36Sopenharmony_ci struct cx18_mailbox apu2hpu_mb; 24762306a36Sopenharmony_ci struct cx18_mailbox ppu2hpu_mb; 24862306a36Sopenharmony_ci struct cx18_mailbox epu2hpu_mb; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_ci struct cx18_mailbox cpu2ppu_mb; 25162306a36Sopenharmony_ci struct cx18_mailbox apu2ppu_mb; 25262306a36Sopenharmony_ci struct cx18_mailbox hpu2ppu_mb; 25362306a36Sopenharmony_ci struct cx18_mailbox epu2ppu_mb; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci struct cx18_mailbox cpu2epu_mb; 25662306a36Sopenharmony_ci struct cx18_mailbox apu2epu_mb; 25762306a36Sopenharmony_ci struct cx18_mailbox hpu2epu_mb; 25862306a36Sopenharmony_ci struct cx18_mailbox ppu2epu_mb; 25962306a36Sopenharmony_ci 26062306a36Sopenharmony_ci struct cx18_mdl_ack cpu_mdl_ack[CX18_MAX_STREAMS][CX18_MAX_MDL_ACKS]; 26162306a36Sopenharmony_ci struct cx18_mdl_ent cpu_mdl[1]; 26262306a36Sopenharmony_ci}; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_civoid cx18_init_scb(struct cx18 *cx); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci#endif 267