aboutsummaryrefslogtreecommitdiff
path: root/hw/prd.c
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2015-04-24 14:05:29 -0500
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-05-01 15:29:21 +1000
commitd0a66713c06b52f6c34d09e3612ac38db367eda6 (patch)
tree906ec61f812b1b4816d531cfbc132dde57fde27f /hw/prd.c
parentd0483a67a1e56323cecd7c59dd4e09a90d7640a6 (diff)
downloadskiboot-d0a66713c06b52f6c34d09e3612ac38db367eda6.zip
skiboot-d0a66713c06b52f6c34d09e3612ac38db367eda6.tar.gz
skiboot-d0a66713c06b52f6c34d09e3612ac38db367eda6.tar.bz2
prd: Only alter host presentation bits of IPOLL mask
We'll need to leave the FSI presentation bits clear, to allow OCCs to handle the checkstop interrupt. This modifies the PRD code to only touch the host presentation bits, both on init, and in response to incoming PRD actions. Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hw/prd.c')
-rw-r--r--hw/prd.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/hw/prd.c b/hw/prd.c
index e65ae57..4862213 100644
--- a/hw/prd.c
+++ b/hw/prd.c
@@ -226,12 +226,13 @@ static int ipoll_record_and_mask_pending(uint32_t proc)
lock(&ipoll_lock);
rc = xscom_read(proc, PRD_IPOLL_REG_STATUS, &status);
+ status &= PRD_IPOLL_MASK;
if (!rc)
__ipoll_update_mask(proc, true, status);
unlock(&ipoll_lock);
if (!rc)
- ipoll_status[proc] |= (status & PRD_IPOLL_MASK);
+ ipoll_status[proc] |= status;
return rc;
}
@@ -284,7 +285,8 @@ static int prd_msg_handle_init(struct opal_prd_msg *msg)
lock(&ipoll_lock);
for_each_chip(chip) {
- __ipoll_update_mask(chip->id, false, msg->init.ipoll);
+ __ipoll_update_mask(chip->id, false,
+ msg->init.ipoll & PRD_IPOLL_MASK);
}
unlock(&ipoll_lock);
@@ -309,7 +311,7 @@ static int prd_msg_handle_fini(void)
lock(&ipoll_lock);
for_each_chip(chip) {
- __ipoll_update_mask(chip->id, true, -1ul);
+ __ipoll_update_mask(chip->id, true, PRD_IPOLL_MASK);
}
unlock(&ipoll_lock);
@@ -345,7 +347,7 @@ void prd_init(void)
/* mask everything */
lock(&ipoll_lock);
for_each_chip(chip) {
- __ipoll_update_mask(chip->id, true, -1ul);
+ __ipoll_update_mask(chip->id, true, PRD_IPOLL_MASK);
}
unlock(&ipoll_lock);