Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: ipa: generalize register field functions

Rename functions related to register fields so they don't appear to
be IPA-specific, and move their definitions into "reg.h":
ipa_reg_fmask() -> reg_fmask()
ipa_reg_bit() -> reg_bit()
ipa_reg_field_max() -> reg_field_max()
ipa_reg_encode() -> reg_encode()
ipa_reg_decode() -> reg_decode()

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Alex Elder and committed by
David S. Miller
f1470fd7 fc4cecf7

+161 -165
+59 -60
drivers/net/ipa/ipa_endpoint.c
··· 304 304 rx_config->aggr_hard_limit); 305 305 reg = ipa_reg(ipa, ENDP_INIT_AGGR); 306 306 307 - limit = ipa_reg_field_max(reg, BYTE_LIMIT); 307 + limit = reg_field_max(reg, BYTE_LIMIT); 308 308 if (aggr_size > limit) { 309 309 dev_err(dev, "aggregated size too large for RX endpoint %u (%u KB > %u KB)\n", 310 310 data->endpoint_id, aggr_size, limit); ··· 464 464 val = ioread32(ipa->reg_virt + offset); 465 465 466 466 field_id = endpoint->toward_ipa ? ENDP_DELAY : ENDP_SUSPEND; 467 - mask = ipa_reg_bit(reg, field_id); 467 + mask = reg_bit(reg, field_id); 468 468 469 469 state = !!(val & mask); 470 470 ··· 658 658 659 659 /* Checksum header offset is in 4-byte units */ 660 660 off = sizeof(struct rmnet_map_header) / sizeof(u32); 661 - val |= ipa_reg_encode(reg, CS_METADATA_HDR_OFFSET, off); 661 + val |= reg_encode(reg, CS_METADATA_HDR_OFFSET, off); 662 662 663 663 enabled = version < IPA_VERSION_4_5 664 664 ? IPA_CS_OFFLOAD_UL ··· 671 671 } else { 672 672 enabled = IPA_CS_OFFLOAD_NONE; 673 673 } 674 - val |= ipa_reg_encode(reg, CS_OFFLOAD_EN, enabled); 674 + val |= reg_encode(reg, CS_OFFLOAD_EN, enabled); 675 675 /* CS_GEN_QMB_MASTER_SEL is 0 */ 676 676 677 677 iowrite32(val, ipa->reg_virt + reg_n_offset(reg, endpoint_id)); ··· 688 688 return; 689 689 690 690 reg = ipa_reg(ipa, ENDP_INIT_NAT); 691 - val = ipa_reg_encode(reg, NAT_EN, IPA_NAT_TYPE_BYPASS); 691 + val = reg_encode(reg, NAT_EN, IPA_NAT_TYPE_BYPASS); 692 692 693 693 iowrite32(val, ipa->reg_virt + reg_n_offset(reg, endpoint_id)); 694 694 } ··· 718 718 static u32 ipa_header_size_encode(enum ipa_version version, 719 719 const struct reg *reg, u32 header_size) 720 720 { 721 - u32 field_max = ipa_reg_field_max(reg, HDR_LEN); 721 + u32 field_max = reg_field_max(reg, HDR_LEN); 722 722 u32 val; 723 723 724 724 /* We know field_max can be used as a mask (2^n - 1) */ 725 - val = ipa_reg_encode(reg, HDR_LEN, header_size & field_max); 725 + val = reg_encode(reg, HDR_LEN, header_size & field_max); 726 726 if (version < IPA_VERSION_4_5) { 727 727 WARN_ON(header_size > field_max); 728 728 return val; ··· 730 730 731 731 /* IPA v4.5 adds a few more most-significant bits */ 732 732 header_size >>= hweight32(field_max); 733 - WARN_ON(header_size > ipa_reg_field_max(reg, HDR_LEN_MSB)); 734 - val |= ipa_reg_encode(reg, HDR_LEN_MSB, header_size); 733 + WARN_ON(header_size > reg_field_max(reg, HDR_LEN_MSB)); 734 + val |= reg_encode(reg, HDR_LEN_MSB, header_size); 735 735 736 736 return val; 737 737 } ··· 740 740 static u32 ipa_metadata_offset_encode(enum ipa_version version, 741 741 const struct reg *reg, u32 offset) 742 742 { 743 - u32 field_max = ipa_reg_field_max(reg, HDR_OFST_METADATA); 743 + u32 field_max = reg_field_max(reg, HDR_OFST_METADATA); 744 744 u32 val; 745 745 746 746 /* We know field_max can be used as a mask (2^n - 1) */ 747 - val = ipa_reg_encode(reg, HDR_OFST_METADATA, offset); 747 + val = reg_encode(reg, HDR_OFST_METADATA, offset); 748 748 if (version < IPA_VERSION_4_5) { 749 749 WARN_ON(offset > field_max); 750 750 return val; ··· 752 752 753 753 /* IPA v4.5 adds a few more most-significant bits */ 754 754 offset >>= hweight32(field_max); 755 - WARN_ON(offset > ipa_reg_field_max(reg, HDR_OFST_METADATA_MSB)); 756 - val |= ipa_reg_encode(reg, HDR_OFST_METADATA_MSB, offset); 755 + WARN_ON(offset > reg_field_max(reg, HDR_OFST_METADATA_MSB)); 756 + val |= reg_encode(reg, HDR_OFST_METADATA_MSB, offset); 757 757 758 758 return val; 759 759 } ··· 806 806 off = offsetof(struct rmnet_map_header, pkt_len); 807 807 /* Upper bits are stored in HDR_EXT with IPA v4.5 */ 808 808 if (version >= IPA_VERSION_4_5) 809 - off &= ipa_reg_field_max(reg, HDR_OFST_PKT_SIZE); 809 + off &= reg_field_max(reg, HDR_OFST_PKT_SIZE); 810 810 811 - val |= ipa_reg_bit(reg, HDR_OFST_PKT_SIZE_VALID); 812 - val |= ipa_reg_encode(reg, HDR_OFST_PKT_SIZE, off); 811 + val |= reg_bit(reg, HDR_OFST_PKT_SIZE_VALID); 812 + val |= reg_encode(reg, HDR_OFST_PKT_SIZE, off); 813 813 } 814 814 /* For QMAP TX, metadata offset is 0 (modem assumes this) */ 815 - val |= ipa_reg_bit(reg, HDR_OFST_METADATA_VALID); 815 + val |= reg_bit(reg, HDR_OFST_METADATA_VALID); 816 816 817 817 /* HDR_ADDITIONAL_CONST_LEN is 0; (RX only) */ 818 818 /* HDR_A5_MUX is 0 */ ··· 834 834 reg = ipa_reg(ipa, ENDP_INIT_HDR_EXT); 835 835 if (endpoint->config.qmap) { 836 836 /* We have a header, so we must specify its endianness */ 837 - val |= ipa_reg_bit(reg, HDR_ENDIANNESS); /* big endian */ 837 + val |= reg_bit(reg, HDR_ENDIANNESS); /* big endian */ 838 838 839 839 /* A QMAP header contains a 6 bit pad field at offset 0. 840 840 * The RMNet driver assumes this field is meaningful in ··· 844 844 * (although 0) should be ignored. 845 845 */ 846 846 if (!endpoint->toward_ipa) { 847 - val |= ipa_reg_bit(reg, HDR_TOTAL_LEN_OR_PAD_VALID); 847 + val |= reg_bit(reg, HDR_TOTAL_LEN_OR_PAD_VALID); 848 848 /* HDR_TOTAL_LEN_OR_PAD is 0 (pad, not total_len) */ 849 - val |= ipa_reg_bit(reg, HDR_PAYLOAD_LEN_INC_PADDING); 849 + val |= reg_bit(reg, HDR_PAYLOAD_LEN_INC_PADDING); 850 850 /* HDR_TOTAL_LEN_OR_PAD_OFFSET is 0 */ 851 851 } 852 852 } 853 853 854 854 /* HDR_PAYLOAD_LEN_INC_PADDING is 0 */ 855 855 if (!endpoint->toward_ipa) 856 - val |= ipa_reg_encode(reg, HDR_PAD_TO_ALIGNMENT, pad_align); 856 + val |= reg_encode(reg, HDR_PAD_TO_ALIGNMENT, pad_align); 857 857 858 858 /* IPA v4.5 adds some most-significant bits to a few fields, 859 859 * two of which are defined in the HDR (not HDR_EXT) register. ··· 861 861 if (ipa->version >= IPA_VERSION_4_5) { 862 862 /* HDR_TOTAL_LEN_OR_PAD_OFFSET is 0, so MSB is 0 */ 863 863 if (endpoint->config.qmap && !endpoint->toward_ipa) { 864 - u32 mask = ipa_reg_field_max(reg, HDR_OFST_PKT_SIZE); 864 + u32 mask = reg_field_max(reg, HDR_OFST_PKT_SIZE); 865 865 u32 off; /* Field offset within header */ 866 866 867 867 off = offsetof(struct rmnet_map_header, pkt_len); 868 868 /* Low bits are in the ENDP_INIT_HDR register */ 869 869 off >>= hweight32(mask); 870 - val |= ipa_reg_encode(reg, HDR_OFST_PKT_SIZE_MSB, off); 870 + val |= reg_encode(reg, HDR_OFST_PKT_SIZE_MSB, off); 871 871 /* HDR_ADDITIONAL_CONST_LEN is 0 so MSB is 0 */ 872 872 } 873 873 } ··· 911 911 enum ipa_endpoint_name name = endpoint->config.dma_endpoint; 912 912 u32 dma_endpoint_id = ipa->name_map[name]->endpoint_id; 913 913 914 - val = ipa_reg_encode(reg, ENDP_MODE, IPA_DMA); 915 - val |= ipa_reg_encode(reg, DEST_PIPE_INDEX, dma_endpoint_id); 914 + val = reg_encode(reg, ENDP_MODE, IPA_DMA); 915 + val |= reg_encode(reg, DEST_PIPE_INDEX, dma_endpoint_id); 916 916 } else { 917 - val = ipa_reg_encode(reg, ENDP_MODE, IPA_BASIC); 917 + val = reg_encode(reg, ENDP_MODE, IPA_BASIC); 918 918 } 919 919 /* All other bits unspecified (and 0) */ 920 920 ··· 972 972 if (!microseconds) 973 973 return 0; /* Nothing to compute if time limit is 0 */ 974 974 975 - max = ipa_reg_field_max(reg, TIME_LIMIT); 975 + max = reg_field_max(reg, TIME_LIMIT); 976 976 if (ipa->version >= IPA_VERSION_4_5) { 977 977 u32 select; 978 978 979 979 ticks = ipa_qtime_val(ipa, microseconds, max, &select); 980 980 981 - return ipa_reg_encode(reg, AGGR_GRAN_SEL, select) | 982 - ipa_reg_encode(reg, TIME_LIMIT, ticks); 981 + return reg_encode(reg, AGGR_GRAN_SEL, select) | 982 + reg_encode(reg, TIME_LIMIT, ticks); 983 983 } 984 984 985 985 /* We program aggregation granularity in ipa_hardware_config() */ ··· 987 987 WARN(ticks > max, "aggr_time_limit too large (%u > %u usec)\n", 988 988 microseconds, max * IPA_AGGR_GRANULARITY); 989 989 990 - return ipa_reg_encode(reg, TIME_LIMIT, ticks); 990 + return reg_encode(reg, TIME_LIMIT, ticks); 991 991 } 992 992 993 993 static void ipa_endpoint_init_aggr(struct ipa_endpoint *endpoint) ··· 1005 1005 u32 limit; 1006 1006 1007 1007 rx_config = &endpoint->config.rx; 1008 - val |= ipa_reg_encode(reg, AGGR_EN, IPA_ENABLE_AGGR); 1009 - val |= ipa_reg_encode(reg, AGGR_TYPE, IPA_GENERIC); 1008 + val |= reg_encode(reg, AGGR_EN, IPA_ENABLE_AGGR); 1009 + val |= reg_encode(reg, AGGR_TYPE, IPA_GENERIC); 1010 1010 1011 1011 buffer_size = rx_config->buffer_size; 1012 1012 limit = ipa_aggr_size_kb(buffer_size - NET_SKB_PAD, 1013 1013 rx_config->aggr_hard_limit); 1014 - val |= ipa_reg_encode(reg, BYTE_LIMIT, limit); 1014 + val |= reg_encode(reg, BYTE_LIMIT, limit); 1015 1015 1016 1016 limit = rx_config->aggr_time_limit; 1017 1017 val |= aggr_time_limit_encode(ipa, reg, limit); ··· 1019 1019 /* AGGR_PKT_LIMIT is 0 (unlimited) */ 1020 1020 1021 1021 if (rx_config->aggr_close_eof) 1022 - val |= ipa_reg_bit(reg, SW_EOF_ACTIVE); 1022 + val |= reg_bit(reg, SW_EOF_ACTIVE); 1023 1023 } else { 1024 - val |= ipa_reg_encode(reg, AGGR_EN, IPA_ENABLE_DEAGGR); 1025 - val |= ipa_reg_encode(reg, AGGR_TYPE, IPA_QCMAP); 1024 + val |= reg_encode(reg, AGGR_EN, IPA_ENABLE_DEAGGR); 1025 + val |= reg_encode(reg, AGGR_TYPE, IPA_QCMAP); 1026 1026 /* other fields ignored */ 1027 1027 } 1028 1028 /* AGGR_FORCE_CLOSE is 0 */ 1029 1029 /* AGGR_GRAN_SEL is 0 for IPA v4.5 */ 1030 1030 } else { 1031 - val |= ipa_reg_encode(reg, AGGR_EN, IPA_BYPASS_AGGR); 1031 + val |= reg_encode(reg, AGGR_EN, IPA_BYPASS_AGGR); 1032 1032 /* other fields ignored */ 1033 1033 } 1034 1034 ··· 1057 1057 return 0; /* Nothing to compute if timer period is 0 */ 1058 1058 1059 1059 if (ipa->version >= IPA_VERSION_4_5) { 1060 - u32 max = ipa_reg_field_max(reg, TIMER_LIMIT); 1060 + u32 max = reg_field_max(reg, TIMER_LIMIT); 1061 1061 u32 select; 1062 1062 u32 ticks; 1063 1063 1064 1064 ticks = ipa_qtime_val(ipa, microseconds, max, &select); 1065 1065 1066 - return ipa_reg_encode(reg, TIMER_GRAN_SEL, 1) | 1067 - ipa_reg_encode(reg, TIMER_LIMIT, ticks); 1066 + return reg_encode(reg, TIMER_GRAN_SEL, 1) | 1067 + reg_encode(reg, TIMER_LIMIT, ticks); 1068 1068 } 1069 1069 1070 1070 /* Use 64 bit arithmetic to avoid overflow */ ··· 1072 1072 ticks = DIV_ROUND_CLOSEST(microseconds * rate, 128 * USEC_PER_SEC); 1073 1073 1074 1074 /* We still need the result to fit into the field */ 1075 - WARN_ON(ticks > ipa_reg_field_max(reg, TIMER_BASE_VALUE)); 1075 + WARN_ON(ticks > reg_field_max(reg, TIMER_BASE_VALUE)); 1076 1076 1077 1077 /* IPA v3.5.1 through v4.1 just record the tick count */ 1078 1078 if (ipa->version < IPA_VERSION_4_2) 1079 - return ipa_reg_encode(reg, TIMER_BASE_VALUE, (u32)ticks); 1079 + return reg_encode(reg, TIMER_BASE_VALUE, (u32)ticks); 1080 1080 1081 1081 /* For IPA v4.2, the tick count is represented by base and 1082 1082 * scale fields within the 32-bit timer register, where: ··· 1087 1087 * such that high bit is included. 1088 1088 */ 1089 1089 high = fls(ticks); /* 1..32 (or warning above) */ 1090 - width = hweight32(ipa_reg_fmask(reg, TIMER_BASE_VALUE)); 1090 + width = hweight32(reg_fmask(reg, TIMER_BASE_VALUE)); 1091 1091 scale = high > width ? high - width : 0; 1092 1092 if (scale) { 1093 1093 /* If we're scaling, round up to get a closer result */ ··· 1097 1097 scale++; 1098 1098 } 1099 1099 1100 - val = ipa_reg_encode(reg, TIMER_SCALE, scale); 1101 - val |= ipa_reg_encode(reg, TIMER_BASE_VALUE, (u32)ticks >> scale); 1100 + val = reg_encode(reg, TIMER_SCALE, scale); 1101 + val |= reg_encode(reg, TIMER_BASE_VALUE, (u32)ticks >> scale); 1102 1102 1103 1103 return val; 1104 1104 } ··· 1130 1130 1131 1131 reg = ipa_reg(ipa, ENDP_INIT_HOL_BLOCK_EN); 1132 1132 offset = reg_n_offset(reg, endpoint_id); 1133 - val = enable ? ipa_reg_bit(reg, HOL_BLOCK_EN) : 0; 1133 + val = enable ? reg_bit(reg, HOL_BLOCK_EN) : 0; 1134 1134 1135 1135 iowrite32(val, ipa->reg_virt + offset); 1136 1136 ··· 1195 1195 u32 val; 1196 1196 1197 1197 reg = ipa_reg(ipa, ENDP_INIT_RSRC_GRP); 1198 - val = ipa_reg_encode(reg, ENDP_RSRC_GRP, resource_group); 1198 + val = reg_encode(reg, ENDP_RSRC_GRP, resource_group); 1199 1199 1200 1200 iowrite32(val, ipa->reg_virt + reg_n_offset(reg, endpoint_id)); 1201 1201 } ··· 1213 1213 reg = ipa_reg(ipa, ENDP_INIT_SEQ); 1214 1214 1215 1215 /* Low-order byte configures primary packet processing */ 1216 - val = ipa_reg_encode(reg, SEQ_TYPE, endpoint->config.tx.seq_type); 1216 + val = reg_encode(reg, SEQ_TYPE, endpoint->config.tx.seq_type); 1217 1217 1218 1218 /* Second byte (if supported) configures replicated packet processing */ 1219 1219 if (ipa->version < IPA_VERSION_4_5) 1220 - val |= ipa_reg_encode(reg, SEQ_REP_TYPE, 1221 - endpoint->config.tx.seq_rep_type); 1220 + val |= reg_encode(reg, SEQ_REP_TYPE, 1221 + endpoint->config.tx.seq_rep_type); 1222 1222 1223 1223 iowrite32(val, ipa->reg_virt + reg_n_offset(reg, endpoint_id)); 1224 1224 } ··· 1275 1275 1276 1276 reg = ipa_reg(ipa, ENDP_STATUS); 1277 1277 if (endpoint->config.status_enable) { 1278 - val |= ipa_reg_bit(reg, STATUS_EN); 1278 + val |= reg_bit(reg, STATUS_EN); 1279 1279 if (endpoint->toward_ipa) { 1280 1280 enum ipa_endpoint_name name; 1281 1281 u32 status_endpoint_id; ··· 1283 1283 name = endpoint->config.tx.status_endpoint; 1284 1284 status_endpoint_id = ipa->name_map[name]->endpoint_id; 1285 1285 1286 - val |= ipa_reg_encode(reg, STATUS_ENDP, 1287 - status_endpoint_id); 1286 + val |= reg_encode(reg, STATUS_ENDP, status_endpoint_id); 1288 1287 } 1289 1288 /* STATUS_LOCATION is 0, meaning IPA packet status 1290 1289 * precedes the packet (not present for IPA v4.5+) ··· 1640 1641 1641 1642 reg = ipa_reg(ipa, ROUTE); 1642 1643 /* ROUTE_DIS is 0 */ 1643 - val = ipa_reg_encode(reg, ROUTE_DEF_PIPE, endpoint_id); 1644 - val |= ipa_reg_bit(reg, ROUTE_DEF_HDR_TABLE); 1644 + val = reg_encode(reg, ROUTE_DEF_PIPE, endpoint_id); 1645 + val |= reg_bit(reg, ROUTE_DEF_HDR_TABLE); 1645 1646 /* ROUTE_DEF_HDR_OFST is 0 */ 1646 - val |= ipa_reg_encode(reg, ROUTE_FRAG_DEF_PIPE, endpoint_id); 1647 - val |= ipa_reg_bit(reg, ROUTE_DEF_RETAIN_HDR); 1647 + val |= reg_encode(reg, ROUTE_FRAG_DEF_PIPE, endpoint_id); 1648 + val |= reg_bit(reg, ROUTE_DEF_RETAIN_HDR); 1648 1649 1649 1650 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 1650 1651 } ··· 2021 2022 val = ioread32(ipa->reg_virt + reg_offset(reg)); 2022 2023 2023 2024 /* Our RX is an IPA producer; our TX is an IPA consumer. */ 2024 - tx_count = ipa_reg_decode(reg, MAX_CONS_PIPES, val); 2025 - rx_count = ipa_reg_decode(reg, MAX_PROD_PIPES, val); 2026 - rx_base = ipa_reg_decode(reg, PROD_LOWEST, val); 2025 + tx_count = reg_decode(reg, MAX_CONS_PIPES, val); 2026 + rx_count = reg_decode(reg, MAX_PROD_PIPES, val); 2027 + rx_base = reg_decode(reg, PROD_LOWEST, val); 2027 2028 2028 2029 limit = rx_base + rx_count; 2029 2030 if (limit > IPA_ENDPOINT_MAX) {
+33 -35
drivers/net/ipa/ipa_main.c
··· 231 231 232 232 val = ioread32(ipa->reg_virt + offset); 233 233 234 - val &= ~ipa_reg_bit(reg, PA_MASK_EN); 234 + val &= ~reg_bit(reg, PA_MASK_EN); 235 235 236 236 iowrite32(val, ipa->reg_virt + offset); 237 237 } ··· 252 252 reg = ipa_reg(ipa, CLKON_CFG); 253 253 if (version == IPA_VERSION_3_1) { 254 254 /* Disable MISC clock gating */ 255 - val = ipa_reg_bit(reg, CLKON_MISC); 255 + val = reg_bit(reg, CLKON_MISC); 256 256 } else { /* IPA v4.0+ */ 257 257 /* Enable open global clocks in the CLKON configuration */ 258 - val = ipa_reg_bit(reg, CLKON_GLOBAL); 259 - val |= ipa_reg_bit(reg, GLOBAL_2X_CLK); 258 + val = reg_bit(reg, CLKON_GLOBAL); 259 + val |= reg_bit(reg, GLOBAL_2X_CLK); 260 260 } 261 261 262 262 iowrite32(val, ipa->reg_virt + reg_offset(reg)); ··· 279 279 val = ioread32(ipa->reg_virt + offset); 280 280 281 281 if (ipa->version == IPA_VERSION_4_0) { 282 - val &= ~ipa_reg_bit(reg, IPA_QMB_SELECT_CONS_EN); 283 - val &= ~ipa_reg_bit(reg, IPA_QMB_SELECT_PROD_EN); 284 - val &= ~ipa_reg_bit(reg, IPA_QMB_SELECT_GLOBAL_EN); 282 + val &= ~reg_bit(reg, IPA_QMB_SELECT_CONS_EN); 283 + val &= ~reg_bit(reg, IPA_QMB_SELECT_PROD_EN); 284 + val &= ~reg_bit(reg, IPA_QMB_SELECT_GLOBAL_EN); 285 285 } else if (ipa->version < IPA_VERSION_4_5) { 286 - val |= ipa_reg_bit(reg, GSI_MULTI_AXI_MASTERS_DIS); 286 + val |= reg_bit(reg, GSI_MULTI_AXI_MASTERS_DIS); 287 287 } else { 288 288 /* For IPA v4.5 FULL_FLUSH_WAIT_RS_CLOSURE_EN is 0 */ 289 289 } 290 290 291 - val |= ipa_reg_bit(reg, GSI_MULTI_INORDER_RD_DIS); 292 - val |= ipa_reg_bit(reg, GSI_MULTI_INORDER_WR_DIS); 291 + val |= reg_bit(reg, GSI_MULTI_INORDER_RD_DIS); 292 + val |= reg_bit(reg, GSI_MULTI_INORDER_WR_DIS); 293 293 294 294 iowrite32(val, ipa->reg_virt + offset); 295 295 } ··· 311 311 /* Max outstanding write accesses for QSB masters */ 312 312 reg = ipa_reg(ipa, QSB_MAX_WRITES); 313 313 314 - val = ipa_reg_encode(reg, GEN_QMB_0_MAX_WRITES, data0->max_writes); 314 + val = reg_encode(reg, GEN_QMB_0_MAX_WRITES, data0->max_writes); 315 315 if (data->qsb_count > 1) 316 - val |= ipa_reg_encode(reg, GEN_QMB_1_MAX_WRITES, 317 - data1->max_writes); 316 + val |= reg_encode(reg, GEN_QMB_1_MAX_WRITES, data1->max_writes); 318 317 319 318 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 320 319 321 320 /* Max outstanding read accesses for QSB masters */ 322 321 reg = ipa_reg(ipa, QSB_MAX_READS); 323 322 324 - val = ipa_reg_encode(reg, GEN_QMB_0_MAX_READS, data0->max_reads); 323 + val = reg_encode(reg, GEN_QMB_0_MAX_READS, data0->max_reads); 325 324 if (ipa->version >= IPA_VERSION_4_0) 326 - val |= ipa_reg_encode(reg, GEN_QMB_0_MAX_READS_BEATS, 327 - data0->max_reads_beats); 325 + val |= reg_encode(reg, GEN_QMB_0_MAX_READS_BEATS, 326 + data0->max_reads_beats); 328 327 if (data->qsb_count > 1) { 329 - val = ipa_reg_encode(reg, GEN_QMB_1_MAX_READS, 330 - data1->max_reads); 328 + val = reg_encode(reg, GEN_QMB_1_MAX_READS, data1->max_reads); 331 329 if (ipa->version >= IPA_VERSION_4_0) 332 - val |= ipa_reg_encode(reg, GEN_QMB_1_MAX_READS_BEATS, 333 - data1->max_reads_beats); 330 + val |= reg_encode(reg, GEN_QMB_1_MAX_READS_BEATS, 331 + data1->max_reads_beats); 334 332 } 335 333 336 334 iowrite32(val, ipa->reg_virt + reg_offset(reg)); ··· 377 379 378 380 reg = ipa_reg(ipa, QTIME_TIMESTAMP_CFG); 379 381 /* Set DPL time stamp resolution to use Qtime (instead of 1 msec) */ 380 - val = ipa_reg_encode(reg, DPL_TIMESTAMP_LSB, DPL_TIMESTAMP_SHIFT); 381 - val |= ipa_reg_bit(reg, DPL_TIMESTAMP_SEL); 382 + val = reg_encode(reg, DPL_TIMESTAMP_LSB, DPL_TIMESTAMP_SHIFT); 383 + val |= reg_bit(reg, DPL_TIMESTAMP_SEL); 382 384 /* Configure tag and NAT Qtime timestamp resolution as well */ 383 - val = ipa_reg_encode(reg, TAG_TIMESTAMP_LSB, TAG_TIMESTAMP_SHIFT); 384 - val = ipa_reg_encode(reg, NAT_TIMESTAMP_LSB, NAT_TIMESTAMP_SHIFT); 385 + val = reg_encode(reg, TAG_TIMESTAMP_LSB, TAG_TIMESTAMP_SHIFT); 386 + val = reg_encode(reg, NAT_TIMESTAMP_LSB, NAT_TIMESTAMP_SHIFT); 385 387 386 388 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 387 389 388 390 /* Set granularity of pulse generators used for other timers */ 389 391 reg = ipa_reg(ipa, TIMERS_PULSE_GRAN_CFG); 390 - val = ipa_reg_encode(reg, PULSE_GRAN_0, IPA_GRAN_100_US); 391 - val |= ipa_reg_encode(reg, PULSE_GRAN_1, IPA_GRAN_1_MS); 392 + val = reg_encode(reg, PULSE_GRAN_0, IPA_GRAN_100_US); 393 + val |= reg_encode(reg, PULSE_GRAN_1, IPA_GRAN_1_MS); 392 394 if (ipa->version >= IPA_VERSION_5_0) { 393 - val |= ipa_reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_10_MS); 394 - val |= ipa_reg_encode(reg, PULSE_GRAN_3, IPA_GRAN_10_MS); 395 + val |= reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_10_MS); 396 + val |= reg_encode(reg, PULSE_GRAN_3, IPA_GRAN_10_MS); 395 397 } else { 396 - val |= ipa_reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_1_MS); 398 + val |= reg_encode(reg, PULSE_GRAN_2, IPA_GRAN_1_MS); 397 399 } 398 400 399 401 iowrite32(val, ipa->reg_virt + reg_offset(reg)); ··· 402 404 reg = ipa_reg(ipa, TIMERS_XO_CLK_DIV_CFG); 403 405 offset = reg_offset(reg); 404 406 405 - val = ipa_reg_encode(reg, DIV_VALUE, IPA_XO_CLOCK_DIVIDER - 1); 407 + val = reg_encode(reg, DIV_VALUE, IPA_XO_CLOCK_DIVIDER - 1); 406 408 407 409 iowrite32(val, ipa->reg_virt + offset); 408 410 409 411 /* Divider value is set; re-enable the common timer clock divider */ 410 - val |= ipa_reg_bit(reg, DIV_ENABLE); 412 + val |= reg_bit(reg, DIV_ENABLE); 411 413 412 414 iowrite32(val, ipa->reg_virt + offset); 413 415 } ··· 421 423 422 424 reg = ipa_reg(ipa, COUNTER_CFG); 423 425 /* If defined, EOT_COAL_GRANULARITY is 0 */ 424 - val = ipa_reg_encode(reg, AGGR_GRANULARITY, granularity); 426 + val = reg_encode(reg, AGGR_GRANULARITY, granularity); 425 427 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 426 428 } 427 429 ··· 465 467 return; 466 468 467 469 reg = ipa_reg(ipa, IDLE_INDICATION_CFG); 468 - val = ipa_reg_encode(reg, ENTER_IDLE_DEBOUNCE_THRESH, 469 - enter_idle_debounce_thresh); 470 + val = reg_encode(reg, ENTER_IDLE_DEBOUNCE_THRESH, 471 + enter_idle_debounce_thresh); 470 472 if (const_non_idle_enable) 471 - val |= ipa_reg_bit(reg, CONST_NON_IDLE_ENABLE); 473 + val |= reg_bit(reg, CONST_NON_IDLE_ENABLE); 472 474 473 475 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 474 476 }
+3 -3
drivers/net/ipa/ipa_mem.c
··· 115 115 offset = ipa->mem_offset + mem->offset; 116 116 117 117 reg = ipa_reg(ipa, LOCAL_PKT_PROC_CNTXT); 118 - val = ipa_reg_encode(reg, IPA_BASE_ADDR, offset); 118 + val = reg_encode(reg, IPA_BASE_ADDR, offset); 119 119 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 120 120 121 121 return 0; ··· 331 331 val = ioread32(ipa->reg_virt + reg_offset(reg)); 332 332 333 333 /* The fields in the register are in 8 byte units */ 334 - ipa->mem_offset = 8 * ipa_reg_decode(reg, MEM_BADDR, val); 334 + ipa->mem_offset = 8 * reg_decode(reg, MEM_BADDR, val); 335 335 336 336 /* Make sure the end is within the region's mapped space */ 337 - mem_size = 8 * ipa_reg_decode(reg, MEM_SIZE, val); 337 + mem_size = 8 * reg_decode(reg, MEM_SIZE, val); 338 338 339 339 /* If the sizes don't match, issue a warning */ 340 340 if (ipa->mem_offset + mem_size < ipa->mem_size) {
+2 -54
drivers/net/ipa/ipa_reg.h
··· 45 45 * an array of field masks, indexed by field ID. Two functions are 46 46 * used to access register fields; both take an ipa_reg structure as 47 47 * argument. To encode a value to be represented in a register field, 48 - * the value and field ID are passed to ipa_reg_encode(). To extract 48 + * the value and field ID are passed to reg_encode(). To extract 49 49 * a value encoded in a register field, the field ID is passed to 50 - * ipa_reg_decode(). In addition, for single-bit fields, ipa_reg_bit() 50 + * reg_decode(). In addition, for single-bit fields, reg_bit() 51 51 * can be used to either encode the bit value, or to generate a mask 52 52 * used to extract the bit value. 53 53 */ ··· 645 645 extern const struct regs ipa_regs_v4_7; 646 646 extern const struct regs ipa_regs_v4_9; 647 647 extern const struct regs ipa_regs_v4_11; 648 - 649 - /* Return the field mask for a field in a register */ 650 - static inline u32 ipa_reg_fmask(const struct reg *reg, u32 field_id) 651 - { 652 - if (!reg || WARN_ON(field_id >= reg->fcount)) 653 - return 0; 654 - 655 - return reg->fmask[field_id]; 656 - } 657 - 658 - /* Return the mask for a single-bit field in a register */ 659 - static inline u32 ipa_reg_bit(const struct reg *reg, u32 field_id) 660 - { 661 - u32 fmask = ipa_reg_fmask(reg, field_id); 662 - 663 - WARN_ON(!is_power_of_2(fmask)); 664 - 665 - return fmask; 666 - } 667 - 668 - /* Encode a value into the given field of a register */ 669 - static inline u32 670 - ipa_reg_encode(const struct reg *reg, u32 field_id, u32 val) 671 - { 672 - u32 fmask = ipa_reg_fmask(reg, field_id); 673 - 674 - if (!fmask) 675 - return 0; 676 - 677 - val <<= __ffs(fmask); 678 - if (WARN_ON(val & ~fmask)) 679 - return 0; 680 - 681 - return val; 682 - } 683 - 684 - /* Given a register value, decode (extract) the value in the given field */ 685 - static inline u32 686 - ipa_reg_decode(const struct reg *reg, u32 field_id, u32 val) 687 - { 688 - u32 fmask = ipa_reg_fmask(reg, field_id); 689 - 690 - return fmask ? (val & fmask) >> __ffs(fmask) : 0; 691 - } 692 - 693 - /* Return the maximum value representable by the given field; always 2^n - 1 */ 694 - static inline u32 ipa_reg_field_max(const struct reg *reg, u32 field_id) 695 - { 696 - u32 fmask = ipa_reg_fmask(reg, field_id); 697 - 698 - return fmask ? fmask >> __ffs(fmask) : 0; 699 - } 700 648 701 649 const struct reg *ipa_reg(struct ipa *ipa, enum ipa_reg_id reg_id); 702 650
+4 -4
drivers/net/ipa/ipa_resource.c
··· 76 76 { 77 77 u32 val; 78 78 79 - val = ipa_reg_encode(reg, X_MIN_LIM, xlimits->min); 80 - val |= ipa_reg_encode(reg, X_MAX_LIM, xlimits->max); 79 + val = reg_encode(reg, X_MIN_LIM, xlimits->min); 80 + val |= reg_encode(reg, X_MAX_LIM, xlimits->max); 81 81 if (ylimits) { 82 - val |= ipa_reg_encode(reg, Y_MIN_LIM, ylimits->min); 83 - val |= ipa_reg_encode(reg, Y_MAX_LIM, ylimits->max); 82 + val |= reg_encode(reg, Y_MIN_LIM, ylimits->min); 83 + val |= reg_encode(reg, Y_MAX_LIM, ylimits->max); 84 84 } 85 85 86 86 iowrite32(val, ipa->reg_virt + reg_n_offset(reg, resource_type));
+8 -8
drivers/net/ipa/ipa_table.c
··· 361 361 if (ipa->version < IPA_VERSION_5_0) { 362 362 reg = ipa_reg(ipa, FILT_ROUT_HASH_FLUSH); 363 363 364 - val = ipa_reg_bit(reg, IPV6_ROUTER_HASH); 365 - val |= ipa_reg_bit(reg, IPV6_FILTER_HASH); 366 - val |= ipa_reg_bit(reg, IPV4_ROUTER_HASH); 367 - val |= ipa_reg_bit(reg, IPV4_FILTER_HASH); 364 + val = reg_bit(reg, IPV6_ROUTER_HASH); 365 + val |= reg_bit(reg, IPV6_FILTER_HASH); 366 + val |= reg_bit(reg, IPV4_ROUTER_HASH); 367 + val |= reg_bit(reg, IPV4_FILTER_HASH); 368 368 } else { 369 369 reg = ipa_reg(ipa, FILT_ROUT_CACHE_FLUSH); 370 370 371 371 /* IPA v5.0+ uses a unified cache (both IPv4 and IPv6) */ 372 - val = ipa_reg_bit(reg, ROUTER_CACHE); 373 - val |= ipa_reg_bit(reg, FILTER_CACHE); 372 + val = reg_bit(reg, ROUTER_CACHE); 373 + val |= reg_bit(reg, FILTER_CACHE); 374 374 } 375 375 376 376 ipa_cmd_register_write_add(trans, reg_offset(reg), val, val, false); ··· 503 503 val = ioread32(endpoint->ipa->reg_virt + offset); 504 504 505 505 /* Zero all filter-related fields, preserving the rest */ 506 - val &= ~ipa_reg_fmask(reg, FILTER_HASH_MSK_ALL); 506 + val &= ~reg_fmask(reg, FILTER_HASH_MSK_ALL); 507 507 } else { 508 508 /* IPA v5.0 separates filter and router cache configuration */ 509 509 reg = ipa_reg(ipa, ENDP_FILTER_CACHE_CFG); ··· 562 562 val = ioread32(ipa->reg_virt + offset); 563 563 564 564 /* Zero all route-related fields, preserving the rest */ 565 - val &= ~ipa_reg_fmask(reg, ROUTER_HASH_MSK_ALL); 565 + val &= ~reg_fmask(reg, ROUTER_HASH_MSK_ALL); 566 566 } else { 567 567 /* IPA v5.0 separates filter and router cache configuration */ 568 568 reg = ipa_reg(ipa, ENDP_ROUTER_CACHE_CFG);
+1 -1
drivers/net/ipa/ipa_uc.c
··· 243 243 244 244 /* Use an interrupt to tell the microcontroller the command is ready */ 245 245 reg = ipa_reg(ipa, IPA_IRQ_UC); 246 - val = ipa_reg_bit(reg, UC_INTR); 246 + val = reg_bit(reg, UC_INTR); 247 247 248 248 iowrite32(val, ipa->reg_virt + reg_offset(reg)); 249 249 }
+51
drivers/net/ipa/reg.h
··· 67 67 return regs->reg[reg_id]; 68 68 } 69 69 70 + /* Return the field mask for a field in a register, or 0 on error */ 71 + static inline u32 reg_fmask(const struct reg *reg, u32 field_id) 72 + { 73 + if (!reg || WARN_ON(field_id >= reg->fcount)) 74 + return 0; 75 + 76 + return reg->fmask[field_id]; 77 + } 78 + 79 + /* Return the mask for a single-bit field in a register, or 0 on error */ 80 + static inline u32 reg_bit(const struct reg *reg, u32 field_id) 81 + { 82 + u32 fmask = reg_fmask(reg, field_id); 83 + 84 + if (WARN_ON(!is_power_of_2(fmask))) 85 + return 0; 86 + 87 + return fmask; 88 + } 89 + 90 + /* Return the maximum value representable by the given field; always 2^n - 1 */ 91 + static inline u32 reg_field_max(const struct reg *reg, u32 field_id) 92 + { 93 + u32 fmask = reg_fmask(reg, field_id); 94 + 95 + return fmask ? fmask >> __ffs(fmask) : 0; 96 + } 97 + 98 + /* Encode a value into the given field of a register */ 99 + static inline u32 reg_encode(const struct reg *reg, u32 field_id, u32 val) 100 + { 101 + u32 fmask = reg_fmask(reg, field_id); 102 + 103 + if (!fmask) 104 + return 0; 105 + 106 + val <<= __ffs(fmask); 107 + if (WARN_ON(val & ~fmask)) 108 + return 0; 109 + 110 + return val; 111 + } 112 + 113 + /* Given a register value, decode (extract) the value in the given field */ 114 + static inline u32 reg_decode(const struct reg *reg, u32 field_id, u32 val) 115 + { 116 + u32 fmask = reg_fmask(reg, field_id); 117 + 118 + return fmask ? (val & fmask) >> __ffs(fmask) : 0; 119 + } 120 + 70 121 /* Returns 0 for NULL reg; warning should have already been issued */ 71 122 static inline u32 reg_offset(const struct reg *reg) 72 123 {