25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: dev_gt.c,v 1.50 2007/04/29 13:44:14 debug Exp $ |
* $Id: dev_gt.c,v 1.53 2007/06/16 05:09:55 debug Exp $ |
29 |
* |
* |
30 |
* Galileo Technology GT-64xxx PCI controller. |
* COMMENT: Galileo Technology GT-64xxx PCI controller |
31 |
* |
* |
32 |
* GT-64011 Used in Cobalt machines. |
* GT-64011 Used in Cobalt machines. |
33 |
* GT-64120 Used in evbmips machines (Malta). |
* GT-64120 Used in evbmips machines (Malta). |
81 |
*/ |
*/ |
82 |
static void timer_tick(struct timer *timer, void *extra) |
static void timer_tick(struct timer *timer, void *extra) |
83 |
{ |
{ |
84 |
struct gt_data *d = (struct gt_data *) extra; |
struct gt_data *d = extra; |
85 |
d->pending_timer0_interrupts ++; |
d->pending_timer0_interrupts ++; |
86 |
} |
} |
87 |
|
|
88 |
|
|
89 |
DEVICE_TICK(gt) |
DEVICE_TICK(gt) |
90 |
{ |
{ |
91 |
struct gt_data *d = (struct gt_data *) extra; |
struct gt_data *d = extra; |
|
|
|
92 |
if (d->pending_timer0_interrupts > 0) |
if (d->pending_timer0_interrupts > 0) |
93 |
INTERRUPT_ASSERT(d->timer0_irq); |
INTERRUPT_ASSERT(d->timer0_irq); |
94 |
} |
} |
96 |
|
|
97 |
DEVICE_ACCESS(gt) |
DEVICE_ACCESS(gt) |
98 |
{ |
{ |
99 |
|
struct gt_data *d = extra; |
100 |
uint64_t idata = 0, odata = 0; |
uint64_t idata = 0, odata = 0; |
101 |
int bus, dev, func, reg; |
int bus, dev, func, reg; |
102 |
size_t i; |
size_t i; |
|
struct gt_data *d = extra; |
|
103 |
|
|
104 |
if (writeflag == MEM_WRITE) |
if (writeflag == MEM_WRITE) |
105 |
idata = memory_readmax64(cpu, data, len); |
idata = memory_readmax64(cpu, data, len); |
155 |
|
|
156 |
case GT_PCI0_INTR_ACK: |
case GT_PCI0_INTR_ACK: |
157 |
odata = cpu->machine->isa_pic_data.last_int; |
odata = cpu->machine->isa_pic_data.last_int; |
158 |
|
/* TODO: Actually ack the interrupt? */ |
|
fatal("TODO: GT_PCI0_INTR_ACK\n"); |
|
|
|
|
|
// cpu_interrupt_ack(cpu, d->pci_irqbase + odata); |
|
159 |
break; |
break; |
160 |
|
|
161 |
case GT_TIMER_CTRL: |
case GT_TIMER_CTRL: |
225 |
uint64_t pci_io_offset = 0, pci_mem_offset = 0; |
uint64_t pci_io_offset = 0, pci_mem_offset = 0; |
226 |
char *gt_name = "NO"; |
char *gt_name = "NO"; |
227 |
|
|
228 |
d = malloc(sizeof(struct gt_data)); |
CHECK_ALLOCATION(d = malloc(sizeof(struct gt_data))); |
|
if (d == NULL) { |
|
|
fprintf(stderr, "out of memory\n"); |
|
|
exit(1); |
|
|
} |
|
229 |
memset(d, 0, sizeof(struct gt_data)); |
memset(d, 0, sizeof(struct gt_data)); |
230 |
|
|
231 |
INTERRUPT_CONNECT(timer_irq_path, d->timer0_irq); |
INTERRUPT_CONNECT(timer_irq_path, d->timer0_irq); |
296 |
|
|
297 |
memory_device_register(mem, "gt", baseaddr, DEV_GT_LENGTH, |
memory_device_register(mem, "gt", baseaddr, DEV_GT_LENGTH, |
298 |
dev_gt_access, d, DM_DEFAULT, NULL); |
dev_gt_access, d, DM_DEFAULT, NULL); |
299 |
machine_add_tickfunction(machine, dev_gt_tick, d, TICK_SHIFT, 0.0); |
machine_add_tickfunction(machine, dev_gt_tick, d, TICK_SHIFT); |
300 |
|
|
301 |
return d->pci_data; |
return d->pci_data; |
302 |
} |
} |