12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
- */
- #ifdef CONFIG_DEBUG_FS
- #include <linux/debugfs.h>
- #include <linux/kernel.h>
- #include <linux/stringify.h>
- #include "ipa_i.h"
- #include "../ipa_rm_i.h"
- #include "ipahal/ipahal_nat.h"
- #include "ipa_odl.h"
- #include "ipa_qmi_service.h"
- #define IPA_MAX_ENTRY_STRING_LEN 500
- #define IPA_MAX_MSG_LEN 4096
- #define IPA_DBG_MAX_RULE_IN_TBL 128
- #define IPA_DBG_ACTIVE_CLIENT_BUF_SIZE ((IPA3_ACTIVE_CLIENTS_LOG_LINE_LEN \
- * IPA3_ACTIVE_CLIENTS_LOG_BUFFER_SIZE_LINES) + IPA_MAX_MSG_LEN)
- #define IPA_DUMP_STATUS_FIELD(f) \
- pr_err(#f "=0x%x\n", status->f)
- #define IPA_READ_ONLY_MODE 0444
- #define IPA_READ_WRITE_MODE 0664
- #define IPA_WRITE_ONLY_MODE 0220
- struct ipa3_debugfs_file {
- const char *name;
- umode_t mode;
- void *data;
- const struct file_operations fops;
- };
- const char *ipa3_event_name[IPA_EVENT_MAX_NUM] = {
- __stringify(WLAN_CLIENT_CONNECT),
- __stringify(WLAN_CLIENT_DISCONNECT),
- __stringify(WLAN_CLIENT_POWER_SAVE_MODE),
- __stringify(WLAN_CLIENT_NORMAL_MODE),
- __stringify(SW_ROUTING_ENABLE),
- __stringify(SW_ROUTING_DISABLE),
- __stringify(WLAN_AP_CONNECT),
- __stringify(WLAN_AP_DISCONNECT),
- __stringify(WLAN_STA_CONNECT),
- __stringify(WLAN_STA_DISCONNECT),
- __stringify(WLAN_CLIENT_CONNECT_EX),
- __stringify(WLAN_SWITCH_TO_SCC),
- __stringify(WLAN_SWITCH_TO_MCC),
- __stringify(WLAN_WDI_ENABLE),
- __stringify(WLAN_WDI_DISABLE),
- __stringify(WAN_UPSTREAM_ROUTE_ADD),
- __stringify(WAN_UPSTREAM_ROUTE_DEL),
- __stringify(WAN_EMBMS_CONNECT),
- __stringify(WAN_XLAT_CONNECT),
- __stringify(ECM_CONNECT),
- __stringify(ECM_DISCONNECT),
- __stringify(IPA_TETHERING_STATS_UPDATE_STATS),
- __stringify(IPA_TETHERING_STATS_UPDATE_NETWORK_STATS),
- __stringify(IPA_QUOTA_REACH),
- __stringify(IPA_SSR_BEFORE_SHUTDOWN),
- __stringify(IPA_SSR_AFTER_POWERUP),
- __stringify(ADD_VLAN_IFACE),
- __stringify(DEL_VLAN_IFACE),
- __stringify(ADD_L2TP_VLAN_MAPPING),
- __stringify(DEL_L2TP_VLAN_MAPPING),
- __stringify(IPA_PER_CLIENT_STATS_CONNECT_EVENT),
- __stringify(IPA_PER_CLIENT_STATS_DISCONNECT_EVENT),
- __stringify(ADD_BRIDGE_VLAN_MAPPING),
- __stringify(DEL_BRIDGE_VLAN_MAPPING),
- __stringify(WLAN_FWR_SSR_BEFORE_SHUTDOWN),
- __stringify(IPA_GSB_CONNECT),
- __stringify(IPA_GSB_DISCONNECT),
- __stringify(IPA_COALESCE_ENABLE),
- __stringify(IPA_COALESCE_DISABLE),
- __stringify_1(WIGIG_CLIENT_CONNECT),
- __stringify_1(WIGIG_FST_SWITCH),
- };
- const char *ipa3_hdr_l2_type_name[] = {
- __stringify(IPA_HDR_L2_NONE),
- __stringify(IPA_HDR_L2_ETHERNET_II),
- __stringify(IPA_HDR_L2_802_3),
- __stringify(IPA_HDR_L2_802_1Q),
- };
- const char *ipa3_hdr_proc_type_name[] = {
- __stringify(IPA_HDR_PROC_NONE),
- __stringify(IPA_HDR_PROC_ETHII_TO_ETHII),
- __stringify(IPA_HDR_PROC_ETHII_TO_802_3),
- __stringify(IPA_HDR_PROC_802_3_TO_ETHII),
- __stringify(IPA_HDR_PROC_802_3_TO_802_3),
- __stringify(IPA_HDR_PROC_L2TP_HEADER_ADD),
- __stringify(IPA_HDR_PROC_L2TP_HEADER_REMOVE),
- __stringify(IPA_HDR_PROC_ETHII_TO_ETHII_EX),
- };
- static struct dentry *dent;
- static char dbg_buff[IPA_MAX_MSG_LEN + 1];
- static char *active_clients_buf;
- static s8 ep_reg_idx;
- static void *ipa_ipc_low_buff;
- static ssize_t ipa3_read_gen_reg(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- struct ipahal_reg_shared_mem_size smem_sz;
- memset(&smem_sz, 0, sizeof(smem_sz));
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- ipahal_read_reg_fields(IPA_SHARED_MEM_SIZE, &smem_sz);
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "IPA_VERSION=0x%x\n"
- "IPA_COMP_HW_VERSION=0x%x\n"
- "IPA_ROUTE=0x%x\n"
- "IPA_SHARED_MEM_RESTRICTED=0x%x\n"
- "IPA_SHARED_MEM_SIZE=0x%x\n"
- "IPA_QTIME_TIMESTAMP_CFG=0x%x\n"
- "IPA_TIMERS_PULSE_GRAN_CFG=0x%x\n"
- "IPA_TIMERS_XO_CLK_DIV_CFG=0x%x\n",
- ipahal_read_reg(IPA_VERSION),
- ipahal_read_reg(IPA_COMP_HW_VERSION),
- ipahal_read_reg(IPA_ROUTE),
- smem_sz.shared_mem_baddr,
- smem_sz.shared_mem_sz,
- ipahal_read_reg(IPA_QTIME_TIMESTAMP_CFG),
- ipahal_read_reg(IPA_TIMERS_PULSE_GRAN_CFG),
- ipahal_read_reg(IPA_TIMERS_XO_CLK_DIV_CFG));
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_write_ep_holb(struct file *file,
- const char __user *buf, size_t count, loff_t *ppos)
- {
- struct ipa_ep_cfg_holb holb;
- u32 en;
- u32 tmr_val;
- u32 ep_idx;
- unsigned long missing;
- char *sptr, *token;
- if (count >= sizeof(dbg_buff))
- return -EFAULT;
- missing = copy_from_user(dbg_buff, buf, count);
- if (missing)
- return -EFAULT;
- dbg_buff[count] = '\0';
- sptr = dbg_buff;
- token = strsep(&sptr, " ");
- if (!token)
- return -EINVAL;
- if (kstrtou32(token, 0, &ep_idx))
- return -EINVAL;
- token = strsep(&sptr, " ");
- if (!token)
- return -EINVAL;
- if (kstrtou32(token, 0, &en))
- return -EINVAL;
- token = strsep(&sptr, " ");
- if (!token)
- return -EINVAL;
- if (kstrtou32(token, 0, &tmr_val))
- return -EINVAL;
- holb.en = en;
- holb.tmr_val = tmr_val;
- ipa3_cfg_ep_holb(ep_idx, &holb);
- return count;
- }
- static ssize_t ipa3_write_ep_reg(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
- {
- s8 option;
- int ret;
- ret = kstrtos8_from_user(buf, count, 0, &option);
- if (ret)
- return ret;
- if (option >= ipa3_ctx->ipa_num_pipes) {
- IPAERR("bad pipe specified %u\n", option);
- return count;
- }
- ep_reg_idx = option;
- return count;
- }
- /**
- * _ipa_read_ep_reg_v3_0() - Reads and prints endpoint configuration registers
- *
- * Returns the number of characters printed
- */
- int _ipa_read_ep_reg_v3_0(char *buf, int max_len, int pipe)
- {
- return scnprintf(
- dbg_buff, IPA_MAX_MSG_LEN,
- "IPA_ENDP_INIT_NAT_%u=0x%x\n"
- "IPA_ENDP_INIT_HDR_%u=0x%x\n"
- "IPA_ENDP_INIT_HDR_EXT_%u=0x%x\n"
- "IPA_ENDP_INIT_MODE_%u=0x%x\n"
- "IPA_ENDP_INIT_AGGR_%u=0x%x\n"
- "IPA_ENDP_INIT_ROUTE_%u=0x%x\n"
- "IPA_ENDP_INIT_CTRL_%u=0x%x\n"
- "IPA_ENDP_INIT_HOL_EN_%u=0x%x\n"
- "IPA_ENDP_INIT_HOL_TIMER_%u=0x%x\n"
- "IPA_ENDP_INIT_DEAGGR_%u=0x%x\n"
- "IPA_ENDP_INIT_CFG_%u=0x%x\n",
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_NAT_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HDR_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HDR_EXT_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_MODE_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_AGGR_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_ROUTE_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_CTRL_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HOL_BLOCK_EN_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HOL_BLOCK_TIMER_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_DEAGGR_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_CFG_n, pipe));
- }
- /**
- * _ipa_read_ep_reg_v4_0() - Reads and prints endpoint configuration registers
- *
- * Returns the number of characters printed
- * Removed IPA_ENDP_INIT_ROUTE_n from v3
- */
- int _ipa_read_ep_reg_v4_0(char *buf, int max_len, int pipe)
- {
- return scnprintf(
- dbg_buff, IPA_MAX_MSG_LEN,
- "IPA_ENDP_INIT_NAT_%u=0x%x\n"
- "IPA_ENDP_INIT_CONN_TRACK_n%u=0x%x\n"
- "IPA_ENDP_INIT_HDR_%u=0x%x\n"
- "IPA_ENDP_INIT_HDR_EXT_%u=0x%x\n"
- "IPA_ENDP_INIT_MODE_%u=0x%x\n"
- "IPA_ENDP_INIT_AGGR_%u=0x%x\n"
- "IPA_ENDP_INIT_CTRL_%u=0x%x\n"
- "IPA_ENDP_INIT_HOL_EN_%u=0x%x\n"
- "IPA_ENDP_INIT_HOL_TIMER_%u=0x%x\n"
- "IPA_ENDP_INIT_DEAGGR_%u=0x%x\n"
- "IPA_ENDP_INIT_CFG_%u=0x%x\n",
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_NAT_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_CONN_TRACK_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HDR_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HDR_EXT_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_MODE_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_AGGR_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_CTRL_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HOL_BLOCK_EN_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_HOL_BLOCK_TIMER_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_DEAGGR_n, pipe),
- pipe, ipahal_read_reg_n(IPA_ENDP_INIT_CFG_n, pipe));
- }
- static ssize_t ipa3_read_ep_reg(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- int i;
- int start_idx;
- int end_idx;
- int size = 0;
- int ret;
- loff_t pos;
- /* negative ep_reg_idx means all registers */
- if (ep_reg_idx < 0) {
- start_idx = 0;
- end_idx = ipa3_ctx->ipa_num_pipes;
- } else {
- start_idx = ep_reg_idx;
- end_idx = start_idx + 1;
- }
- pos = *ppos;
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- for (i = start_idx; i < end_idx; i++) {
- nbytes = ipa3_ctx->ctrl->ipa3_read_ep_reg(dbg_buff,
- IPA_MAX_MSG_LEN, i);
- *ppos = pos;
- ret = simple_read_from_buffer(ubuf, count, ppos, dbg_buff,
- nbytes);
- if (ret < 0) {
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- return ret;
- }
- size += ret;
- ubuf += nbytes;
- count -= nbytes;
- }
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- *ppos = pos + size;
- return size;
- }
- static ssize_t ipa3_write_keep_awake(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
- {
- s8 option = 0;
- int ret;
- uint32_t bw_mbps = 0;
- ret = kstrtos8_from_user(buf, count, 0, &option);
- if (ret)
- return ret;
- switch (option) {
- case 0:
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- bw_mbps = 0;
- break;
- case 1:
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- bw_mbps = 0;
- break;
- case 2:
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- bw_mbps = 700;
- break;
- case 3:
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- bw_mbps = 3000;
- break;
- case 4:
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- bw_mbps = 7000;
- break;
- default:
- pr_err("Not support this vote (%d)\n", option);
- return -EFAULT;
- }
- if (ipa3_vote_for_bus_bw(&bw_mbps)) {
- IPAERR("Failed to vote for bus BW (%u)\n", bw_mbps);
- return -EFAULT;
- }
- return count;
- }
- static ssize_t ipa3_read_keep_awake(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- mutex_lock(&ipa3_ctx->ipa3_active_clients.mutex);
- if (atomic_read(&ipa3_ctx->ipa3_active_clients.cnt))
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "IPA APPS power state is ON\n");
- else
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "IPA APPS power state is OFF\n");
- mutex_unlock(&ipa3_ctx->ipa3_active_clients.mutex);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_hdr(struct file *file, char __user *ubuf, size_t count,
- loff_t *ppos)
- {
- int nbytes = 0;
- int i = 0;
- struct ipa3_hdr_entry *entry;
- mutex_lock(&ipa3_ctx->lock);
- if (ipa3_ctx->hdr_tbl_lcl)
- pr_err("Table resides on local memory\n");
- else
- pr_err("Table resides on system (ddr) memory\n");
- list_for_each_entry(entry, &ipa3_ctx->hdr_tbl.head_hdr_entry_list,
- link) {
- if (entry->cookie != IPA_HDR_COOKIE)
- continue;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "name:%s len=%d ref=%d partial=%d type=%s ",
- entry->name,
- entry->hdr_len,
- entry->ref_cnt,
- entry->is_partial,
- ipa3_hdr_l2_type_name[entry->type]);
- if (entry->is_hdr_proc_ctx) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "phys_base=0x%pa ",
- &entry->phys_base);
- } else {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ofst=%u ",
- entry->offset_entry->offset >> 2);
- }
- for (i = 0; i < entry->hdr_len; i++) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "%02x", entry->hdr[i]);
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "\n");
- }
- mutex_unlock(&ipa3_ctx->lock);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static int ipa3_attrib_dump(struct ipa_rule_attrib *attrib,
- enum ipa_ip_type ip, int nbytes)
- {
- uint32_t addr[4];
- uint32_t mask[4];
- int i;
- if (attrib->attrib_mask & IPA_FLT_IS_PURE_ACK)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "is_pure_ack ");
- if (attrib->attrib_mask & IPA_FLT_TOS)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tos:%d ", attrib->u.v4.tos);
- if (attrib->attrib_mask & IPA_FLT_TOS_MASKED) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tos_value:%d ", attrib->tos_value);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tos_mask:%d ", attrib->tos_mask);
- }
- if (attrib->attrib_mask & IPA_FLT_PROTOCOL)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "protocol:%d ", attrib->u.v4.protocol);
- if (attrib->attrib_mask & IPA_FLT_SRC_ADDR) {
- if (ip == IPA_IP_v4) {
- addr[0] = htonl(attrib->u.v4.src_addr);
- mask[0] = htonl(attrib->u.v4.src_addr_mask);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "src_addr:%pI4 src_addr_mask:%pI4 ",
- addr + 0, mask + 0);
- } else if (ip == IPA_IP_v6) {
- for (i = 0; i < 4; i++) {
- addr[i] = htonl(attrib->u.v6.src_addr[i]);
- mask[i] = htonl(attrib->u.v6.src_addr_mask[i]);
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "src_addr:%pI6 src_addr_mask:%pI6 ",
- addr + 0, mask + 0);
- }
- }
- if (attrib->attrib_mask & IPA_FLT_DST_ADDR) {
- if (ip == IPA_IP_v4) {
- addr[0] = htonl(attrib->u.v4.dst_addr);
- mask[0] = htonl(attrib->u.v4.dst_addr_mask);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "dst_addr:%pI4 dst_addr_mask:%pI4 ",
- addr + 0, mask + 0);
- } else if (ip == IPA_IP_v6) {
- for (i = 0; i < 4; i++) {
- addr[i] = htonl(attrib->u.v6.dst_addr[i]);
- mask[i] = htonl(attrib->u.v6.dst_addr_mask[i]);
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "dst_addr:%pI6 dst_addr_mask:%pI6 ",
- addr + 0, mask + 0);
- }
- }
- if (attrib->attrib_mask & IPA_FLT_SRC_PORT_RANGE)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "src_port_range:%u %u ",
- attrib->src_port_lo,
- attrib->src_port_hi);
- if (attrib->attrib_mask & IPA_FLT_DST_PORT_RANGE)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "dst_port_range:%u %u ",
- attrib->dst_port_lo,
- attrib->dst_port_hi);
- if (attrib->attrib_mask & IPA_FLT_TYPE)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "type:%d ", attrib->type);
- if (attrib->attrib_mask & IPA_FLT_CODE)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "code:%d ", attrib->code);
- if (attrib->attrib_mask & IPA_FLT_SPI)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "spi:%x ", attrib->spi);
- if (attrib->attrib_mask & IPA_FLT_SRC_PORT)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "src_port:%u ", attrib->src_port);
- if (attrib->attrib_mask & IPA_FLT_DST_PORT)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "dst_port:%u ", attrib->dst_port);
- if (attrib->attrib_mask & IPA_FLT_TC)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tc:%d ", attrib->u.v6.tc);
- if (attrib->attrib_mask & IPA_FLT_FLOW_LABEL)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "flow_label:%x ",
- attrib->u.v6.flow_label);
- if (attrib->attrib_mask & IPA_FLT_NEXT_HDR)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "next_hdr:%d ",
- attrib->u.v6.next_hdr);
- if (attrib->attrib_mask & IPA_FLT_META_DATA)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "metadata:%x metadata_mask:%x ",
- attrib->meta_data,
- attrib->meta_data_mask);
- if (attrib->attrib_mask & IPA_FLT_FRAGMENT)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "frg ");
- if ((attrib->attrib_mask & IPA_FLT_MAC_SRC_ADDR_ETHER_II) ||
- (attrib->attrib_mask & IPA_FLT_MAC_SRC_ADDR_802_3) ||
- (attrib->attrib_mask & IPA_FLT_MAC_SRC_ADDR_802_1Q))
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "src_mac_addr:%pM ",
- attrib->src_mac_addr);
- if ((attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_ETHER_II) ||
- (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_802_3) ||
- (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_L2TP) ||
- (attrib->attrib_mask & IPA_FLT_MAC_DST_ADDR_802_1Q))
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "dst_mac_addr:%pM ",
- attrib->dst_mac_addr);
- if (attrib->attrib_mask & IPA_FLT_MAC_ETHER_TYPE)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ether_type:%x ",
- attrib->ether_type);
- if (attrib->attrib_mask & IPA_FLT_VLAN_ID)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "vlan_id:%x ",
- attrib->vlan_id);
- if (attrib->attrib_mask & IPA_FLT_TCP_SYN)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tcp syn ");
- if (attrib->attrib_mask & IPA_FLT_TCP_SYN_L2TP)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tcp syn l2tp ");
- if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IP_TYPE)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "l2tp inner ip type: %d ",
- attrib->type);
- if (attrib->attrib_mask & IPA_FLT_L2TP_INNER_IPV4_DST_ADDR) {
- addr[0] = htonl(attrib->u.v4.dst_addr);
- mask[0] = htonl(attrib->u.v4.dst_addr_mask);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "dst_addr:%pI4 dst_addr_mask:%pI4 ",
- addr, mask);
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "\n");
- return 0;
- }
- static int ipa3_attrib_dump_eq(struct ipa_ipfltri_rule_eq *attrib,
- int nbytes)
- {
- uint8_t addr[16];
- uint8_t mask[16];
- int i;
- int j;
- if (attrib->tos_eq_present) {
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_5)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "pure_ack ");
- else
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tos:%d ",
- attrib->tos_eq);
- }
- if (attrib->protocol_eq_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "protocol:%d ",
- attrib->protocol_eq);
- if (attrib->tc_eq_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tc:%d ", attrib->tc_eq);
- if (attrib->num_offset_meq_128 > IPA_IPFLTR_NUM_MEQ_128_EQNS) {
- IPAERR_RL("num_offset_meq_128 Max %d passed value %d\n",
- IPA_IPFLTR_NUM_MEQ_128_EQNS, attrib->num_offset_meq_128);
- return -EPERM;
- }
- for (i = 0; i < attrib->num_offset_meq_128; i++) {
- for (j = 0; j < 16; j++) {
- addr[j] = attrib->offset_meq_128[i].value[j];
- mask[j] = attrib->offset_meq_128[i].mask[j];
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(ofst_meq128: ofst:%d mask:%pI6 val:%pI6) ",
- attrib->offset_meq_128[i].offset,
- mask, addr);
- }
- if (attrib->num_offset_meq_32 > IPA_IPFLTR_NUM_MEQ_32_EQNS) {
- IPAERR_RL("num_offset_meq_32 Max %d passed value %d\n",
- IPA_IPFLTR_NUM_MEQ_32_EQNS, attrib->num_offset_meq_32);
- return -EPERM;
- }
- for (i = 0; i < attrib->num_offset_meq_32; i++)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(ofst_meq32: ofst:%u mask:0x%x val:0x%x) ",
- attrib->offset_meq_32[i].offset,
- attrib->offset_meq_32[i].mask,
- attrib->offset_meq_32[i].value);
- if (attrib->num_ihl_offset_meq_32 > IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS) {
- IPAERR_RL("num_ihl_offset_meq_32 Max %d passed value %d\n",
- IPA_IPFLTR_NUM_IHL_MEQ_32_EQNS, attrib->num_ihl_offset_meq_32);
- return -EPERM;
- }
- for (i = 0; i < attrib->num_ihl_offset_meq_32; i++)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(ihl_ofst_meq32: ofts:%d mask:0x%x val:0x%x) ",
- attrib->ihl_offset_meq_32[i].offset,
- attrib->ihl_offset_meq_32[i].mask,
- attrib->ihl_offset_meq_32[i].value);
- if (attrib->metadata_meq32_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(metadata: ofst:%u mask:0x%x val:0x%x) ",
- attrib->metadata_meq32.offset,
- attrib->metadata_meq32.mask,
- attrib->metadata_meq32.value);
- if (attrib->num_ihl_offset_range_16 >
- IPA_IPFLTR_NUM_IHL_RANGE_16_EQNS) {
- IPAERR_RL("num_ihl_offset_range_16 Max %d passed value %d\n",
- IPA_IPFLTR_NUM_IHL_RANGE_16_EQNS,
- attrib->num_ihl_offset_range_16);
- return -EPERM;
- }
- for (i = 0; i < attrib->num_ihl_offset_range_16; i++)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(ihl_ofst_range16: ofst:%u lo:%u hi:%u) ",
- attrib->ihl_offset_range_16[i].offset,
- attrib->ihl_offset_range_16[i].range_low,
- attrib->ihl_offset_range_16[i].range_high);
- if (attrib->ihl_offset_eq_32_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(ihl_ofst_eq32:%d val:0x%x) ",
- attrib->ihl_offset_eq_32.offset,
- attrib->ihl_offset_eq_32.value);
- if (attrib->ihl_offset_eq_16_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "(ihl_ofst_eq16:%d val:0x%x) ",
- attrib->ihl_offset_eq_16.offset,
- attrib->ihl_offset_eq_16.value);
- if (attrib->fl_eq_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "flow_label:%d ", attrib->fl_eq);
- if (attrib->ipv4_frag_eq_present)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "frag ");
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "\n");
- return 0;
- }
- static int ipa3_open_dbg(struct inode *inode, struct file *file)
- {
- file->private_data = inode->i_private;
- return 0;
- }
- static ssize_t ipa3_read_rt(struct file *file, char __user *ubuf, size_t count,
- loff_t *ppos)
- {
- int i = 0;
- struct ipa3_rt_tbl *tbl;
- struct ipa3_rt_entry *entry;
- struct ipa3_rt_tbl_set *set;
- enum ipa_ip_type ip = (enum ipa_ip_type)file->private_data;
- u32 ofst;
- u32 ofst_words;
- int nbytes = 0;
- set = &ipa3_ctx->rt_tbl_set[ip];
- mutex_lock(&ipa3_ctx->lock);
- if (ip == IPA_IP_v6) {
- if (ipa3_ctx->ip6_rt_tbl_hash_lcl)
- pr_err("Hashable table resides on local memory\n");
- else
- pr_err("Hashable table resides on system (ddr) memory\n");
- if (ipa3_ctx->ip6_rt_tbl_nhash_lcl)
- pr_err("Non-Hashable table resides on local memory\n");
- else
- pr_err("Non-Hashable table resides on system (ddr) memory\n");
- } else if (ip == IPA_IP_v4) {
- if (ipa3_ctx->ip4_rt_tbl_hash_lcl)
- pr_err("Hashable table resides on local memory\n");
- else
- pr_err("Hashable table resides on system (ddr) memory\n");
- if (ipa3_ctx->ip4_rt_tbl_nhash_lcl)
- pr_err("Non-Hashable table resides on local memory\n");
- else
- pr_err("Non-Hashable table resides on system (ddr) memory\n");
- }
- list_for_each_entry(tbl, &set->head_rt_tbl_list, link) {
- i = 0;
- list_for_each_entry(entry, &tbl->head_rt_rule_list, link) {
- if (entry->proc_ctx) {
- ofst = entry->proc_ctx->offset_entry->offset;
- ofst_words =
- (ofst +
- ipa3_ctx->hdr_proc_ctx_tbl.start_offset)
- >> 5;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tbl_idx:%d tbl_name:%s tbl_ref:%u ",
- entry->tbl->idx, entry->tbl->name,
- entry->tbl->ref_cnt);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_idx:%d dst:%d ep:%d S:%u ",
- i, entry->rule.dst,
- ipa3_get_ep_mapping(entry->rule.dst),
- !ipa3_ctx->hdr_proc_ctx_tbl_lcl);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "proc_ctx[32B]:%u attrib_mask:%08x ",
- ofst_words,
- entry->rule.attrib.attrib_mask);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_id:%u max_prio:%u prio:%u ",
- entry->rule_id, entry->rule.max_prio,
- entry->prio);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "enable_stats:%u counter_id:%u\n",
- entry->rule.enable_stats,
- entry->rule.cnt_idx);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hashable:%u retain_hdr:%u ",
- entry->rule.hashable,
- entry->rule.retain_hdr);
- } else {
- if (entry->hdr)
- ofst = entry->hdr->offset_entry->offset;
- else
- ofst = 0;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "tbl_idx:%d tbl_name:%s tbl_ref:%u ",
- entry->tbl->idx, entry->tbl->name,
- entry->tbl->ref_cnt);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_idx:%d dst:%d ep:%d S:%u ",
- i, entry->rule.dst,
- ipa3_get_ep_mapping(entry->rule.dst),
- !ipa3_ctx->hdr_tbl_lcl);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hdr_ofst[words]:%u attrib_mask:%08x ",
- ofst >> 2,
- entry->rule.attrib.attrib_mask);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_id:%u max_prio:%u prio:%u ",
- entry->rule_id, entry->rule.max_prio,
- entry->prio);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "enable_stats:%u counter_id:%u\n",
- entry->rule.enable_stats,
- entry->rule.cnt_idx);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hashable:%u retain_hdr:%u ",
- entry->rule.hashable,
- entry->rule.retain_hdr);
- }
- ipa3_attrib_dump(&entry->rule.attrib, ip, nbytes);
- i++;
- }
- }
- mutex_unlock(&ipa3_ctx->lock);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_rt_hw(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- enum ipa_ip_type ip = (enum ipa_ip_type)file->private_data;
- int tbls_num;
- int rules_num;
- int tbl;
- int rl;
- int res = 0;
- struct ipahal_rt_rule_entry *rules = NULL;
- int nbytes = 0;
- switch (ip) {
- case IPA_IP_v4:
- tbls_num = IPA_MEM_PART(v4_rt_num_index);
- break;
- case IPA_IP_v6:
- tbls_num = IPA_MEM_PART(v6_rt_num_index);
- break;
- default:
- IPAERR("ip type error %d\n", ip);
- return -EINVAL;
- }
- IPADBG("Tring to parse %d H/W routing tables - IP=%d\n", tbls_num, ip);
- rules = kzalloc(sizeof(*rules) * IPA_DBG_MAX_RULE_IN_TBL, GFP_KERNEL);
- if (!rules) {
- IPAERR("failed to allocate mem for tbl rules\n");
- return -ENOMEM;
- }
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- mutex_lock(&ipa3_ctx->lock);
- for (tbl = 0 ; tbl < tbls_num ; tbl++) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "=== Routing Table %d = Hashable Rules ===\n",
- tbl);
- rules_num = IPA_DBG_MAX_RULE_IN_TBL;
- res = ipa3_rt_read_tbl_from_hw(tbl, ip, true, rules,
- &rules_num);
- if (res) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ERROR - Check the logs\n");
- IPAERR("failed reading tbl from hw\n");
- goto bail;
- }
- if (!rules_num)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "-->No rules. Empty tbl or modem system table\n");
- for (rl = 0 ; rl < rules_num ; rl++) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_idx:%d dst ep:%d L:%u ",
- rl, rules[rl].dst_pipe_idx, rules[rl].hdr_lcl);
- if (rules[rl].hdr_type == IPAHAL_RT_RULE_HDR_PROC_CTX)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "proc_ctx:%u attrib_mask:%08x ",
- rules[rl].hdr_ofst,
- rules[rl].eq_attrib.rule_eq_bitmap);
- else
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hdr_ofst:%u attrib_mask:%08x ",
- rules[rl].hdr_ofst,
- rules[rl].eq_attrib.rule_eq_bitmap);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_id:%u cnt_id:%hhu prio:%u retain_hdr:%u\n",
- rules[rl].id, rules[rl].cnt_idx,
- rules[rl].priority, rules[rl].retain_hdr);
- res = ipa3_attrib_dump_eq(&rules[rl].eq_attrib, nbytes);
- if (res) {
- IPAERR_RL("failed read attrib eq\n");
- goto bail;
- }
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "=== Routing Table %d = Non-Hashable Rules ===\n",
- tbl);
- rules_num = IPA_DBG_MAX_RULE_IN_TBL;
- res = ipa3_rt_read_tbl_from_hw(tbl, ip, false, rules,
- &rules_num);
- if (res) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ERROR - Check the logs\n");
- IPAERR("failed reading tbl from hw\n");
- goto bail;
- }
- if (!rules_num)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "-->No rules. Empty tbl or modem system table\n");
- for (rl = 0 ; rl < rules_num ; rl++) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_idx:%d dst ep:%d L:%u ",
- rl, rules[rl].dst_pipe_idx,
- rules[rl].hdr_lcl);
- if (rules[rl].hdr_type == IPAHAL_RT_RULE_HDR_PROC_CTX)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "proc_ctx:%u attrib_mask:%08x ",
- rules[rl].hdr_ofst,
- rules[rl].eq_attrib.rule_eq_bitmap);
- else
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hdr_ofst:%u attrib_mask:%08x ",
- rules[rl].hdr_ofst,
- rules[rl].eq_attrib.rule_eq_bitmap);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_id:%u cnt_id:%hhu prio:%u retain_hdr:%u\n",
- rules[rl].id, rules[rl].cnt_idx,
- rules[rl].priority, rules[rl].retain_hdr);
- res = ipa3_attrib_dump_eq(&rules[rl].eq_attrib, nbytes);
- if (res) {
- IPAERR_RL("failed read attrib eq\n");
- goto bail;
- }
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "\n");
- }
- bail:
- mutex_unlock(&ipa3_ctx->lock);
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- kfree(rules);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_proc_ctx(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes = 0;
- struct ipa3_hdr_proc_ctx_tbl *tbl;
- struct ipa3_hdr_proc_ctx_entry *entry;
- u32 ofst_words;
- tbl = &ipa3_ctx->hdr_proc_ctx_tbl;
- mutex_lock(&ipa3_ctx->lock);
- if (ipa3_ctx->hdr_proc_ctx_tbl_lcl)
- pr_info("Table resides on local memory\n");
- else
- pr_info("Table resides on system(ddr) memory\n");
- list_for_each_entry(entry, &tbl->head_proc_ctx_entry_list, link) {
- ofst_words = (entry->offset_entry->offset +
- ipa3_ctx->hdr_proc_ctx_tbl.start_offset)
- >> 5;
- if (entry->hdr->is_hdr_proc_ctx) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "id:%u hdr_proc_type:%s proc_ctx[32B]:%u ",
- entry->id,
- ipa3_hdr_proc_type_name[entry->type],
- ofst_words);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hdr_phys_base:0x%pa\n",
- &entry->hdr->phys_base);
- } else {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "id:%u hdr_proc_type:%s proc_ctx[32B]:%u ",
- entry->id,
- ipa3_hdr_proc_type_name[entry->type],
- ofst_words);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hdr[words]:%u\n",
- entry->hdr->offset_entry->offset >> 2);
- }
- }
- mutex_unlock(&ipa3_ctx->lock);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_flt(struct file *file, char __user *ubuf, size_t count,
- loff_t *ppos)
- {
- int i;
- int j;
- struct ipa3_flt_tbl *tbl;
- struct ipa3_flt_entry *entry;
- enum ipa_ip_type ip = (enum ipa_ip_type)file->private_data;
- struct ipa3_rt_tbl *rt_tbl;
- u32 rt_tbl_idx;
- u32 bitmap;
- bool eq;
- int res = 0;
- int nbytes = 0;
- mutex_lock(&ipa3_ctx->lock);
- for (j = 0; j < ipa3_ctx->ipa_num_pipes; j++) {
- if (!ipa_is_ep_support_flt(j))
- continue;
- tbl = &ipa3_ctx->flt_tbl[j][ip];
- i = 0;
- list_for_each_entry(entry, &tbl->head_flt_rule_list, link) {
- if (entry->cookie != IPA_FLT_COOKIE)
- continue;
- if (entry->rule.eq_attrib_type) {
- rt_tbl_idx = entry->rule.rt_tbl_idx;
- bitmap = entry->rule.eq_attrib.rule_eq_bitmap;
- eq = true;
- } else {
- rt_tbl = ipa3_id_find(entry->rule.rt_tbl_hdl);
- if (rt_tbl == NULL ||
- rt_tbl->cookie != IPA_RT_TBL_COOKIE)
- rt_tbl_idx = ~0;
- else
- rt_tbl_idx = rt_tbl->idx;
- bitmap = entry->rule.attrib.attrib_mask;
- eq = false;
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ep_idx:%d rule_idx:%d act:%d rt_tbl_idx:%d ",
- j, i, entry->rule.action, rt_tbl_idx);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "attrib_mask:%08x retain_hdr:%d eq:%d ",
- bitmap, entry->rule.retain_hdr, eq);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "hashable:%u rule_id:%u max_prio:%u prio:%u ",
- entry->rule.hashable, entry->rule_id,
- entry->rule.max_prio, entry->prio);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "enable_stats:%u counter_id:%u\n",
- entry->rule.enable_stats,
- entry->rule.cnt_idx);
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "pdn index %d, set metadata %d ",
- entry->rule.pdn_idx,
- entry->rule.set_metadata);
- if (eq) {
- res = ipa3_attrib_dump_eq(
- &entry->rule.eq_attrib, nbytes);
- if (res) {
- IPAERR_RL("failed read attrib eq\n");
- goto bail;
- }
- } else
- ipa3_attrib_dump(
- &entry->rule.attrib, ip, nbytes);
- i++;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "\n");
- }
- }
- bail:
- mutex_unlock(&ipa3_ctx->lock);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_flt_hw(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int pipe;
- int rl;
- int rules_num;
- struct ipahal_flt_rule_entry *rules;
- enum ipa_ip_type ip = (enum ipa_ip_type)file->private_data;
- u32 rt_tbl_idx;
- u32 bitmap;
- int res = 0;
- int nbytes = 0;
- IPADBG("Tring to parse %d H/W filtering tables - IP=%d\n",
- ipa3_ctx->ep_flt_num, ip);
- rules = kzalloc(sizeof(*rules) * IPA_DBG_MAX_RULE_IN_TBL, GFP_KERNEL);
- if (!rules)
- return -ENOMEM;
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- mutex_lock(&ipa3_ctx->lock);
- for (pipe = 0; pipe < ipa3_ctx->ipa_num_pipes; pipe++) {
- if (!ipa_is_ep_support_flt(pipe))
- continue;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "=== Filtering Table ep:%d = Hashable Rules ===\n",
- pipe);
- rules_num = IPA_DBG_MAX_RULE_IN_TBL;
- res = ipa3_flt_read_tbl_from_hw(pipe, ip, true, rules,
- &rules_num);
- if (res) {
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ERROR - Check the logs\n");
- IPAERR("failed reading tbl from hw\n");
- goto bail;
- }
- if (!rules_num)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "-->No rules. Empty tbl or modem sys table\n");
- for (rl = 0; rl < rules_num; rl++) {
- rt_tbl_idx = rules[rl].rule.rt_tbl_idx;
- bitmap = rules[rl].rule.eq_attrib.rule_eq_bitmap;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ep_idx:%d rule_idx:%d act:%d rt_tbl_idx:%d ",
- pipe, rl, rules[rl].rule.action, rt_tbl_idx);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "attrib_mask:%08x retain_hdr:%d ",
- bitmap, rules[rl].rule.retain_hdr);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_id:%u cnt_id:%hhu prio:%u\n",
- rules[rl].id, rules[rl].cnt_idx,
- rules[rl].priority);
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "pdn: %u, set_metadata: %u ",
- rules[rl].rule.pdn_idx,
- rules[rl].rule.set_metadata);
- res = ipa3_attrib_dump_eq(&rules[rl].rule.eq_attrib,
- nbytes);
- if (res) {
- IPAERR_RL("failed read attrib eq\n");
- goto bail;
- }
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "=== Filtering Table ep:%d = Non-Hashable Rules ===\n",
- pipe);
- rules_num = IPA_DBG_MAX_RULE_IN_TBL;
- res = ipa3_flt_read_tbl_from_hw(pipe, ip, false, rules,
- &rules_num);
- if (res) {
- IPAERR("failed reading tbl from hw\n");
- goto bail;
- }
- if (!rules_num)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "-->No rules. Empty tbl or modem sys table\n");
- for (rl = 0; rl < rules_num; rl++) {
- rt_tbl_idx = rules[rl].rule.rt_tbl_idx;
- bitmap = rules[rl].rule.eq_attrib.rule_eq_bitmap;
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "ep_idx:%d rule_idx:%d act:%d rt_tbl_idx:%d ",
- pipe, rl, rules[rl].rule.action, rt_tbl_idx);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "attrib_mask:%08x retain_hdr:%d ",
- bitmap, rules[rl].rule.retain_hdr);
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "rule_id:%u cnt_id:%hhu prio:%u\n",
- rules[rl].id, rules[rl].cnt_idx,
- rules[rl].priority);
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0)
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "pdn: %u, set_metadata: %u ",
- rules[rl].rule.pdn_idx,
- rules[rl].rule.set_metadata);
- res = ipa3_attrib_dump_eq(&rules[rl].rule.eq_attrib,
- nbytes);
- if (res) {
- IPAERR_RL("failed read attrib eq\n");
- goto bail;
- }
- }
- nbytes += scnprintf(
- dbg_buff + nbytes,
- IPA_MAX_MSG_LEN - nbytes,
- "\n");
- }
- bail:
- mutex_unlock(&ipa3_ctx->lock);
- kfree(rules);
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_stats(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- int i;
- int cnt = 0;
- uint connect = 0;
- for (i = 0; i < ipa3_ctx->ipa_num_pipes; i++)
- connect |= (ipa3_ctx->ep[i].valid << i);
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "sw_tx=%u\n"
- "hw_tx=%u\n"
- "tx_non_linear=%u\n"
- "tx_compl=%u\n"
- "wan_rx=%u\n"
- "stat_compl=%u\n"
- "lan_aggr_close=%u\n"
- "wan_aggr_close=%u\n"
- "act_clnt=%u\n"
- "con_clnt_bmap=0x%x\n"
- "wan_rx_empty=%u\n"
- "wan_repl_rx_empty=%u\n"
- "lan_rx_empty=%u\n"
- "lan_repl_rx_empty=%u\n"
- "flow_enable=%u\n"
- "flow_disable=%u\n",
- ipa3_ctx->stats.tx_sw_pkts,
- ipa3_ctx->stats.tx_hw_pkts,
- ipa3_ctx->stats.tx_non_linear,
- ipa3_ctx->stats.tx_pkts_compl,
- ipa3_ctx->stats.rx_pkts,
- ipa3_ctx->stats.stat_compl,
- ipa3_ctx->stats.aggr_close,
- ipa3_ctx->stats.wan_aggr_close,
- atomic_read(&ipa3_ctx->ipa3_active_clients.cnt),
- connect,
- ipa3_ctx->stats.wan_rx_empty,
- ipa3_ctx->stats.wan_repl_rx_empty,
- ipa3_ctx->stats.lan_rx_empty,
- ipa3_ctx->stats.lan_repl_rx_empty,
- ipa3_ctx->stats.flow_enable,
- ipa3_ctx->stats.flow_disable);
- cnt += nbytes;
- for (i = 0; i < IPAHAL_PKT_STATUS_EXCEPTION_MAX; i++) {
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt,
- "lan_rx_excp[%u:%20s]=%u\n", i,
- ipahal_pkt_status_exception_str(i),
- ipa3_ctx->stats.rx_excp_pkts[i]);
- cnt += nbytes;
- }
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_odlstats(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- int cnt = 0;
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "ODL received pkt =%u\n"
- "ODL processed pkt to DIAG=%u\n"
- "ODL dropped pkt =%u\n"
- "ODL packet in queue =%u\n",
- ipa3_odl_ctx->stats.odl_rx_pkt,
- ipa3_odl_ctx->stats.odl_tx_diag_pkt,
- ipa3_odl_ctx->stats.odl_drop_pkt,
- atomic_read(&ipa3_odl_ctx->stats.numer_in_queue));
- cnt += nbytes;
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_page_recycle_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- int nbytes;
- int cnt = 0;
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "COAL : Total number of packets replenished =%llu\n"
- "COAL : Number of tmp alloc packets =%llu\n"
- "DEF : Total number of packets replenished =%llu\n"
- "DEF : Number of tmp alloc packets =%llu\n",
- ipa3_ctx->stats.page_recycle_stats[0].total_replenished,
- ipa3_ctx->stats.page_recycle_stats[0].tmp_alloc,
- ipa3_ctx->stats.page_recycle_stats[1].total_replenished,
- ipa3_ctx->stats.page_recycle_stats[1].tmp_alloc);
- cnt += nbytes;
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_wstats(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- #define HEAD_FRMT_STR "%25s\n"
- #define FRMT_STR "%25s %10u\n"
- #define FRMT_STR1 "%25s %10u\n\n"
- int cnt = 0;
- int nbytes;
- int ipa_ep_idx;
- enum ipa_client_type client = IPA_CLIENT_WLAN1_PROD;
- struct ipa3_ep_context *ep;
- do {
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- HEAD_FRMT_STR, "Client IPA_CLIENT_WLAN1_PROD Stats:");
- cnt += nbytes;
- ipa_ep_idx = ipa3_get_ep_mapping(client);
- if (ipa_ep_idx == -1) {
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR, "Not up");
- cnt += nbytes;
- break;
- }
- ep = &ipa3_ctx->ep[ipa_ep_idx];
- if (ep->valid != 1) {
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR, "Not up");
- cnt += nbytes;
- break;
- }
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Avail Fifo Desc:",
- atomic_read(&ep->avail_fifo_desc));
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Rx Pkts Rcvd:", ep->wstats.rx_pkts_rcvd);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Rx Pkts Status Rcvd:",
- ep->wstats.rx_pkts_status_rcvd);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Rx DH Rcvd:", ep->wstats.rx_hd_rcvd);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Rx DH Processed:",
- ep->wstats.rx_hd_processed);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Rx DH Sent Back:", ep->wstats.rx_hd_reply);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Rx Pkt Leak:", ep->wstats.rx_pkt_leak);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR1, "Rx DP Fail:", ep->wstats.rx_dp_fail);
- cnt += nbytes;
- } while (0);
- client = IPA_CLIENT_WLAN1_CONS;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR,
- "Client IPA_CLIENT_WLAN1_CONS Stats:");
- cnt += nbytes;
- while (1) {
- ipa_ep_idx = ipa3_get_ep_mapping(client);
- if (ipa_ep_idx == -1) {
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR, "Not up");
- cnt += nbytes;
- goto nxt_clnt_cons;
- }
- ep = &ipa3_ctx->ep[ipa_ep_idx];
- if (ep->valid != 1) {
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR, "Not up");
- cnt += nbytes;
- goto nxt_clnt_cons;
- }
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Tx Pkts Received:", ep->wstats.tx_pkts_rcvd);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR, "Tx Pkts Sent:", ep->wstats.tx_pkts_sent);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- FRMT_STR1, "Tx Pkts Dropped:",
- ep->wstats.tx_pkts_dropped);
- cnt += nbytes;
- nxt_clnt_cons:
- switch (client) {
- case IPA_CLIENT_WLAN1_CONS:
- client = IPA_CLIENT_WLAN2_CONS;
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR,
- "Client IPA_CLIENT_WLAN2_CONS Stats:");
- cnt += nbytes;
- continue;
- case IPA_CLIENT_WLAN2_CONS:
- client = IPA_CLIENT_WLAN3_CONS;
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR,
- "Client IPA_CLIENT_WLAN3_CONS Stats:");
- cnt += nbytes;
- continue;
- case IPA_CLIENT_WLAN3_CONS:
- client = IPA_CLIENT_WLAN4_CONS;
- nbytes = scnprintf(dbg_buff + cnt,
- IPA_MAX_MSG_LEN - cnt, HEAD_FRMT_STR,
- "Client IPA_CLIENT_WLAN4_CONS Stats:");
- cnt += nbytes;
- continue;
- case IPA_CLIENT_WLAN4_CONS:
- default:
- break;
- }
- break;
- }
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "\n"HEAD_FRMT_STR, "All Wlan Consumer pipes stats:");
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt, FRMT_STR,
- "Tx Comm Buff Allocated:",
- ipa3_ctx->wc_memb.wlan_comm_total_cnt);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt, FRMT_STR,
- "Tx Comm Buff Avail:", ipa3_ctx->wc_memb.wlan_comm_free_cnt);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt, FRMT_STR1,
- "Total Tx Pkts Freed:", ipa3_ctx->wc_memb.total_tx_pkts_freed);
- cnt += nbytes;
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_ntn(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- #define TX_STATS(y) \
- ipa3_ctx->uc_ntn_ctx.ntn_uc_stats_mmio->tx_ch_stats[0].y
- #define RX_STATS(y) \
- ipa3_ctx->uc_ntn_ctx.ntn_uc_stats_mmio->rx_ch_stats[0].y
- struct Ipa3HwStatsNTNInfoData_t stats;
- int nbytes;
- int cnt = 0;
- if (!ipa3_get_ntn_stats(&stats)) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "TX num_pkts_processed=%u\n"
- "TX ringFull=%u\n"
- "TX ringEmpty=%u\n"
- "TX ringUsageHigh=%u\n"
- "TX ringUsageLow=%u\n"
- "TX RingUtilCount=%u\n"
- "TX bamFifoFull=%u\n"
- "TX bamFifoEmpty=%u\n"
- "TX bamFifoUsageHigh=%u\n"
- "TX bamFifoUsageLow=%u\n"
- "TX bamUtilCount=%u\n"
- "TX num_db=%u\n"
- "TX num_qmb_int_handled=%u\n"
- "TX ipa_pipe_number=%u\n",
- TX_STATS(num_pkts_processed),
- TX_STATS(ring_stats.ringFull),
- TX_STATS(ring_stats.ringEmpty),
- TX_STATS(ring_stats.ringUsageHigh),
- TX_STATS(ring_stats.ringUsageLow),
- TX_STATS(ring_stats.RingUtilCount),
- TX_STATS(gsi_stats.bamFifoFull),
- TX_STATS(gsi_stats.bamFifoEmpty),
- TX_STATS(gsi_stats.bamFifoUsageHigh),
- TX_STATS(gsi_stats.bamFifoUsageLow),
- TX_STATS(gsi_stats.bamUtilCount),
- TX_STATS(num_db),
- TX_STATS(num_qmb_int_handled),
- TX_STATS(ipa_pipe_number));
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "RX num_pkts_processed=%u\n"
- "RX ringFull=%u\n"
- "RX ringEmpty=%u\n"
- "RX ringUsageHigh=%u\n"
- "RX ringUsageLow=%u\n"
- "RX RingUtilCount=%u\n"
- "RX bamFifoFull=%u\n"
- "RX bamFifoEmpty=%u\n"
- "RX bamFifoUsageHigh=%u\n"
- "RX bamFifoUsageLow=%u\n"
- "RX bamUtilCount=%u\n"
- "RX num_db=%u\n"
- "RX num_qmb_int_handled=%u\n"
- "RX ipa_pipe_number=%u\n",
- RX_STATS(num_pkts_processed),
- RX_STATS(ring_stats.ringFull),
- RX_STATS(ring_stats.ringEmpty),
- RX_STATS(ring_stats.ringUsageHigh),
- RX_STATS(ring_stats.ringUsageLow),
- RX_STATS(ring_stats.RingUtilCount),
- RX_STATS(gsi_stats.bamFifoFull),
- RX_STATS(gsi_stats.bamFifoEmpty),
- RX_STATS(gsi_stats.bamFifoUsageHigh),
- RX_STATS(gsi_stats.bamFifoUsageLow),
- RX_STATS(gsi_stats.bamUtilCount),
- RX_STATS(num_db),
- RX_STATS(num_qmb_int_handled),
- RX_STATS(ipa_pipe_number));
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read NTN stats\n");
- cnt += nbytes;
- }
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_wdi(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- struct IpaHwStatsWDIInfoData_t stats;
- int nbytes;
- int cnt = 0;
- struct IpaHwStatsWDITxInfoData_t *tx_ch_ptr;
- if (!ipa3_get_wdi_stats(&stats)) {
- tx_ch_ptr = &stats.tx_ch_stats;
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "TX num_pkts_processed=%u\n"
- "TX copy_engine_doorbell_value=%u\n"
- "TX num_db_fired=%u\n"
- "TX ringFull=%u\n"
- "TX ringEmpty=%u\n"
- "TX ringUsageHigh=%u\n"
- "TX ringUsageLow=%u\n"
- "TX RingUtilCount=%u\n"
- "TX bamFifoFull=%u\n"
- "TX bamFifoEmpty=%u\n"
- "TX bamFifoUsageHigh=%u\n"
- "TX bamFifoUsageLow=%u\n"
- "TX bamUtilCount=%u\n"
- "TX num_db=%u\n"
- "TX num_unexpected_db=%u\n"
- "TX num_bam_int_handled=%u\n"
- "TX num_bam_int_in_non_running_state=%u\n"
- "TX num_qmb_int_handled=%u\n"
- "TX num_bam_int_handled_while_wait_for_bam=%u\n",
- tx_ch_ptr->num_pkts_processed,
- tx_ch_ptr->copy_engine_doorbell_value,
- tx_ch_ptr->num_db_fired,
- tx_ch_ptr->tx_comp_ring_stats.ringFull,
- tx_ch_ptr->tx_comp_ring_stats.ringEmpty,
- tx_ch_ptr->tx_comp_ring_stats.ringUsageHigh,
- tx_ch_ptr->tx_comp_ring_stats.ringUsageLow,
- tx_ch_ptr->tx_comp_ring_stats.RingUtilCount,
- tx_ch_ptr->bam_stats.bamFifoFull,
- tx_ch_ptr->bam_stats.bamFifoEmpty,
- tx_ch_ptr->bam_stats.bamFifoUsageHigh,
- tx_ch_ptr->bam_stats.bamFifoUsageLow,
- tx_ch_ptr->bam_stats.bamUtilCount,
- tx_ch_ptr->num_db,
- tx_ch_ptr->num_unexpected_db,
- tx_ch_ptr->num_bam_int_handled,
- tx_ch_ptr->num_bam_int_in_non_running_state,
- tx_ch_ptr->num_qmb_int_handled,
- tx_ch_ptr->num_bam_int_handled_while_wait_for_bam);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "RX max_outstanding_pkts=%u\n"
- "RX num_pkts_processed=%u\n"
- "RX rx_ring_rp_value=%u\n"
- "RX ringFull=%u\n"
- "RX ringEmpty=%u\n"
- "RX ringUsageHigh=%u\n"
- "RX ringUsageLow=%u\n"
- "RX RingUtilCount=%u\n"
- "RX bamFifoFull=%u\n"
- "RX bamFifoEmpty=%u\n"
- "RX bamFifoUsageHigh=%u\n"
- "RX bamFifoUsageLow=%u\n"
- "RX bamUtilCount=%u\n"
- "RX num_bam_int_handled=%u\n"
- "RX num_db=%u\n"
- "RX num_unexpected_db=%u\n"
- "RX num_pkts_in_dis_uninit_state=%u\n"
- "RX num_ic_inj_vdev_change=%u\n"
- "RX num_ic_inj_fw_desc_change=%u\n"
- "RX num_qmb_int_handled=%u\n"
- "RX reserved1=%u\n"
- "RX reserved2=%u\n",
- stats.rx_ch_stats.max_outstanding_pkts,
- stats.rx_ch_stats.num_pkts_processed,
- stats.rx_ch_stats.rx_ring_rp_value,
- stats.rx_ch_stats.rx_ind_ring_stats.ringFull,
- stats.rx_ch_stats.rx_ind_ring_stats.ringEmpty,
- stats.rx_ch_stats.rx_ind_ring_stats.ringUsageHigh,
- stats.rx_ch_stats.rx_ind_ring_stats.ringUsageLow,
- stats.rx_ch_stats.rx_ind_ring_stats.RingUtilCount,
- stats.rx_ch_stats.bam_stats.bamFifoFull,
- stats.rx_ch_stats.bam_stats.bamFifoEmpty,
- stats.rx_ch_stats.bam_stats.bamFifoUsageHigh,
- stats.rx_ch_stats.bam_stats.bamFifoUsageLow,
- stats.rx_ch_stats.bam_stats.bamUtilCount,
- stats.rx_ch_stats.num_bam_int_handled,
- stats.rx_ch_stats.num_db,
- stats.rx_ch_stats.num_unexpected_db,
- stats.rx_ch_stats.num_pkts_in_dis_uninit_state,
- stats.rx_ch_stats.num_ic_inj_vdev_change,
- stats.rx_ch_stats.num_ic_inj_fw_desc_change,
- stats.rx_ch_stats.num_qmb_int_handled,
- stats.rx_ch_stats.reserved1,
- stats.rx_ch_stats.reserved2);
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read WDI stats\n");
- cnt += nbytes;
- }
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_write_dbg_cnt(struct file *file, const char __user *buf,
- size_t count, loff_t *ppos)
- {
- u32 option = 0;
- struct ipahal_reg_debug_cnt_ctrl dbg_cnt_ctrl;
- int ret;
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) {
- IPAERR("IPA_DEBUG_CNT_CTRL is not supported in IPA 4.0\n");
- return -EPERM;
- }
- ret = kstrtou32_from_user(buf, count, 0, &option);
- if (ret)
- return ret;
- memset(&dbg_cnt_ctrl, 0, sizeof(dbg_cnt_ctrl));
- dbg_cnt_ctrl.type = DBG_CNT_TYPE_GENERAL;
- dbg_cnt_ctrl.product = true;
- dbg_cnt_ctrl.src_pipe = 0xff;
- dbg_cnt_ctrl.rule_idx_pipe_rule = false;
- dbg_cnt_ctrl.rule_idx = 0;
- if (option == 1)
- dbg_cnt_ctrl.en = true;
- else
- dbg_cnt_ctrl.en = false;
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- ipahal_write_reg_n_fields(IPA_DEBUG_CNT_CTRL_n, 0, &dbg_cnt_ctrl);
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- return count;
- }
- static ssize_t ipa3_read_dbg_cnt(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- u32 regval;
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) {
- IPAERR("IPA_DEBUG_CNT_REG is not supported in IPA 4.0\n");
- return -EPERM;
- }
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- regval =
- ipahal_read_reg_n(IPA_DEBUG_CNT_REG_n, 0);
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "IPA_DEBUG_CNT_REG_0=0x%x\n", regval);
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, nbytes);
- }
- static ssize_t ipa3_read_msg(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int nbytes;
- int cnt = 0;
- int i;
- for (i = 0; i < ARRAY_SIZE(ipa3_event_name); i++) {
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "msg[%u:%27s] W:%u R:%u\n", i,
- ipa3_event_name[i],
- ipa3_ctx->stats.msg_w[i],
- ipa3_ctx->stats.msg_r[i]);
- cnt += nbytes;
- }
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static void ipa3_read_table(
- char *table_addr,
- u32 table_size,
- u32 *total_num_entries,
- u32 *rule_id,
- enum ipahal_nat_type nat_type)
- {
- int result;
- char *entry;
- size_t entry_size;
- bool entry_zeroed;
- bool entry_valid;
- u32 i, num_entries = 0, id = *rule_id;
- char *buff;
- size_t buff_size = 2 * IPA_MAX_ENTRY_STRING_LEN;
- IPADBG("In\n");
- if (table_addr == NULL) {
- pr_err("NULL NAT table\n");
- goto bail;
- }
- result = ipahal_nat_entry_size(nat_type, &entry_size);
- if (result) {
- IPAERR("Failed to retrieve size of %s entry\n",
- ipahal_nat_type_str(nat_type));
- goto bail;
- }
- buff = kzalloc(buff_size, GFP_KERNEL);
- if (!buff) {
- IPAERR("Out of memory\n");
- goto bail;
- }
- for (i = 0, entry = table_addr;
- i < table_size;
- ++i, ++id, entry += entry_size) {
- result = ipahal_nat_is_entry_zeroed(nat_type, entry,
- &entry_zeroed);
- if (result) {
- IPAERR("Undefined if %s entry is zero\n",
- ipahal_nat_type_str(nat_type));
- goto free_buf;
- }
- if (entry_zeroed)
- continue;
- result = ipahal_nat_is_entry_valid(nat_type, entry,
- &entry_valid);
- if (result) {
- IPAERR("Undefined if %s entry is valid\n",
- ipahal_nat_type_str(nat_type));
- goto free_buf;
- }
- if (entry_valid) {
- ++num_entries;
- pr_err("\tEntry_Index=%d\n", id);
- } else
- pr_err("\tEntry_Index=%d - Invalid Entry\n", id);
- ipahal_nat_stringify_entry(nat_type, entry,
- buff, buff_size);
- pr_err("%s\n", buff);
- memset(buff, 0, buff_size);
- }
- if (num_entries)
- pr_err("\n");
- else
- pr_err("\tEmpty\n\n");
- free_buf:
- kfree(buff);
- *rule_id = id;
- *total_num_entries += num_entries;
- bail:
- IPADBG("Out\n");
- }
- static void ipa3_start_read_memory_device(
- struct ipa3_nat_ipv6ct_common_mem *dev,
- enum ipahal_nat_type nat_type,
- u32 *num_ddr_ent_ptr,
- u32 *num_sram_ent_ptr)
- {
- u32 rule_id = 0;
- if (dev->is_ipv6ct_mem) {
- IPADBG("In: v6\n");
- pr_err("%s_Table_Size=%d\n",
- dev->name, dev->table_entries + 1);
- pr_err("%s_Expansion_Table_Size=%d\n",
- dev->name, dev->expn_table_entries);
- pr_err("\n%s Base Table:\n", dev->name);
- if (dev->base_table_addr)
- ipa3_read_table(
- dev->base_table_addr,
- dev->table_entries + 1,
- num_ddr_ent_ptr,
- &rule_id,
- nat_type);
- pr_err("%s Expansion Table:\n", dev->name);
- if (dev->expansion_table_addr)
- ipa3_read_table(
- dev->expansion_table_addr,
- dev->expn_table_entries,
- num_ddr_ent_ptr,
- &rule_id,
- nat_type);
- }
- if (dev->is_nat_mem) {
- struct ipa3_nat_mem *nm_ptr = (struct ipa3_nat_mem *) dev;
- struct ipa3_nat_mem_loc_data *mld_ptr = NULL;
- u32 *num_ent_ptr;
- const char *type_ptr;
- IPADBG("In: v4\n");
- if (nm_ptr->active_table == IPA_NAT_MEM_IN_DDR &&
- nm_ptr->ddr_in_use) {
- mld_ptr = &nm_ptr->mem_loc[IPA_NAT_MEM_IN_DDR];
- num_ent_ptr = num_ddr_ent_ptr;
- type_ptr = "DDR based table";
- }
- if (nm_ptr->active_table == IPA_NAT_MEM_IN_SRAM &&
- nm_ptr->sram_in_use) {
- mld_ptr = &nm_ptr->mem_loc[IPA_NAT_MEM_IN_SRAM];
- num_ent_ptr = num_sram_ent_ptr;
- type_ptr = "SRAM based table";
- }
- if (mld_ptr) {
- pr_err("(%s) %s_Table_Size=%d\n",
- type_ptr,
- dev->name,
- mld_ptr->table_entries + 1);
- pr_err("(%s) %s_Expansion_Table_Size=%d\n",
- type_ptr,
- dev->name,
- mld_ptr->expn_table_entries);
- pr_err("\n(%s) %s_Base Table:\n",
- type_ptr,
- dev->name);
- if (mld_ptr->base_table_addr)
- ipa3_read_table(
- mld_ptr->base_table_addr,
- mld_ptr->table_entries + 1,
- num_ent_ptr,
- &rule_id,
- nat_type);
- pr_err("(%s) %s_Expansion Table:\n",
- type_ptr,
- dev->name);
- if (mld_ptr->expansion_table_addr)
- ipa3_read_table(
- mld_ptr->expansion_table_addr,
- mld_ptr->expn_table_entries,
- num_ent_ptr,
- &rule_id,
- nat_type);
- }
- }
- IPADBG("Out\n");
- }
- static void ipa3_finish_read_memory_device(
- struct ipa3_nat_ipv6ct_common_mem *dev,
- u32 num_ddr_entries,
- u32 num_sram_entries)
- {
- IPADBG("In\n");
- if (dev->is_ipv6ct_mem) {
- pr_err("Overall number %s entries: %u\n\n",
- dev->name,
- num_ddr_entries);
- } else {
- struct ipa3_nat_mem *nm_ptr = (struct ipa3_nat_mem *) dev;
- if (num_ddr_entries)
- pr_err("%s: Overall number of DDR entries: %u\n\n",
- dev->name,
- num_ddr_entries);
- if (num_sram_entries)
- pr_err("%s: Overall number of SRAM entries: %u\n\n",
- dev->name,
- num_sram_entries);
- pr_err("%s: Driver focus changes to DDR(%u) to SRAM(%u)\n",
- dev->name,
- nm_ptr->switch2ddr_cnt,
- nm_ptr->switch2sram_cnt);
- }
- IPADBG("Out\n");
- }
- static void ipa3_read_pdn_table(void)
- {
- int i, result;
- char *pdn_entry;
- size_t pdn_entry_size;
- bool entry_zeroed;
- bool entry_valid;
- char *buff;
- size_t buff_size = 128;
- IPADBG("In\n");
- if (ipa3_ctx->nat_mem.pdn_mem.base) {
- result = ipahal_nat_entry_size(
- IPAHAL_NAT_IPV4_PDN, &pdn_entry_size);
- if (result) {
- IPAERR("Failed to retrieve size of PDN entry");
- goto bail;
- }
- buff = kzalloc(buff_size, GFP_KERNEL);
- if (!buff) {
- IPAERR("Out of memory\n");
- goto bail;
- }
- for (i = 0, pdn_entry = ipa3_ctx->nat_mem.pdn_mem.base;
- i < IPA_MAX_PDN_NUM;
- ++i, pdn_entry += pdn_entry_size) {
- result = ipahal_nat_is_entry_zeroed(
- IPAHAL_NAT_IPV4_PDN,
- pdn_entry, &entry_zeroed);
- if (result) {
- IPAERR("ipahal_nat_is_entry_zeroed() fail\n");
- goto free;
- }
- if (entry_zeroed)
- continue;
- result = ipahal_nat_is_entry_valid(
- IPAHAL_NAT_IPV4_PDN,
- pdn_entry, &entry_valid);
- if (result) {
- IPAERR(
- "Failed to determine whether the PDN entry is valid\n");
- goto free;
- }
- ipahal_nat_stringify_entry(
- IPAHAL_NAT_IPV4_PDN,
- pdn_entry, buff, buff_size);
- if (entry_valid)
- pr_err("PDN %d: %s\n", i, buff);
- else
- pr_err("PDN %d - Invalid: %s\n", i, buff);
- memset(buff, 0, buff_size);
- }
- pr_err("\n");
- free:
- kfree(buff);
- }
- bail:
- IPADBG("Out\n");
- }
- static ssize_t ipa3_read_nat4(
- struct file *file,
- char __user *ubuf,
- size_t count,
- loff_t *ppos)
- {
- struct ipa3_nat_ipv6ct_common_mem *dev = &ipa3_ctx->nat_mem.dev;
- struct ipa3_nat_mem *nm_ptr = (struct ipa3_nat_mem *) dev;
- struct ipa3_nat_mem_loc_data *mld_ptr = NULL;
- u32 rule_id = 0;
- u32 *num_ents_ptr;
- u32 num_ddr_ents = 0;
- u32 num_sram_ents = 0;
- u32 *num_index_ents_ptr;
- u32 num_ddr_index_ents = 0;
- u32 num_sram_index_ents = 0;
- const char *type_ptr;
- bool any_table_active = (nm_ptr->ddr_in_use || nm_ptr->sram_in_use);
- pr_err("IPA3 NAT stats\n");
- if (!dev->is_dev_init) {
- pr_err("NAT hasn't been initialized or not supported\n");
- goto ret;
- }
- mutex_lock(&dev->lock);
- if (!dev->is_hw_init || !any_table_active) {
- pr_err("NAT H/W and/or S/W not initialized\n");
- goto bail;
- }
- if (ipa3_ctx->ipa_hw_type >= IPA_HW_v4_0) {
- ipa3_read_pdn_table();
- } else {
- pr_err("NAT Table IP Address=%pI4h\n\n",
- &ipa3_ctx->nat_mem.public_ip_addr);
- }
- ipa3_start_read_memory_device(
- dev,
- IPAHAL_NAT_IPV4,
- &num_ddr_ents,
- &num_sram_ents);
- if (nm_ptr->active_table == IPA_NAT_MEM_IN_DDR &&
- nm_ptr->ddr_in_use) {
- mld_ptr = &nm_ptr->mem_loc[IPA_NAT_MEM_IN_DDR];
- num_ents_ptr = &num_ddr_ents;
- num_index_ents_ptr = &num_ddr_index_ents;
- type_ptr = "DDR based table";
- }
- if (nm_ptr->active_table == IPA_NAT_MEM_IN_SRAM &&
- nm_ptr->sram_in_use) {
- mld_ptr = &nm_ptr->mem_loc[IPA_NAT_MEM_IN_SRAM];
- num_ents_ptr = &num_sram_ents;
- num_index_ents_ptr = &num_sram_index_ents;
- type_ptr = "SRAM based table";
- }
- if (mld_ptr) {
- /* Print Index tables */
- pr_err("(%s) ipaNatTable Index Table:\n", type_ptr);
- ipa3_read_table(
- mld_ptr->index_table_addr,
- mld_ptr->table_entries + 1,
- num_index_ents_ptr,
- &rule_id,
- IPAHAL_NAT_IPV4_INDEX);
- pr_err("(%s) ipaNatTable Expansion Index Table:\n", type_ptr);
- ipa3_read_table(
- mld_ptr->index_table_expansion_addr,
- mld_ptr->expn_table_entries,
- num_index_ents_ptr,
- &rule_id,
- IPAHAL_NAT_IPV4_INDEX);
- if (*num_ents_ptr != *num_index_ents_ptr)
- IPAERR(
- "(%s) Base Table vs Index Table entry count differs (%u vs %u)\n",
- type_ptr, *num_ents_ptr, *num_index_ents_ptr);
- }
- ipa3_finish_read_memory_device(
- dev,
- num_ddr_ents,
- num_sram_ents);
- bail:
- mutex_unlock(&dev->lock);
- ret:
- IPADBG("Out\n");
- return 0;
- }
- static ssize_t ipa3_read_ipv6ct(
- struct file *file,
- char __user *ubuf,
- size_t count,
- loff_t *ppos)
- {
- struct ipa3_nat_ipv6ct_common_mem *dev = &ipa3_ctx->ipv6ct_mem.dev;
- u32 num_ddr_ents, num_sram_ents;
- num_ddr_ents = num_sram_ents = 0;
- IPADBG("In\n");
- pr_err("\n");
- if (!dev->is_dev_init) {
- pr_err("IPv6 Conntrack not initialized or not supported\n");
- goto bail;
- }
- if (!dev->is_hw_init) {
- pr_err("IPv6 connection tracking H/W hasn't been initialized\n");
- goto bail;
- }
- mutex_lock(&dev->lock);
- ipa3_start_read_memory_device(
- dev,
- IPAHAL_NAT_IPV6CT,
- &num_ddr_ents,
- &num_sram_ents);
- ipa3_finish_read_memory_device(
- dev,
- num_ddr_ents,
- num_sram_ents);
- mutex_unlock(&dev->lock);
- bail:
- IPADBG("Out\n");
- return 0;
- }
- static ssize_t ipa3_pm_read_stats(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int result, cnt = 0;
- result = ipa_pm_stat(dbg_buff, IPA_MAX_MSG_LEN);
- if (result < 0) {
- cnt += scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "Error in printing PM stat %d\n", result);
- goto ret;
- }
- cnt += result;
- ret:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_pm_ex_read_stats(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- int result, cnt = 0;
- result = ipa_pm_exceptions_stat(dbg_buff, IPA_MAX_MSG_LEN);
- if (result < 0) {
- cnt += scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "Error in printing PM stat %d\n", result);
- goto ret;
- }
- cnt += result;
- ret:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_ipahal_regs(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- IPA_ACTIVE_CLIENTS_INC_SIMPLE();
- ipahal_print_all_regs(true);
- IPA_ACTIVE_CLIENTS_DEC_SIMPLE();
- return 0;
- }
- static ssize_t ipa3_read_wdi_gsi_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- struct ipa_uc_dbg_ring_stats stats;
- int nbytes;
- int cnt = 0;
- if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "This feature only support on IPA4.5+\n");
- cnt += nbytes;
- goto done;
- }
- if (!ipa3_get_wdi_gsi_stats(&stats)) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "TX ringFull=%u\n"
- "TX ringEmpty=%u\n"
- "TX ringUsageHigh=%u\n"
- "TX ringUsageLow=%u\n"
- "TX RingUtilCount=%u\n",
- stats.ring[1].ringFull,
- stats.ring[1].ringEmpty,
- stats.ring[1].ringUsageHigh,
- stats.ring[1].ringUsageLow,
- stats.ring[1].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "RX ringFull=%u\n"
- "RX ringEmpty=%u\n"
- "RX ringUsageHigh=%u\n"
- "RX ringUsageLow=%u\n"
- "RX RingUtilCount=%u\n",
- stats.ring[0].ringFull,
- stats.ring[0].ringEmpty,
- stats.ring[0].ringUsageHigh,
- stats.ring[0].ringUsageLow,
- stats.ring[0].RingUtilCount);
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read WDI GSI stats\n");
- cnt += nbytes;
- }
- done:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_wdi3_gsi_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- struct ipa_uc_dbg_ring_stats stats;
- int nbytes;
- int cnt = 0;
- if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "This feature only support on IPA4.5+\n");
- cnt += nbytes;
- goto done;
- }
- if (!ipa3_get_wdi3_gsi_stats(&stats)) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "TX ringFull=%u\n"
- "TX ringEmpty=%u\n"
- "TX ringUsageHigh=%u\n"
- "TX ringUsageLow=%u\n"
- "TX RingUtilCount=%u\n",
- stats.ring[1].ringFull,
- stats.ring[1].ringEmpty,
- stats.ring[1].ringUsageHigh,
- stats.ring[1].ringUsageLow,
- stats.ring[1].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "RX ringFull=%u\n"
- "RX ringEmpty=%u\n"
- "RX ringUsageHigh=%u\n"
- "RX ringUsageLow=%u\n"
- "RX RingUtilCount=%u\n",
- stats.ring[0].ringFull,
- stats.ring[0].ringEmpty,
- stats.ring[0].ringUsageHigh,
- stats.ring[0].ringUsageLow,
- stats.ring[0].RingUtilCount);
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read WDI GSI stats\n");
- cnt += nbytes;
- }
- done:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_11ad_gsi_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- int nbytes;
- int cnt = 0;
- if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "This feature only support on IPA4.5+\n");
- cnt += nbytes;
- goto done;
- }
- return 0;
- done:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_aqc_gsi_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- struct ipa_uc_dbg_ring_stats stats;
- int nbytes;
- int cnt = 0;
- if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "This feature only support on IPA4.5+\n");
- cnt += nbytes;
- goto done;
- }
- if (!ipa3_get_aqc_gsi_stats(&stats)) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "TX ringFull=%u\n"
- "TX ringEmpty=%u\n"
- "TX ringUsageHigh=%u\n"
- "TX ringUsageLow=%u\n"
- "TX RingUtilCount=%u\n",
- stats.ring[1].ringFull,
- stats.ring[1].ringEmpty,
- stats.ring[1].ringUsageHigh,
- stats.ring[1].ringUsageLow,
- stats.ring[1].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "RX ringFull=%u\n"
- "RX ringEmpty=%u\n"
- "RX ringUsageHigh=%u\n"
- "RX ringUsageLow=%u\n"
- "RX RingUtilCount=%u\n",
- stats.ring[0].ringFull,
- stats.ring[0].ringEmpty,
- stats.ring[0].ringUsageHigh,
- stats.ring[0].ringUsageLow,
- stats.ring[0].RingUtilCount);
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read AQC GSI stats\n");
- cnt += nbytes;
- }
- done:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_mhip_gsi_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- struct ipa_uc_dbg_ring_stats stats;
- int nbytes;
- int cnt = 0;
- if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "This feature only support on IPA4.5+\n");
- cnt += nbytes;
- goto done;
- }
- if (!ipa3_get_mhip_gsi_stats(&stats)) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "IPA_CLIENT_MHI_PRIME_TETH_CONS ringFull=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_CONS ringEmpty=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_CONS ringUsageHigh=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_CONS ringUsageLow=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_CONS RingUtilCount=%u\n",
- stats.ring[1].ringFull,
- stats.ring[1].ringEmpty,
- stats.ring[1].ringUsageHigh,
- stats.ring[1].ringUsageLow,
- stats.ring[1].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "IPA_CLIENT_MHI_PRIME_TETH_PROD ringFull=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_PROD ringEmpty=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_PROD ringUsageHigh=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_PROD ringUsageLow=%u\n"
- "IPA_CLIENT_MHI_PRIME_TETH_PROD RingUtilCount=%u\n",
- stats.ring[0].ringFull,
- stats.ring[0].ringEmpty,
- stats.ring[0].ringUsageHigh,
- stats.ring[0].ringUsageLow,
- stats.ring[0].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "IPA_CLIENT_MHI_PRIME_RMNET_CONS ringFull=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_CONS ringEmpty=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_CONS ringUsageHigh=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_CONS ringUsageLow=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_CONS RingUtilCount=%u\n",
- stats.ring[3].ringFull,
- stats.ring[3].ringEmpty,
- stats.ring[3].ringUsageHigh,
- stats.ring[3].ringUsageLow,
- stats.ring[3].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "IPA_CLIENT_MHI_PRIME_RMNET_PROD ringFull=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_PROD ringEmpty=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_PROD ringUsageHigh=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_PROD ringUsageLow=%u\n"
- "IPA_CLIENT_MHI_PRIME_RMNET_PROD RingUtilCount=%u\n",
- stats.ring[2].ringFull,
- stats.ring[2].ringEmpty,
- stats.ring[2].ringUsageHigh,
- stats.ring[2].ringUsageLow,
- stats.ring[2].RingUtilCount);
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read WDI GSI stats\n");
- cnt += nbytes;
- }
- done:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_usb_gsi_stats(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- struct ipa_uc_dbg_ring_stats stats;
- int nbytes;
- int cnt = 0;
- if (ipa3_ctx->ipa_hw_type < IPA_HW_v4_5) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "This feature only support on IPA4.5+\n");
- cnt += nbytes;
- goto done;
- }
- if (!ipa3_get_usb_gsi_stats(&stats)) {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "TX ringFull=%u\n"
- "TX ringEmpty=%u\n"
- "TX ringUsageHigh=%u\n"
- "TX ringUsageLow=%u\n"
- "TX RingUtilCount=%u\n",
- stats.ring[1].ringFull,
- stats.ring[1].ringEmpty,
- stats.ring[1].ringUsageHigh,
- stats.ring[1].ringUsageLow,
- stats.ring[1].RingUtilCount);
- cnt += nbytes;
- nbytes = scnprintf(dbg_buff + cnt, IPA_MAX_MSG_LEN - cnt,
- "RX ringFull=%u\n"
- "RX ringEmpty=%u\n"
- "RX ringUsageHigh=%u\n"
- "RX ringUsageLow=%u\n"
- "RX RingUtilCount=%u\n",
- stats.ring[0].ringFull,
- stats.ring[0].ringEmpty,
- stats.ring[0].ringUsageHigh,
- stats.ring[0].ringUsageLow,
- stats.ring[0].RingUtilCount);
- cnt += nbytes;
- } else {
- nbytes = scnprintf(dbg_buff, IPA_MAX_MSG_LEN,
- "Fail to read WDI GSI stats\n");
- cnt += nbytes;
- }
- done:
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static ssize_t ipa3_read_app_clk_vote(
- struct file *file,
- char __user *ubuf,
- size_t count,
- loff_t *ppos)
- {
- int cnt =
- scnprintf(
- dbg_buff,
- IPA_MAX_MSG_LEN,
- "%u\n",
- ipa3_ctx->app_clock_vote.cnt);
- return simple_read_from_buffer(ubuf, count, ppos, dbg_buff, cnt);
- }
- static void ipa_dump_status(struct ipahal_pkt_status *status)
- {
- IPA_DUMP_STATUS_FIELD(status_opcode);
- IPA_DUMP_STATUS_FIELD(exception);
- IPA_DUMP_STATUS_FIELD(status_mask);
- IPA_DUMP_STATUS_FIELD(pkt_len);
- IPA_DUMP_STATUS_FIELD(endp_src_idx);
- IPA_DUMP_STATUS_FIELD(endp_dest_idx);
- IPA_DUMP_STATUS_FIELD(metadata);
- IPA_DUMP_STATUS_FIELD(flt_local);
- IPA_DUMP_STATUS_FIELD(flt_hash);
- IPA_DUMP_STATUS_FIELD(flt_global);
- IPA_DUMP_STATUS_FIELD(flt_ret_hdr);
- IPA_DUMP_STATUS_FIELD(flt_miss);
- IPA_DUMP_STATUS_FIELD(flt_rule_id);
- IPA_DUMP_STATUS_FIELD(rt_local);
- IPA_DUMP_STATUS_FIELD(rt_hash);
- IPA_DUMP_STATUS_FIELD(ucp);
- IPA_DUMP_STATUS_FIELD(rt_tbl_idx);
- IPA_DUMP_STATUS_FIELD(rt_miss);
- IPA_DUMP_STATUS_FIELD(rt_rule_id);
- IPA_DUMP_STATUS_FIELD(nat_hit);
- IPA_DUMP_STATUS_FIELD(nat_entry_idx);
- IPA_DUMP_STATUS_FIELD(nat_type);
- pr_err("tag = 0x%llx\n", (u64)status->tag_info & 0xFFFFFFFFFFFF);
- IPA_DUMP_STATUS_FIELD(seq_num);
- IPA_DUMP_STATUS_FIELD(time_of_day_ctr);
- IPA_DUMP_STATUS_FIELD(hdr_local);
- IPA_DUMP_STATUS_FIELD(hdr_offset);
- IPA_DUMP_STATUS_FIELD(frag_hit);
- IPA_DUMP_STATUS_FIELD(frag_rule);
- }
- static ssize_t ipa_status_stats_read(struct file *file, char __user *ubuf,
- size_t count, loff_t *ppos)
- {
- struct ipa3_status_stats *stats;
- int i, j;
- stats = kzalloc(sizeof(*stats), GFP_KERNEL);
- if (!stats)
- return -EFAULT;
- for (i = 0; i < ipa3_ctx->ipa_num_pipes; i++) {
- if (!ipa3_ctx->ep[i].sys || !ipa3_ctx->ep[i].sys->status_stat)
- continue;
- memcpy(stats, ipa3_ctx->ep[i].sys->status_stat, sizeof(*stats));
- pr_err("Statuses for pipe %d\n", i);
- for (j = 0; j < IPA_MAX_STATUS_STAT_NUM; j++) {
- pr_err("curr=%d\n", stats->curr);
- ipa_dump_status(&stats->status[stats->curr]);
- pr_err("\n\n\n");
- stats->curr = (stats->curr + 1) %
- IPA_MAX_STATUS_STAT_NUM;
- }
- }
- kfree(stats);
- return 0;
- }
- static ssize_t ipa3_print_active_clients_log(struct file *file,
- char __user *ubuf, size_t count, loff_t *ppos)
- {
- int cnt;
- int table_size;
- if (active_clients_buf == NULL) {
- IPAERR("Active Clients buffer is not allocated");
- return 0;
- }
- memset(active_clients_buf, 0, IPA_DBG_ACTIVE_CLIENT_BUF_SIZE);
- mutex_lock(&ipa3_ctx->ipa3_active_clients.mutex);
- cnt = ipa3_active_clients_log_print_buffer(active_clients_buf,
- IPA_DBG_ACTIVE_CLIENT_BUF_SIZE - IPA_MAX_MSG_LEN);
- table_size = ipa3_active_clients_log_print_table(active_clients_buf
- + cnt, IPA_MAX_MSG_LEN);
- mutex_unlock(&ipa3_ctx->ipa3_active_clients.mutex);
- return simple_read_from_buffer(ubuf, count, ppos,
- active_clients_buf, cnt + table_size);
- }
- static ssize_t ipa3_clear_active_clients_log(struct file *file,
- const char __user *ubuf, size_t count, loff_t *ppos)
- {
- ipa3_active_clients_log_clear();
- return count;
- }
- static ssize_t ipa3_enable_ipc_low(struct file *file,
- const char __user *ubuf, size_t count, loff_t *ppos)
- {
- s8 option = 0;
- int ret;
- ret = kstrtos8_from_user(ubuf, count, 0, &option);
- if (ret)
- return ret;
- mutex_lock(&ipa3_ctx->lock);
- if (option) {
- if (!ipa_ipc_low_buff) {
- ipa_ipc_low_buff =
- ipc_log_context_create(IPA_IPC_LOG_PAGES,
- "ipa_low", 0);
- }
- if (ipa_ipc_low_buff == NULL)
- IPADBG("failed to get logbuf_low\n");
- ipa3_ctx->logbuf_low = ipa_ipc_low_buff;
- } else {
- ipa3_ctx->logbuf_low = NULL;
- }
- mutex_unlock(&ipa3_ctx->lock);
- return count;
- }
- static const struct ipa3_debugfs_file debugfs_files[] = {
- {
- "gen_reg", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_gen_reg
- }
- }, {
- "active_clients", IPA_READ_WRITE_MODE, NULL, {
- .read = ipa3_print_active_clients_log,
- .write = ipa3_clear_active_clients_log
- }
- }, {
- "ep_reg", IPA_READ_WRITE_MODE, NULL, {
- .read = ipa3_read_ep_reg,
- .write = ipa3_write_ep_reg,
- }
- }, {
- "keep_awake", IPA_READ_WRITE_MODE, NULL, {
- .read = ipa3_read_keep_awake,
- .write = ipa3_write_keep_awake,
- }
- }, {
- "holb", IPA_WRITE_ONLY_MODE, NULL, {
- .write = ipa3_write_ep_holb,
- }
- }, {
- "hdr", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_hdr,
- }
- }, {
- "proc_ctx", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_proc_ctx,
- }
- }, {
- "ip4_rt", IPA_READ_ONLY_MODE, (void *)IPA_IP_v4, {
- .read = ipa3_read_rt,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip4_rt_hw", IPA_READ_ONLY_MODE, (void *)IPA_IP_v4, {
- .read = ipa3_read_rt_hw,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip6_rt", IPA_READ_ONLY_MODE, (void *)IPA_IP_v6, {
- .read = ipa3_read_rt,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip6_rt_hw", IPA_READ_ONLY_MODE, (void *)IPA_IP_v6, {
- .read = ipa3_read_rt_hw,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip4_flt", IPA_READ_ONLY_MODE, (void *)IPA_IP_v4, {
- .read = ipa3_read_flt,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip4_flt_hw", IPA_READ_ONLY_MODE, (void *)IPA_IP_v4, {
- .read = ipa3_read_flt_hw,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip6_flt", IPA_READ_ONLY_MODE, (void *)IPA_IP_v6, {
- .read = ipa3_read_flt,
- .open = ipa3_open_dbg,
- }
- }, {
- "ip6_flt_hw", IPA_READ_ONLY_MODE, (void *)IPA_IP_v6, {
- .read = ipa3_read_flt_hw,
- .open = ipa3_open_dbg,
- }
- }, {
- "stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_stats,
- }
- }, {
- "wstats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_wstats,
- }
- }, {
- "odlstats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_odlstats,
- }
- }, {
- "page_recycle_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_page_recycle_stats,
- }
- }, {
- "wdi", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_wdi,
- }
- }, {
- "ntn", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_ntn,
- }
- }, {
- "dbg_cnt", IPA_READ_WRITE_MODE, NULL, {
- .read = ipa3_read_dbg_cnt,
- .write = ipa3_write_dbg_cnt,
- }
- }, {
- "msg", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_msg,
- }
- }, {
- "ip4_nat", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_nat4,
- }
- }, {
- "ipv6ct", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_ipv6ct,
- }
- }, {
- "pm_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_pm_read_stats,
- }
- }, {
- "pm_ex_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_pm_ex_read_stats,
- }
- }, {
- "status_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa_status_stats_read,
- }
- }, {
- "enable_low_prio_print", IPA_WRITE_ONLY_MODE, NULL, {
- .write = ipa3_enable_ipc_low,
- }
- }, {
- "ipa_dump_regs", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_ipahal_regs,
- }
- }, {
- "wdi_gsi_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_wdi_gsi_stats,
- }
- }, {
- "wdi3_gsi_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_wdi3_gsi_stats,
- }
- }, {
- "11ad_gsi_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_11ad_gsi_stats,
- }
- }, {
- "aqc_gsi_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_aqc_gsi_stats,
- }
- }, {
- "mhip_gsi_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_mhip_gsi_stats,
- }
- }, {
- "usb_gsi_stats", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_usb_gsi_stats,
- }
- }, {
- "app_clk_vote_cnt", IPA_READ_ONLY_MODE, NULL, {
- .read = ipa3_read_app_clk_vote,
- }
- },
- };
- void ipa3_debugfs_init(void)
- {
- const size_t debugfs_files_num =
- sizeof(debugfs_files) / sizeof(struct ipa3_debugfs_file);
- size_t i;
- struct dentry *file;
- dent = debugfs_create_dir("ipa", 0);
- if (IS_ERR(dent)) {
- IPAERR("fail to create folder in debug_fs.\n");
- return;
- }
- file = debugfs_create_u32("hw_type", IPA_READ_ONLY_MODE,
- dent, &ipa3_ctx->ipa_hw_type);
- if (!file) {
- IPAERR("could not create hw_type file\n");
- goto fail;
- }
- for (i = 0; i < debugfs_files_num; ++i) {
- const struct ipa3_debugfs_file *curr = &debugfs_files[i];
- file = debugfs_create_file(curr->name, curr->mode, dent,
- curr->data, &curr->fops);
- if (!file || IS_ERR(file)) {
- IPAERR("fail to create file for debug_fs %s\n",
- curr->name);
- goto fail;
- }
- }
- active_clients_buf = NULL;
- active_clients_buf = kzalloc(IPA_DBG_ACTIVE_CLIENT_BUF_SIZE,
- GFP_KERNEL);
- if (active_clients_buf == NULL)
- goto fail;
- file = debugfs_create_u32("enable_clock_scaling", IPA_READ_WRITE_MODE,
- dent, &ipa3_ctx->enable_clock_scaling);
- if (!file) {
- IPAERR("could not create enable_clock_scaling file\n");
- goto fail;
- }
- file = debugfs_create_u32("enable_napi_chain", IPA_READ_WRITE_MODE,
- dent, &ipa3_ctx->enable_napi_chain);
- if (!file) {
- IPAERR("could not create enable_napi_chain file\n");
- goto fail;
- }
- file = debugfs_create_u32("clock_scaling_bw_threshold_nominal_mbps",
- IPA_READ_WRITE_MODE, dent,
- &ipa3_ctx->ctrl->clock_scaling_bw_threshold_nominal);
- if (!file) {
- IPAERR("could not create bw_threshold_nominal_mbps\n");
- goto fail;
- }
- file = debugfs_create_u32("clock_scaling_bw_threshold_turbo_mbps",
- IPA_READ_WRITE_MODE, dent,
- &ipa3_ctx->ctrl->clock_scaling_bw_threshold_turbo);
- if (!file) {
- IPAERR("could not create bw_threshold_turbo_mbps\n");
- goto fail;
- }
- file = debugfs_create_u32("clk_rate", IPA_READ_ONLY_MODE,
- dent, &ipa3_ctx->curr_ipa_clk_rate);
- if (!file) {
- IPAERR("could not create clk_rate file\n");
- goto fail;
- }
- ipa_debugfs_init_stats(dent);
- ipa3_wigig_init_debugfs_i(dent);
- return;
- fail:
- debugfs_remove_recursive(dent);
- }
- void ipa3_debugfs_remove(void)
- {
- if (IS_ERR(dent)) {
- IPAERR("Debugfs:folder was not created.\n");
- return;
- }
- if (active_clients_buf != NULL) {
- kfree(active_clients_buf);
- active_clients_buf = NULL;
- }
- debugfs_remove_recursive(dent);
- }
- struct dentry *ipa_debugfs_get_root(void)
- {
- return dent;
- }
- EXPORT_SYMBOL(ipa_debugfs_get_root);
- #else /* !CONFIG_DEBUG_FS */
- void ipa3_debugfs_init(void) {}
- void ipa3_debugfs_remove(void) {}
- #endif
|