/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved. */ #ifndef __IRIS_HFI_QUEUE_H__ #define __IRIS_HFI_QUEUE_H__ struct iris_core; /* * Max 64 Buffers ( 32 input buffers and 32 output buffers) * can be queued by v4l2 framework at any given time. */ #define IFACEQ_MAX_BUF_COUNT 64 /* * Max session supported are 16. * this value is used to calcualte the size of * individual shared queue. */ #define IFACE_MAX_PARALLEL_SESSIONS 16 #define IFACEQ_DFLT_QHDR 0x0101 #define IFACEQ_MAX_PKT_SIZE 1024 /* Maximum size of a packet in the queue */ /* * SFR: Subsystem Failure Reason * when hardware goes into bad state/failure, firmware fills this memory * and driver will get to know the actual failure reason from this SFR buffer. */ #define SFR_SIZE SZ_4K /* Iris hardware requires 4K queue alignment */ #define IFACEQ_QUEUE_SIZE (IFACEQ_MAX_PKT_SIZE * \ IFACEQ_MAX_BUF_COUNT * IFACE_MAX_PARALLEL_SESSIONS) /* * Memory layout of the shared queues: * * ||=================|| ^ ^ ^ * || || | | | * || Queue Table || 288 Bytes | | * || Header || | | | * || || | | | * ||-----------------|| V | | * ||-----------------|| ^ | | * || || | | | * || Command Queue || 56 Bytes | | * || Header || | | | * || || | | | * ||-----------------|| V 456 Bytes | * ||-----------------|| ^ | | * || || | | | * || Message Queue || 56 Bytes | | * || Header || | | | * || || | | | * ||-----------------|| V | Buffer size aligned to 4k * ||-----------------|| ^ | Overall Queue Size = 2,404 KB * || || | | | * || Debug Queue || 56 Bytes | | * || Header || | | | * || || | | | * ||=================|| V V | * ||=================|| ^ | * || || | | * || Command || 800 KB | * || Queue || | | * || || | | * ||=================|| V | * ||=================|| ^ | * || || | | * || Message || 800 KB | * || Queue || | | * || || | | * ||=================|| V | * ||=================|| ^ | * || || | | * || Debug || 800 KB | * || Queue || | | * || || | | * ||=================|| V | * || || | * ||=================|| V */ /* * Shared queues are used for communication between driver and firmware. * There are 3 types of queues: * Command queue - driver to write any command to firmware. * Message queue - firmware to send any response to driver. * Debug queue - firmware to write debug message. */ /* Host-firmware shared queue ids */ enum iris_iface_queue { IFACEQ_CMDQ_ID, IFACEQ_MSGQ_ID, IFACEQ_DBGQ_ID, IFACEQ_NUMQ, /* not an index */ }; /** * struct iris_hfi_queue_header * * @status: Queue status, bits (7:0), 0x1 - active, 0x0 - inactive * @start_addr: Queue start address in non cached memory * @queue_type: Queue ID * @header_type: Default queue header * @q_size: Queue size * Number of queue packets if pkt_size is non-zero * Queue size in bytes if pkt_size is zero * @pkt_size: Size of queue packet entries * 0x0: variable queue packet size * non zero: size of queue packet entry, fixed * @pkt_drop_cnt: Number of packets dropped by sender * @rx_wm: Receiver watermark, applicable in event driven mode * @tx_wm: Sender watermark, applicable in event driven mode * @rx_req: Receiver sets this bit if queue is empty * @tx_req: Sender sets this bit if queue is full * @rx_irq_status: Receiver sets this bit and triggers an interrupt to * the sender after packets are dequeued. Sender clears this bit * @tx_irq_status: Sender sets this bit and triggers an interrupt to * the receiver after packets are queued. Receiver clears this bit * @read_idx: Index till where receiver has consumed the packets from the queue. * @write_idx: Index till where sender has written the packets into the queue. */ struct iris_hfi_queue_header { u32 status; u32 start_addr; u16 queue_type; u16 header_type; u32 q_size; u32 pkt_size; u32 pkt_drop_cnt; u32 rx_wm; u32 tx_wm; u32 rx_req; u32 tx_req; u32 rx_irq_status; u32 tx_irq_status; u32 read_idx; u32 write_idx; }; /** * struct iris_hfi_queue_table_header * * @version: Queue table version number * @size: Queue table size from version to last parametr in qhdr entry * @qhdr0_offset: Offset to the start of first qhdr * @qhdr_size: Queue header size in bytes * @num_q: Total number of queues in Queue table * @num_active_q: Total number of active queues * @device_addr: Device address of the queue * @name: Queue name in characters * @q_hdr: Array of queue headers */ struct iris_hfi_queue_table_header { u32 version; u32 size; u32 qhdr0_offset; u32 qhdr_size; u32 num_q; u32 num_active_q; void *device_addr; char name[256]; /* NUL-terminated array of characters */ struct iris_hfi_queue_header q_hdr[IFACEQ_NUMQ]; }; struct iris_iface_q_info { struct iris_hfi_queue_header *qhdr; dma_addr_t device_addr; void *kernel_vaddr; }; int iris_hfi_queues_init(struct iris_core *core); void iris_hfi_queues_deinit(struct iris_core *core); int iris_hfi_queue_cmd_write_locked(struct iris_core *core, void *pkt, u32 pkt_size); int iris_hfi_queue_cmd_write(struct iris_core *core, void *pkt, u32 pkt_size); int iris_hfi_queue_msg_read(struct iris_core *core, void *pkt); int iris_hfi_queue_dbg_read(struct iris_core *core, void *pkt); #endif