Diff for /qemu/hw/openpic.c between versions 1.1.1.7 and 1.1.1.8

version 1.1.1.7, 2018/04/24 18:28:07 version 1.1.1.8, 2018/04/24 18:37:22
Line 242  typedef struct openpic_t { Line 242  typedef struct openpic_t {
     int max_irq;      int max_irq;
     int irq_ipi0;      int irq_ipi0;
     int irq_tim0;      int irq_tim0;
     int need_swap;  
     void (*reset) (void *);      void (*reset) (void *);
     void (*irq_raise) (struct openpic_t *, int, IRQ_src_t *);      void (*irq_raise) (struct openpic_t *, int, IRQ_src_t *);
 } openpic_t;  } openpic_t;
   
 static inline uint32_t openpic_swap32(openpic_t *opp, uint32_t val)  
 {  
     if (opp->need_swap)  
         return bswap32(val);  
   
     return val;  
 }  
   
 static inline void IRQ_setbit (IRQ_queue_t *q, int n_IRQ)  static inline void IRQ_setbit (IRQ_queue_t *q, int n_IRQ)
 {  {
     set_bit(q->queue, n_IRQ);      set_bit(q->queue, n_IRQ);
Line 599  static void openpic_gbl_write (void *opa Line 590  static void openpic_gbl_write (void *opa
     DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val);      DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val);
     if (addr & 0xF)      if (addr & 0xF)
         return;          return;
     val = openpic_swap32(opp, val);  
     addr &= 0xFF;      addr &= 0xFF;
     switch (addr) {      switch (addr) {
     case 0x00: /* FREP */      case 0x00: /* FREP */
Line 693  static uint32_t openpic_gbl_read (void * Line 683  static uint32_t openpic_gbl_read (void *
         break;          break;
     }      }
     DPRINTF("%s: => %08x\n", __func__, retval);      DPRINTF("%s: => %08x\n", __func__, retval);
     retval = openpic_swap32(opp, retval);  
   
     return retval;      return retval;
 }  }
Line 706  static void openpic_timer_write (void *o Line 695  static void openpic_timer_write (void *o
     DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val);      DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val);
     if (addr & 0xF)      if (addr & 0xF)
         return;          return;
     val = openpic_swap32(opp, val);  
     addr -= 0x1100;      addr -= 0x1100;
     addr &= 0xFFFF;      addr &= 0xFFFF;
     idx = (addr & 0xFFF0) >> 6;      idx = (addr & 0xFFF0) >> 6;
Line 759  static uint32_t openpic_timer_read (void Line 747  static uint32_t openpic_timer_read (void
         break;          break;
     }      }
     DPRINTF("%s: => %08x\n", __func__, retval);      DPRINTF("%s: => %08x\n", __func__, retval);
     retval = openpic_swap32(opp, retval);  
   
     return retval;      return retval;
 }  }
Line 772  static void openpic_src_write (void *opa Line 759  static void openpic_src_write (void *opa
     DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val);      DPRINTF("%s: addr %08x <= %08x\n", __func__, addr, val);
     if (addr & 0xF)      if (addr & 0xF)
         return;          return;
     val = openpic_swap32(opp, val);  
     addr = addr & 0xFFF0;      addr = addr & 0xFFF0;
     idx = addr >> 5;      idx = addr >> 5;
     if (addr & 0x10) {      if (addr & 0x10) {
Line 804  static uint32_t openpic_src_read (void * Line 790  static uint32_t openpic_src_read (void *
         retval = read_IRQreg(opp, idx, IRQ_IPVP);          retval = read_IRQreg(opp, idx, IRQ_IPVP);
     }      }
     DPRINTF("%s: => %08x\n", __func__, retval);      DPRINTF("%s: => %08x\n", __func__, retval);
     retval = openpic_swap32(opp, retval);  
   
     return retval;      return retval;
 }  }
Line 819  static void openpic_cpu_write (void *opa Line 804  static void openpic_cpu_write (void *opa
     DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val);      DPRINTF("%s: addr " TARGET_FMT_plx " <= %08x\n", __func__, addr, val);
     if (addr & 0xF)      if (addr & 0xF)
         return;          return;
     val = openpic_swap32(opp, val);  
     addr &= 0x1FFF0;      addr &= 0x1FFF0;
     idx = addr / 0x1000;      idx = addr / 0x1000;
     dst = &opp->dst[idx];      dst = &opp->dst[idx];
Line 937  static uint32_t openpic_cpu_read (void * Line 921  static uint32_t openpic_cpu_read (void *
         break;          break;
     }      }
     DPRINTF("%s: => %08x\n", __func__, retval);      DPRINTF("%s: => %08x\n", __func__, retval);
     retval = openpic_swap32(opp, retval);  
   
     return retval;      return retval;
 }  }
Line 1035  static void openpic_map(PCIDevice *pci_d Line 1018  static void openpic_map(PCIDevice *pci_d
     cpu_register_physical_memory(addr, 0x40000, opp->mem_index);      cpu_register_physical_memory(addr, 0x40000, opp->mem_index);
 #if 0 // Don't implement ISU for now  #if 0 // Don't implement ISU for now
     opp_io_memory = cpu_register_io_memory(openpic_src_read,      opp_io_memory = cpu_register_io_memory(openpic_src_read,
                                            openpic_src_write);                                             openpic_src_write, NULL
                                              DEVICE_NATIVE_ENDIAN);
     cpu_register_physical_memory(isu_base, 0x20 * (EXT_IRQ + 2),      cpu_register_physical_memory(isu_base, 0x20 * (EXT_IRQ + 2),
                                  opp_io_memory);                                   opp_io_memory);
 #endif  #endif
Line 1197  qemu_irq *openpic_init (PCIBus *bus, int Line 1181  qemu_irq *openpic_init (PCIBus *bus, int
         pci_conf[0x3d] = 0x00; // no interrupt pin          pci_conf[0x3d] = 0x00; // no interrupt pin
   
         /* Register I/O spaces */          /* Register I/O spaces */
         pci_register_bar((PCIDevice *)opp, 0, 0x40000,          pci_register_bar(&opp->pci_dev, 0, 0x40000,
                                PCI_BASE_ADDRESS_SPACE_MEMORY, &openpic_map);                                 PCI_BASE_ADDRESS_SPACE_MEMORY, &openpic_map);
     } else {      } else {
         opp = qemu_mallocz(sizeof(openpic_t));          opp = qemu_mallocz(sizeof(openpic_t));
     }      }
     opp->mem_index = cpu_register_io_memory(openpic_read,      opp->mem_index = cpu_register_io_memory(openpic_read, openpic_write, opp,
                                             openpic_write, opp);                                              DEVICE_LITTLE_ENDIAN);
   
     //    isu_base &= 0xFFFC0000;      //    isu_base &= 0xFFFC0000;
     opp->nb_cpus = nb_cpus;      opp->nb_cpus = nb_cpus;
Line 1231  qemu_irq *openpic_init (PCIBus *bus, int Line 1215  qemu_irq *openpic_init (PCIBus *bus, int
     for (i = 0; i < nb_cpus; i++)      for (i = 0; i < nb_cpus; i++)
         opp->dst[i].irqs = irqs[i];          opp->dst[i].irqs = irqs[i];
     opp->irq_out = irq_out;      opp->irq_out = irq_out;
     opp->need_swap = 1;  
   
     register_savevm(&opp->pci_dev.qdev, "openpic", 0, 2,      register_savevm(&opp->pci_dev.qdev, "openpic", 0, 2,
                     openpic_save, openpic_load, opp);                      openpic_save, openpic_load, opp);
Line 1671  qemu_irq *mpic_init (target_phys_addr_t  Line 1654  qemu_irq *mpic_init (target_phys_addr_t 
     for (i = 0; i < sizeof(list)/sizeof(list[0]); i++) {      for (i = 0; i < sizeof(list)/sizeof(list[0]); i++) {
         int mem_index;          int mem_index;
   
         mem_index = cpu_register_io_memory(list[i].read, list[i].write, mpp);          mem_index = cpu_register_io_memory(list[i].read, list[i].write, mpp,
                                              DEVICE_BIG_ENDIAN);
         if (mem_index < 0) {          if (mem_index < 0) {
             goto free;              goto free;
         }          }
Line 1687  qemu_irq *mpic_init (target_phys_addr_t  Line 1671  qemu_irq *mpic_init (target_phys_addr_t 
     for (i = 0; i < nb_cpus; i++)      for (i = 0; i < nb_cpus; i++)
         mpp->dst[i].irqs = irqs[i];          mpp->dst[i].irqs = irqs[i];
     mpp->irq_out = irq_out;      mpp->irq_out = irq_out;
     mpp->need_swap = 0;    /* MPIC has the same endian as target */  
   
     mpp->irq_raise = mpic_irq_raise;      mpp->irq_raise = mpic_irq_raise;
     mpp->reset = mpic_reset;      mpp->reset = mpic_reset;

Removed from v.1.1.1.7  
changed lines
  Added in v.1.1.1.8


unix.superglobalmegacorp.com