xref: /freebsd/sys/dev/e1000/e1000_osdep.h (revision ab2e3f79587150a6a1499417875b4aed7915fead)
18cfa0ad2SJack F Vogel /******************************************************************************
28cfa0ad2SJack F Vogel 
37c669ab6SSean Bruno   Copyright (c) 2001-2015, Intel Corporation
48cfa0ad2SJack F Vogel   All rights reserved.
58cfa0ad2SJack F Vogel 
68cfa0ad2SJack F Vogel   Redistribution and use in source and binary forms, with or without
78cfa0ad2SJack F Vogel   modification, are permitted provided that the following conditions are met:
88cfa0ad2SJack F Vogel 
98cfa0ad2SJack F Vogel    1. Redistributions of source code must retain the above copyright notice,
108cfa0ad2SJack F Vogel       this list of conditions and the following disclaimer.
118cfa0ad2SJack F Vogel 
128cfa0ad2SJack F Vogel    2. Redistributions in binary form must reproduce the above copyright
138cfa0ad2SJack F Vogel       notice, this list of conditions and the following disclaimer in the
148cfa0ad2SJack F Vogel       documentation and/or other materials provided with the distribution.
158cfa0ad2SJack F Vogel 
168cfa0ad2SJack F Vogel    3. Neither the name of the Intel Corporation nor the names of its
178cfa0ad2SJack F Vogel       contributors may be used to endorse or promote products derived from
188cfa0ad2SJack F Vogel       this software without specific prior written permission.
198cfa0ad2SJack F Vogel 
208cfa0ad2SJack F Vogel   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
218cfa0ad2SJack F Vogel   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
228cfa0ad2SJack F Vogel   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
238cfa0ad2SJack F Vogel   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
248cfa0ad2SJack F Vogel   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
258cfa0ad2SJack F Vogel   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
268cfa0ad2SJack F Vogel   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
278cfa0ad2SJack F Vogel   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
288cfa0ad2SJack F Vogel   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
298cfa0ad2SJack F Vogel   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
308cfa0ad2SJack F Vogel   POSSIBILITY OF SUCH DAMAGE.
318cfa0ad2SJack F Vogel 
328cfa0ad2SJack F Vogel ******************************************************************************/
338cfa0ad2SJack F Vogel /*$FreeBSD$*/
348cfa0ad2SJack F Vogel 
358cfa0ad2SJack F Vogel 
368cfa0ad2SJack F Vogel #ifndef _FREEBSD_OS_H_
378cfa0ad2SJack F Vogel #define _FREEBSD_OS_H_
388cfa0ad2SJack F Vogel 
398cfa0ad2SJack F Vogel #include <sys/types.h>
408cfa0ad2SJack F Vogel #include <sys/param.h>
418cfa0ad2SJack F Vogel #include <sys/systm.h>
42afb98829SJack F Vogel #include <sys/lock.h>
43afb98829SJack F Vogel #include <sys/mutex.h>
448cfa0ad2SJack F Vogel #include <sys/mbuf.h>
458cfa0ad2SJack F Vogel #include <sys/protosw.h>
468cfa0ad2SJack F Vogel #include <sys/socket.h>
478cfa0ad2SJack F Vogel #include <sys/malloc.h>
488cfa0ad2SJack F Vogel #include <sys/kernel.h>
498cfa0ad2SJack F Vogel #include <sys/bus.h>
508cfa0ad2SJack F Vogel #include <machine/bus.h>
518cfa0ad2SJack F Vogel #include <sys/rman.h>
528cfa0ad2SJack F Vogel #include <machine/resource.h>
538cfa0ad2SJack F Vogel #include <vm/vm.h>
548cfa0ad2SJack F Vogel #include <vm/pmap.h>
558cfa0ad2SJack F Vogel #include <machine/clock.h>
568cfa0ad2SJack F Vogel #include <dev/pci/pcivar.h>
578cfa0ad2SJack F Vogel #include <dev/pci/pcireg.h>
588cfa0ad2SJack F Vogel 
598cfa0ad2SJack F Vogel 
608cfa0ad2SJack F Vogel #define ASSERT(x) if(!(x)) panic("EM: x")
618cfa0ad2SJack F Vogel 
62*ab2e3f79SStephen Hurd #define usec_delay(x) DELAY(x)
63c80429ceSEric Joyner #define usec_delay_irq(x) usec_delay(x)
64*ab2e3f79SStephen Hurd #define msec_delay(x) DELAY(1000*(x))
65*ab2e3f79SStephen Hurd #define msec_delay_irq(x) DELAY(1000*(x))
668cfa0ad2SJack F Vogel 
67c80429ceSEric Joyner /* Enable/disable debugging statements in shared code */
68c80429ceSEric Joyner #define DBG		0
69c80429ceSEric Joyner 
70c80429ceSEric Joyner #define DEBUGOUT(...) \
71c80429ceSEric Joyner     do { if (DBG) printf(__VA_ARGS__); } while (0)
72c80429ceSEric Joyner #define DEBUGOUT1(...)			DEBUGOUT(__VA_ARGS__)
73c80429ceSEric Joyner #define DEBUGOUT2(...)			DEBUGOUT(__VA_ARGS__)
74c80429ceSEric Joyner #define DEBUGOUT3(...)			DEBUGOUT(__VA_ARGS__)
75c80429ceSEric Joyner #define DEBUGOUT7(...)			DEBUGOUT(__VA_ARGS__)
76c80429ceSEric Joyner #define DEBUGFUNC(F)			DEBUGOUT(F "\n")
778cfa0ad2SJack F Vogel 
788cfa0ad2SJack F Vogel #define STATIC			static
798cfa0ad2SJack F Vogel #define FALSE			0
808cfa0ad2SJack F Vogel #define TRUE			1
818cfa0ad2SJack F Vogel #define CMD_MEM_WRT_INVALIDATE	0x0010  /* BIT_4 */
828cfa0ad2SJack F Vogel #define PCI_COMMAND_REGISTER	PCIR_COMMAND
838cfa0ad2SJack F Vogel 
84*ab2e3f79SStephen Hurd /* Mutex used in the shared code */
85*ab2e3f79SStephen Hurd #define E1000_MUTEX                     struct mtx
86*ab2e3f79SStephen Hurd #define E1000_MUTEX_INIT(mutex)         mtx_init((mutex), #mutex, \
87*ab2e3f79SStephen Hurd                                             MTX_NETWORK_LOCK, \
88*ab2e3f79SStephen Hurd 					    MTX_DEF | MTX_DUPOK)
89*ab2e3f79SStephen Hurd #define E1000_MUTEX_DESTROY(mutex)      mtx_destroy(mutex)
90*ab2e3f79SStephen Hurd #define E1000_MUTEX_LOCK(mutex)         mtx_lock(mutex)
91*ab2e3f79SStephen Hurd #define E1000_MUTEX_TRYLOCK(mutex)      mtx_trylock(mutex)
92*ab2e3f79SStephen Hurd #define E1000_MUTEX_UNLOCK(mutex)       mtx_unlock(mutex)
93*ab2e3f79SStephen Hurd 
948cfa0ad2SJack F Vogel typedef uint64_t	u64;
958cfa0ad2SJack F Vogel typedef uint32_t	u32;
968cfa0ad2SJack F Vogel typedef uint16_t	u16;
978cfa0ad2SJack F Vogel typedef uint8_t		u8;
988cfa0ad2SJack F Vogel typedef int64_t		s64;
998cfa0ad2SJack F Vogel typedef int32_t		s32;
1008cfa0ad2SJack F Vogel typedef int16_t		s16;
1018cfa0ad2SJack F Vogel typedef int8_t		s8;
1028cfa0ad2SJack F Vogel 
103daf9197cSJack F Vogel #define __le16		u16
104daf9197cSJack F Vogel #define __le32		u32
105daf9197cSJack F Vogel #define __le64		u64
106daf9197cSJack F Vogel 
1078cc64f1eSJack F Vogel #if __FreeBSD_version < 800000
1084edd8523SJack F Vogel #if defined(__i386__) || defined(__amd64__)
1094edd8523SJack F Vogel #define mb()	__asm volatile("mfence" ::: "memory")
1104edd8523SJack F Vogel #define wmb()	__asm volatile("sfence" ::: "memory")
1114edd8523SJack F Vogel #define rmb()	__asm volatile("lfence" ::: "memory")
1124edd8523SJack F Vogel #else
1134edd8523SJack F Vogel #define mb()
1144edd8523SJack F Vogel #define rmb()
1154edd8523SJack F Vogel #define wmb()
1164edd8523SJack F Vogel #endif
1174edd8523SJack F Vogel #endif /*__FreeBSD_version < 800000 */
1184edd8523SJack F Vogel 
1194edd8523SJack F Vogel #if defined(__i386__) || defined(__amd64__)
1204edd8523SJack F Vogel static __inline
1214edd8523SJack F Vogel void prefetch(void *x)
1224edd8523SJack F Vogel {
1234edd8523SJack F Vogel 	__asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
1244edd8523SJack F Vogel }
1254edd8523SJack F Vogel #else
1264edd8523SJack F Vogel #define prefetch(x)
1274edd8523SJack F Vogel #endif
1284edd8523SJack F Vogel 
1298cfa0ad2SJack F Vogel struct e1000_osdep
1308cfa0ad2SJack F Vogel {
1318cfa0ad2SJack F Vogel 	bus_space_tag_t    mem_bus_space_tag;
1328cfa0ad2SJack F Vogel 	bus_space_handle_t mem_bus_space_handle;
1338cfa0ad2SJack F Vogel 	bus_space_tag_t    io_bus_space_tag;
1348cfa0ad2SJack F Vogel 	bus_space_handle_t io_bus_space_handle;
1358cfa0ad2SJack F Vogel 	bus_space_tag_t    flash_bus_space_tag;
1368cfa0ad2SJack F Vogel 	bus_space_handle_t flash_bus_space_handle;
137bd937497SJean-Sébastien Pédron 	device_t	   dev;
1388cfa0ad2SJack F Vogel };
1398cfa0ad2SJack F Vogel 
1408cfa0ad2SJack F Vogel #define E1000_REGISTER(hw, reg) (((hw)->mac.type >= e1000_82543) \
1418cfa0ad2SJack F Vogel     ? reg : e1000_translate_register_82542(reg))
1428cfa0ad2SJack F Vogel 
1438cfa0ad2SJack F Vogel #define E1000_WRITE_FLUSH(a) E1000_READ_REG(a, E1000_STATUS)
1448cfa0ad2SJack F Vogel 
1458cfa0ad2SJack F Vogel /* Read from an absolute offset in the adapter's memory space */
1468cfa0ad2SJack F Vogel #define E1000_READ_OFFSET(hw, offset) \
1478cfa0ad2SJack F Vogel     bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1488cfa0ad2SJack F Vogel     ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, offset)
1498cfa0ad2SJack F Vogel 
1508cfa0ad2SJack F Vogel /* Write to an absolute offset in the adapter's memory space */
1518cfa0ad2SJack F Vogel #define E1000_WRITE_OFFSET(hw, offset, value) \
1528cfa0ad2SJack F Vogel     bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1538cfa0ad2SJack F Vogel     ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, offset, value)
1548cfa0ad2SJack F Vogel 
1558cfa0ad2SJack F Vogel /* Register READ/WRITE macros */
1568cfa0ad2SJack F Vogel 
1578cfa0ad2SJack F Vogel #define E1000_READ_REG(hw, reg) \
1588cfa0ad2SJack F Vogel     bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1598cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1608cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg))
1618cfa0ad2SJack F Vogel 
1628cfa0ad2SJack F Vogel #define E1000_WRITE_REG(hw, reg, value) \
1638cfa0ad2SJack F Vogel     bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1648cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1658cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg), value)
1668cfa0ad2SJack F Vogel 
1678cfa0ad2SJack F Vogel #define E1000_READ_REG_ARRAY(hw, reg, index) \
1688cfa0ad2SJack F Vogel     bus_space_read_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1698cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1708cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg) + ((index)<< 2))
1718cfa0ad2SJack F Vogel 
1728cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY(hw, reg, index, value) \
1738cfa0ad2SJack F Vogel     bus_space_write_4(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1748cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1758cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg) + ((index)<< 2), value)
1768cfa0ad2SJack F Vogel 
1778cfa0ad2SJack F Vogel #define E1000_READ_REG_ARRAY_DWORD E1000_READ_REG_ARRAY
1788cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY_DWORD E1000_WRITE_REG_ARRAY
1798cfa0ad2SJack F Vogel 
1808cfa0ad2SJack F Vogel #define E1000_READ_REG_ARRAY_BYTE(hw, reg, index) \
1818cfa0ad2SJack F Vogel     bus_space_read_1(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1828cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1838cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg) + index)
1848cfa0ad2SJack F Vogel 
1858cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY_BYTE(hw, reg, index, value) \
1868cfa0ad2SJack F Vogel     bus_space_write_1(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1878cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1888cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg) + index, value)
1898cfa0ad2SJack F Vogel 
1908cfa0ad2SJack F Vogel #define E1000_WRITE_REG_ARRAY_WORD(hw, reg, index, value) \
1918cfa0ad2SJack F Vogel     bus_space_write_2(((struct e1000_osdep *)(hw)->back)->mem_bus_space_tag, \
1928cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->mem_bus_space_handle, \
1938cfa0ad2SJack F Vogel         E1000_REGISTER(hw, reg) + (index << 1), value)
1948cfa0ad2SJack F Vogel 
1958cfa0ad2SJack F Vogel #define E1000_WRITE_REG_IO(hw, reg, value) do {\
1968cfa0ad2SJack F Vogel     bus_space_write_4(((struct e1000_osdep *)(hw)->back)->io_bus_space_tag, \
1978cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->io_bus_space_handle, \
1988cfa0ad2SJack F Vogel         (hw)->io_base, reg); \
1998cfa0ad2SJack F Vogel     bus_space_write_4(((struct e1000_osdep *)(hw)->back)->io_bus_space_tag, \
2008cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->io_bus_space_handle, \
2018cfa0ad2SJack F Vogel         (hw)->io_base + 4, value); } while (0)
2028cfa0ad2SJack F Vogel 
2038cfa0ad2SJack F Vogel #define E1000_READ_FLASH_REG(hw, reg) \
2048cfa0ad2SJack F Vogel     bus_space_read_4(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \
2058cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg)
2068cfa0ad2SJack F Vogel 
2078cfa0ad2SJack F Vogel #define E1000_READ_FLASH_REG16(hw, reg) \
2088cfa0ad2SJack F Vogel     bus_space_read_2(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \
2098cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg)
2108cfa0ad2SJack F Vogel 
2118cfa0ad2SJack F Vogel #define E1000_WRITE_FLASH_REG(hw, reg, value) \
2128cfa0ad2SJack F Vogel     bus_space_write_4(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \
2138cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg, value)
2148cfa0ad2SJack F Vogel 
2158cfa0ad2SJack F Vogel #define E1000_WRITE_FLASH_REG16(hw, reg, value) \
2168cfa0ad2SJack F Vogel     bus_space_write_2(((struct e1000_osdep *)(hw)->back)->flash_bus_space_tag, \
2178cfa0ad2SJack F Vogel         ((struct e1000_osdep *)(hw)->back)->flash_bus_space_handle, reg, value)
2188cfa0ad2SJack F Vogel 
2198cfa0ad2SJack F Vogel #endif  /* _FREEBSD_OS_H_ */
2208cfa0ad2SJack F Vogel 
221