Function report |
Source Code:arch\x86\kernel\cpu\mce\amd.c |
Create Date:2022-07-28 08:03:24 |
| Last Modify:2020-03-12 14:18:49 | Copyright©Brick |
| home page | Tree |
| Annotation kernel can get tool activity | Download SCCT | Chinese |
Name:umc_normaddr_to_sysaddr
Proto:int umc_normaddr_to_sysaddr(u64 norm_addr, u16 nid, u8 umc, u64 *sys_addr)
Type:int
Parameter:
| Type | Parameter | Name |
|---|---|---|
| u64 | norm_addr | |
| u16 | nid | |
| u8 | umc | |
| u64 * | sys_addr |
| 674 | base = 0 |
| 675 | cs_id = 0 |
| 676 | bool hash_enabled = false |
| 679 | If amd_df_indirect_read(nid, 0, 0x1B4, umc, & tmp) Then Go to out_err |
| 684 | hi_addr_offset = (tmp & GENMASK_ULL(31, 20)) << 8 |
| 686 | If norm_addr >= hi_addr_offset Then |
| 687 | ret_addr -= hi_addr_offset |
| 688 | base = 1 |
| 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 | If intlv_addr_sel > 3 Then |
| 710 | pr_err("%s: Invalid interleave address select %d.\n", __func__, intlv_addr_sel) |
| 712 | Go to 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 | Case intlv_num_chan == 0 |
| 727 | intlv_num_chan = 0 |
| 727 | Break |
| 728 | Case intlv_num_chan == 1 |
| 728 | intlv_num_chan = 1 |
| 728 | Break |
| 729 | Case intlv_num_chan == 3 |
| 729 | intlv_num_chan = 2 |
| 729 | Break |
| 730 | Case intlv_num_chan == 5 |
| 730 | intlv_num_chan = 3 |
| 730 | Break |
| 731 | Case intlv_num_chan == 7 |
| 731 | intlv_num_chan = 4 |
| 731 | Break |
| 733 | Case intlv_num_chan == 8 |
| 736 | Default |
| 737 | pr_err("%s: Invalid number of interleaved channels %d.\n", __func__, intlv_num_chan) |
| 739 | Go to out_err |
| 742 | num_intlv_bits = intlv_num_chan |
| 744 | If intlv_num_dies > 2 Then |
| 745 | pr_err("%s: Invalid number of interleaved nodes/dies %d.\n", __func__, intlv_num_dies) |
| 747 | Go to out_err |
| 750 | num_intlv_bits += intlv_num_dies |
| 753 | num_intlv_bits += intlv_num_sockets |
| 756 | If num_intlv_bits > 4 Then |
| 757 | pr_err("%s: Invalid interleave bits %d.\n", __func__, num_intlv_bits) |
| 759 | Go to out_err |
| 762 | If num_intlv_bits > 0 Then |
| 772 | If amd_df_indirect_read(nid, 0, 0x50, umc, & tmp) Then Go to out_err |
| 775 | cs_fabric_id = tmp >> 8 & 0xFF |
| 776 | die_id_bit = 0 |
| 779 | If intlv_num_chan Then |
| 780 | die_id_bit = 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 | If intlv_num_dies || intlv_num_sockets Then If amd_df_indirect_read(nid, 1, 0x208, umc, & tmp) Then |
| 790 | Go to out_err |
| 793 | If intlv_num_dies Then |
| 794 | sock_id_bit = die_id_bit + 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 | If intlv_num_sockets Then |
| 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 | If lgcy_mmio_hole_en Then |
| 828 | If amd_df_indirect_read(nid, 0, 0x104, umc, & tmp) Then Go to 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 | If ret_addr >= dram_hole_base Then ret_addr += BIT_ULL(32) - dram_hole_base |
| 836 | If hash_enabled Then |
| 844 | hashed_bit &= BIT(0) |
| 846 | If hashed_bit != ( ret_addr >> intlv_addr_bit & BIT(0)) Then ret_addr ^= BIT(intlv_addr_bit) |
| 851 | If ret_addr > dram_limit_addr Then Go to out_err |
| 855 | Return 0 |
| 857 | out_err : |
| 858 | Return -EINVAL |
| Source code conversion tool public plug-in interface | X |
|---|---|
| Support c/c++/esqlc/java Oracle/Informix/Mysql Plug-in can realize: logical Report Code generation and batch code conversion |