|
@@ -86,6 +86,48 @@ static void append_pic(struct rt_pic *pic)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void rt_pic_default_name(struct rt_pic *pic)
|
|
|
|
+{
|
|
|
|
+ if (pic)
|
|
|
|
+ {
|
|
|
|
+ #if RT_NAME_MAX > 0
|
|
|
|
+ rt_strncpy(pic->parent.name, "PIC", RT_NAME_MAX);
|
|
|
|
+ #else
|
|
|
|
+ pic->parent.name = "PIC";
|
|
|
|
+ #endif
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+struct rt_pic *rt_pic_dynamic_cast(void *ptr)
|
|
|
|
+{
|
|
|
|
+ struct rt_pic *pic = RT_NULL, *tmp = RT_NULL;
|
|
|
|
+
|
|
|
|
+ if (ptr)
|
|
|
|
+ {
|
|
|
|
+ struct rt_object *obj = ptr;
|
|
|
|
+
|
|
|
|
+ if (obj->type == RT_Object_Class_Unknown)
|
|
|
|
+ {
|
|
|
|
+ tmp = (void *)obj;
|
|
|
|
+ }
|
|
|
|
+ else if (obj->type == RT_Object_Class_Device)
|
|
|
|
+ {
|
|
|
|
+ tmp = (void *)obj + sizeof(struct rt_device);
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ tmp = (void *)obj + sizeof(struct rt_object);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (tmp && !rt_strcmp(tmp->parent.name, "PIC"))
|
|
|
|
+ {
|
|
|
|
+ pic = tmp;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return pic;
|
|
|
|
+}
|
|
|
|
+
|
|
rt_err_t rt_pic_linear_irq(struct rt_pic *pic, rt_size_t irq_nr)
|
|
rt_err_t rt_pic_linear_irq(struct rt_pic *pic, rt_size_t irq_nr)
|
|
{
|
|
{
|
|
rt_err_t err = RT_EOK;
|
|
rt_err_t err = RT_EOK;
|
|
@@ -98,6 +140,9 @@ rt_err_t rt_pic_linear_irq(struct rt_pic *pic, rt_size_t irq_nr)
|
|
{
|
|
{
|
|
rt_list_init(&pic->list);
|
|
rt_list_init(&pic->list);
|
|
|
|
|
|
|
|
+ rt_pic_default_name(pic);
|
|
|
|
+ pic->parent.type = RT_Object_Class_Unknown;
|
|
|
|
+
|
|
pic->irq_start = _pirq_hash_idx;
|
|
pic->irq_start = _pirq_hash_idx;
|
|
pic->irq_nr = irq_nr;
|
|
pic->irq_nr = irq_nr;
|
|
pic->pirqs = &_pirq_hash[_pirq_hash_idx];
|
|
pic->pirqs = &_pirq_hash[_pirq_hash_idx];
|
|
@@ -135,6 +180,8 @@ static void config_pirq(struct rt_pic *pic, struct rt_pic_irq *pirq, int irq, in
|
|
|
|
|
|
pirq->pic = pic;
|
|
pirq->pic = pic;
|
|
|
|
|
|
|
|
+ rt_list_init(&pirq->list);
|
|
|
|
+ rt_list_init(&pirq->children_nodes);
|
|
rt_list_init(&pirq->isr.list);
|
|
rt_list_init(&pirq->isr.list);
|
|
|
|
|
|
rt_spin_unlock_irqrestore(&pirq->rw_lock, level);
|
|
rt_spin_unlock_irqrestore(&pirq->rw_lock, level);
|
|
@@ -195,91 +242,84 @@ struct rt_pic_irq *rt_pic_find_ipi(struct rt_pic *pic, int ipi_index)
|
|
return pirq;
|
|
return pirq;
|
|
}
|
|
}
|
|
|
|
|
|
-int rt_pic_cascade(struct rt_pic *pic, struct rt_pic *parent_pic, int hwirq, rt_uint32_t mode)
|
|
|
|
|
|
+struct rt_pic_irq *rt_pic_find_pirq(struct rt_pic *pic, int irq)
|
|
{
|
|
{
|
|
- int irq = -RT_EINVAL;
|
|
|
|
-
|
|
|
|
- if (pic && parent_pic && hwirq >= 0)
|
|
|
|
|
|
+ if (pic && irq >= pic->irq_start && irq <= pic->irq_start + pic->irq_nr)
|
|
{
|
|
{
|
|
- struct rt_pic *ppic = parent_pic;
|
|
|
|
- rt_ubase_t level = rt_spin_lock_irqsave(&_pic_lock);
|
|
|
|
|
|
+ return &pic->pirqs[irq - pic->irq_start];
|
|
|
|
+ }
|
|
|
|
|
|
- while (!ppic->ops->irq_map && ppic->parent)
|
|
|
|
- {
|
|
|
|
- ppic = ppic->parent;
|
|
|
|
- }
|
|
|
|
|
|
+ return RT_NULL;
|
|
|
|
+}
|
|
|
|
|
|
- rt_spin_unlock_irqrestore(&_pic_lock, level);
|
|
|
|
|
|
+rt_err_t rt_pic_cascade(struct rt_pic_irq *pirq, int parent_irq)
|
|
|
|
+{
|
|
|
|
+ rt_err_t err = RT_EOK;
|
|
|
|
|
|
- if (ppic->ops->irq_map)
|
|
|
|
- {
|
|
|
|
- struct rt_pic_irq *pirq;
|
|
|
|
|
|
+ if (pirq && !pirq->parent && parent_irq >= 0)
|
|
|
|
+ {
|
|
|
|
+ struct rt_pic_irq *parent;
|
|
|
|
|
|
- irq = ppic->ops->irq_map(ppic, hwirq, mode);
|
|
|
|
|
|
+ rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
- if (irq >= 0 && (pirq = irq2pirq(irq)))
|
|
|
|
- {
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ parent = irq2pirq(parent_irq);
|
|
|
|
|
|
- pirq->pic = pic;
|
|
|
|
- pic->parent = parent_pic;
|
|
|
|
|
|
+ if (parent)
|
|
|
|
+ {
|
|
|
|
+ pirq->parent = parent;
|
|
|
|
+ pirq->priority = parent->priority;
|
|
|
|
+ rt_memcpy(&pirq->affinity, &parent->affinity, sizeof(pirq->affinity));
|
|
|
|
+ }
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
- if (rt_list_isempty(&pic->list))
|
|
|
|
- {
|
|
|
|
- rt_ubase_t level = rt_spin_lock_irqsave(&_pic_lock);
|
|
|
|
|
|
+ if (parent && pirq->pic->ops->flags & RT_PIC_F_IRQ_ROUTING)
|
|
|
|
+ {
|
|
|
|
+ rt_spin_lock(&parent->rw_lock);
|
|
|
|
|
|
- append_pic(pic);
|
|
|
|
|
|
+ rt_list_insert_before(&parent->children_nodes, &pirq->list);
|
|
|
|
|
|
- rt_spin_unlock_irqrestore(&_pic_lock, level);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- irq = -RT_ENOSYS;
|
|
|
|
|
|
+ rt_spin_unlock(&parent->rw_lock);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ err = -RT_EINVAL;
|
|
|
|
+ }
|
|
|
|
|
|
- return irq;
|
|
|
|
|
|
+ return err;
|
|
}
|
|
}
|
|
|
|
|
|
-void rt_pic_uncascade(struct rt_pic *pic, int irq)
|
|
|
|
|
|
+rt_err_t rt_pic_uncascade(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- struct rt_pic_irq *pirq;
|
|
|
|
|
|
+ rt_err_t err = RT_EOK;
|
|
|
|
|
|
- if (pic && pic->parent && irq >= 0 && (pirq = irq2pirq(irq)))
|
|
|
|
|
|
+ if (pirq && pirq->parent)
|
|
{
|
|
{
|
|
- struct rt_pic *ppic, *prev = RT_NULL;
|
|
|
|
|
|
+ struct rt_pic_irq *parent;
|
|
|
|
|
|
rt_spin_lock(&pirq->rw_lock);
|
|
rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
- ppic = pirq->pic;
|
|
|
|
|
|
+ parent = pirq->parent;
|
|
|
|
+ pirq->parent = RT_NULL;
|
|
|
|
|
|
- while (ppic && pic->parent != ppic->parent)
|
|
|
|
- {
|
|
|
|
- prev = ppic;
|
|
|
|
- ppic = ppic->parent;
|
|
|
|
- }
|
|
|
|
|
|
+ rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
- if (ppic)
|
|
|
|
|
|
+ if (parent && pirq->pic->ops->flags & RT_PIC_F_IRQ_ROUTING)
|
|
{
|
|
{
|
|
- if (prev)
|
|
|
|
- {
|
|
|
|
- pirq->pic = prev;
|
|
|
|
- prev->parent = pic->parent;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- pirq->pic = pic->parent;
|
|
|
|
- }
|
|
|
|
|
|
+ rt_spin_lock(&parent->rw_lock);
|
|
|
|
|
|
- pic->parent = RT_NULL;
|
|
|
|
- }
|
|
|
|
|
|
+ rt_list_remove(&pirq->list);
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_spin_unlock(&parent->rw_lock);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ err = -RT_EINVAL;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return err;
|
|
}
|
|
}
|
|
|
|
|
|
rt_err_t rt_pic_attach_irq(int irq, rt_isr_handler_t handler, void *uid, const char *name, int flags)
|
|
rt_err_t rt_pic_attach_irq(int irq, rt_isr_handler_t handler, void *uid, const char *name, int flags)
|
|
@@ -453,7 +493,7 @@ rt_err_t rt_pic_do_traps(void)
|
|
|
|
|
|
rt_err_t rt_pic_handle_isr(struct rt_pic_irq *pirq)
|
|
rt_err_t rt_pic_handle_isr(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- rt_err_t err = RT_EOK;
|
|
|
|
|
|
+ rt_err_t err = -RT_EEMPTY;
|
|
rt_list_t *handler_nodes;
|
|
rt_list_t *handler_nodes;
|
|
struct rt_irq_desc *action;
|
|
struct rt_irq_desc *action;
|
|
|
|
|
|
@@ -466,6 +506,20 @@ rt_err_t rt_pic_handle_isr(struct rt_pic_irq *pirq)
|
|
handler_nodes = &pirq->isr.list;
|
|
handler_nodes = &pirq->isr.list;
|
|
action = &pirq->isr.action;
|
|
action = &pirq->isr.action;
|
|
|
|
|
|
|
|
+ if (!rt_list_isempty(&pirq->children_nodes))
|
|
|
|
+ {
|
|
|
|
+ struct rt_pic_irq *child;
|
|
|
|
+
|
|
|
|
+ rt_list_for_each_entry(child, &pirq->children_nodes, list)
|
|
|
|
+ {
|
|
|
|
+ rt_pic_irq_ack(child->irq);
|
|
|
|
+
|
|
|
|
+ err = rt_pic_handle_isr(child);
|
|
|
|
+
|
|
|
|
+ rt_pic_irq_eoi(child->irq);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (action->handler)
|
|
if (action->handler)
|
|
{
|
|
{
|
|
action->handler(pirq->irq, action->param);
|
|
action->handler(pirq->irq, action->param);
|
|
@@ -489,10 +543,8 @@ rt_err_t rt_pic_handle_isr(struct rt_pic_irq *pirq)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- err = -RT_EEMPTY;
|
|
|
|
|
|
+
|
|
|
|
+ err = RT_EOK;
|
|
}
|
|
}
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -553,14 +605,14 @@ void rt_pic_irq_enable(int irq)
|
|
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_enable)
|
|
if (pirq->pic->ops->irq_enable)
|
|
{
|
|
{
|
|
pirq->pic->ops->irq_enable(pirq);
|
|
pirq->pic->ops->irq_enable(pirq);
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
void rt_pic_irq_disable(int irq)
|
|
void rt_pic_irq_disable(int irq)
|
|
@@ -569,14 +621,14 @@ void rt_pic_irq_disable(int irq)
|
|
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_disable)
|
|
if (pirq->pic->ops->irq_disable)
|
|
{
|
|
{
|
|
pirq->pic->ops->irq_disable(pirq);
|
|
pirq->pic->ops->irq_disable(pirq);
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
void rt_pic_irq_ack(int irq)
|
|
void rt_pic_irq_ack(int irq)
|
|
@@ -585,14 +637,14 @@ void rt_pic_irq_ack(int irq)
|
|
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_ack)
|
|
if (pirq->pic->ops->irq_ack)
|
|
{
|
|
{
|
|
pirq->pic->ops->irq_ack(pirq);
|
|
pirq->pic->ops->irq_ack(pirq);
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
void rt_pic_irq_mask(int irq)
|
|
void rt_pic_irq_mask(int irq)
|
|
@@ -601,14 +653,14 @@ void rt_pic_irq_mask(int irq)
|
|
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_mask)
|
|
if (pirq->pic->ops->irq_mask)
|
|
{
|
|
{
|
|
pirq->pic->ops->irq_mask(pirq);
|
|
pirq->pic->ops->irq_mask(pirq);
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
void rt_pic_irq_unmask(int irq)
|
|
void rt_pic_irq_unmask(int irq)
|
|
@@ -617,14 +669,14 @@ void rt_pic_irq_unmask(int irq)
|
|
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_unmask)
|
|
if (pirq->pic->ops->irq_unmask)
|
|
{
|
|
{
|
|
pirq->pic->ops->irq_unmask(pirq);
|
|
pirq->pic->ops->irq_unmask(pirq);
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
void rt_pic_irq_eoi(int irq)
|
|
void rt_pic_irq_eoi(int irq)
|
|
@@ -633,14 +685,14 @@ void rt_pic_irq_eoi(int irq)
|
|
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_eoi)
|
|
if (pirq->pic->ops->irq_eoi)
|
|
{
|
|
{
|
|
pirq->pic->ops->irq_eoi(pirq);
|
|
pirq->pic->ops->irq_eoi(pirq);
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
rt_err_t rt_pic_irq_set_priority(int irq, rt_uint32_t priority)
|
|
rt_err_t rt_pic_irq_set_priority(int irq, rt_uint32_t priority)
|
|
@@ -650,7 +702,7 @@ rt_err_t rt_pic_irq_set_priority(int irq, rt_uint32_t priority)
|
|
|
|
|
|
if (pirq)
|
|
if (pirq)
|
|
{
|
|
{
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_set_priority)
|
|
if (pirq->pic->ops->irq_set_priority)
|
|
{
|
|
{
|
|
@@ -666,7 +718,7 @@ rt_err_t rt_pic_irq_set_priority(int irq, rt_uint32_t priority)
|
|
err = -RT_ENOSYS;
|
|
err = -RT_ENOSYS;
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -679,11 +731,11 @@ rt_uint32_t rt_pic_irq_get_priority(int irq)
|
|
|
|
|
|
if (pirq)
|
|
if (pirq)
|
|
{
|
|
{
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
priority = pirq->priority;
|
|
priority = pirq->priority;
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
return priority;
|
|
return priority;
|
|
@@ -696,7 +748,7 @@ rt_err_t rt_pic_irq_set_affinity(int irq, rt_bitmap_t *affinity)
|
|
|
|
|
|
if (affinity && (pirq = irq2pirq(irq)))
|
|
if (affinity && (pirq = irq2pirq(irq)))
|
|
{
|
|
{
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_set_affinity)
|
|
if (pirq->pic->ops->irq_set_affinity)
|
|
{
|
|
{
|
|
@@ -712,7 +764,7 @@ rt_err_t rt_pic_irq_set_affinity(int irq, rt_bitmap_t *affinity)
|
|
err = -RT_ENOSYS;
|
|
err = -RT_ENOSYS;
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -725,12 +777,12 @@ rt_err_t rt_pic_irq_get_affinity(int irq, rt_bitmap_t *out_affinity)
|
|
|
|
|
|
if (out_affinity && (pirq = irq2pirq(irq)))
|
|
if (out_affinity && (pirq = irq2pirq(irq)))
|
|
{
|
|
{
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
rt_memcpy(out_affinity, pirq->affinity, sizeof(pirq->affinity));
|
|
rt_memcpy(out_affinity, pirq->affinity, sizeof(pirq->affinity));
|
|
err = RT_EOK;
|
|
err = RT_EOK;
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -743,7 +795,7 @@ rt_err_t rt_pic_irq_set_triger_mode(int irq, rt_uint32_t mode)
|
|
|
|
|
|
if ((~mode & RT_IRQ_MODE_MASK) && (pirq = irq2pirq(irq)))
|
|
if ((~mode & RT_IRQ_MODE_MASK) && (pirq = irq2pirq(irq)))
|
|
{
|
|
{
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
if (pirq->pic->ops->irq_set_triger_mode)
|
|
if (pirq->pic->ops->irq_set_triger_mode)
|
|
{
|
|
{
|
|
@@ -759,7 +811,7 @@ rt_err_t rt_pic_irq_set_triger_mode(int irq, rt_uint32_t mode)
|
|
err = -RT_ENOSYS;
|
|
err = -RT_ENOSYS;
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
return err;
|
|
return err;
|
|
@@ -772,11 +824,11 @@ rt_uint32_t rt_pic_irq_get_triger_mode(int irq)
|
|
|
|
|
|
if (pirq)
|
|
if (pirq)
|
|
{
|
|
{
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_lock(&pirq->rw_lock.lock);
|
|
|
|
|
|
mode = pirq->mode;
|
|
mode = pirq->mode;
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
|
|
+ rt_hw_spin_unlock(&pirq->rw_lock.lock);
|
|
}
|
|
}
|
|
|
|
|
|
return mode;
|
|
return mode;
|
|
@@ -799,204 +851,126 @@ void rt_pic_irq_send_ipi(int irq, rt_bitmap_t *cpumask)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-#define _pic_push(stack, pirq, ppic) struct rt_pic *(stack) = (pirq)->pic; (pirq)->pic = ppic;
|
|
|
|
-#define _pic_pop(stack, pirq) (pirq)->pic = (stack)
|
|
|
|
-
|
|
|
|
-void rt_pic_irq_parent_enable(struct rt_pic *ppic, struct rt_pic_irq *pirq)
|
|
|
|
|
|
+void rt_pic_irq_parent_enable(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_enable)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_enable)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- ppic->ops->irq_enable(pirq);
|
|
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
|
|
+ pirq->pic->ops->irq_enable(pirq);
|
|
}
|
|
}
|
|
-
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void rt_pic_irq_parent_disable(struct rt_pic *ppic, struct rt_pic_irq *pirq)
|
|
|
|
|
|
+void rt_pic_irq_parent_disable(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_disable)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_disable)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- ppic->ops->irq_disable(pirq);
|
|
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
|
|
+ pirq->pic->ops->irq_disable(pirq);
|
|
}
|
|
}
|
|
-
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void rt_pic_irq_parent_ack(struct rt_pic *ppic, struct rt_pic_irq *pirq)
|
|
|
|
|
|
+void rt_pic_irq_parent_ack(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_ack)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_ack)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- ppic->ops->irq_ack(pirq);
|
|
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
|
|
+ pirq->pic->ops->irq_ack(pirq);
|
|
}
|
|
}
|
|
-
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void rt_pic_irq_parent_mask(struct rt_pic *ppic, struct rt_pic_irq *pirq)
|
|
|
|
|
|
+void rt_pic_irq_parent_mask(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_mask)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_mask)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- ppic->ops->irq_mask(pirq);
|
|
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
|
|
+ pirq->pic->ops->irq_mask(pirq);
|
|
}
|
|
}
|
|
-
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void rt_pic_irq_parent_unmask(struct rt_pic *ppic, struct rt_pic_irq *pirq)
|
|
|
|
|
|
+void rt_pic_irq_parent_unmask(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_unmask)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_unmask)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- ppic->ops->irq_unmask(pirq);
|
|
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
|
|
+ pirq->pic->ops->irq_unmask(pirq);
|
|
}
|
|
}
|
|
-
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-void rt_pic_irq_parent_eoi(struct rt_pic *ppic, struct rt_pic_irq *pirq)
|
|
|
|
|
|
+void rt_pic_irq_parent_eoi(struct rt_pic_irq *pirq)
|
|
{
|
|
{
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_eoi)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_eoi)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- ppic->ops->irq_eoi(pirq);
|
|
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
|
|
+ pirq->pic->ops->irq_eoi(pirq);
|
|
}
|
|
}
|
|
-
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-rt_err_t rt_pic_irq_parent_set_priority(struct rt_pic *ppic, struct rt_pic_irq *pirq, rt_uint32_t priority)
|
|
|
|
|
|
+rt_err_t rt_pic_irq_parent_set_priority(struct rt_pic_irq *pirq, rt_uint32_t priority)
|
|
{
|
|
{
|
|
rt_err_t err = -RT_ENOSYS;
|
|
rt_err_t err = -RT_ENOSYS;
|
|
|
|
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_set_priority)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_set_priority)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- if (!(err = ppic->ops->irq_set_priority(pirq, priority)))
|
|
|
|
|
|
+ if (!(err = pirq->pic->ops->irq_set_priority(pirq, priority)))
|
|
{
|
|
{
|
|
pirq->priority = priority;
|
|
pirq->priority = priority;
|
|
}
|
|
}
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
-rt_err_t rt_pic_irq_parent_set_affinity(struct rt_pic *ppic, struct rt_pic_irq *pirq, rt_bitmap_t *affinity)
|
|
|
|
|
|
+rt_err_t rt_pic_irq_parent_set_affinity(struct rt_pic_irq *pirq, rt_bitmap_t *affinity)
|
|
{
|
|
{
|
|
rt_err_t err = -RT_ENOSYS;
|
|
rt_err_t err = -RT_ENOSYS;
|
|
|
|
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_set_affinity)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_set_affinity)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- if (!(err = ppic->ops->irq_set_affinity(pirq, affinity)))
|
|
|
|
|
|
+ if (!(err = pirq->pic->ops->irq_set_affinity(pirq, affinity)))
|
|
{
|
|
{
|
|
rt_memcpy(pirq->affinity, affinity, sizeof(pirq->affinity));
|
|
rt_memcpy(pirq->affinity, affinity, sizeof(pirq->affinity));
|
|
}
|
|
}
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
-rt_err_t rt_pic_irq_parent_set_triger_mode(struct rt_pic *ppic, struct rt_pic_irq *pirq, rt_uint32_t mode)
|
|
|
|
|
|
+rt_err_t rt_pic_irq_parent_set_triger_mode(struct rt_pic_irq *pirq, rt_uint32_t mode)
|
|
{
|
|
{
|
|
rt_err_t err = -RT_ENOSYS;
|
|
rt_err_t err = -RT_ENOSYS;
|
|
|
|
|
|
- RT_ASSERT(ppic != RT_NULL);
|
|
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
RT_ASSERT(pirq != RT_NULL);
|
|
|
|
+ pirq = pirq->parent;
|
|
|
|
|
|
- rt_spin_lock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
- if (ppic->ops->irq_set_triger_mode)
|
|
|
|
|
|
+ if (pirq->pic->ops->irq_set_triger_mode)
|
|
{
|
|
{
|
|
- _pic_push(pic_stack, pirq, ppic);
|
|
|
|
-
|
|
|
|
- if (!(err = ppic->ops->irq_set_triger_mode(pirq, mode)))
|
|
|
|
|
|
+ if (!(err = pirq->pic->ops->irq_set_triger_mode(pirq, mode)))
|
|
{
|
|
{
|
|
pirq->mode = mode;
|
|
pirq->mode = mode;
|
|
}
|
|
}
|
|
-
|
|
|
|
- _pic_pop(pic_stack, pirq);
|
|
|
|
}
|
|
}
|
|
|
|
|
|
- rt_spin_unlock(&pirq->rw_lock);
|
|
|
|
-
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|
|
|
|
|
|
-#undef _pic_push
|
|
|
|
-#undef _pic_pop
|
|
|
|
-
|
|
|
|
#ifdef RT_USING_OFW
|
|
#ifdef RT_USING_OFW
|
|
RT_OFW_STUB_RANGE_EXPORT(pic, _pic_ofw_start, _pic_ofw_end);
|
|
RT_OFW_STUB_RANGE_EXPORT(pic, _pic_ofw_start, _pic_ofw_end);
|
|
|
|
|
|
@@ -1102,7 +1076,7 @@ static int list_irq(int argc, char**argv)
|
|
{
|
|
{
|
|
rt_bitmap_t mask = pirq->affinity[group];
|
|
rt_bitmap_t mask = pirq->affinity[group];
|
|
|
|
|
|
- for (int idx = 0; id < RT_CPUS_NR && idx < BITMAP_BIT_LEN(1); ++idx, ++id)
|
|
|
|
|
|
+ for (int idx = 0; id < RT_CPUS_NR && idx < RT_BITMAP_BIT_LEN(1); ++idx, ++id)
|
|
{
|
|
{
|
|
cpumask[RT_ARRAY_SIZE(cpumask) - id - 2] = '0' + ((mask >> idx) & 1);
|
|
cpumask[RT_ARRAY_SIZE(cpumask) - id - 2] = '0' + ((mask >> idx) & 1);
|
|
}
|
|
}
|