xive: Rework xive_set_eq_info() to store all info even when masking
opal_get_xive() should return values set by opal_set_xive() for
the server number even if the call was made with prio 0xff, so
let's always store the proper values.
@@ -1621,15 +1621,15 @@ static bool xive_set_eq_info(uint32_t isn, uint32_t target, uint8_t prio)
new_ive = ive->w;
/* Are we masking ? */
- if (prio == 0xff) {
- /* Masking, just set the M bit */
- if (!is_escalation)
+ if (prio == 0xff && !is_escalation) {
new_ive |= IVE_MASKED;
-
xive_vdbg(x, "ISN %x masked !\n", isn);
} else {
-
- /* Unmasking, re-target the IVE. First find the EQ
+ /* Unmasking */
+ new_ive = ive->w & ~IVE_MASKED;
+ xive_vdbg(x, "ISN %x unmasked !\n", isn);
+ }
+ /* Re-target the IVE. First find the EQ
* correponding to the target
*/
if (!xive_eq_for_target(target, prio, &eq_blk, &eq_idx)) {
@@ -1642,13 +1642,11 @@ static bool xive_set_eq_info(uint32_t isn, uint32_t target, uint8_t prio)
/* Try to update it atomically to avoid an intermediary
* stale state
*/
- new_ive = ive->w & ~IVE_MASKED;
new_ive = SETFIELD(IVE_EQ_BLOCK, new_ive, eq_blk);
new_ive = SETFIELD(IVE_EQ_INDEX, new_ive, eq_idx);
xive_vdbg(x,"ISN %x routed to eq %x/%x IVE=%016llx !\n",
isn, eq_blk, eq_idx, new_ive);
- }
/* Updating the cache differs between real IVEs and escalation
* IVEs inside an EQ
