Hi,
I separated the direct io access code from the flashrom changes, to make this code easily available for the other coreboot utilities, too.
The remaining windows patch is rather small.
I'll clean up the directio code some more and make a release asap.
Best regards,
Stefan
On 09.08.2009 18:01, Stefan Reinauer wrote:
I separated the direct io access code from the flashrom changes, to make this code easily available for the other coreboot utilities, too.
The remaining windows patch is rather small.
Neat, thanks!
These are the current changes required for running flashrom on Windows. You will need DirectIO for Windows (To be released soon)
I didn't review the separate DirectIO patch because you wrote you wanted to clean it up first.
Signed-off-by: Stefan Reinauer stepan@coresystems.de
The Makefile change breaks compilation for me. The serprog.c change can be simplified a bit. If you leave out those two files, the patch is Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
I'll send a patch for serprog.c and Makefile in a few minutes.
Regards, Carl-Daniel
Carl-Daniel Hailfinger wrote:
The Makefile change breaks compilation for me. The serprog.c change can be simplified a bit. If you leave out those two files, the patch is Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
I don't think committing half the patch makes much sense, so I'm going to wait for a more detailed bug report from you.
Stefan
On 09.08.2009 22:35, Carl-Daniel Hailfinger wrote:
On 09.08.2009 18:01, Stefan Reinauer wrote:
Signed-off-by: Stefan Reinauer stepan@coresystems.de
The Makefile change breaks compilation for me. The serprog.c change can be simplified a bit. If you leave out those two files, the patch is Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Since the serprog stuff is mostly cosmetics, I can cover that in a separate patch. Please commit your version. Updated makefile patch (which works for me) follows below. The change is basically the definition of CC. For Windows, you want to force gcc. On other architectures, compilers like llvm-gcc and clang etc. work fine with flashrom.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-windows_makefile/Makefile =================================================================== --- flashrom-windows_makefile/Makefile (Revision 671) +++ flashrom-windows_makefile/Makefile (Arbeitskopie) @@ -19,7 +19,11 @@
PROGRAM = flashrom
+ifeq ($(OS), Windows_NT) +CC = gcc +else CC ?= gcc +endif STRIP = strip INSTALL = install DIFF = diff @@ -41,7 +45,11 @@ LDFLAGS += -L/usr/local/lib endif
+ifeq ($(OS), Windows_NT) +LIBS += -L. -ldirectio +else LIBS += -lpci -lz +endif
OBJS = chipset_enable.o board_enable.o udelay.o jedec.o stm50flw0x0x.o \ sst28sf040.o am29f040b.o mx29f002.o m29f400bt.o pm29f002.o \ @@ -68,8 +76,10 @@ $(CC) $(LDFLAGS) -o $(PROGRAM) $(OBJS) $(LIBS) $(FEATURE_LIBS)
FEATURE_CFLAGS = $(shell LC_ALL=C grep -q "FTDISUPPORT := yes" .features && printf "%s" "-D'FT2232_SPI_SUPPORT=1'") -# Always enable serprog for now. Needs to be disabled on Windows. + +ifneq ($(OS), Windows_NT) FEATURE_CFLAGS += -D'SERPROG_SUPPORT=1' +endif
FEATURE_LIBS = $(shell LC_ALL=C grep -q "FTDISUPPORT := yes" .features && printf "%s" "-lftdi")
@@ -102,6 +112,7 @@ rm -f .test.c .test; exit 1) @rm -f .test.c .test
+ifneq ($(OS), Windows_NT) pciutils: compiler @printf "Checking for pciutils and zlib... " @$(shell ( echo "#include <pci/pci.h>"; \ @@ -114,6 +125,7 @@ echo "See README for more information."; echo; \ rm -f .test.c .test; exit 1) @rm -f .test.c .test +endif
.features: features
On 09.08.2009 23:47, Carl-Daniel Hailfinger wrote:
On 09.08.2009 22:35, Carl-Daniel Hailfinger wrote:
On 09.08.2009 18:01, Stefan Reinauer wrote:
Signed-off-by: Stefan Reinauer stepan@coresystems.de
The Makefile change breaks compilation for me. The serprog.c change can be simplified a bit. If you leave out those two files, the patch is Acked-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
The serprog patch is no longer needed since r679.
Regards, Carl-Daniel
Hello,
I am certainly no programmer, I require a windows executable of flashrom but can find it nowhere (for the EON EN29F1010 chip). I've search and searched, but the results are always patches. I have no idea what to do with a patch. Your name appears everywhere when searching, so I thought I might drop you a line as see if you could help. If not I'll resort to a linux install, but that seems like overkill for my need to flash one chip.
Mike
Hi Michael,
On 29.03.2010 05:48, Michael Leslie wrote:
I am certainly no programmer, I require a windows executable of flashrom but can find it nowhere (for the EON EN29F1010 chip). I've search and searched, but the results are always patches. I have no idea what to do with a patch. Your name appears everywhere when searching, so I thought I might drop you a line as see if you could help. If not I'll resort to a linux install, but that seems like overkill for my need to flash one chip.
Unfortunately, there are no Windows executables available to the public yet and I don't expect this to change in the next few weeks (someone would have to update the patches, merge them, test the result, then make Windows executables available to the public).
The next best offer is a DOS executable (which won't run under Windows, but at least it will run under DOS). It is available for download, but there is a crucial limitation which may affect flashing, so it is not totally endorsed yet. We're in the process of testing a fix for said limitation, and will be releasing updated DOS binaries shortly.
As an alternative, there are Linux Live CDs which contain flashrom, so you can avoid installing Linux (just run it from CD) and still use flashrom.
I hope this information helps.
Regards, Carl-Daniel
I thank you for taking the time to respond. I have been looking into the Live CD route.
Mike
-------------------------------------------------- From: "Carl-Daniel Hailfinger" c-d.hailfinger.devel.2006@gmx.net Sent: Tuesday, March 30, 2010 8:37 AM To: "Michael Leslie" mpatl@hotmail.com Cc: "flashrom" flashrom@flashrom.org Subject: Re: [flashrom] [PATCH] new windows port
Hi Michael,
On 29.03.2010 05:48, Michael Leslie wrote:
I am certainly no programmer, I require a windows executable of flashrom but can find it nowhere (for the EON EN29F1010 chip). I've search and searched, but the results are always patches. I have no idea what to do with a patch. Your name appears everywhere when searching, so I thought I might drop you a line as see if you could help. If not I'll resort to a linux install, but that seems like overkill for my need to flash one chip.
Unfortunately, there are no Windows executables available to the public yet and I don't expect this to change in the next few weeks (someone would have to update the patches, merge them, test the result, then make Windows executables available to the public).
The next best offer is a DOS executable (which won't run under Windows, but at least it will run under DOS). It is available for download, but there is a crucial limitation which may affect flashing, so it is not totally endorsed yet. We're in the process of testing a fix for said limitation, and will be releasing updated DOS binaries shortly.
As an alternative, there are Linux Live CDs which contain flashrom, so you can avoid installing Linux (just run it from CD) and still use flashrom.
I hope this information helps.
Regards, Carl-Daniel
On 09.08.2009 18:01, Stefan Reinauer wrote:
I separated the direct io access code from the flashrom changes, to make this code easily available for the other coreboot utilities, too.
The remaining windows patch is rather small.
I'll clean up the directio code some more and make a release asap.
I cleaned up the Windows patch, rewrote the Makefile changes and updated it to apply against latest svn.
Signed-off-by: Carl-Daniel Hailfinger c-d.hailfinger.devel.2006@gmx.net
Index: flashrom-windows/hwaccess.h =================================================================== --- flashrom-windows/hwaccess.h (Revision 1028) +++ flashrom-windows/hwaccess.h (Arbeitskopie) @@ -31,8 +31,12 @@ #endif
#if NEED_PCI == 1 +#if defined (__MINGW32_VERSION) && ( defined (__i386__) || defined (__x86_64__) ) +#include "directio.h" +#else #include <pci/pci.h> #endif +#endif
#if defined (__i386__) || defined (__x86_64__)
Index: flashrom-windows/physmap.c =================================================================== --- flashrom-windows/physmap.c (Revision 1028) +++ flashrom-windows/physmap.c (Arbeitskopie) @@ -30,7 +30,25 @@ #include <errno.h> #include "flash.h"
-#ifdef __DJGPP__ +#if defined (__MINGW32_VERSION) + +#define MEM_DEV "DirectIO" + +void *sys_physmap(unsigned long phys_addr, size_t len) +{ + return map_physical_addr_range(phys_addr, len); +} + +#define sys_physmap_rw_uncached sys_physmap +#define sys_physmap_ro_cached sys_physmap + +void physunmap(void *virt_addr, size_t len) +{ + unmap_physical_addr_range(virt_addr, len); +} + +#elif defined (__DJGPP__) + #include <dpmi.h> #include <sys/nearptr.h>
Index: flashrom-windows/Makefile =================================================================== --- flashrom-windows/Makefile (Revision 1028) +++ flashrom-windows/Makefile (Arbeitskopie) @@ -213,8 +213,11 @@ endif
ifeq ($(NEED_PCI), yes) +ifeq ($(OS_ARCH), Windows_NT) +else CHECK_LIBPCI = yes endif +endif
ifeq ($(NEED_PCI), yes) FEATURE_CFLAGS += -D'NEED_PCI=1' @@ -227,10 +230,14 @@ # FIXME There needs to be a better way to do this LIBS += ../libpci/lib/libpci.a ../libgetopt/libgetopt.a else +ifeq ($(OS_ARCH), Windows_NT) +LIBS += -L. -ldirectio +else LIBS += -lpci endif endif endif +endif
ifeq ($(CONFIG_PRINT_WIKI), yes) FEATURE_CFLAGS += -D'CONFIG_PRINT_WIKI=1' Index: flashrom-windows/README =================================================================== --- flashrom-windows/README (Revision 1028) +++ flashrom-windows/README (Arbeitskopie) @@ -101,6 +101,10 @@ To run flashrom.exe, download http://clio.rice.edu/djgpp/csdpmi7b.zip and make sure CWSDPMI.EXE is in the current directory.
+To compile on Windows: + Make sure you use gcc for compilation. This can be specified with + make CC=gcc + Installation ------------
Index: flashrom-windows/cbtable.c =================================================================== --- flashrom-windows/cbtable.c (Revision 1028) +++ flashrom-windows/cbtable.c (Arbeitskopie) @@ -226,6 +226,12 @@ start = forward->forward; start &= ~(getpagesize() - 1); physunmap(table_area, BYTES_TO_MAP); +#if defined (__MINGW32_VERSION) + /* For some reason MINGW/directio does not like + * mapping the high table area yet + */ + lb_table=NULL; +#else table_area = physmap_try_ro("high tables", start, BYTES_TO_MAP); if (!table_area) { msg_perr("Failed getting access to coreboot " @@ -233,6 +239,7 @@ return -1; } lb_table = find_lb_table(table_area, 0x00000, 0x1000); +#endif } }
Hi,
we've been getting multiple requests for PCI-based programmer support on Windows, and now that internal programmer support is optional and a few other architectural cleanups were done, Windows support for anything using PCI should be easier to merge.
On 09.08.2009 18:01, Stefan Reinauer wrote:
I separated the direct io access code from the flashrom changes, to make this code easily available for the other coreboot utilities, too.
The remaining windows patch is rather small.
I'll clean up the directio code some more and make a release asap.
Yes, that would be nice.
In case anyone wants to take a look at directio.h in split up form, I've inlined a patch for reference. This makes it a bit easier to see what directio.h provides besides PCI #defines.
Regards, Carl-Daniel
Index: flashrom-windows/directio.h =================================================================== --- flashrom-windows/directio.h (Revision 0) +++ flashrom-windows/directio.h (Revision 0) @@ -0,0 +1,35 @@ +/* Copyright (C) 2009 coresystems GmbH */ + +#ifndef __DIRECT_IO_H__ +#define __DIRECT_IO_H__ + +#include "pci.h" /* Our own fork of pci.h */ + +int init_driver(); // returns 0 on error, 1 on success +void cleanup_driver(); // must be called after done using the driver + +void* map_physical_addr_range( unsigned long phy_addr_start, + unsigned long size ); // returns NULL on error, valid pointer on success +int unmap_physical_addr_range( void* virt_addr_start, + unsigned long size ); // must be called after done with the mapped physical memory + +unsigned long hal_pci_read_offset( unsigned long bus, unsigned long device, + unsigned long function, unsigned long offset, + unsigned char length); + +void hal_pci_write_offset( unsigned long bus, unsigned long device, + unsigned long function, unsigned long offset, + unsigned long value, unsigned char length ); + +void outb(unsigned char value, unsigned short port); +void outw(unsigned short value, unsigned short port); +void outl(unsigned long value, unsigned short port); + +unsigned char inb(unsigned short port); +unsigned short inw(unsigned short port); +unsigned long inl(unsigned short port); + +int getpagesize(void); +int iopl(int level); + +#endif //__DIRECT_IO_H__ Index: flashrom-windows/pci.h =================================================================== --- flashrom-windows/pci.h (Revision 0) +++ flashrom-windows/pci.h (Revision 0) @@ -0,0 +1,555 @@ +/* + * $Id: pci.h,v 1.12 2003/01/04 11:04:39 mj Exp $ + * + * The PCI Library + * + * Copyright (c) 1997--2002 Martin Mares mj@ucw.cz + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#ifndef _PCI_LIB_H +#define _PCI_LIB_H + +/* + * $Id: header.h,v 1.9 2002/12/26 20:24:50 mj Exp $ + * + * The PCI Library -- PCI Header Structure (extracted from <linux/pci.h>) + * + * Copyright (c) 1997--2002 Martin Mares mj@ucw.cz + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +/* + * Under PCI, each device has 256 bytes of configuration address space, + * of which the first 64 bytes are standardized as follows: + */ +#define PCI_VENDOR_ID 0x00 /* 16 bits */ +#define PCI_DEVICE_ID 0x02 /* 16 bits */ +#define PCI_COMMAND 0x04 /* 16 bits */ +#define PCI_COMMAND_IO 0x1 /* Enable response in I/O space */ +#define PCI_COMMAND_MEMORY 0x2 /* Enable response in Memory space */ +#define PCI_COMMAND_MASTER 0x4 /* Enable bus mastering */ +#define PCI_COMMAND_SPECIAL 0x8 /* Enable response to special cycles */ +#define PCI_COMMAND_INVALIDATE 0x10 /* Use memory write and invalidate */ +#define PCI_COMMAND_VGA_PALETTE 0x20 /* Enable palette snooping */ +#define PCI_COMMAND_PARITY 0x40 /* Enable parity checking */ +#define PCI_COMMAND_WAIT 0x80 /* Enable address/data stepping */ +#define PCI_COMMAND_SERR 0x100 /* Enable SERR */ +#define PCI_COMMAND_FAST_BACK 0x200 /* Enable back-to-back writes */ + +#define PCI_STATUS 0x06 /* 16 bits */ +#define PCI_STATUS_CAP_LIST 0x10 /* Support Capability List */ +#define PCI_STATUS_66MHZ 0x20 /* Support 66 Mhz PCI 2.1 bus */ +#define PCI_STATUS_UDF 0x40 /* Support User Definable Features [obsolete] */ +#define PCI_STATUS_FAST_BACK 0x80 /* Accept fast-back to back */ +#define PCI_STATUS_PARITY 0x100 /* Detected parity error */ +#define PCI_STATUS_DEVSEL_MASK 0x600 /* DEVSEL timing */ +#define PCI_STATUS_DEVSEL_FAST 0x000 +#define PCI_STATUS_DEVSEL_MEDIUM 0x200 +#define PCI_STATUS_DEVSEL_SLOW 0x400 +#define PCI_STATUS_SIG_TARGET_ABORT 0x800 /* Set on target abort */ +#define PCI_STATUS_REC_TARGET_ABORT 0x1000 /* Master ack of " */ +#define PCI_STATUS_REC_MASTER_ABORT 0x2000 /* Set on master abort */ +#define PCI_STATUS_SIG_SYSTEM_ERROR 0x4000 /* Set when we drive SERR */ +#define PCI_STATUS_DETECTED_PARITY 0x8000 /* Set on parity error */ + +#define PCI_CLASS_REVISION 0x08 /* High 24 bits are class, low 8 + revision */ +#define PCI_REVISION_ID 0x08 /* Revision ID */ +#define PCI_CLASS_PROG 0x09 /* Reg. Level Programming Interface */ +#define PCI_CLASS_DEVICE 0x0a /* Device class */ + +#define PCI_CACHE_LINE_SIZE 0x0c /* 8 bits */ +#define PCI_LATENCY_TIMER 0x0d /* 8 bits */ +#define PCI_HEADER_TYPE 0x0e /* 8 bits */ +#define PCI_HEADER_TYPE_NORMAL 0 +#define PCI_HEADER_TYPE_BRIDGE 1 +#define PCI_HEADER_TYPE_CARDBUS 2 + +#define PCI_BIST 0x0f /* 8 bits */ +#define PCI_BIST_CODE_MASK 0x0f /* Return result */ +#define PCI_BIST_START 0x40 /* 1 to start BIST, 2 secs or less */ +#define PCI_BIST_CAPABLE 0x80 /* 1 if BIST capable */ + +/* + * Base addresses specify locations in memory or I/O space. + * Decoded size can be determined by writing a value of + * 0xffffffff to the register, and reading it back. Only + * 1 bits are decoded. + */ +#define PCI_BASE_ADDRESS_0 0x10 /* 32 bits */ +#define PCI_BASE_ADDRESS_1 0x14 /* 32 bits [htype 0,1 only] */ +#define PCI_BASE_ADDRESS_2 0x18 /* 32 bits [htype 0 only] */ +#define PCI_BASE_ADDRESS_3 0x1c /* 32 bits */ +#define PCI_BASE_ADDRESS_4 0x20 /* 32 bits */ +#define PCI_BASE_ADDRESS_5 0x24 /* 32 bits */ +#define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */ +#define PCI_BASE_ADDRESS_SPACE_IO 0x01 +#define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00 +#define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06 +#define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */ +#define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */ +#define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */ +#define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */ +#define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL) +#define PCI_BASE_ADDRESS_IO_MASK (~0x03UL) +/* bit 1 is reserved if address_space = 1 */ + +/* Header type 0 (normal devices) */ +#define PCI_CARDBUS_CIS 0x28 +#define PCI_SUBSYSTEM_VENDOR_ID 0x2c +#define PCI_SUBSYSTEM_ID 0x2e +#define PCI_ROM_ADDRESS 0x30 /* Bits 31..11 are address, 10..1 reserved */ +#define PCI_ROM_ADDRESS_ENABLE 0x01 +#define PCI_ROM_ADDRESS_MASK (~0x7ffUL) + +#define PCI_CAPABILITY_LIST 0x34 /* Offset of first capability list entry */ + +/* 0x35-0x3b are reserved */ +#define PCI_INTERRUPT_LINE 0x3c /* 8 bits */ +#define PCI_INTERRUPT_PIN 0x3d /* 8 bits */ +#define PCI_MIN_GNT 0x3e /* 8 bits */ +#define PCI_MAX_LAT 0x3f /* 8 bits */ + +/* Header type 1 (PCI-to-PCI bridges) */ +#define PCI_PRIMARY_BUS 0x18 /* Primary bus number */ +#define PCI_SECONDARY_BUS 0x19 /* Secondary bus number */ +#define PCI_SUBORDINATE_BUS 0x1a /* Highest bus number behind the bridge */ +#define PCI_SEC_LATENCY_TIMER 0x1b /* Latency timer for secondary interface */ +#define PCI_IO_BASE 0x1c /* I/O range behind the bridge */ +#define PCI_IO_LIMIT 0x1d +#define PCI_IO_RANGE_TYPE_MASK 0x0f /* I/O bridging type */ +#define PCI_IO_RANGE_TYPE_16 0x00 +#define PCI_IO_RANGE_TYPE_32 0x01 +#define PCI_IO_RANGE_MASK ~0x0f +#define PCI_SEC_STATUS 0x1e /* Secondary status register, only bit 14 used */ +#define PCI_MEMORY_BASE 0x20 /* Memory range behind */ +#define PCI_MEMORY_LIMIT 0x22 +#define PCI_MEMORY_RANGE_TYPE_MASK 0x0f +#define PCI_MEMORY_RANGE_MASK ~0x0f +#define PCI_PREF_MEMORY_BASE 0x24 /* Prefetchable memory range behind */ +#define PCI_PREF_MEMORY_LIMIT 0x26 +#define PCI_PREF_RANGE_TYPE_MASK 0x0f +#define PCI_PREF_RANGE_TYPE_32 0x00 +#define PCI_PREF_RANGE_TYPE_64 0x01 +#define PCI_PREF_RANGE_MASK ~0x0f +#define PCI_PREF_BASE_UPPER32 0x28 /* Upper half of prefetchable memory range */ +#define PCI_PREF_LIMIT_UPPER32 0x2c +#define PCI_IO_BASE_UPPER16 0x30 /* Upper half of I/O addresses */ +#define PCI_IO_LIMIT_UPPER16 0x32 +/* 0x34 same as for htype 0 */ +/* 0x35-0x3b is reserved */ +#define PCI_ROM_ADDRESS1 0x38 /* Same as PCI_ROM_ADDRESS, but for htype 1 */ +/* 0x3c-0x3d are same as for htype 0 */ +#define PCI_BRIDGE_CONTROL 0x3e +#define PCI_BRIDGE_CTL_PARITY 0x01 /* Enable parity detection on secondary interface */ +#define PCI_BRIDGE_CTL_SERR 0x02 /* The same for SERR forwarding */ +#define PCI_BRIDGE_CTL_NO_ISA 0x04 /* Disable bridging of ISA ports */ +#define PCI_BRIDGE_CTL_VGA 0x08 /* Forward VGA addresses */ +#define PCI_BRIDGE_CTL_MASTER_ABORT 0x20 /* Report master aborts */ +#define PCI_BRIDGE_CTL_BUS_RESET 0x40 /* Secondary bus reset */ +#define PCI_BRIDGE_CTL_FAST_BACK 0x80 /* Fast Back2Back enabled on secondary interface */ + +/* Header type 2 (CardBus bridges) */ +/* 0x14-0x15 reserved */ +#define PCI_CB_SEC_STATUS 0x16 /* Secondary status */ +#define PCI_CB_PRIMARY_BUS 0x18 /* PCI bus number */ +#define PCI_CB_CARD_BUS 0x19 /* CardBus bus number */ +#define PCI_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus number */ +#define PCI_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ +#define PCI_CB_MEMORY_BASE_0 0x1c +#define PCI_CB_MEMORY_LIMIT_0 0x20 +#define PCI_CB_MEMORY_BASE_1 0x24 +#define PCI_CB_MEMORY_LIMIT_1 0x28 +#define PCI_CB_IO_BASE_0 0x2c +#define PCI_CB_IO_BASE_0_HI 0x2e +#define PCI_CB_IO_LIMIT_0 0x30 +#define PCI_CB_IO_LIMIT_0_HI 0x32 +#define PCI_CB_IO_BASE_1 0x34 +#define PCI_CB_IO_BASE_1_HI 0x36 +#define PCI_CB_IO_LIMIT_1 0x38 +#define PCI_CB_IO_LIMIT_1_HI 0x3a +#define PCI_CB_IO_RANGE_MASK ~0x03 +/* 0x3c-0x3d are same as for htype 0 */ +#define PCI_CB_BRIDGE_CONTROL 0x3e +#define PCI_CB_BRIDGE_CTL_PARITY 0x01 /* Similar to standard bridge control register */ +#define PCI_CB_BRIDGE_CTL_SERR 0x02 +#define PCI_CB_BRIDGE_CTL_ISA 0x04 +#define PCI_CB_BRIDGE_CTL_VGA 0x08 +#define PCI_CB_BRIDGE_CTL_MASTER_ABORT 0x20 +#define PCI_CB_BRIDGE_CTL_CB_RESET 0x40 /* CardBus reset */ +#define PCI_CB_BRIDGE_CTL_16BIT_INT 0x80 /* Enable interrupt for 16-bit cards */ +#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM0 0x100 /* Prefetch enable for both memory regions */ +#define PCI_CB_BRIDGE_CTL_PREFETCH_MEM1 0x200 +#define PCI_CB_BRIDGE_CTL_POST_WRITES 0x400 +#define PCI_CB_SUBSYSTEM_VENDOR_ID 0x40 +#define PCI_CB_SUBSYSTEM_ID 0x42 +#define PCI_CB_LEGACY_MODE_BASE 0x44 /* 16-bit PC Card legacy mode base address (ExCa) */ +/* 0x48-0x7f reserved */ + +/* Capability lists */ + +#define PCI_CAP_LIST_ID 0 /* Capability ID */ +#define PCI_CAP_ID_PM 0x01 /* Power Management */ +#define PCI_CAP_ID_AGP 0x02 /* Accelerated Graphics Port */ +#define PCI_CAP_ID_VPD 0x03 /* Vital Product Data */ +#define PCI_CAP_ID_SLOTID 0x04 /* Slot Identification */ +#define PCI_CAP_ID_MSI 0x05 /* Message Signalled Interrupts */ +#define PCI_CAP_ID_CHSWP 0x06 /* CompactPCI HotSwap */ +#define PCI_CAP_ID_PCIX 0x07 /* PCI-X */ +#define PCI_CAP_LIST_NEXT 1 /* Next capability in the list */ +#define PCI_CAP_FLAGS 2 /* Capability defined flags (16 bits) */ +#define PCI_CAP_SIZEOF 4 + +/* Power Management Registers */ + +#define PCI_PM_CAP_VER_MASK 0x0007 /* Version (2=PM1.1) */ +#define PCI_PM_CAP_PME_CLOCK 0x0008 /* Clock required for PME generation */ +#define PCI_PM_CAP_DSI 0x0020 /* Device specific initialization required */ +#define PCI_PM_CAP_AUX_C_MASK 0x01c0 /* Maximum aux current required in D3cold */ +#define PCI_PM_CAP_D1 0x0200 /* D1 power state support */ +#define PCI_PM_CAP_D2 0x0400 /* D2 power state support */ +#define PCI_PM_CAP_PME_D0 0x0800 /* PME can be asserted from D0 */ +#define PCI_PM_CAP_PME_D1 0x1000 /* PME can be asserted from D1 */ +#define PCI_PM_CAP_PME_D2 0x2000 /* PME can be asserted from D2 */ +#define PCI_PM_CAP_PME_D3_HOT 0x4000 /* PME can be asserted from D3hot */ +#define PCI_PM_CAP_PME_D3_COLD 0x8000 /* PME can be asserted from D3cold */ +#define PCI_PM_CTRL 4 /* PM control and status register */ +#define PCI_PM_CTRL_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ +#define PCI_PM_CTRL_PME_ENABLE 0x0100 /* PME pin enable */ +#define PCI_PM_CTRL_DATA_SEL_MASK 0x1e00 /* PM table data index */ +#define PCI_PM_CTRL_DATA_SCALE_MASK 0x6000 /* PM table data scaling factor */ +#define PCI_PM_CTRL_PME_STATUS 0x8000 /* PME pin status */ +#define PCI_PM_PPB_EXTENSIONS 6 /* PPB support extensions */ +#define PCI_PM_PPB_B2_B3 0x40 /* If bridge enters D3hot, bus enters: 0=B3, 1=B2 */ +#define PCI_PM_BPCC_ENABLE 0x80 /* Secondary bus is power managed */ +#define PCI_PM_DATA_REGISTER 7 /* PM table contents read here */ +#define PCI_PM_SIZEOF 8 + +/* AGP registers */ + +#define PCI_AGP_VERSION 2 /* BCD version number */ +#define PCI_AGP_RFU 3 /* Rest of capability flags */ +#define PCI_AGP_STATUS 4 /* Status register */ +#define PCI_AGP_STATUS_RQ_MASK 0xff000000 /* Maximum number of requests - 1 */ +#define PCI_AGP_STATUS_ISOCH 0x10000 /* Isochronous transactions supported */ +#define PCI_AGP_STATUS_ARQSZ_MASK 0xe000 /* log2(optimum async req size in bytes) - 4 */ +#define PCI_AGP_STATUS_CAL_MASK 0x1c00 /* Calibration cycle timing */ +#define PCI_AGP_STATUS_SBA 0x0200 /* Sideband addressing supported */ +#define PCI_AGP_STATUS_ITA_COH 0x0100 /* In-aperture accesses always coherent */ +#define PCI_AGP_STATUS_GART64 0x0080 /* 64-bit GART entries supported */ +#define PCI_AGP_STATUS_HTRANS 0x0040 /* If 0, core logic can xlate host CPU accesses thru aperture */ +#define PCI_AGP_STATUS_64BIT 0x0020 /* 64-bit addressing cycles supported */ +#define PCI_AGP_STATUS_FW 0x0010 /* Fast write transfers supported */ +#define PCI_AGP_STATUS_AGP3 0x0008 /* AGP3 mode supported */ +#define PCI_AGP_STATUS_RATE4 0x0004 /* 4x transfer rate supported (RFU in AGP3 mode) */ +#define PCI_AGP_STATUS_RATE2 0x0002 /* 2x transfer rate supported (8x in AGP3 mode) */ +#define PCI_AGP_STATUS_RATE1 0x0001 /* 1x transfer rate supported (4x in AGP3 mode) */ +#define PCI_AGP_COMMAND 8 /* Control register */ +#define PCI_AGP_COMMAND_RQ_MASK 0xff000000 /* Master: Maximum number of requests */ +#define PCI_AGP_COMMAND_ARQSZ_MASK 0xe000 /* log2(optimum async req size in bytes) - 4 */ +#define PCI_AGP_COMMAND_CAL_MASK 0x1c00 /* Calibration cycle timing */ +#define PCI_AGP_COMMAND_SBA 0x0200 /* Sideband addressing enabled */ +#define PCI_AGP_COMMAND_AGP 0x0100 /* Allow processing of AGP transactions */ +#define PCI_AGP_COMMAND_GART64 0x0080 /* 64-bit GART entries enabled */ +#define PCI_AGP_COMMAND_64BIT 0x0020 /* Allow generation of 64-bit addr cycles */ +#define PCI_AGP_COMMAND_FW 0x0010 /* Enable FW transfers */ +#define PCI_AGP_COMMAND_RATE4 0x0004 /* Use 4x rate (RFU in AGP3 mode) */ +#define PCI_AGP_COMMAND_RATE2 0x0002 /* Use 2x rate (8x in AGP3 mode) */ +#define PCI_AGP_COMMAND_RATE1 0x0001 /* Use 1x rate (4x in AGP3 mode) */ +#define PCI_AGP_SIZEOF 12 + +/* Slot Identification */ + +#define PCI_SID_ESR 2 /* Expansion Slot Register */ +#define PCI_SID_ESR_NSLOTS 0x1f /* Number of expansion slots available */ +#define PCI_SID_ESR_FIC 0x20 /* First In Chassis Flag */ +#define PCI_SID_CHASSIS_NR 3 /* Chassis Number */ + +/* Message Signalled Interrupts registers */ + +#define PCI_MSI_FLAGS 2 /* Various flags */ +#define PCI_MSI_FLAGS_64BIT 0x80 /* 64-bit addresses allowed */ +#define PCI_MSI_FLAGS_QSIZE 0x70 /* Message queue size configured */ +#define PCI_MSI_FLAGS_QMASK 0x0e /* Maximum queue size available */ +#define PCI_MSI_FLAGS_ENABLE 0x01 /* MSI feature enabled */ +#define PCI_MSI_RFU 3 /* Rest of capability flags */ +#define PCI_MSI_ADDRESS_LO 4 /* Lower 32 bits */ +#define PCI_MSI_ADDRESS_HI 8 /* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */ +#define PCI_MSI_DATA_32 8 /* 16 bits of data for 32-bit devices */ +#define PCI_MSI_DATA_64 12 /* 16 bits of data for 64-bit devices */ + +/* PCI-X */ +#define PCI_PCIX_COMMAND 2 /* Command register offset */ +#define PCI_PCIX_COMMAND_DPERE 0x0001 /* Data Parity Error Recover Enable */ +#define PCI_PCIX_COMMAND_ERO 0x0002 /* Enable Relaxed Ordering */ +#define PCI_PCIX_COMMAND_MAX_MEM_READ_BYTE_COUNT 0x000c /* Maximum Memory Read Byte Count */ +#define PCI_PCIX_COMMAND_MAX_OUTSTANDING_SPLIT_TRANS 0x0070 +#define PCI_PCIX_COMMAND_RESERVED 0xf80 +#define PCI_PCIX_STATUS 4 /* Status register offset */ +#define PCI_PCIX_STATUS_FUNCTION 0x00000007 +#define PCI_PCIX_STATUS_DEVICE 0x000000f8 +#define PCI_PCIX_STATUS_BUS 0x0000ff00 +#define PCI_PCIX_STATUS_64BIT 0x00010000 +#define PCI_PCIX_STATUS_133MHZ 0x00020000 +#define PCI_PCIX_STATUS_SC_DISCARDED 0x00040000 /* Split Completion Discarded */ +#define PCI_PCIX_STATUS_UNEXPECTED_SC 0x00080000 /* Unexpected Split Completion */ +#define PCI_PCIX_STATUS_DEVICE_COMPLEXITY 0x00100000 /* 0 = simple device, 1 = bridge device */ +#define PCI_PCIX_STATUS_DESIGNED_MAX_MEM_READ_BYTE_COUNT 0x00600000 /* 0 = 512 bytes, 1 = 1024, 2 = 2048, 3 = 4096 */ +#define PCI_PCIX_STATUS_DESIGNED_MAX_OUTSTANDING_SPLIT_TRANS 0x03800000 +#define PCI_PCIX_STATUS_DESIGNED_MAX_CUMULATIVE_READ_SIZE 0x1c000000 +#define PCI_PCIX_STATUS_RCVD_SC_ERR_MESS 0x20000000 /* Received Split Completion Error Message */ +#define PCI_PCIX_STATUS_RESERVED 0xc0000000 +#define PCI_PCIX_SIZEOF 4 + +/* PCI-X Bridges */ +#define PCI_PCIX_BRIDGE_SEC_STATUS 2 /* Secondary bus status register offset */ +#define PCI_PCIX_BRIDGE_SEC_STATUS_64BIT 0x0001 +#define PCI_PCIX_BRIDGE_SEC_STATUS_133MHZ 0x0002 +#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_DISCARDED 0x0004 /* Split Completion Discarded on secondary bus */ +#define PCI_PCIX_BRIDGE_SEC_STATUS_UNEXPECTED_SC 0x0008 /* Unexpected Split Completion on secondary bus */ +#define PCI_PCIX_BRIDGE_SEC_STATUS_SC_OVERRUN 0x0010 /* Split Completion Overrun on secondary bus */ +#define PCI_PCIX_BRIDGE_SEC_STATUS_SPLIT_REQUEST_DELAYED 0x0020 +#define PCI_PCIX_BRIDGE_SEC_STATUS_CLOCK_FREQ 0x01c0 +#define PCI_PCIX_BRIDGE_SEC_STATUS_RESERVED 0xfe00 +#define PCI_PCIX_BRIDGE_STATUS 4 /* Primary bus status register offset */ +#define PCI_PCIX_BRIDGE_STATUS_FUNCTION 0x00000007 +#define PCI_PCIX_BRIDGE_STATUS_DEVICE 0x000000f8 +#define PCI_PCIX_BRIDGE_STATUS_BUS 0x0000ff00 +#define PCI_PCIX_BRIDGE_STATUS_64BIT 0x00010000 +#define PCI_PCIX_BRIDGE_STATUS_133MHZ 0x00020000 +#define PCI_PCIX_BRIDGE_STATUS_SC_DISCARDED 0x00040000 /* Split Completion Discarded */ +#define PCI_PCIX_BRIDGE_STATUS_UNEXPECTED_SC 0x00080000 /* Unexpected Split Completion */ +#define PCI_PCIX_BRIDGE_STATUS_SC_OVERRUN 0x00100000 /* Split Completion Overrun */ +#define PCI_PCIX_BRIDGE_STATUS_SPLIT_REQUEST_DELAYED 0x00200000 +#define PCI_PCIX_BRIDGE_STATUS_RESERVED 0xffc00000 +#define PCI_PCIX_BRIDGE_UPSTREAM_SPLIT_TRANS_CTRL 8 /* Upstream Split Transaction Register offset */ +#define PCI_PCIX_BRIDGE_DOWNSTREAM_SPLIT_TRANS_CTRL 12 /* Downstream Split Transaction Register offset */ +#define PCI_PCIX_BRIDGE_STR_CAPACITY 0x0000ffff +#define PCI_PCIX_BRIDGE_STR_COMMITMENT_LIMIT 0xffff0000 +#define PCI_PCIX_BRIDGE_SIZEOF 12 + +/* + * The PCI interface treats multi-function devices as independent + * devices. The slot/function address of each device is encoded + * in a single byte as follows: + * + * 7:3 = slot + * 2:0 = function + */ +#define PCI_DEVFN(slot,func) ((((slot) & 0x1f) << 3) | ((func) & 0x07)) +#define PCI_SLOT(devfn) (((devfn) >> 3) & 0x1f) +#define PCI_FUNC(devfn) ((devfn) & 0x07) + +/* Device classes and subclasses */ + +#define PCI_CLASS_NOT_DEFINED 0x0000 +#define PCI_CLASS_NOT_DEFINED_VGA 0x0001 + +#define PCI_BASE_CLASS_STORAGE 0x01 +#define PCI_CLASS_STORAGE_SCSI 0x0100 +#define PCI_CLASS_STORAGE_IDE 0x0101 +#define PCI_CLASS_STORAGE_FLOPPY 0x0102 +#define PCI_CLASS_STORAGE_IPI 0x0103 +#define PCI_CLASS_STORAGE_RAID 0x0104 +#define PCI_CLASS_STORAGE_OTHER 0x0180 + +#define PCI_BASE_CLASS_NETWORK 0x02 +#define PCI_CLASS_NETWORK_ETHERNET 0x0200 +#define PCI_CLASS_NETWORK_TOKEN_RING 0x0201 +#define PCI_CLASS_NETWORK_FDDI 0x0202 +#define PCI_CLASS_NETWORK_ATM 0x0203 +#define PCI_CLASS_NETWORK_OTHER 0x0280 + +#define PCI_BASE_CLASS_DISPLAY 0x03 +#define PCI_CLASS_DISPLAY_VGA 0x0300 +#define PCI_CLASS_DISPLAY_XGA 0x0301 +#define PCI_CLASS_DISPLAY_OTHER 0x0380 + +#define PCI_BASE_CLASS_MULTIMEDIA 0x04 +#define PCI_CLASS_MULTIMEDIA_VIDEO 0x0400 +#define PCI_CLASS_MULTIMEDIA_AUDIO 0x0401 +#define PCI_CLASS_MULTIMEDIA_OTHER 0x0480 + +#define PCI_BASE_CLASS_MEMORY 0x05 +#define PCI_CLASS_MEMORY_RAM 0x0500 +#define PCI_CLASS_MEMORY_FLASH 0x0501 +#define PCI_CLASS_MEMORY_OTHER 0x0580 + +#define PCI_BASE_CLASS_BRIDGE 0x06 +#define PCI_CLASS_BRIDGE_HOST 0x0600 +#define PCI_CLASS_BRIDGE_ISA 0x0601 +#define PCI_CLASS_BRIDGE_EISA 0x0602 +#define PCI_CLASS_BRIDGE_MC 0x0603 +#define PCI_CLASS_BRIDGE_PCI 0x0604 +#define PCI_CLASS_BRIDGE_PCMCIA 0x0605 +#define PCI_CLASS_BRIDGE_NUBUS 0x0606 +#define PCI_CLASS_BRIDGE_CARDBUS 0x0607 +#define PCI_CLASS_BRIDGE_OTHER 0x0680 + +#define PCI_BASE_CLASS_COMMUNICATION 0x07 +#define PCI_CLASS_COMMUNICATION_SERIAL 0x0700 +#define PCI_CLASS_COMMUNICATION_PARALLEL 0x0701 +#define PCI_CLASS_COMMUNICATION_OTHER 0x0780 + +#define PCI_BASE_CLASS_SYSTEM 0x08 +#define PCI_CLASS_SYSTEM_PIC 0x0800 +#define PCI_CLASS_SYSTEM_DMA 0x0801 +#define PCI_CLASS_SYSTEM_TIMER 0x0802 +#define PCI_CLASS_SYSTEM_RTC 0x0803 +#define PCI_CLASS_SYSTEM_OTHER 0x0880 + +#define PCI_BASE_CLASS_INPUT 0x09 +#define PCI_CLASS_INPUT_KEYBOARD 0x0900 +#define PCI_CLASS_INPUT_PEN 0x0901 +#define PCI_CLASS_INPUT_MOUSE 0x0902 +#define PCI_CLASS_INPUT_OTHER 0x0980 + +#define PCI_BASE_CLASS_DOCKING 0x0a +#define PCI_CLASS_DOCKING_GENERIC 0x0a00 +#define PCI_CLASS_DOCKING_OTHER 0x0a01 + +#define PCI_BASE_CLASS_PROCESSOR 0x0b +#define PCI_CLASS_PROCESSOR_386 0x0b00 +#define PCI_CLASS_PROCESSOR_486 0x0b01 +#define PCI_CLASS_PROCESSOR_PENTIUM 0x0b02 +#define PCI_CLASS_PROCESSOR_ALPHA 0x0b10 +#define PCI_CLASS_PROCESSOR_POWERPC 0x0b20 +#define PCI_CLASS_PROCESSOR_CO 0x0b40 + +#define PCI_BASE_CLASS_SERIAL 0x0c +#define PCI_CLASS_SERIAL_FIREWIRE 0x0c00 +#define PCI_CLASS_SERIAL_ACCESS 0x0c01 +#define PCI_CLASS_SERIAL_SSA 0x0c02 +#define PCI_CLASS_SERIAL_USB 0x0c03 +#define PCI_CLASS_SERIAL_FIBER 0x0c04 + +#define PCI_CLASS_OTHERS 0xff + +/* Several ID's we need in the library */ + +#define PCI_VENDOR_ID_INTEL 0x8086 +#define PCI_VENDOR_ID_COMPAQ 0x0e11 +/* + * Types + */ + +typedef unsigned char byte; +typedef unsigned char u8; +typedef unsigned short word; +typedef unsigned short u16; +typedef unsigned long u32; + +typedef unsigned long pciaddr_t; + +/* + * PCI Access Structure + */ + +struct pci_methods; + +enum pci_access_type { + /* Known access methods, remember to update access.c as well */ + PCI_ACCESS_WINDOWS_HAL, /* Windows Hardware Abstraction Layer */ + PCI_ACCESS_I386_TYPE1, /* i386 ports, type 1 (params: none) */ + PCI_ACCESS_I386_TYPE2, /* i386 ports, type 2 (params: none) */ + PCI_ACCESS_MAX +}; + +struct pci_access { + /* Options you can change: */ + unsigned int method; /* Access method */ + char *method_params[PCI_ACCESS_MAX]; /* Parameters for the methods */ + int buscentric; /* Bus-centric view of the world */ + + /* Functions you can override: */ + void (*error)(char *msg, ...); /* Write error message and quit */ + void (*warning)(char *msg, ...); /* Write a warning message */ + void (*debug)(char *msg, ...); /* Write a debugging message */ + + struct pci_dev *devices; /* Devices found on this bus */ + + /* Fields used internally: */ + struct pci_methods *methods; +}; + +/* Initialize PCI access */ +struct pci_access *pci_alloc(void); +void pci_init(struct pci_access *); +void pci_cleanup(struct pci_access *); + +/* Scanning of devices */ +void pci_scan_bus(struct pci_access *acc); +struct pci_dev *pci_get_dev(struct pci_access *acc, word bus, byte dev, byte func); /* Raw access to specified device */ +void pci_free_dev(struct pci_dev *); + +/* + * Devices + */ + +struct pci_dev { + struct pci_dev *next; /* Next device in the chain */ + word bus; /* Higher byte can select host bridges */ + byte dev, func; /* Device and function */ + + /* These fields are set by pci_fill_info() */ + int known_fields; /* Set of info fields already known */ + word vendor_id, device_id; /* Identity of the device */ + int irq; /* IRQ number */ + pciaddr_t base_addr[6]; /* Base addresses */ + pciaddr_t size[6]; /* Region sizes */ + pciaddr_t rom_base_addr; /* Expansion ROM base address */ + pciaddr_t rom_size; /* Expansion ROM size */ + + /* Fields used internally: */ + struct pci_access *access; + struct pci_methods *methods; + int hdrtype; /* Direct methods: header type */ + void *aux; /* Auxillary data */ +}; + +#define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3) +#define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf) + +byte pci_read_byte(struct pci_dev *, int pos); /* Access to configuration space */ +word pci_read_word(struct pci_dev *, int pos); +u32 pci_read_long(struct pci_dev *, int pos); +int pci_read_block(struct pci_dev *, int pos, byte *buf, int len); +int pci_write_byte(struct pci_dev *, int pos, byte data); +int pci_write_word(struct pci_dev *, int pos, word data); +int pci_write_long(struct pci_dev *, int pos, u32 data); +int pci_write_block(struct pci_dev *, int pos, byte *buf, int len); + +int pci_fill_info(struct pci_dev *, int flags); /* Fill in device information */ + +#define PCI_FILL_IDENT 1 +#define PCI_FILL_IRQ 2 +#define PCI_FILL_BASES 4 +#define PCI_FILL_ROM_BASE 8 +#define PCI_FILL_SIZES 16 +#define PCI_FILL_RESCAN 0x10000 + + +/* + * Filters + */ + +struct pci_filter { + int bus, slot, func; /* -1 = ANY */ + int vendor, device; +}; + +void pci_filter_init(struct pci_access *, struct pci_filter *); +char *pci_filter_parse_slot(struct pci_filter *, char *); +int pci_filter_match(struct pci_filter *, struct pci_dev *); + +#define PCI_LOOKUP_VENDOR 1 +#define PCI_LOOKUP_DEVICE 2 +#define PCI_LOOKUP_CLASS 4 +#define PCI_LOOKUP_SUBSYSTEM 8 +#define PCI_LOOKUP_PROGIF 16 +#define PCI_LOOKUP_NUMERIC 0x10000 + +#endif