[broadcom]: build broadcom kernel modules from gpl source codes

Signed-off-by: Guohan Lu <gulv@microsoft.com>
This commit is contained in:
Guohan Lu 2018-08-07 07:14:37 +00:00
parent 3021e4efd6
commit aa2e340f5a
77 changed files with 24428 additions and 5 deletions

View File

@ -1,4 +1,4 @@
include $(PLATFORM_PATH)/sdk.mk include $(PLATFORM_PATH)/sai-modules.mk
include $(PLATFORM_PATH)/sai.mk include $(PLATFORM_PATH)/sai.mk
include $(PLATFORM_PATH)/platform-modules-s6000.mk include $(PLATFORM_PATH)/platform-modules-s6000.mk
include $(PLATFORM_PATH)/platform-modules-dell.mk include $(PLATFORM_PATH)/platform-modules-dell.mk

View File

@ -0,0 +1,11 @@
# Broadcom SAI modules
KVERSION = 4.9.0-5-amd64
BRCM_OPENNSL_KERNEL_VERSION = 3.4.1.11-1
BRCM_OPENNSL_KERNEL = opennsl-modules-$(KVERSION)_$(BRCM_OPENNSL_KERNEL_VERSION)_amd64.deb
$(BRCM_OPENNSL_KERNEL)_SRC_PATH = $(PLATFORM_PATH)/saibcm-modules
$(BRCM_OPENNSL_KERNEL)_DEPENDS += $(LINUX_HEADERS) $(LINUX_HEADERS_COMMON)
SONIC_DPKG_DEBS += $(BRCM_OPENNSL_KERNEL)
SONIC_STRETCH_DEBS += $(BRCM_OPENNSL_KERNEL)

View File

@ -0,0 +1,4 @@
*.debhelper.log
*.debhelper
*.substvars
*.ko

View File

@ -0,0 +1,48 @@
opennsl (3.4.1.11-1) unstable; urgency=medium
* Port Broadcom SAI 3.4.1.11
* Cherry-pick change from master branch, 3.4.1.11-1
-- Ying Xie <yinxi@microsoft.com> Fri, 05 Jan 2018 23:21:47 +0000
opennsl (3.4.1.10-1) unstable; urgency=medium
* Upgrade to 3.4.1.10-1
-- Ying Xie <yinxi@microsoft.com> Tue, 19 Dec 2017 21:33:48 +0000
opennsl (3.4.1.9-1) unstable; urgency=medium
* Upgrade to 3.4.1.9-1
-- Ying Xie <yinxi@microsoft.com> Thu, 14 Dec 2017 22:04:11 +0000
opennsl (3.4.1.7-2) unstable; urgency=medium
* Add Arista 7260cx3 Rev2 hardware support
-- Ying Xie <yinxi@microsoft.com> Mon, 27 Nov 2017 18:13:50 +0000
opennsl (3.4.1.7-1) unstable; urgency=medium
* Importing opennsl 3.4.1.7
-- Ying Xie <yinxi@microsoft.com> Mon, 23 Oct 2017 23:47:25 +0000
opennsl (3.4.1.5-2) unstable; urgency=medium
* Importing TD2 changes from opennsl 3.2.2.2
-- Ying Xie <yinxi@microsoft.com> Tue, 26 Sep 2017 01:28:44 +0000
opennsl (3.4.1.5-1) unstable; urgency=medium
* Importing opennsl 3.4.1.5
-- Ying Xie <yinxi@microsoft.com> Wed, 20 Sep 2017 16:42:12 +0000
opennsl (3.4.1.3-1) unstable; urgency=low
* Initial release
-- Guohan Lu <gulv@microsoft.com> Fri, 17 Jul 2015 04:46:01 -0700

View File

@ -0,0 +1 @@
8

View File

@ -0,0 +1,14 @@
Source: opennsl
Section: main
Priority: extra
Maintainer: Guohan Lu <gulv@microsoft.com>
Build-Depends: debhelper (>= 8.0.0), bzip2
Standards-Version: 3.9.3
#Vcs-Git: git://git.debian.org/collab-maint/bcmsdk.git
#Vcs-Browser: http://git.debian.org/?p=collab-maint/bcmsdk.git;a=summary
Package: opennsl-modules-4.9.0-5-amd64
Architecture: amd64
Section: main
Depends: linux-image-4.9.0-5-amd64
Description: kernel modules for broadcom SAI

View File

@ -0,0 +1 @@
lib/modules/4.9.0-5-amd64/extra

View File

@ -0,0 +1,47 @@
#!/bin/bash
# This script load/unload opennsl kernel modules
### BEGIN INIT INFO
# Provides: load-opennsl-modules
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start: S
# Default-Stop: 0 6
# Short-Description: Load OpenNSL kernel modules
### END INIT INFO
case "$1" in
start)
echo -n "Load OpenNSL kernel modules... "
modprobe linux-kernel-bde dmasize=32M maxpayload=128
modprobe linux-user-bde
modprobe linux-bcm-knet use_rx_skb=1 rx_buffer_size=9238
echo "done."
;;
stop)
echo -n "Unload OpenNSL kernel modules... "
rmmod linux-bcm-knet
rmmod linux-user-bde
rmmod linux-kernel-bde
echo "done."
;;
force-reload|restart)
echo "Not supported"
;;
*)
echo "Usage: /etc/init.d/opennsl-modules-4.9.0-5-amd64.init {start|stop}"
exit 1
;;
esac
exit 0

View File

@ -0,0 +1,4 @@
systems/linux/user/x86-smp_generic_64-2_6/linux-bcm-knet.ko lib/modules/4.9.0-5-amd64/extra
systems/linux/user/x86-smp_generic_64-2_6/linux-kernel-bde.ko lib/modules/4.9.0-5-amd64/extra
systems/linux/user/x86-smp_generic_64-2_6/linux-user-bde.ko lib/modules/4.9.0-5-amd64/extra
systemd/opennsl-modules-4.9.0-5-amd64.service lib/systemd/system

View File

@ -0,0 +1,183 @@
#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
#
# This version is for a hypothetical package that can build a kernel modules
# architecture-dependant package via make-kpkg, as well as an
# architecture-independent module source package, and other packages
# either dep/indep for things like common files or userspace components
# needed for the kernel modules.
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# some default definitions, important!
#
# Name of the source package
psource:=opennsl-source
# The short upstream name, used for the module source directory
sname:=opennsl
### KERNEL SETUP
### Setup the stuff needed for making kernel module packages
### taken from /usr/share/kernel-package/sample.module.rules
# prefix of the target package name
PACKAGE=opennsl-modules
# modifieable for experiments or debugging m-a
MA_DIR ?= /usr/share/modass
# load generic variable handling
-include $(MA_DIR)/include/generic.make
# load default rules, including kdist, kdist_image, ...
-include $(MA_DIR)/include/common-rules.make
# module assistant calculates all needed things for us and sets
# following variables:
# KSRC (kernel source directory), KVERS (kernel version string), KDREV
# (revision of the Debian kernel-image package), CC (the correct
# compiler), VERSION (the final package version string), PKGNAME (full
# package name with KVERS included), DEB_DESTDIR (path to store DEBs)
# The kdist_config target is called by make-kpkg modules_config and
# by kdist* rules by dependency. It should configure the module so it is
# ready for compilation (mostly useful for calling configure).
# prep-deb-files from module-assistant creates the neccessary debian/ files
kdist_config: prep-deb-files
# the kdist_clean target is called by make-kpkg modules_clean and from
# kdist* rules. It is responsible for cleaning up any changes that have
# been made by the other kdist_commands (except for the .deb files created)
kdist_clean: clean
dh_testdir
dh_clean
SDK=$(realpath .) LINUX_UAPI_SPLIT=1 DEBIAN_LINUX_HEADER=1 KERNDIR=/usr/src/linux-headers-4.9.0-5-amd64 KERNEL_SRC=/usr/src/linux-headers-4.9.0-5-amd64 $(MAKE) -C systems/linux/user/x86-smp_generic_64-2_6 clean
# rm -f driver/*.o driver/*.ko
#
### end KERNEL SETUP
configure: configure-stamp
configure-stamp:
dh_testdir
# Add here commands to configure the package.
touch configure-stamp
build-arch: configure-stamp build-arch-stamp
build-arch-stamp:
dh_testdir
# Add here command to compile/build the package.
SDK=$(realpath .) LINUX_UAPI_SPLIT=1 DEBIAN_LINUX_HEADER=1 KERNDIR=/usr/src/linux-headers-4.9.0-5-amd64 KERNEL_SRC=/usr/src/linux-headers-4.9.0-5-amd64 $(MAKE) -C systems/linux/user/x86-smp_generic_64-2_6
touch $@
#k = $(shell echo $(KVERS) | grep -q ^2.6 && echo k)
build-indep: configure-stamp build-indep-stamp
build-indep-stamp:
dh_testdir
# Add here command to compile/build the arch indep package.
# It's ok not to do anything here, if you don't need to build
# anything for this package.
#docbook-to-man debian/opennsl.sgml > opennsl.1
touch $@
build: build-arch
clean:
dh_testdir
#dh_testroot
rm -f build-arch-stamp build-indep-stamp configure-stamp
# Add here commands to clean up after the build process.
SDK=$(realpath .) LINUX_UAPI_SPLIT=1 DEBIAN_LINUX_HEADER=1 KERNDIR=/usr/src/linux-headers-4.9.0-5-amd64 KERNEL_SRC=/usr/src/linux-headers-4.9.0-5-amd64 $(MAKE) -C systems/linux/user/x86-smp_generic_64-2_6 clean
dh_clean
install: DH_OPTIONS=
install: build
dh_testdir
dh_testroot
dh_prep
dh_installdirs
dh_install
# Build architecture-independent files here.
# Pass -i to all debhelper commands in this target to reduce clutter.
binary-indep: build install
dh_testdir -i
dh_testroot -i
dh_installchangelogs -i
dh_installdocs -i
dh_installexamples -i
# dh_install -i
# dh_installmenu -i
# dh_installdebconf -i
# dh_installlogrotate -i
# dh_installemacsen -i
# dh_installpam -i
# dh_installmime -i
# dh_installinit -i
# dh_installcron -i
# dh_installinfo -i
dh_installman -i
dh_link -i
dh_compress -i
dh_fixperms -i
dh_installdeb -i
# dh_perl -i
# dh_makeshlibs -i
dh_installdeb -i
dh_shlibdeps -i
dh_gencontrol -i
dh_md5sums -i
dh_builddeb -i
# Build architecture-dependent files here.
binary-arch: build install
dh_testdir -s
dh_testroot -s
# dh_installdebconf -s
dh_installdocs -s
dh_installexamples -s
dh_installmenu -s
# dh_installlogrotate -s
# dh_installemacsen -s
# dh_installpam -s
# dh_installmime -s
dh_installmodules -s
dh_systemd_enable -s
dh_installinit -s
dh_systemd_start -s
dh_installcron -s
# dh_installman -s
dh_installinfo -s
dh_installchangelogs -s
dh_strip -s
dh_link -s
dh_compress -s
dh_fixperms -s
dh_makeshlibs -s
dh_installdeb -s
# dh_perl -s
dh_shlibdeps -s
dh_gencontrol -s
dh_md5sums -s
dh_builddeb -s
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure binary-modules kdist kdist_configure kdist_image kdist_clean

View File

@ -0,0 +1,158 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: ibde.h,v 1.27 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef __IBDE_H__
#define __IBDE_H__
#include <sal/types.h>
/*
* Represents a collection of devices
*/
typedef struct ibde_dev_s {
uint16 device;
uint8 rev;
sal_vaddr_t base_address;
sal_vaddr_t base_address1;
sal_vaddr_t base_address2;
} ibde_dev_t;
typedef struct ibde_s {
const char *(*name)(void);
/* Returns the number of devices available */
/* Each device is is accessed through a handle */
/* Handles are assumed to index the array of devices */
/* Support SWITCH or ETHERNET or CPU devices */
int (*num_devices)(int type);
#define BDE_ALL_DEVICES 0
#define BDE_SWITCH_DEVICES 1
#define BDE_ETHER_DEVICES 2
#define BDE_CPU_DEVICES 3
const ibde_dev_t *(*get_dev)(int d);
/*
* Get types of underlaying devices.
* A combination of bus type and functional type is returned.
* In case of bus type, support PCI and SPI device types.
* In case of functional type, specify if underlaying device is
* a switching or ethernet device.
*/
uint32 (*get_dev_type)(int d);
#define BDE_PCI_DEV_TYPE SAL_PCI_DEV_TYPE /* PCI device */
#define BDE_SPI_DEV_TYPE SAL_SPI_DEV_TYPE /* SPI device */
#define BDE_EB_DEV_TYPE SAL_EB_DEV_TYPE /* EB device */
#define BDE_ICS_DEV_TYPE SAL_ICS_DEV_TYPE /* ICS device */
#define BDE_MII_DEV_TYPE SAL_MII_DEV_TYPE /* MII device */
#define BDE_I2C_DEV_TYPE SAL_I2C_DEV_TYPE /* I2C device */
#define BDE_AXI_DEV_TYPE SAL_AXI_DEV_TYPE /* AXI device */
#define BDE_EMMI_DEV_TYPE SAL_EMMI_DEV_TYPE /* EMMI device */
#define BDE_DEV_BUS_ALT SAL_DEV_BUS_ALT /* Alternate Access */
#define BDE_DEV_BUS_MSI SAL_DEV_BUS_MSI /* Message-signaled interrupts */
#define BDE_DEV_BUS_TYPE_MASK SAL_DEV_BUS_TYPE_MASK
#define BDE_SWITCH_DEV_TYPE SAL_SWITCH_DEV_TYPE /* Switch device */
#define BDE_ETHER_DEV_TYPE SAL_ETHER_DEV_TYPE /* Ethernet device */
#define BDE_CPU_DEV_TYPE SAL_CPU_DEV_TYPE /* CPU device */
#define BDE_BYTE_SWAP 0x01000000 /* SW byte swap */
#define BDE_NO_IPROC 0x02000000 /* Device uses two BARs, but is not iProc */
#define BDE_256K_REG_SPACE 0x20000000 /* Map 256K (v 64K) */
#define BDE_128K_REG_SPACE 0x40000000 /* Map 128K (v 64K) */
#define BDE_320K_REG_SPACE 0x80000000 /* Map 256K+64K */
/* Bus supports only 16bit reads */
#define BDE_DEV_BUS_RD_16BIT SAL_DEV_BUS_RD_16BIT
/* Bus supports only 16bit writes */
#define BDE_DEV_BUS_WR_16BIT SAL_DEV_BUS_WR_16BIT
/* Backward compatibility */
#define BDE_ET_DEV_TYPE BDE_MII_DEV_TYPE
#define BDE_DEV_MEM_MAPPED(_d) \
((_d) & (BDE_PCI_DEV_TYPE | BDE_ICS_DEV_TYPE | BDE_EB_DEV_TYPE |\
BDE_EMMI_DEV_TYPE | BDE_AXI_DEV_TYPE))
/*
* PCI Bus Access
*/
uint32 (*pci_conf_read)(int d, uint32 addr);
int (*pci_conf_write)(int d, uint32 addr, uint32 data);
void (*pci_bus_features)(int d, int *be_pio, int *be_packet,
int *be_other);
uint32 (*read)(int d, uint32 addr);
int (*write)(int d, uint32 addr, uint32 data);
uint32* (*salloc)(int d, int size, const char *name);
void (*sfree)(int d, void *ptr);
int (*sflush)(int d, void *addr, int length);
int (*sinval)(int d, void *addr, int length);
int (*interrupt_connect)(int d, void (*)(void*), void *data);
int (*interrupt_disconnect)(int d);
sal_paddr_t (*l2p)(int d, void *laddr);
void* (*p2l)(int d, sal_paddr_t paddr);
/*
* SPI Access via SMP
*/
int (*spi_read)(int d, uint32 addr, uint8 *buf, int len);
int (*spi_write)(int d, uint32 addr, uint8 *buf, int len);
/* Special SPI access addresses */
#define BDE_DEV_OP_EMMI_INIT SAL_DEV_OP_EMMI_INIT
/*
* iProc register access
*/
uint32 (*iproc_read)(int d, uint32 addr);
int (*iproc_write)(int d, uint32 addr, uint32 data);
/*
* Shared memory access
*/
uint32 (*shmem_read)(int dev, uint32 addr, uint8 *buf, uint32 len);
void (*shmem_write)(int dev, uint32 addr, uint8 *buf, uint32 len);
sal_vaddr_t (*shmem_map)(int dev, uint32 addr, uint32 size);
/*
* cmic
*/
int (*get_cmic_ver)(int d, uint32 *ver);
} ibde_t;
/* System BDE */
extern ibde_t *bde;
#endif /* __IBDE_H__ */

View File

@ -0,0 +1,541 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: kcom.h,v 1.9 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*
* File: kcom.h
* Purpose: User/Kernel message definitions
*/
#ifndef _KCOM_H
#define _KCOM_H
#include <sal/types.h>
#define KCOM_CHAN_KNET "KCOM_KNET"
/*
* Message types
*/
#define KCOM_MSG_TYPE_CMD 1 /* Command */
#define KCOM_MSG_TYPE_RSP 2 /* Command response */
#define KCOM_MSG_TYPE_EVT 3 /* Unsolicited event */
/*
* Message opcodes
*/
#define KCOM_M_NONE 0 /* Should not be used */
#define KCOM_M_VERSION 1 /* Protocol version */
#define KCOM_M_STRING 2 /* For debug messages */
#define KCOM_M_HW_RESET 3 /* H/W not ready */
#define KCOM_M_HW_INIT 4 /* H/W initialized */
#define KCOM_M_ETH_HW_CONFIG 5 /* ETH HW config*/
#define KCOM_M_DETACH 6 /* Detach kernel module */
#define KCOM_M_NETIF_CREATE 11 /* Create network interface */
#define KCOM_M_NETIF_DESTROY 12 /* Destroy network interface */
#define KCOM_M_NETIF_LIST 13 /* Get list of network interface IDs */
#define KCOM_M_NETIF_GET 14 /* Get network interface info */
#define KCOM_M_FILTER_CREATE 21 /* Create Rx filter */
#define KCOM_M_FILTER_DESTROY 22 /* Destroy Rx filter */
#define KCOM_M_FILTER_LIST 23 /* Get list of Rx filter IDs */
#define KCOM_M_FILTER_GET 24 /* Get Rx filter info */
#define KCOM_M_DMA_INFO 31 /* Tx/Rx DMA info */
#define KCOM_M_DBGPKT_SET 41 /* Enbale debug packet function */
#define KCOM_M_DBGPKT_GET 42 /* Get debug packet function info */
#define KCOM_VERSION 8 /* Protocol version */
/*
* Message status codes
*/
#define KCOM_E_NONE 0 /* No errors */
#define KCOM_E_PARAM 1 /* Invalid/unsupported parameter */
#define KCOM_E_RESOURCE 2 /* Out of memory or other resource */
#define KCOM_E_NOT_FOUND 3 /* Requested object not found */
typedef struct kcom_msg_hdr_s {
uint8 type;
uint8 opcode;
uint8 seqno;
uint8 status;
uint8 unit;
uint8 reserved;
uint16 id;
} kcom_msg_hdr_t;
/*
* Object types
*/
/*
* System network interface
*
* Network interface types:
*
* KCOM_NETIF_T_VLAN
* Transmits to this interface will go to ingress PIPE of switch
* CPU port using specified VLAN ID. Packet will be switched.
*
* KCOM_NETIF_T_PORT
* Transmits to this interface will go to unmodified to specified
* physical switch port. All switching logic is bypassed.
*
* KCOM_NETIF_T_META
* Transmits to this interface will be done using raw meta data
* as DMA descriptors. Currently used for RCPU mode only.
*
* Network interface flags:
*
* KCOM_NETIF_F_ADD_TAG
* Add VLAN tag to packets sent directly to physical port.
*
* KCOM_NETIF_F_RCPU_ENCAP
* Use RCPU encapsulation for packets that enter and exit this
* interface.
*/
#define KCOM_NETIF_T_VLAN 0
#define KCOM_NETIF_T_PORT 1
#define KCOM_NETIF_T_META 2
#define KCOM_NETIF_F_ADD_TAG (1U << 0)
#define KCOM_NETIF_F_RCPU_ENCAP (1U << 1)
/* If a netif has this flag, the packet sent to the netif can't be stripped tag or added tag */
#define KCOM_NETIF_F_KEEP_RX_TAG (1U << 2)
#define KCOM_NETIF_NAME_MAX 16
typedef struct kcom_netif_s {
uint16 id;
uint8 type;
uint8 flags;
uint32 cb_user_data;
uint8 port;
uint8 reserved;
uint16 vlan;
uint16 qnum;
uint8 macaddr[6];
uint8 ptch[2];
uint8 itmh[4];
char name[KCOM_NETIF_NAME_MAX];
} kcom_netif_t;
/*
* Packet filters
*
* Filters work like software TCAMs where a mask is applied to the
* source data, and the result is then compared to the filter data.
*
* Filters are checked in priority order with the lowest priority
* values being checked first (i.e. 0 is the highest priority).
*
* Filter types:
*
* KCOM_FILTER_T_RX_PKT
* Filter data and mask are applied to the Rx DMA control block
* as well as to the Rx packet contents.
*
* Destination types:
*
* KCOM_DEST_T_NULL
* Packet is dropped.
*
* KCOM_DEST_T_NETIF
* Packet is sent to network interface with ID <dest_id>.
*
* KCOM_DEST_T_API
* Packet is sent to Rx API through queue <dest_id>.
*
* KCOM_DEST_T_CB
* Packet destination is obtained from kernel call-back function.
*
* Filter flags:
*
* KCOM_FILTER_F_ANY_DATA
* When this flags is set the filter will match any packet on
* the associated unit.
*
* KCOM_FILTER_F_STRIP_TAG
* Strip VLAN tag before packet is sent to destination.
* This flag only applies to KCOM_DEST_T_NETIF.
*
*/
#define KCOM_FILTER_BYTES_MAX 256
#define KCOM_FILTER_WORDS_MAX BYTES2WORDS(KCOM_FILTER_BYTES_MAX)
#define KCOM_FILTER_T_RX_PKT 1
#define KCOM_DEST_T_NULL 0
#define KCOM_DEST_T_NETIF 1
#define KCOM_DEST_T_API 2
#define KCOM_DEST_T_CB 3
#define KCOM_FILTER_F_ANY_DATA (1U << 0)
#define KCOM_FILTER_F_STRIP_TAG (1U << 1)
#define KCOM_FILTER_DESC_MAX 32
typedef struct kcom_filter_s {
uint16 id;
uint8 type;
uint8 priority;
char desc[KCOM_FILTER_DESC_MAX];
uint32 flags;
uint32 cb_user_data;
uint16 dest_type;
uint16 dest_id;
uint16 dest_proto;
uint16 mirror_type;
uint16 mirror_id;
uint16 mirror_proto;
uint16 oob_data_offset;
uint16 oob_data_size;
uint16 pkt_data_offset;
uint16 pkt_data_size;
union {
uint8 b[KCOM_FILTER_BYTES_MAX];
uint32 w[KCOM_FILTER_WORDS_MAX];
} data;
union {
uint8 b[KCOM_FILTER_BYTES_MAX];
uint32 w[KCOM_FILTER_WORDS_MAX];
} mask;
} kcom_filter_t;
/*
* DMA buffer information
*
* Cookie field is reserved use by application (32/64-bit pointer).
*
* For Tx operation the application will submit the start address of
* the Tx DCB chain which is queued for transfer by the kernel module.
* Once DMA is done a DMA event is returned to the application with an
* optional sequence number.
*
* For Rx operation the application will submit the start address of
* the Rx DCB chain which should be use for packet reception by the
* kernel module. Once DMA is done a DMA event is returned to the
* application with an optional sequence number.
*
* Cookie field is reserved use by application (32/64-bit pointer).
*
* Packet info types:
*
* KCOM_DMA_INFO_T_TX_DCB
* Data is physical start address of Tx DCB chain.
*
* KCOM_DMA_INFO_T_RX_DCB
* Data is physical start address of Rx DCB chain.
*
* Packet info flags:
*
* KCOM_DMA_INFO_F_TX_DONE
* This flag is set by the kernel module and means that one or more
* packets have been sent.
*
* KCOM_DMA_INFO_F_RX_DONE
* This flag is set by the kernel module and means that one or more
* Rx buffers contain valid packet data.
*/
#define KCOM_DMA_INFO_T_TX_DCB 1
#define KCOM_DMA_INFO_T_RX_DCB 2
#define KCOM_DMA_INFO_F_TX_DONE (1U << 0)
#define KCOM_DMA_INFO_F_RX_DONE (1U << 1)
typedef struct kcom_dma_info_s {
uint8 type;
uint8 cnt;
uint16 size;
uint16 chan;
uint16 flags;
union {
void *p;
uint8 b[8];
} cookie;
union {
uint32 dcb_start;
struct {
uint32 tx;
uint32 rx;
} seqno;
} data;
} kcom_dma_info_t;
/* Default channel configuration */
#define KCOM_DMA_TX_CHAN 0
#define KCOM_DMA_RX_CHAN 1
#define KCOM_ETH_HW_T_RESET 1
#define KCOM_ETH_HW_T_INIT 2
#define KCOM_ETH_HW_T_OTHER 3
#define KCOM_ETH_HW_C_ALL 0xff
#define KCOM_ETH_HW_RESET_F_TX (1U << 0)
#define KCOM_ETH_HW_RESET_F_RX (1U << 1)
#define KCOM_ETH_HW_RESET_F_TX_RECLAIM (1U << 2)
#define KCOM_ETH_HW_RESET_F_RX_RECLAIM (1U << 3)
#define KCOM_ETH_HW_INIT_F_TX (1U << 0)
#define KCOM_ETH_HW_INIT_F_RX (1U << 1)
#define KCOM_ETH_HW_INIT_F_RX_FILL (1U << 2)
#define KCOM_ETH_HW_OTHER_F_FIFO_LOOPBACK (1U << 0)
#define KCOM_ETH_HW_OTHER_F_INTERRUPT (1U << 1)
typedef struct kcom_eth_hw_config_s {
uint8 type;
uint8 chan;
uint32 flags;
uint32 value;
} kcom_eth_hw_config_t;
/*
* Message types
*/
/*
* Request KCOM interface version of kernel module.
*/
typedef struct kcom_msg_version_s {
kcom_msg_hdr_t hdr;
uint32 version;
uint32 netif_max;
uint32 filter_max;
} kcom_msg_version_t;
/*
* Send literal string to/from kernel module.
* Mainly for debugging purposes.
*/
#define KCOM_MSG_STRING_MAX 128
typedef struct kcom_msg_string_s {
kcom_msg_hdr_t hdr;
uint32 len;
char val[KCOM_MSG_STRING_MAX];
} kcom_msg_string_t;
/*
* Indicate that eth hardware is about to be reset. Active
* DMA operations should be aborted and DMA and interrupts
* should be disabled.
*/
/*
* Indicate that eth hardware has been properly initialized
* for DMA operation to commence.
*/
typedef struct kcom_msg_eth_hw_config_s {
kcom_msg_hdr_t hdr;
kcom_eth_hw_config_t config;
} kcom_msg_eth_hw_config_t;
/*
* Indicate that switch hardware is about to be reset. Active
* DMA operations should be aborted and DMA and interrupts
* should be disabled.
*/
typedef struct kcom_msg_hw_reset_s {
kcom_msg_hdr_t hdr;
uint32 channels;
} kcom_msg_hw_reset_t;
/*
* Indicate that switch hardware has been properly initialized
* for DMA operation to commence.
*/
typedef struct kcom_msg_hw_init_s {
kcom_msg_hdr_t hdr;
uint16 dcb_size;
uint16 dcb_type;
uint32 cdma_channels;
} kcom_msg_hw_init_t;
/*
* Release blocked IOCTL threads and clean up as necessary.
*/
typedef struct kcom_msg_detach_s {
kcom_msg_hdr_t hdr;
uint32 flags;
} kcom_msg_detach_t;
/*
* Enable/Disable debugging packet function.
*/
typedef struct kcom_msg_dbg_pkt_set_s {
kcom_msg_hdr_t hdr;
int enable;
} kcom_msg_dbg_pkt_set_t;
/*
* Get debugging packet function info.
*/
typedef struct kcom_msg_dbg_pkt_get_s {
kcom_msg_hdr_t hdr;
int value;
} kcom_msg_dbg_pkt_get_t;
/*
* Create new system network interface. The network interface will
* be associated with the specified switch unit number.
* The interface id and name will be assigned by the kernel module.
*/
typedef struct kcom_msg_netif_create_s {
kcom_msg_hdr_t hdr;
kcom_netif_t netif;
} kcom_msg_netif_create_t;
/*
* Destroy system network interface.
*/
typedef struct kcom_msg_netif_destroy_s {
kcom_msg_hdr_t hdr;
} kcom_msg_netif_destroy_t;
/*
* Get list of currently defined system network interfaces.
*/
#ifndef KCOM_NETIF_MAX
#define KCOM_NETIF_MAX 128
#endif
typedef struct kcom_msg_netif_list_s {
kcom_msg_hdr_t hdr;
uint32 ifcnt;
uint16 id[KCOM_NETIF_MAX];
} kcom_msg_netif_list_t;
/*
* Get detailed network interface information.
*/
typedef struct kcom_msg_netif_get_s {
kcom_msg_hdr_t hdr;
kcom_netif_t netif;
} kcom_msg_netif_get_t;
/*
* Create new packet filter.
* The filter id will be assigned by the kernel module.
*/
typedef struct kcom_msg_filter_create_s {
kcom_msg_hdr_t hdr;
kcom_filter_t filter;
} kcom_msg_filter_create_t;
/*
* Destroy packet filter.
*/
typedef struct kcom_msg_filter_destroy_s {
kcom_msg_hdr_t hdr;
} kcom_msg_filter_destroy_t;
/*
* Get list of currently defined packet filters.
*/
#ifndef KCOM_FILTER_MAX
/* OPENNSL_FIXUP - Increased the filters to 1024 from 128 */
#define KCOM_FILTER_MAX 1024
#endif
typedef struct kcom_msg_filter_list_s {
kcom_msg_hdr_t hdr;
uint32 fcnt;
uint16 id[KCOM_FILTER_MAX];
} kcom_msg_filter_list_t;
/*
* Get detailed packet filter information.
*/
typedef struct kcom_msg_filter_get_s {
kcom_msg_hdr_t hdr;
kcom_filter_t filter;
} kcom_msg_filter_get_t;
/*
* DMA info
*/
typedef struct kcom_msg_dma_info_s {
kcom_msg_hdr_t hdr;
kcom_dma_info_t dma_info;
} kcom_msg_dma_info_t;
/*
* All messages (e.g. for generic receive)
*/
typedef union kcom_msg_s {
kcom_msg_hdr_t hdr;
kcom_msg_version_t version;
kcom_msg_string_t string;
kcom_msg_hw_reset_t hw_reset;
kcom_msg_hw_init_t hw_init;
kcom_msg_eth_hw_config_t eth_hw_config;
kcom_msg_detach_t detach;
kcom_msg_netif_create_t netif_create;
kcom_msg_netif_destroy_t netif_destroy;
kcom_msg_netif_list_t netif_list;
kcom_msg_netif_get_t netif_get;
kcom_msg_filter_create_t filter_create;
kcom_msg_filter_destroy_t filter_destroy;
kcom_msg_filter_list_t filter_list;
kcom_msg_filter_get_t filter_get;
kcom_msg_dma_info_t dma_info;
kcom_msg_dbg_pkt_set_t dbg_pkt_set;
kcom_msg_dbg_pkt_get_t dbg_pkt_get;
} kcom_msg_t;
/*
* KCOM communication channel vectors
*
* open
* Open KCOM channel.
*
* close
* Close KCOM channel.
*
* send
* Send KCOM message. If bufsz is non-zero, a synchronous send will be
* performed (if supported) and the function will return the number of
* bytes in the response.
*
* recv
* Receive KCOM message. This function is used t oreceive unsolicited
* messages from the kernel. If synchronous send is not supported, this
* function is also used to retrieve responses to command messages.
*/
typedef struct kcom_chan_s {
void *(*open)(char *name);
int (*close)(void *handle);
int (*send)(void *handle, void *msg, unsigned int len, unsigned int bufsz);
int (*recv)(void *handle, void *msg, unsigned int bufsz);
} kcom_chan_t;
#endif /* _KCOM_H */

View File

@ -0,0 +1,39 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: sync.h,v 1.1 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef _SAL_SYNC_H
#define _SAL_SYNC_H
typedef struct sal_sem_s{
char sal_opaque_type;
} *sal_sem_t;
#define sal_sem_FOREVER (-1)
#define sal_sem_BINARY 1
#define sal_sem_COUNTING 0
sal_sem_t sal_sem_create(char *desc, int binary, int initial_count);
void sal_sem_destroy(sal_sem_t b);
int sal_sem_take(sal_sem_t b, int usec);
int sal_sem_give(sal_sem_t b);
#endif /* !_SAL_SYNC_H */

View File

@ -0,0 +1,31 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: thread.h,v 1.1 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef _SAL_THREAD_H
#define _SAL_THREAD_H
#include <sal/types.h>
void sal_usleep(uint32 usec);
void sal_udelay(uint32 usec);
#endif /* !_SAL_THREAD_H */

View File

@ -0,0 +1,156 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: types.h,v 1.3 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*
* File: types.h
* Purpose: SAL type definitions
*/
#ifndef _SAL_TYPES_H
#define _SAL_TYPES_H
/*
* Define platform-independent types
*/
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef NULL
#define NULL 0
#endif
#ifndef DONT_CARE
#define DONT_CARE 0
#endif
#define VOL volatile
/*
* 64-bit type
*/
#ifdef LONGS_ARE_64BITS
#define COMPILER_64BIT
#define COMPILER_UINT64 unsigned long
#define u64_H(v) (((uint32 *) &(v))[u64_MSW])
#define u64_L(v) (((uint32 *) &(v))[u64_LSW])
#else /* !LONGS_ARE_64BITS */
#define COMPILER_64BIT
#define COMPILER_UINT64 unsigned long long
#define u64_H(v) (((uint32 *) &(v))[u64_MSW])
#define u64_L(v) (((uint32 *) &(v))[u64_LSW])
#endif /* LONGS_ARE_64BITS */
/*
* Define unsigned and signed integers with guaranteed sizes.
* Adjust if your compiler uses different sizes for short or int.
*/
typedef unsigned char uint8; /* 8-bit quantity */
typedef unsigned short uint16; /* 16-bit quantity */
typedef unsigned int uint32; /* 32-bit quantity */
typedef COMPILER_UINT64 uint64; /* 64-bit quantity */
typedef signed char int8; /* 8-bit quantity */
typedef signed short int16; /* 16-bit quantity */
typedef signed int int32; /* 32-bit quantity */
#define BITS2BYTES(x) (((x) + 7) / 8)
#define BITS2WORDS(x) (((x) + 31) / 32)
#define BYTES2BITS(x) ((x) * 8)
#define BYTES2WORDS(x) (((x) + 3) / 4)
#define WORDS2BITS(x) ((x) * 32)
#define WORDS2BYTES(x) ((x) * 4)
#define COUNTOF(ary) ((int) (sizeof (ary) / sizeof ((ary)[0])))
typedef uint32 sal_paddr_t; /* Physical address (PCI address) */
#ifdef PTRS_ARE_64BITS
typedef uint64 sal_vaddr_t; /* Virtual address (Host address) */
#define PTR_TO_INT(x) ((uint32)(((sal_vaddr_t)(x))&0xFFFFFFFF))
#else
typedef uint32 sal_vaddr_t; /* Virtual address (Host address) */
#define PTR_TO_INT(x) ((uint32)(x))
#endif
#define INT_TO_PTR(x) ((void *)((sal_vaddr_t)(x)))
#define PTR_TO_UINTPTR(x) ((sal_vaddr_t)(x))
#define UINTPTR_TO_PTR(x) ((void *)(x))
typedef union
{
uint8 u8;
uint16 u16;
uint32 u32;
uint64 u64;
sal_paddr_t paddr;
sal_vaddr_t vaddr;
void *ptr;
} any_t;
/* Device bus types */
#define SAL_PCI_DEV_TYPE 0x00001 /* PCI device */
#define SAL_SPI_DEV_TYPE 0x00002 /* SPI device */
#define SAL_EB_DEV_TYPE 0x00004 /* EB device */
#define SAL_ICS_DEV_TYPE 0x00008 /* ICS device */
#define SAL_MII_DEV_TYPE 0x00010 /* MII device */
#define SAL_RCPU_DEV_TYPE 0x00020 /* RCPU device */
#define SAL_I2C_DEV_TYPE 0x00040 /* I2C device */
#define SAL_AXI_DEV_TYPE 0x00080 /* AXI device */
#define SAL_EMMI_DEV_TYPE 0x10000 /* EMMI device */
#define SAL_DEV_BUS_TYPE_MASK 0xf00ff /* Odd for historical reasons */
/* Device types */
#define SAL_SWITCH_DEV_TYPE 0x00100 /* Switch device */
#define SAL_ETHER_DEV_TYPE 0x00200 /* Ethernet device */
#define SAL_CPU_DEV_TYPE 0x00400 /* CPU device */
#define SAL_DEV_TYPE_MASK 0x00f00
/* Access types */
#define SAL_DEV_BUS_RD_16BIT 0x01000 /* 16 bit reads on bus */
#define SAL_DEV_BUS_WR_16BIT 0x02000 /* 16 bit writes on bus */
#define SAL_DEV_BUS_ALT 0x04000 /* Alternate access */
#define SAL_DEV_BUS_MSI 0x08000 /* Message-signaled interrupts */
#define SAL_DEV_FLAG_MASK 0x0f000
/* BDE reserved mask (cannot be used by SAL) */
#define SAL_DEV_BDE_MASK 0xff000000
/* Backward compatibility */
#define SAL_ET_DEV_TYPE SAL_MII_DEV_TYPE
/* Special access addresses */
#define SAL_DEV_OP_EMMI_INIT 0x0fff1000
#endif /* !_SAL_TYPES_H */

View File

@ -0,0 +1,46 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: sdk_config.h,v 1.5 Broadcom SDK $
* $Copyright: (c) 2006 Broadcom Corp.
* All Rights Reserved.$
*
*
*/
#ifndef __SDK_CONFIG_H__
#define __SDK_CONFIG_H__
/*
* Include custom overrides
*/
#ifdef SDK_INCLUDE_CUSTOM_CONFIG
#include <sdk_custom_config.h>
#endif
/*
* Memory Barrier operation if required.
* Defaults to nothing.
*/
#ifndef SDK_CONFIG_MEMORY_BARRIER
#define SDK_CONFIG_MEMORY_BARRIER
#endif
#endif /* __SDK_CONFIG_H__ */

View File

@ -0,0 +1,38 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: cmic.h,v 1.1 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*
* File: cmic.h
* Purpose: Maps out structures used for CMIC operations and
* exports routines and constants.
*/
#ifndef _SOC_CMIC_H
#define _SOC_CMIC_H
/* IRQ Register (RO) */
#define CMIC_IRQ_STAT 0x00000144
/* IRQ Mask Registers (R/W) */
#define CMIC_IRQ_MASK 0x00000148
#define CMIC_IRQ_MASK_1 0x0000006C
#define CMIC_IRQ_MASK_2 0x00000070
#endif /* !_SOC_CMIC_H */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,364 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Make.config,v 1.3 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
ifneq ($(strip $(override-target)),)
override TARGET=$(override-target)
endif
export TARGET
#
# Set up the target name, and the target base variables.
#
# target = The full name of the target such as vxworks-bmw
# targetbase = 1st part of target (e.g. vxworks)
# targetplat = 2nd part of target (e.g. x86) if any; otherwise same as 1st
#
target = ${TARGET}
targetsplt = $(subst -, , ${target}) # change hyphens to spaces
targetbase = $(word 1,${targetsplt})
targetplat = $(subst ${targetbase}-,,${TARGET})
#
# Common configuration for all platforms
# (Additional platform-dependent configurations are in Makefile.xxx)
#
#
# THIS FILE SHOULD NOT BE MODIFIED LOCALLY, to override, add a file
# $SDK/make/Make.local that sets your local settings, and/or provide
# a path to your settings using the MAKE_LOCAL variable. If
# either of these files exists, their values will override those in this makefile.
#
ifdef MAKE_LOCAL
-include ${MAKE_LOCAL}
endif
-include ${SDK}/make/Make.local
ifdef ALL_CHIPS
ROBO_CHIPS = 1
ESW_CHIPS = 1
else
ifndef ROBO_CHIPS
ESW_CHIPS = 1
endif
endif # ALL_CHIPS
#
# By default, turn off the "changing directory" message.
#
MAKEFLAGS += --no-print-directory
#
# Use gmake by default
#
include ${SDK}/make/Make.tools
include ${SDK}/make/Makefile.${target}
# use QUIET=1 to control printing of compilation lines
ifdef QUIET
Q:=@
else
Q:=
endif
#
# Suffix to add to the "target" files to allow local builds with different
# flags. Set "target_suffix" to XXX to cause the build to put built objects
# in ${target}${target_suffix}. This allows things like building a debug
# version with different flags. This may also be set in another Makefile.
#
#target_suffix :=
#
# Optional suffix to add to the build directory and output binary files
# to allow multiple builds to co-exist for various reasons.
#
#chip_suffix := -$(shell echo $(CHIP) | tr A-Z a-z)
#
# Combined suffixes
#
all_suffix = ${chip_suffix}${target_suffix}
#
# Default location to place binaries and make depend files for building
# purposes.
#
ifeq "$(HOSTTYPE)" "Windows2000PC"
BLDROOTWITHDRIVE = ${SDK}/build/${target}${all_suffix}${bldroot_suffix}
BLDROOT = ${SDK_NO_DRIVE_NAME}/build/${target}${all_suffix}${bldroot_suffix}
else # ifeq "$(HOSTTYPE)" "Windows2000PC"
ifndef SDKBUILD
SDKBUILD :=build
endif
BLDROOT = ${SDK}/${SDKBUILD}/$(if ${BLDCONFIG},${BLDCONFIG}/)${target}${all_suffix}${bldroot_suffix}
endif # ifeq "$(HOSTTYPE)" "Windows2000PC"
# This is needed because we cannot include Make.vxworks before Make.config
ifndef DEST_DIR_SUFFIX
export DEST_DIR_SUFFIX :=$(subst $(realpath $(SDK))/systems,,$(realpath $(CURDIR)/$(dir ($(firstword $(MAKEFILE_LIST))))))
ifeq ($(MAKELEVEL),0)
endif
endif
ifeq ($(DEST_DIR),)
export DEST_DIR :=${SDK}/${SDKBUILD}$(if ${BLDCONFIG},/${BLDCONFIG})$(DEST_DIR_SUFFIX)
endif
ifdef LOCALDIR
BLDDIR = ${BLDROOT}/${LOCALDIR}
ifeq "$(HOSTTYPE)" "Windows2000PC"
BLDDIRWITHDRIVE = ${BLDROOTWITHDRIVE}/${LOCALDIR}
endif
else # ifdef LOCALDIR
BLDDIR = ${BLDROOT}
ifeq "$(HOSTTYPE)" "Windows2000PC"
BLDDIRWITHDRIVE = ${BLDROOTWITHDRIVE}
endif
endif # ifdef LOCALDIR
LIBDIR = ${BLDROOT}
#
# Export directory, where build objects used by the outside world are
# placed (exported header files, libs, bins)
#
EXPDIR = ${SDK}/export/${target}${all_suffix}
#
# Standard include paths
#
INCDIR = ${SDK}/include
#
# Compilation Flags
#
# Flags may be added to (see below)
#
INCFLAGS = -I${INCDIR} -I${SDK}/systems
CFLAGS += ${INCFLAGS}
CXXFLAGS += ${INCFLAGS}
CPPFLAGS += ${INCFLAGS}
#
# Debug #ifdef control
#
# Compiling out #ifdef DEBUG code saves about 1.3% on executable size.
# It is recommended to leave debug enabled when developing applications.
#
ifndef DEBUG_IFDEFS
DEBUG_IFDEFS=TRUE
endif
ifeq ($(DEBUG_IFDEFS),TRUE)
CFLAGS += -DBROADCOM_DEBUG
CXXFLAGS += -DBROADCOM_DEBUG
CPPFLAGS += -DBROADCOM_DEBUG
endif
#
# Debug symbol information control
#
ifndef DEBUG_SYMBOLS
DEBUG_SYMBOLS=TRUE
endif
ifeq ($(DEBUG_SYMBOLS),TRUE)
CFLAGS += -g
CXXFLAGS += -g
CPPFLAGS += -g
endif
#
# If DEBUG_CFLAGS is set, add its contents to CFLAGS.
# May be useful for setting on the command line or adding to Make.local.
# Example: gmake DEBUG_CFLAGS=-save-temps system.c
#
ifneq ($(DEBUG_CFLAGS),)
CFLAGS += $(DEBUG_CFLAGS)
CXXFLAGS += $(DEBUG_CFLAGS)
CPPFLAGS += $(DEBUG_CFLAGS)
endif
#
# Optimization level
#
# Set DEBUG_OPTIMIZE to TRUE (default) to use a normal optimization
# determined by OPTFLAGS_DEFAULT in the platform Makefile.
# Set DEBUG_OPTIMIZE to FALSE to use no optimization,
# strongly recommended when using any debugger.
# Set DEBUG_OPTIMIZE to any other option string to request specific
# optimization flags (for example -O2).
#
ifndef DEBUG_OPTIMIZE
DEBUG_OPTIMIZE=TRUE
endif
ifeq ($(DEBUG_OPTIMIZE),TRUE)
OPTFLAGS += $(OPTFLAGS_DEFAULT)
else
ifneq ($(DEBUG_OPTIMIZE),FALSE)
OPTFLAGS += $(DEBUG_OPTIMIZE)
endif
endif
#
# Debug assertion control.
#
# Compiling out assert() saves about 1.1% on executable size,
# however doing so is VERY MUCH discouraged.
#
ifndef DEBUG_ASSERTS
DEBUG_ASSERTS=TRUE
endif
ifeq ($(DEBUG_ASSERTS),FALSE)
CFLAGS += -DNDEBUG
CXXFLAGS += -DNDEBUG
CPPFLAGS += -DNDEBUG
endif
#
# GCC pedantic mode.
#
ifeq ($(DEBUG_PEDANTIC),TRUE)
CFGFLAGS += -D__PEDANTIC__
CFLAGS += --pedantic
CXXFLAGS += --pedantic
endif
#
# In each directory, build a list of local sources, objects, and headers
#
LSRCS = $(wildcard *.c *.cpp *.s *.cc *.C)
LOBJS = $(addsuffix .o, $(basename ${LSRCS}))
BOBJS = $(addprefix ${BLDDIR}/,${LOBJS})
LHDRS = $(wildcard *.h *.H)
LDOTIS = $(wildcard *.i)
#
# Rule to create object file (build) directory
#
.PHONY: all install clean distclean
.PRECIOUS: ${BLDDIR}/.tree
%/.tree:
@$(ECHO) 'Creating build directory $(dir $@)'
@$(MKDIR) $(dir $@)
@$(ECHO) "Build Directory for ${LOCALDIR} Created" > $@
# Rule allowing build through CPP only, creates .E file from .c file.
%.E: %.c
$Q${CC} -E ${CFLAGS} $< | sed -e '/^ *$$/d' -e p -e d > $@
# Rule allowing build through source only, creates .s file from .c file.
%.s: %.c
$Q${CC} -S ${CFLAGS} $<
#
# Default Build rules for .c --> .o, leaving the binary in BLDDIR/X.o,
# even if file not built from directory of source.
#
ifeq ($(FAST),1)
${BLDDIR}/%.o: %.c
else
ifdef GENERATE_C_FILES
${BLDDIR}/%.o: %.c
else
${BLDDIR}/%.o: %.c
endif
endif
ifdef QUIET
@${ECHO} Compiling ${LOCALDIR}/$<
endif
ifdef LOCAL_D_FILE
$Q$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $< --write-user-dependencies
-@/bin/cp $*.d $(BLDDIR)/$*.d
-@/bin/rm -f $*.d
else
$Q$(CC) -MD -MF $(BLDDIR)/$*.d $(CFLAGS) $(EXTRA_CFLAGS) -o $@ -c $<
endif
@/bin/cp $(BLDDIR)/$*.d $(BLDDIR)/$*.tmp;\
/bin/sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' \
< $(BLDDIR)/$*.d >> $(BLDDIR)/$*.tmp; \
/bin/sed \
-e 's| \([0-9a-zA-Z]\)| '$(SDK)/$(LOCALDIR)'\/\1|g' \
-e 's|^\([0-9a-zA-Z]\)|'$(SDK)/$(LOCALDIR)'/\1|g' \
-e 's| \(\.\.\/\)| '$(SDK)/$(LOCALDIR)'\/\1|g' \
-e 's|'$(SDK)'|'$$\{SDK\}'|g' \
-e 's/\w*\/\.\.\/*//g' \
-e 's/\w*\/\.\.\/*//g' \
-e 's/\w*\/\.\.\/*//g' \
< $(BLDDIR)/$*.tmp > $(BLDDIR)/$*.P; \
/bin/rm -f $(BLDDIR)/$*.d $(BLDDIR)/$*.tmp
${BLDDIR}/%.o: %.s
ifdef QUIET
@${ECHO} Assembling ${LOCALDIR}/$<
endif
$Q${CC} ${CFLAGS} ${EXTRA_CFLAGS} -c $< -o $@
${BLDDIR}/%.o: %.cpp
ifdef QUIET
@${ECHO} Compiling ${LOCALDIR}/$<
endif
$Q${CXX} -c ${CXXFLAGS} -c $< -o $@
${BLDDIR}/%.o: %.cc ${BLDDIR}/.tree
ifdef QUIET
@${ECHO} Compiling ${LOCALDIR}/$<
endif
$Q${CXX} -c ${CXXFLAGS} -c $< -o $@
#
# Cause "make foo.o" in any subdirectory to put the object in the build
# directory instead of the local directory.
#
%.o: ${BLDDIR}/%.o
@
#
# List of directories where built objects live.
# (we are not making the export directories for now)
#
#DIRS = ${BLDDIR} ${EXPDIR}/lib ${EXPDIR}/bin ${EXPDIR}/include
DIRS = ${BLDDIR}
ifeq (C_COMPILER,$(MAKECMDGOALS))
C_COMPILER:
@echo $(CC)
endif

View File

@ -0,0 +1,109 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Make.depend,v 1.14 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Default rule to build dependencies. This builds a x.d file for each
# x.c file that describes the dependencies. We then conditionally include
# the generated .d files.
#
#
# If making 'clean', do not include any .d files. If they are included,
# gmake intrinsically tries to remake them all.
#
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
ZFS :=$(wildcard *.zf)
ZFC := $(ZFS:.zf=.c)
ifdef GENERATE_C_FILES
ifndef GEN_INCS
$(error "GEN_INCS was not defined")
endif
ZF_GEN = ${SDK}/tools/zFrameCodeGen.pl
# 1=.zf
define ZFS_RULE
$(1:.zf=Console.c) : $(1:.zf=.c)
@echo updated $$@ from $$?
$(1:.zf=.c) : $(1) $(ZF_GEN)
@$(PERL) $(ZF_GEN) -s -z . -p . -g $1 -t c
@echo generated ${LOCALDIR}/$$@ from $(1)
@mv $$(*F).cx $$@
@if [ -e $$(*F)Console.cx ] ; then \
mv $$(*F)Console.cx $$(*F)Console.c; \
echo Created $$(*F)Console.c ;\
fi
@if [ -e $$(*F)Console.hx ] ; then \
echo Created $(GEN_INCS)/$$(*F)Console.hx ;\
mv $$(*F)Console.hx $(GEN_INCS)/ ; \
fi
@mv $$(*F).hx $(GEN_INCS)/
endef
$(foreach zf,$(ZFS),$(eval $(call ZFS_RULE,$(zf))))
${BLDDIR}/%.P : ${BLDDIR}/.tree %.c
.PHONY: GENFILES
GENFILES: $(ZFC)
$(BOBJS) : $(ZFC)
else
#
# Attempt to build the depend files. If it fails, the depend file is
# removed so that it is not included in later builds.
#
${BLDDIR}/%.P : %.c ${BLDDIR}/.tree
@$(ECHO) Dependencies for ${LOCALDIR}/$<
${BLDDIR}/%.P : %.cc ${BLDDIR}/.tree
@$(ECHO) Dependencies for ${LOCALDIR}/$<
endif
#
# If there are C or C++ files in this directory, include the
# depend files for them.
#
ifeq ($(findstring _COMPILER,$(MAKECMDGOALS))$(findstring variable,$(MAKECMDGOALS)),)
ifneq ($(strip ${LSRCS}),)
ifneq (,$(findstring .o,$(MAKECMDGOALS)))
-include $(addprefix ${BLDDIR}/,$(MAKECMDGOALS:.o=.P)) $(addprefix ${BLDDIR}/,$(MAKECMDGOALS:.o=.sig))
else
-include $(addprefix ${BLDDIR}/,$(addsuffix .P,$(basename $(LSRCS)))) $(addprefix ${BLDDIR}/,$(addsuffix .sig,$(basename $(LSRCS))))
endif
endif
endif
endif # !CLEANING
clean_d::
ifdef QUIET
@$(ECHO) Cleaning dependencies for ${LOCALDIR}
endif
ifdef GENERATE_C_FILES
$Q$(RM) $(ZFC:%=$(SDK)/$(LOCALDIR)/%) $(ZFC:%.c=$(SDK)/$(LOCALDIR)/%Console.c)
endif
clean:: clean_d

View File

@ -0,0 +1,70 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Make.kernlib,v 1.7 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Make rules/targets for handling libraries
.SECONDARY:: ${BOBJS}
targetlibsoname = ${lib}.so.${SHAREDLIBVER}
targetlibrealname = ${targetlibsoname}
targetlibso = ${LIBDIR}/${targetlibrealname}
ifeq ($(TOOLS),Borland)
LIBSUFFIX=lib
${LIBDIR}/%.lib: ${BORLAND_BOBJS}
$(RM) $@
$(FOREACH) -subdir "$(LIBDIR)" \
"tlib $@ $(foreach obj, $(BORLAND_LOBJS), +-$(obj))"
else # !Borland
LIBSUFFIX=a
${LIBDIR}/%.a: ${BOBJS}
ifdef QUIET
@$(ECHO) Building library $(notdir $@)
endif
$Q$(RM) $@
$Q$(AR) ${ARFLAGS} $@ $(sort ${BOBJS})
ifeq ($(LINUX_MAKE_SHARED_LIB),1)
ifeq ($(targetbase),unix)
$(CC) -shared -Wl,-soname,${targetlibsoname} -o ${targetlibso} ${BOBJS} -lc
endif
endif # LINUX_MAKE_SHARED_LIB #
endif # !Borland
targetlib = ${LIBDIR}/${lib}.${LIBSUFFIX}
all:: ${BLDDIR}/.tree ${targetlib}
install:: all
clean::
ifdef QUIET
@$(ECHO) Cleaning objects for ${LOCALDIR} and ${lib}
endif
$Q$(RM) ${BOBJS}
$Q$(RM) ${targetlib}
$Q$(RM) ${targetlibso}
distclean:: clean

View File

@ -0,0 +1,81 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Make.lib,v 1.14 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Make rules/targets for handling libraries
.SECONDARY:: ${BOBJS}
BOBJS_FAST = ${BOBJS}
BOBJS_MAKE_CMD =
ifeq ($(FAST),1)
ifneq ($(strip $(BOBJS)),)
BOBJS_FAST =
BOBJS_ARGS = -j9
BOBJS_MAKE_CMD = pwd && make LSRUN=$(SDK)/tools/lsrun.pl $(BOBJS_ARGS) ${BOBJS}
endif
endif
ifeq ($(TOOLS),Borland)
LIBSUFFIX=lib
${LIBDIR}/%.lib: ${BORLAND_BOBJS}
$(RM) $@
$(FOREACH) -subdir "$(LIBDIR)" \
"tlib $@ $(foreach obj, $(BORLAND_LOBJS), +-$(obj))"
else # !Borland
ifeq ($(LINUX_MAKE_SHARED_LIB),1)
LIBSUFFIX=so.${SHAREDLIBVER}
else
LIBSUFFIX=a
endif
targetlib = ${LIBDIR}/${lib}.${LIBSUFFIX}
all:: ${BLDDIR}/.tree ${targetlib}
${LIBDIR}/%.${LIBSUFFIX}: ${BOBJS_FAST}
$(BOBJS_MAKE_CMD)
ifdef QUIET
@$(ECHO) Building library $(notdir $@)
endif
$Q$(RM) $@
ifeq ($(LINUX_MAKE_SHARED_LIB),1)
$(CC) -shared -Wl,-soname,${lib}.${LIBSUFFIX}${EXTRA_LIB_LDFLAGS} -o ${targetlib} ${BOBJS} -lc
else
${Q}cd $(dir $(word 1,${BOBJS}));$(AR) ${ARFLAGS} $@ $(sort $(notdir ${BOBJS}))
endif
endif # !Borland
install:: all
clean::
ifdef QUIET
@$(ECHO) Cleaning objects for ${LOCALDIR} and ${lib}
endif
$Q$(RM) ${BOBJS}
$Q$(RM) ${targetlib}
distclean:: clean

View File

@ -0,0 +1,98 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
#
# $Id: Make.linux,v 1.18 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Common make targets for Linux user and kernel builds included by top
# level Linux makefiles
#
# Variables referenced:
#
# LINUX_MAKE_FLAGS
# Additional flags passed to Make
#
# LINUX_MAKE_USER
# Defined: user build
# Undefined: kernel build
#
# LINUX_MAKE_DIR
# Common makefile location, if it is not ../common
#
#
export DEST_DIR_SUFFIX :=$(subst $(realpath $(SDK))/systems,,$(realpath $(CURDIR)/$(dir ($(firstword $(MAKEFILE_LIST))))))
ifeq (,$(kernel_version))
kernel_version=2_4
endif
ifndef LINUX_MAKE_SHARED_LIB
LINUX_MAKE_SHARED_LIB=0
endif
ifeq (,$(SHAREDLIBVER))
SHAREDLIBVER=1
endif
ifndef LINUX_MAKE_DIR
ifdef LINUX_MAKE_USER
LINUX_MAKE_DIR := $(SDK)/systems/linux/user/common
else
LINUX_MAKE_DIR := $(SDK)/systems/linux/kernel/common
endif
endif
ifdef LINUX_MAKE_USER
CMD = $(LINUX_MAKE_FLAGS) -C $(LINUX_MAKE_DIR) \
platform=$(platform) bldroot_suffix=/$(platform) kernel_version=$(kernel_version) \
LINUX_MAKE_SHARED_LIB=$(LINUX_MAKE_SHARED_LIB) SHAREDLIBVER=$(SHAREDLIBVER)
else
export LINUX_MAKE_KERNEL := 1
CMD = $(LINUX_MAKE_FLAGS) -C $(LINUX_MAKE_DIR) \
platform=$(platform) kernel_version=$(kernel_version)
endif
ifneq (,$(MIPS_TOOLS_DIR))
CMD += MIPS_TOOLS_DIR=$(MIPS_TOOLS_DIR)
endif
ifneq (,$(MIPS_CROSS_COMPILE))
CMD += MIPS_CROSS_COMPILE=$(MIPS_CROSS_COMPILE)
endif
ifneq (,$(LINUX_INCLUDE))
CMD += LINUX_INCLUDE=$(LINUX_INCLUDE)
endif
# gmake does not understand $(CMD) to be a submake
# options are to +$(CMD) or $(MAKE) $(CMD)
# trying the latter
build:
$(MAKE) $(CMD)
DELIVER clean C_COMPILER CXX_COMPILER variable mod bcm user:
$(MAKE) $(CMD) $@
clean_d: clean
distclean:
$(MAKE) $(CMD) $@
.PHONY: build clean distclean clean_d DELIVER variable mod bcm user

View File

@ -0,0 +1,2 @@
#Changing value of this Knet filter
CFGFLAGS += -UKCOM_FILTER_MAX -DKCOM_FILTER_MAX=256

View File

@ -0,0 +1,45 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Make.subdirs,v 1.8 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Make rules/targets for handling subdirectories
.PHONY: ${subdirs}
all:: ${subdirs}
ifdef QUIET
@$(ECHO) Subdirectory build for ${subdirs}
endif
${subdirs}::
$Q$(MAKE) -C $@ kernel_version=$(kernel_version) LINUX_MAKE_SHARED_LIB=${LINUX_MAKE_SHARED_LIB} SHAREDLIBVER=${SHAREDLIBVER}
ifeq "$(HOSTTYPE)" "Windows2000PC"
clean clean_d install distclean::
ifdef QUIET
@$(ECHO) Subdirectory $@ for ${subdirs}
endif
$Q$(FOREACH) "$(subdirs)" "${MAKE} -C ## $@"
else
clean clean_d install distclean::
ifdef QUIET
@$(ECHO) Subdirectory $@ for ${subdirs}
endif
@(for name in $(subdirs); do $(MAKE) -C $$name $@; done)
endif

View File

@ -0,0 +1,39 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Make.tools,v 1.2 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
SYSNAME := $(shell uname -s)
HCC ?=/usr/bin/gcc
SED = /bin/sed
COMPRESS = /usr/bin/compress
PERL = /usr/bin/perl
LN = /bin/ln
HOSTTYPE= i386-linux
#
# Platform Independent
#
MKTOOL = $(PERL) ${SDK}/tools/mktool.pl
RM = $(MKTOOL) -rm
MKDIR = $(MKTOOL) -md
FOREACH = $(MKTOOL) -foreach
CP = $(MKTOOL) -cp
MAKEDEP = $(MKTOOL) -dep
ECHO = $(MKTOOL) -echo
MKBEEP = ${MKTOOL} -beep

View File

@ -0,0 +1,115 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-gto-4_4,v 1.42 Broadcom SDK $
# $Copyright: (c) 2015 Broadcom Corp.
# All Rights Reserved.$
# User must select one platform from below.
ifeq (,$(BUILD_PLATFORM))
BUILD_PLATFORM=POWERPC_LINUX
endif
# TOOLCHAIN_BASE_DIR Toolchain base directory for GTO devices
# TARGET_ARCHITECTURE Compiler for target architecture
# KERNDIR Kernel directory for iPROC-CMICd devices
TOOLCHAIN_BASE_DIR ?= /projects/ntsw-tools/linux/gto
TARGET_ARCHITECTURE := powerpc-broadcom-linux-gnuspe
KERNDIR ?= $(TOOLCHAIN_BASE_DIR)/kernel/current
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := $(TARGET_ARCHITECTURE)-
endif
# GTO toolchain
TOOLCHAIN_BIN_DIR := $(TOOLCHAIN_BASE_DIR)/toolchain/host/usr/bin
override PATH := $(TOOLCHAIN_BIN_DIR)/../$(TARGET_ARCHITECTURE)/bin:$(TOOLCHAIN_BIN_DIR):$(PATH)
export TOOLCHAIN_BIN_DIR
# Default Linux include directory
ifeq (,$(LINUX_INCLUDE))
LINUX_INCLUDE := $(KERNDIR)/include
endif
CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1
ENDIAN = BE_HOST=1
CFGFLAGS += -D$(ENDIAN)
CFGFLAGS += -DBCM_PLATFORM_STRING=\"GTO_MPC8548\"
CFGFLAGS += -DSAL_BDE_DMA_MEM_DEFAULT=32
# Extra variables.
EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)
ARCH = powerpc
KBUILD_VERBOSE = 1
export ARCH KBUILD_VERBOSE
# From linux/arch/ppc/Makefile
comma = ,
basetarget = $(basename $(notdir $@))
modname = $(basetarget)
name-fix = $(subst $(comma),_,$(subst -,_,$1))
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
modname_flags = $(if $(filter 1,$(words $(modname))),\
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
KFLAG_INCLD = $(TOOLCHAIN_BIN_DIR)/../lib/gcc/$(TARGET_ARCHITECTURE)/4.6.4/include
ifdef BROADCOM_SVK
ifdef BCM_BME3200_B0
PLX_PCI2LBUS=1
endif
ifdef BCM_BM9600_B0
PLX_PCI2LBUS=1
endif
ifeq ($PLX_PCI2LBUS, 1)
CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE
endif
endif
ifdef DPP_CHIPS
CFLAGS += -DDUNE_BCM -D__DUNE_GTO_BCM_CPU__ -D__DUNE_LINUX_BCM_CPU_PCIE__ -D__DUNE_LINUX_BCM_CPU_PCP_DMA__
CFGFLAGS += -DSOC_CM_FUNCTION
endif
ifdef DFE_CHIPS
CFLAGS += -DDUNE_BCM -D__DUNE_GTO_BCM_CPU__ -D__DUNE_LINUX_BCM_CPU_PCIE__
CFGFLAGS += -DSOC_CM_FUNCTION
endif
ifdef SHADOW_PLX
CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE -DSHADOW_SVK
endif
ifeq (,$(KFLAGS))
KFLAGS := -D__KERNEL__ -m32 -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/generated/uapi/linux/version.h -include $(LINUX_INCLUDE)/generated/autoconf.h -I$(KERNDIR)/arch/powerpc -I$(KERNDIR)/arch/powerpc/include -I$(KERNDIR)/include/asm-powerpc -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -msoft-float -pipe -ffixed-r2 -mmultiple -mno-altivec -funit-at-a-time -Wa,-me500 -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign
endif
ifneq (,$(findstring TCL,$(FEATURE_LIST)))
#LINK_STATIC = 0
#export LINK_STATIC
endif
ifneq ($(targetplat),user)
include ${SDK}/make/Makefile.linux-kernel-4_4
endif

View File

@ -0,0 +1,271 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-gto-2_6,v 1.42 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
# User must select one platform from below.By default WR_LINUX is selected. .
ifeq (,$(BUILD_PLATFORM))
#BUILD_PLATFORM=ELDK
BUILD_PLATFORM=WR_LINUX
endif
# Specify the ELDK version you want to use for building SDK.
ifeq (,$(ELDK_VERSION))
ifeq (ELDK,$(BUILD_PLATFORM))
ELDK_VERSION=4.0
endif
endif
# Specify the KERNEL VERSION you want to use for building SDK.
ifeq (,$(KERN_VER))
ifeq (ELDK,$(BUILD_PLATFORM))
KERN_VER=2.6.21.7
endif
endif
# Specify the Windriver Linux version here.For example '2.0' as shown below.
ifeq (WR_LINUX,$(BUILD_PLATFORM))
ifeq (,$(WRS_LINUX_VERSION))
WRS_LINUX_VERSION=2.0
endif
endif
#glibc_small and glibc_std have their own cross-compilation tools and and path for these tools are different as implemented below. To enable glibc_small build, line given below should be uncommented.
#WRL_GLIBC_SMALL=TRUE
ifeq (2.0,$(WRS_LINUX_VERSION))
ifeq ($(WRL_GLIBC_SMALL),TRUE)
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_small-
endif
KERNDIR ?=/projects/ntsw-tools/linux/wrslinux_2.0/gto/glibc_small/build/linux-2.6.21-standard
else
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_std-
endif
KERNDIR ?= /projects/ntsw-tools/linux/wrslinux_2.0/gto/glibc_std/build/linux-2.6.21-standard
endif
export WRL_GLIBC_SMALL
# After this point glibc_std and glibc_small share these flags
WRLINUX_BASE ?=/tools/windriver/linux_ed/2.0_GA/Linux
TOOLCHAIN_EXEC_PREFIX=$(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2
TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_EXEC_PREFIX)
WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin
WRLINUX_GNU_PATH = $(WRLINUX_BASE)/gnu/4.1-wrlinux-2.0/x86-linux2/bin
override PATH := $(TOOLCHAIN_EXEC_PREFIX):$(KERNDIR)/../../host-cross/bin:$(KERNDIR)/../../host-cross/powerpc-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH)
export TOOLCHAIN_EXEC_PREFIX TOOLCHAIN_BIN_DIR WIND_LIC_PROXY
endif
ifeq (3.0,$(WRS_LINUX_VERSION))
ifeq ($(WRL_GLIBC_SMALL),TRUE)
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_small-
endif
KERNDIR ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_small/build/linux-broadcom_bcm98548xmc-standard-build
KERNDIR_STD ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_small/build/linux
else
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := powerpc-wrs-linux-gnu-ppc_e500v2-glibc_std-
endif
KERNDIR ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_std_debug/build/linux-broadcom_bcm98548xmc-standard-build
KERNDIR_STD ?=/projects/ntsw-tools/linux/wrslinux_3.0/gto/bcm98548xmc_30_glibc_std_debug/build/linux
endif
export WRL_GLIBC_SMALL
# After this point glibc_std and glibc_small share these flags
WRLINUX_BASE ?=/tools/windriver/linux_ed/3.0/Linux
TOOLCHAIN_EXEC_PREFIX=$(WRLINUX_BASE)/wrlinux-3.0/layers/wrll-toolchain-4.3-85/powerpc/toolchain/x86-linux2
TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_EXEC_PREFIX)
WIND_LIC_PROXY=$(WRLINUX_BASE)/setup/x86-linux2/bin
WRLINUX_GNU_PATH = $(WRLINUX_BASE)/wrlinux-3.0/layers/wrll-toolchain-4.3-85/powerpc/toolchain/x86-linux2/bin
override PATH := $(TOOLCHAIN_EXEC_PREFIX):$(KERNDIR_STD)/../../host-cross/bin:$(KERNDIR_STD)/../../host-cross/powerpc-wrs-linux-gnu/bin:$(WRLINUX_GNU_PATH):$(PATH)
export TOOLCHAIN_EXEC_PREFIX TOOLCHAIN_BIN_DIR WIND_LIC_PROXY
LINUX_INCLUDE_STD := $(KERNDIR_STD)/include
endif
ifeq (ELDK,$(BUILD_PLATFORM))
ifeq (2.6.21.7, $(KERN_VER))
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := ppc_85xx-
endif
ifeq (4.0, $(ELDK_VERSION))
override PATH := /tools/eldk/4.0/usr/bin:$(PATH)
else
override PATH := /tools/eldk/4.1/usr/bin:$(PATH)
endif
KERNDIR ?= /projects/ntsw-tools/linux/eldk/gto_eldk/linux-2.6.21.7
endif
endif
ifeq (ELDK,$(BUILD_PLATFORM))
ifeq (2.6.24.4, $(KERN_VER))
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := ppc_85xx-
endif
ifeq (4.0, $(ELDK_VERSION))
override PATH := /tools/eldk/4.0/usr/bin:$(PATH)
else
override PATH := /tools/eldk/4.1/usr/bin:$(PATH)
endif
KERNDIR ?= /projects/ntsw-tools/linux/eldk/gto_eldk/linux-2.6.24.4
endif
endif
ifeq (ELDK,$(BUILD_PLATFORM))
ifeq (2.6.25, $(KERN_VER))
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE := ppc_85xx-
endif
ifeq (4.0, $(ELDK_VERSION))
override PATH := /tools/eldk/4.0/usr/bin:$(PATH)
else
override PATH := /tools/eldk/4.1/usr/bin:$(PATH)
endif
KERNDIR ?= /projects/ntsw-tools/linux/eldk/gto_eldk/linux-2.6.25
endif
endif
# Default Linux include directory
ifeq (,$(LINUX_INCLUDE))
LINUX_INCLUDE := $(KERNDIR)/include
endif
CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1
ENDIAN = BE_HOST=1
CFGFLAGS += -D$(ENDIAN)
CFGFLAGS += -DBCM_PLATFORM_STRING=\"GTO_MPC8548\"
CFGFLAGS += -DSAL_BDE_DMA_MEM_DEFAULT=32
# Extra variables.
EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)
ARCH = powerpc
KBUILD_VERBOSE = 1
export ARCH KBUILD_VERBOSE
# From linux/arch/ppc/Makefile
comma = ,
basetarget = $(basename $(notdir $@))
modname = $(basetarget)
name-fix = $(subst $(comma),_,$(subst -,_,$1))
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
modname_flags = $(if $(filter 1,$(words $(modname))),\
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
ifeq (,$(KFLAG_INCLD))
ifeq (4.0,$(ELDK_VERSION))
ifeq (ELDK,$(BUILD_PLATFORM))
KFLAG_INCLD = /tools/eldk/4.0/usr/lib/gcc/powerpc-linux/4.0.0/include
endif
endif
ifeq (4.1,$(ELDK_VERSION))
ifeq (ELDK,$(BUILD_PLATFORM))
KFLAG_INCLD = /tools/eldk/4.1/usr/lib/gcc/powerpc-linux/4.0.0/include
endif
endif
ifeq (2.0,$(WRS_LINUX_VERSION))
KFLAG_INCLD = $(WRLINUX_GNU_PATH)/../lib/gcc/powerpc-wrs-linux-gnu/4.1.2/include
endif
ifeq (3.0,$(WRS_LINUX_VERSION))
KFLAG_INCLD = $(WRLINUX_GNU_PATH)/../lib/gcc/powerpc-wrs-linux-gnu/4.3.2/include
endif
endif
ifdef BROADCOM_SVK
ifdef BCM_BME3200_B0
PLX_PCI2LBUS=1
endif
ifdef BCM_BM9600_B0
PLX_PCI2LBUS=1
endif
ifeq ($PLX_PCI2LBUS, 1)
CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE
endif
endif
ifdef DPP_CHIPS
CFLAGS += -DDUNE_BCM -D__DUNE_LINUX_BCM_CPU_PCP_DMA__
CFGFLAGS += -DSOC_CM_FUNCTION
endif
ifdef DFE_CHIPS
CFLAGS += -DDUNE_BCM
CFGFLAGS += -DSOC_CM_FUNCTION
endif
ifdef SAND_CHIPS
CFLAGS += -D__DUNE_GTO_BCM_CPU__ -D__DUNE_LINUX_BCM_CPU_PCIE__
endif
ifdef SHADOW_PLX
CFLAGS += -DBCM_PLX9656_LOCAL_BUS -DBDE_LINUX_NON_INTERRUPTIBLE -DSHADOW_SVK
endif
ifeq (,$(KFLAGS))
KFLAGS := -D__KERNEL__ -m32 -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/linux/version.h -include $(LINUX_INCLUDE)/generated/autoconf.h -I$(KERNDIR)/arch/powerpc -I$(KERNDIR)/arch/powerpc -I$(KERNDIR)/arch/powerpc/include -I$(KERNDIR)/include/asm-powerpc -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -msoft-float -pipe -ffixed-r2 -mmultiple -mno-altivec -funit-at-a-time -Wa,-me500 -fomit-frame-pointer -Wdeclaration-after-statement -Wno-pointer-sign
endif
#Wind river Linux 3.0 needs addtional flags
ifeq (3.0,$(WRS_LINUX_VERSION))
# Use MSI interrupts if kernel is compiled with MSI support.
#CFLAGS += -DBDE_LINUX_USE_MSI_INTERRUPT
KFLAGS += -I$(LINUX_INCLUDE_STD) -I$(KERNDIR_STD)/arch/powerpc -I$(KERNDIR_STD)/arch/powerpc/include -I$(KERNDIR_STD)/include.asm-powerpc -mno-spe
endif
ifneq ($(targetplat),user)
include ${SDK}/make/Makefile.linux-kernel-2_6
endif

View File

@ -0,0 +1,93 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-iproc Exp $
# $Copyright: (c) 2007 Broadcom Corp.
# All Rights Reserved.$
# Makefile for iproc-CMICd
# User must select one platform from below.By default ARM_LINUX is selected. .
ifeq (,$(BUILD_PLATFORM))
BUILD_PLATFORM=ARM_LINUX
endif
# TOOLCHAIN_BASE_DIR Toolchain base directory for iPROC-CMICd devices
# TARGET_ARCHITECTURE Compiler for target architecture
# KERNDIR Kernel directory for iPROC-CMICd devices
ifeq (BE,$(ENDIAN_MODE))
TOOLCHAIN_BASE_DIR ?= /projects/ntsw-tools/linux/iproc_ldks/iproc-be/XLDK
TARGET_ARCHITECTURE:=armeb-broadcom-linux-uclibcgnueabi
KERNDIR ?= $(TOOLCHAIN_BASE_DIR)/kernel/linux
else
TOOLCHAIN_BASE_DIR ?= /projects/ntsw-tools/linux/iproc_ldks/iproc/XLDK
TARGET_ARCHITECTURE:= arm-broadcom-linux-uclibcgnueabi
KERNDIR ?= $(TOOLCHAIN_BASE_DIR)/kernel/linux
endif
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE:= $(TARGET_ARCHITECTURE)-
endif
# arm9tools
TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_BASE_DIR)/buildroot/host/usr/bin
override PATH:=$(TOOLCHAIN_BASE_DIR)/buildroot/host/usr/$(TARGET_ARCHITECTURE)/bin:$(TOOLCHAIN_BIN_DIR):$(PATH)
LD_LIBRARY_PATH=$(TOOLCHAIN_BASE_DIR)/buildroot/host/usr/lib
export TOOLCHAIN_BIN_DIR LD_LIBRARY_PATH
# Default Linux include directory
ifeq (,$(LINUX_INCLUDE))
LINUX_INCLUDE := $(KERNDIR)/include
endif
ifeq (BE,$(ENDIAN_MODE))
CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1
ENDIAN = BE_HOST=1
else
CFGFLAGS += -DSYS_BE_PIO=0 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=0
ENDIAN = LE_HOST=1
endif
CFGFLAGS += -D$(ENDIAN) -DIPROC_CMICD
CFGFLAGS += -DBCM_PLATFORM_STRING=\"IPROC_CMICD\"
ARCH = arm
KBUILD_VERBOSE = 1
export ARCH KBUILD_VERBOSE
comma = ,
basetarget = $(basename $(notdir $@))
modname = $(basetarget)
# Extra variables.
EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)
name-fix = $(subst $(comma),_,$(subst -,_,$1))
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
modname_flags = $(if $(filter 1,$(words $(modname))),\
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
KFLAG_INCLD ?= $(TOOLCHAIN_BASE_DIR)/buildroot/host/usr/lib/gcc/$(TARGET_ARCHITECTURE)/4.9.3/include
ifeq (,$(KFLAGS))
KFLAGS := -D__LINUX_ARM_ARCH__=7 -D__KERNEL__ -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/generated/autoconf.h -I$(KERNDIR)/arch/arm/include -I$(KERNDIR)/arch/arm/include/generated -I$(KERNDIR)/arch/arm/mach-iproc/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -marm -mabi=aapcs-linux -fno-pic -pipe -msoft-float -ffreestanding -march=armv7-a -mfpu=vfp -mfloat-abi=softfp -fomit-frame-pointer -g -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -mlong-calls
KFLAGS += -I$(LINUX_INCLUDE)/uapi -I$(LINUX_INCLUDE)/generated/uapi -I$(KERNDIR)/arch/arm/include/uapi -I$(KERNDIR)/arch/arm/include/generated/uapi
endif
ifneq ($(targetplat),user)
include ${SDK}/make/Makefile.linux-kernel-3_6
endif

View File

@ -0,0 +1,104 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-iproc-3_6,v 1.1 Broadcom SDK $
# $Copyright: (c) 2007 Broadcom Corp.
# All Rights Reserved.$
# Makefile for iproc-CMICd
# User must select one platform from below.By default ARM_LINUX is selected. .
ifeq (,$(BUILD_PLATFORM))
BUILD_PLATFORM=ARM_LINUX
endif
# TOOLCHAIN_BASE_DIR Toolchain base directory for iPROC-CMICd devices
# TARGET_ARCHITECTURE Compiler for target architecture
# KERNDIR Kernel directory for iPROC-CMICd devices
ifeq (BE,$(ENDIAN_MODE))
TOOLCHAIN_BASE_DIR ?= /projects/ntsw-tools/linux/iproc_ldks/xldk37-be/buildroot-2013.11-gcc48-opt-broadcom
TARGET_ARCHITECTURE:=armeb-buildroot-linux-gnueabi
KERNDIR ?= /projects/ntsw-tools/linux/iproc_ldks/xldk37-be/XLDK/kernel/linux
else
TOOLCHAIN_BASE_DIR ?= /projects/ntsw-tools/linux/iproc_ldks/xldk37/XLDK
TARGET_ARCHITECTURE:= arm-broadcom-linux-uclibcgnueabi
KERNDIR ?= $(TOOLCHAIN_BASE_DIR)/kernel/linux
endif
ifeq (,$(CROSS_COMPILE))
CROSS_COMPILE:= $(TARGET_ARCHITECTURE)-
endif
# arm9tools
ifeq (BE,$(ENDIAN_MODE))
TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_BASE_DIR)/host/usr/bin
override PATH:=$(TOOLCHAIN_BASE_DIR)/host/usr/$(TARGET_ARCHITECTURE)/bin:$(TOOLCHAIN_BIN_DIR):$(PATH)
LD_LIBRARY_PATH=$(TOOLCHAIN_BASE_DIR)/host/usr/lib
else
TOOLCHAIN_BIN_DIR=$(TOOLCHAIN_BASE_DIR)/buildroot/usr/bin
override PATH:=$(TOOLCHAIN_BASE_DIR)/buildroot/usr/$(TARGET_ARCHITECTURE)/bin:$(TOOLCHAIN_BIN_DIR):$(PATH)
LD_LIBRARY_PATH=$(TOOLCHAIN_BASE_DIR)/buildroot/usr/lib
endif
export TOOLCHAIN_BIN_DIR LD_LIBRARY_PATH
# Default Linux include directory
ifeq (,$(LINUX_INCLUDE))
LINUX_INCLUDE := $(KERNDIR)/include
endif
ifeq (BE,$(ENDIAN_MODE))
CFGFLAGS += -DSYS_BE_PIO=1 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=1
ENDIAN = BE_HOST=1
else
CFGFLAGS += -DSYS_BE_PIO=0 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=0
ENDIAN = LE_HOST=1
endif
CFGFLAGS += -D$(ENDIAN) -DIPROC_CMICD
CFGFLAGS += -DBCM_PLATFORM_STRING=\"IPROC_CMICD\"
ARCH = arm
KBUILD_VERBOSE = 1
export ARCH KBUILD_VERBOSE
comma = ,
basetarget = $(basename $(notdir $@))
modname = $(basetarget)
# Extra variables.
EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)
name-fix = $(subst $(comma),_,$(subst -,_,$1))
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
modname_flags = $(if $(filter 1,$(words $(modname))),\
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
ifeq (BE,$(ENDIAN_MODE))
KFLAG_INCLD ?= $(TOOLCHAIN_BASE_DIR)/host/usr/lib/gcc/$(TARGET_ARCHITECTURE)/4.8.2/include
else
KFLAG_INCLD ?= $(TOOLCHAIN_BASE_DIR)/buildroot/usr/lib/gcc/$(TARGET_ARCHITECTURE)/4.7.2/include
endif
ifeq (,$(KFLAGS))
KFLAGS := -D__LINUX_ARM_ARCH__=7 -D__KERNEL__ -nostdinc -isystem $(KFLAG_INCLD) -I$(LINUX_INCLUDE) -include $(LINUX_INCLUDE)/generated/autoconf.h -I$(KERNDIR)/arch/arm/include -I$(KERNDIR)/arch/arm/include/generated -I$(KERNDIR)/arch/arm/mach-northstar/include -I$(KERNDIR)/arch/arm/plat-iproc/include -Wall -Wstrict-prototypes -Wno-trigraphs -Os -fno-strict-aliasing -fno-common -marm -mabi=aapcs-linux -fno-pic -pipe -msoft-float -ffreestanding -march=armv7-a -mfpu=vfp -mfloat-abi=softfp -fomit-frame-pointer -g -fno-stack-protector -Wdeclaration-after-statement -Wno-pointer-sign -mlong-calls
KFLAGS += -I$(LINUX_INCLUDE)/uapi -I$(LINUX_INCLUDE)/generated/uapi -I$(KERNDIR)/arch/arm/include/uapi -I$(KERNDIR)/arch/arm/include/generated/uapi
endif
ifneq ($(targetplat),user)
include ${SDK}/make/Makefile.linux-kernel-3_6
endif

View File

@ -0,0 +1,113 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-kernel,v 1.27 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
# Configuration Flags
# Filter out features that cannot or should not be supported in kernel mode
_FEATURE_EXCLUDE_LIST += EDITLINE TCL OOB_RCPU CINT APIMODE DUNE_UI C_UNIT
FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
# Tools
CC = $(CROSS_COMPILE)gcc
CXX = $(CROSS_COMPILE)g++
LD = $(CROSS_COMPILE)ld
AR = $(CROSS_COMPILE)ar
ARFLAGS = -rc
STRIP = $(CROSS_COMPILE)strip
RANLIB = $(CROSS_COMPILE)ranlib
OBJCOPY = $(CROSS_COMPILE)objcopy
# Handle differences between gcc 2.x and gcc 3.x
gcc-tune-flag = $(shell if ${CC} -dumpspecs | grep mcpu >/dev/null; then echo cpu; else echo tune; fi)
# Configuration Variables
# OSType Defines: This defines the type of RTOS or microkernel which you
# are compiling the SAL (and its associated driver) for. New platforms
# can be created by porting the routines (system.c) to your platform and
# adding the define in this Makefile.
OSTYPE = LINUX
#
# ORIGIN is used to Optionally select different CFLAGS. It is used to import
# source from other vendors. If SOURCE=Broadcom, then the BCM_ flags are added
# to those passed to the compiler. If SOURCE != Broadcom, BCM_ flags are NOT
# added.
#
# Default specifies Broadcom
#
ifndef ORIGIN
ORIGIN = Broadcom
endif
#
# STD_{C|CPP|CXX}FLAGS - Standard flags used by ALL compilations
# BCM_{C|CPP|CXX}FLAGS - Flags used for Broadcom source files
# OPT_{C|CPP|CXX}FLAGS - Defined in local make files BEFORE inclusion of
# this Makefile, to define local "Extra" flags.
#
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE)
CFGFLAGS += -DNO_FILEIO -DNO_CTRL_C -DNO_MEMTUNE
CFGFLAGS += -D$(OSTYPE)
# No user sal for the linux kernel
# NO_SAL_APPL=1
STD_CFLAGS = $(KFLAGS) $(CFGFLAGS)
STD_CPPFLAGS = ${STD_CFLAGS}
STD_CXXFLAGS = ${STD_CFLAGS}
BCM_CFLAGS = -Wall -Werror
BCM_CPPFLAGS = ${BCM_CFLAGS}
BCM_CXXFLAGS = ${BCM_CFLAGS}
ifeq (${ORIGIN}, Broadcom)
CFLAGS += ${STD_CFLAGS} ${BCM_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${BCM_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${BCM_CXXFLAGS} ${OPT_CXXFLAGS}
else
CFLAGS += ${STD_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${OPT_CXXFLAGS}
endif
#
# Ignore pedantic flag for kernel modules
#
ifdef DEBUG_PEDANTIC
DEBUG_PEDANTIC = FALSE
endif
#
# DEPEND is used as a command to generate the list of dependencies.
# The format of the output must be
# "file.o : file.c a/b/c.h d/e/f.h ...",
# if it is on multiple lines, each line must end in a backslash.
# The output MUST be on standard out.
#
DEPEND = ${CC} -M $(CFLAGS) $<

View File

@ -0,0 +1,149 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-kernel-2_6,v 1.40 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
# Configuration Flags
# Filter out features that cannot or should not be supported in kernel mode
_FEATURE_EXCLUDE_LIST += EDITLINE TCL OOB_RCPU CINT APIMODE DUNE_UI C_UNIT
FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
# Tools
# Conditionally Replaces DEFAULT var
ifeq ($(origin CC),default)
CC = $(LSRUN) $(CROSS_COMPILE)gcc
endif
ifeq ($(origin CXX),default)
CXX = $(CROSS_COMPILE)g++
endif
ifeq ($(origin LD),default)
LD = $(CROSS_COMPILE)ld
endif
ifeq ($(origin AR),default)
AR = $(CROSS_COMPILE)ar
endif
ifeq ($(origin AS),default)
AS = $(CROSS_COMPILE)as
endif
ifeq ($(origin ARFLAGS),default)
ARFLAGS = -rc
endif
STRIP = $(CROSS_COMPILE)strip
RANLIB = $(CROSS_COMPILE)ranlib
OBJCOPY = $(CROSS_COMPILE)objcopy
NM = $(CROSS_COMPILE)nm
# Handle differences between gcc 2.x and gcc 3.x
gcc-tune-flag = $(shell if ${CC} -dumpspecs | grep mcpu >/dev/null; then echo cpu; else echo tune; fi)
# Configuration Variables
# OSType Defines: This defines the type of RTOS or microkernel which you
# are compiling the SAL (and its associated driver) for. New platforms
# can be created by porting the routines (system.c) to your platform and
# adding the define in this Makefile.
OSTYPE = LINUX
#
# ORIGIN is used to Optionally select different CFLAGS. It is used to import
# source from other vendors. If SOURCE=Broadcom, then the BCM_ flags are added
# to those passed to the compiler. If SOURCE != Broadcom, BCM_ flags are NOT
# added.
#
# Default specifies Broadcom
#
ifndef ORIGIN
ORIGIN = Broadcom
endif
#
# STD_{C|CPP|CXX}FLAGS - Standard flags used by ALL compilations
# BCM_{C|CPP|CXX}FLAGS - Flags used for Broadcom source files
# OPT_{C|CPP|CXX}FLAGS - Defined in local make files BEFORE inclusion of
# this Makefile, to define local "Extra" flags.
#
ifdef IPROC_BUILD
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE) \
-I$(KERNDIR)/arch/$(ARCH)
else
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE) \
-I$(LINUX_INCLUDE)/asm/gcc \
-I$(LINUX_INCLUDE)/asm/mach-generic \
-I$(KERNDIR)/arch/$(ARCH)
endif
CFGFLAGS += -DNO_FILEIO -DNO_CTRL_C -DNO_MEMTUNE
CFGFLAGS += -D$(OSTYPE)
# No user sal for the linux kernel
# NO_SAL_APPL=1
STD_CFLAGS = $(KFLAGS) $(CFGFLAGS)
STD_CPPFLAGS = ${STD_CFLAGS}
STD_CXXFLAGS = ${STD_CFLAGS}
ifndef BCM_CFLAGS
BCM_CFLAGS = -Wall -Werror
endif
BCM_CPPFLAGS = ${BCM_CFLAGS}
BCM_CXXFLAGS = ${BCM_CFLAGS}
ifeq (${ORIGIN}, Broadcom)
CFLAGS += ${STD_CFLAGS} ${BCM_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${BCM_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${BCM_CXXFLAGS} ${OPT_CXXFLAGS}
else
CFLAGS += ${STD_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${OPT_CXXFLAGS}
endif
#
# Ignore pedantic flag for kernel modules
#
ifdef DEBUG_PEDANTIC
DEBUG_PEDANTIC = FALSE
endif
#
# DEPEND is used as a command to generate the list of dependencies.
# The format of the output must be
# "file.o : file.c a/b/c.h d/e/f.h ...",
# if it is on multiple lines, each line must end in a backslash.
# The output MUST be on standard out.
#
DEPEND = ${CC} -M $(CFLAGS) $<

View File

@ -0,0 +1,149 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-kernel-3_6,v 1.2 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
# Configuration Flags
# Filter out features that cannot or should not be supported in kernel mode
_FEATURE_EXCLUDE_LIST += EDITLINE TCL OOB_RCPU CINT APIMODE DUNE_UI
FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
# Tools
# Conditionally Replaces DEFAULT var
ifeq ($(origin CC),default)
CC = $(LSRUN) $(CROSS_COMPILE)gcc
endif
ifeq ($(origin CXX),default)
CXX = $(CROSS_COMPILE)g++
endif
ifeq ($(origin LD),default)
LD = $(CROSS_COMPILE)ld
endif
ifeq ($(origin AR),default)
AR = $(CROSS_COMPILE)ar
endif
ifeq ($(origin AS),default)
AS = $(CROSS_COMPILE)as
endif
ifeq ($(origin ARFLAGS),default)
ARFLAGS = -rc
endif
STRIP = $(CROSS_COMPILE)strip
RANLIB = $(CROSS_COMPILE)ranlib
OBJCOPY = $(CROSS_COMPILE)objcopy
NM = $(CROSS_COMPILE)nm
# Handle differences between gcc 2.x and gcc 3.x
gcc-tune-flag = $(shell if ${CC} -dumpspecs | grep mcpu >/dev/null; then echo cpu; else echo tune; fi)
# Configuration Variables
# OSType Defines: This defines the type of RTOS or microkernel which you
# are compiling the SAL (and its associated driver) for. New platforms
# can be created by porting the routines (system.c) to your platform and
# adding the define in this Makefile.
OSTYPE = LINUX
#
# ORIGIN is used to Optionally select different CFLAGS. It is used to import
# source from other vendors. If SOURCE=Broadcom, then the BCM_ flags are added
# to those passed to the compiler. If SOURCE != Broadcom, BCM_ flags are NOT
# added.
#
# Default specifies Broadcom
#
ifndef ORIGIN
ORIGIN = Broadcom
endif
#
# STD_{C|CPP|CXX}FLAGS - Standard flags used by ALL compilations
# BCM_{C|CPP|CXX}FLAGS - Flags used for Broadcom source files
# OPT_{C|CPP|CXX}FLAGS - Defined in local make files BEFORE inclusion of
# this Makefile, to define local "Extra" flags.
#
ifdef IPROC_BUILD
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE) \
-I$(KERNDIR)/arch/$(ARCH)
else
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE) \
-I$(LINUX_INCLUDE)/asm/gcc \
-I$(LINUX_INCLUDE)/asm/mach-generic \
-I$(KERNDIR)/arch/$(ARCH)
endif
CFGFLAGS += -DNO_FILEIO -DNO_CTRL_C -DNO_MEMTUNE
CFGFLAGS += -D$(OSTYPE)
# No user sal for the linux kernel
# NO_SAL_APPL=1
STD_CFLAGS = $(KFLAGS) $(CFGFLAGS)
STD_CPPFLAGS = ${STD_CFLAGS}
STD_CXXFLAGS = ${STD_CFLAGS}
ifndef BCM_CFLAGS
BCM_CFLAGS = -Wall -Werror
endif
BCM_CPPFLAGS = ${BCM_CFLAGS}
BCM_CXXFLAGS = ${BCM_CFLAGS}
ifeq (${ORIGIN}, Broadcom)
CFLAGS += ${STD_CFLAGS} ${BCM_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${BCM_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${BCM_CXXFLAGS} ${OPT_CXXFLAGS}
else
CFLAGS += ${STD_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${OPT_CXXFLAGS}
endif
#
# Ignore pedantic flag for kernel modules
#
ifdef DEBUG_PEDANTIC
DEBUG_PEDANTIC = FALSE
endif
#
# DEPEND is used as a command to generate the list of dependencies.
# The format of the output must be
# "file.o : file.c a/b/c.h d/e/f.h ...",
# if it is on multiple lines, each line must end in a backslash.
# The output MUST be on standard out.
#
DEPEND = ${CC} -M $(CFLAGS) $<

View File

@ -0,0 +1,158 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-kernel-2_6,v 1.40 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
# Configuration Flags
# Filter out features that cannot or should not be supported in kernel mode
_FEATURE_EXCLUDE_LIST += EDITLINE TCL OOB_RCPU CINT APIMODE DUNE_UI C_UNIT
FEATURE_EXCLUDE_LIST = $(sort $(_FEATURE_EXCLUDE_LIST))
# Tools
# Conditionally Replaces DEFAULT var
ifeq ($(origin CC),default)
CC = $(LSRUN) $(CROSS_COMPILE)gcc
endif
ifeq ($(origin CXX),default)
CXX = $(CROSS_COMPILE)g++
endif
ifeq ($(origin LD),default)
LD = $(CROSS_COMPILE)ld
endif
ifeq ($(origin AR),default)
AR = $(CROSS_COMPILE)ar
endif
ifeq ($(origin AS),default)
AS = $(CROSS_COMPILE)as
endif
ifeq ($(origin ARFLAGS),default)
ARFLAGS = -rc
endif
STRIP = $(CROSS_COMPILE)strip
RANLIB = $(CROSS_COMPILE)ranlib
OBJCOPY = $(CROSS_COMPILE)objcopy
NM = $(CROSS_COMPILE)nm
# Handle differences between gcc 2.x and gcc 3.x
gcc-tune-flag = $(shell if ${CC} -dumpspecs | grep mcpu >/dev/null; then echo cpu; else echo tune; fi)
# Configuration Variables
# OSType Defines: This defines the type of RTOS or microkernel which you
# are compiling the SAL (and its associated driver) for. New platforms
# can be created by porting the routines (system.c) to your platform and
# adding the define in this Makefile.
OSTYPE = LINUX
#
# ORIGIN is used to Optionally select different CFLAGS. It is used to import
# source from other vendors. If SOURCE=Broadcom, then the BCM_ flags are added
# to those passed to the compiler. If SOURCE != Broadcom, BCM_ flags are NOT
# added.
#
# Default specifies Broadcom
#
ifndef ORIGIN
ORIGIN = Broadcom
endif
#
# STD_{C|CPP|CXX}FLAGS - Standard flags used by ALL compilations
# BCM_{C|CPP|CXX}FLAGS - Flags used for Broadcom source files
# OPT_{C|CPP|CXX}FLAGS - Defined in local make files BEFORE inclusion of
# this Makefile, to define local "Extra" flags.
#
ifdef IPROC_BUILD
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE) \
-I$(LINUX_INCLUDE)/uapi \
-I$(LINUX_INCLUDE)/generated/uapi \
-I$(KERNDIR)/arch/$(ARCH) \
-I$(KERNDIR)/arch/$(ARCH)/include/uapi \
-I$(KERNDIR)/arch/$(ARCH)/include/generated \
-I$(KERNDIR)/arch/$(ARCH)/include/generated/uapi
else
CFGFLAGS += -I$(SDK)/systems/linux/kernel/modules/include \
-I$(SDK)/systems/bde/linux/include \
-I$(LINUX_INCLUDE) \
-I$(LINUX_INCLUDE)/asm/gcc \
-I$(LINUX_INCLUDE)/asm/mach-generic \
-I$(LINUX_INCLUDE)/uapi \
-I$(LINUX_INCLUDE)/generated/uapi \
-I$(KERNDIR)/arch/$(ARCH) \
-I$(KERNDIR)/arch/$(ARCH)/include/uapi \
-I$(KERNDIR)/arch/$(ARCH)/include/generated \
-I$(KERNDIR)/arch/$(ARCH)/include/generated/uapi
endif
CFGFLAGS += -DNO_FILEIO -DNO_CTRL_C -DNO_MEMTUNE
CFGFLAGS += -D$(OSTYPE)
# No user sal for the linux kernel
# NO_SAL_APPL=1
STD_CFLAGS = $(KFLAGS) $(CFGFLAGS)
STD_CPPFLAGS = ${STD_CFLAGS}
STD_CXXFLAGS = ${STD_CFLAGS}
ifndef BCM_CFLAGS
BCM_CFLAGS = -Wall -Werror
endif
BCM_CPPFLAGS = ${BCM_CFLAGS}
BCM_CXXFLAGS = ${BCM_CFLAGS}
ifeq (${ORIGIN}, Broadcom)
CFLAGS += ${STD_CFLAGS} ${BCM_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${BCM_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${BCM_CXXFLAGS} ${OPT_CXXFLAGS}
else
CFLAGS += ${STD_CFLAGS} ${OPT_CFLAGS}
CPPFLAGS += ${STD_CPPFLAGS} ${OPT_CPPFLAGS}
CXXFLAGS += ${STD_CXXFLAGS} ${OPT_CXXFLAGS}
endif
#
# Ignore pedantic flag for kernel modules
#
ifdef DEBUG_PEDANTIC
DEBUG_PEDANTIC = FALSE
endif
#
# DEPEND is used as a command to generate the list of dependencies.
# The format of the output must be
# "file.o : file.c a/b/c.h d/e/f.h ...",
# if it is on multiple lines, each line must end in a backslash.
# The output MUST be on standard out.
#
DEPEND = ${CC} -M $(CFLAGS) $<

View File

@ -0,0 +1,82 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-kmodule-3_6,v 1.2 Broadcom SDK $
# $Copyright: (c) 2006 Broadcom Corp.
# All Rights Reserved.$
# Due to the extensive use of driver libraries, the SDK usually builds
# kernel modules from a precompiled object. To avoid various warnings
# and conflicts, the pre-compiled object must be named differently
# from the target module, and the object file itself should be
# appended with "_shipped".
# If a module exports any symbols, then the exporting source file must
# be compiled within the kernel source tree for correct generation of
# module symbol versions. The symbol source file should be passed to
# this Makefile via the MODULE_SYM variable.
MODULE := $(MOD_NAME).o
KMODULE := $(MOD_NAME).ko
PRE_COMPILED_OBJ := obj_$(MOD_NAME).o
obj-m := $(MODULE)
$(MOD_NAME)-y := $(MODULE_SYM) $(PRE_COMPILED_OBJ)
ifeq (,$(CROSS_COMPILE))
export CROSS_COMPILE
endif
SAVE_CFLAGS := ${CFLAGS}
include $(SDK)/make/Make.config
PWD := $(shell pwd)
ifneq ($(ARCH),)
# ELDK does not seem to `automatically' define ARCH where other gccs may
A := ARCH=$(ARCH)
export ARCH
endif
# Provide an option in case kernel was built in separate directory
KERNBLDDIR ?= $(KERNDIR)
# Standard SDK include path for building source files that export
# kernel symbols.
override EXTRA_CFLAGS = -I${SDK}/include -I${SDK}/systems/linux/kernel/modules/include -I${SDK}/systems/bde/linux/include
# The precopiled object needs a dummy command file to avoid warnings
# from the Kbuild scripts (modpost stage).
# Kernels before 2.6.17 do not support external module symbols files,
# so we create a dummy to prevent build failures.
$(KMODULE):
rm -f *.o *.ko .*.cmd
rm -fr .tmp_versions
ln -s $(LIBDIR)/$(MODULE) $(PRE_COMPILED_OBJ)_shipped
echo "suppress warning" > .$(PRE_COMPILED_OBJ).cmd
$(MAKE) -C $(KERNBLDDIR) CROSS_COMPILE=$(CROSS_COMPILE) M=$(PWD) modules
if [ ! -f Module.symvers ]; then echo "old kernel (pre-2.6.17)" > Module.symvers; fi
cp -f $(KMODULE) $(LIBDIR)
rm -f $(PRE_COMPILED_OBJ)_shipped
EXTRA_CFLAGS = $(CFLAGS)
CFLAGS := ${SAVE_CFLAGS}

View File

@ -0,0 +1,45 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-x86-common-2_6,v 1.13 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
CFGFLAGS += -DSYS_BE_PIO=0 -DSYS_BE_PACKET=0 -DSYS_BE_OTHER=0
ENDIAN = LE_HOST=1
CFGFLAGS += -D$(ENDIAN)
CFGFLAGS += -DBCM_PLATFORM_STRING=\"X86\"
ifeq (,$(findstring -DSAL_BDE_DMA_MEM_DEFAULT,$(CFGFLAGS)))
CFGFLAGS += -DSAL_BDE_DMA_MEM_DEFAULT=16
endif
# Extra variables.
EXTRA_CFLAGS = -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags)
comma = ,
basetarget = $(basename $(notdir $@))
modname = $(basetarget)
name-fix = $(subst $(comma),_,$(subst -,_,$1))
basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))"
modname_flags = $(if $(filter 1,$(words $(modname))),\
-D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))")
ifneq ($(targetplat),user)
# By default we exclude -Werror from x86 kernel builds
BCM_CFLAGS = -Wall
include ${SDK}/make/Makefile.linux-kernel-2_6
endif

View File

@ -0,0 +1,52 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-x86-generic-common-2_6,v 1.2 Broadcom SDK $
# $Copyright: (c) 2008 Broadcom Corp.
# All Rights Reserved.$
# Default kernel source directory
ifeq (,$(KERNDIR))
KERNDIR := /lib/modules/$(shell uname -r)/build
export KERNDIR
endif
# Default architecture
ifeq (,$(ARCH))
ARCH = $(shell uname -p)
ifneq (x86_64,$(ARCH))
ARCH = i386
endif
endif
# Noisy kernel build
KBUILD_VERBOSE = 1
export ARCH KBUILD_VERBOSE KERNDIR
# Default Linux include directory
ifeq (,$(LINUX_INCLUDE))
LINUX_INCLUDE := $(KERNDIR)/include
endif
# autoconf.h was moved in later kernels
AUTOCONF = $(KERNDIR)/include/generated/autoconf.h
ifeq (,$(shell ls $(AUTOCONF) 2>/dev/null))
AUTOCONF = $(KERNDIR)/include/linux/autoconf.h
endif
# gcc system include path
SYSINC = $(shell gcc -print-search-dirs | grep install | cut -c 10-)include

View File

@ -0,0 +1,45 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# $Id: Makefile.linux-x86-smp_generic_64-2_6,v 1.5 Broadcom SDK $
# $Copyright: (c) 2008 Broadcom Corp.
# All Rights Reserved.$
CFGFLAGS += -DLONGS_ARE_64BITS
CFGFLAGS += -DPTRS_ARE_64BITS
CFGFLAGS += -DPHYS_ADDRS_ARE_64BITS
CFGFLAGS += -DSAL_SPL_LOCK_ON_IRQ
include ${SDK}/make/Makefile.linux-x86-generic-common-2_6
ifeq (,$(KFLAGS))
KFLAGS := -nostdinc -isystem $(SYSINC) -I$(KERNDIR)/include -I$(KERNDIR)/arch/x86/include -include $(AUTOCONF) -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -Werror-implicit-function-declaration -Wno-format-security -fno-delete-null-pointer-checks -Os -m64 -mtune=generic -mno-red-zone -mcmodel=kernel -funit-at-a-time -maccumulate-outgoing-args -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1 -pipe -Wno-sign-compare -fno-asynchronous-unwind-tables -mno-sse -mno-mmx -mno-sse2 -mno-3dnow -fno-stack-protector -fomit-frame-pointer -g -Wdeclaration-after-statement -Wno-pointer-sign
endif
KFLAGS += -I$(LINUX_INCLUDE)/uapi -I$(LINUX_INCLUDE)/generated/uapi -I$(KERNDIR)/arch/x86/include/generated -I$(KERNDIR)/arch/x86/include/uapi -I$(KERNDIR)/arch/x86/include/generated/uapi
ifeq ($(LINUX_MAKE_SHARED_LIB),1)
KFLAGS += -fPIC -mcmodel=small
else
KFLAGS += -mcmodel=kernel -fno-pie
endif
ifeq (1,$(DEBIAN_LINUX_HEADER))
KERNDIR_COMMON := $(subst amd64,common,$(KERNDIR))
KFLAGS += -I$(KERNDIR_COMMON)/include -I$(KERNDIR_COMMON)/include/uapi -I$(KERNDIR_COMMON)/arch/x86/include -I$(KERNDIR_COMMON)/arch/x86/include/uapi
endif
include ${SDK}/make/Makefile.linux-x86-common-2_6

View File

@ -0,0 +1,13 @@
[Unit]
Description=Opennsl kernel modules init
After=local-fs.target
Before=syncd.service
[Service]
Type=oneshot
ExecStart=-/etc/init.d/opennsl-modules-4.9.0-5-amd64 start
ExecStop=-/etc/init.d/opennsl-modules-4.9.0-5-amd64 stop
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,275 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/***********************************************************************
*
* $Id: linux-bde.h,v 1.24 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*
* Linux Broadcom Device Enumerators
*
*
* There are two Linux BDEs:
*
* 1. Linux Kernel BDE
*
* This is a kernel module implementing a BDE
* for the driver running as part of the kernel.
*
* It manages the devices through the linux PCI interfaces,
* and manages a chunk of contiguous, boot-time allocated
* DMA memory. This is all that is needed if the BCM driver
* is run as part of the kernel (in another module).
*
* 2. Linux User BDE
*
* This is a kernel module and userland library which implement
* a complete BDE for applications running in userland.
*
* The kernel module relies upon the real kernel bde,
* and allows a user space application (through the user library)
* to talk directly to the devices. It also virtualized the device
* interrupts, so the entire driver can be run as a userspace
* application.
*
* While this causes a significant degradation in performance,
* because the system runs as a user application, the development
* and debugging process is about a gillion times easier.
* After the core logic is debugged, it can be retargeted using
* only the kernel bde and run in the kernel.
*
*
**********************************************************************/
#ifndef __LINUX_BDE_H__
#define __LINUX_BDE_H__
#include <sal/types.h>
#include <ibde.h>
/*
* Device Major Numbers
*
* The kernel and user bdes need unique major numbers
* on systems that do not use devfs.
*
* They are defined here, along with the module names,
* to document them if you need to mknod them (or open) them,
* and to keep them unique.
*
*/
#include <linux/version.h>
#ifdef __KERNEL__
#include <linux/types.h>
/* Key stone and Raptor has 2.6.21 but don't have definition */
#if defined(KEYSTONE) || defined(RAPTOR)
#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21))
#ifdef PHYS_ADDRS_ARE_64BITS
typedef u64 phys_addr_t;
#else
typedef u32 phys_addr_t;
#endif
#endif
#endif
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15))
#define LINUX_BDE_DMA_DEVICE_SUPPORT
#endif
#define LINUX_KERNEL_BDE_NAME "linux-kernel-bde"
#define LINUX_KERNEL_BDE_MAJOR 127
#define LINUX_USER_BDE_NAME "linux-user-bde"
#define LINUX_USER_BDE_MAJOR 126
/* Max devices */
/* 16 switch chips + 2 out-of-band Ethernet + 2 CPUs */
#define LINUX_BDE_MAX_SWITCH_DEVICES 16
#define LINUX_BDE_MAX_ETHER_DEVICES 2
#define LINUX_BDE_MAX_CPU_DEVICES 2
#define LINUX_BDE_MAX_DEVICES (LINUX_BDE_MAX_SWITCH_DEVICES + \
LINUX_BDE_MAX_ETHER_DEVICES + \
LINUX_BDE_MAX_CPU_DEVICES)
/*
* PCI devices will be initialized by the Linux Kernel,
* regardless of architecture.
*
* You need only provide bus endian settings.
*/
typedef struct linux_bde_bus_s {
int be_pio;
int be_packet;
int be_other;
} linux_bde_bus_t;
/* Device state used for PCI hot swap case. */
/*
* BDE_DEV_STATE_NORMAL : A device is probed normally. Or when the device
* resource has been updated after "CHANGED", the state will move back to
* "NORMAL".
*/
#define BDE_DEV_STATE_NORMAL (0)
/*
* BDE_DEV_STATE_REMOVED : A previous probed device was removed.
* We will avoid any device access while the device is in this state.
* The state will be moved to "CHANGED" if the device is re-inserted
* and re-probed.
*/
#define BDE_DEV_STATE_REMOVED (1)
/*
* BDE_DEV_STATE_CHANGED : The device is re-probed after having been removed.
* The resouces assigned to the device might have been changed after
* re-probing, so we need to re-initialize our resource database accordingly.
* The state will change to "NORMAL" when the resource have been updated.
*/
#define BDE_DEV_STATE_CHANGED (2)
extern int linux_bde_create(linux_bde_bus_t* bus, ibde_t** bde);
extern int linux_bde_destroy(ibde_t* bde);
#ifdef BCM_INSTANCE_SUPPORT
extern int linux_bde_instance_attach(unsigned int dev_mask,unsigned int dma_size);
#endif
#ifdef __KERNEL__
/*
* Backdoors provided by the kernel bde
*
*/
/*
* The user bde needs to get cpu physical address for
* the userland code to mmap.
* And the second address is bus address, it is either
* identical to cpu physical address or another address
* (IOVA) translated by IOMMU.
*/
extern int lkbde_get_dma_info(phys_addr_t *cpu_pbase, phys_addr_t *dma_pbase, ssize_t *size);
extern uint32 lkbde_get_dev_phys(int d);
extern uint32 lkbde_get_dev_phys_hi(int d);
/*
* Virtual device address needed by kernel space
* interrupt handler.
*/
extern void *lkbde_get_dev_virt(int d);
/*
* The user bde needs to get some physical addresses for
* the userland code to mmap. The following functions
* supports multiple resources for a single device.
*/
extern int lkbde_get_dev_resource(int d, int rsrc, uint32 *flags,
uint32 *phys_lo, uint32 *phys_hi);
/*
* Backdoor to retrieve OS device structure to be used for
* DMA operations.
*/
extern void *lkbde_get_dma_dev(int d);
/*
* Backdoor to retrieve original hardware/OS device.
*/
extern void *lkbde_get_hw_dev(int d);
/*
* Retrive the device state from Kernel BDE.
* Used for KNET and User BDE for pci hot swap case.
*/
extern int lkbde_dev_state_get(int d, uint32 *state);
extern int lkbde_dev_state_set(int d, uint32 state);
/*
* Retrive the mapping between emulated HW device and instance id
*/
extern int lkbde_dev_instid_get(int d, uint32 *instid);
extern int lkbde_dev_instid_set(int d, uint32 instid);
/*
* Functions that allow an interrupt handler in user mode to
* coexist with interrupt handler in kernel module.
*/
extern int lkbde_irq_mask_set(int d, uint32 addr, uint32 mask, uint32 fmask);
extern int lkbde_irq_mask_get(int d, uint32 *mask, uint32 *fmask);
#if (defined(BCM_PETRA_SUPPORT) || defined(BCM_DFE_SUPPORT))
extern int lkbde_cpu_write(int d, uint32 addr, uint32 *buf);
extern int lkbde_cpu_read(int d, uint32 addr, uint32 *buf);
extern int lkbde_cpu_pci_register(int d);
#endif
/*
* This flag must be OR'ed onto the device number when calling
* interrupt_connect/disconnect and irq_mask_set functions from
* a secondary device driver.
*/
#define LKBDE_ISR2_DEV 0x8000
#if defined(BCM_PETRA_SUPPORT) || defined(BCM_DFE_SUPPORT)
#include <linux/version.h>
#if defined(__DUNE_LINUX_BCM_CPU_PCIE__) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
#ifndef _SIMPLE_MEMORY_ALLOCATION_
#define _SIMPLE_MEMORY_ALLOCATION_ 1
#endif
#ifndef USE_LINUX_BDE_MMAP
#define USE_LINUX_BDE_MMAP 1
#endif
#endif
#endif
#if defined(IPROC_CMICD) && defined(CONFIG_CMA)
#ifndef _SIMPLE_MEMORY_ALLOCATION_
#define _SIMPLE_MEMORY_ALLOCATION_ 1
#endif
#endif
/* Don't use _SIMPLE_MEMORY_ALLOCATION_ method for newer kernel than 3.10.0 */
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0))
#ifndef _SIMPLE_MEMORY_ALLOCATION_
#define _SIMPLE_MEMORY_ALLOCATION_ 0
#endif
#endif
/* Allocation via dma_alloc_coherent is turned off by default */
#ifndef _SIMPLE_MEMORY_ALLOCATION_
#define _SIMPLE_MEMORY_ALLOCATION_ 9 /* compile in the allocation method, but do not use it by default */
#endif
/* By default we use our private mmap only if /dev/mem mmap has restrictions */
#ifndef USE_LINUX_BDE_MMAP
#ifdef CONFIG_STRICT_DEVMEM
#define USE_LINUX_BDE_MMAP 1
#else
#define USE_LINUX_BDE_MMAP 0
#endif
#endif
#endif /* __KERNEL__ */
#endif /* __LINUX_BDE_H__ */

View File

@ -0,0 +1,76 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/***********************************************************************
*
* $Id: linux_dma.h,v 1.24 Broadcom SDK $
* $Copyright: (c) 2016 Broadcom Corp.
* All Rights Reserved.$
*
**********************************************************************/
#ifndef __LINUX_DMA_H__
#define __LINUX_DMA_H__
#include <sal/types.h>
#ifdef __KERNEL__
#ifdef SAL_BDE_XLP
#define KMALLOC(size, flags) __kmalloc(size, flags)
#else
#define KMALLOC(size, flags) kmalloc(size, flags)
#endif
#if defined(CONFIG_IDT_79EB334) || defined(CONFIG_BCM4702)
/* ioremap is broken in kernel */
#define IOREMAP(addr, size) ((void *)KSEG1ADDR(addr))
#else
#define IOREMAP(addr, size) ioremap_nocache(addr, size)
#endif
#if defined (__mips__)
#if defined(CONFIG_NONCOHERENT_IO) || defined(CONFIG_DMA_NONCOHERENT)
/* Use flush/invalidate for cached memory */
#define NONCOHERENT_DMA_MEMORY
/* Remap virtual DMA addresses to non-cached segment */
#define REMAP_DMA_NONCACHED
#endif /* CONFIG_NONCOHERENT_IO || CONFIG_DMA_NONCOHERENT */
#endif /* __mips__ */
#if defined(BCM958525) && (LINUX_VERSION_CODE <= KERNEL_VERSION(3,6,5))
#define REMAP_DMA_NONCACHED
#endif
#ifndef DMA_BIT_MASK
#define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1))
#endif
extern void _dma_init(int robo_switch);
extern int _dma_cleanup(void);
extern void _dma_pprint(void);
extern uint32_t *_salloc(int d, int size, const char *name);
extern void _sfree(int d, void *ptr);
extern int _sinval(int d, void *ptr, int length);
extern int _sflush(int d, void *ptr, int length);
extern sal_paddr_t _l2p(int d, void *vaddr);
extern void *_p2l(int d, sal_paddr_t paddr);
extern int _dma_pool_allocated(void);
extern int _dma_range_valid(unsigned long phys_addr, unsigned long size);
#endif /* __KERNEL__ */
#endif /* __LINUX_DMA_H__ */

View File

@ -0,0 +1,37 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: mpool.h,v 1.2 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef __MPOOL_H__
#define __MPOOL_H__
struct mpool_mem_s;
typedef struct mpool_mem_s* mpool_handle_t;
extern int mpool_init(void);
extern mpool_handle_t mpool_create(void* base_address, int size);
extern void* mpool_alloc(mpool_handle_t pool, int size);
extern void mpool_free(mpool_handle_t pool, void* ptr);
extern int mpool_destroy(mpool_handle_t pool);
extern int mpool_usage(mpool_handle_t pool);
#endif /* __MPOOL_H__ */

View File

@ -0,0 +1,115 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.18 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Makefile for Linux kernel BDE
#
LOCALDIR = systems/bde/linux/kernel
# Make sure we build for the kernel if this is a user-mode build
ifneq ($(platform), )
override-target=linux-$(platform)
endif
include $(SDK)/make/Make.config
LIBS = $(LIBDIR)/libkern.a
BDE = linux-kernel-bde.o
ifdef ROBO_CHIPS
CFLAGS += -I$(ET_ROBO) -I${SDK}/include/shared/et
ET_ROBO = ${SDK}/systems/drv/et
endif
# need to add vpath sources
VPATH = ../shared $(ET_ROBO)
# Add the srcs to be found by vpath
LSRCS += mpool.c
ifdef ROBO_CHIPS
platformsplt = $(subst -, , ${platform}) # change hyphens to spaces
platformbase = $(word 1,${platformsplt})
ifeq ($(platformbase), keystone)
LSRCS += etc_robo_spi.c aiutils.c
else
ifeq ($(platformbase), keystone_le)
LSRCS += etc_robo_spi.c aiutils.c
else
ifeq ($(platformbase), iproc)
LSRCS += robo_srab.c robo_spi.c aiutils.c
endif
endif
endif # platformbase
endif # ROBO_CHIPS
# Add shared BDE sources
VPATH += ../../shared
LSRCS += shbde_pci.c shbde_iproc.c shbde_mdio.c
CFLAGS += -I../../shared/include
LHDRS += mpool.h
LOBJS = $(addsuffix .o, $(basename $(LSRCS)))
BOBJS = $(addprefix $(BLDDIR)/,$(LOBJS))
ifneq ($(kernel_version),2_4)
KERNEL_MODULE_DIR = kernel_module
THIS_MOD_NAME := linux-kernel-bde
MODULE = $(LIBDIR)/$(THIS_MOD_NAME).o
KMODULE = $(LIBDIR)/$(THIS_MOD_NAME).ko
build: kernel_libs $(MODULE) $(KMODULE)
else
MODULE = $(LIBDIR)/linux-kernel-bde.o
build: kernel_libs $(MODULE)
endif
$(MODULE): $(BLDDIR)/.tree kernel_libs $(BOBJS)
mkdir -p $(@D)
$(LD) $(MODULE_LDFLAGS) -r -d $(BOBJS) $(LIBS) -o $@
ifneq ($(kernel_version),2_4)
$(KMODULE): $(MODULE)
rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR)
mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR)
cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile
MOD_NAME=$(THIS_MOD_NAME) $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko
endif
kernel_libs:
$(MAKE) -C $(SDK)/systems/linux/kernel/modules/shared
include $(SDK)/make/Make.depend
# Make.depend is before clean:: so that Make.depend's clean:: runs first.
clean::
$(MAKE) -C $(SDK)/systems/linux/kernel/modules/shared $@
$(RM) $(BOBJS) $(MODULE)
$(RM) $(BLDDIR)/$(KERNEL_MODULE_DIR)
distclean::
ifneq ($(kernel_version),2_4)
.PHONY: build kernel_libs
endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,906 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: linux_dma.c,v 1.414 Broadcom SDK $
* $Copyright: (c) 2016 Broadcom Corp.
* All Rights Reserved.$
*
* Linux Kernel BDE DMA memory allocation
*
*
* DMA memory allocation modes
* ===========================
*
* 1. Using private pool in kernel memory
* --------------------------------------
* In this mode the BDE module will try to assemble a physically contiguous
* of memory using the kernel page allocator. This memory block is then
* administered by the mpool allocation functions. Note that once a system
* has been running for a while, the memory fragmentation may prevent the
* allocator from assembling a contiguous memory block, however, if the
* module is loaded shortly after system startup, it is very unlikely to
* fail.
*
* This allocation method is used by default.
*
* 2. Using private pool in high memory
* ------------------------------------
* In this mode the BDE module will assume that unused physical memory is
* present at the high_memory address, i.e. memory not managed by the Linux
* memory manager. This memory block is mapped into kernel space and
* administered by the mpool allocation functions. High memory must be
* reserved using either the mem=xxx kernel parameter (recommended), or by
* hardcoding the memory limit in the kernel image.
*
* The module parameter himem=1 enables this allocation mode.
*
* 3. Using kernel allocators (kmalloc, __get_free_pages)
* ------------------------------------------------------
* In this mode all DMA memory is allocated from the kernel on the fly, i.e.
* no private DMA memory pool will be created. If large memory blocks are
* only allocated at system startup (or not at all), this allocation method
* is the most flexible and memory-efficient, however, it is not recommended
* for non-coherent memory platforms due to an overall system performance
* degradation arising from the use of cache flush/invalidate instructions.
*
* The module parameter dmasize=0M enables this allocation mode, however if
* DMA memory is requested from a user mode application, a private memory
* pool will be created and used irrespectively.
*/
#include <gmodule.h>
#include <linux-bde.h>
#include <linux_dma.h>
#include <mpool.h>
#include <sdk_config.h>
#ifdef BCM_PLX9656_LOCAL_BUS
#include <asm/cacheflush.h>
#endif
/* allocation types/methods for the DMA memory pool */
#define ALLOC_TYPE_CHUNK 0 /* use small allocations and join them */
#define ALLOC_TYPE_API 1 /* use one allocation */
#if _SIMPLE_MEMORY_ALLOCATION_
#include <linux/dma-mapping.h>
#if defined(IPROC_CMICD) && defined(CONFIG_CMA) && defined(CONFIG_CMA_SIZE_MBYTES)
#define DMA_MAX_ALLOC_SIZE (CONFIG_CMA_SIZE_MBYTES * 1024 * 1024)
#else
#define DMA_MAX_ALLOC_SIZE (1 << (MAX_ORDER - 1 + PAGE_SHIFT)) /* Maximum size the kernel can allocate in one allocation */
#endif
#endif /* _SIMPLE_MEMORY_ALLOCATION_ */
#if _SIMPLE_MEMORY_ALLOCATION_ == 1
#define ALLOC_METHOD_DEFAULT ALLOC_TYPE_API
#else
#define ALLOC_METHOD_DEFAULT ALLOC_TYPE_CHUNK
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0))
#include <linux/slab.h>
#define virt_to_bus virt_to_phys
#define bus_to_virt phys_to_virt
#endif
#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21))
#define VIRT_TO_PAGE(p) virt_to_page((void*)(p))
#else
#define VIRT_TO_PAGE(p) virt_to_page((p))
#endif
/* Compatibility */
#ifdef LKM_2_4
#define MEM_MAP_RESERVE mem_map_reserve
#define MEM_MAP_UNRESERVE mem_map_unreserve
#else /* LKM_2_6 */
#define MEM_MAP_RESERVE SetPageReserved
#define MEM_MAP_UNRESERVE ClearPageReserved
#endif /* LKM_2_x */
#ifndef GFP_DMA32
#define GFP_DMA32 0
#endif
/* Flags for memory allocations */
#ifdef SAL_BDE_XLP
static int mem_flags = GFP_ATOMIC | GFP_KERNEL | GFP_DMA;
#else
#if defined(CONFIG_ZONE_DMA32)
static int mem_flags = GFP_ATOMIC | GFP_DMA32;
#else
static int mem_flags = GFP_ATOMIC | GFP_DMA;
#endif
#endif
/* Debug output */
static int dma_debug = 0;
module_param(dma_debug, int, 0);
MODULE_PARM_DESC(dma_debug,
"DMA debug output enable (default 0).");
/* DMA memory pool size */
static char *dmasize;
LKM_MOD_PARAM(dmasize, "s", charp, 0);
MODULE_PARM_DESC(dmasize,
"Specify DMA memory size (default 4MB)");
/* Select DMA memory pool allocation method */
static int dmaalloc = ALLOC_METHOD_DEFAULT;
LKM_MOD_PARAM(dmaalloc, "i", int, 0);
MODULE_PARM_DESC(dmaalloc, "Select DMA memory allocation method");
/* Use high memory for DMA */
static char *himem;
LKM_MOD_PARAM(himem, "s", charp, 0);
MODULE_PARM_DESC(himem,
"Use high memory for DMA (default no)");
/* DMA memory allocation */
#define ONE_KB 1024
#define ONE_MB (1024*1024)
/* Default DMA memory size */
#ifdef SAL_BDE_DMA_MEM_DEFAULT
#define DMA_MEM_DEFAULT (SAL_BDE_DMA_MEM_DEFAULT * ONE_MB)
#else
#define DMA_MEM_DEFAULT (8 * ONE_MB)
#endif
#define DMA_MEM_DEFAULT_ROBO (4 * ONE_MB)
/* We try to assemble a contiguous segment from chunks of this size */
#define DMA_BLOCK_SIZE (512 * ONE_KB)
typedef struct _dma_segment {
struct list_head list;
unsigned long req_size; /* Requested DMA segment size */
unsigned long blk_size; /* DMA block size */
unsigned long blk_order; /* DMA block size in alternate format */
unsigned long seg_size; /* Current DMA segment size */
unsigned long seg_begin; /* Logical address of segment */
unsigned long seg_end; /* Logical end address of segment */
unsigned long *blk_ptr; /* Array of logical DMA block addresses */
int blk_cnt_max; /* Maximum number of block to allocate */
int blk_cnt; /* Current number of blocks allocated */
} dma_segment_t;
static unsigned int _dma_mem_size = DMA_MEM_DEFAULT;
static mpool_handle_t _dma_pool = NULL;
static void __iomem *_dma_vbase = NULL;
/* cpu physical address for mmap */
static phys_addr_t _cpu_pbase = 0;
/*
* DMA bus address, it is either identical to cpu physical address
* or another address(IOVA) translated by IOMMU.
*/
static phys_addr_t _dma_pbase = 0;
static int _use_himem = 0;
static int _use_dma_mapping = 0;
static LIST_HEAD(_dma_seg);
#define DMA_DEV(n) lkbde_get_dma_dev(n)
/*
* Function: _find_largest_segment
*
* Purpose:
* Find largest contiguous segment from a pool of DMA blocks.
* Parameters:
* dseg - DMA segment descriptor
* Returns:
* 0 on success, < 0 on error.
* Notes:
* Assembly stops if a segment of the requested segment size
* has been obtained.
*
* Lower address bits of the DMA blocks are used as follows:
* 0: Untagged
* 1: Discarded block
* 2: Part of largest contiguous segment
* 3: Part of current contiguous segment
*/
static int
_find_largest_segment(dma_segment_t *dseg)
{
int i, j, blks, found;
unsigned long b, e, a;
blks = dseg->blk_cnt;
/* Clear all block tags */
for (i = 0; i < blks; i++) {
dseg->blk_ptr[i] &= ~3;
}
for (i = 0; i < blks && dseg->seg_size < dseg->req_size; i++) {
/* First block must be an untagged block */
if ((dseg->blk_ptr[i] & 3) == 0) {
/* Initial segment size is the block size */
b = dseg->blk_ptr[i];
e = b + dseg->blk_size;
dseg->blk_ptr[i] |= 3;
/* Loop looking for adjacent blocks */
do {
found = 0;
for (j = i + 1; j < blks && (e - b) < dseg->req_size; j++) {
a = dseg->blk_ptr[j];
/* Check untagged blocks only */
if ((a & 3) == 0) {
if (a == (b - dseg->blk_size)) {
/* Found adjacent block below current segment */
dseg->blk_ptr[j] |= 3;
b = a;
found = 1;
} else if (a == e) {
/* Found adjacent block above current segment */
dseg->blk_ptr[j] |= 3;
e += dseg->blk_size;
found = 1;
}
}
}
} while (found);
if ((e - b) > dseg->seg_size) {
/* The current block is largest so far */
dseg->seg_begin = b;
dseg->seg_end = e;
dseg->seg_size = e - b;
/* Re-tag current and previous largest segment */
for (j = 0; j < blks; j++) {
if ((dseg->blk_ptr[j] & 3) == 3) {
/* Tag current segment as the largest */
dseg->blk_ptr[j] &= ~1;
} else if ((dseg->blk_ptr[j] & 3) == 2) {
/* Discard previous largest segment */
dseg->blk_ptr[j] ^= 3;
}
}
} else {
/* Discard all blocks in current segment */
for (j = 0; j < blks; j++) {
if ((dseg->blk_ptr[j] & 3) == 3) {
dseg->blk_ptr[j] &= ~2;
}
}
}
}
}
return 0;
}
/*
* Function: _alloc_dma_blocks
*
* Purpose:
* Allocate DMA blocks and add them to the pool.
* Parameters:
* dseg - DMA segment descriptor
* blks - number of DMA blocks to allocate
* Returns:
* 0 on success, < 0 on error.
* Notes:
* DMA blocks are allocated using the page allocator.
*/
static int
_alloc_dma_blocks(dma_segment_t *dseg, int blks)
{
int i, start;
unsigned long addr;
if (dseg->blk_cnt + blks > dseg->blk_cnt_max) {
gprintk("No more DMA blocks\n");
return -1;
}
start = dseg->blk_cnt;
dseg->blk_cnt += blks;
for (i = start; i < dseg->blk_cnt; i++) {
/*
* Note that we cannot use pci_alloc_consistent when we
* want to be able to map DMA memory to user space.
*
* The GFP_DMA flag is omitted as this imposes the ISA
* addressing limitations on x86 platforms. As long as
* we have less than 1GB of memory, we can do PCI DMA
* to all physical RAM locations.
*/
addr = __get_free_pages(mem_flags, dseg->blk_order);
if (addr) {
dseg->blk_ptr[i] = addr;
} else {
gprintk("DMA allocation failed\n");
return -1;
}
}
return 0;
}
/*
* Function: _dma_segment_alloc
*
* Purpose:
* Allocate large physically contiguous DMA segment.
* Parameters:
* size - requested DMA segment size
* blk_size - assemble segment from blocks of this size
* Returns:
* DMA segment descriptor.
* Notes:
* Since we cannot allocate large blocks of contiguous
* memory from the kernel, we simply keep allocating
* smaller chunks until we can assemble a contiguous
* block of the desired size.
*
* When system allowed maximum bytes of memory has been allocated
* without a successful assembly of a contiguous DMA
* segment, the allocation function will return the
* largest contiguous segment found so far. It is up
* to the calling function to decide whether this
* amount is sufficient to proceed.
*/
static dma_segment_t *
_dma_segment_alloc(size_t size, size_t blk_size)
{
dma_segment_t *dseg;
int i, blk_ptr_size;
unsigned long page_addr;
struct sysinfo si;
/* Sanity check */
if (size == 0 || blk_size == 0) {
return NULL;
}
/* Allocate an initialize DMA segment descriptor */
if ((dseg = kmalloc(sizeof(dma_segment_t), GFP_KERNEL)) == NULL) {
return NULL;
}
memset(dseg, 0, sizeof(dma_segment_t));
dseg->req_size = size;
dseg->blk_size = PAGE_ALIGN(blk_size);
while ((PAGE_SIZE << dseg->blk_order) < dseg->blk_size) {
dseg->blk_order++;
}
si_meminfo(&si);
dseg->blk_cnt_max = (si.totalram << PAGE_SHIFT) / dseg->blk_size;
blk_ptr_size = dseg->blk_cnt_max * sizeof(unsigned long);
/* Allocate an initialize DMA block pool */
dseg->blk_ptr = KMALLOC(blk_ptr_size, GFP_KERNEL);
if (dseg->blk_ptr == NULL) {
kfree(dseg);
return NULL;
}
memset(dseg->blk_ptr, 0, blk_ptr_size);
/* Allocate minimum number of blocks */
_alloc_dma_blocks(dseg, dseg->req_size / dseg->blk_size);
/* Allocate more blocks until we have a complete segment */
do {
_find_largest_segment(dseg);
if (dseg->seg_size >= dseg->req_size) {
break;
}
} while (_alloc_dma_blocks(dseg, 8) == 0);
/* Reserve all pages in the DMA segment and free unused blocks */
for (i = 0; i < dseg->blk_cnt; i++) {
if ((dseg->blk_ptr[i] & 3) == 2) {
dseg->blk_ptr[i] &= ~3;
for (page_addr = dseg->blk_ptr[i];
page_addr < dseg->blk_ptr[i] + dseg->blk_size;
page_addr += PAGE_SIZE) {
MEM_MAP_RESERVE(VIRT_TO_PAGE(page_addr));
}
} else if (dseg->blk_ptr[i]) {
dseg->blk_ptr[i] &= ~3;
free_pages(dseg->blk_ptr[i], dseg->blk_order);
dseg->blk_ptr[i] = 0;
}
}
return dseg;
}
/*
* Function: _dma_segment_free
*
* Purpose:
* Release resources used by DMA segment.
* Parameters:
* dseg - DMA segment descriptor
* Returns:
* Nothing.
*/
static void
_dma_segment_free(dma_segment_t *dseg)
{
int i;
unsigned long page_addr;
if (dseg->blk_ptr) {
for (i = 0; i < dseg->blk_cnt; i++) {
if (dseg->blk_ptr[i]) {
for (page_addr = dseg->blk_ptr[i];
page_addr < dseg->blk_ptr[i] + dseg->blk_size;
page_addr += PAGE_SIZE) {
MEM_MAP_UNRESERVE(VIRT_TO_PAGE(page_addr));
}
free_pages(dseg->blk_ptr[i], dseg->blk_order);
}
}
kfree(dseg->blk_ptr);
kfree(dseg);
}
}
/*
* Function: _pgalloc
*
* Purpose:
* Allocate DMA memory using page allocator
* Parameters:
* size - number of bytes to allocate
* Returns:
* Pointer to allocated DMA memory or NULL if failure.
* Notes:
* For any sizes less than DMA_BLOCK_SIZE, we ask the page
* allocator for the entire memory block, otherwise we try
* to assemble a contiguous segment ourselves.
*/
static void *
_pgalloc(size_t size)
{
dma_segment_t *dseg;
size_t blk_size;
blk_size = (size < DMA_BLOCK_SIZE) ? size : DMA_BLOCK_SIZE;
if ((dseg = _dma_segment_alloc(size, blk_size)) == NULL) {
return NULL;
}
if (dseg->seg_size < size) {
/* If we didn't get the full size then forget it */
_dma_segment_free(dseg);
return NULL;
}
list_add(&dseg->list, &_dma_seg);
return (void *)dseg->seg_begin;
}
/*
* Function: _pgfree
*
* Purpose:
* Free memory allocated by _pgalloc
* Parameters:
* ptr - pointer returned by _pgalloc
* Returns:
* 0 if succesfully freed, otherwise -1.
*/
static int
_pgfree(void *ptr)
{
struct list_head *pos;
list_for_each(pos, &_dma_seg) {
dma_segment_t *dseg = list_entry(pos, dma_segment_t, list);
if (ptr == (void *)dseg->seg_begin) {
list_del(&dseg->list);
_dma_segment_free(dseg);
return 0;
}
}
return -1;
}
/*
* Function: _pgcleanup
*
* Purpose:
* Free all memory allocated by _pgalloc
* Parameters:
* None
* Returns:
* Nothing.
*/
static void
_pgcleanup(void)
{
switch (dmaalloc) {
#if _SIMPLE_MEMORY_ALLOCATION_
case ALLOC_TYPE_API:
if (_dma_vbase) {
if (dma_debug >= 1) gprintk("freeing v=%p p=0x%lx size=0x%lx\n", _dma_vbase,(unsigned long) _dma_pbase, (unsigned long)_dma_mem_size);
dma_free_coherent(DMA_DEV(0), _dma_mem_size, _dma_vbase, _dma_pbase);
}
break;
#endif /* _SIMPLE_MEMORY_ALLOCATION_ */
case ALLOC_TYPE_CHUNK: {
struct list_head *pos, *tmp;
if (_use_dma_mapping) {
dma_unmap_single(DMA_DEV(0), (dma_addr_t)_dma_pbase, _dma_mem_size, DMA_BIDIRECTIONAL);
_use_dma_mapping = 0;
}
list_for_each_safe(pos, tmp, &_dma_seg) {
dma_segment_t *dseg = list_entry(pos, dma_segment_t, list);
list_del(&dseg->list);
_dma_segment_free(dseg);
}
break;
}
default:
gprintk("DMA memory allocation method dmaalloc=%d is not supported\n", dmaalloc);
}
}
/*
* Function: _alloc_mpool
*
* Purpose:
* Allocate DMA memory pool
* Parameters:
* size - size of DMA memory pool
* Returns:
* Nothing.
* Notes:
* If set up to use high memory, we simply map the memory into
* kernel space.
* It is assumed there is only one pool.
*/
static void
_alloc_mpool(size_t size)
{
unsigned long pbase = 0;
#if defined(__arm__) && !defined(CONFIG_HIGHMEM)
if (_use_himem) {
gprintk("DMA in high memory requires CONFIG_HIGHMEM on ARM CPUs.\n");
return;
}
#endif
if (_use_himem) {
/* Use high memory for DMA */
pbase = virt_to_bus(high_memory);
if (((pbase + (size - 1)) >> 16) > DMA_BIT_MASK(16)) {
gprintk("DMA in high memory at 0x%lx size 0x%lx is beyond the 4GB limit and not supported.\n", pbase, (unsigned long)size);
return;
}
_cpu_pbase = _dma_pbase = pbase;
_dma_vbase = IOREMAP(_dma_pbase, size);
} else {
/* Get DMA memory from kernel */
switch (dmaalloc) {
#if _SIMPLE_MEMORY_ALLOCATION_
case ALLOC_TYPE_API: {
size_t alloc_size = size; /* size of memory allocated in current iteration */
if (alloc_size > DMA_MAX_ALLOC_SIZE) {
alloc_size = DMA_MAX_ALLOC_SIZE;
}
/* get a memory allocation from the kernel */
{
dma_addr_t dma_handle;
if (!(_dma_vbase = dma_alloc_coherent(DMA_DEV(0), alloc_size, &dma_handle, GFP_KERNEL)) || !dma_handle) {
gprintk("_alloc_mpool: Kernel failed to allocate the memory pool of size 0x%lx\n", (unsigned long)alloc_size);
return;
}
pbase = dma_handle;
}
if (alloc_size != size) {
gprintk("_alloc_mpool: allocated 0x%lx bytes instead of 0x%lx bytes.\n",
(unsigned long)alloc_size, (unsigned long)size);
}
size = _dma_mem_size = alloc_size;
break;
}
#endif /* _SIMPLE_MEMORY_ALLOCATION_ */
case ALLOC_TYPE_CHUNK:
_dma_vbase = _pgalloc(size);
if (DMA_DEV(0)) {
/*
* Use dma_map_single to obtain dma bus address or IOVA if iommu is present.
*/
pbase = dma_map_single(DMA_DEV(0), _dma_vbase, size, DMA_BIDIRECTIONAL);
_use_dma_mapping = 1;
} else {
pbase = virt_to_bus(_dma_vbase);
}
break;
default:
_dma_vbase = NULL;
pbase = 0;
gprintk("DMA memory allocation method dmaalloc=%d is not supported\n", dmaalloc);
}
_dma_pbase = pbase;
if (dma_debug >= 1) {
gprintk("_alloc_mpool:%s _dma_vbase:%p pbase:%lx allocated:%lx dmaalloc:%d\n",
DMA_DEV(0)?"dma_dev":"", _dma_vbase, pbase, (unsigned long)size, dmaalloc);
}
if (((pbase + (size - 1)) >> 16) > DMA_BIT_MASK(16)) {
gprintk("DMA memory allocated at 0x%lx size 0x%lx is beyond the 4GB limit and not supported.\n", pbase, (unsigned long)size);
_pgcleanup();
_dma_vbase = NULL;
_dma_pbase = 0;
return;
}
if (_dma_vbase) {
_cpu_pbase = virt_to_bus(_dma_vbase);
if (dma_debug >= 1) gprintk("_cpu_pbase at %lx\n", (unsigned long)_cpu_pbase);
}
#ifdef REMAP_DMA_NONCACHED
_dma_vbase = IOREMAP(_dma_pbase, size);
#endif
}
}
/*
* Function: _dma_cleanup
*
* Purpose:
* DMA cleanup function.
* Parameters:
* None
* Returns:
* Always 0
*/
int
_dma_cleanup(void)
{
if (_dma_vbase) {
mpool_destroy(_dma_pool);
if (_use_himem) {
iounmap(_dma_vbase);
} else {
#ifdef REMAP_DMA_NONCACHED
iounmap(_dma_vbase);
#endif
_pgcleanup();
}
_dma_vbase = NULL;
_dma_pbase = 0;
_cpu_pbase = 0;
}
return 0;
}
void _dma_init(int robo_switch)
{
/* DMA Setup */
if (dmasize) {
if ((dmasize[strlen(dmasize)-1] & ~0x20) == 'M') {
_dma_mem_size = simple_strtoul(dmasize, NULL, 0);
_dma_mem_size *= ONE_MB;
} else {
gprintk("DMA memory size must be specified as e.g. dmasize=8M\n");
}
if (_dma_mem_size & (_dma_mem_size-1)) {
gprintk("dmasize must be a power of 2 (1M, 2M, 4M, 8M etc.)\n");
_dma_mem_size = 0;
}
} else {
if(robo_switch){
_dma_mem_size = DMA_MEM_DEFAULT_ROBO;
}
}
if (himem) {
if ((himem[0] & ~0x20) == 'Y' || himem[0] == '1') {
_use_himem = 1;
} else if ((himem[0] & ~0x20) == 'N' || himem[0] == '0') {
_use_himem = 0;
}
}
if (_dma_mem_size) {
_alloc_mpool(_dma_mem_size);
if (_dma_vbase == NULL) {
gprintk("no DMA memory available\n");
}
else {
mpool_init();
_dma_pool = mpool_create(_dma_vbase, _dma_mem_size);
}
}
}
#if USE_LINUX_BDE_MMAP
/*
* Function: _dma_range_valid
*
* Purpose:
* Check if DMA address range is valid.
* Parameters:
* phys_addr - start physical address
* size - range size
* Returns:
* 0 : not valid
* 1 : valid
*/
int
_dma_range_valid(unsigned long phys_addr, unsigned long size)
{
unsigned long pool_start = _cpu_pbase;
unsigned long pool_end = pool_start + _dma_mem_size;
if (phys_addr < pool_start || (phys_addr + size) > pool_end) {
gprintk("range 0x%lx-0x%lx outside DMA pool 0x%lx-0x%lx\n",
phys_addr, phys_addr + size, pool_start, pool_end);
return 0;
}
return 1;
}
#endif
/*
* Function: _dma_pool_allocated
*
* Purpose:
* Check if DMA pool has been allocated.
* Parameters:
* None
* Returns:
* 0 : not allocated
* 1 : allocated
*/
int
_dma_pool_allocated(void)
{
return (_dma_vbase) ? 1 : 0;
}
sal_paddr_t
_l2p(int d, void *vaddr)
{
if (_dma_mem_size) {
/* dma memory is a contiguous block */
if (vaddr) {
return _dma_pbase + (PTR_TO_UINTPTR(vaddr) - PTR_TO_UINTPTR(_dma_vbase));
}
return 0;
}
return ((sal_paddr_t)virt_to_bus(vaddr));
}
void *
_p2l(int d, sal_paddr_t paddr)
{
sal_vaddr_t vaddr = (sal_vaddr_t)_dma_vbase;
if (_dma_mem_size) {
/* DMA memory is a contiguous block */
if (paddr == 0) {
return NULL;
}
return (void *)(vaddr + (sal_vaddr_t)(paddr - _dma_pbase));
}
return bus_to_virt(paddr);
}
/*
* Some of the driver malloc's are too large for
* kmalloc(), so 'sal_alloc' and 'sal_free' in the
* linux kernel sal cannot be implemented with kmalloc().
*
* Instead, they expect someone to provide an allocator
* that can handle the gimongous size of some of the
* allocations, and we provide it here, by allocating
* this memory out of the boot-time dma pool.
*
* These are the functions in question:
*/
void* kmalloc_giant(int sz)
{
return mpool_alloc(_dma_pool, sz);
}
void kfree_giant(void* ptr)
{
return mpool_free(_dma_pool, ptr);
}
uint32_t *
_salloc(int d, int size, const char *name)
{
void *ptr;
if (_dma_mem_size) {
return mpool_alloc(_dma_pool, size);
}
if ((ptr = kmalloc(size, mem_flags)) == NULL) {
ptr = _pgalloc(size);
}
return ptr;
}
void
_sfree(int d, void *ptr)
{
if (_dma_mem_size) {
return mpool_free(_dma_pool, ptr);
}
if (_pgfree(ptr) < 0) {
kfree(ptr);
}
}
int
_sinval(int d, void *ptr, int length)
{
#if defined(dma_cache_wback_inv)
dma_cache_wback_inv((unsigned long)ptr, length);
#else
#if defined(IPROC_CMICD) || defined(BCM958525)
/* FIXME: need proper function to replace dma_cache_sync */
dma_sync_single_for_cpu(NULL, (unsigned long)ptr, length, DMA_BIDIRECTIONAL);
#else
dma_cache_sync(NULL, ptr, length, DMA_BIDIRECTIONAL);
#endif
#endif
return 0;
}
int
_sflush(int d, void *ptr, int length)
{
#if defined(dma_cache_wback_inv)
dma_cache_wback_inv((unsigned long)ptr, length);
#else
#if defined(IPROC_CMICD) || defined(BCM958525)
/* FIXME: need proper function to replace dma_cache_sync */
dma_sync_single_for_cpu(NULL, (unsigned long)ptr, length, DMA_BIDIRECTIONAL);
#else
dma_cache_sync(NULL, ptr, length, DMA_BIDIRECTIONAL);
#endif
#endif
return 0;
}
int
lkbde_get_dma_info(phys_addr_t* cpu_pbase, phys_addr_t* dma_pbase, ssize_t* size)
{
if (_dma_vbase == NULL) {
if (_dma_mem_size == 0) {
_dma_mem_size = DMA_MEM_DEFAULT;
}
_alloc_mpool(_dma_mem_size);
}
*cpu_pbase = _cpu_pbase;
*dma_pbase = _dma_pbase;
*size = (_dma_vbase) ? _dma_mem_size : 0;
return 0;
}
void
_dma_pprint(void)
{
pprintf("DMA Memory (%s): %d bytes, %d used, %d free%s\n",
(_use_himem) ? "high" : "kernel",
(_dma_vbase) ? _dma_mem_size : 0,
(_dma_vbase) ? mpool_usage(_dma_pool) : 0,
(_dma_vbase) ? _dma_mem_size - mpool_usage(_dma_pool) : 0,
USE_LINUX_BDE_MMAP ? ", local mmap" : "");
}
/*
* Export functions
*/
LKM_EXPORT_SYM(kmalloc_giant);
LKM_EXPORT_SYM(kfree_giant);
LKM_EXPORT_SYM(lkbde_get_dma_info);

View File

@ -0,0 +1,121 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#include <gmodule.h>
#include <shbde.h>
#include <shbde_iproc.h>
#include "linux_shbde.h"
/* Hardware abstractions for shared BDE functions */
static unsigned short
linux_pcic16_read(void *pci_dev, unsigned int addr)
{
u16 data = 0;
pci_read_config_word((struct pci_dev *)pci_dev, addr, &data);
return data;
}
static void
linux_pcic16_write(void *pci_dev, unsigned int addr, unsigned short data)
{
pci_write_config_word((struct pci_dev *)pci_dev, addr, (u16)data);
}
static unsigned int
linux_pcic32_read(void *pci_dev, unsigned int addr)
{
u32 data = 0;
pci_read_config_dword((struct pci_dev *)pci_dev, addr, &data);
return data;
}
static void
linux_pcic32_write(void *pci_dev, unsigned int addr, unsigned int data)
{
pci_write_config_dword((struct pci_dev *)pci_dev, addr, (u32)data);
}
static unsigned int
linux_io32_read(void *addr)
{
return *((volatile u32 *)addr);
}
static void
linux_io32_write(void *addr, unsigned int data)
{
*((volatile u32 *)addr) = data;
}
static void
linux_usleep(int usec)
{
udelay(usec);
}
/* To get the PCI parent device under linux, from only the device pointer */
static void *
linux_pci_parent_device_get(void *pci_dev)
{
return (void *)(((struct pci_dev *)pci_dev)->bus->self);
}
/*
* Function:
* linux_shbde_hal_init
* Purpose:
* Initialize hardware abstraction module for Linux kernel.
* Parameters:
* shbde - pointer to uninitialized hardware abstraction module
* log_func - optional log output function
* Returns:
* Always 0
*/
int
linux_shbde_hal_init(shbde_hal_t *shbde, shbde_log_func_t log_func)
{
memset(shbde, 0, sizeof(*shbde));
shbde->log_func = log_func;
shbde->pcic16_read = linux_pcic16_read;
shbde->pcic16_write = linux_pcic16_write;
shbde->pcic32_read = linux_pcic32_read;
shbde->pcic32_write = linux_pcic32_write;
shbde->io32_read = linux_io32_read;
shbde->io32_write = linux_io32_write;
shbde->usleep = linux_usleep;
shbde->pci_parent_device_get = linux_pci_parent_device_get;
return 0;
}

View File

@ -0,0 +1,34 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#ifndef __LINUX_SHBDE_H__
#define __LINUX_SHBDE_H__
#include <shbde.h>
#include <shbde_pci.h>
#include <shbde_iproc.h>
extern int
linux_shbde_hal_init(shbde_hal_t *shbde, shbde_log_func_t log_func);
#endif /* __LINUX_SHBDE_H__ */

View File

@ -0,0 +1,295 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: mpool.c,v 1.18 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#include <mpool.h>
#ifdef __KERNEL__
/*
* Abstractions used when compiling for Linux kernel mode.
*/
#include <lkm.h>
/*
* We cannot use the linux kernel SAL for MALLOC/FREE because
* the current implementation of sal_alloc() allocates memory
* out of an mpool created by this module...
*/
#define MALLOC(x) kmalloc(x, GFP_ATOMIC)
#define FREE(x) kfree(x)
static spinlock_t _mpool_lock;
#define MPOOL_LOCK_INIT() spin_lock_init(&_mpool_lock)
#define MPOOL_LOCK() unsigned long flags; spin_lock_irqsave(&_mpool_lock, flags)
#define MPOOL_UNLOCK() spin_unlock_irqrestore(&_mpool_lock, flags)
#else /* !__KERNEL__*/
/*
* Abstractions used when compiling for Linux user mode.
*/
#include <stdlib.h>
#include <sal/core/sync.h>
#define MALLOC(x) malloc(x)
#define FREE(x) free(x)
static sal_sem_t _mpool_lock;
#define MPOOL_LOCK_INIT() _mpool_lock = sal_sem_create("mpool_lock", 1, 1)
#define MPOOL_LOCK() sal_sem_take(_mpool_lock, sal_sem_FOREVER)
#define MPOOL_UNLOCK() sal_sem_give(_mpool_lock)
#endif /* __KERNEL__ */
/* Allow external override for system cache line size */
#ifndef BCM_CACHE_LINE_BYTES
#ifdef L1_CACHE_BYTES
#define BCM_CACHE_LINE_BYTES L1_CACHE_BYTES
#else
#define BCM_CACHE_LINE_BYTES 128 /* Should be fine on most platforms */
#endif
#endif
typedef struct mpool_mem_s {
unsigned char *address;
int size;
struct mpool_mem_s *next;
} mpool_mem_t;
/*
* Function: mpool_init
*
* Purpose:
* Initialize mpool lock.
* Parameters:
* None
* Returns:
* Always 0
*/
int
mpool_init(void)
{
MPOOL_LOCK_INIT();
return 0;
}
#ifdef TRACK_DMA_USAGE
static int _dma_mem_used = 0;
#endif
/*
* Function: mpool_alloc
*
* Purpose:
* Allocate memory block from mpool.
* Parameters:
* pool - mpool handle (from mpool_create)
* size - size of memory block to allocate
* Returns:
* Pointer to allocated memory block or NULL if allocation fails.
*/
void *
mpool_alloc(mpool_handle_t pool, int size)
{
mpool_mem_t *ptr = pool, *newptr = NULL;
int mod;
MPOOL_LOCK();
mod = size & (BCM_CACHE_LINE_BYTES - 1);
if (mod != 0 ) {
size += (BCM_CACHE_LINE_BYTES - mod);
}
while (ptr && ptr->next) {
if (ptr->next->address - (ptr->address + ptr->size) >= size) {
break;
}
ptr = ptr->next;
}
if (!(ptr && ptr->next)) {
MPOOL_UNLOCK();
return NULL;
}
newptr = MALLOC(sizeof(mpool_mem_t));
if (!newptr) {
MPOOL_UNLOCK();
return NULL;
}
newptr->address = ptr->address + ptr->size;
newptr->size = size;
newptr->next = ptr->next;
ptr->next = newptr;
#ifdef TRACK_DMA_USAGE
_dma_mem_used += size;
#endif
MPOOL_UNLOCK();
return newptr->address;
}
/*
* Function: mpool_free
*
* Purpose:
* Free memory block allocated from mpool..
* Parameters:
* pool - mpool handle (from mpool_create)
* addr - address of memory block to free
* Returns:
* Nothing
*/
void
mpool_free(mpool_handle_t pool, void *addr)
{
unsigned char *address = (unsigned char *)addr;
mpool_mem_t *ptr = pool, *prev = NULL;
MPOOL_LOCK();
while (ptr && ptr->next) {
if (ptr->next->address == address) {
#ifdef TRACK_DMA_USAGE
_dma_mem_used -= ptr->next->size;
#endif
break;
}
ptr = ptr->next;
}
if (ptr && ptr->next) {
prev = ptr;
ptr = ptr->next;
prev->next = ptr->next;
FREE(ptr);
}
MPOOL_UNLOCK();
}
/*
* Function: mpool_create
*
* Purpose:
* Create and initialize mpool control structures.
* Parameters:
* base_ptr - pointer to mpool memory block
* size - total size of mpool memory block
* Returns:
* mpool handle
* Notes
* The mpool handle returned must be used for subsequent
* memory allocations from the mpool.
*/
mpool_handle_t
mpool_create(void *base_ptr, int size)
{
mpool_mem_t *head, *tail;
int mod = (int)(((unsigned long)base_ptr) & (BCM_CACHE_LINE_BYTES - 1));
MPOOL_LOCK();
if (mod) {
base_ptr = (char*)base_ptr + (BCM_CACHE_LINE_BYTES - mod);
size -= (BCM_CACHE_LINE_BYTES - mod);
}
size &= ~(BCM_CACHE_LINE_BYTES - 1);
head = (mpool_mem_t *)MALLOC(sizeof(mpool_mem_t));
if (head == NULL) {
return NULL;
}
tail = (mpool_mem_t *)MALLOC(sizeof(mpool_mem_t));
if (tail == NULL) {
FREE(head);
return NULL;
}
head->size = tail->size = 0;
head->address = base_ptr;
tail->address = head->address + size;
head->next = tail;
tail->next = NULL;
MPOOL_UNLOCK();
return head;
}
/*
* Function: mpool_destroy
*
* Purpose:
* Free mpool control structures.
* Parameters:
* pool - mpool handle (from mpool_create)
* Returns:
* Always 0
*/
int
mpool_destroy(mpool_handle_t pool)
{
mpool_mem_t *ptr, *next;
MPOOL_LOCK();
for (ptr = pool; ptr; ptr = next) {
next = ptr->next;
FREE(ptr);
}
MPOOL_UNLOCK();
return 0;
}
/*
* Function: mpool_usage
*
* Purpose:
* Report total sum of allocated mpool memory.
* Parameters:
* pool - mpool handle (from mpool_create)
* Returns:
* Number of bytes currently allocated using mpool_alloc.
*/
int
mpool_usage(mpool_handle_t pool)
{
int usage = 0;
mpool_mem_t *ptr;
MPOOL_LOCK();
for (ptr = pool; ptr; ptr = ptr->next) {
usage += ptr->size;
}
MPOOL_UNLOCK();
return usage;
}

View File

@ -0,0 +1,71 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.1 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
LOCALDIR = systems/bde/linux/user/kernel
# Make sure we build for the kernel if this is a user-mode build
ifneq ($(platform), )
override-target=linux-$(platform)
endif
include $(SDK)/make/Make.config
LIBS = $(LIBDIR)/libkern.a
ifneq ($(kernel_version),2_4)
KERNEL_MODULE_DIR = kernel_module
THIS_MOD_NAME := linux-user-bde
MODULE = $(LIBDIR)/$(THIS_MOD_NAME).o
KMODULE = $(LIBDIR)/$(THIS_MOD_NAME).ko
build: kernel_libs $(MODULE) $(KMODULE)
else
MODULE = $(LIBDIR)/linux-user-bde.o
build: kernel_libs $(MODULE)
endif
KBUILD_EXTRA_SYMBOLS := ${BLDDIR}/../../kernel/kernel_module/Module.symvers
$(MODULE): $(BLDDIR)/.tree $(BOBJS) $(LIBS)
$(LD) $(MODULE_LDFLAGS) -r -d $(BOBJS) $(LIBS) -o $@
ifneq ($(kernel_version),2_4)
$(KMODULE): $(MODULE)
rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR)
mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR)
cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile
cat ${KBUILD_EXTRA_SYMBOLS} > $(BLDDIR)/$(KERNEL_MODULE_DIR)/Module.symvers
MOD_NAME=$(THIS_MOD_NAME) $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko
endif
kernel_libs:
$(MAKE) -C $(SDK)/systems/linux/kernel/modules/shared
include $(SDK)/make/Make.depend
# Make.depend is before clean:: so that Make.depend's clean:: runs first.
clean::
$(MAKE) -C $(SDK)/systems/linux/kernel/modules/shared $@
$(RM) $(BOBJS) $(MODULE)
.PHONY: build kernel_libs

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,113 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: linux-user-bde.h,v 1.23 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef __LINUX_USER_BDE_H__
#define __LINUX_USER_BDE_H__
#include <linux/types.h>
#include <linux/ioctl.h>
#include <linux-bde.h>
#ifndef __KERNEL__
#include <stdint.h>
#endif
#if defined(SAL_BDE_32BIT_USER_64BIT_KERNEL) || defined(PTRS_ARE_64BITS)
typedef uint64_t bde_kernel_addr_t;
#else
typedef uint32_t bde_kernel_addr_t;
#endif
/* Ioctl control structure */
typedef struct {
unsigned int dev; /* Device ID */
unsigned int rc; /* Operation Return Code */
unsigned int d0; /* Operation specific data */
unsigned int d1;
unsigned int d2;
unsigned int d3;
bde_kernel_addr_t p0;
union {
unsigned int dw[2];
unsigned char buf[64];
} dx;
} lubde_ioctl_t;
/* LUBDE ioctls */
#define LUBDE_MAGIC 'L'
#define LUBDE_VERSION _IO(LUBDE_MAGIC, 0)
#define LUBDE_GET_NUM_DEVICES _IO(LUBDE_MAGIC, 1)
#define LUBDE_GET_DEVICE _IO(LUBDE_MAGIC, 2)
#define LUBDE_PCI_CONFIG_PUT32 _IO(LUBDE_MAGIC, 3)
#define LUBDE_PCI_CONFIG_GET32 _IO(LUBDE_MAGIC, 4)
#define LUBDE_GET_DMA_INFO _IO(LUBDE_MAGIC, 5)
#define LUBDE_ENABLE_INTERRUPTS _IO(LUBDE_MAGIC, 6)
#define LUBDE_DISABLE_INTERRUPTS _IO(LUBDE_MAGIC, 7)
#define LUBDE_USLEEP _IO(LUBDE_MAGIC, 8)
#define LUBDE_WAIT_FOR_INTERRUPT _IO(LUBDE_MAGIC, 9)
#define LUBDE_SEM_OP _IO(LUBDE_MAGIC, 10)
#define LUBDE_UDELAY _IO(LUBDE_MAGIC, 11)
#define LUBDE_GET_DEVICE_TYPE _IO(LUBDE_MAGIC, 12)
#define LUBDE_SPI_READ_REG _IO(LUBDE_MAGIC, 13)
#define LUBDE_SPI_WRITE_REG _IO(LUBDE_MAGIC, 14)
#define LUBDE_READ_REG_16BIT_BUS _IO(LUBDE_MAGIC, 19)
#define LUBDE_WRITE_REG_16BIT_BUS _IO(LUBDE_MAGIC, 20)
#define LUBDE_GET_BUS_FEATURES _IO(LUBDE_MAGIC, 21)
#define LUBDE_WRITE_IRQ_MASK _IO(LUBDE_MAGIC, 22)
#define LUBDE_CPU_WRITE_REG _IO(LUBDE_MAGIC, 23)
#define LUBDE_CPU_READ_REG _IO(LUBDE_MAGIC, 24)
#define LUBDE_CPU_PCI_REGISTER _IO(LUBDE_MAGIC, 25)
#define LUBDE_DEV_RESOURCE _IO(LUBDE_MAGIC, 26)
#define LUBDE_IPROC_READ_REG _IO(LUBDE_MAGIC, 27)
#define LUBDE_IPROC_WRITE_REG _IO(LUBDE_MAGIC, 28)
#define LUBDE_ATTACH_INSTANCE _IO(LUBDE_MAGIC, 29)
#define LUBDE_GET_DEVICE_STATE _IO(LUBDE_MAGIC, 30)
#define LUBDE_SEM_OP_CREATE 1
#define LUBDE_SEM_OP_DESTROY 2
#define LUBDE_SEM_OP_TAKE 3
#define LUBDE_SEM_OP_GIVE 4
#define LUBDE_SUCCESS 0
#define LUBDE_FAIL ((unsigned int)-1)
/*
* Version history
* 1:add LUBDE_GET_DEVICE_STATE to support PCI hot plug
*/
#define KBDE_VERSION 1
/* This is the signal that will be used
* when an interrupt occurs
*/
#ifndef __KERNEL__
#include <signal.h>
#endif
#define LUBDE_INTERRUPT_SIGNAL SIGUSR1
#define LUBDE_ETHER_INTERRUPT_SIGNAL SIGUSR2
#endif /* __LUBDE_H__ */

View File

@ -0,0 +1,77 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#ifndef __SHBDE_H__
#define __SHBDE_H__
typedef void (*shbde_log_func_t)(int level, const char *str, int param);
#define SHBDE_ERR 0
#define SHBDE_WARN 1
#define SHBDE_DBG 2
/* iProc configuration (primarily used for PCI-AXI bridge) */
typedef struct shbde_iproc_config_s {
unsigned int dev_id;
unsigned int dev_rev;
unsigned int use_msi;
unsigned int iproc_ver;
unsigned int cmic_ver;
unsigned int cmic_rev;
unsigned int dma_hi_bits;
unsigned int mdio_base_addr;
unsigned int pcie_phy_addr;
unsigned int adjust_pcie_preemphasis;
} shbde_iproc_config_t;
/* Hardware abstraction functions */
typedef struct shbde_hal_s {
/* Optional log output interface */
shbde_log_func_t log_func;
/* PCI configuration access */
unsigned char (*pcic8_read)(void *pci_dev, unsigned int reg);
void (*pcic8_write)(void *pci_dev, unsigned int reg, unsigned char data);
unsigned short (*pcic16_read)(void *pci_dev, unsigned int reg);
void (*pcic16_write)(void *pci_dev, unsigned int reg, unsigned short data);
unsigned int (*pcic32_read)(void *pci_dev, unsigned int reg);
void (*pcic32_write)(void *pci_dev, unsigned int reg, unsigned int data);
/* iProc register access */
unsigned int (*io32_read)(void *addr);
void (*io32_write)(void *addr, unsigned int);
/* usleep function (optional) */
void (*usleep)(int usec);
/* PCI parent device access */
void *(*pci_parent_device_get)(void *pci_dev);
/* iProc configuration */
shbde_iproc_config_t icfg;
} shbde_hal_t;
#endif /* __SHBDE_H__ */

View File

@ -0,0 +1,49 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#ifndef __SHBDE_IPROC_H__
#define __SHBDE_IPROC_H__
#include <shbde.h>
extern int
shbde_iproc_config_init(shbde_iproc_config_t *icfg,
unsigned int dev_id, unsigned int dev_rev);
extern int
shbde_iproc_paxb_init(shbde_hal_t *shbde, void *iproc_regs,
shbde_iproc_config_t *icfg);
extern unsigned int
shbde_iproc_pci_read(shbde_hal_t *shbde, void *iproc_regs,
unsigned int addr);
extern void
shbde_iproc_pci_write(shbde_hal_t *shbde, void *iproc_regs,
unsigned int addr, unsigned int data);
extern int
shbde_iproc_pcie_preemphasis_set(shbde_hal_t *shbde, void *iproc_regs,
shbde_iproc_config_t *icfg, void *pci_dev);
#endif /* __SHBDE_IPROC_H__ */

View File

@ -0,0 +1,60 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2015 Broadcom Corp.
* All Rights Reserved.$
*
*/
#ifndef __SHBDE_MDIO_H__
#define __SHBDE_MDIO_H__
#include <shbde.h>
typedef struct shbde_mdio_ctrl_s {
/* Primary HAL*/
shbde_hal_t *shbde;
/* Context for iProc MDIO register access */
void *regs;
/* Base address for MDIO registers */
unsigned int base_addr;
/* iProc MDIO register access */
unsigned int (*io32_read)(shbde_hal_t *shbde, void *iproc_regs,
unsigned int addr);
void (*io32_write)(shbde_hal_t *shbde, void *iproc_regs,
unsigned int addr, unsigned int data);
} shbde_mdio_ctrl_t;
extern int
shbde_iproc_mdio_init(shbde_mdio_ctrl_t *smc);
extern int
shbde_iproc_mdio_read(shbde_mdio_ctrl_t *smc, unsigned int phy_addr,
unsigned int reg, unsigned int *val);
extern int
shbde_iproc_mdio_write(shbde_mdio_ctrl_t *smc, unsigned int phy_addr,
unsigned int reg, unsigned int val);
#endif /* __SHBDE_MDIO_H__ */

View File

@ -0,0 +1,47 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#ifndef __SHBDE_PCI_H__
#define __SHBDE_PCI_H__
#include <shbde.h>
extern unsigned int
shbde_pci_pcie_cap(shbde_hal_t *shbde, void *pci_dev);
extern int
shbde_pci_is_pcie(shbde_hal_t *shbde, void *pci_dev);
extern int
shbde_pci_is_iproc(shbde_hal_t *shbde, void *pci_dev, int *cmic_bar);
extern int
shbde_pci_max_payload_set(shbde_hal_t *shbde, void *pci_dev, int maxpayload);
extern int
shbde_pci_iproc_version_get(shbde_hal_t *shbde, void *pci_dev,
unsigned int *iproc_ver,
unsigned int *cmic_ver,
unsigned int *cmic_rev);
#endif /* __SHBDE_PCI_H__ */

View File

@ -0,0 +1,466 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#include <shbde_iproc.h>
#include <shbde_mdio.h>
#include <shbde_pci.h>
/* PAXB register offsets within PCI BAR0 window */
#define BAR0_PAXB_ENDIANESS 0x2030
#define BAR0_PAXB_PCIE_EP_AXI_CONFIG 0x2104
#define BAR0_PAXB_CONFIG_IND_ADDR 0x2120
#define BAR0_PAXB_CONFIG_IND_DATA 0x2124
#define BAR0_PAXB_IMAP0_0 (0x2c00)
#define BAR0_PAXB_IMAP0_1 (0x2c04)
#define BAR0_PAXB_IMAP0_2 (0x2c08)
#define BAR0_PAXB_IMAP0_7 (0x2c1c)
#define BAR0_PAXB_OARR_FUNC0_MSI_PAGE 0x2d34
#define BAR0_PAXB_OARR_2 0x2d60
#define BAR0_PAXB_OARR_2_UPPER 0x2d64
#define BAR0_DMU_PCU_PCIE_SLAVE_RESET_MODE 0x7024
/* Force byte pointer for offset adjustments */
#define ROFFS(_ptr, _offset) ((unsigned char*)(_ptr) + (_offset))
#define PAXB_CONFIG_IND_ADDRr_PROTOCOL_LAYERf_SHFT 11
#define PAXB_CONFIG_IND_ADDRr_PROTOCOL_LAYERf_MASK 0x3
#define PAXB_CONFIG_IND_ADDRr_ADDRESSf_SHFT 0
#define PAXB_CONFIG_IND_ADDRr_ADDRESSf_MASK 0x7ff
/* Register value set/get by field */
#define REG_FIELD_SET(_r, _f, _r_val, _f_val) \
_r_val = ((_r_val) & ~(_r##_##_f##_MASK << _r##_##_f##_SHFT)) | \
(((_f_val) & _r##_##_f##_MASK) << _r##_##_f##_SHFT)
#define REG_FIELD_GET(_r, _f, _r_val) \
(((_r_val) >> _r##_##_f##_SHFT) & _r##_##_f##_MASK)
/* PCIe capabilities definition */
#ifndef PCI_EXP_LNKSTA
#define PCI_EXP_LNKSTA 0x12
#endif
/* Current Link Speed 5.0GT/s */
#ifndef PCI_EXP_LNKSTA_CLS_5_0GB
#define PCI_EXP_LNKSTA_CLS_5_0GB 2
#endif
#ifndef PCI_EXP_LNKSTA2
#define PCI_EXP_LNKSTA2 0x32
#endif
/* Current Deemphasis Level -3.5 dB */
#ifndef PCI_EXP_LNKSTA2_CDL_3_5DB
#define PCI_EXP_LNKSTA2_CDL_3_5DB 0x1
#endif
static unsigned int
iproc32_read(shbde_hal_t *shbde, void *addr)
{
if (!shbde || !shbde->io32_read) {
return 0;
}
return shbde->io32_read(addr);
}
static void
iproc32_write(shbde_hal_t *shbde, void *addr, unsigned int data)
{
if (!shbde || !shbde->io32_write) {
return;
}
shbde->io32_write(addr, data);
}
static void
wait_usec(shbde_hal_t *shbde, int usec)
{
if (shbde && shbde->usleep) {
shbde->usleep(usec);
} else {
int idx;
volatile int count;
for (idx = 0; idx < usec; idx++) {
for (count = 0; count < 100; count++);
}
}
}
/*
* Function:
* shbde_iproc_config_init
* Purpose:
* Initialize iProc configuration parameters
* Parameters:
* icfg - pointer to empty iProc configuration structure
* Returns:
* -1 if error, otherwise 0
*/
int
shbde_iproc_config_init(shbde_iproc_config_t *icfg,
unsigned int dev_id, unsigned int dev_rev)
{
if (!icfg) {
return -1;
}
/* Save device ID and revision */
icfg->dev_id = dev_id;
icfg->dev_rev = dev_rev;
/* Check device families first */
switch (icfg->dev_id & 0xfff0) {
case 0x8400: /* Greyhound Lite */
case 0x8410: /* Greyhound */
case 0x8420: /* Bloodhound */
case 0x8450: /* Elkhound */
case 0xb060: /* Ranger2(Greyhound) */
case 0x8360: /* Greyhound 53365 & 53369 */
case 0xb260: /* saber2 */
case 0xb460: /* saber2+ */
case 0xb170: /* Hurricane3-MG */
case 0x8570: /* Greyhound2 */
case 0xb070: /* Greyhound2(emulation) */
case 0x8580: /* Greyhound2(emulation) */
case 0xb230: /* Dagger2 */
icfg->iproc_ver = 7;
icfg->dma_hi_bits = 0x2;
break;
case 0xb560: /* Apache */
case 0xb760: /* Maverick */
icfg->iproc_ver = 0xB;
break;
case 0xb160: /* Hurricane3 */
case 0x8440: /* Wolfhound2 */
case 0x8430: /* Foxhound2 */
icfg->iproc_ver = 10;
icfg->dma_hi_bits = 0x2;
break;
default:
break;
}
/* Check for exceptions */
switch (icfg->dev_id) {
case 0xb069:
case 0xb068:
icfg->iproc_ver = 0xB; /*Ranger2+ Apache Family */
icfg->dma_hi_bits = 0;
break;
case 0xb168: /* Ranger3+ */
case 0xb169:
icfg->iproc_ver = 0;
icfg->dma_hi_bits = 0;
break;
default:
break;
}
/* Check for PCIe PHY address that needs PCIe preemphasis and
* assign the MDIO base address
*/
switch (icfg->dev_id & 0xfff0) {
case 0xb150: /* Hurricane2 */
case 0x8340: /* Wolfhound */
case 0x8330: /* Foxhound */
case 0x8390: /* Dearhound */
icfg->mdio_base_addr = 0x18032000;
icfg->pcie_phy_addr = 0x2;
break;
case 0xb340: /* Helilx4 */
case 0xb540: /* FireScout */
case 0xb040: /* Spiral, Ranger */
icfg->mdio_base_addr = 0x18032000;
icfg->pcie_phy_addr = 0x5;
icfg->adjust_pcie_preemphasis = 1;
break;
case 0xa450: /* Katana2 */
case 0xb240:
case 0xb450:
icfg->mdio_base_addr = 0x18032000;
icfg->pcie_phy_addr = 0x5;
icfg->adjust_pcie_preemphasis = 1;
break;
default:
break;
}
/* Check for exceptions */
switch (icfg->dev_id) {
default:
break;
}
return 0;
}
/*
* Function:
* shbde_iproc_paxb_init
* Purpose:
* Initialize iProc PCI-AXI bridge for CMIC access
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* iproc_regs - memory mapped iProc registers in PCI BAR
* icfg - iProc configuration parameters
* Returns:
* -1 if error, otherwise 0
*/
int
shbde_iproc_paxb_init(shbde_hal_t *shbde, void *iproc_regs,
shbde_iproc_config_t *icfg)
{
void *reg;
unsigned int data;
int pci_num;
if (!iproc_regs || !icfg) {
return -1;
}
/*
* The following code attempts to auto-detect the correct
* iProc PCI endianess configuration by reading a well-known
* register (the endianess configuration register itself).
* Note that the PCI endianess may be different for different
* big endian host processors.
*/
reg = ROFFS(iproc_regs, BAR0_PAXB_ENDIANESS);
/* Select big endian */
iproc32_write(shbde, reg, 0x01010101);
/* Check if endianess register itself is correct endian */
if (iproc32_read(shbde, reg) != 1) {
/* If not, then assume little endian */
iproc32_write(shbde, reg, 0x0);
}
/* Select which PCI core to use */
pci_num = 0;
reg = ROFFS(iproc_regs, BAR0_PAXB_IMAP0_2);
data = iproc32_read(shbde, reg);
if (data & 0x1000) {
/* PAXB_1 is mapped to sub-window 2 */
pci_num = 1;
}
/* Default DMA mapping if uninitialized */
if (icfg->dma_hi_bits == 0) {
icfg->dma_hi_bits = 0x1;
if (pci_num == 1) {
icfg->dma_hi_bits = 0x2;
}
}
/* Enable iProc DMA to external host memory */
reg = ROFFS(iproc_regs, BAR0_PAXB_PCIE_EP_AXI_CONFIG);
iproc32_write(shbde, reg, 0x0);
if(icfg->cmic_ver < 4) { /* Non-CMICX */
reg = ROFFS(iproc_regs, BAR0_PAXB_OARR_2);
iproc32_write(shbde, reg, 0x1);
reg = ROFFS(iproc_regs, BAR0_PAXB_OARR_2_UPPER);
iproc32_write(shbde, reg, icfg->dma_hi_bits);
/* Configure MSI interrupt page */
if (icfg->use_msi) {
reg = ROFFS(iproc_regs, BAR0_PAXB_OARR_FUNC0_MSI_PAGE);
data = iproc32_read(shbde, reg);
iproc32_write(shbde, reg, data | 0x1);
}
}
return pci_num;
}
/*
* Function:
* shbde_iproc_pci_read
* Purpose:
* Read iProc register through PCI BAR 0
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* iproc_regs - memory mapped iProc registers in PCI BAR
* addr - iProc register address in AXI memory space
* Returns:
* Register value
*/
unsigned int
shbde_iproc_pci_read(shbde_hal_t *shbde, void *iproc_regs,
unsigned int addr)
{
unsigned int subwin_base;
void *reg;
shbde_iproc_config_t *icfg = &shbde->icfg;
if (!iproc_regs) {
return -1;
}
/* Sub-window size is 0x1000 (4K) */
subwin_base = (addr & ~0xfff);
if((icfg->cmic_ver >= 4) && (subwin_base == 0x18013000)) {
/* Route the INTC block access through IMAP0_6 */
reg = ROFFS(iproc_regs, 0x6000 + (addr & 0xfff));
} else {
/* Update base address for sub-window 7 */
subwin_base |= 1; /* Valid bit */
reg = ROFFS(iproc_regs, BAR0_PAXB_IMAP0_7);
iproc32_write(shbde, reg, subwin_base);
/* Read it to make sure the write actually goes through */
subwin_base = iproc32_read(shbde, reg);
/* Read register through sub-window 7 */
reg = ROFFS(iproc_regs, 0x7000 + (addr & 0xfff));
}
return iproc32_read(shbde, reg);
}
/*
* Function:
* shbde_iproc_pci_write
* Purpose:
* Write iProc register through PCI BAR 0
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* iproc_regs - memory mapped iProc registers in PCI BAR
* addr - iProc register address in AXI memory space
* data - data to write to iProc register
* Returns:
* Register value
*/
void
shbde_iproc_pci_write(shbde_hal_t *shbde, void *iproc_regs,
unsigned int addr, unsigned int data)
{
unsigned int subwin_base;
void *reg;
shbde_iproc_config_t *icfg = &shbde->icfg;
if (!iproc_regs) {
return;
}
/* Sub-window size is 0x1000 (4K) */
subwin_base = (addr & ~0xfff);
if((icfg->cmic_ver >= 4) && (subwin_base == 0x18013000)) {
/* Route the INTC block access through IMAP0_6 */
reg = ROFFS(iproc_regs, 0x6000 + (addr & 0xfff));
} else {
/* Update base address for sub-window 7 */
subwin_base |= 1; /* Valid bit */
reg = ROFFS(iproc_regs, BAR0_PAXB_IMAP0_7);
iproc32_write(shbde, reg, subwin_base);
/* Read it to make sure the write actually goes through */
subwin_base = iproc32_read(shbde, reg);
/* Read register through sub-window 7 */
reg = ROFFS(iproc_regs, 0x7000 + (addr & 0xfff));
}
iproc32_write(shbde, reg, data);
}
int
shbde_iproc_pcie_preemphasis_set(shbde_hal_t *shbde, void *iproc_regs,
shbde_iproc_config_t *icfg, void *pci_dev)
{
shbde_mdio_ctrl_t mdio_ctrl, *smc = &mdio_ctrl;
unsigned int phy_addr, data;
void *reg;
unsigned int pcie_cap_base;
unsigned short link_stat, link_stat2;
if (!icfg) {
return -1;
}
/* PHY address for PCIe link */
phy_addr = icfg->pcie_phy_addr;
if (phy_addr == 0 || icfg->mdio_base_addr == 0) {
return 0;
}
/* Initialize MDIO control */
smc->shbde = shbde;
smc->regs = iproc_regs;
smc->base_addr = icfg->mdio_base_addr;
smc->io32_read = shbde_iproc_pci_read;
smc->io32_write = shbde_iproc_pci_write;
shbde_iproc_mdio_init(smc);
/* PCIe SerDes Gen1/Gen2 CDR Track Bandwidth Adjustment
* for Better Jitter Tolerance
*/
shbde_iproc_mdio_write(smc, phy_addr, 0x1f, 0x8630);
shbde_iproc_mdio_write(smc, phy_addr, 0x13, 0x190);
shbde_iproc_mdio_write(smc, phy_addr, 0x19, 0x191);
if (!icfg->adjust_pcie_preemphasis) {
return 0;
}
/* Check to see if the PCIe SerDes deemphasis needs to be changed
* based on the advertisement from the root complex
*/
/* Find PCIe capability base */
if (!shbde || !shbde->pcic16_read || !pci_dev) {
return -1;
}
pcie_cap_base = shbde_pci_pcie_cap(shbde, pci_dev);
if (pcie_cap_base) {
link_stat = shbde->pcic16_read(pci_dev,
pcie_cap_base + PCI_EXP_LNKSTA);
link_stat2 = shbde->pcic16_read(pci_dev,
pcie_cap_base + PCI_EXP_LNKSTA2);
if (((link_stat & 0xf) == PCI_EXP_LNKSTA_CLS_5_0GB) &&
(link_stat2 & PCI_EXP_LNKSTA2_CDL_3_5DB)) {
/* Device is operating at Gen2 speeds and RC requested -3.5dB */
/* Change the transmitter setting */
shbde_iproc_mdio_write(smc, phy_addr, 0x1f, 0x8610);
shbde_iproc_mdio_read(smc, phy_addr, 0x17, &data);
data &= ~0xf00;
data |= 0x700;
shbde_iproc_mdio_write(smc, phy_addr, 0x17, data);
/* Force the PCIe link to retrain */
data = 0;
REG_FIELD_SET(PAXB_CONFIG_IND_ADDRr, PROTOCOL_LAYERf, data, 0x2);
REG_FIELD_SET(PAXB_CONFIG_IND_ADDRr, ADDRESSf, data, 0x4);
reg = ROFFS(iproc_regs, BAR0_PAXB_CONFIG_IND_ADDR);
iproc32_write(shbde, reg, data);
reg = ROFFS(iproc_regs, BAR0_PAXB_CONFIG_IND_DATA);
data = iproc32_read(shbde, reg);
data &= ~0x4000;
iproc32_write(shbde, reg, data);
data |= 0x4000;
iproc32_write(shbde, reg, data);
data &= ~0x4000;
iproc32_write(shbde, reg, data);
/* Wait a short while for the retraining to complete */
wait_usec(shbde, 1000);
}
}
return 0;
}

View File

@ -0,0 +1,187 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2015 Broadcom Corp.
* All Rights Reserved.$
*
*/
#include <shbde_mdio.h>
/* iProc MDIO register offset */
#define MII_MGMT_CTRL 0x0
#define MII_MGMT_CMD_DATA 0x4
/* iProc MII register with fields definition */
#define MII_MGMT_CTRLr_MDCDIVf_SHFT 0
#define MII_MGMT_CTRLr_MDCDIVf_MASK 0x7f
#define MII_MGMT_CTRLr_BSYf_SHFT 8
#define MII_MGMT_CTRLr_BSYf_MASK 0x1
#define MII_MGMT_CMD_DATAr_DATAf_SHFT 0
#define MII_MGMT_CMD_DATAr_DATAf_MASK 0xffff
#define MII_MGMT_CMD_DATAr_TAf_SHFT 16
#define MII_MGMT_CMD_DATAr_TAf_MASK 0x3
#define MII_MGMT_CMD_DATAr_RAf_SHFT 18
#define MII_MGMT_CMD_DATAr_RAf_MASK 0x1f
#define MII_MGMT_CMD_DATAr_PAf_SHFT 23
#define MII_MGMT_CMD_DATAr_PAf_MASK 0x1f
#define MII_MGMT_CMD_DATAr_OPf_SHFT 28
#define MII_MGMT_CMD_DATAr_OPf_MASK 0x3
#define MII_MGMT_CMD_DATAr_SBf_SHFT 30
#define MII_MGMT_CMD_DATAr_SBf_MASK 0x3
/* Register field value set/get */
#define REG_FIELD_SET(_r, _f, _r_val, _f_val) \
_r_val = ((_r_val) & ~(_r##_##_f##_MASK << _r##_##_f##_SHFT)) | \
(((_f_val) & _r##_##_f##_MASK) << _r##_##_f##_SHFT)
#define REG_FIELD_GET(_r, _f, _r_val) \
(((_r_val) >> _r##_##_f##_SHFT) & _r##_##_f##_MASK)
#define LOG_OUT(_shbde, _lvl, _str, _prm) \
if ((_shbde)->log_func) { \
(_shbde)->log_func(_lvl, _str, _prm); \
}
#define LOG_ERR(_shbde, _str, _prm) LOG_OUT(_shbde, SHBDE_ERR, _str, _prm)
#define LOG_WARN(_shbde, _str, _prm) LOG_OUT(_shbde, SHBDE_WARN, _str, _prm)
#define LOG_DBG(_shbde, _str, _prm) LOG_OUT(_shbde, SHBDE_DBG, _str, _prm)
static unsigned int
mdio32_read(shbde_mdio_ctrl_t *smc, unsigned int offset)
{
if (!smc || !smc->io32_read) {
return 0;
}
return smc->io32_read(smc->shbde, smc->regs, smc->base_addr + offset);
}
static void
mdio32_write(shbde_mdio_ctrl_t *smc, unsigned int offset, unsigned int data)
{
if (!smc || !smc->io32_read) {
return;
}
smc->io32_write(smc->shbde, smc->regs, smc->base_addr + offset, data);
}
static void
wait_usec(shbde_mdio_ctrl_t *smc, int usec)
{
shbde_hal_t *shbde = smc->shbde;
if (shbde && shbde->usleep) {
shbde->usleep(usec);
} else {
int idx;
volatile int count;
for (idx = 0; idx < usec; idx++) {
for (count = 0; count < 100; count++);
}
}
}
static int
iproc_mdio_wait_for_busy(shbde_mdio_ctrl_t *smc)
{
int mii_busy;
unsigned int reg_val;
int count = 1000;
/* Wait until MII is not busy */
do {
reg_val = mdio32_read(smc, MII_MGMT_CTRL);
mii_busy = REG_FIELD_GET(MII_MGMT_CTRLr, BSYf, reg_val);
if (!mii_busy) {
break;
}
wait_usec(smc, 10);
count --;
} while (count > 0);
return mii_busy;
}
int
shbde_iproc_mdio_init(shbde_mdio_ctrl_t *smc)
{
shbde_hal_t *shbde = smc->shbde;
unsigned int reg_val = 0;
/* Enable the iProc internal MDIO interface */
REG_FIELD_SET(MII_MGMT_CTRLr, MDCDIVf, reg_val, 0x7f);
mdio32_write(smc, MII_MGMT_CTRL, reg_val);
if (shbde && !shbde->usleep) {
LOG_DBG(shbde, "shbde_mdio: no registration of usleep vector", 0);
}
wait_usec(smc, 100);
return 0;
}
int
shbde_iproc_mdio_read(shbde_mdio_ctrl_t *smc, unsigned int phy_addr,
unsigned int reg, unsigned int *val)
{
unsigned int reg_val = 0;
REG_FIELD_SET(MII_MGMT_CMD_DATAr, SBf, reg_val, 0x1);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, TAf, reg_val, 0x2);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, OPf, reg_val, 0x2);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, PAf, reg_val, phy_addr);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, RAf, reg_val, reg);
mdio32_write(smc, MII_MGMT_CMD_DATA, reg_val);
if (iproc_mdio_wait_for_busy(smc)) {
*val = 0;
LOG_DBG(smc->shbde, "shbde_iproc_mdio_read busy", reg);
return -1;
}
reg_val = mdio32_read(smc, MII_MGMT_CMD_DATA);
*val = REG_FIELD_GET(MII_MGMT_CMD_DATAr, DATAf, reg_val);
return 0;
}
int
shbde_iproc_mdio_write(shbde_mdio_ctrl_t *smc, unsigned int phy_addr,
unsigned int reg, unsigned int val)
{
unsigned int reg_val = 0;
REG_FIELD_SET(MII_MGMT_CMD_DATAr, SBf, reg_val, 0x1);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, TAf, reg_val, 0x2);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, OPf, reg_val, 0x1);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, PAf, reg_val, phy_addr);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, RAf, reg_val, reg);
REG_FIELD_SET(MII_MGMT_CMD_DATAr, DATAf, reg_val, val);
mdio32_write(smc, MII_MGMT_CMD_DATA, reg_val);
if (iproc_mdio_wait_for_busy(smc)) {
LOG_DBG(smc->shbde, "shbde_iproc_mdio_write busy", reg);
return -1;
}
/* Wait for some time for the write to take effect */
wait_usec(smc, 100);
return 0;
}

View File

@ -0,0 +1,393 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: $
* $Copyright: (c) 2014 Broadcom Corp.
* All Rights Reserved.$
*
*/
#include <shbde_pci.h>
/* PCIe capabilities */
#ifndef PCI_CAPABILITY_LIST
#define PCI_CAPABILITY_LIST 0x34
#endif
#ifndef PCI_CAP_ID_EXP
#define PCI_CAP_ID_EXP 0x10
#endif
#ifndef PCI_EXP_DEVCAP
#define PCI_EXP_DEVCAP 4
#endif
#ifndef PCI_EXP_DEVCTL
#define PCI_EXP_DEVCTL 8
#endif
#ifndef PCI_EXT_CAP_START
#define PCI_EXT_CAP_START 0x100
#endif
#ifndef PCI_EXT_CAP_ID
#define PCI_EXT_CAP_ID(_hdr) (_hdr & 0x0000ffff)
#endif
#ifndef PCI_EXT_CAP_VER
#define PCI_EXT_CAP_VER(_hdr) ((_hdr >> 16) & 0xf)
#endif
#ifndef PCI_EXT_CAP_NEXT
#define PCI_EXT_CAP_NEXT(_hdr) ((_hdr >> 20) & 0xffc)
#endif
#ifndef PCI_EXT_CAP_ID_VNDR
#define PCI_EXT_CAP_ID_VNDR 0x0b
#endif
#define LOG_OUT(_shbde, _lvl, _str, _prm) \
if ((_shbde)->log_func) { \
(_shbde)->log_func(_lvl, _str, _prm); \
}
#define LOG_ERR(_shbde, _str, _prm) LOG_OUT(_shbde, SHBDE_ERR, _str, _prm)
#define LOG_WARN(_shbde, _str, _prm) LOG_OUT(_shbde, SHBDE_WARN, _str, _prm)
#define LOG_DBG(_shbde, _str, _prm) LOG_OUT(_shbde, SHBDE_DBG, _str, _prm)
#ifndef NULL
#define NULL (void *)0
#endif
/*
* Warpper functions with null-pointer checks.
*/
static unsigned int
pcic16_read(shbde_hal_t *shbde, void *pci_dev,
unsigned int addr)
{
if (!shbde || !shbde->pcic16_read) {
return 0;
}
return shbde->pcic16_read(pci_dev, addr);
}
static void
pcic16_write(shbde_hal_t *shbde, void *pci_dev,
unsigned int addr, unsigned int data)
{
if (!shbde || !shbde->pcic16_write) {
return;
}
shbde->pcic16_write(pci_dev, addr, data);
}
static unsigned int
pcic32_read(shbde_hal_t *shbde, void *pci_dev,
unsigned int addr)
{
if (!shbde || !shbde->pcic32_read) {
return 0;
}
return shbde->pcic32_read(pci_dev, addr);
}
static void *
pci_parent_device_get(shbde_hal_t *shbde, void *pci_dev)
{
if (!shbde || !shbde->pci_parent_device_get) {
return NULL;
}
return shbde->pci_parent_device_get(pci_dev);
}
/*
* Function:
* shbde_pci_pcie_cap
* Purpose:
* Return offset of PCIe capabilities in PCI configuration space
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* dev - PCI device handle (passed back to PCI HAL functions)
* Returns:
* PCI_CAP_ID_EXP offset in PCI configuration space if PCIe, otherwise 0
*/
unsigned int
shbde_pci_pcie_cap(shbde_hal_t *shbde, void *pci_dev)
{
unsigned int cap_base, rval;
cap_base = pcic16_read(shbde, pci_dev, PCI_CAPABILITY_LIST);
while (cap_base) {
rval = pcic16_read(shbde, pci_dev, cap_base);
if ((rval & 0xff) == PCI_CAP_ID_EXP) {
break;
}
cap_base = (rval >> 8) & 0xff;
}
return cap_base;
}
/*
* Function:
* shbde_pci_is_pcie
* Purpose:
* Check if PCI device is PCIe device
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* dev - PCI device handle (passed back to PCI HAL functions)
* Returns:
* 1 if PCIe, otherwise 0
*/
int
shbde_pci_is_pcie(shbde_hal_t *shbde, void *pci_dev)
{
return shbde_pci_pcie_cap(shbde, pci_dev) ? 1 : 0;
}
/*
* Function:
* shbde_pci_is_iproc
* Purpose:
* Check if PCI device is iProc-based
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* dev - PCI device handle (passed back to PCI HAL functions)
* cmic_bar - (OUT) PCI BAR which contains switch CMIC registers
* Returns:
* 1 if iProc-based, otherwise 0
*/
int
shbde_pci_is_iproc(shbde_hal_t *shbde, void *pci_dev, int *cmic_bar)
{
unsigned int cap_base, rval;
if (!shbde_pci_is_pcie(shbde, pci_dev)) {
return 0;
}
/* Look for PCIe vendor-specific extended capability (VSEC) */
cap_base = PCI_EXT_CAP_START;
while (cap_base) {
rval = pcic32_read(shbde, pci_dev, cap_base);
if (rval == 0xffffffff) {
/* Assume PCI HW read error */
return 0;
}
if (PCI_EXT_CAP_ID(rval) == PCI_EXT_CAP_ID_VNDR) {
break;
}
cap_base = PCI_EXT_CAP_NEXT(rval);
}
if (cap_base) {
/*
* VSEC layout:
*
* 0x00: PCI Express Extended Capability Header
* 0x04: Vendor-Specific Header
* 0x08: Vendor-Specific Register 1
* 0x0c: Vendor-Specific Register 2
* ...
* 0x24: Vendor-Specific Register 8
*/
/* 32'b // 31:12=0 Reserved; 11:08=CMIC BAR; 07:00=iProc Configuration ID */
rval = pcic32_read(shbde, pci_dev, cap_base + 8);
LOG_DBG(shbde, "Found VSEC", rval);
/* Determine PCI BAR of CMIC */
*cmic_bar = 0;
if ((rval & 0x100) == 0x100) {
*cmic_bar = 2;
}
/* Assume iProc device */
return 1;
}
return 0;
}
/*
* Function:
* shbde_pci_iproc_version_get
* Purpose:
* Get iproc, cmic versions and revisions
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* dev - PCI device handle (passed back to PCI HAL functions)
* iproc_ver - (OUT) iProc version
* cmic_ver - (OUT) CMIC version
* cmic_rev - (OUT) CMIC revision
* Returns:
* 1 for no error, otherwise 0
*/
int
shbde_pci_iproc_version_get(shbde_hal_t *shbde, void *pci_dev,
unsigned int *iproc_ver,
unsigned int *cmic_ver,
unsigned int *cmic_rev)
{
unsigned int cap_base, rval;
if (!shbde_pci_is_pcie(shbde, pci_dev)) {
return 0;
}
/* Look for PCIe vendor-specific extended capability (VSEC) */
cap_base = PCI_EXT_CAP_START;
while (cap_base) {
rval = pcic32_read(shbde, pci_dev, cap_base);
if (rval == 0xffffffff) {
/* Assume PCI HW read error */
return 0;
}
if (PCI_EXT_CAP_ID(rval) == PCI_EXT_CAP_ID_VNDR) {
break;
}
cap_base = PCI_EXT_CAP_NEXT(rval);
}
if (cap_base) {
/*
* VSEC layout:
*
* 0x00: PCI Express Extended Capability Header
* 0x04: Vendor-Specific Header
* 0x08: Vendor-Specific Register 1
* 0x0c: Vendor-Specific Register 2
* ...
* 0x24: Vendor-Specific Register 8
*/
/* Read PCIe Vendor Specific Register 1 */
/* VENODR REG FORMAT
* [7:0] iProc Rev = 8'h0E (for P14)
* [11:8] CMIC BAR = 4'h1 (BAR64-1)
* [15:12] CMIC Version = 4'h4
* [19:16] CMIC Rev = 4'h1
* [22:20] SBUS Version = 4'h4
*/
rval = pcic32_read(shbde, pci_dev, cap_base + 8);
LOG_DBG(shbde, "Found VSEC", rval);
/* Determine PCI BAR of CMIC */
*iproc_ver = rval & 0xff;
*cmic_ver = (rval >> 12) & 0xf;
*cmic_rev = (rval >> 16) & 0xf;
return 1;
}
return 0;
}
/*
* Function:
* shbde_pci_max_payload_set
* Purpose:
* Set PCIe maximum payload
* Parameters:
* shbde - pointer to initialized hardware abstraction module
* dev - PCI device handle (passed back to PCI HAL functions)
* maxpayload - maximum payload (in byte)
* Returns:
* -1 if error, otherwise 0
* Notes:
* If not PCIe device, set the PCI retry count to infinte instead.
*/
int
shbde_pci_max_payload_set(shbde_hal_t *shbde, void *pci_dev, int maxpayload)
{
unsigned int cap_base, parent_cap_base;
unsigned int devcap, devctl, parent_devctl;
int max_val, max_cap, parent_max_val;
void *parent_pci_dev;
cap_base = shbde_pci_pcie_cap(shbde, pci_dev);
if (cap_base == 0) {
/* Not PCIe */
return 0;
}
/* Get current device control settings */
devctl = pcic16_read(shbde, pci_dev, cap_base + PCI_EXP_DEVCTL);
/* Get current max payload setting */
max_val = (devctl >> 5) & 0x7;
if (maxpayload) {
/* Get encoding from byte value */
max_val = 0;
while ((1 << (max_val + 7)) < maxpayload) {
max_val++;
}
LOG_DBG(shbde, "Set max payload size", maxpayload);
LOG_DBG(shbde, "Set max payload val", max_val);
/* Get max supported payload size */
devcap = pcic16_read(shbde, pci_dev, cap_base + PCI_EXP_DEVCAP);
max_cap = (devcap & 0x7);
/* Do not exceed device capabilities */
if (max_val > max_cap) {
max_val = max_cap;
LOG_DBG(shbde,
"Payload size exceeds device capability",
maxpayload);
}
/* Get currently set max payload size for the parent device
* in the PCI tree (if it exists).
*/
parent_pci_dev = pci_parent_device_get(shbde, pci_dev);
if (parent_pci_dev != NULL) {
parent_cap_base = shbde_pci_pcie_cap(shbde, parent_pci_dev);
parent_devctl = pcic16_read(shbde,
parent_pci_dev,
parent_cap_base + PCI_EXP_DEVCTL);
parent_max_val = (parent_devctl >> 5) & 0x7;
/* Do not exceed current parent max payload setting (our device
* should have an MPS setting <= current parent MPS setting in
* the tree of PCIe devices).
*/
if (max_val > parent_max_val) {
max_val = parent_max_val;
LOG_DBG(shbde,
"Payload size exceeds current parent device setting",
maxpayload);
}
}
/* Update max payload size */
devctl &= ~(0x7 << 5);
devctl |= (max_val) << 5;
/* Update max request size */
devctl &= ~(0x7 << 12);
devctl |= (max_val << 12);
}
/* Always disable relaxed ordering */
devctl &= ~(1 << 4);
/* Update device control settings */
pcic16_write(shbde, pci_dev, cap_base + PCI_EXP_DEVCTL, devctl);
/* Warn if non-default setting is used */
if (max_val > 0) {
LOG_WARN(shbde,
"Selected payload size may not be supported by all "
"PCIe bridges by default.",
(1 << (max_val + 7)));
}
return 0;
}

View File

@ -0,0 +1,32 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.10 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# Makefile for SOC SAL support
#
LOCALDIR = systems/linux/kernel/modules
include ${SDK}/make/Make.config
subdirs=shared uk-proxy bcm-diag-full bcm-core bcm-net bcm-diag
include ${SDK}/make/Make.subdirs
include ${SDK}/make/Make.depend

View File

@ -0,0 +1,68 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.3 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
LOCALDIR = systems/linux/kernel/modules/bcm-knet
include ${SDK}/make/Make.config
LIBS = $(LIBDIR)/libkern.a
ifeq ($(kernel_version),2_4)
MODULE = $(LIBDIR)/linux-bcm-knet.o
else
KERNEL_MODULE_DIR = kernel_module
THIS_MOD_NAME := linux-bcm-knet
MODULE = $(LIBDIR)/$(THIS_MOD_NAME).o
KMODULE = $(LIBDIR)/$(THIS_MOD_NAME).ko
build: $(MODULE) $(KMODULE)
endif
KBUILD_EXTRA_SYMBOLS := ${BLDDIR}/../../../../bde/linux/kernel/kernel_module/Module.symvers
ifeq (,$(findstring -DPROXY_SUPPORT=0,$(CFLAGS)))
KBUILD_EXTRA_SYMBOLS += ${BLDDIR}/../uk-proxy/kernel_module/Module.symvers
endif
# BCM Network Device
$(MODULE): $(BLDDIR)/.tree $(BOBJS) $(LIBS)
$(LD) $(MODULE_LDFLAGS) -r -d $(BOBJS) $(LIBS) -o $@
ifneq ($(kernel_version),2_4)
$(KMODULE): $(MODULE)
rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR)
mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR)
cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile
cat ${KBUILD_EXTRA_SYMBOLS} > $(BLDDIR)/$(KERNEL_MODULE_DIR)/Module.symvers
MOD_NAME=$(THIS_MOD_NAME) $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko
endif
# Make.depend is before clean:: so that Make.depend's clean:: runs first.
include ${SDK}/make/Make.depend
clean::
$(RM) $(BLDDIR)/version.c $(BLDDIR)/version.o
$(RM) $(BOBJS) $(MODULE)
ifneq ($(kernel_version),2_4)
.PHONY: build
endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,79 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: bcm-knet.h,v 1.4 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef __LINUX_BCM_KNET_H__
#define __LINUX_BCM_KNET_H__
#ifndef __KERNEL__
#include <stdint.h>
#endif
typedef struct {
int rc;
int len;
int bufsz;
int reserved;
uint64_t buf;
} bkn_ioctl_t;
#ifdef __KERNEL__
/*
* Call-back interfaces for other Linux kernel drivers.
*/
#include <linux/skbuff.h>
typedef struct {
uint32 netif_user_data;
uint32 filter_user_data;
uint16 dcb_type;
} knet_skb_cb_t;
#define KNET_SKB_CB(__skb) ((knet_skb_cb_t *)&((__skb)->cb[0]))
typedef struct sk_buff *
(*knet_skb_cb_f)(struct sk_buff *skb, int dev_no, void *meta);
typedef int
(*knet_filter_cb_f)(uint8_t *pkt, int size, int dev_no, void *meta,
int chan, kcom_filter_t *filter);
extern int
bkn_rx_skb_cb_register(knet_skb_cb_f rx_cb);
extern int
bkn_rx_skb_cb_unregister(knet_skb_cb_f rx_cb);
extern int
bkn_tx_skb_cb_register(knet_skb_cb_f tx_cb);
extern int
bkn_tx_skb_cb_unregister(knet_skb_cb_f tx_cb);
extern int
bkn_filter_cb_register(knet_filter_cb_f filter_cb);
extern int
bkn_filter_cb_unregister(knet_filter_cb_f filter_cb);
#endif
#endif /* __LINUX_BCM_KNET_H__ */

View File

@ -0,0 +1,66 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: gmodule.h,v 1.9 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef __COMMON_LINUX_KRN_GMODULE_H__
#define __COMMON_LINUX_KRN_GMODULE_H__
#include <lkm.h>
typedef struct gmodule_s {
const char* name;
int major;
int minor;
int (*init)(void);
int (*cleanup)(void);
int (*pprint)(void);
int (*open)(void);
int (*ioctl)(unsigned int cmd, unsigned long arg);
int (*close)(void);
int (*mmap) (struct file *filp, struct vm_area_struct *vma);
} gmodule_t;
/* The framework will ask for your module definition */
extern gmodule_t* gmodule_get(void);
/* Proc Filesystem information */
extern int pprintf(const char* fmt, ...)
__attribute__ ((format (printf, 1, 2)));
extern int gmodule_vpprintf(char** page, const char* fmt, va_list args)
__attribute__ ((format (printf, 2, 0)));
extern int gmodule_pprintf(char** page, const char* fmt, ...)
__attribute__ ((format (printf, 2, 3)));
extern int gprintk(const char* fmt, ...)
__attribute__ ((format (printf, 1, 2)));
extern int gdbg(const char* fmt, ...)
__attribute__ ((format (printf, 1, 2)));
#define GDBG gdbg
#endif /* __COMMON_LINUX_KRN_GMODULE_H__ */

View File

@ -0,0 +1,180 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: lkm.h,v 1.22 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#ifndef __COMMON_LINUX_KRN_LKM_H__
#define __COMMON_LINUX_KRN_LKM_H__
#ifndef __KERNEL__
# define __KERNEL__
#endif
#ifndef MODULE
# define MODULE
#endif
#include <linux/init.h>
#include <linux/version.h>
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#include <linux/config.h>
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,1,0)
#include <linux/kconfig.h>
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
#include <linux/slab.h>
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,39)
#include <linux/smp_lock.h>
#endif
#include <linux/module.h>
/* Helper defines for multi-version kernel support */
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
#define LKM_2_4
#else
#define LKM_2_6
#endif
#include <linux/kernel.h> /* printk() */
#include <linux/fs.h> /* everything... */
#include <linux/errno.h> /* error codes */
#include <linux/types.h> /* size_t */
#include <linux/proc_fs.h>
#include <linux/fcntl.h> /* O_ACCMODE */
#include <linux/pci.h>
#include <linux/interrupt.h>
#include <linux/stat.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <asm/io.h>
#include <asm/hardirq.h>
#include <asm/uaccess.h>
#ifdef CONFIG_DEVFS_FS
#include <linux/devfs_fs_kernel.h>
#endif
#define PROC_INTERFACE_KERN_VER_3_10 (LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0))
/* Compatibility Macros */
#ifdef LKM_2_4
#include <linux/compatmac.h>
#include <linux/wrapper.h>
#define LKM_MOD_PARAM(n,ot,nt,d) MODULE_PARM(n,ot)
#define LKM_MOD_PARAM_ARRAY(n,ot,nt,c,d) MODULE_PARM(n,ot)
#define LKM_EXPORT_SYM(s)
#define _free_netdev kfree
#else /* LKM_2_6 */
#define LKM_MOD_PARAM(n,ot,nt,d) module_param(n,nt,d)
#define LKM_MOD_PARAM_ARRAY(n,ot,nt,c,d) module_param_array(n,nt,c,d)
#define LKM_EXPORT_SYM(s) EXPORT_SYMBOL(s)
#define _free_netdev free_netdev
#endif /* LKM_2_x */
#ifndef list_for_each_safe
#define list_for_each_safe(l,t,i) t = 0; list_for_each((l),(i))
#endif
#ifndef reparent_to_init
#define reparent_to_init()
#endif
#ifndef MODULE_LICENSE
#define MODULE_LICENSE(str)
#endif
#ifndef EXPORT_NO_SYMBOLS
#define EXPORT_NO_SYMBOLS
#endif
#ifndef DEFINE_SPINLOCK
#define DEFINE_SPINLOCK(_lock) spinlock_t _lock = SPIN_LOCK_UNLOCKED
#endif
#ifndef __SPIN_LOCK_UNLOCKED
#define __SPIN_LOCK_UNLOCKED(_lock) SPIN_LOCK_UNLOCKED
#endif
#ifndef lock_kernel
#ifdef preempt_disable
#define lock_kernel() preempt_disable()
#else
#define lock_kernel()
#endif
#endif
#ifndef unlock_kernel
#ifdef preempt_enable
#define unlock_kernel() preempt_enable()
#else
#define unlock_kernel()
#endif
#endif
#ifndef init_MUTEX_LOCKED
#define init_MUTEX_LOCKED(_sem) sema_init(_sem, 0)
#endif
#ifdef CONFIG_BCM98245
#define CONFIG_BMW
#endif
#if PROC_INTERFACE_KERN_VER_3_10
#define PROC_CREATE(_entry, _name, _acc, _path, _fops) \
do { \
_entry = proc_create(_name, _acc, _path, _fops); \
} while (0)
#define PROC_CREATE_DATA(_entry, _name, _acc, _path, _fops, _data) \
do { \
_entry = proc_create_data(_name, _acc, _path, _fops, _data); \
} while (0)
#define PROC_PDE_DATA(_node) PDE_DATA(_node)
#else
#define PROC_CREATE(_entry, _name, _acc, _path, _fops) \
do { \
_entry = create_proc_entry(_name, _acc, _path); \
if (_entry) { \
_entry->proc_fops = _fops; \
} \
} while (0)
#define PROC_CREATE_DATA(_entry, _name, _acc, _path, _fops, _data) \
do { \
_entry = create_proc_entry(_name, _acc, _path); \
if (_entry) { \
_entry->proc_fops = _fops; \
_entry->data=_data; \
} \
} while (0)
#define PROC_PDE_DATA(_node) PROC_I(_node)->pde->data
#endif
#endif /* __COMMON_LINUX_KRN_LKM_H__ */

View File

@ -0,0 +1,65 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id:
# $Copyright: (c) 2017 Broadcom Corp.
# All Rights Reserved.$
#
LOCALDIR = systems/linux/kernel/modules/knet-cb
include ${SDK}/make/Make.config
LIBS = $(LIBDIR)/libkern.a
ifeq ($(kernel_version),2_4)
MODULE = $(LIBDIR)/linux-knet-cb.o
else
KERNEL_MODULE_DIR = kernel_module
THIS_MOD_NAME := linux-knet-cb
MODULE = $(LIBDIR)/$(THIS_MOD_NAME).o
KMODULE = $(LIBDIR)/$(THIS_MOD_NAME).ko
build: $(MODULE) $(KMODULE)
endif
KBUILD_EXTRA_SYMBOLS := ${BLDDIR}/../bcm-knet/kernel_module/Module.symvers
# BCM Network Device
$(MODULE): $(BLDDIR)/.tree $(BOBJS) $(LIBS)
$(LD) $(MODULE_LDFLAGS) -r -d $(BOBJS) $(LIBS) -o $@
ifneq ($(kernel_version),2_4)
$(KMODULE): $(MODULE)
rm -fr $(BLDDIR)/$(KERNEL_MODULE_DIR)
mkdir $(BLDDIR)/$(KERNEL_MODULE_DIR)
cp ${SDK}/make/Makefile.linux-kmodule $(BLDDIR)/$(KERNEL_MODULE_DIR)/Makefile
cat ${KBUILD_EXTRA_SYMBOLS} > $(BLDDIR)/$(KERNEL_MODULE_DIR)/Module.symvers
MOD_NAME=$(THIS_MOD_NAME) $(MAKE) -C $(BLDDIR)/$(KERNEL_MODULE_DIR) $(THIS_MOD_NAME).ko
endif
# Make.depend is before clean:: so that Make.depend's clean:: runs first.
include ${SDK}/make/Make.depend
clean::
$(RM) $(BLDDIR)/version.c $(BLDDIR)/version.o
$(RM) $(BOBJS) $(MODULE)
ifneq ($(kernel_version),2_4)
.PHONY: build
endif

View File

@ -0,0 +1,276 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id:
* $Copyright: (c) 2017 Broadcom Corp.
* All Rights Reserved.$
*/
/*
* Driver for call-back functions for Linux KNET driver.
*
* This is sample code that demonstrates how to selectively strip VLAN tags
* from an incoming packet based on tag information in the DMA control block
* (DCB). The switch will automatically add a VLAN tag to packets that ingress
* without an outer VLAN tag. Outer tagged and double tagged packets are
* not modified. The call back defined here determines which packets have
* had tags added by those and strips only those tags from the packet.
*
* This is sample code, the customer is responsible for maintaining and
* modifying this code as necessary.
*
* The module can be built from the standard Linux user mode target
* directories using the following command (assuming bash), e.g.
*
* cd $SDK/systems/linux/user/<target>
* make BUILD_KNET_CB=1
*
*/
#include <gmodule.h> /* Must be included first */
#include <kcom.h>
#include <bcm-knet.h>
#include <linux/if_vlan.h>
MODULE_AUTHOR("Broadcom Corporation");
MODULE_DESCRIPTION("Broadcom Linux KNET Call-Back Driver");
MODULE_LICENSE("GPL");
/* Module Information */
#define MODULE_MAJOR 121
#define MODULE_NAME "linux-knet-cb"
/* set KNET_CB_DEBUG for debug info */
#define KNET_CB_DEBUG
/* Maintain tag strip statistics */
struct strip_stats_s {
unsigned long stripped; /* Number of packets that have been stripped */
unsigned long checked;
unsigned long skipped;
};
static struct strip_stats_s strip_stats;
/* Local function prototypes */
static void strip_vlan_tag(struct sk_buff *skb);
static int get_tag_status(int dcb_type, void *meta);
static struct sk_buff *strip_tag_rx_cb(struct sk_buff *skb, int dev_no, void *meta);
static struct sk_buff *strip_tag_tx_cb(struct sk_buff *skb, int dev_no, void *meta);
static int strip_tag_filter_cb(uint8_t * pkt, int size, int dev_no, void *meta,
int chan, kcom_filter_t * kf);
static int _pprint(void);
static int _cleanup(void);
static int _init(void);
/* Remove VLAN tag for select TPIDs */
static void
strip_vlan_tag(struct sk_buff *skb)
{
uint16_t vlan_proto = (uint16_t) ((skb->data[12] << 8) | skb->data[13]);
if ((vlan_proto == 0x8100) || (vlan_proto == 0x88a8) || (vlan_proto == 0x9100)) {
/* Move first 12 bytes of packet back by 4 */
((u32 *) skb->data)[3] = ((u32 *) skb->data)[2];
((u32 *) skb->data)[2] = ((u32 *) skb->data)[1];
((u32 *) skb->data)[1] = ((u32 *) skb->data)[0];
skb_pull(skb, 4); /* Remove 4 bytes from start of buffer */
}
}
/*
* Location of tagging status in select DCB types found below:
*
* DCB type 14: word 12, bits 10.11
* DCB type 19, 20, 21, 22, 30: word 12, bits 10..11
* DCB type 23, 29: word 13, bits 0..1
* DCB type 31, 34, 37: word 13, bits 0..1
* DCB type 26, 32, 33, 35: word 13, bits 0..1
*
* The function get_tag_status() returns the tag status for known DCB types.
* 0 = Untagged
* 1 = Single inner-tag
* 2 = Single outer-tag
* 3 = Double tagged.
* -1 = Unsupported DCB type
*/
static int
get_tag_status(int dcb_type, void *meta)
{
uint32 *dcb = (uint32 *) meta;
int tag_status;
switch (dcb_type) {
case 14:
case 19:
case 20:
case 21:
case 22:
case 30:
tag_status = (dcb[12] > 10) & 0x3;
break;
case 23:
case 29:
case 31:
case 34:
case 37:
case 26:
case 32:
case 33:
case 35:
tag_status = dcb[13] & 0x3;
break;
default:
tag_status = -1;
break;
}
return tag_status;
}
/*
* SDK-134189 added the ability to pass two 4 byte unsigned values to the
* KNET callback function, one from the matching filter and one from the
* network interface. The usage of this data is completely defined by the
* user. In this case, if bit 0 of the interface value is set, tag stripping
* is enabled for that interface. When creating the interface and filter,
* something like the following is necessary: "netif.cb_user_data = uflags".
*/
#define NETIF_UNTAGGED_STRIP (1 << 0)
/* Rx packet callback function */
static struct sk_buff *
strip_tag_rx_cb(struct sk_buff *skb, int dev_no, void *meta)
{
unsigned netif_flags = KNET_SKB_CB(skb)->netif_user_data;
unsigned dcb_type;
int tag_status;
/* Currently not using filter flags:
* unsigned filter_flags = KNET_SKB_CB(skb)->filter_user_data;
*/
#ifdef KNET_CB_DEBUG
gprintk("%s Enter; Flags: %08X\n", __func__, netif_flags);
#endif
if ((netif_flags & NETIF_UNTAGGED_STRIP) == 0) {
/* Untagged stripping not enabled on this netif */
strip_stats.skipped++;
return skb;
}
/* Get DCB type for this packet, passed by KNET driver */
dcb_type = KNET_SKB_CB(skb)->dcb_type;
/* Get tag status from DCB */
tag_status = get_tag_status(dcb_type, meta);
#ifdef KNET_CB_DEBUG
gprintk("%s; DCB Type: %d; tag status: %d\n", __func__, dcb_type, tag_status);
#endif
if (tag_status < 0) {
/* Unsupported DCB type */
return skb;
}
strip_stats.checked++;
/*
* Untagged and inner tagged packet will get a new tag from the switch
* device, we need to strip this off.
*/
if (tag_status < 2) {
#ifdef KNET_CB_DEBUG
gprintk("%s; Stripping VLAN\n", __func__);
#endif
strip_stats.stripped++;
strip_vlan_tag(skb);
}
#ifdef KNET_CB_DEBUG
else {
gprintk("%s; Preserve VLAN\n", __func__);
}
#endif
return skb;
}
/* Tx callback not used */
static struct sk_buff *
strip_tag_tx_cb(struct sk_buff *skb, int dev_no, void *meta)
{
/* Pass through for now */
return skb;
}
/* Filter callback not used */
static int
strip_tag_filter_cb(uint8_t * pkt, int size, int dev_no, void *meta,
int chan, kcom_filter_t *kf)
{
/* Pass through for now */
return 0;
}
/*
* Get statistics.
* % cat /proc/linux-knet-cb
*/
static int
_pprint(void)
{
pprintf("Broadcom Linux KNET Call-Back: Untagged VLAN Stripper\n");
pprintf(" %lu stripped packets\n", strip_stats.stripped);
pprintf(" %lu packets checked\n", strip_stats.checked);
pprintf(" %lu packets skipped\n", strip_stats.skipped);
return 0;
}
static int
_cleanup(void)
{
bkn_rx_skb_cb_unregister(strip_tag_rx_cb);
bkn_tx_skb_cb_unregister(strip_tag_tx_cb);
bkn_filter_cb_unregister(strip_tag_filter_cb);
return 0;
}
static int
_init(void)
{
bkn_rx_skb_cb_register(strip_tag_rx_cb);
bkn_tx_skb_cb_register(strip_tag_tx_cb);
bkn_filter_cb_register(strip_tag_filter_cb);
return 0;
}
static gmodule_t _gmodule = {
name: MODULE_NAME,
major: MODULE_MAJOR,
init: _init,
cleanup: _cleanup,
pprint: _pprint,
ioctl: NULL,
open: NULL,
close: NULL,
};
gmodule_t*
gmodule_get(void)
{
EXPORT_NO_SYMBOLS;
return &_gmodule;
}

View File

@ -0,0 +1,30 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.2 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
LOCALDIR = systems/linux/kernel/modules/shared
include ${SDK}/make/Make.config
lib = libkern
include ${SDK}/make/Make.kernlib
include ${SDK}/make/Make.depend

View File

@ -0,0 +1,428 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: gmodule.c,v 1.20 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*
* Generic Linux Module Framework
*
* Hooks up your driver to the kernel
*/
#include <lkm.h>
#include <gmodule.h>
#include <linux/init.h>
#include <linux/seq_file.h>
/* Module Vector Table */
static gmodule_t* _gmodule = NULL;
/* Allow DEVFS Support on 2.4 Kernels */
#if defined(LKM_2_4) && defined(CONFIG_DEVFS_FS)
#define GMODULE_CONFIG_DEVFS_FS
#endif
#ifdef GMODULE_CONFIG_DEVFS_FS
devfs_handle_t devfs_handle = NULL;
#endif
/* FIXME: support dynamic debugging */
static int _dbg_enable = 0;
static int
gvprintk(const char* fmt, va_list args)
__attribute__ ((format (printf, 1, 0)));
static int
gvprintk(const char* fmt, va_list args)
{
static char _buf[256];
strcpy(_buf, "");
sprintf(_buf, "%s (%d): ", _gmodule->name, current->pid);
vsprintf(_buf+strlen(_buf), fmt, args);
printk("%s",_buf);
return 0;
}
int
gprintk(const char* fmt, ...)
{
int rv;
va_list args;
va_start(args, fmt);
rv = gvprintk(fmt, args);
va_end(args);
return rv;
}
int
gdbg(const char* fmt, ...)
{
int rv = 0;
va_list args;
va_start(args, fmt);
if(_dbg_enable) {
rv = gvprintk(fmt, args);
}
va_end(args);
return rv;
}
/*
* Proc FS Utilities
*/
#if PROC_INTERFACE_KERN_VER_3_10
static struct seq_file* _proc_buf = NULL;
int
pprintf(const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
seq_vprintf(_proc_buf, fmt, args);
va_end(args);
return 0;
}
static int _gmodule_proc_show(struct seq_file *m, void *v){
_proc_buf = m;
_gmodule->pprint();
return 0;
}
static int
_gmodule_proc_open(struct inode * inode, struct file * file) {
if(_gmodule->open) {
_gmodule->open();
}
return single_open(file, _gmodule_proc_show, NULL);
}
static ssize_t
_gmodule_proc_write(struct file *file, const char *buffer,
size_t count, loff_t *loff)
{
/* Workaround to toggle debugging */
if(count > 2) {
if(buffer[0] == 'd') {
_dbg_enable = buffer[1] - '0';
GDBG("Debugging Enabled");
}
}
return count;
}
static int _gmodule_proc_release(struct inode * inode, struct file * file) {
if(_gmodule->close) {
_gmodule->close();
}
return single_release(inode, file);
}
struct file_operations _gmodule_proc_fops = {
owner: THIS_MODULE,
open: _gmodule_proc_open,
read: seq_read,
llseek: seq_lseek,
write: _gmodule_proc_write,
release: _gmodule_proc_release,
};
#else
int
gmodule_vpprintf(char** page_ptr, const char* fmt, va_list args)
{
*page_ptr += vsprintf(*page_ptr, fmt, args);
return 0;
}
int
gmodule_pprintf(char** page_ptr, const char* fmt, ...)
{
int rv;
va_list args;
va_start(args, fmt);
rv = gmodule_vpprintf(page_ptr, fmt, args);
va_end(args);
return rv;
}
static char* _proc_buf = NULL;
int
pprintf(const char* fmt, ...)
{
int rv;
va_list args;
va_start(args, fmt);
rv = gmodule_vpprintf(&_proc_buf, fmt, args);
va_end(args);
return rv;
}
#define PSTART(b) _proc_buf = b
#define PPRINT proc_print
#define PEND(b) (_proc_buf-b)
static int
_gmodule_pprint(char* buf)
{
PSTART(buf);
_gmodule->pprint();
return PEND(buf);
}
static int
_gmodule_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
*eof = 1;
return _gmodule_pprint(page);
}
static int
_gmodule_write_proc(struct file *file, const char *buffer,
unsigned long count, void *data)
{
/* Workaround to toggle debugging */
if(count > 2) {
if(buffer[0] == 'd') {
_dbg_enable = buffer[1] - '0';
GDBG("Debugging Enabled");
}
}
return count;
}
#endif
static int
_gmodule_create_proc(void)
{
struct proc_dir_entry* ent;
#if PROC_INTERFACE_KERN_VER_3_10
if((ent = proc_create(_gmodule->name,
S_IRUGO | S_IWUGO,
NULL,
&_gmodule_proc_fops)) != NULL) {
return 0;
}
#else
if((ent = create_proc_entry(_gmodule->name, S_IRUGO | S_IWUGO, NULL)) != NULL) {
ent->read_proc = _gmodule_read_proc;
ent->write_proc = _gmodule_write_proc;
return 0;
}
#endif
return -1;
}
static void
_gmodule_remove_proc(void)
{
remove_proc_entry(_gmodule->name, NULL);
}
static int
_gmodule_open(struct inode *inode, struct file *filp)
{
if(_gmodule->open) {
_gmodule->open();
}
return 0;
}
static int
_gmodule_release(struct inode *inode, struct file *filp)
{
if(_gmodule->close) {
_gmodule->close();
}
return 0;
}
#ifdef HAVE_UNLOCKED_IOCTL
static long
_gmodule_unlocked_ioctl(struct file *filp,
unsigned int cmd, unsigned long arg)
{
if(_gmodule->ioctl) {
return _gmodule->ioctl(cmd, arg);
} else {
return -1;
}
}
#else
static int
_gmodule_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
if(_gmodule->ioctl) {
return _gmodule->ioctl(cmd, arg);
} else {
return -1;
}
}
#endif
#ifdef HAVE_COMPAT_IOCTL
static long
_gmodule_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
if(_gmodule->ioctl) {
return _gmodule->ioctl(cmd, arg);
} else {
return -1;
}
}
#endif
static int
_gmodule_mmap(struct file *filp, struct vm_area_struct *vma)
{
if (_gmodule->mmap) {
return _gmodule->mmap(filp, vma);
}
#ifdef BCM_PLX9656_LOCAL_BUS
vma->vm_flags |= VM_RESERVED | VM_IO;
pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE | _PAGE_GUARDED;
if (io_remap_pfn_range( vma,
vma->vm_start,
vma->vm_pgoff,
vma->vm_end - vma->vm_start,
vma->vm_page_prot)) {
return (-EAGAIN);
}
return (0);
#else/* BCM_PLX9656_LOCAL_BUS */
return -EPERM;
#endif/* BCM_PLX9656_LOCAL_BUS */
}
/* FILE OPERATIONS */
struct file_operations _gmodule_fops = {
#ifdef HAVE_UNLOCKED_IOCTL
unlocked_ioctl: _gmodule_unlocked_ioctl,
#else
ioctl: _gmodule_ioctl,
#endif
open: _gmodule_open,
release: _gmodule_release,
mmap: _gmodule_mmap,
#ifdef HAVE_COMPAT_IOCTL
compat_ioctl: _gmodule_compat_ioctl,
#endif
};
void __exit
cleanup_module(void)
{
if(!_gmodule) return;
/* Specific Cleanup */
if(_gmodule->cleanup) {
_gmodule->cleanup();
}
/* Remove any proc entries */
if(_gmodule->pprint) {
_gmodule_remove_proc();
}
/* Finally, remove ourselves from the universe */
#ifdef GMODULE_CONFIG_DEVFS_FS
if(devfs_handle) devfs_unregister(devfs_handle);
#else
unregister_chrdev(_gmodule->major, _gmodule->name);
#endif
}
int __init
init_module(void)
{
int rc;
/* Get our definition */
_gmodule = gmodule_get();
if(!_gmodule) return -ENODEV;
/* Register ourselves */
#ifdef GMODULE_CONFIG_DEVFS_FS
devfs_handle = devfs_register(NULL,
_gmodule->name,
DEVFS_FL_NONE,
_gmodule->major,
_gmodule->minor,
S_IFCHR | S_IRUGO | S_IWUGO,
&_gmodule_fops,
NULL);
if(!devfs_handle) {
printk(KERN_WARNING "%s: can't register device with devfs",
_gmodule->name);
}
rc = 0;
#else
rc = register_chrdev(_gmodule->major,
_gmodule->name,
&_gmodule_fops);
if (rc < 0) {
printk(KERN_WARNING "%s: can't get major %d",
_gmodule->name, _gmodule->major);
return rc;
}
if(_gmodule->major == 0) {
_gmodule->major = rc;
}
#endif
/* Specific module Initialization */
if(_gmodule->init) {
int rc;
if((rc = _gmodule->init()) < 0) {
#ifdef GMODULE_CONFIG_DEVFS_FS
if(devfs_handle) devfs_unregister(devfs_handle);
#else
unregister_chrdev(_gmodule->major, _gmodule->name);
#endif
return rc;
}
}
/* Add a /proc entry, if valid */
if(_gmodule->pprint) {
_gmodule_create_proc();
}
return 0; /* succeed */
}

View File

@ -0,0 +1,250 @@
/*
* Unless you and Broadcom execute a separate written software license
* agreement governing use of this software, this software is licensed to
* you under the terms of the GNU General Public License version 2 (the
* "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
* with the following added to such license:
*
* As a special exception, the copyright holders of this software give
* you permission to link this software with independent modules, and to
* copy and distribute the resulting executable under terms of your
* choice, provided that you also meet, for each linked independent
* module, the terms and conditions of the license of that module. An
* independent module is a module which is not derived from this
* software. The special exception does not apply to any modifications
* of the software.
*/
/*
* $Id: ksal.c,v 1.1 Broadcom SDK $
* $Copyright: (c) 2005 Broadcom Corp.
* All Rights Reserved.$
*/
#include <sal/core/sync.h>
#include <sal/core/thread.h>
#include "lkm.h"
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,26)
#include <linux/semaphore.h>
#else
#include <asm/semaphore.h>
#endif
#include <linux/interrupt.h>
#include <linux/sched.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,9,0)
#include <linux/sched/rt.h>
#endif
#include <linux/time.h>
#ifdef MAX_USER_RT_PRIO
/* Assume 2.6 scheduler */
#define SAL_YIELD(task) \
yield()
#else
/* Assume 2.4 scheduler */
#define SAL_YIELD(task) \
do { \
task->policy |= SCHED_YIELD; \
schedule(); \
} while (0)
#endif
#define SECOND_USEC (1000000)
#define USECS_PER_JIFFY (SECOND_USEC / HZ)
#define USEC_TO_JIFFIES(usec) ((usec + (USECS_PER_JIFFY - 1)) / USECS_PER_JIFFY)
#define sal_alloc(size, desc) kmalloc(size, GFP_KERNEL)
#define sal_free(ptr) kfree(ptr)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
#define WQ_SLEEP(a, b) wait_event_interruptible_timeout(a, NULL, b)
#else
#define WQ_SLEEP(a, b) interruptible_sleep_on_timeout(&(a), b)
#endif
/*
* sem_ctrl_t
*
* The semaphore control type uses the binary property to implement
* timed semaphores with improved performance using wait queues.
*/
typedef struct sem_ctrl_s {
struct semaphore sem;
int binary;
int cnt;
wait_queue_head_t wq;
} sem_ctrl_t;
sal_sem_t
sal_sem_create(char *desc, int binary, int initial_count)
{
sem_ctrl_t *s;
if ((s = sal_alloc(sizeof(*s), desc)) != 0) {
sema_init(&s->sem, initial_count);
s->binary = binary;
if (s->binary) {
init_waitqueue_head(&s->wq);
}
}
return (sal_sem_t) s;
}
void
sal_sem_destroy(sal_sem_t b)
{
sem_ctrl_t *s = (sem_ctrl_t *) b;
if (s == NULL) {
return;
}
/*
* the linux kernel does not have a sema_destroy(s)
*/
sal_free(s);
}
int
sal_sem_take(sal_sem_t b, int usec)
{
sem_ctrl_t *s = (sem_ctrl_t *) b;
int err;
if (usec == sal_sem_FOREVER && !in_interrupt()) {
err = down_interruptible(&s->sem);
} else {
int time_wait = 1;
int cnt = s->cnt;
for (;;) {
if (down_trylock(&s->sem) == 0) {
err = 0;
break;
}
if (s->binary) {
/* Wait for event or timeout */
if (time_wait > 1) {
err = 1;
break;
}
err = wait_event_interruptible_timeout(s->wq, cnt != s->cnt,
USEC_TO_JIFFIES(usec));
if (err < 0) {
break;
}
time_wait++;
} else {
/* Retry algorithm with exponential backoff */
if (time_wait > usec) {
time_wait = usec;
}
sal_usleep(time_wait);
usec -= time_wait;
if (usec == 0) {
err = ETIMEDOUT;
break;
}
if ((time_wait *= 2) > 100000) {
time_wait = 100000;
}
}
}
}
return err ? -1 : 0;
}
int
sal_sem_give(sal_sem_t b)
{
sem_ctrl_t *s = (sem_ctrl_t *) b;
up(&s->sem);
if (s->binary) {
s->cnt++;
wake_up_interruptible(&s->wq);
}
return 0;
}
uint32
sal_time_usecs(void)
{
struct timeval ltv;
do_gettimeofday(&ltv);
return (ltv.tv_sec * SECOND_USEC + ltv.tv_usec);
}
void
sal_usleep(uint32 usec)
{
uint32 start_usec;
wait_queue_head_t queue;
if (usec <= SECOND_USEC / HZ) {
start_usec = sal_time_usecs();
do {
SAL_YIELD(current);
} while ((sal_time_usecs() - start_usec) < usec);
} else {
init_waitqueue_head(&queue);
WQ_SLEEP(queue, USEC_TO_JIFFIES(usec));
}
}
void
sal_udelay(uint32 usec)
{
static volatile int _sal_udelay_counter;
static int loops = 0;
int ix, iy;
if (loops == 0 || usec == 0) { /* Need calibration? */
int max_loops;
int start = 0, stop = 0;
int mpt = USECS_PER_JIFFY; /* usec/tick */
for (loops = 1; loops < 0x1000 && stop == start; loops <<= 1) {
/* Wait for clock turn over */
for (stop = start = jiffies; start == stop; start = jiffies) {
/* Empty */
}
sal_udelay(mpt); /* Single recursion */
stop = jiffies;
}
max_loops = loops / 2; /* Loop above overshoots */
start = stop = 0;
if (loops < 4) {
loops = 4;
}
for (loops /= 4; loops < max_loops && stop == start; loops++) {
/* Wait for clock turn over */
for (stop = start = jiffies; start == stop; start = jiffies) {
/* Empty */
}
sal_udelay(mpt); /* Single recursion */
stop = jiffies;
}
}
for (iy = 0; iy < usec; iy++) {
for (ix = 0; ix < loops; ix++) {
_sal_udelay_counter++; /* Prevent optimizations */
}
}
}

View File

@ -0,0 +1,242 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.4 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
SDK :=$(shell if [ -n "$$SDK" ] ; then\
echo $$SDK;\
else\
cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \
dir=`cd ../;pwd`; \
if [ "$$dir" = "/" ] ; then \
echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \
exit 1; \
fi ; \
cd $$dir; \
done ; \
pwd; \
fi)
ifeq ($(SDK),)
$(error Please run this in a tree)
endif
export SDK
override-target=linux-$(platform)
ifeq ($(LINUX_MAKE_SHARED_LIB),1)
libext = so.$(SHAREDLIBVER)
else
libext = a
endif
ifeq (,$(platform))
$(error Internal error: platform variable is not set)
endif
include $(SDK)/make/Make.config
LOCALDIR=systems/linux/user/common
include $(SDK)/make/Make.depend
kernel-override=linux-$(platform)
ifdef BLDCONFIG
KERN_BLDROOT=${SDK}/${SDKBUILD}/${BLDCONFIG}/$(kernel-override)$(bldroot_suffix)
else
KERN_BLDROOT=${SDK}/${SDKBUILD}/$(kernel-override)$(bldroot_suffix)
endif
ifeq (,$(kernel_version))
kernel_version=2_4
endif
ifeq ($(kernel_version),2_6)
KOBJ=ko
else
KOBJ=o
endif
ifneq (,$(TOOLS_DIR))
override PATH := $(TOOLS_DIR):$(PATH)
endif
ifeq ($(DEST_DIR),)
DEST_DIR=${BLDDIR}
endif
KERNEL_BDE_LOCAL :=linux-kernel-bde.$(KOBJ)
KERNEL_BDE :=$(DEST_DIR)/$(KERNEL_BDE_LOCAL)
USER_BDE_LOCAL :=linux-user-bde.$(KOBJ)
USER_BDE=$(DEST_DIR)/$(USER_BDE_LOCAL)
BCM_KNET_LOCAL :=linux-bcm-knet.$(KOBJ)
BCM_KNET=$(DEST_DIR)/$(BCM_KNET_LOCAL)
KNET_CB_LOCAL := linux-knet-cb.$(KOBJ)
KNET_CB := $(DEST_DIR)/$(KNET_CB_LOCAL)
ifeq (,$(findstring DELIVER,$(MAKECMDGOALS)))
.DEFAULT_GOAL := all
all_targets := kernel_modules $(KERNEL_BDE) $(USER_BDE)
LOCAL_TARGETS :=
ifeq ($(NO_LOCAL_TARGETS),)
LOCAL_TARGETS +=$(patsubst %,$(realpath ..)/$(platform)/%,$(KERNEL_BDE_LOCAL) $(USER_BDE_LOCAL))
all_targets +=$(LOCAL_TARGETS)
endif
# Build all by default
ifndef BUILD_KNET
BUILD_KNET = 1
endif
ifeq ($(BUILD_KNET),1)
# Kernel network support
all_targets += $(BCM_KNET)
ifeq ($(NO_LOCAL_TARGETS),)
LOCAL_TARGETS +=$(patsubst %,../$(platform)/%,$(BCM_KNET_LOCAL))
all_targets +=$(LOCAL_TARGETS)
endif
ADD_TO_CFLAGS += -I$(SDK)/systems/linux/kernel/modules/include
COND_KNET_LIBS = libuser.$(libext)
ifeq ($(BUILD_KNET_CB),1)
# KNET callback module support
all_targets += $(KNET_CB)
ifeq ($(NO_LOCAL_TARGETS),)
LOCAL_TARGETS +=$(patsubst %,../$(platform)/%,$(KNET_CB_LOCAL))
all_targets +=$(LOCAL_TARGETS)
endif
endif
endif
#OPENNSL_FIXUP
.NOTPARALLEL:
all: $(BLDDIR)/.tree $(all_targets)
ifeq ($(NO_LOCAL_TARGETS),)
define LOCAL_TARGET_DEF
$(1) : $(DEST_DIR)/$(notdir $(1))
cp $$? $$@
endef
endif
# User BDE libraries
ADD_TO_CFLAGS += -I$(SDK)/systems/bde/linux/include
# Use raw IOCTL for KNET
ADD_TO_CFLAGS += -DPROXY_SUPPORT=0
CFLAGS += $(ADD_TO_CFLAGS)
# Kernel network support
ifdef BUILD_KNET
knet_subdirs = shared bcm-knet
ifdef BUILD_KNET_CB
knet_subdirs += knet-cb
endif
endif # BUILD_KNET
kernel_modules:
$(MAKE) -C $(SDK)/systems/bde/linux/kernel kernel_version=$(kernel_version)
$(MAKE) -C $(SDK)/systems/bde/linux/user/kernel kernel_version=$(kernel_version)
ifeq ($(BUILD_KNET),1)
$(MAKE) -j1 -C $(SDK)/systems/linux/kernel/modules kernel_version=$(kernel_version) \
subdirs="$(knet_subdirs)" override-target=linux-$(platform) CFLAGS="$(CFLAGS)"
endif
$(KERNEL_BDE): $(KERN_BLDROOT)/linux-kernel-bde.$(KOBJ)
mkdir -p $(@D)
$(OBJCOPY) --strip-debug $< $@
$(USER_BDE): $(KERN_BLDROOT)/linux-user-bde.$(KOBJ)
$(OBJCOPY) --strip-debug $< $@
$(BCM_KNET): $(KERN_BLDROOT)/linux-bcm-knet.$(KOBJ)
$(OBJCOPY) --strip-debug $< $@
$(KNET_CB): $(KERN_BLDROOT)/linux-knet-cb.$(KOBJ)
$(OBJCOPY) --strip-debug $< $@
ifeq ($(NO_LOCAL_TARGETS),)
$(foreach targ,$(LOCAL_TARGETS),$(eval $(call LOCAL_TARGET_DEF,$(targ))))
endif
clean::
$(MAKE) -C $(SDK)/systems/bde/linux/kernel $@
$(MAKE) -C $(SDK)/systems/bde/linux/user/kernel $@
$(MAKE) -C $(SDK)/systems/linux/kernel/modules \
subdirs="$(knet_subdirs)" \
override-target=linux-$(platform) $@
$(RM) $(KERNEL_BDE) $(USER_BDE)
$(RM) $(BCM_KNET)
$(RM) $(KNET_CB)
$(RM) $(KERN_BLDROOT)/linux-kernel-bde.$(KOBJ)
$(RM) $(KERN_BLDROOT)/linux-user-bde.$(KOBJ)
$(RM) $(KERN_BLDROOT)/linux-bcm-knet.$(KOBJ)
$(RM) $(LOCAL_TARGETS)
distclean:: clean
.PHONY: variable
#
# Echo variable values used for configuration
# usage: make VAR=CC variable
#
variable::
@echo $($(VAR))
else
ifndef DELIVERY
$(error DELIVERY required)
endif
DELIVERABLES := $(KERNEL_BDE) $(USER_BDE)
# 1= source
define DELIVERY_RULE
_DEL_TARG += $(DELIVERY)/$(notdir $(1))
$(DELIVERY)/$(notdir $(1)) : $(1)
@mkdir -p $(DELIVERY)
ifeq ($(filter $(notdir $(BCM)) $(notdir $(BCM).dbg),$(notdir $1)),)
$(OBJCOPY) --strip-debug $$< $$@
else
$(CP) -p $$< $$@
endif
endef
$(foreach f,$(DELIVERABLES),$(eval $(call DELIVERY_RULE,$(f))))
DELIVER: $(_DEL_TARG)
endif
# Make.config defines remaining phony targets
.PHONY: build kernel_modules DELIVER

View File

@ -0,0 +1,85 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.9 Broadcom SDK $
# $Copyright: (c) 2007 Broadcom Corp.
# All Rights Reserved.$
#
# This make job requires the following environment variables to be set:
#
# SDK - path to StrataXGS SDK root directory
#
# Optionally the following environment variables can be set to
# override the default build server configuration:
#
# PPC_TOOLS_DIR - path to build tools (if not in PATH already)
# PPC_CROSS_COMPILE - cross compile tools prefix
# LINUX_INCLUDE - path to Linux kernel include directory
#
SDK :=$(shell if [ -n "$$SDK" ] ; then\
echo $$SDK;\
else\
cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \
dir=`cd ../;pwd`; \
if [ "$$dir" = "/" ] ; then \
echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \
exit 1; \
fi ; \
cd $$dir; \
done ; \
pwd; \
fi)
ifeq ($(SDK),)
$(error Please run this in a tree)
endif
export SDK
override kernel_version=2_6
platform=gto-$(kernel_version)
LINUX_MAKE_USER=1
export LINKER_RELAX=1
# Select the build environment
#BUILD_PLATFORM=ELDK
#BUILD_PLATFORM=WR_LINUX
#Select the LINUX KERNEL VERSION
#KERN_VER = 2.6.21.7
#KERN_VER = 2.6.24.4
#KERN_VER = 2.6.25
# Select the ELDK version
#ELDK_VERSION=4.1
#ELDK_VERSION=4.0
#Select WRS Linux version
#WRS_LINUX_VERSION=2.0
#WRS_LINUX_VERSION=3.0
export KERN_VER
export ELDK_VERSION
export BUILD_PLATFORM
export WRS_LINUX_VERSION
include ${SDK}/make/Make.linux

View File

@ -0,0 +1,61 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.9 Broadcom SDK $
# $Copyright: (c) 2015 Broadcom Corp.
# All Rights Reserved.$
#
# This make job requires the following environment variables to be set:
#
# SDK - path to StrataXGS SDK root directory
#
# Optionally the following environment variables can be set to
# override the default build server configuration:
#
# PPC_TOOLS_DIR - path to build tools (if not in PATH already)
# PPC_CROSS_COMPILE - cross compile tools prefix
# LINUX_INCLUDE - path to Linux kernel include directory
#
SDK :=$(shell if [ -n "$$SDK" ] ; then\
echo $$SDK;\
else\
cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \
dir=`cd ../;pwd`; \
if [ "$$dir" = "/" ] ; then \
echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \
exit 1; \
fi ; \
cd $$dir; \
done ; \
pwd; \
fi)
ifeq ($(SDK),)
$(error Please run this in a tree)
endif
export SDK
override kernel_version=4_4
platform=gto
LINUX_MAKE_USER=1
export LINKER_RELAX=1
include ${SDK}/make/Make.linux

View File

@ -0,0 +1,66 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.7 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# This make job requires the following environment variables to be set:
#
# SDK - path to StrataXGS SDK root directory
#
# Optionally the following environment variables can be set to
# override the default build server configuration:
#
# MIPS_TOOLS_DIR - path to build tools (if not in PATH already)
# MIPS_CROSS_COMPILE - cross compile tools prefix
# LINUX_INCLUDE - path to Linux kernel include directory
#
SDK :=$(shell if [ -n "$$SDK" ] ; then\
echo $$SDK;\
else\
cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \
dir=`cd ../;pwd`; \
if [ "$$dir" = "/" ] ; then \
echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \
exit 1; \
fi ; \
cd $$dir; \
done ; \
pwd; \
fi)
ifeq ($(SDK),)
$(error Please run this in a tree)
endif
export SDK
override kernel_version=3_14
platform=iproc-$(kernel_version)
IPROC_BUILD=1
export IPROC_BUILD
export BUILD_PLATFORM
export ARM_LINUX_VERSION
LINUX_MAKE_USER=1
export ADD_TO_CFLAGS
include ${SDK}/make/Make.linux

View File

@ -0,0 +1,60 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.7 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
#
# This make job requires the following environment variables to be set:
#
# SDK - path to StrataXGS SDK root directory
#
SDK :=$(shell if [ -n "$$SDK" ] ; then\
echo $$SDK;\
else\
cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \
dir=`cd ../;pwd`; \
if [ "$$dir" = "/" ] ; then \
echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \
exit 1; \
fi ; \
cd $$dir; \
done ; \
pwd; \
fi)
ifeq ($(SDK),)
$(error Please run this in a tree)
endif
export SDK
override kernel_version=4_4
platform=iproc
IPROC_BUILD=1
export IPROC_BUILD
export BUILD_PLATFORM
export ARM_LINUX_VERSION
LINUX_MAKE_USER=1
export ADD_TO_CFLAGS
export BR_NO_CCACHE
include ${SDK}/make/Make.linux

View File

@ -0,0 +1,46 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
# -*- Makefile -*-
# $Id: Makefile,v 1.2 Broadcom SDK $
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved.$
SDK :=$(shell if [ -n "$$SDK" ] ; then\
echo $$SDK;\
else\
cd $(dir $(lastword $(MAKEFILE_LIST))); while /usr/bin/test ! -e RELEASE ; do \
dir=`cd ../;pwd`; \
if [ "$$dir" = "/" ] ; then \
echo Cannot find SDK in $(lastword $(MAKEFILE_LIST)) 1>&2; \
exit 1; \
fi ; \
cd $$dir; \
done ; \
pwd; \
fi)
ifeq ($(SDK),)
$(error Please run this in a tree)
endif
export SDK
override kernel_version=2_6
platform=x86-smp_generic_64-$(kernel_version)
LINUX_MAKE_USER=1
include ${SDK}/make/Make.linux

View File

@ -0,0 +1,293 @@
#
# Unless you and Broadcom execute a separate written software license
# agreement governing use of this software, this software is licensed to
# you under the terms of the GNU General Public License version 2 (the
# "GPL"), available at http://www.broadcom.com/licenses/GPLv2.php,
# with the following added to such license:
#
# As a special exception, the copyright holders of this software give
# you permission to link this software with independent modules, and to
# copy and distribute the resulting executable under terms of your
# choice, provided that you also meet, for each linked independent
# module, the terms and conditions of the license of that module. An
# independent module is a module which is not derived from this
# software. The special exception does not apply to any modifications
# of the software.
#
#
# mktool.pl
#
# $Id: mktool.pl,v 1.5 Broadcom SDK $
#
# $Copyright: (c) 2005 Broadcom Corp.
# All Rights Reserved. $
use File::Path;
use File::Find;
use File::Copy;
use Cwd;
($prog = $0) =~ s/.*\///;
SWITCH:
{
$op = shift;
if ($op eq "-rm") { mktool_rm(@ARGV); last SWITCH; }
if ($op eq "-cp") { mktool_cp(@ARGV); last SWITCH; }
if ($op eq "-md") { mktool_md(@ARGV); last SWITCH; }
if ($op eq "-ln") { mktool_ln(@ARGV); last SWITCH; }
if ($op eq "-foreach") { mktool_foreach(@ARGV); last SWITCH; }
if ($op eq "-dep") { mktool_makedep(@ARGV); last SWITCH; }
if ($op eq "-echo") { mktool_echo(@ARGV); last SWITCH; }
if ($op eq "-beep") { mktool_beep(@ARGV); last SWITCH; }
die("$prog: unknown option '$op'\n");
}
exit 0;
#
# mktool_execute
#
# Executes a command, returns exist status.
# Performs token special translation before execution.
#
sub mktool_execute
{
my $token = shift;
my @cmds = @_;
# printf("mktool_execute: token = '$token'\n");
foreach $cmd (@cmds)
{
#printf("mktool_execute: cmd = '$cmd'\n");
$cmd =~ s/\#\#/$token/g;
if($cmd =~ /^-p/)
{
$cmd =~ s/^-p//;
printf("$cmd\n");
}
else
{
system($cmd);
my $excode = ($? >> 8);
exit $excode if $excode;
}
}
}
$find_regexp = "";
@find_cmd;
#
# mktool_foreach
#
sub mktool_foreach
{
if($_[0] eq "-find")
{
shift;
$find_dir = shift;
$find_regexp = shift;
@find_cmds = @_;
if(!($find_dir =~ /^\//))
{
$find_dir = cwd() . "/" . $find_dir;
}
find(\&_mktool_foreach_find_wanted, $find_dir);
}
else
{
my $subdir = 0;
if($_[0] eq "-subdir")
{
$subdir = 1;
shift;
}
my @thingies = split(' ', shift);
foreach $thingy (@thingies)
{
chdir $thingy unless $subdir == 0;
mktool_execute($thingy, @_);
chdir ".." unless $subdir == 0;
}
}
}
sub _mktool_foreach_find_wanted
{
my $expr = "\$File::Find::name =~ /\^$find_regexp\$/";
if(eval($expr))
{
mktool_execute($File::Find::name, @find_cmds);
exit $excode if $excode;
}
}
#
# rm
#
# Removes a list of objects
#
sub mktool_rm
{
my($f);
foreach $f (@_) {
eval { rmtree($f) };
if ($@) {
die "$prog $op: failed to remove $f: $@\n";
}
}
}
#
# md
#
# Makes a list of directories
#
sub mktool_md
{
my($dir);
foreach $dir (@_) {
$dir =~ s!/+$!!;
eval { mkpath($dir) };
if ($@) {
die "$prog $op: failed to make directory $dir: $@\n";
}
}
}
sub mktool_cp
{
my($from, $to) = @_;
if (@_ != 2) {
die "$prog $op: must have two arguments\n";
}
copy($from, $to) ||
die "$prog $op: failed to copy $from to $to: $!\n";
}
sub mktool_ln
{
my($old, $new) = @_;
if (@_ != 2) {
die "$prog $op: must have two arguments\n";
}
link ($old, $new) ||
die "$prog $op: failed to link $new to $old: $!\n";
}
# @echo "$@ \\" > ${BLDDIR}/$(notdir $@)
# @if ($(DEPEND)) >> $(BLDDIR)/$(notdir $@); then \
# exit 0; \
# else \
# rm -f ${BLDDIR}/$(notdir $@); \
# exit 1; \
# fi
# $(MAKEDEP) "$@" "$(BLDDIR)/$(notdir $@)" "$(DEPEND)"
sub mktool_makedep
{
my ($source, $target, $cmd, $curdir) = @_;
my @result = `$cmd`;
my $sdk = $ENV{'SDK'};
my $count;
my $tmp;
local $resultant;
## Comman $cmd
#Command $cmd
print <<MKTOOL;
mktool.pl::
curdir $curdir
MKTOOL
# derive the path to the target
$curdir = "$sdk/$curdir";
# save the basename
$dirName = substr($target,0,rindex($target,"\/"));
# prepare the top line of the %.d file
$resultant="$source \\\n\${BLDDIR}/";
if(!$?)
{
foreach $line (@result)
{
$line =~ s/^#.*\n//g; # some makedeps produce comments
$line =~ s/\n+$//; # toss trailing newlines
$line =~ s/(\s+)(\.\/)/ /g; # remove leading ./
# insert SDK path before ../
$line =~ s/(\s+)(\.\.\/)/${1}$curdir\/${2}/g;
# insert SDK path
$line =~ s/(\s+)(\w+)/${1}$curdir\/${2}/g;
$count=0;
$tmp=$line;
while( (index($line,"..")>-1) & ($count < 20) )
{
$line=~s/\/\w+\/\.\.//;
# if we hit a major recursion, revert the line, report
# this to the output and drop out of the loop, but do
# continue, this should not halt generation
if($count++>19)
{
print "mktool.pl: could not process $line \n\n";
print ":: curdir $curdir\n";
print ":: target $target\n";
print ":: cmd $cmd\n";
$line=$tmp;
}
}
# set all the paths to use the $SDK variable
$line =~ s/$ENV{'SDK'}/\$\{SDK\}/g;
$resultant=$resultant . $line;
}
# some compilers return extra newlines
$resultant=~s/\n//g;
# now clean up the result
$resultant=~s/\\/\\\n/g;
mktool_md($dirName) unless (-d $dirName);
open (TARGET, ">$target") ||
die("$prog $op: cannot open '$target' for writing: $!\n");
print TARGET "$resultant\n";
close(TARGET);
}
}
sub mktool_echo
{
print "@_\n";
}
sub mktool_beep
{
-t STDOUT && defined $ENV{MAKEBEEP} && print "\007";
}

View File

@ -1,4 +0,0 @@
BRCM_OPENNSL_KERNEL = opennsl-modules-4.9.0-5-amd64_3.4.1.11-1_amd64.deb
$(BRCM_OPENNSL_KERNEL)_URL = "https://sonicstorage.blob.core.windows.net/packages/opennsl-modules-4.9.0-5-amd64_3.4.1.11-1_amd64.deb?sv=2015-04-05&sr=b&sig=vdIqSXaJhvN7Blk08WyxWhfMxky0XBx37JYAmNozx3k%3D&se=2155-01-24T09%3A08%3A25Z&sp=r"
SONIC_ONLINE_DEBS += $(BRCM_OPENNSL_KERNEL)