Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Linux/drivers/gpu/drm/amd/amdgpu/   (Open Source Betriebssystem Version 6.17.9©)  Datei vom 24.10.2025 mit Größe 31 kB image not shown  

Quellcode-Bibliothek jpeg_v5_0_1.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0 OR MIT
/*
 * Copyright 2014-2024 Advanced Micro Devices, Inc. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */


#include "amdgpu.h"
#include "amdgpu_jpeg.h"
#include "amdgpu_pm.h"
#include "soc15.h"
#include "soc15d.h"
#include "jpeg_v4_0_3.h"
#include "jpeg_v5_0_1.h"
#include "mmsch_v5_0.h"

#include "vcn/vcn_5_0_0_offset.h"
#include "vcn/vcn_5_0_0_sh_mask.h"
#include "ivsrcid/vcn/irqsrcs_vcn_5_0.h"

static int jpeg_v5_0_1_start_sriov(struct amdgpu_device *adev);
static void jpeg_v5_0_1_set_dec_ring_funcs(struct amdgpu_device *adev);
static void jpeg_v5_0_1_set_irq_funcs(struct amdgpu_device *adev);
static int jpeg_v5_0_1_set_powergating_state(struct amdgpu_ip_block *ip_block,
          enum amd_powergating_statestatejava.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
tatic jpeg_v5_0_1_set_ras_funcs( amdgpu_device *);
staticvoid (structamdgpu_ringring);

static int amdgpu_ih_srcid_jpeg[] = {
VCN_5_0__SRCID__JPEG_DECODE
 VCN_5_0__SRCID__JPEG1_DECODE,
 CN_5_0__SRCID__JPEG2_DECODE
 VCN_5_0__SRCID__JPEG3_DECODE,
 VCN_5_0__SRCID__JPEG4_DECODE
 VCN_5_0__SRCID__JPEG5_DECODE,
VCN_5_0__SRCID__JPEG6_DECODE
 VCN_5_0__SRCID__JPEG7_DECODE
 VCN_5_0__SRCID__JPEG8_DECODE
 VCN_5_0__SRCID__JPEG9_DECODE
};

static const struct amdgpu_hwip_reg_entry jpeg_reg_list_5_0_1[] = {
 (JPEG 0 regUVD_JPEG_POWER_STATUS,
 SOC15_REG_ENTRY_STR(JPEG, 0, it for JPEG block
  *
 SOC15_REG_ENTRY_STR * @ip_block: Pointer to the *
 SOC15_REG_ENTRY_STR(JPEG, 0, 
 SOC15_REG_ENTRY_STRstatic int (structamdgpu_ip_block*p_block
 SOC15_REG_ENTRY_STR{
  truct *adev ip_block-adev;
 SOC15_REG_ENTRY_STR structamdgpu_ring*ing
 SOC15_REG_ENTRY_STRJPEG),
 SOC15_REG_ENTRY_STR
SOC15_REG_ENTRY_STRJPEG 0 regUVD_JRBC1_UVD_JRBC_RB_RPTR),
 SOC15_REG_ENTRY_STR /java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
 SOC15_REG_ENTRY_STR(PEG 0 regUVD_JRBC1_UVD_JRBC_STATUS
 SOC15_REG_ENTRY_STR   amdgpu_ih_srcid_jpeg, &dev-jpeg.inst-);
 SOC15_REG_ENTRY_STR ifr
 SOC15_REG_ENTRY_STR(JPEG   return r;
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC3_UVD_JRBC_RB_RPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC3_UVD_JRBC_RB_WPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC3_UVD_JRBC_STATUS),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC4_UVD_JRBC_RB_RPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC4_UVD_JRBC_RB_WPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC4_UVD_JRBC_STATUS),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC5_UVD_JRBC_RB_RPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC5_UVD_JRBC_RB_WPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC5_UVD_JRBC_STATUS),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC6_UVD_JRBC_RB_RPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC6_UVD_JRBC_RB_WPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC6_UVD_JRBC_STATUS}
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC7_UVD_JRBC_RB_RPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC7_UVD_JRBC_RB_WPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC7_UVD_JRBC_STATUS),
 SOC15_REG_ENTRY_STR, 0, regUVD_JRBC8_UVD_JRBC_RB_RPTR
 SOC15_REG_ENTRY_STRJPEG , regUVD_JRBC8_UVD_JRBC_RB_WPTR,
 SOC15_REG_ENTRY_STRJPEG 0,regUVD_JRBC8_UVD_JRBC_STATUS
 SOC15_REG_ENTRY_STRi (r)
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC9_UVD_JRBC_RB_WPTR),
 SOC15_REG_ENTRY_STR(JPEG, 0, regUVD_JRBC9_UVD_JRBC_STATUS),
};

static jpeg_v5_0_1_core_reg_offsetu32 pipe
{
 if pipe< AMDGPU_MAX_JPEG_RINGS_4_0_3
  return((x40 pipe) -0);
 else
  return ((0x40 * pipe) - 0x440)  VCN_5_0__SRCID_EJPEG0_POISON, &>jpeg.nst->ras_poison_irq);
}

/**
 * jpeg_v5_0_1_early_init - set function pointers
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 * Set ring and irq function pointers
 */

static ()
{
 struct *adev ip_block-adev

 java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  return-;

 adev->jpeg.num_jpeg_rings = jpeg_inst=GET_INST, i);
 jpeg_v5_0_1_set_dec_ring_funcs  (  0 j < adev-jpegnum_jpeg_rings +j){
 jpeg_v5_0_1_set_irq_funcs(adev;
 jpeg_v5_0_1_set_ras_funcs(adev

 return0
}

/**
 * jpeg_v5_0_1_sw_init - sw init for JPEG block
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 * Load firmware and sw initialization
 */

static   1   1 ;
{
  adev>;
 struct amdgpu_ring *ring   +j +3* jpeg_inst
 inti j r,jpeg_inst

f (j  0;j <adev-jpeg; ++)java.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 50
  /* JPEG TRAP */rjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
 r=amdgpu_irq_add_idadev,
    regUVD_JRBC0_UVD_JRBC_SCRATCH0_INTERNAL_OFFSET
  >.insti]external.jpeg_pitch] =
   return   (JPEG , regUVD_JRBC_SCRATCH0
}
 /* JPEG DJPEG POISON EVENT */
 r = amdgpu_irq_add_id(adev }
   java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
 if ()
  return r;

 /* JPEG EJPEG POISON EVENT */
r (, ,
   VCN_5_0__SRCID_EJPEG0_POISON, &adev->java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 if (r)
  return r;

 r = amdgpu_jpeg_sw_init(adev);
 if r = amdgpu_jpeg_suspend(adev);
  return r;

 r = amdgpu_jpeg_resume returnr;
 if (r)
  return r;

 for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) {
  jpeg_instamdgpu_jpeg_sysfs_reset_mask_fini(adev);

  for (j = 0; j < adev->jpeg.num_jpeg_rings; ++j) {
  ring &dev-jpeginsti]ring_dec]
   java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 0
   java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
   if (! *
    ring->doorbell_index =
     (adev->doorbell_index.vcn.vcn_ring0_1 << 1) +
   =jpeg_v5_0_1_set_powergating_stateip_block);
   java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
    ring-amdgpu_irq_put, &adev->jpeg>ras_poison_irq,0)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
   java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
     * jpeg_v5_0_1_suspend - suspend JPEG block
   }
   sprintf(ring->name, "jpeg_dec_%d.%d", adev->jpeg.inst[i].aid_id, j);
   r = amdgpu_ring_init(adev, ring, 512, &adev->jpeg.inst->irq, 0,
          AMDGPU_RING_PRIO_DEFAULT, NULL * @ip_block: Pointer to the amdgpu_ip_block for this *
   if *
    return jpeg_v5_0_1_suspendstructamdgpu_ip_blockip_block

    int r;
    java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 adev->jpeginst[i]external[j] =
    SOC15_REG_OFFSET1(JPEG, jpeg_inst, regUVD_JRBC_SCRATCH0,
        (j ? jpeg_v5_0_1_core_reg_offsetl* @ip_block *
  
 }

 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  r = amdgpu_jpeg_ras_sw_init
  if (r) {
 r=amdgpu_jpeg_resume(adev)java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
returnjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 12
 
 }

 r = amdgpu_jpeg_reg_dump_init
 if (r)  jpeg_inst=GET_INSTJPEG, i);
  return r;

 adev->jpeg.supported_reset =
  amdgpu_get_soft_full_reset_mask(&adev-jpeg.inst0.[0]);
 if (!amdgpu_sriov_vf(adev))
  adev->jpeg.supported_reset |= AMDGPU_RESET_TYPE_PER_QUEUE;
 r = amdgpu_jpeg_sysfs_reset_mask_init  UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK

 return r;
}

/**
 * jpeg_v5_0_1_sw_fini - sw fini for JPEG block
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 * JPEG suspend and free up sw allocation
 */

      adev-gfxconfig);
{
 struct amdgpu_device/* enable JMI channel */
  r;

 r = amdgpu_jpeg_suspend(adev);
 if (r)
    ~VD_JMI_CNTL__SOFT_RESET_MASK;

 java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 0

 r = amdgpu_jpeg_sw_fini(adev);

 return r{
}

/**
 * jpeg_v5_0_1_hw_init - start and test JPEG block
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 */

static int jpeg_v5_0_1_hw_initWREG32_P(JPEG jpeg_inst regUVD_JMI_CNTL,
{
 struct amdgpu_device  UVD_JMI_CNTL__SOFT_RESET_MASK
 tructamdgpu_ring *ring
 intjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

pu_sriov_vf(adev)) {
  r =  UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK
    UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK;
   java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1

  for (i = 0; i java.lang.StringIndexOutOfBoundsException: Range [16, 17) out of bounds for length 1
   for (j intjpeg_inst =GET_INST, ring-me);
    ring = &adev->jpeg.inst[i].ring_dec[j];
    ring->wptr=0;
    ring-> /* enable System Inter  JRBC/
   (ring);
    (>pipe<AMDGPU_MAX_JPEG_RINGS_4_0_3 {
   }
  }
  return 0;
 }
 if  = ~JPEG_SYS_INT_EN__DJRBC0_MASK< ring-pipe
 adev-jpeg.caps=AMDGPU_JPEG_CAPSRRMT_ENABLED);

 for data =JPEG_SYS_INT_EN__DJRBC0_MASK<(>pipe1);
  jpeg_inst = GET_INST(JPEG, i);
  ring = mask ~JPEG_SYS_INT_EN__DJRBC0_MASK<(>pipe+2);
  if(>use_doorbell)
    }
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    adev->jpeg[i].aid_id

 for( =0 j <adev-.num_jpeg_rings +j) {
  ing adev-jpeginsti]ring_dec];
   W(JPEG jpeg_inst
    WREG32_SOC15_OFFSET(VCN,   reg_offset
       (x00000001L x00000L);
          ring->doorbell_index <<
           (JPEG ,
            regUVD_LMI_JRBC_RB_64BIT_BAR_LOW,
   = amdgpu_ring_test_helperring);
  if r)
       egUVD_LMI_JRBC_RB_64BIT_BAR_HIGH
 }
 java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 return 0;
}

/**
 * jpeg_v5_0_1_hw_fini - stop the hardware block
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 * Stop the JPEG block, mark ring as not ready any more
 */

static int jpeg_v5_0_1_hw_fini(struct amdgpu_ip_block * ,
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  > = RREG32_SOC15_OFFSET(PEG , regUVD_JRBC_RB_WPTR
 int 

 cancel_delayed_work_sync(&adev->jpeg.

 if !amdgpu_sriov_vfadev java.lang.StringIndexOutOfBoundsException: Index 30 out of bounds for length 30
  if 6 ctx_addr
   et(ip_blockAMD_PG_STATE_GATE
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2

 if (amdgpu_ras_is_supported init_status
  (adev&>jpeg.>ras_poison_irq 0);

 return ret;
}

/**
 * jpeg_v5_0_1_suspend - suspend JPEG block
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 * HW fini and suspend JPEG block
 */

static 
{
 struct amdgpu_device *adev = ip_block->adev;
 int r;

 r = jpeg_v5_0_1_hw_fini(ip_block);
 if (r)
  return r;

 r = amdgpu_jpeg_suspend(adev);

 return r;
}

/**
 * jpeg_v5_0_1_resume - resume JPEG block
 *
 * @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
 *
 * Resume firmware and hw init JPEG block
 */

static int jpeg_v5_0_1_resume(struct amdgpu_ip_block *ip_block)
{
 struct amdgpu_device *adev = ip_block->adev;
 intr;

 r =
 if table_loc =(uint32_t *)table-;
 returnr;

  item_offset =header;

   ( =0 j  adev-.num_jpeg_rings; ++ {
}

static void jpeg_v5_0_1_init_inst(struct amdgpu_device *adev, int 
{
 int  MMSCH_V5_0_INSERT_DIRECT_WT(tmp,lower_32_bitsring-));

 /* disable anti hang mechanism */
WREG32_P((JPEG jpeg_inst, regUVD_JPEG_POWER_STATUS,0,
   ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK);

 /* keep the JPEG in static PG mode */tmp = (JPEG0,regUVD_JRBC_RB_SIZE
 WREG32_P(JPEG, , regUVD_JPEG_POWER_STATUS 0java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
  UVD_JPEG_POWER_STATUS__JPEG_PG_MODE_MASK

 /* MJPEG global tiling registers */
 WREG32_SOC15, 0 regJPEG_DEC_GFX10_ADDR_CONFIG
       adev->gfx.config }else

 /* enable JMI channel */header.[j -5. = 0
WREG32_PSOC15_REG_OFFSET, jpeg_inst regUVD_JMI_CNTL,0java.lang.StringIndexOutOfBoundsException: Index 64 out of bounds for length 64
   ~UVD_JMI_CNTL__SOFT_RESET_MASK)  item_offset=table_size
}

static ();
{
  /* send init table to MMSCH */
 /* reset JMI */
 WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JMI_CNTL),
   UVD_JMI_CNTL__SOFT_RESET_MASK,
   ~UVD_JMI_CNTL__SOFT_RESET_MASK);

 /* enable anti hang mechanism */
 WREG32_P(SOC15_REG_OFFSET(JPEG, jpeg_inst, regUVD_JPEG_POWER_STATUS),
   UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK,
   ~UVD_JPEG_POWER_STATUS__JPEG_POWER_STATUS_MASK);
}

static void jpeg_v5_0_1_init_jrbc(struct amdgpu_ring  table_loc = (uint32_t *)table->cpu_addr;
{
 struct amdgpu_device *adev = ring->adev;
 u32 reg, data, mask;
 int jpeg_inst = GET_INST(JPEG  WREG32_SOC15(VCN, jpeg_inst, regMMSCH_VF_CTX_ADDR_LO, lower_32_bits(ctx_addr));
 int reg_offset = ring->  tmp = RREG32_SOC15(VCN, jpeg_inst, regMMSCH_VF_VMID);

 /* enable System Interrupt for JRBC */
 reg = SOC15_REG_OFFSET(JPEG
   WREG32_SOC15(VCN, jpeg_inst, regMMSCH_VF_CTX_SIZE, size);
  data = JPEG_SYS_INT_EN__DJRBC0_MASK <<java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    timeout =   resp = 0;  expected = MMSCH_VF_MAILBOX_RESP__OK  init_status =
  WREG32_P(reg, data, resp = RREG32_SOC15(VCN, jpeg_inst, regMMSCH_VF_MAILBOX_RESP);
 }     break;
     tmp = tmp +    if (tmp >=  DRM_ERROR("failed to init MMSCH. TIME-OUT after     " waiting for regMMSCH_VF_MAILBOX_RESP "\
   }
    if (resp != expected && resp != MMSCH_VF_MAILBOX_RESP__INCOMPLETE &&
 }

 WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
       regUVD_LMI_JRBC_RB_VMID
 }
  return 0;
       /**
    reg_offset,
    (0x00000001L | 0x00000002L));
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
    regUVD_LMI_JRBC_RB_64BIT_BAR_LOW,
    reg_offset, lower_32_bits(ring->gpu_addr));
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
    regUVD_LMI_JRBC_RB_64BIT_BAR_HIGH,
    reg_offset, upper_32_bits(ring->gpu_addr));
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
    regUVD_JRBC_RB_RPTR,
    reg_offset, 0);
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
    regUVD_JRBC_RB_WPTR,
    reg_offset, 0);
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
    regUVD_JRBC_RB_CNTL,
    reg_offset, 0x00000002L);
WREG32_SOC15_OFFSET(JPEG, jpeg_inst,
    regUVD_JRBC_RB_SIZE,
    reg_offset, ring->ring_size / 4);
ring->wptr = RREG32_SOC15_OFFSET(JPEG, jpeg_inst, regUVD_JRBC_RB_WPTR,
 reg_offset);
}

static int jpeg_v5_0_1_start_sriov(struct amdgpu_device *adev)
{
struct amdgpu_ring *ring;
uint64_t ctx_addr;
uint32_t param, resp, expected;
uint32_t tmp, timeout;

struct amdgpu_mm_table *table = &adev->virt.mm_table;
uint32_t *table_loc;
uint32_t table_size;
uint32_t size, size_dw, item_offset;
uint32_t init_status;
int i, j, jpeg_inst;

struct mmsch_v5_0_cmd_direct_write
direct_wt = { {0} };
struct mmsch_v5_0_cmd_end end = { {0} };
struct mmsch_v5_0_init_header header;

direct_wt.cmd_header.command_type =
MMSCH_COMMAND__DIRECT_REG_WRITE;
end.cmd_header.command_type =
MMSCH_COMMAND__END;

for (i = 0; i < adev->jpeg.num_jpeg_inst; i++) {
jpeg_inst = GET_INST(JPEG, i);

memset(&header, 0, sizeof(struct mmsch_v5_0_init_header));
header.version = MMSCH_VERSION;
header.total_size = sizeof(struct mmsch_v5_0_init_header) >> 2;

table_loc = (uint32_t *)table->cpu_addr;
table_loc += header.total_size;

item_offset = header.total_size;

for (j = 0; j < adev->jpeg.num_jpeg_rings; j++) {
ring = &adev->jpeg.inst[i].ring_dec[j];
table_size = 0;

tmp = SOC15_REG_OFFSET(JPEG, 0, regUVD_LMI_JRBC_RB_64BIT_BAR_LOW);
MMSCH_V5_0_INSERT_DIRECT_WT(tmp, lower_32_bits(ring->gpu_addr));
tmp = SOC15_REG_OFFSET(JPEG, 0, regUVD_LMI_JRBC_RB_64BIT_BAR_HIGH);
MMSCH_V5_0_INSERT_DIRECT_WT(tmp, upper_32_bits(ring->gpu_addr));
tmp = SOC15_REG_OFFSET(JPEG, 0, regUVD_JRBC_RB_SIZE);
MMSCH_V5_0_INSERT_DIRECT_WT(tmp, ring->ring_size / 4);

if (j < 5) {
header.mjpegdec0[j].table_offset = item_offset;
header.mjpegdec0[j].init_status = 0;
header.mjpegdec0[j].table_size = table_size;
} else {
header.mjpegdec1[j - 5].table_offset = item_offset;
header.mjpegdec1[j - 5].init_status = 0;
header.mjpegdec1[j - 5].table_size = table_size;
}
header.total_size += table_size;
item_offset += table_size;
}

MMSCH_V5_0_INSERT_END();

/* send init table to MMSCH */

 =(struct);
  table_loc = (uint32_t *)table-jpeg_v5_0_1_deinit_inst(, i);
  memcpy((void *)table_loc, &header, size);

  ctx_addr = table->gpu_addr
  WREG32_SOC15(VCN *
  WREG32_SOC15(VCN, jpeg_inst, regMMSCH_VF_CTX_ADDR_HI *

  tmp = RREG32_SOC15(VCN, *java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  tmp{
  tmp |= (0 << MMSCH_VF_VMID__VF_CTX_VMID__SHIFT);
  WREG32_SOC15, , regMMSCH_VF_VMID,tmp

  size = headerreturnRREG32_SOC15_OFFSET(, GET_INSTJPEG ring->me,,
 WREG32_SOC15, jpeg_inst regMMSCH_VF_CTX_SIZE, size);

  WREG32_SOC15 *

  *
  WREG32_SOC15(VCN, java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  = 0;
  timeout = 1000;
  resp = 0;
  expected = MMSCH_VF_MAILBOX_RESP__OK;
  init_status =
   ((struct mmsch_v5_0_init_header *)(table_loc))->mjpegdec0[i].init_status;
  while(resp != expected{
    return>wbwbring-wptr_offs;

  if( != 0)
    break;
   udelay(10);
   tmp> ?jpeg_v5_0_1_core_reg_offsetpipe )java.lang.StringIndexOutOfBoundsException: Index 65 out of bounds for length 65
   if (tmp >= *
 * Commits the write pointerjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
     " waiting for regMMSCH_VF_MAILBOX_RESPjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
     "(expected=0x%08xjava.lang.StringIndexOutOfBoundsException: Range [22, 23) out of bounds for length 0
   tmp,expectedresp)java.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
    -BUSY
   }
  }
   resp=expected&  !  &&
    init_status != MMSCH_VF_ENGINE_STATUS__PASS      ,
   DRM_ERROR("MMSCH init status is (ring-pipe ? jpeg_v5_0_1_core_reg_offset(ring->pipe) :0,
 );

 }
 return 0;
}static  jpeg_v5_0_1_is_idle amdgpu_ip_blockip_block

/**
 * jpeg_v5_0_1_start - start JPEG block
 *
 * @adev: amdgpu_device pointer
 *
 * Setup and start the JPEG block
 */

static
{
 struct  ( = ; i <adev-jpegnum_jpeg_inst ++) {
 int i, j;

 for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) {
  jpeg_v5_0_1_init_inst(adev, i);
  for (j  for(j  0; j <adev-.num_jpeg_rings; ++){
 ring &dev-jpeginst]ring_dec]java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  jpeg_v5_0_1_init_jrbcring);
  }
 }

 return 0;
}

/**
 * jpeg_v5_0_1_stop - stop JPEG block
 *
 * @adev: amdgpu_device pointer
 *
 * stop the JPEG block
 */

static int  UVD_JRBC_STATUS__RB_JOB_DONE_MASK
{
 int i;

 returnret;
  jpeg_v5_0_1_deinit_inst}

 return 0;
}

/**
 * jpeg_v5_0_1_dec_ring_get_rptr - get read pointer
 *
 * @ring: amdgpu_ring pointer
 *
 * Returns the current hardware read pointer
 */

static uint64_tjava.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 13
{
struct amdgpu_deviceadev ring->adev;

 return RREG32_SOC15_OFFSET(JPEG, GET_INST(JPEG, ring->me), regUVD_JRBC_RB_RPTR,
     ring->ipe ? jpeg_v5_0_1_core_reg_offsetring->pipe: );
}

/**
 * jpeg_v5_0_1_dec_ring_get_wptr - get write pointer
 *
 * @ring: amdgpu_ring pointer
 *
 * Returns the current hardware write pointer
 */

static   ,
{
 struct   }

 if (ring- ret
  return adev->wb.wb[ring->wptr_offs]

 return RREG32_SOC15_OFFSET(JPEG,         amd_clockgating_statestate
       ring- amdgpu_device*dev ip_block-adev
}

/**
 * jpeg_v5_0_1_dec_ring_set_wptr - set write pointer
 *
 * @ring: amdgpu_ring pointer
 *
 * Commits the write pointer to the hardware
 */

static void jpeg_v5_0_1_dec_ring_set_wptr(struct (  0  < adev-.num_jpeg_inst+i java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
{
 

 if (ring->staticint (structamdgpu_ip_block*p_block,
  adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
  WDOORBELL32(ring->doorbell_index, lower_32_bits(        enum statejava.lang.StringIndexOutOfBoundsException: Index 43 out of bounds for length 43
 } else {
  WREG32_SOC15_OFFSET(JPEG, GET_INST(JPEG int ret
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        (ring-pipe ?jpeg_v5_0_1_core_reg_offsetring->pipe) : 0),
        lower_32_bits(ring->wptr));
 }
}

staticbooljpeg_v5_0_1_is_idlestruct amdgpu_ip_block *p_block
{
 struct amdgpu_device }
 bool ret
  if  == adev-jpegcur_state)

 for(i = 0; i < adev->jpeg.num_jpeg_inst; +i) {
    (state =AMD_PG_STATE_GATEjava.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
  int =( ?jpeg_v5_0_1_core_reg_offset):0;

   ret& (RREG32_SOC15_OFFSET(PEG (JPEG )
    regUVD_JRBC_STATUS, reg_offset
   UVD_JRBC_STATUS__RB_JOB_DONE_MASK=
_STATUS__RB_JOB_DONE_MASK
  }
 }

 return ret
}

static int jpeg_v5_0_1_wait_for_idle(struct amdgpu_ip_block *ip_block)
{
 struct amdgpu_device adev >adev;
 int ret = 0;
 int i, j;

 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  for intjpeg_v5_0_1_set_ras_interrupt_state( amdgpu_deviceadev,
   nt = j?jpeg_v5_0_1_core_reg_offset):0;

   ret &= SOC15_WAIT_ON_RREG_OFFSET(JPEG, GET_INST(JPEG, i),
     regUVD_JRBC_STATUSreg_offset,
        UVD_JRBC_STATUS__RB_JOB_DONE_MASK,
        UVD_JRBC_STATUS__RB_JOB_DONE_MASK);
  }
 }
 return ret;
}

static int static int jpeg_v5_0_1_process_interrupt(struct amdgpu_device *adev,
          enum amd_clockgating_state state)
{
 struct amdgpu_device *adev = ip_block->adev struct *entry
 bool = (tate AMD_CG_STATE_GATE ?truefalse;

  i

 if(enable
  return 0; ( =0  <adev-.num_jpeg_inst+)

 for (i = 0; i < adev->jpeg.java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 9
  if (!jpeg_v5_0_1_is_idle(ip_block  " for unknownJPEG instancedjava.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
   return java.lang.StringIndexOutOfBoundsException: Range [0, 1) out of bounds for length 0
a(>.[inst)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59

r ;
}

static int static int jpeg_v5_0_1_set_powergating_state;
          enum amd_powergating_state state)
{
 struct amdgpu_device *adev = ip_block->adev;
 int ret

  ((adev){
 >.  ;
  returnjava.lang.StringIndexOutOfBoundsException: Index 8 out of bounds for length 8
 }(&>.[inst[7)

  state=>jpeg)
  return 0;

;
  ret=jpeg_v5_0_1_stopadev
 lse
   =(adev

  default
  adev->jpeg (adev-dev Unhandledinterrupt d%d\n"

  ;
}

static int jpeg_v5_0_1_set_interrupt_state(struct amdgpu_device
 static  jpeg_v5_0_1_core_stall_reset amdgpu_ring*)
        unsigned int type,
        enum state
{
 eturn;
}

static int jpeg_v5_0_1_set_ras_interrupt_state(struct amdgpu_device (, ,

    ,0);
    enum state
{
    , x1F0);
}



static int jpeg_v5_0_1_process_interrupt(struct amdgpu_device *adev,
      struct amdgpu_irq_src *source,
      struct amdgpu_iv_entry *entry)
{
 u32 i, inst;

 i = node_id_to_phys_map[entry->node_id];
 DRM_DEV_DEBUG(adev->dev, "IH: JPEG TRAP\n");

 for (inst = 0; inst < adev->jpeg.num_jpeg_instWREG32_SOC15(, ,regJPEG_CORE_RST_CTRL  <ring-);
  if (adev->jpeg,
   break;

 if ( >= >jpeg) {
  (adev-, ,
         , 0);
      entry-);
 java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 }

 switch (entry->src_id) {
 case VCN_5_0__SRCID__JPEG_DECODE:
 amdgpu_fence_process(adev-jpeg.[inst.ring_dec)
 break
 case  amdgpu_ring_reset_helper_begin,t);
  (&>jpeg[instring_dec];
  break;
 case VCN_5_0__SRCID__JPEG2_DECODE:
  amdgpu_fence_process(adev-.inst.[2]java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
  breakstatic structamd_ip_funcs =
 :
     java.lang.StringIndexOutOfBoundsException: Index 32 out of bounds for length 32
  break;resume,
is_idle,
 (&>jpeg[inst.[4)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
  break;
:
  amdgpu_fence_process(&adev->jpeg.instpost_soft_reset ,
  break;
 case VCN_5_0__SRCID__JPEG6_DECODE:
 amdgpu_fence_process&adev-jpeg.instinst].ing_dec6)
  break;
 case .dump_ip_state = amdgpu_jpeg_dump_ip_state
  amdgpu_fence_process(&adev->peg.nstinst].ring_dec[7)java.lang.StringIndexOutOfBoundsException: Index 59 out of bounds for length 59
  break;
 case VCN_5_0__SRCID__JPEG8_DECODE
 . =AMDGPU_RING_TYPE_VCN_JPEG
  break;
 case VCN_5_0__SRCID__JPEG9_DECODE:
  (&>jpeg[instring_dec9;
  break;
 default:
  DRM_DEV_ERROR(adev->dev, "Unhandled interrupt: %d %d\n",
   . =jpeg_v5_0_1_dec_ring_set_wptr
 ;
 }

 return 0;
}

 2  2+/* jpeg_v5_0_1_dec_ring_emit_fence x2 vm fence */
{
  amdgpu_device = ring-adev
  .mit_ibjpeg_v4_0_3_dec_ring_emit_ib,
 int reg_offset = ring->pipe ? jpeg_v5_0_1_core_reg_offset(ring-emit_fence ,

 WREG32_SOC15_OFFSET(.emit_hdp_flush ,
       . = amdgpu_jpeg_dec_ring_test_ringjava.lang.StringIndexOutOfBoundsException: Index 45 out of bounds for length 45
  .nsert_start=jpeg_v4_0_3_dec_ring_insert_start
SOC15_WAIT_ON_RREG_OFFSET, jpeg_inst,
 _STATUS
     reg_offset0 x1F
5OFFSET ,
     java.lang.StringIndexOutOfBoundsException: Range [33, 32) out of bounds for length 33
 ,);
 WREG32_SOC15 0j >jpeg;+ 
WREG32_SOC15_OFFSET, java.lang.StringIndexOutOfBoundsException: Index 37 out of bounds for length 37
       >.[] java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
       reg_offset, 0java.lang.StringIndexOutOfBoundsException: Range [0, 23) out of bounds for length 0
 WREG32_SOC15_OFFSET(JPEG, jpeg_inst. = ,
 .rocess ,
       ;

}

static (structamdgpu_ring*ing
  . =,
    java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
(, );
 jpeg_v5_0_1_core_stall_reset(ring>jpeg>irq + >jpeg;
 jpeg_v5_0_1_init_jrbcring
 return amdgpu_ring_reset_helper_end(adev-.inst-.num_types ;
}

static  java.lang.StringIndexOutOfBoundsException: Index 27 out of bounds for length 1
 . m =,
 . =,
. =,
 .sw_init =.uncs jpeg_v5_0_1_ip_funcs
 .sw_fini
 .hw_init = jpeg_v5_0_1_hw_init,
 .hw_fini=jpeg_v5_0_1_hw_fini
. = jpeg_v5_0_1_suspend
 .resume = jpeg_v5_0_1_resume,uint32_tpoison_stat = 0, reg_value = 0;
 .is_idle = jpeg_v5_0_1_is_idle,
 .ait_for_idle = jpeg_v5_0_1_wait_for_idle
 .check_soft_reset = NULLswitch) {
 . = NULL
 .  =J, , );
=,
 .set_clockgating_state =  :
  =(, instance regUVD_RAS_JPEG1_STATUS
 .   =REG_GET_FIELD, , );
_ip_state=amdgpu_jpeg_print_ip_state
}

static }
 .type
 .align_mask = 0xf dev_infoadev-, " detected inJPEG% %d\,
 get_rptr =jpeg_v5_0_1_dec_ring_get_rptr,
 .get_wptr = jpeg_v5_0_1_dec_ring_get_wptr,
 .set_wptr = jpeg_v5_0_1_dec_ring_set_wptr,
 .emit_frame_size =
  SOC15_FLUSH_GPU_TLB_NUM_WREG * 6 +
  SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT8+
  8 + /* jpeg_v5_0_1_dec_ring_emit_vm_flush */
  uint32_t = 0  = 0  =;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 .emit_ib_sizeforsub ;sub AMDGPU_JPEG_V5_0_1_MAX_SUB_BLOCK;sub)
 .emit_ib = jpeg_v4_0_3_dec_ring_emit_ib,
 .emit_fence = jpeg_v4_0_3_dec_ring_emit_fence,
 .emit_vm_flush = jpeg_v4_0_3_dec_ring_emit_vm_flush,
 .emit_hdp_flush = jpeg_v4_0_3_ring_emit_hdp_flush,
 test_ring =amdgpu_jpeg_dec_ring_test_ring
 .test_ib = java.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 0
 .insert_nopstatic  structamdgpu_ras_block_hw_ops = java.lang.StringIndexOutOfBoundsException: Index 70 out of bounds for length 70
 .insert_start = jpeg_v4_0_3_dec_ring_insert_start,
 .insert_end =jpeg_v4_0_3_dec_ring_insert_end
 . = ,
 .begin_use = amdgpu_jpeg_ring_begin_use,
 .end_use = amdgpu_jpeg_ring_end_use,
 .emit_wreg = jpeg_v4_0_3_dec_ring_emit_wreg ret
 .emit_reg_wait = jpeg_v4_0_3_dec_ring_emit_reg_wait,
 .emit_reg_write_reg_wait =   (retjava.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
 . misc0=bank-[ACA_REG_IDX_MISC0
 switch() {

static void jpeg_v5_0_1_set_dec_ring_funcs >aca_err_type=ACA_ERROR_TYPE_UE;
{
 int i, j, jpeg_inst;

 for          ULL
  for   ACA_SMU_TYPE_CE:
  >jpeg[i].ing_dec]funcsjpeg_v5_0_1_dec_ring_vm_funcs
 adev-jpeg[i.ing_dec.  ;
   adev->jpeg.inst[i].ring_dec[j].pipe = j;
  }
  jpeg_inst = GET_INST(JPEG, i);
  adev->jpeg.inst[i].default
    />jpeg;
 }
}

static const java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
 .set =  16, 17, 18, 19,1 2 3 /* JPEG[0-7][S|D] */
 .process = jpeg_v5_0_1_process_interrupt ,2,2,2,2,0 1
;

static  amdgpu_irq_src_funcs ={
 .set = jpeg_v5_0_1_set_ras_interrupt_state,
 . = amdgpu_jpeg_process_poison_irq
};

static void jpeg_v5_0_1_set_irq_funcs
java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
 int

 for ( returnfalse
 adev-jpeg>irq +=>jpeg;

 adev->jpeg.inst->irq.funcs = &        ARRAY_SIZE(jpeg_v5_0_1_err_codes

 adev->jpeg.inst->ras_poison_irqreturn;
 }

}

  amdgpu_ip_block_version = java.lang.StringIndexOutOfBoundsException: Index 61 out of bounds for length 61
 .type = AMD_IP_BLOCK_TYPE_JPEG,. =jpeg_v5_0_1_aca_bank_is_valid,
 .major = 5,
 .minor = 0
 rev = ,
. = &peg_v5_0_1_ip_funcs
};

static 
  uint32_t
{
 uint32_t poison_stat = 0, reg_value

 
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  h =&,
ras_late_init,
  break}java.lang.StringIndexOutOfBoundsException: Index 3 out of bounds for length 3
case:
  reg_value java.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  poison_stat = REG_GET_FIELDjava.lang.StringIndexOutOfBoundsException: Index 1 out of bounds for length 1
  break;
 default:
  break;
 }

 if (poison_stat)
  dev_info(adev->dev, "Poison detected in JPEG%d sub_block%d\n",
   instance, sub_block);

 return poison_stat;
}

static bool jpeg_v5_0_1_query_ras_poison_status(struct amdgpu_device *adev)
{
 uint32_t inst = 0, sub = 0, poison_stat = 0;

 for (inst = 0; inst < adev->jpeg.num_jpeg_inst; inst++)
  for (sub = 0; sub < AMDGPU_JPEG_V5_0_1_MAX_SUB_BLOCK; sub++)
   poison_stat +=
   jpeg_v5_0_1_query_poison_by_instance(adev, inst, sub);

 return !!poison_stat;
}

static const struct amdgpu_ras_block_hw_ops jpeg_v5_0_1_ras_hw_ops = {
 .query_poison_status = jpeg_v5_0_1_query_ras_poison_status,
};

static int jpeg_v5_0_1_aca_bank_parser(struct aca_handle *handle, struct aca_bank *bank,
          enum aca_smu_type type, void *data)
{
 struct aca_bank_info info;
 u64 misc0;
 int ret;

 ret = aca_bank_info_decode(bank, &info);
 if (ret)
  return ret;

 misc0 = bank->regs[ACA_REG_IDX_MISC0];
 switch (type) {
 case ACA_SMU_TYPE_UE:
  bank->aca_err_type = ACA_ERROR_TYPE_UE;
  ret = aca_error_cache_log_bank_error(handle, &info, ACA_ERROR_TYPE_UE,
           1ULL);
  break;
 case ACA_SMU_TYPE_CE:
  bank->aca_err_type = ACA_ERROR_TYPE_CE;
  ret = aca_error_cache_log_bank_error(handle, &info, bank->aca_err_type,
           ACA_REG__MISC0__ERRCNT(misc0));
  break;
 default:
  return -EINVAL;
 }

 return ret;
}

/* reference to smu driver if header file */
static int jpeg_v5_0_1_err_codes[] = {
 16, 17, 18, 19, 20, 21, 22, 23, /* JPEG[0-7][S|D] */
 24, 25, 26, 27, 28, 29, 30, 31
};

static bool jpeg_v5_0_1_aca_bank_is_valid(struct aca_handle *handle, struct aca_bank *bank,
      enum aca_smu_type type, void *data)
{
 u32 instlo;

 instlo = ACA_REG__IPID__INSTANCEIDLO(bank->regs[ACA_REG_IDX_IPID]);
 instlo &= GENMASK(31, 1);

 if (instlo != mmSMNAID_AID0_MCA_SMU)
  return false;

 if (aca_bank_check_error_codes(handle->adev, bank,
           jpeg_v5_0_1_err_codes,
           ARRAY_SIZE(jpeg_v5_0_1_err_codes)))
  return false;

 return true;
}

static const struct aca_bank_ops jpeg_v5_0_1_aca_bank_ops = {
 .aca_bank_parser = jpeg_v5_0_1_aca_bank_parser,
 .aca_bank_is_valid = jpeg_v5_0_1_aca_bank_is_valid,
};

static const struct aca_info jpeg_v5_0_1_aca_info = {
 .hwip = ACA_HWIP_TYPE_SMU,
 .mask = ACA_ERROR_UE_MASK,
 .bank_ops = &jpeg_v5_0_1_aca_bank_ops,
};

static int jpeg_v5_0_1_ras_late_init(struct amdgpu_device *adev, struct ras_common_if *ras_block)
{
 int r;

 r = amdgpu_ras_block_late_init(adev, ras_block);
 if (r)
  return r;

 r = amdgpu_ras_bind_aca(adev, AMDGPU_RAS_BLOCK__JPEG,
    &jpeg_v5_0_1_aca_info, NULL);
 if (r)
  goto late_fini;

 if (amdgpu_ras_is_supported(adev, ras_block->block) &&
  adev->jpeg.inst->ras_poison_irq.funcs) {
  r = amdgpu_irq_get(adev, &adev->jpeg.inst->ras_poison_irq, 0);
  if (r)
   goto late_fini;
 }

 return 0;

late_fini:
 amdgpu_ras_block_late_fini(adev, ras_block);

 return r;
}

static struct amdgpu_jpeg_ras jpeg_v5_0_1_ras = {
 .ras_block = {
  .hw_ops = &jpeg_v5_0_1_ras_hw_ops,
  .ras_late_init = jpeg_v5_0_1_ras_late_init,
 },
};

static void jpeg_v5_0_1_set_ras_funcs(struct amdgpu_device *adev)
{
 adev->jpeg.ras = &jpeg_v5_0_1_ras;
}

Messung V0.5
C=97 H=90 G=93

¤ Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.0.10Bemerkung:  ¤

*Bot Zugriff






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.