Hello Monk Liu,

Commit dd26858a9cd8 ("drm/amdgpu: implement initialization part on
VCN2.0 for SRIOV") from Mar 5, 2020 (linux-next), leads to the
following Smatch static checker warning:

        drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c:1967 vcn_v2_0_start_sriov()
        warn: iterator 'i' not incremented

drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
  1955  static int vcn_v2_0_start_sriov(struct amdgpu_device *adev)
  1956  {
  1957          int r;
  1958          uint32_t tmp;
  1959          struct amdgpu_ring *ring;
  1960          uint32_t offset, size;
  1961          uint32_t table_size = 0;
  1962          struct mmsch_v2_0_cmd_direct_write direct_wt = { {0} };
  1963          struct mmsch_v2_0_cmd_direct_read_modify_write direct_rd_mod_wt 
= { {0} };
  1964          struct mmsch_v2_0_cmd_end end = { {0} };
  1965          struct mmsch_v2_0_init_header *header;
  1966          uint32_t *init_table = adev->virt.mm_table.cpu_addr;
  1967          uint8_t i = 0;

i is always just zero.  What's the dealio, yo?

  1968  
  1969          header = (struct mmsch_v2_0_init_header *)init_table;
  1970          direct_wt.cmd_header.command_type = 
MMSCH_COMMAND__DIRECT_REG_WRITE;
  1971          direct_rd_mod_wt.cmd_header.command_type =
  1972                  MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE;
  1973          end.cmd_header.command_type = MMSCH_COMMAND__END;
  1974  
  1975          if (header->vcn_table_offset == 0 && header->vcn_table_size == 
0) {
  1976                  header->version = MMSCH_VERSION;
  1977                  header->header_size = sizeof(struct 
mmsch_v2_0_init_header) >> 2;
  1978  
  1979                  header->vcn_table_offset = header->header_size;
  1980  
  1981                  init_table += header->vcn_table_offset;
  1982  
  1983                  size = AMDGPU_GPU_PAGE_ALIGN(adev->vcn.inst[0].fw->size 
+ 4);
  1984  
  1985                  MMSCH_V2_0_INSERT_DIRECT_RD_MOD_WT(
  1986                          SOC15_REG_OFFSET(UVD, i, mmUVD_STATUS),
  1987                          0xFFFFFFFF, 0x00000004);
  1988  
  1989                  /* mc resume*/
  1990                  if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
  1991                          MMSCH_V2_0_INSERT_DIRECT_WT(
  1992                                  SOC15_REG_OFFSET(UVD, i,
  1993                                          
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
  1994                                  
adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_lo);
  1995                          MMSCH_V2_0_INSERT_DIRECT_WT(
  1996                                  SOC15_REG_OFFSET(UVD, i,
  1997                                          
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
  1998                                  
adev->firmware.ucode[AMDGPU_UCODE_ID_VCN].tmr_mc_addr_hi);
  1999                          offset = 0;
  2000                  } else {
  2001                          MMSCH_V2_0_INSERT_DIRECT_WT(
  2002                                  SOC15_REG_OFFSET(UVD, i,
  2003                                          
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_LOW),
  2004                                  
lower_32_bits(adev->vcn.inst->gpu_addr));
  2005                          MMSCH_V2_0_INSERT_DIRECT_WT(
  2006                                  SOC15_REG_OFFSET(UVD, i,
  2007                                          
mmUVD_LMI_VCPU_CACHE_64BIT_BAR_HIGH),
  2008                                  
upper_32_bits(adev->vcn.inst->gpu_addr));
  2009                          offset = size;
  2010                  }
  2011  
  2012                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2013                          SOC15_REG_OFFSET(UVD, i, 
mmUVD_VCPU_CACHE_OFFSET0),
  2014                          0);
  2015                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2016                          SOC15_REG_OFFSET(UVD, i, 
mmUVD_VCPU_CACHE_SIZE0),
  2017                          size);
  2018  
  2019                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2020                          SOC15_REG_OFFSET(UVD, i,
  2021                                  mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_LOW),
  2022                          lower_32_bits(adev->vcn.inst->gpu_addr + 
offset));
  2023                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2024                          SOC15_REG_OFFSET(UVD, i,
  2025                                  mmUVD_LMI_VCPU_CACHE1_64BIT_BAR_HIGH),
  2026                          upper_32_bits(adev->vcn.inst->gpu_addr + 
offset));
  2027                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2028                          SOC15_REG_OFFSET(UVD, i, 
mmUVD_VCPU_CACHE_OFFSET1),
  2029                          0);
  2030                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2031                          SOC15_REG_OFFSET(UVD, i, 
mmUVD_VCPU_CACHE_SIZE1),
  2032                          AMDGPU_VCN_STACK_SIZE);
  2033  
  2034                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2035                          SOC15_REG_OFFSET(UVD, i,
  2036                                  mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_LOW),
  2037                          lower_32_bits(adev->vcn.inst->gpu_addr + offset 
+
  2038                                  AMDGPU_VCN_STACK_SIZE));
  2039                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2040                          SOC15_REG_OFFSET(UVD, i,
  2041                                  mmUVD_LMI_VCPU_CACHE2_64BIT_BAR_HIGH),
  2042                          upper_32_bits(adev->vcn.inst->gpu_addr + offset 
+
  2043                                  AMDGPU_VCN_STACK_SIZE));
  2044                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2045                          SOC15_REG_OFFSET(UVD, i, 
mmUVD_VCPU_CACHE_OFFSET2),
  2046                          0);
  2047                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2048                          SOC15_REG_OFFSET(UVD, i, 
mmUVD_VCPU_CACHE_SIZE2),
  2049                          AMDGPU_VCN_CONTEXT_SIZE);
  2050  
  2051                  for (r = 0; r < adev->vcn.inst[0].num_enc_rings; ++r) {
  2052                          ring = &adev->vcn.inst->ring_enc[r];
  2053                          ring->wptr = 0;
  2054                          MMSCH_V2_0_INSERT_DIRECT_WT(
  2055                                  SOC15_REG_OFFSET(UVD, i, 
mmUVD_RB_BASE_LO),
  2056                                  lower_32_bits(ring->gpu_addr));
  2057                          MMSCH_V2_0_INSERT_DIRECT_WT(
  2058                                  SOC15_REG_OFFSET(UVD, i, 
mmUVD_RB_BASE_HI),
  2059                                  upper_32_bits(ring->gpu_addr));
  2060                          MMSCH_V2_0_INSERT_DIRECT_WT(
  2061                                  SOC15_REG_OFFSET(UVD, i, mmUVD_RB_SIZE),
  2062                                  ring->ring_size / 4);
  2063                  }
  2064  
  2065                  ring = &adev->vcn.inst->ring_dec;
  2066                  ring->wptr = 0;
  2067                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2068                          SOC15_REG_OFFSET(UVD, i,
  2069                                  mmUVD_LMI_RBC_RB_64BIT_BAR_LOW),
  2070                          lower_32_bits(ring->gpu_addr));
  2071                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2072                          SOC15_REG_OFFSET(UVD, i,
  2073                                  mmUVD_LMI_RBC_RB_64BIT_BAR_HIGH),
  2074                          upper_32_bits(ring->gpu_addr));
  2075                  /* force RBC into idle state */
  2076                  tmp = order_base_2(ring->ring_size);
  2077                  tmp = REG_SET_FIELD(0, UVD_RBC_RB_CNTL, RB_BUFSZ, tmp);
  2078                  tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_BLKSZ, 1);
  2079                  tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_FETCH, 
1);
  2080                  tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, RB_NO_UPDATE, 
1);
  2081                  tmp = REG_SET_FIELD(tmp, UVD_RBC_RB_CNTL, 
RB_RPTR_WR_EN, 1);
  2082                  MMSCH_V2_0_INSERT_DIRECT_WT(
  2083                          SOC15_REG_OFFSET(UVD, i, mmUVD_RBC_RB_CNTL), 
tmp);
  2084  
  2085                  /* add end packet */
  2086                  tmp = sizeof(struct mmsch_v2_0_cmd_end);
  2087                  memcpy((void *)init_table, &end, tmp);
  2088                  table_size += (tmp / 4);
  2089                  header->vcn_table_size = table_size;
  2090  
  2091          }
  2092          return vcn_v2_0_start_mmsch(adev, &adev->virt.mm_table);
  2093  }

regards,
dan carpenter

Reply via email to