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

PM / devfreq: rockchip-dfi: switch to FIELD_PREP_WM16 macro

The era of hand-rolled HIWORD_UPDATE macros is over, at least for those
drivers that use constant masks.

Like many other Rockchip drivers, rockchip-dfi brings with it its own
HIWORD_UPDATE macro. This variant doesn't shift the value (and like the
others, doesn't do any checking).

Remove it, and replace instances of it with hw_bitfield.h's
FIELD_PREP_WM16. Since FIELD_PREP_WM16 requires contiguous masks and
shifts the value for us, some reshuffling of definitions needs to
happen.

This gives us better compile-time error checking, and in my opinion,
nicer code.

Tested on an RK3568 ODROID-M1 board (LPDDR4X at 1560 MHz, an RK3588
Radxa ROCK 5B board (LPDDR4X at 2112 MHz) and an RK3588 Radxa ROCK 5T
board (LPDDR5 at 2400 MHz). perf measurements were consistent with the
measurements of stress-ng --stream in all cases.

Signed-off-by: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Signed-off-by: Yury Norov (NVIDIA) <yury.norov@gmail.com>

authored by

Nicolas Frattaroli and committed by
Yury Norov (NVIDIA)
7e85ac9d 0f587883

+22 -23
+22 -23
drivers/devfreq/event/rockchip-dfi.c
··· 20 20 #include <linux/of.h> 21 21 #include <linux/of_device.h> 22 22 #include <linux/bitfield.h> 23 + #include <linux/hw_bitfield.h> 23 24 #include <linux/bits.h> 24 25 #include <linux/perf_event.h> 25 26 ··· 31 30 32 31 #define DMC_MAX_CHANNELS 4 33 32 34 - #define HIWORD_UPDATE(val, mask) ((val) | (mask) << 16) 35 - 36 33 /* DDRMON_CTRL */ 37 34 #define DDRMON_CTRL 0x04 38 35 #define DDRMON_CTRL_LPDDR5 BIT(6) ··· 40 41 #define DDRMON_CTRL_LPDDR23 BIT(2) 41 42 #define DDRMON_CTRL_SOFTWARE_EN BIT(1) 42 43 #define DDRMON_CTRL_TIMER_CNT_EN BIT(0) 43 - #define DDRMON_CTRL_DDR_TYPE_MASK (DDRMON_CTRL_LPDDR5 | \ 44 - DDRMON_CTRL_DDR4 | \ 45 - DDRMON_CTRL_LPDDR4 | \ 46 - DDRMON_CTRL_LPDDR23) 47 44 #define DDRMON_CTRL_LP5_BANK_MODE_MASK GENMASK(8, 7) 48 45 49 46 #define DDRMON_CH0_WR_NUM 0x20 ··· 119 124 unsigned int count_multiplier; /* number of data clocks per count */ 120 125 }; 121 126 122 - static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl, 123 - u32 *mask) 127 + static int rockchip_dfi_ddrtype_to_ctrl(struct rockchip_dfi *dfi, u32 *ctrl) 124 128 { 125 129 u32 ddrmon_ver; 126 - 127 - *mask = DDRMON_CTRL_DDR_TYPE_MASK; 128 130 129 131 switch (dfi->ddr_type) { 130 132 case ROCKCHIP_DDRTYPE_LPDDR2: 131 133 case ROCKCHIP_DDRTYPE_LPDDR3: 132 - *ctrl = DDRMON_CTRL_LPDDR23; 134 + *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 1) | 135 + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0) | 136 + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 0); 133 137 break; 134 138 case ROCKCHIP_DDRTYPE_LPDDR4: 135 139 case ROCKCHIP_DDRTYPE_LPDDR4X: 136 - *ctrl = DDRMON_CTRL_LPDDR4; 140 + *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) | 141 + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 1) | 142 + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 0); 137 143 break; 138 144 case ROCKCHIP_DDRTYPE_LPDDR5: 139 145 ddrmon_ver = readl_relaxed(dfi->regs); 140 146 if (ddrmon_ver < 0x40) { 141 - *ctrl = DDRMON_CTRL_LPDDR5 | dfi->lp5_bank_mode; 142 - *mask |= DDRMON_CTRL_LP5_BANK_MODE_MASK; 147 + *ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) | 148 + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0) | 149 + FIELD_PREP_WM16(DDRMON_CTRL_LPDDR5, 1) | 150 + FIELD_PREP_WM16(DDRMON_CTRL_LP5_BANK_MODE_MASK, 151 + dfi->lp5_bank_mode); 143 152 break; 144 153 } 145 154 ··· 171 172 void __iomem *dfi_regs = dfi->regs; 172 173 int i, ret = 0; 173 174 u32 ctrl; 174 - u32 ctrl_mask; 175 175 176 176 mutex_lock(&dfi->mutex); 177 177 ··· 184 186 goto out; 185 187 } 186 188 187 - ret = rockchip_dfi_ddrtype_to_ctrl(dfi, &ctrl, &ctrl_mask); 189 + ret = rockchip_dfi_ddrtype_to_ctrl(dfi, &ctrl); 188 190 if (ret) 189 191 goto out; 190 192 ··· 194 196 continue; 195 197 196 198 /* clear DDRMON_CTRL setting */ 197 - writel_relaxed(HIWORD_UPDATE(0, DDRMON_CTRL_TIMER_CNT_EN | 198 - DDRMON_CTRL_SOFTWARE_EN | DDRMON_CTRL_HARDWARE_EN), 199 + writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_TIMER_CNT_EN, 0) | 200 + FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 0) | 201 + FIELD_PREP_WM16(DDRMON_CTRL_HARDWARE_EN, 0), 199 202 dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL); 200 203 201 - writel_relaxed(HIWORD_UPDATE(ctrl, ctrl_mask), 202 - dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL); 204 + writel_relaxed(ctrl, dfi_regs + i * dfi->ddrmon_stride + 205 + DDRMON_CTRL); 203 206 204 207 /* enable count, use software mode */ 205 - writel_relaxed(HIWORD_UPDATE(DDRMON_CTRL_SOFTWARE_EN, DDRMON_CTRL_SOFTWARE_EN), 208 + writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 1), 206 209 dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL); 207 210 208 211 if (dfi->ddrmon_ctrl_single) ··· 233 234 if (!(dfi->channel_mask & BIT(i))) 234 235 continue; 235 236 236 - writel_relaxed(HIWORD_UPDATE(0, DDRMON_CTRL_SOFTWARE_EN), 237 - dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL); 237 + writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 0), 238 + dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL); 238 239 239 240 if (dfi->ddrmon_ctrl_single) 240 241 break;