Wireless Base Band Device (bbdev) Amr Mokhtar DPDK Summit Userspace - Dublin- 2017

Similar documents
Baseband Device Drivers. Release

Baseband Device Drivers. Release rc1

lib/librte_ipsec A NATIVE DPDK IPSEC LIBRARY UPDATE 2018/12 DECLAN DOHERTY, MOHAMMAD ABDUL AWAL, KONSTANTIN ANANYEV

Supporting Cloud Native with DPDK and containers KEITH INTEL CORPORATION

DEVICE TYPE AGNOSTIC DPDK: AN UPDATE

rte_security: An update and introducing PDCP

Ideas for adding generic HW accelerators to DPDK. Hemant Agrawal, NXP DPDK Summit Userspace - Dublin- 2017

Using DPDK with Go. Takanari Hayama Technology Consulting Company IGEL Co.,Ltd.

DPDK+eBPF KONSTANTIN ANANYEV INTEL

Method for sharing a (PCI) device between multiple PMDs. Fiona Trahe DPDK Summit Userspace - Dublin- 2017

SPDK NVMe In-depth Look at its Architecture and Design Jim Harris Intel

Event Device Drivers. Release rc1

DPDK Integration within F5 BIG-IP BRENT BLOOD, SR MANAGER SOFTWARE ENGINEERING VIJAY MANICKAM, SR SOFTWARE ENGINEER

DPDK Tools User Guides. Release

Wireless Sensor Networks. Introduction to the Laboratory

14th ANNUAL WORKSHOP 2018 NVMF TARGET OFFLOAD. Liran Liss. Mellanox Technologies. April 2018

Next Gen Virtual Switch. CloudNetEngine Founder & CTO Jun Xiao

OVS-DPDK: Memory management and debugging

FAQ. Release rc2

dmrlib Documentation Release Wijnand Modderman-Lenstra

Virtio/vhost status update

High Speed DAQ with DPDK

Demystifying Network Cards

I/O Management Intro. Chapter 5

DPDK Roadmap. Tim O Driscoll & Chris Wright Open Networking Summit 2017

Spring 2017 :: CSE 506. Device Programming. Nima Honarmand

rte_security: enabling IPsec hw acceleration

Compression Device Drivers. Release rc3

Short Notes of CS201

CS201 - Introduction to Programming Glossary By

NVJPEG. DA _v0.2.0 October nvjpeg Libary Guide

TriMedia Motion JPEG Decoder (VdecMjpeg) API 1

Moneta: A High-performance Storage Array Architecture for Nextgeneration, Micro 2010

Network Implementation

1. Overview Ethernet FIT Module Outline of the API API Information... 5

CUDA Toolkit CUPTI User's Guide. DA _v01 September 2012

A practical introduction to XDP

Scalable Fabric Interfaces

CS24 Week 4 Lecture 2

Storage Systems. NPTEL Course Jan K. Gopinath Indian Institute of Science

Scuola Superiore Sant Anna. I/O subsystem. Giuseppe Lipari

A Look at Intel s Dataplane Development Kit

Advanced Computer Networks. End Host Optimization

Agenda. About us Why para-virtualize RDMA Project overview Open issues Future plans

Co-synthesis and Accelerator based Embedded System Design

HKG : OpenAMP Introduction. Wendy Liang

Please submit your request directly to Noha Sinno

Appendix A Pseudocode of the wlan_mac Process Model in OPNET

RFC: connectionless Data Link Metalanguage (cldl) cldl Metalanguage Model. RFC for a connectionless Data Link Metalanguage

An Experimental review on Intel DPDK L2 Forwarding

TriMedia Motion JPEG Encoder (VencMjpeg) API 1

RFC: connectionless Data Link Metalanguage Burkhard Daniel

NVMe Driver for BitVisor BitVisor Summit 6. Ake Koomsin

Final Exam. 11 May 2018, 120 minutes, 26 questions, 100 points

ECEN 449 Microprocessor System Design. Hardware-Software Communication. Texas A&M University

Writing drivers for the Linux Crypto subsystem

Queues. A queue is a special type of structure that can be used to maintain data in an organized way.

HSA QUEUEING HOT CHIPS TUTORIAL - AUGUST 2013 IAN BRATT PRINCIPAL ENGINEER ARM

Mellanox Scalable Hierarchical Aggregation and Reduction Protocol (SHARP) API Guide. Version 1.0

BPF Hardware Offload Deep Dive

Open Fabrics Interfaces Architecture Introduction. Sean Hefty Intel Corporation

Submit your answers to these questions to the Curator under Quizzes as HW08 by the posted due date and time. No late submissions will be accepted.

Introduction to Virtio Crypto Device.

Armide Documentation. Release Kyle Mayes

Queues. Lesson 4. CS 32: Data Structures Dept. of Computer Science

NVJPEG. DA _v0.1.4 August nvjpeg Libary Guide

Operating Systems. 17. Sockets. Paul Krzyzanowski. Rutgers University. Spring /6/ Paul Krzyzanowski

Xilinx Answer QDMA Performance Report

Dotstack Porting Guide.

Display Virtualization with KVM for Automotive Systems

High-Speed Forwarding: A P4 Compiler with a Hardware Abstraction Library for Intel DPDK

Emulation 2. G. Lettieri. 15 Oct. 2014

PowerPC on NetFPGA CSE 237B. Erik Rubow

CEC 450 Real-Time Systems

RESTRUCTURING DPDK DEVICE-DRIVER FRAMEWORK

Fast packet processing in linux with af_xdp

Accelerating VM networking through XDP. Jason Wang Red Hat

Open AMR Initiative. Technical Documentation. Version 1.0 Revision

Open vswitch DPDK Acceleration Using HW Classification

Networking in a Vertically Scaled World

LinuxCon 2010 Tracing Mini-Summit

What is a Linux Device Driver? Kevin Dankwardt, Ph.D. VP Technology Open Source Careers

The Network Stack (1)

Trace without a Trace Port on MSC8156 and MSC8144 DSPs

HKG net_mdev: Fast-path userspace I/O. Ilias Apalodimas Mykyta Iziumtsev François-Frédéric Ozog

nftables switchdev support

libsegy Programmer s Reference Manual

Section 3: File I/O, JSON, Generics. Meghan Cowan

Dynamic Device Management THOMAS MONJALON - MELLANOX JEFF GUO - INTEL QI ZHANG INTEL SEPTEMBER 2018, DUBLIN

dotstack integration with STM32F4 & FreeRTOS.

Much Faster Networking

libtheora Reference Manual

ECE 448 Lecture 9. Bare Metal System Software Development

Rochester Institute of Technology CMPE 663/EEEE 663 Graduate Student Project

École Polytechnique Fédérale de Lausanne. Porting a driver for the Intel XL710 40GbE NIC to the IX Dataplane Operating System

AN 831: Intel FPGA SDK for OpenCL

DPDK Tunneling Offload RONY EFRAIM & YONGSEOK KOH MELLANOX

T4P4S: When P4 meets DPDK. Sandor Laki DPDK Summit Userspace - Dublin- 2017

Zhang Tianfei. Rosen Xu

Qiang Li && Zhibin Hu/Qihoo 360 Gear Team Ruxcon 2016

Transcription:

Wireless Base Band Device (bbdev) Amr Mokhtar DPDK Summit Userspace - Dublin- 2017

why baseband..? MAC Tx Data Downlink * Reference: 3GPP TS 36.211 & 36.212

architecture Common programing framework for wireless workloads DPDK Application Application facing API librte_bbdev Seamless HW/SW abstraction interface for underlying operations bbdev HW driver bbdev SW driver Driver facing API bbdev SW driver bbdev SW driver Pluggable driver support for various stages of wireless packet processing (new driver registers itself and reports its capabilities) Software Hardware FPGA or Fixed Function Accel. SW Turbo lib SW FFT/iFFT lib SW Modulation Mapper lib

workflow Device stopped rte_eal_init() rte_bbdev_count() rte_bbdev_info_get() Device Configuration rte_bbdev_close() Device identified rte_bbdev_configure() rte_bbdev_configure() Device stopped Device configured rte_bbdev_stop() Queues configured rte_bbdev_queue_configure() rte_bbdev_start() rte_bbdev_enqueue_ops() Device running rte_bbdev_start() rte_bbdev_dequeue_ops()

lookaside model - hardware 1. Application calls the API to submit an offload request to the user-space device driver 2. Driver forms the descriptor in ring in memory, including pointers to data buffers 3. The driver enqueues the descriptor by writing to the relevant MMIO Register 4. The driver returns from the API call back to the application thread 5. HW DMA reads the descriptor(s) created in step 2, and input data buffers 6. HW performs the operation(s) 7. Once complete the HW will DMA write the output buffers and overwrite the descriptor(s) indicating to SW that this request is complete. 8. Application calls to API to check for completed requests (dequeue) 9. Driver checks if response descriptors have been written back 10. Driver returns results to application if descriptors have been written back, or empty response if not. Software Hardware 1. enqueue_ops() 2. Form hw request descriptor(s) 3. Enqueue request descriptor(s) (MMIO write) DPDK Enqueue Thread 5. DMA read descriptor, and input data 4. Ret N 1 0 Turbo Dec/Enc Dequeue Thread 8. dequeue_ops() 6. Perform Operation(s) 10. Ret 9. Consume response descriptor(s), if available SW Descriptor Rings 7. DMA write results back and update descriptor * Enqueue thread and dequeue thread may be the same

lookaside model - software 1. Application calls the API to submit an offload request to the user-space device driver 2. Driver forms its internal structures and perform operation(s) sequentially. 3. The driver enqueues the outcomes to internal software rings. 4. The driver returns from the API call back to the application thread. 5. Application calls to API to check for completed requests (dequeue). 6. Driver checks if some results were produced on the tip of the ring, then pull it out. 7. Driver returns the pulled out results to application if there were any available, or empty response if not. Software Enqueue Thread 1. enqueue_ops() 2. Perform Operation(s) 3. Produce to sw ring DPDK Turbo Dec/Enc 4. Ret N 1 0 Dequeue Thread 5. dequeue_ops() 7. Ret 6. Consume from sw ring, if available Queue SW Rings Hardware * Enqueue thread and dequeue thread may be the same

Note on mbuf* usage in bbdev mbuf seg#1 mbuf seg#2 mbuf seg#3 mbuf seg#n CB #1 CB #2 CB #3... CB #n op_data->offset op_data->length Transport Block (TB) /** Data input and output buffer for Turbo operations */ struct rte_bbdev_op_data { struct rte_mbuf *data; /**< First mbuf segment with input/output data. Each segment represents * one Code Block. */ uint32_t offset; /**< The starting point for the Turbo input/output, in bytes, from the * start of the first segment's data buffer. It must be smaller than the * first segment's data_len! */ uint32_t length; /**< Length of Transport Block - number of bytes for Turbo Encode/Decode * operation for input; length of the output for output operation. */ }; * This mbuf formality is experimental and subject to change

bbdev APIs Device Management APIs Queue Management APIs Operation Management APIs Interrupts Support APIs Statistics APIs

bbdev APIs >> Device creation is based on the same principles as DPDK cryptodev and ethdev. Register driver configuration structure with DPDK EAL using the existing RTE_PMD_REGISTER_PCI macro. Physical devices are identified by PCI ID during the EAL PCI scan and allocated a unique device identifier. Device initiation is also along the same principles as DPDK cryptodev and ethdev. Devices are first configured int rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues, const struct rte_bbdev_conf *conf); Devices queues are then configured before the device is started and used. int rte_bbdev_queue_configure(uint8_t dev_id, uint16_t queue_id, const struct rte_bbdev_queue_conf *conf)

bbdev APIs Device Management uint8_t rte_bbdev_count(void); bool rte_bbdev_is_valid(uint8_t dev_id); uint8_t rte_bbdev_next(uint8_t dev_id); int rte_bbdev_configure(uint8_t dev_id, uint16_t num_queues, const struct rte_bbdev_conf *conf); int rte_bbdev_info_get(uint8_t dev_id, struct rte_bbdev_info *dev_info); int rte_bbdev_start(uint8_t dev_id); int rte_bbdev_stop(uint8_t dev_id); int rte_bbdev_close(uint8_t dev_id);

bbdev APIs Queue Management int rte_bbdev_queue_configure(uint8_t dev_id, uint16_t queue_id, const struct rte_bbdev_queue_conf *conf); int rte_bbdev_queue_start(uint8_t dev_id, uint16_t queue_id); int rte_bbdev_queue_stop(uint8_t dev_id, uint16_t queue_id); int rte_bbdev_queue_info_get(uint8_t dev_id, uint16_t queue_id, struct rte_bbdev_queue_info *dev_info); /** Different operation types supported by the device */ enum rte_bbdev_op_type { RTE_BBDEV_OP_NONE, /**< Dummy operation that does nothing */ RTE_BBDEV_OP_TURBO_DEC, /**< Turbo decode */ RTE_BBDEV_OP_TURBO_ENC, /**< Turbo encode */ RTE_BBDEV_OP_TYPE_COUNT, /**< Count of different op types */ };

DPDK BBDEV APIs Operation Management static inline uint16_t rte_bbdev_enqueue_ops(uint8_t dev_id, uint16_t queue_id, struct rte_bbdev_op **ops, uint16_t num_ops) static inline uint16_t rte_bbdev_dequeue_ops(uint8_t dev_id, uint16_t queue_id, struct rte_bbdev_op **ops, uint16_t num_ops) /** Structure specifying a single operation */ struct rte_bbdev_op { enum rte_bbdev_op_type type; /**< Type of this operation */ int status; /**< Status of operation that was performed */ struct rte_mempool *mempool; /**< Mempool which op instance is in */ void *opaque_data; /**< Opaque pointer for user data */ }; union { struct rte_bbdev_op_turbo_dec *turbo_dec; struct rte_bbdev_op_turbo_enc *turbo_enc; };

bbdev APIs Interrupt Support int rte_bbdev_callback_register(uint8_t dev_id, enum rte_bbdev_event_type event, rte_bbdev_cb_fn cb_fn, void *cb_arg); int rte_bbdev_callback_unregister(uint8_t dev_id, enum rte_bbdev_event_type event, rte_bbdev_cb_fn cb_fn, void *cb_arg); int rte_bbdev_queue_intr_enable(uint8_t dev_id, uint16_t queue_id); int rte_bbdev_queue_intr_disable(uint8_t dev_id, uint16_t queue_id); int rte_bbdev_queue_intr_ctl(uint8_t dev_id, uint16_t queue_id, int epfd, int op, void *data);

bbdev APIs Statistics int rte_bbdev_stats_get(uint8_t dev_id, struct rte_bbdev_stats *stats); int rte_bbdev_stats_reset(uint8_t dev_id); int rte_bbdev_info_get(uint8_t dev_id, struct rte_bbdev_info *dev_info);

Questions? Amr Mokhtar amr.mokhtar@intel.com