Bug #2880, add functions for byte and word level access to pci config
space. Fix broken utf8 again.
This commit is contained in:
		
							parent
							
								
									5390c7ab05
								
							
						
					
					
						commit
						f8430a1b86
					
				| 
						 | 
					@ -319,14 +319,24 @@ pciReadWord(PCITAG tag, int offset)
 | 
				
			||||||
  CARD32 tmp;
 | 
					  CARD32 tmp;
 | 
				
			||||||
  int    shift = (offset & 3) * 8;
 | 
					  int    shift = (offset & 3) * 8;
 | 
				
			||||||
  int    aligned_offset = offset & ~3;
 | 
					  int    aligned_offset = offset & ~3;
 | 
				
			||||||
 | 
					  int	 bus = PCI_BUS_FROM_TAG(tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (shift != 0 && shift != 16)
 | 
					  if (shift != 0 && shift != 16)
 | 
				
			||||||
	  FatalError("pciReadWord: Alignment error: Cannot read 16 bits "
 | 
						  FatalError("pciReadWord: Alignment error: Cannot read 16 bits "
 | 
				
			||||||
		     "at offset %d\n", offset);
 | 
							     "at offset %d\n", offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pciInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((bus >= 0) && ((bus < pciNumBuses) || inProbe) && pciBusInfo[bus] &&
 | 
				
			||||||
 | 
						pciBusInfo[bus]->funcs->pciReadWord) {
 | 
				
			||||||
 | 
					    CARD32 rv = (*pciBusInfo[bus]->funcs->pciReadWord)(tag, offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return(rv);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
    tmp = pciReadLong(tag, aligned_offset);
 | 
					    tmp = pciReadLong(tag, aligned_offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return((CARD16)((tmp >> shift) & 0xffff));
 | 
					    return((CARD16)((tmp >> shift) & 0xffff));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
CARD8
 | 
					CARD8
 | 
				
			||||||
| 
						 | 
					@ -335,10 +345,20 @@ pciReadByte(PCITAG tag, int offset)
 | 
				
			||||||
  CARD32 tmp;
 | 
					  CARD32 tmp;
 | 
				
			||||||
  int    shift = (offset & 3) * 8;
 | 
					  int    shift = (offset & 3) * 8;
 | 
				
			||||||
  int    aligned_offset = offset & ~3;
 | 
					  int    aligned_offset = offset & ~3;
 | 
				
			||||||
 | 
					  int	 bus = PCI_BUS_FROM_TAG(tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pciInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((bus >= 0) && ((bus < pciNumBuses) || inProbe) && pciBusInfo[bus] &&
 | 
				
			||||||
 | 
						pciBusInfo[bus]->funcs->pciReadByte) {
 | 
				
			||||||
 | 
					    CARD8 rv = (*pciBusInfo[bus]->funcs->pciReadByte)(tag, offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return(rv);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
    tmp = pciReadLong(tag, aligned_offset);
 | 
					    tmp = pciReadLong(tag, aligned_offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return((CARD8)((tmp >> shift) & 0xff));
 | 
					    return((CARD8)((tmp >> shift) & 0xff));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -359,17 +379,25 @@ pciWriteWord(PCITAG tag, int offset, CARD16 val)
 | 
				
			||||||
  CARD32 tmp;
 | 
					  CARD32 tmp;
 | 
				
			||||||
  int    aligned_offset = offset & ~3;
 | 
					  int    aligned_offset = offset & ~3;
 | 
				
			||||||
  int    shift = (offset & 3) * 8;
 | 
					  int    shift = (offset & 3) * 8;
 | 
				
			||||||
 | 
					  int	 bus = PCI_BUS_FROM_TAG(tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (shift != 0 && shift != 16)
 | 
					  if (shift != 0 && shift != 16)
 | 
				
			||||||
	  FatalError("pciWriteWord: Alignment Error: Cannot read 16 bits "
 | 
						  FatalError("pciWriteWord: Alignment Error: Cannot read 16 bits "
 | 
				
			||||||
			"from offset %d\n", offset);
 | 
								"from offset %d\n", offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pciInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((bus >= 0) && (bus < pciNumBuses) && pciBusInfo[bus] &&
 | 
				
			||||||
 | 
					      pciBusInfo[bus]->funcs->pciWriteWord) {
 | 
				
			||||||
 | 
					    (*pciBusInfo[bus]->funcs->pciWriteWord)(tag, offset, val);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
    tmp = pciReadLong(tag, aligned_offset);
 | 
					    tmp = pciReadLong(tag, aligned_offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tmp &= ~(0xffffL << shift);
 | 
					    tmp &= ~(0xffffL << shift);
 | 
				
			||||||
    tmp |= (((CARD32)val) << shift);
 | 
					    tmp |= (((CARD32)val) << shift);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    pciWriteLong(tag, aligned_offset, tmp);
 | 
					    pciWriteLong(tag, aligned_offset, tmp);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					@ -378,6 +406,14 @@ pciWriteByte(PCITAG tag, int offset, CARD8 val)
 | 
				
			||||||
  CARD32 tmp;
 | 
					  CARD32 tmp;
 | 
				
			||||||
  int    aligned_offset = offset & ~3;
 | 
					  int    aligned_offset = offset & ~3;
 | 
				
			||||||
  int    shift = (offset & 3) *8 ;
 | 
					  int    shift = (offset & 3) *8 ;
 | 
				
			||||||
 | 
					  int	 bus = PCI_BUS_FROM_TAG(tag);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pciInit();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  if ((bus >= 0) && (bus < pciNumBuses) && pciBusInfo[bus] &&
 | 
				
			||||||
 | 
					      pciBusInfo[bus]->funcs->pciWriteByte) {
 | 
				
			||||||
 | 
						  (*pciBusInfo[bus]->funcs->pciWriteByte)(tag, offset, val);
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tmp = pciReadLong(tag, aligned_offset);
 | 
					    tmp = pciReadLong(tag, aligned_offset);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -385,6 +421,7 @@ pciWriteByte(PCITAG tag, int offset, CARD8 val)
 | 
				
			||||||
    tmp |= (((CARD32)val) << shift);
 | 
					    tmp |= (((CARD32)val) << shift);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    pciWriteLong(tag, aligned_offset, tmp);
 | 
					    pciWriteLong(tag, aligned_offset, tmp);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -194,8 +194,11 @@
 | 
				
			||||||
			 ((val >>  8) & 0x0000ff00) |	\
 | 
								 ((val >>  8) & 0x0000ff00) |	\
 | 
				
			||||||
			 ((val <<  8) & 0x00ff0000) |	\
 | 
								 ((val <<  8) & 0x00ff0000) |	\
 | 
				
			||||||
			 ((val << 24) & 0xff000000))
 | 
								 ((val << 24) & 0xff000000))
 | 
				
			||||||
 | 
					#define PCI_CPU16(val)	(((val >>  8) & 0x000000ff) |	\
 | 
				
			||||||
 | 
								 ((val <<  8) & 0x0000ff00))
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define PCI_CPU(val)	(val)
 | 
					#define PCI_CPU(val)	(val)
 | 
				
			||||||
 | 
					#define PCI_CPU16(val)	(val)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -382,6 +385,14 @@ typedef struct pci_bus_funcs {
 | 
				
			||||||
	void    (*pciGetBridgeBuses)(int, int *, int *, int *);
 | 
						void    (*pciGetBridgeBuses)(int, int *, int *, int *);
 | 
				
			||||||
	/* Use pointer's to avoid #include recursion */
 | 
						/* Use pointer's to avoid #include recursion */
 | 
				
			||||||
	void    (*pciGetBridgeResources)(int, pointer *, pointer *, pointer *);
 | 
						void    (*pciGetBridgeResources)(int, pointer *, pointer *, pointer *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* These are optional and will be implemented using read long
 | 
				
			||||||
 | 
						 * if not present. */
 | 
				
			||||||
 | 
						CARD8   (*pciReadByte)(PCITAG, int);
 | 
				
			||||||
 | 
						void    (*pciWriteByte)(PCITAG, int, CARD8);
 | 
				
			||||||
 | 
						CARD16  (*pciReadWord)(PCITAG, int);
 | 
				
			||||||
 | 
						void    (*pciWriteWord)(PCITAG, int, CARD16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} pciBusFuncs_t, *pciBusFuncs_p;
 | 
					} pciBusFuncs_t, *pciBusFuncs_p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,17 +69,32 @@ static ADDRESS linuxPpcBusAddrToHostAddr(PCITAG, PciAddrType, ADDRESS);
 | 
				
			||||||
static ADDRESS linuxPpcHostAddrToBusAddr(PCITAG, PciAddrType, ADDRESS);
 | 
					static ADDRESS linuxPpcHostAddrToBusAddr(PCITAG, PciAddrType, ADDRESS);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CARD8 linuxPciCfgReadByte(PCITAG tag, int off);
 | 
				
			||||||
 | 
					static void linuxPciCfgWriteByte(PCITAG tag, int off, CARD8 val);
 | 
				
			||||||
 | 
					static CARD16 linuxPciCfgReadWord(PCITAG tag, int off);
 | 
				
			||||||
 | 
					static void linuxPciCfgWriteWord(PCITAG tag, int off, CARD16 val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static pciBusFuncs_t linuxFuncs0 = {
 | 
					static pciBusFuncs_t linuxFuncs0 = {
 | 
				
			||||||
/* pciReadLong      */	linuxPciCfgRead,
 | 
					/* pciReadLong      */	linuxPciCfgRead,
 | 
				
			||||||
/* pciWriteLong     */	linuxPciCfgWrite,
 | 
					/* pciWriteLong     */	linuxPciCfgWrite,
 | 
				
			||||||
/* pciSetBitsLong   */	linuxPciCfgSetBits,
 | 
					/* pciSetBitsLong   */	linuxPciCfgSetBits,
 | 
				
			||||||
#if defined(__powerpc__)
 | 
					#if defined(__powerpc__)
 | 
				
			||||||
/* pciAddrHostToBus */	linuxPpcHostAddrToBusAddr,
 | 
					/* pciAddrHostToBus */	linuxPpcHostAddrToBusAddr,
 | 
				
			||||||
/* pciAddrBusToHost */	linuxPpcBusAddrToHostAddr
 | 
					/* pciAddrBusToHost */	linuxPpcBusAddrToHostAddr,
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
/* pciAddrHostToBus */	pciAddrNOOP,
 | 
					/* pciAddrHostToBus */	pciAddrNOOP,
 | 
				
			||||||
/* pciAddrBusToHost */	linuxTransAddrBusToHost
 | 
					/* pciAddrBusToHost */	linuxTransAddrBusToHost,
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* pciControlBridge */		NULL,
 | 
				
			||||||
 | 
					/* pciGetBridgeBuses */		NULL,
 | 
				
			||||||
 | 
					/* pciGetBridgeResources */	NULL,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* pciReadByte */	linuxPciCfgReadByte,
 | 
				
			||||||
 | 
					/* pciWriteByte */	linuxPciCfgWriteByte,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* pciReadWord */	linuxPciCfgReadWord,
 | 
				
			||||||
 | 
					/* pciWriteWord */	linuxPciCfgWriteWord,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static pciBusInfo_t linuxPci0 = {
 | 
					static pciBusInfo_t linuxPci0 = {
 | 
				
			||||||
| 
						 | 
					@ -270,6 +285,57 @@ linuxPpcHostAddrToBusAddr(PCITAG tag, PciAddrType type, ADDRESS addr)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* __powerpc__ */
 | 
					#endif /* __powerpc__ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CARD8
 | 
				
			||||||
 | 
					linuxPciCfgReadByte(PCITAG tag, int off)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int	fd;
 | 
				
			||||||
 | 
						CARD8	val = 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (-1 != (fd = linuxPciOpenFile(tag,FALSE))) {
 | 
				
			||||||
 | 
							lseek(fd,off,SEEK_SET);
 | 
				
			||||||
 | 
							read(fd,&val,1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return val;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					linuxPciCfgWriteByte(PCITAG tag, int off, CARD8 val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int	fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (-1 != (fd = linuxPciOpenFile(tag,TRUE))) {
 | 
				
			||||||
 | 
							lseek(fd,off,SEEK_SET);
 | 
				
			||||||
 | 
							write(fd, &val, 1);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static CARD16
 | 
				
			||||||
 | 
					linuxPciCfgReadWord(PCITAG tag, int off)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int	fd;
 | 
				
			||||||
 | 
						CARD16	val = 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (-1 != (fd = linuxPciOpenFile(tag,FALSE))) {
 | 
				
			||||||
 | 
							lseek(fd, off, SEEK_SET);
 | 
				
			||||||
 | 
							read(fd, &val, 2);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return PCI_CPU16(val);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					linuxPciCfgWriteWord(PCITAG tag, int off, CARD16 val)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int	fd;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (-1 != (fd = linuxPciOpenFile(tag,TRUE))) {
 | 
				
			||||||
 | 
							lseek(fd, off, SEEK_SET);
 | 
				
			||||||
 | 
							val = PCI_CPU16(val);
 | 
				
			||||||
 | 
							write(fd, &val, 2);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef INCLUDE_XF86_NO_DOMAIN
 | 
					#ifndef INCLUDE_XF86_NO_DOMAIN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue