diff --git a/if/driver_vec.c b/if/driver_vec.c index 2ca566d..84ddcdf 100644 --- a/if/driver_vec.c +++ b/if/driver_vec.c @@ -124,6 +124,19 @@ static struct pci_bios_interface pci_interface = .phys_to_virt = wrapper_phys_to_virt, }; +static struct pci_native_driver_interface pci_native_interface = +{ + .pci_read_config_longword = pci_read_config_longword, + .pci_read_config_word = pci_read_config_longword, + .pci_read_config_byte = pci_read_config_byte, + .pci_write_config_longword = pci_write_config_longword, + .pci_write_config_word = pci_write_config_word, + .pci_write_config_byte = pci_write_config_byte, + .pci_hook_interrupt = pci_hook_interrupt, + .pci_unhook_interrupt = pci_unhook_interrupt, + .pci_get_resource = pci_get_resource, +}; + /* * driver interface struct for the BaS framebuffer video driver */ @@ -187,6 +200,14 @@ static struct generic_interface interfaces[] = .revision = 1, .interface.mmu = &mmu_interface, }, + { + .type = PCI_NATIVE_DRIVER, + .name = "PCI_N", + .description = "BaS PCI native", + .version = 0, + .revision = 1, + .interface.pci_native = &pci_native_interface, + }, /* insert new drivers here */ { diff --git a/include/driver_vec.h b/include/driver_vec.h index bbce08d..a441219 100644 --- a/include/driver_vec.h +++ b/include/driver_vec.h @@ -38,6 +38,7 @@ enum driver_type VIDEO_DRIVER, PCI_DRIVER, MMU_DRIVER, + PCI_NATIVE_DRIVER, END_OF_DRIVERS = 0xffffffff, /* marks end of driver list */ }; @@ -270,6 +271,21 @@ struct mmu_driver_interface uint32_t (*report_pagesize)(void); }; +struct pci_native_driver_interface +{ + uint32_t (*pci_read_config_longword)(int32_t handle, int offset); + uint16_t (*pci_read_config_word)(int32_t handle, int offset); + uint8_t (*pci_read_config_byte)(int32_t handle, int offset); + + int32_t (*pci_write_config_longword)(int32_t handle, int offset, uint32_t value); + int32_t (*pci_write_config_word)(int32_t handle, int offset, uint16_t value); + int32_t (*pci_write_config_byte)(int32_t handle, int offset, uint8_t value); + int32_t (*pci_hook_interrupt)(int32_t handle, void *handler, void *parameter); + int32_t (*pci_unhook_interrupt)(int32_t handle); + + struct pci_rd (*pci_get_resource)(int32_t handle); +}; + union interface { struct generic_driver_interface *gdi; @@ -278,6 +294,7 @@ union interface struct framebuffer_driver_interface *fb; struct pci_bios_interface *pci; struct mmu_driver_interface *mmu; + struct pci_native_driver_interface *pci_native; }; struct generic_interface diff --git a/tos/bascook/sources/bascook.c b/tos/bascook/sources/bascook.c index ae25258..e7b9ed6 100644 --- a/tos/bascook/sources/bascook.c +++ b/tos/bascook/sources/bascook.c @@ -10,13 +10,13 @@ struct driver_table *get_bas_drivers(void) struct driver_table *ret = NULL; __asm__ __volatile__( - " bra.s do_trap \n\t" - " .dc.l 0x5f424153 \n\t" // '_BAS' - "do_trap: trap #0 \n\t" - " move.l d0,%[ret] \n\t" - : [ret] "=m" (ret) /* output */ - : /* no inputs */ - : /* clobbered */ + " bra.s do_trap \n\t" + " .dc.l 0x5f424153 \n\t" // '_BAS' + "do_trap: trap #0 \n\t" + " move.l d0,%[ret] \n\t" + : [ret] "=m" (ret) /* output */ + : /* no inputs */ + : /* clobbered */ ); return ret; @@ -31,7 +31,7 @@ struct driver_table *get_bas_drivers(void) static void __attribute__((interrupt)) my_own_trap0_handler(void) { __asm__ __volatile__( - " clr.l d0 \n\t" // return 0 to indicate not supported + " clr.l d0 \n\t" // return 0 to indicate not supported : : : @@ -85,20 +85,22 @@ void setcookie(uint32_t cookie, uint32_t value) printf("cannot set cookie, cookie jar is full!\r\n"); } -#define COOKIE_DMAC 0x444d4143L /* FireTOS DMA API */ +#define COOKIE_DMAC 0x444d4143L /* FireTOS DMA API */ +#define COOKIE_BAS_ 0x4241535fL /* BAS_ cookie (points to driver table struct */ static char *dt_to_str(enum driver_type dt) { switch (dt) { - case BLOCKDEV_DRIVER: return "generic block device driver"; - case CHARDEV_DRIVER: return "generic character device driver"; - case VIDEO_DRIVER: return "video/framebuffer driver"; - case XHDI_DRIVER: return "XHDI compatible hard disk driver"; - case MCD_DRIVER: return "multichannel DMA driver"; - case PCI_DRIVER: return "PCI interface driver"; - case MMU_DRIVER: return "MMU lock/unlock pages driver"; - default: return "unknown driver type"; + case BLOCKDEV_DRIVER: return "generic block device driver"; + case CHARDEV_DRIVER: return "generic character device driver"; + case VIDEO_DRIVER: return "video/framebuffer driver"; + case XHDI_DRIVER: return "XHDI compatible hard disk driver"; + case MCD_DRIVER: return "multichannel DMA driver"; + case PCI_DRIVER: return "PCI interface driver"; + case MMU_DRIVER: return "MMU lock/unlock pages driver"; + case PCI_NATIVE_DRIVER: return "PCI interface native driver"; + default: return "unknown driver type"; } } @@ -112,16 +114,17 @@ int main(int argc, char *argv[]) (void) Cconws("retrieve BaS driver interface\r\n"); - ssp = (void *) Super(0L); /* go to supervisor mode, we are doing dirty tricks */ + ssp = (void *) Super(0L); /* go to supervisor mode, we are doing dirty tricks */ sig = * (long *)((*sysbase) + 0x2c); + /* * first check if we are on EmuTOS, FireTOS want's to do everything itself */ if (sig == 0x45544f53) { - old_vector = Setexc(0x20, my_own_trap0_handler); /* set our own temporarily */ - dt = get_bas_drivers(); /* trap #0 */ - (void) Setexc(0x20, old_vector); /* restore original vector */ + old_vector = Setexc(0x20, my_own_trap0_handler); /* set our own temporarily */ + dt = get_bas_drivers(); /* trap #0 */ + (void) Setexc(0x20, old_vector); /* restore original vector */ if (dt) { @@ -144,6 +147,12 @@ int main(int argc, char *argv[]) } ifc++; } + + /* + * set cookie to be able to find the driver table later on + */ + setcookie(COOKIE_BAS_, (uint32_t) dt); + printf("BAS_ cookie set to %p\r\n", dt); } else { @@ -157,7 +166,7 @@ int main(int argc, char *argv[]) } Super(ssp); - while (Cconis()) Cconin(); /* eat keys */ + while (Cconis()) Cconin(); /* eat keys */ return 0; }