* general fix around.
irq = irq_declare_direct(apic_timer_count_stop);
irq_set_payload(irq, pot);
- irq_assign(irq_get_default_domain(), irq);
+ irq_assign(irq_get_default_domain(), irq, NULL);
// Setup a one-shot timer, we will use this to measure the bus speed. So we
// can then calibrate apic timer to work at *nearly* accurate hz
state = (struct mc146818*)rtc_dev->underlay;
- state->irq = irq_declare_line(__rtc_tick, PC_AT_IRQ_RTC, NULL);
+ state->irq = irq_declare_line(__rtc_tick, PC_AT_IRQ_RTC);
irq_set_payload(state->irq, state);
- irq_assign(irq_owning_domain(rtc_dev), state->irq);
+ irq_assign(irq_owning_domain(rtc_dev), state->irq, NULL);
return 0;
}
* 所以,保险的方法是:在初始化后才去设置ioapic,这样一来我们就能有一个稳定的IRQ#1以放心使用。
*/
- irq_t irq = irq_declare_line(intr_ps2_kbd_handler, PC_AT_IRQ_KBD, NULL);
- irq_assign(irq_owning_domain(kbd_idev->dev_if), irq);
+ irq_t irq = irq_declare_line(intr_ps2_kbd_handler, PC_AT_IRQ_KBD);
+ irq_assign(irq_owning_domain(kbd_idev->dev_if), irq, NULL);
return 0;
assert(pci_capability_msi(probe));
- irq = pci_declare_msi_irq(ahci_hba_isr, probe, NULL);
- pci_assign_msi(probe, irq);
+ irq = pci_declare_msi_irq(ahci_hba_isr, probe);
+ pci_assign_msi(probe, irq, NULL);
struct ahci_driver_param param = {
.mmio_base = bar6->start,
}
irq_t
-pci_declare_msi_irq(irq_servant callback,
- struct pci_probe* probe, void *irq_extra)
+pci_declare_msi_irq(irq_servant callback, struct pci_probe* probe)
{
- return irq_declare_msg(callback, probe->loc, probe->loc, irq_extra);
+ return irq_declare_msg(callback, probe->loc, probe->loc);
}
int
-pci_assign_msi(struct pci_probe* probe, irq_t irq)
+pci_assign_msi(struct pci_probe* probe, irq_t irq, void* irq_spec)
{
int err = 0;
assert(irq->type == IRQ_MESSAGE);
- err = irq_assign(probe->irq_domain, irq);
+ err = irq_assign(probe->irq_domain, irq, irq_spec);
if (err) {
return err;
}
* Since these irqs are overlapped, this particular setup is needed
* to avoid double-bind
*/
- uart->irq = irq_declare_line(com_irq_handler, irq, NULL);
- irq_assign(irq_owning_domain(sdev->dev), uart->irq);
+ uart->irq = irq_declare_line(com_irq_handler, irq);
+ irq_assign(irq_owning_domain(sdev->dev), uart->irq, NULL);
*((volatile int*)irqs[i]) = 0;
}
sdev = uart_create_serial(uart, &def->class, &pci_ports, "PCI");
- irq = pci_declare_msi_irq(uart_msi_irq_handler, probe, NULL);
+ irq = pci_declare_msi_irq(uart_msi_irq_handler, probe);
irq_set_payload(irq, uart);
- pci_assign_msi(probe, irq);
+ pci_assign_msi(probe, irq, NULL);
INFO("base: 0x%x (%s), %s",
bar->start,
sources([
"dt_interrupt.c",
"dt.c",
- "dtm.c"
+ "dtm.c",
"dtspec.c"
])
\ No newline at end of file
return streq(fdt_prop_key(fdt, loc), key);
}
+static inline ptr_t
+__prop_val_ptr(struct fdt_prop* prop)
+{
+ return __ptr(prop) + sizeof(struct fdt_prop);
+}
+
static inline void
__mkprop_ptr(fdt_loc_t loc, struct dtp_val* val)
{
- val->ptr_val = __ptr(loc.prop->val);
+ val->ptr_val = __prop_val_ptr(loc.prop);
val->size = loc.prop->len;
}
}
if (likely(val)) {
- val->encoded = (dt_enc_t)loc.prop->val;
+ val->encoded = (dt_enc_t)__prop_val_ptr(loc.prop);
val->size = loc.prop->len;
}
return true;
mscan->loc = loc;
mscan->node_type = FDT_MEM_FREE;
+
+ return true;
}
#define get_size(mscan, val) \
}
irq_t
-irq_declare(enum irq_type type, irq_servant callback,
- ptr_t data, void* irq_extra)
+irq_declare(enum irq_type type, irq_servant callback, ptr_t data)
{
irq_t irq;
*irq = (struct irq_object) {
.type = type,
.serve = callback ?: __default_servant,
- .irq_extra = irq_extra,
.vector = IRQ_VECTOR_UNSET
};
}
int
-irq_assign(struct irq_domain* domain, irq_t irq)
+irq_assign(struct irq_domain* domain, irq_t irq, void* irq_spec)
{
int err = 0;
if (domain->ops->map_irq) {
- err = domain->ops->map_irq(domain, irq, irq->irq_extra);
+ err = domain->ops->map_irq(domain, irq, irq_spec);
if (err) {
return err;
}
{
union
{
- union {
- const char* str_val;
- const char* str_lst;
- };
ptr_t ptr_val;
dt_enc_t encoded;
union dtp_baseval* ref;
+ union {
+ const char* str_val;
+ const char* str_lst;
+ };
};
unsigned int size;
};
dtpi_init_empty(struct dtpropi* dtpi)
{
*dtpi = (struct dtpropi) {
- .prop = { 0, 0 },
+ .prop = { {0}, 0 },
.loc = 0
};
}
void* payload;
struct irq_domain* domain;
- void* irq_extra;
int ref;
};
irq_attach_domain(struct irq_domain* parent, struct irq_domain* child);
irq_t
-irq_declare(enum irq_type, irq_servant, ptr_t, void*);
+irq_declare(enum irq_type, irq_servant, ptr_t);
void
irq_revoke(irq_t);
int
-irq_assign(struct irq_domain* domain, irq_t);
+irq_assign(struct irq_domain* domain, irq_t, void*);
irq_t
irq_find(struct irq_domain* domain, int local_irq);
#define irq_domain_obj(domain, type) ((type*)(domain)->object)
static inline irq_t
-irq_declare_line(irq_servant callback, int local_irq, void* irq_extra)
+irq_declare_line(irq_servant callback, int local_irq)
{
- return irq_declare(IRQ_LINE, callback, (int)local_irq, irq_extra);
+ return irq_declare(IRQ_LINE, callback, (int)local_irq);
}
static inline irq_t
irq_declare_msg(irq_servant callback,
- ptr_t message, ptr_t sideband, void* irq_extra)
+ ptr_t message, ptr_t sideband)
{
irq_t irq;
- irq = irq_declare(IRQ_MESSAGE, callback, message, irq_extra);
+ irq = irq_declare(IRQ_MESSAGE, callback, message);
irq->msi->sideband = sideband;
return irq;
static inline irq_t
irq_declare_direct(irq_servant callback)
{
- return irq_declare(IRQ_DIRECT, callback, 0, NULL);
+ return irq_declare(IRQ_DIRECT, callback, 0);
}
static inline struct irq_domain*
pci_bar_sizing(struct pci_probe* probe, u32_t* bar_out, u32_t bar_num);
irq_t
-pci_declare_msi_irq(irq_servant callback,
- struct pci_probe* probe, void *irq_extra);
+pci_declare_msi_irq(irq_servant callback, struct pci_probe* probe);
int
-pci_assign_msi(struct pci_probe* probe, irq_t irq);
+pci_assign_msi(struct pci_probe* probe, irq_t irq, void* irq_spec);
/**
* @brief Bind an abstract device instance to the pci device
dut/changeling.o
BIN_DEPS += load.%.o
-CFLAGS += -DCONFIG_USE_DEVICETREE
+CFLAGS += -DCONFIG_USE_DEVICETREE -Wp,-w
.PRECIOUS: %.dtb
%.dtb: %.dts