linux/drivers/staging/media/atomisp/pci/css_trace.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Support for Intel Camera Imaging ISP subsystem.
   4 * Copyright (c) 2015, Intel Corporation.
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms and conditions of the GNU General Public License,
   8 * version 2, as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope it will be useful, but WITHOUT
  11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  13 * more details.
  14 */
  15
  16#ifndef __CSS_TRACE_H_
  17#define __CSS_TRACE_H_
  18
  19#include <type_support.h>
  20#include "sh_css_internal.h"    /* for SH_CSS_MAX_SP_THREADS */
  21
  22/*
  23        structs and constants for tracing
  24*/
  25
  26/* one tracer item: major, minor and counter. The counter value can be used for GP data */
  27struct trace_item_t {
  28        u8   major;
  29        u8   minor;
  30        u16  counter;
  31};
  32
  33#define MAX_SCRATCH_DATA        4
  34#define MAX_CMD_DATA            2
  35
  36/* trace header: holds the version and the topology of the tracer. */
  37struct trace_header_t {
  38        /* 1st dword: descriptor */
  39        u8   version;
  40        u8   max_threads;
  41        u16  max_tracer_points;
  42        /* 2nd field: command + data */
  43        /* 2nd dword */
  44        u32  command;
  45        /* 3rd & 4th dword */
  46        u32  data[MAX_CMD_DATA];
  47        /* 3rd field: debug pointer */
  48        /* 5th & 6th dword: debug pointer mechanism */
  49        u32  debug_ptr_signature;
  50        u32  debug_ptr_value;
  51        /* Rest of the header: status & scratch data */
  52        u8   thr_status_byte[SH_CSS_MAX_SP_THREADS];
  53        u16  thr_status_word[SH_CSS_MAX_SP_THREADS];
  54        u32  thr_status_dword[SH_CSS_MAX_SP_THREADS];
  55        u32  scratch_debug[MAX_SCRATCH_DATA];
  56};
  57
  58/* offsets for master_port read/write */
  59#define HDR_HDR_OFFSET              0   /* offset of the header */
  60#define HDR_COMMAND_OFFSET          offsetof(struct trace_header_t, command)
  61#define HDR_DATA_OFFSET             offsetof(struct trace_header_t, data)
  62#define HDR_DEBUG_SIGNATURE_OFFSET  offsetof(struct trace_header_t, debug_ptr_signature)
  63#define HDR_DEBUG_POINTER_OFFSET    offsetof(struct trace_header_t, debug_ptr_value)
  64#define HDR_STATUS_OFFSET           offsetof(struct trace_header_t, thr_status_byte)
  65#define HDR_STATUS_OFFSET_BYTE      offsetof(struct trace_header_t, thr_status_byte)
  66#define HDR_STATUS_OFFSET_WORD      offsetof(struct trace_header_t, thr_status_word)
  67#define HDR_STATUS_OFFSET_DWORD     offsetof(struct trace_header_t, thr_status_dword)
  68#define HDR_STATUS_OFFSET_SCRATCH   offsetof(struct trace_header_t, scratch_debug)
  69
  70/*
  71Trace version history:
  72 1: initial version, hdr = descr, command & ptr.
  73 2: added ISP + 24-bit fields.
  74 3: added thread ID.
  75 4: added status in header.
  76*/
  77#define TRACER_VER                      4
  78
  79#define TRACE_BUFF_ADDR       0xA000
  80#define TRACE_BUFF_SIZE       0x1000    /* 4K allocated */
  81
  82#define TRACE_ENABLE_SP0 0
  83#define TRACE_ENABLE_SP1 0
  84#define TRACE_ENABLE_ISP 0
  85
  86enum TRACE_CORE_ID {
  87        TRACE_SP0_ID,
  88        TRACE_SP1_ID,
  89        TRACE_ISP_ID
  90};
  91
  92/* TODO: add timing format? */
  93enum TRACE_DUMP_FORMAT {
  94        TRACE_DUMP_FORMAT_POINT_NO_TID,
  95        TRACE_DUMP_FORMAT_VALUE24,
  96        TRACE_DUMP_FORMAT_VALUE24_TIMING,
  97        TRACE_DUMP_FORMAT_VALUE24_TIMING_DELTA,
  98        TRACE_DUMP_FORMAT_POINT
  99};
 100
 101/* currently divided as follows:*/
 102#if (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 3)
 103/* can be divided as needed */
 104#define TRACE_SP0_SIZE (TRACE_BUFF_SIZE / 4)
 105#define TRACE_SP1_SIZE (TRACE_BUFF_SIZE / 4)
 106#define TRACE_ISP_SIZE (TRACE_BUFF_SIZE / 2)
 107#elif (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 2)
 108#if TRACE_ENABLE_SP0
 109#define TRACE_SP0_SIZE (TRACE_BUFF_SIZE / 2)
 110#else
 111#define TRACE_SP0_SIZE (0)
 112#endif
 113#if TRACE_ENABLE_SP1
 114#define TRACE_SP1_SIZE (TRACE_BUFF_SIZE / 2)
 115#else
 116#define TRACE_SP1_SIZE (0)
 117#endif
 118#if TRACE_ENABLE_ISP
 119#define TRACE_ISP_SIZE (TRACE_BUFF_SIZE / 2)
 120#else
 121#define TRACE_ISP_SIZE (0)
 122#endif
 123#elif (TRACE_ENABLE_SP0 + TRACE_ENABLE_SP1 + TRACE_ENABLE_ISP == 1)
 124#if TRACE_ENABLE_SP0
 125#define TRACE_SP0_SIZE (TRACE_BUFF_SIZE)
 126#else
 127#define TRACE_SP0_SIZE (0)
 128#endif
 129#if TRACE_ENABLE_SP1
 130#define TRACE_SP1_SIZE (TRACE_BUFF_SIZE)
 131#else
 132#define TRACE_SP1_SIZE (0)
 133#endif
 134#if TRACE_ENABLE_ISP
 135#define TRACE_ISP_SIZE (TRACE_BUFF_SIZE)
 136#else
 137#define TRACE_ISP_SIZE (0)
 138#endif
 139#else
 140#define TRACE_SP0_SIZE (0)
 141#define TRACE_SP1_SIZE (0)
 142#define TRACE_ISP_SIZE (0)
 143#endif
 144
 145#define TRACE_SP0_ADDR (TRACE_BUFF_ADDR)
 146#define TRACE_SP1_ADDR (TRACE_SP0_ADDR + TRACE_SP0_SIZE)
 147#define TRACE_ISP_ADDR (TRACE_SP1_ADDR + TRACE_SP1_SIZE)
 148
 149/* check if it's a legal division */
 150#if (TRACE_BUFF_SIZE < TRACE_SP0_SIZE + TRACE_SP1_SIZE + TRACE_ISP_SIZE)
 151#error trace sizes are not divided correctly and are above limit
 152#endif
 153
 154#define TRACE_SP0_HEADER_ADDR (TRACE_SP0_ADDR)
 155#define TRACE_SP0_HEADER_SIZE (sizeof(struct trace_header_t))
 156#define TRACE_SP0_ITEM_SIZE   (sizeof(struct trace_item_t))
 157#define TRACE_SP0_DATA_ADDR   (TRACE_SP0_HEADER_ADDR + TRACE_SP0_HEADER_SIZE)
 158#define TRACE_SP0_DATA_SIZE   (TRACE_SP0_SIZE - TRACE_SP0_HEADER_SIZE)
 159#define TRACE_SP0_MAX_POINTS  (TRACE_SP0_DATA_SIZE / TRACE_SP0_ITEM_SIZE)
 160
 161#define TRACE_SP1_HEADER_ADDR (TRACE_SP1_ADDR)
 162#define TRACE_SP1_HEADER_SIZE (sizeof(struct trace_header_t))
 163#define TRACE_SP1_ITEM_SIZE   (sizeof(struct trace_item_t))
 164#define TRACE_SP1_DATA_ADDR   (TRACE_SP1_HEADER_ADDR + TRACE_SP1_HEADER_SIZE)
 165#define TRACE_SP1_DATA_SIZE   (TRACE_SP1_SIZE - TRACE_SP1_HEADER_SIZE)
 166#define TRACE_SP1_MAX_POINTS  (TRACE_SP1_DATA_SIZE / TRACE_SP1_ITEM_SIZE)
 167
 168#define TRACE_ISP_HEADER_ADDR (TRACE_ISP_ADDR)
 169#define TRACE_ISP_HEADER_SIZE (sizeof(struct trace_header_t))
 170#define TRACE_ISP_ITEM_SIZE   (sizeof(struct trace_item_t))
 171#define TRACE_ISP_DATA_ADDR   (TRACE_ISP_HEADER_ADDR + TRACE_ISP_HEADER_SIZE)
 172#define TRACE_ISP_DATA_SIZE   (TRACE_ISP_SIZE - TRACE_ISP_HEADER_SIZE)
 173#define TRACE_ISP_MAX_POINTS  (TRACE_ISP_DATA_SIZE / TRACE_ISP_ITEM_SIZE)
 174
 175/* common majors */
 176/* SP0 */
 177#define MAJOR_MAIN              1
 178#define MAJOR_ISP_STAGE_ENTRY   2
 179#define MAJOR_DMA_PRXY          3
 180#define MAJOR_START_ISP         4
 181/* SP1 */
 182#define MAJOR_OBSERVER_ISP0_EVENT          21
 183#define MAJOR_OBSERVER_OUTPUT_FORM_EVENT   22
 184#define MAJOR_OBSERVER_OUTPUT_SCAL_EVENT   23
 185#define MAJOR_OBSERVER_IF_ACK              24
 186#define MAJOR_OBSERVER_SP0_EVENT           25
 187#define MAJOR_OBSERVER_SP_TERMINATE_EVENT  26
 188#define MAJOR_OBSERVER_DMA_ACK             27
 189#define MAJOR_OBSERVER_ACC_ACK             28
 190
 191#define DEBUG_PTR_SIGNATURE     0xABCD  /* signature for the debug parameter pointer */
 192
 193/* command codes (1st byte) */
 194typedef enum {
 195        CMD_SET_ONE_MAJOR = 1,          /* mask in one major. 2nd byte in the command is the major code */
 196        CMD_UNSET_ONE_MAJOR = 2,        /* mask out one major. 2nd byte in the command is the major code */
 197        CMD_SET_ALL_MAJORS = 3,         /* set the major print mask. the full mask is in the data DWORD */
 198        CMD_SET_VERBOSITY = 4           /* set verbosity level */
 199} DBG_commands;
 200
 201/* command signature */
 202#define CMD_SIGNATURE   0xAABBCC00
 203
 204/* shared macros in traces infrastructure */
 205/* increment the pointer cyclicly */
 206#define DBG_NEXT_ITEM(x, max_items) (((x + 1) >= max_items) ? 0 : x + 1)
 207#define DBG_PREV_ITEM(x, max_items) ((x) ? x - 1 : max_items - 1)
 208
 209#define FIELD_MASK(width) (((1 << (width)) - 1))
 210#define FIELD_PACK(value, mask, offset) (((value) & (mask)) << (offset))
 211#define FIELD_UNPACK(value, mask, offset) (((value) >> (offset)) & (mask))
 212
 213#define FIELD_VALUE_OFFSET              (0)
 214#define FIELD_VALUE_WIDTH               (16)
 215#define FIELD_VALUE_MASK                FIELD_MASK(FIELD_VALUE_WIDTH)
 216#define FIELD_VALUE_PACK(f)             FIELD_PACK(f, FIELD_VALUE_MASK, FIELD_VALUE_OFFSET)
 217#define FIELD_VALUE_UNPACK(f)           FIELD_UNPACK(f, FIELD_VALUE_MASK, FIELD_VALUE_OFFSET)
 218
 219#define FIELD_MINOR_OFFSET              (FIELD_VALUE_OFFSET + FIELD_VALUE_WIDTH)
 220#define FIELD_MINOR_WIDTH               (8)
 221#define FIELD_MINOR_MASK                FIELD_MASK(FIELD_MINOR_WIDTH)
 222#define FIELD_MINOR_PACK(f)             FIELD_PACK(f, FIELD_MINOR_MASK, FIELD_MINOR_OFFSET)
 223#define FIELD_MINOR_UNPACK(f)           FIELD_UNPACK(f, FIELD_MINOR_MASK, FIELD_MINOR_OFFSET)
 224
 225#define FIELD_MAJOR_OFFSET              (FIELD_MINOR_OFFSET + FIELD_MINOR_WIDTH)
 226#define FIELD_MAJOR_WIDTH               (5)
 227#define FIELD_MAJOR_MASK                FIELD_MASK(FIELD_MAJOR_WIDTH)
 228#define FIELD_MAJOR_PACK(f)             FIELD_PACK(f, FIELD_MAJOR_MASK, FIELD_MAJOR_OFFSET)
 229#define FIELD_MAJOR_UNPACK(f)           FIELD_UNPACK(f, FIELD_MAJOR_MASK, FIELD_MAJOR_OFFSET)
 230
 231/* for quick traces - only insertion, compatible with the regular point */
 232#define FIELD_FULL_MAJOR_WIDTH          (8)
 233#define FIELD_FULL_MAJOR_MASK           FIELD_MASK(FIELD_FULL_MAJOR_WIDTH)
 234#define FIELD_FULL_MAJOR_PACK(f)        FIELD_PACK(f, FIELD_FULL_MAJOR_MASK, FIELD_MAJOR_OFFSET)
 235
 236/* The following 2 fields are used only when FIELD_TID value is 111b.
 237 * it means we don't want to use thread id, but format. In this case,
 238 * the last 2 MSB bits of the major field will indicates the format
 239 */
 240#define FIELD_MAJOR_W_FMT_OFFSET        FIELD_MAJOR_OFFSET
 241#define FIELD_MAJOR_W_FMT_WIDTH         (3)
 242#define FIELD_MAJOR_W_FMT_MASK          FIELD_MASK(FIELD_MAJOR_W_FMT_WIDTH)
 243#define FIELD_MAJOR_W_FMT_PACK(f)       FIELD_PACK(f, FIELD_MAJOR_W_FMT_MASK, FIELD_MAJOR_W_FMT_OFFSET)
 244#define FIELD_MAJOR_W_FMT_UNPACK(f)     FIELD_UNPACK(f, FIELD_MAJOR_W_FMT_MASK, FIELD_MAJOR_W_FMT_OFFSET)
 245
 246#define FIELD_FORMAT_OFFSET             (FIELD_MAJOR_OFFSET + FIELD_MAJOR_W_FMT_WIDTH)
 247#define FIELD_FORMAT_WIDTH              (2)
 248#define FIELD_FORMAT_MASK               FIELD_MASK(FIELD_MAJOR_W_FMT_WIDTH)
 249#define FIELD_FORMAT_PACK(f)            FIELD_PACK(f, FIELD_FORMAT_MASK, FIELD_FORMAT_OFFSET)
 250#define FIELD_FORMAT_UNPACK(f)          FIELD_UNPACK(f, FIELD_FORMAT_MASK, FIELD_FORMAT_OFFSET)
 251
 252#define FIELD_TID_SEL_FORMAT_PAT        (7)
 253
 254#define FIELD_TID_OFFSET                (FIELD_MAJOR_OFFSET + FIELD_MAJOR_WIDTH)
 255#define FIELD_TID_WIDTH                 (3)
 256#define FIELD_TID_MASK                  FIELD_MASK(FIELD_TID_WIDTH)
 257#define FIELD_TID_PACK(f)               FIELD_PACK(f, FIELD_TID_MASK, FIELD_TID_OFFSET)
 258#define FIELD_TID_UNPACK(f)             FIELD_UNPACK(f, FIELD_TID_MASK, FIELD_TID_OFFSET)
 259
 260#define FIELD_VALUE_24_OFFSET           (0)
 261#define FIELD_VALUE_24_WIDTH            (24)
 262#define FIELD_VALUE_24_MASK             FIELD_MASK(FIELD_VALUE_24_WIDTH)
 263#define FIELD_VALUE_24_PACK(f)          FIELD_PACK(f, FIELD_VALUE_24_MASK, FIELD_VALUE_24_OFFSET)
 264#define FIELD_VALUE_24_UNPACK(f)        FIELD_UNPACK(f, FIELD_VALUE_24_MASK, FIELD_VALUE_24_OFFSET)
 265
 266#define PACK_TRACEPOINT(tid, major, minor, value)       \
 267        (FIELD_TID_PACK(tid) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
 268
 269#define PACK_QUICK_TRACEPOINT(major, minor)     \
 270        (FIELD_FULL_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor))
 271
 272#define PACK_FORMATTED_TRACEPOINT(format, major, minor, value)  \
 273        (FIELD_TID_PACK(FIELD_TID_SEL_FORMAT_PAT) | FIELD_FORMAT_PACK(format) | FIELD_MAJOR_PACK(major) | FIELD_MINOR_PACK(minor) | FIELD_VALUE_PACK(value))
 274
 275#define PACK_TRACE_VALUE24(major, value)        \
 276        (FIELD_TID_PACK(FIELD_TID_SEL_FORMAT_PAT) | FIELD_MAJOR_PACK(major) | FIELD_VALUE_24_PACK(value))
 277
 278#endif /* __CSS_TRACE_H_ */
 279