modified to expose the PCI "native" driver interface (this is different
from the PCIBIOS) to TOS
This commit is contained in:
@@ -124,6 +124,19 @@ static struct pci_bios_interface pci_interface =
|
|||||||
.phys_to_virt = wrapper_phys_to_virt,
|
.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
|
* driver interface struct for the BaS framebuffer video driver
|
||||||
*/
|
*/
|
||||||
@@ -187,6 +200,14 @@ static struct generic_interface interfaces[] =
|
|||||||
.revision = 1,
|
.revision = 1,
|
||||||
.interface.mmu = &mmu_interface,
|
.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 */
|
/* insert new drivers here */
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ enum driver_type
|
|||||||
VIDEO_DRIVER,
|
VIDEO_DRIVER,
|
||||||
PCI_DRIVER,
|
PCI_DRIVER,
|
||||||
MMU_DRIVER,
|
MMU_DRIVER,
|
||||||
|
PCI_NATIVE_DRIVER,
|
||||||
END_OF_DRIVERS = 0xffffffff, /* marks end of driver list */
|
END_OF_DRIVERS = 0xffffffff, /* marks end of driver list */
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -270,6 +271,21 @@ struct mmu_driver_interface
|
|||||||
uint32_t (*report_pagesize)(void);
|
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
|
union interface
|
||||||
{
|
{
|
||||||
struct generic_driver_interface *gdi;
|
struct generic_driver_interface *gdi;
|
||||||
@@ -278,6 +294,7 @@ union interface
|
|||||||
struct framebuffer_driver_interface *fb;
|
struct framebuffer_driver_interface *fb;
|
||||||
struct pci_bios_interface *pci;
|
struct pci_bios_interface *pci;
|
||||||
struct mmu_driver_interface *mmu;
|
struct mmu_driver_interface *mmu;
|
||||||
|
struct pci_native_driver_interface *pci_native;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct generic_interface
|
struct generic_interface
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ struct driver_table *get_bas_drivers(void)
|
|||||||
struct driver_table *ret = NULL;
|
struct driver_table *ret = NULL;
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
" bra.s do_trap \n\t"
|
" bra.s do_trap \n\t"
|
||||||
" .dc.l 0x5f424153 \n\t" // '_BAS'
|
" .dc.l 0x5f424153 \n\t" // '_BAS'
|
||||||
"do_trap: trap #0 \n\t"
|
"do_trap: trap #0 \n\t"
|
||||||
" move.l d0,%[ret] \n\t"
|
" move.l d0,%[ret] \n\t"
|
||||||
: [ret] "=m" (ret) /* output */
|
: [ret] "=m" (ret) /* output */
|
||||||
: /* no inputs */
|
: /* no inputs */
|
||||||
: /* clobbered */
|
: /* clobbered */
|
||||||
);
|
);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -31,7 +31,7 @@ struct driver_table *get_bas_drivers(void)
|
|||||||
static void __attribute__((interrupt)) my_own_trap0_handler(void)
|
static void __attribute__((interrupt)) my_own_trap0_handler(void)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__(
|
__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");
|
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)
|
static char *dt_to_str(enum driver_type dt)
|
||||||
{
|
{
|
||||||
switch (dt)
|
switch (dt)
|
||||||
{
|
{
|
||||||
case BLOCKDEV_DRIVER: return "generic block device driver";
|
case BLOCKDEV_DRIVER: return "generic block device driver";
|
||||||
case CHARDEV_DRIVER: return "generic character device driver";
|
case CHARDEV_DRIVER: return "generic character device driver";
|
||||||
case VIDEO_DRIVER: return "video/framebuffer driver";
|
case VIDEO_DRIVER: return "video/framebuffer driver";
|
||||||
case XHDI_DRIVER: return "XHDI compatible hard disk driver";
|
case XHDI_DRIVER: return "XHDI compatible hard disk driver";
|
||||||
case MCD_DRIVER: return "multichannel DMA driver";
|
case MCD_DRIVER: return "multichannel DMA driver";
|
||||||
case PCI_DRIVER: return "PCI interface driver";
|
case PCI_DRIVER: return "PCI interface driver";
|
||||||
case MMU_DRIVER: return "MMU lock/unlock pages driver";
|
case MMU_DRIVER: return "MMU lock/unlock pages driver";
|
||||||
default: return "unknown driver type";
|
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");
|
(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);
|
sig = * (long *)((*sysbase) + 0x2c);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* first check if we are on EmuTOS, FireTOS want's to do everything itself
|
* first check if we are on EmuTOS, FireTOS want's to do everything itself
|
||||||
*/
|
*/
|
||||||
if (sig == 0x45544f53)
|
if (sig == 0x45544f53)
|
||||||
{
|
{
|
||||||
old_vector = Setexc(0x20, my_own_trap0_handler); /* set our own temporarily */
|
old_vector = Setexc(0x20, my_own_trap0_handler); /* set our own temporarily */
|
||||||
dt = get_bas_drivers(); /* trap #0 */
|
dt = get_bas_drivers(); /* trap #0 */
|
||||||
(void) Setexc(0x20, old_vector); /* restore original vector */
|
(void) Setexc(0x20, old_vector); /* restore original vector */
|
||||||
|
|
||||||
if (dt)
|
if (dt)
|
||||||
{
|
{
|
||||||
@@ -144,6 +147,12 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
ifc++;
|
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
|
else
|
||||||
{
|
{
|
||||||
@@ -157,7 +166,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
Super(ssp);
|
Super(ssp);
|
||||||
|
|
||||||
while (Cconis()) Cconin(); /* eat keys */
|
while (Cconis()) Cconin(); /* eat keys */
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user