aboutsummaryrefslogtreecommitdiff
path: root/hw/intc/xive2.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/intc/xive2.c')
-rw-r--r--hw/intc/xive2.c45
1 files changed, 31 insertions, 14 deletions
diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
index ee5fa26..fbb3b79 100644
--- a/hw/intc/xive2.c
+++ b/hw/intc/xive2.c
@@ -95,6 +95,35 @@ static void xive2_nvgc_set_backlog(Xive2Nvgc *nvgc, uint8_t priority,
}
}
+static uint32_t xive2_nvgc_get_idx(uint32_t nvp_idx, uint8_t group)
+{
+ uint32_t nvgc_idx;
+
+ if (group > 0) {
+ nvgc_idx = (nvp_idx & (0xffffffffULL << group)) |
+ ((1 << (group - 1)) - 1);
+ } else {
+ nvgc_idx = nvp_idx;
+ }
+
+ return nvgc_idx;
+}
+
+static uint8_t xive2_nvgc_get_blk(uint8_t nvp_blk, uint8_t crowd)
+{
+ uint8_t nvgc_blk;
+
+ if (crowd > 0) {
+ crowd = (crowd == 3) ? 4 : crowd;
+ nvgc_blk = (nvp_blk & (0xffffffffULL << crowd)) |
+ ((1 << (crowd - 1)) - 1);
+ } else {
+ nvgc_blk = nvp_blk;
+ }
+
+ return nvgc_blk;
+}
+
uint64_t xive2_presenter_nvgc_backlog_op(XivePresenter *xptr,
bool crowd,
uint8_t blk, uint32_t idx,
@@ -638,20 +667,8 @@ static void xive2_redistribute(Xive2Router *xrtr, XiveTCTX *tctx, uint8_t ring)
trace_xive_redistribute(tctx->cs->cpu_index, ring, nvp_blk, nvp_idx);
/* convert crowd/group to blk/idx */
- if (group > 0) {
- nvgc_idx = (nvp_idx & (0xffffffff << group)) |
- ((1 << (group - 1)) - 1);
- } else {
- nvgc_idx = nvp_idx;
- }
-
- if (crowd > 0) {
- crowd = (crowd == 3) ? 4 : crowd;
- nvgc_blk = (nvp_blk & (0xffffffff << crowd)) |
- ((1 << (crowd - 1)) - 1);
- } else {
- nvgc_blk = nvp_blk;
- }
+ nvgc_idx = xive2_nvgc_get_idx(nvp_idx, group);
+ nvgc_blk = xive2_nvgc_get_blk(nvp_blk, crowd);
/* Use blk/idx to retrieve the NVGC */
if (xive2_router_get_nvgc(xrtr, crowd, nvgc_blk, nvgc_idx, &nvgc)) {