/[dynamips]/trunk/dev_c3725.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/dev_c3725.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

upstream/dynamips-0.2.7-RC1/dev_c3725.c revision 7 by dpavlin, Sat Oct 6 16:23:47 2007 UTC upstream/dynamips-0.2.7-RC2/dev_c3725.c revision 8 by dpavlin, Sat Oct 6 16:24:54 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   * Cisco 3725 simulation platform.   * Cisco router simulation platform.
3   * Copyright (c) 2006 Christophe Fillot (cf@utc.fr)   * Copyright (c) 2006 Christophe Fillot (cf@utc.fr)
4   *   *
5   * Generic Cisco 3725 routines and definitions (EEPROM,...).   * Generic Cisco 3725 routines and definitions (EEPROM,...).
# Line 22  Line 22 
22  #include "cisco_eeprom.h"  #include "cisco_eeprom.h"
23  #include "dev_rom.h"  #include "dev_rom.h"
24  #include "dev_c3725.h"  #include "dev_c3725.h"
25    #include "dev_c3725_iofpga.h"
26  #include "dev_vtty.h"  #include "dev_vtty.h"
27  #include "registry.h"  #include "registry.h"
28    
# Line 330  void c3725_save_config_all(FILE *fd) Line 331  void c3725_save_config_all(FILE *fd)
331     registry_foreach_type(OBJ_TYPE_VM,c3725_reg_save_config,fd,NULL);     registry_foreach_type(OBJ_TYPE_VM,c3725_reg_save_config,fd,NULL);
332  }  }
333    
334    /* Get slot/port corresponding to specified network IRQ */
335    static inline void
336    c3725_net_irq_get_slot_port(u_int irq,u_int *slot,u_int *port)
337    {
338       irq -= C3725_NETIO_IRQ_BASE;
339       *port = irq & C3725_NETIO_IRQ_PORT_MASK;
340       *slot = irq >> C3725_NETIO_IRQ_PORT_BITS;
341    }
342    
343    /* Get network IRQ for specified slot/port */
344    u_int c3725_net_irq_for_slot_port(u_int slot,u_int port)
345    {
346       u_int irq;
347    
348       irq = (slot << C3725_NETIO_IRQ_PORT_BITS) + port;
349       irq += C3725_NETIO_IRQ_BASE;
350    
351       return(irq);
352    }
353    
354  /* Get PCI device for the specified NM bay */  /* Get PCI device for the specified NM bay */
355  int c3725_nm_get_pci_device(u_int nm_bay)  int c3725_nm_get_pci_device(u_int nm_bay)
356  {  {
# Line 699  int c3725_nm_init(c3725_t *router,u_int Line 720  int c3725_nm_init(c3725_t *router,u_int
720     snprintf(bay->dev_name,len,"%s(%u)",bay->dev_type,nm_bay);     snprintf(bay->dev_name,len,"%s(%u)",bay->dev_type,nm_bay);
721    
722     /* Initialize NM driver */     /* Initialize NM driver */
723     if (bay->nm_driver->nm_init(router,bay->dev_name,nm_bay) == 1) {     if (bay->nm_driver->nm_init(router,bay->dev_name,nm_bay) == -1) {
724        vm_error(router->vm,"unable to initialize NM %u.\n",nm_bay);        vm_error(router->vm,"unable to initialize NM %u.\n",nm_bay);
725        return(-1);        return(-1);
726     }     }
# Line 1022  static int c3725_init_gt96100(c3725_t *r Line 1043  static int c3725_init_gt96100(c3725_t *r
1043     }     }
1044        
1045     return(dev_gt96100_init(vm,"gt96100",C3725_GT96K_ADDR,0x200000,     return(dev_gt96100_init(vm,"gt96100",C3725_GT96K_ADDR,0x200000,
1046                             C3725_GT96K_IRQ,C3725_NETIO_IRQ));                             C3725_GT96K_IRQ,c3725_net_irq_for_slot_port(0,0)));
1047  }  }
1048    
1049  /* Initialize a Cisco 3725 */  /* Initialize a Cisco 3725 */
# Line 1160  int c3725_init_platform(c3725_t *router) Line 1181  int c3725_init_platform(c3725_t *router)
1181     if (dev_c3725_iofpga_init(router,C3725_IOFPGA_ADDR,0x40000) == -1)     if (dev_c3725_iofpga_init(router,C3725_IOFPGA_ADDR,0x40000) == -1)
1182        return(-1);        return(-1);
1183    
1184       if (!(obj = vm_object_find(router->vm,"io_fpga")))
1185          return(-1);
1186    
1187       router->iofpga_data = obj->data;
1188    
1189  #if 0  #if 0
1190     /* PCI IO space */     /* PCI IO space */
1191     if (!(vm->pci_io_space = pci_io_data_init(vm,C3725_PCI_IO_ADDR)))     if (!(vm->pci_io_space = pci_io_data_init(vm,C3725_PCI_IO_ADDR)))
# Line 1264  int c3725_boot_ios(c3725_t *router) Line 1290  int c3725_boot_ios(c3725_t *router)
1290     return(0);     return(0);
1291  }  }
1292    
1293    /* Set an IRQ */
1294    static void c3725_set_irq(vm_instance_t *vm,u_int irq)
1295    {
1296       c3725_t *router = VM_C3725(vm);
1297       cpu_mips_t *cpu0 = CPU_MIPS64(vm->boot_cpu);
1298       u_int slot,port;
1299    
1300       switch(irq) {
1301          case 0 ... 7:
1302             mips64_set_irq(cpu0,irq);
1303    
1304             if (cpu0->irq_idle_preempt[irq])
1305                cpu_idle_break_wait(cpu0->gen);
1306             break;
1307    
1308          case C3725_NETIO_IRQ_BASE ... C3725_NETIO_IRQ_END:
1309             c3725_net_irq_get_slot_port(irq,&slot,&port);
1310             dev_c3725_iofpga_net_set_irq(router->iofpga_data,slot,port);
1311             break;
1312       }
1313    }
1314    
1315    /* Clear an IRQ */
1316    static void c3725_clear_irq(vm_instance_t *vm,u_int irq)
1317    {
1318       c3725_t *router = VM_C3725(vm);
1319       cpu_mips_t *cpu0 = CPU_MIPS64(vm->boot_cpu);
1320       u_int slot,port;
1321    
1322       switch(irq) {
1323          case 0 ... 7:
1324             mips64_clear_irq(cpu0,irq);
1325             break;
1326    
1327          case C3725_NETIO_IRQ_BASE ... C3725_NETIO_IRQ_END:
1328             c3725_net_irq_get_slot_port(irq,&slot,&port);
1329             dev_c3725_iofpga_net_clear_irq(router->iofpga_data,slot,port);
1330             break;
1331       }
1332    }
1333    
1334  /* Initialize a Cisco 3725 instance */  /* Initialize a Cisco 3725 instance */
1335  int c3725_init_instance(c3725_t *router)  int c3725_init_instance(c3725_t *router)
1336  {    {  
# Line 1282  int c3725_init_instance(c3725_t *router) Line 1349  int c3725_init_instance(c3725_t *router)
1349        return(-1);        return(-1);
1350     }     }
1351    
1352       /* IRQ routing */
1353       vm->set_irq = c3725_set_irq;
1354       vm->clear_irq = c3725_clear_irq;
1355    
1356     /* Load IOS configuration file */     /* Load IOS configuration file */
1357     if (vm->ios_config != NULL) {     if (vm->ios_config != NULL) {
1358        vm_nvram_push_config(vm,vm->ios_config);        vm_nvram_push_config(vm,vm->ios_config);

Legend:
Removed from v.7  
changed lines
  Added in v.8

  ViewVC Help
Powered by ViewVC 1.1.26