/[gxemul]/trunk/src/devices/dev_turbochannel.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/src/devices/dev_turbochannel.c

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

revision 4 by dpavlin, Mon Oct 8 16:18:00 2007 UTC revision 20 by dpavlin, Mon Oct 8 16:19:23 2007 UTC
# Line 25  Line 25 
25   *  SUCH DAMAGE.   *  SUCH DAMAGE.
26   *     *  
27   *   *
28   *  $Id: dev_turbochannel.c,v 1.40 2005/02/18 06:19:19 debug Exp $   *  $Id: dev_turbochannel.c,v 1.45 2005/11/13 00:14:10 debug Exp $
29   *     *  
30   *  Generic framework for TURBOchannel devices, used in DECstation machines.   *  Generic framework for TURBOchannel devices, used in DECstation machines.
31   */   */
# Line 41  Line 41 
41  #include "sfbreg.h"  #include "sfbreg.h"
42    
43    
44    #define DEVICE_NAME_BUFLEN              9
45    #define CARD_NAME_BUFLEN                9
46    #define CARD_FIRMWARE_BUFLEN            5
47    
48  struct turbochannel_data {  struct turbochannel_data {
49          int             slot_nr;          int             slot_nr;
50          uint64_t        baseaddr;          uint64_t        baseaddr;
# Line 49  struct turbochannel_data { Line 53  struct turbochannel_data {
53    
54          int             rom_skip;          int             rom_skip;
55    
56          char            device_name[9];         /*  NUL-terminated  */          char            device_name[DEVICE_NAME_BUFLEN];  /*  NUL-terminated  */
57    
58          /*  These should be terminated with spaces  */          /*  These should be terminated with spaces  */
59          char            card_firmware_version[8];          char            card_firmware_version[CARD_NAME_BUFLEN];
60          char            card_vendor_name[8];          char            card_vendor_name[CARD_NAME_BUFLEN];
61          char            card_module_name[8];          char            card_module_name[CARD_NAME_BUFLEN];
62          char            card_firmware_type[4];          char            card_firmware_type[CARD_FIRMWARE_BUFLEN];
63  };  };
64    
65    
# Line 69  int dev_turbochannel_access(struct cpu * Line 73  int dev_turbochannel_access(struct cpu *
73          struct turbochannel_data *d = extra;          struct turbochannel_data *d = extra;
74          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
75    
76          idata = memory_readmax64(cpu, data, len);          if (writeflag == MEM_WRITE)
77                    idata = memory_readmax64(cpu, data, len);
78    
79          relative_addr += d->rom_skip;          relative_addr += d->rom_skip;
80    
# Line 179  void dev_turbochannel_init(struct machin Line 184  void dev_turbochannel_init(struct machin
184  {  {
185          struct vfb_data *fb;          struct vfb_data *fb;
186          struct turbochannel_data *d;          struct turbochannel_data *d;
187          int rom_offset = 0x3c0000;          int rom_offset=0x3c0000, rom_length=DEV_TURBOCHANNEL_LEN, rom_skip=0;
         int rom_length = DEV_TURBOCHANNEL_LEN;  
         int rom_skip = 0;  
188          char *name2;          char *name2;
189            size_t nlen;
190    
191          if (device_name == NULL)          if (device_name == NULL)
192                  return;                  return;
# Line 203  void dev_turbochannel_init(struct machin Line 207  void dev_turbochannel_init(struct machin
207          d->endaddr  = endaddr;          d->endaddr  = endaddr;
208          d->irq      = irq;          d->irq      = irq;
209    
210          strcpy(d->device_name, device_name);          strlcpy(d->device_name, device_name, DEVICE_NAME_BUFLEN);
211    
212          strncpy(d->card_firmware_version, "V5.3a   ", 8);          strncpy(d->card_firmware_version, "V5.3a   ", CARD_NAME_BUFLEN);
213          strncpy(d->card_vendor_name,      "DEC     ", 8);          strncpy(d->card_vendor_name,      "DEC     ", CARD_NAME_BUFLEN);
214          strncpy(d->card_firmware_type,    "TCF0", 4);          strncpy(d->card_firmware_type,    "TCF0", CARD_FIRMWARE_BUFLEN);
215    
216          memset(d->card_module_name, ' ', 8);          memset(d->card_module_name, ' ', 8);
217          strncpy(d->card_module_name, device_name, strlen(device_name));          memcpy(d->card_module_name, device_name, strlen(device_name));
218    
219          /*          /*
220           *  According to NetBSD/pmax:           *  According to NetBSD/pmax:
# Line 246  void dev_turbochannel_init(struct machin Line 250  void dev_turbochannel_init(struct machin
250          } else if (strcmp(device_name, "PMAG-AA")==0) {          } else if (strcmp(device_name, "PMAG-AA")==0) {
251                  /*  mfb in NetBSD  */                  /*  mfb in NetBSD  */
252                  fb = dev_fb_init(machine, mem, baseaddr + VFB_MFB_VRAM,                  fb = dev_fb_init(machine, mem, baseaddr + VFB_MFB_VRAM,
253                      VFB_GENERIC, 1280, 1024, 2048, 1024, 8, device_name, 1);                      VFB_GENERIC, 1280, 1024, 2048, 1024, 8, device_name);
254                  /*  bt455 = palette, bt431 = cursor  */                  /*  bt455 = palette, bt431 = cursor  */
255                  dev_bt455_init(mem, baseaddr + VFB_MFB_BT455, fb);                  dev_bt455_init(mem, baseaddr + VFB_MFB_BT455, fb);
256                  dev_bt431_init(mem, baseaddr + VFB_MFB_BT431, fb, 8);                  dev_bt431_init(mem, baseaddr + VFB_MFB_BT431, fb, 8);
# Line 254  void dev_turbochannel_init(struct machin Line 258  void dev_turbochannel_init(struct machin
258          } else if (strcmp(device_name, "PMAG-BA")==0) {          } else if (strcmp(device_name, "PMAG-BA")==0) {
259                  /*  cfb in NetBSD  */                  /*  cfb in NetBSD  */
260                  fb = dev_fb_init(machine, mem, baseaddr, VFB_GENERIC,                  fb = dev_fb_init(machine, mem, baseaddr, VFB_GENERIC,
261                      1024,864, 1024,1024,8, device_name, 1);                      1024,864, 1024,1024,8, device_name);
262                  dev_bt459_init(machine, mem, baseaddr + VFB_CFB_BT459,                  dev_bt459_init(machine, mem, baseaddr + VFB_CFB_BT459,
263                      baseaddr + 0x300000, fb, 8, irq, BT459_BA);                      baseaddr + 0x300000, fb, 8, irq, BT459_BA);
264                  /*  ROM at both 0x380000 and 0x3c0000?  */                  /*  ROM at both 0x380000 and 0x3c0000?  */
# Line 264  void dev_turbochannel_init(struct machin Line 268  void dev_turbochannel_init(struct machin
268                  /*  sfb in NetBSD  */                  /*  sfb in NetBSD  */
269                  /*  TODO: This is not working with Ultrix yet.  */                  /*  TODO: This is not working with Ultrix yet.  */
270                  fb = dev_fb_init(machine, mem, baseaddr + SFB_OFFSET_VRAM,                  fb = dev_fb_init(machine, mem, baseaddr + SFB_OFFSET_VRAM,
271                      VFB_GENERIC, 1280,1024, 1280,1024,8, device_name, 1);                      VFB_GENERIC, 1280,1024, 1280,1024,8, device_name);
272                  dev_sfb_init(machine, mem, baseaddr + SFB_ASIC_OFFSET, fb);                  dev_sfb_init(machine, mem, baseaddr + SFB_ASIC_OFFSET, fb);
273                  /*  TODO: the CLEAR doesn't get through, as the address                  /*  TODO: the CLEAR doesn't get through, as the address
274                          range is already in use by the asic  */                          range is already in use by the asic  */
# Line 292  void dev_turbochannel_init(struct machin Line 296  void dev_turbochannel_init(struct machin
296          } else if (strcmp(device_name, "PMAG-DV")==0) {          } else if (strcmp(device_name, "PMAG-DV")==0) {
297                  /*  xcfb in NetBSD: TODO  */                  /*  xcfb in NetBSD: TODO  */
298                  fb = dev_fb_init(machine, mem, baseaddr + 0x2000000,                  fb = dev_fb_init(machine, mem, baseaddr + 0x2000000,
299                      VFB_DEC_MAXINE, 0, 0, 0, 0, 0, "PMAG-DV", 1);                      VFB_DEC_MAXINE, 0, 0, 0, 0, 0, "PMAG-DV");
300                  /*  TODO:  not yet usable, needs a IMS332 vdac  */                  /*  TODO:  not yet usable, needs a IMS332 vdac  */
301                  rom_offset = 0x3c0000;                  rom_offset = 0x3c0000;
302          } else if (strcmp(device_name, "PMAG-JA")==0) {          } else if (strcmp(device_name, "PMAG-JA")==0) {
# Line 302  void dev_turbochannel_init(struct machin Line 306  void dev_turbochannel_init(struct machin
306          } else if (strcmp(device_name, "PMAG-RO")==0) {          } else if (strcmp(device_name, "PMAG-RO")==0) {
307                  /*  This works at least B/W in Ultrix, so far.  */                  /*  This works at least B/W in Ultrix, so far.  */
308                  fb = dev_fb_init(machine, mem, baseaddr + 0x200000,                  fb = dev_fb_init(machine, mem, baseaddr + 0x200000,
309                      VFB_GENERIC, 1280,1024, 1280,1024, 8, "PMAG-RO", 1);                      VFB_GENERIC, 1280,1024, 1280,1024, 8, "PMAG-RO");
310                  /*  TODO: bt463 at offset 0x040000, not bt459  */                  /*  TODO: bt463 at offset 0x040000, not bt459  */
311                  dev_bt459_init(machine, mem, baseaddr + 0x40000, 0,                  dev_bt459_init(machine, mem, baseaddr + 0x40000, 0,
312                      fb, 8, irq, 0);             /*  TODO: type  */                      fb, 8, irq, 0);             /*  TODO: type  */
# Line 320  void dev_turbochannel_init(struct machin Line 324  void dev_turbochannel_init(struct machin
324    
325          d->rom_skip = rom_skip;          d->rom_skip = rom_skip;
326    
327          name2 = malloc(strlen(device_name) + 30);          nlen = strlen(device_name) + 30;
328            name2 = malloc(nlen);
329          if (name2 == NULL) {          if (name2 == NULL) {
330                  fprintf(stderr, "out of memory in dev_turbochannel_init()\n");                  fprintf(stderr, "out of memory in dev_turbochannel_init()\n");
331                  exit(1);                  exit(1);
332          }          }
333          if (*device_name)          if (*device_name)
334                  sprintf(name2, "turbochannel [%s]", device_name);                  snprintf(name2, nlen, "turbochannel [%s]", device_name);
335          else          else
336                  sprintf(name2, "turbochannel");                  snprintf(name2, nlen, "turbochannel");
337    
338          memory_device_register(mem, name2, baseaddr + rom_offset + rom_skip,          memory_device_register(mem, name2, baseaddr + rom_offset + rom_skip,
339              rom_length-rom_skip, dev_turbochannel_access, d, MEM_DEFAULT, NULL);              rom_length-rom_skip, dev_turbochannel_access, d, DM_DEFAULT, NULL);
340  }  }
341    

Legend:
Removed from v.4  
changed lines
  Added in v.20

  ViewVC Help
Powered by ViewVC 1.1.26