Skip to content

Commit

Permalink
opal: Remove events notifier
Browse files Browse the repository at this point in the history
All users of the old opal events notifier have been converted over to
the irq domain so remove the event notifier functions.

Signed-off-by: Alistair Popple <alistair@popple.id.au>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Alistair Popple authored and Michael Ellerman committed May 22, 2015
1 parent 8034f71 commit 81f2f7c
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 95 deletions.
16 changes: 6 additions & 10 deletions arch/powerpc/platforms/powernv/opal-irqchip.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,27 +100,23 @@ void opal_handle_events(uint64_t events)
{
int virq, hwirq = 0;
u64 mask = opal_event_irqchip.mask;
u64 notifier_mask = 0;

if (!in_irq() && (events & mask)) {
last_outstanding_events = events;
irq_work_queue(&opal_event_irq_work);
return;
}

while (events) {
while (events & mask) {
hwirq = fls64(events) - 1;
virq = irq_find_mapping(opal_event_irqchip.domain,
hwirq);
if (virq) {
if (BIT_ULL(hwirq) & mask)
if (BIT_ULL(hwirq) & mask) {
virq = irq_find_mapping(opal_event_irqchip.domain,
hwirq);
if (virq)
generic_handle_irq(virq);
} else
notifier_mask |= BIT_ULL(hwirq);
}
events &= ~BIT_ULL(hwirq);
}

opal_do_notifier(notifier_mask);
}

static irqreturn_t opal_interrupt(int irq, void *data)
Expand Down
84 changes: 1 addition & 83 deletions arch/powerpc/platforms/powernv/opal.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,7 @@ static int mc_recoverable_range_len;

struct device_node *opal_node;
static DEFINE_SPINLOCK(opal_write_lock);
static ATOMIC_NOTIFIER_HEAD(opal_notifier_head);
static struct atomic_notifier_head opal_msg_notifier_head[OPAL_MSG_TYPE_MAX];
static DEFINE_SPINLOCK(opal_notifier_lock);
static uint64_t last_notified_mask = 0x0ul;
static atomic_t opal_notifier_hold = ATOMIC_INIT(0);
static uint32_t opal_heartbeat;

static void opal_reinit_cores(void)
Expand Down Expand Up @@ -223,82 +219,6 @@ static int __init opal_register_exception_handlers(void)
}
machine_early_initcall(powernv, opal_register_exception_handlers);

int opal_notifier_register(struct notifier_block *nb)
{
if (!nb) {
pr_warning("%s: Invalid argument (%p)\n",
__func__, nb);
return -EINVAL;
}

atomic_notifier_chain_register(&opal_notifier_head, nb);
return 0;
}
EXPORT_SYMBOL_GPL(opal_notifier_register);

int opal_notifier_unregister(struct notifier_block *nb)
{
if (!nb) {
pr_warning("%s: Invalid argument (%p)\n",
__func__, nb);
return -EINVAL;
}

atomic_notifier_chain_unregister(&opal_notifier_head, nb);
return 0;
}
EXPORT_SYMBOL_GPL(opal_notifier_unregister);

void opal_do_notifier(uint64_t events)
{
unsigned long flags;
uint64_t changed_mask;

if (atomic_read(&opal_notifier_hold))
return;

spin_lock_irqsave(&opal_notifier_lock, flags);
changed_mask = last_notified_mask ^ events;
last_notified_mask = events;
spin_unlock_irqrestore(&opal_notifier_lock, flags);

/*
* We feed with the event bits and changed bits for
* enough information to the callback.
*/
atomic_notifier_call_chain(&opal_notifier_head,
events, (void *)changed_mask);
}

void opal_notifier_update_evt(uint64_t evt_mask,
uint64_t evt_val)
{
unsigned long flags;

spin_lock_irqsave(&opal_notifier_lock, flags);
last_notified_mask &= ~evt_mask;
last_notified_mask |= evt_val;
spin_unlock_irqrestore(&opal_notifier_lock, flags);
}

void opal_notifier_enable(void)
{
int64_t rc;
__be64 evt = 0;

atomic_set(&opal_notifier_hold, 0);

/* Process pending events */
rc = opal_poll_events(&evt);
if (rc == OPAL_SUCCESS && evt)
opal_do_notifier(be64_to_cpu(evt));
}

void opal_notifier_disable(void)
{
atomic_set(&opal_notifier_hold, 1);
}

/*
* Opal message notifier based on message type. Allow subscribers to get
* notified for specific messgae type.
Expand Down Expand Up @@ -570,10 +490,8 @@ int opal_handle_hmi_exception(struct pt_regs *regs)

local_paca->hmi_event_available = 0;
rc = opal_poll_events(&evt);
if (rc == OPAL_SUCCESS && evt) {
opal_do_notifier(be64_to_cpu(evt));
if (rc == OPAL_SUCCESS && evt)
opal_handle_events(be64_to_cpu(evt));
}

return 1;
}
Expand Down
1 change: 0 additions & 1 deletion arch/powerpc/platforms/powernv/powernv.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ extern u32 pnv_get_supported_cpuidle_states(void);

extern void pnv_lpc_init(void);

extern void opal_do_notifier(uint64_t events);
extern void opal_handle_events(uint64_t events);
extern void opal_event_shutdown(void);

Expand Down
2 changes: 1 addition & 1 deletion arch/powerpc/platforms/powernv/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ static void pnv_prepare_going_down(void)
* Disable all notifiers from OPAL, we can't
* service interrupts anymore anyway
*/
opal_notifier_disable();
opal_event_shutdown();

/* Soft disable interrupts */
local_irq_disable();
Expand Down

0 comments on commit 81f2f7c

Please sign in to comment.