函数逻辑报告

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source Code:arch\x86\kernel\cpu\mce\amd.c Create Date:2022-07-27 09:03:42
Last Modify:2020-03-12 14:18:49 Copyright©Brick
首页 函数Tree
注解内核,赢得工具下载SCCTEnglish

函数名称:umc_normaddr_to_sysaddr

函数原型:int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr)

返回类型:int

参数:

类型参数名称
u64norm_addr
u16nid
u8umc
u64 *sys_addr
666  ret_addr等于norm_addr
674  base等于0
675  cs_id等于0
676  bool hash_enabled = false
679  如果amd_df_indirect_read(nid, 0, 0x1B4, umc, & tmp)则转到:out_err
683  如果tmp按位与BIT(0)则
684  hi_addr_offset等于tmp按位与GENMASK_ULL(31, 20)的值左移8位
686  如果norm_addr大于等于hi_addr_offset
687  ret_addr减等于hi_addr_offset
688  base等于1
693  如果amd_df_indirect_read(nid, 0, 0x110 + (8 * base), umc, & tmp)则转到:out_err
697  如果非tmp按位与BIT(0)的值则
698  打印错误信息("%s: Invalid DramBaseAddress range: 0x%x.\n", __func__, tmp)
700  转到:out_err
703  lgcy_mmio_hole_en等于tmp按位与BIT(1)
704  intlv_num_chan等于tmp右移4位按位与0xF
705  intlv_addr_sel等于tmp右移8位按位与0x7
706  dram_base_addr等于tmp按位与GENMASK_ULL(31, 12)的值左移16位
709  如果intlv_addr_sel大于3则
710  打印错误信息("%s: Invalid interleave address select %d.\n", __func__, intlv_addr_sel)
712  转到:out_err
716  如果amd_df_indirect_read(nid, 0, 0x114 + (8 * base), umc, & tmp)则转到:out_err
719  intlv_num_sockets等于tmp右移8位按位与0x1
720  intlv_num_dies等于tmp右移10位按位与0x3
721  dram_limit_addr等于tmp按位与GENMASK_ULL(31, 12)的值左移16位按位或GENMASK_ULL(27, 0)
723  intlv_addr_bit等于intlv_addr_sel加8
727  :intlv_num_chan恒等于0
727  intlv_num_chan等于0
727  退出
728  :intlv_num_chan恒等于1
728  intlv_num_chan等于1
728  退出
729  :intlv_num_chan恒等于3
729  intlv_num_chan等于2
729  退出
730  :intlv_num_chan恒等于5
730  intlv_num_chan等于3
730  退出
731  :intlv_num_chan恒等于7
731  intlv_num_chan等于4
731  退出
733  :intlv_num_chan恒等于8
733  intlv_num_chan等于1
734  hash_enabled = true
735  退出
736  默认
737  打印错误信息("%s: Invalid number of interleaved channels %d.\n", __func__, intlv_num_chan)
739  转到:out_err
742  num_intlv_bits等于intlv_num_chan
744  如果intlv_num_dies大于2则
745  打印错误信息("%s: Invalid number of interleaved nodes/dies %d.\n", __func__, intlv_num_dies)
747  转到:out_err
750  num_intlv_bits加等于intlv_num_dies
753  num_intlv_bits加等于intlv_num_sockets
756  如果num_intlv_bits大于4则
757  打印错误信息("%s: Invalid interleave bits %d.\n", __func__, num_intlv_bits)
759  转到:out_err
762  如果num_intlv_bits大于0则
772  如果amd_df_indirect_read(nid, 0, 0x50, umc, & tmp)则转到:out_err
775  cs_fabric_id等于tmp右移8位按位与0xFF
776  die_id_bit等于0
779  如果intlv_num_chan
781  cs_mask等于1左移die_id_bit位的值减1
782  cs_id等于cs_fabric_id按位与cs_mask
785  sock_id_bit等于die_id_bit
788  如果intlv_num_diesintlv_num_sockets则如果amd_df_indirect_read(nid, 1, 0x208, umc, & tmp)则
790  转到:out_err
793  如果intlv_num_dies
795  die_id_shift等于tmp右移24位按位与0xF
796  die_id_mask等于tmp右移8位按位与0xFF
798  cs_id或等于cs_fabric_id按位与die_id_mask的值右移die_id_shift位左移die_id_bit
802  如果intlv_num_sockets
803  socket_id_shift等于tmp右移28位按位与0xF
804  socket_id_mask等于tmp右移16位按位与0xFF
806  cs_id或等于cs_fabric_id按位与socket_id_mask的值右移socket_id_shift位左移sock_id_bit
817  temp_addr_y等于ret_addr按位与GENMASK_ULL(intlv_addr_bit - 1, 0)
818  temp_addr_i等于cs_id左移intlv_addr_bit
819  temp_addr_x等于ret_addr按位与GENMASK_ULL(63, intlv_addr_bit)的值左移num_intlv_bits
820  ret_addr等于temp_addr_x按位或temp_addr_i按位或temp_addr_y
824  ret_addr加等于dram_base_addr
827  如果lgcy_mmio_hole_en
828  如果amd_df_indirect_read(nid, 0, 0x104, umc, & tmp)则转到:out_err
831  dram_hole_base等于tmp按位与Create a contiguous bitmask starting at bit position @l and ending at* position @h. For example* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.(31, 24)
832  如果ret_addr大于等于dram_hole_baseret_addr加等于BIT_ULL(32)减dram_hole_base
836  如果hash_enabled
838  hashed_bit等于ret_addr右移12位按位异或ret_addr右移18位按位异或ret_addr右移21位按位异或ret_addr右移30位按位异或cs_id
844  hashed_bit与等于BIT(0)
846  如果hashed_bit不等于ret_addr右移intlv_addr_bit位按位与BIT(0)的值则ret_addr异或等于BIT(intlv_addr_bit)
851  如果ret_addr大于dram_limit_addr则转到:out_err
854  sys_addr等于ret_addr
855  返回:0
857  out_err :
858  返回:负EINVAL