/[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 22 by dpavlin, Mon Oct 8 16:19:37 2007 UTC
# Line 1  Line 1 
1  /*  /*
2   *  Copyright (C) 2003-2005  Anders Gavare.  All rights reserved.   *  Copyright (C) 2003-2006  Anders Gavare.  All rights reserved.
3   *   *
4   *  Redistribution and use in source and binary forms, with or without   *  Redistribution and use in source and binary forms, with or without
5   *  modification, are permitted provided that the following conditions are met:   *  modification, are permitted provided that the following conditions are met:
# 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.46 2006/01/01 13:17:17 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    
66  /*  /*
67   *  dev_turbochannel_access():   *  dev_turbochannel_access():
68   */   */
69  int dev_turbochannel_access(struct cpu *cpu, struct memory *mem,  DEVICE_ACCESS(turbochannel)
         uint64_t relative_addr, unsigned char *data, size_t len,  
         int writeflag, void *extra)  
70  {  {
71          struct turbochannel_data *d = extra;          struct turbochannel_data *d = extra;
72          uint64_t idata = 0, odata = 0;          uint64_t idata = 0, odata = 0;
73    
74          idata = memory_readmax64(cpu, data, len);          if (writeflag == MEM_WRITE)
75                    idata = memory_readmax64(cpu, data, len);
76    
77          relative_addr += d->rom_skip;          relative_addr += d->rom_skip;
78    
# Line 179  void dev_turbochannel_init(struct machin Line 182  void dev_turbochannel_init(struct machin
182  {  {
183          struct vfb_data *fb;          struct vfb_data *fb;
184          struct turbochannel_data *d;          struct turbochannel_data *d;
185          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;  
186          char *name2;          char *name2;
187            size_t nlen;
188    
189          if (device_name == NULL)          if (device_name == NULL)
190                  return;                  return;
# Line 203  void dev_turbochannel_init(struct machin Line 205  void dev_turbochannel_init(struct machin
205          d->endaddr  = endaddr;          d->endaddr  = endaddr;
206          d->irq      = irq;          d->irq      = irq;
207    
208          strcpy(d->device_name, device_name);          strlcpy(d->device_name, device_name, DEVICE_NAME_BUFLEN);
209    
210          strncpy(d->card_firmware_version, "V5.3a   ", 8);          strncpy(d->card_firmware_version, "V5.3a   ", CARD_NAME_BUFLEN);
211          strncpy(d->card_vendor_name,      "DEC     ", 8);          strncpy(d->card_vendor_name,      "DEC     ", CARD_NAME_BUFLEN);
212          strncpy(d->card_firmware_type,    "TCF0", 4);          strncpy(d->card_firmware_type,    "TCF0", CARD_FIRMWARE_BUFLEN);
213    
214          memset(d->card_module_name, ' ', 8);          memset(d->card_module_name, ' ', 8);
215          strncpy(d->card_module_name, device_name, strlen(device_name));          memcpy(d->card_module_name, device_name, strlen(device_name));
216    
217          /*          /*
218           *  According to NetBSD/pmax:           *  According to NetBSD/pmax:
# Line 246  void dev_turbochannel_init(struct machin Line 248  void dev_turbochannel_init(struct machin
248          } else if (strcmp(device_name, "PMAG-AA")==0) {          } else if (strcmp(device_name, "PMAG-AA")==0) {
249                  /*  mfb in NetBSD  */                  /*  mfb in NetBSD  */
250                  fb = dev_fb_init(machine, mem, baseaddr + VFB_MFB_VRAM,                  fb = dev_fb_init(machine, mem, baseaddr + VFB_MFB_VRAM,
251                      VFB_GENERIC, 1280, 1024, 2048, 1024, 8, device_name, 1);                      VFB_GENERIC, 1280, 1024, 2048, 1024, 8, device_name);
252                  /*  bt455 = palette, bt431 = cursor  */                  /*  bt455 = palette, bt431 = cursor  */
253                  dev_bt455_init(mem, baseaddr + VFB_MFB_BT455, fb);                  dev_bt455_init(mem, baseaddr + VFB_MFB_BT455, fb);
254                  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 256  void dev_turbochannel_init(struct machin
256          } else if (strcmp(device_name, "PMAG-BA")==0) {          } else if (strcmp(device_name, "PMAG-BA")==0) {
257                  /*  cfb in NetBSD  */                  /*  cfb in NetBSD  */
258                  fb = dev_fb_init(machine, mem, baseaddr, VFB_GENERIC,                  fb = dev_fb_init(machine, mem, baseaddr, VFB_GENERIC,
259                      1024,864, 1024,1024,8, device_name, 1);                      1024,864, 1024,1024,8, device_name);
260                  dev_bt459_init(machine, mem, baseaddr + VFB_CFB_BT459,                  dev_bt459_init(machine, mem, baseaddr + VFB_CFB_BT459,
261                      baseaddr + 0x300000, fb, 8, irq, BT459_BA);                      baseaddr + 0x300000, fb, 8, irq, BT459_BA);
262                  /*  ROM at both 0x380000 and 0x3c0000?  */                  /*  ROM at both 0x380000 and 0x3c0000?  */
# Line 264  void dev_turbochannel_init(struct machin Line 266  void dev_turbochannel_init(struct machin
266                  /*  sfb in NetBSD  */                  /*  sfb in NetBSD  */
267                  /*  TODO: This is not working with Ultrix yet.  */                  /*  TODO: This is not working with Ultrix yet.  */
268                  fb = dev_fb_init(machine, mem, baseaddr + SFB_OFFSET_VRAM,                  fb = dev_fb_init(machine, mem, baseaddr + SFB_OFFSET_VRAM,
269                      VFB_GENERIC, 1280,1024, 1280,1024,8, device_name, 1);                      VFB_GENERIC, 1280,1024, 1280,1024,8, device_name);
270                  dev_sfb_init(machine, mem, baseaddr + SFB_ASIC_OFFSET, fb);                  dev_sfb_init(machine, mem, baseaddr + SFB_ASIC_OFFSET, fb);
271                  /*  TODO: the CLEAR doesn't get through, as the address                  /*  TODO: the CLEAR doesn't get through, as the address
272                          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 294  void dev_turbochannel_init(struct machin
294          } else if (strcmp(device_name, "PMAG-DV")==0) {          } else if (strcmp(device_name, "PMAG-DV")==0) {
295                  /*  xcfb in NetBSD: TODO  */                  /*  xcfb in NetBSD: TODO  */
296                  fb = dev_fb_init(machine, mem, baseaddr + 0x2000000,                  fb = dev_fb_init(machine, mem, baseaddr + 0x2000000,
297                      VFB_DEC_MAXINE, 0, 0, 0, 0, 0, "PMAG-DV", 1);                      VFB_DEC_MAXINE, 0, 0, 0, 0, 0, "PMAG-DV");
298                  /*  TODO:  not yet usable, needs a IMS332 vdac  */                  /*  TODO:  not yet usable, needs a IMS332 vdac  */
299                  rom_offset = 0x3c0000;                  rom_offset = 0x3c0000;
300          } 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 304  void dev_turbochannel_init(struct machin
304          } else if (strcmp(device_name, "PMAG-RO")==0) {          } else if (strcmp(device_name, "PMAG-RO")==0) {
305                  /*  This works at least B/W in Ultrix, so far.  */                  /*  This works at least B/W in Ultrix, so far.  */
306                  fb = dev_fb_init(machine, mem, baseaddr + 0x200000,                  fb = dev_fb_init(machine, mem, baseaddr + 0x200000,
307                      VFB_GENERIC, 1280,1024, 1280,1024, 8, "PMAG-RO", 1);                      VFB_GENERIC, 1280,1024, 1280,1024, 8, "PMAG-RO");
308                  /*  TODO: bt463 at offset 0x040000, not bt459  */                  /*  TODO: bt463 at offset 0x040000, not bt459  */
309                  dev_bt459_init(machine, mem, baseaddr + 0x40000, 0,                  dev_bt459_init(machine, mem, baseaddr + 0x40000, 0,
310                      fb, 8, irq, 0);             /*  TODO: type  */                      fb, 8, irq, 0);             /*  TODO: type  */
# Line 320  void dev_turbochannel_init(struct machin Line 322  void dev_turbochannel_init(struct machin
322    
323          d->rom_skip = rom_skip;          d->rom_skip = rom_skip;
324    
325          name2 = malloc(strlen(device_name) + 30);          nlen = strlen(device_name) + 30;
326            name2 = malloc(nlen);
327          if (name2 == NULL) {          if (name2 == NULL) {
328                  fprintf(stderr, "out of memory in dev_turbochannel_init()\n");                  fprintf(stderr, "out of memory in dev_turbochannel_init()\n");
329                  exit(1);                  exit(1);
330          }          }
331          if (*device_name)          if (*device_name)
332                  sprintf(name2, "turbochannel [%s]", device_name);                  snprintf(name2, nlen, "turbochannel [%s]", device_name);
333          else          else
334                  sprintf(name2, "turbochannel");                  snprintf(name2, nlen, "turbochannel");
335    
336          memory_device_register(mem, name2, baseaddr + rom_offset + rom_skip,          memory_device_register(mem, name2, baseaddr + rom_offset + rom_skip,
337              rom_length-rom_skip, dev_turbochannel_access, d, MEM_DEFAULT, NULL);              rom_length-rom_skip, dev_turbochannel_access, d, DM_DEFAULT, NULL);
338  }  }
339    

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

  ViewVC Help
Powered by ViewVC 1.1.26