mlx5_vnet.c 86 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297
  1. // SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
  2. /* Copyright (c) 2020 Mellanox Technologies Ltd. */
  3. #include <linux/module.h>
  4. #include <linux/vdpa.h>
  5. #include <linux/vringh.h>
  6. #include <uapi/linux/virtio_net.h>
  7. #include <uapi/linux/virtio_ids.h>
  8. #include <uapi/linux/vdpa.h>
  9. #include <linux/virtio_config.h>
  10. #include <linux/auxiliary_bus.h>
  11. #include <linux/mlx5/cq.h>
  12. #include <linux/mlx5/qp.h>
  13. #include <linux/mlx5/device.h>
  14. #include <linux/mlx5/driver.h>
  15. #include <linux/mlx5/vport.h>
  16. #include <linux/mlx5/fs.h>
  17. #include <linux/mlx5/mlx5_ifc_vdpa.h>
  18. #include <linux/mlx5/mpfs.h>
  19. #include "mlx5_vdpa.h"
  20. MODULE_AUTHOR("Eli Cohen <[email protected]>");
  21. MODULE_DESCRIPTION("Mellanox VDPA driver");
  22. MODULE_LICENSE("Dual BSD/GPL");
  23. #define to_mlx5_vdpa_ndev(__mvdev) \
  24. container_of(__mvdev, struct mlx5_vdpa_net, mvdev)
  25. #define to_mvdev(__vdev) container_of((__vdev), struct mlx5_vdpa_dev, vdev)
  26. #define VALID_FEATURES_MASK \
  27. (BIT_ULL(VIRTIO_NET_F_CSUM) | BIT_ULL(VIRTIO_NET_F_GUEST_CSUM) | \
  28. BIT_ULL(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS) | BIT_ULL(VIRTIO_NET_F_MTU) | BIT_ULL(VIRTIO_NET_F_MAC) | \
  29. BIT_ULL(VIRTIO_NET_F_GUEST_TSO4) | BIT_ULL(VIRTIO_NET_F_GUEST_TSO6) | \
  30. BIT_ULL(VIRTIO_NET_F_GUEST_ECN) | BIT_ULL(VIRTIO_NET_F_GUEST_UFO) | BIT_ULL(VIRTIO_NET_F_HOST_TSO4) | \
  31. BIT_ULL(VIRTIO_NET_F_HOST_TSO6) | BIT_ULL(VIRTIO_NET_F_HOST_ECN) | BIT_ULL(VIRTIO_NET_F_HOST_UFO) | \
  32. BIT_ULL(VIRTIO_NET_F_MRG_RXBUF) | BIT_ULL(VIRTIO_NET_F_STATUS) | BIT_ULL(VIRTIO_NET_F_CTRL_VQ) | \
  33. BIT_ULL(VIRTIO_NET_F_CTRL_RX) | BIT_ULL(VIRTIO_NET_F_CTRL_VLAN) | \
  34. BIT_ULL(VIRTIO_NET_F_CTRL_RX_EXTRA) | BIT_ULL(VIRTIO_NET_F_GUEST_ANNOUNCE) | \
  35. BIT_ULL(VIRTIO_NET_F_MQ) | BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR) | BIT_ULL(VIRTIO_NET_F_HASH_REPORT) | \
  36. BIT_ULL(VIRTIO_NET_F_RSS) | BIT_ULL(VIRTIO_NET_F_RSC_EXT) | BIT_ULL(VIRTIO_NET_F_STANDBY) | \
  37. BIT_ULL(VIRTIO_NET_F_SPEED_DUPLEX) | BIT_ULL(VIRTIO_F_NOTIFY_ON_EMPTY) | \
  38. BIT_ULL(VIRTIO_F_ANY_LAYOUT) | BIT_ULL(VIRTIO_F_VERSION_1) | BIT_ULL(VIRTIO_F_ACCESS_PLATFORM) | \
  39. BIT_ULL(VIRTIO_F_RING_PACKED) | BIT_ULL(VIRTIO_F_ORDER_PLATFORM) | BIT_ULL(VIRTIO_F_SR_IOV))
  40. #define VALID_STATUS_MASK \
  41. (VIRTIO_CONFIG_S_ACKNOWLEDGE | VIRTIO_CONFIG_S_DRIVER | VIRTIO_CONFIG_S_DRIVER_OK | \
  42. VIRTIO_CONFIG_S_FEATURES_OK | VIRTIO_CONFIG_S_NEEDS_RESET | VIRTIO_CONFIG_S_FAILED)
  43. #define MLX5_FEATURE(_mvdev, _feature) (!!((_mvdev)->actual_features & BIT_ULL(_feature)))
  44. #define MLX5V_UNTAGGED 0x1000
  45. struct mlx5_vdpa_net_resources {
  46. u32 tisn;
  47. u32 tdn;
  48. u32 tirn;
  49. u32 rqtn;
  50. bool valid;
  51. };
  52. struct mlx5_vdpa_cq_buf {
  53. struct mlx5_frag_buf_ctrl fbc;
  54. struct mlx5_frag_buf frag_buf;
  55. int cqe_size;
  56. int nent;
  57. };
  58. struct mlx5_vdpa_cq {
  59. struct mlx5_core_cq mcq;
  60. struct mlx5_vdpa_cq_buf buf;
  61. struct mlx5_db db;
  62. int cqe;
  63. };
  64. struct mlx5_vdpa_umem {
  65. struct mlx5_frag_buf_ctrl fbc;
  66. struct mlx5_frag_buf frag_buf;
  67. int size;
  68. u32 id;
  69. };
  70. struct mlx5_vdpa_qp {
  71. struct mlx5_core_qp mqp;
  72. struct mlx5_frag_buf frag_buf;
  73. struct mlx5_db db;
  74. u16 head;
  75. bool fw;
  76. };
  77. struct mlx5_vq_restore_info {
  78. u32 num_ent;
  79. u64 desc_addr;
  80. u64 device_addr;
  81. u64 driver_addr;
  82. u16 avail_index;
  83. u16 used_index;
  84. bool ready;
  85. bool restore;
  86. };
  87. struct mlx5_vdpa_virtqueue {
  88. bool ready;
  89. u64 desc_addr;
  90. u64 device_addr;
  91. u64 driver_addr;
  92. u32 num_ent;
  93. /* Resources for implementing the notification channel from the device
  94. * to the driver. fwqp is the firmware end of an RC connection; the
  95. * other end is vqqp used by the driver. cq is where completions are
  96. * reported.
  97. */
  98. struct mlx5_vdpa_cq cq;
  99. struct mlx5_vdpa_qp fwqp;
  100. struct mlx5_vdpa_qp vqqp;
  101. /* umem resources are required for the virtqueue operation. They're use
  102. * is internal and they must be provided by the driver.
  103. */
  104. struct mlx5_vdpa_umem umem1;
  105. struct mlx5_vdpa_umem umem2;
  106. struct mlx5_vdpa_umem umem3;
  107. u32 counter_set_id;
  108. bool initialized;
  109. int index;
  110. u32 virtq_id;
  111. struct mlx5_vdpa_net *ndev;
  112. u16 avail_idx;
  113. u16 used_idx;
  114. int fw_state;
  115. /* keep last in the struct */
  116. struct mlx5_vq_restore_info ri;
  117. };
  118. static bool is_index_valid(struct mlx5_vdpa_dev *mvdev, u16 idx)
  119. {
  120. if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_MQ))) {
  121. if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
  122. return idx < 2;
  123. else
  124. return idx < 3;
  125. }
  126. return idx <= mvdev->max_idx;
  127. }
  128. #define MLX5V_MACVLAN_SIZE 256
  129. struct mlx5_vdpa_net {
  130. struct mlx5_vdpa_dev mvdev;
  131. struct mlx5_vdpa_net_resources res;
  132. struct virtio_net_config config;
  133. struct mlx5_vdpa_virtqueue *vqs;
  134. struct vdpa_callback *event_cbs;
  135. /* Serialize vq resources creation and destruction. This is required
  136. * since memory map might change and we need to destroy and create
  137. * resources while driver in operational.
  138. */
  139. struct rw_semaphore reslock;
  140. struct mlx5_flow_table *rxft;
  141. bool setup;
  142. u32 cur_num_vqs;
  143. u32 rqt_size;
  144. bool nb_registered;
  145. struct notifier_block nb;
  146. struct vdpa_callback config_cb;
  147. struct mlx5_vdpa_wq_ent cvq_ent;
  148. struct hlist_head macvlan_hash[MLX5V_MACVLAN_SIZE];
  149. };
  150. struct macvlan_node {
  151. struct hlist_node hlist;
  152. struct mlx5_flow_handle *ucast_rule;
  153. struct mlx5_flow_handle *mcast_rule;
  154. u64 macvlan;
  155. };
  156. static void free_resources(struct mlx5_vdpa_net *ndev);
  157. static void init_mvqs(struct mlx5_vdpa_net *ndev);
  158. static int setup_driver(struct mlx5_vdpa_dev *mvdev);
  159. static void teardown_driver(struct mlx5_vdpa_net *ndev);
  160. static bool mlx5_vdpa_debug;
  161. #define MLX5_CVQ_MAX_ENT 16
  162. #define MLX5_LOG_VIO_FLAG(_feature) \
  163. do { \
  164. if (features & BIT_ULL(_feature)) \
  165. mlx5_vdpa_info(mvdev, "%s\n", #_feature); \
  166. } while (0)
  167. #define MLX5_LOG_VIO_STAT(_status) \
  168. do { \
  169. if (status & (_status)) \
  170. mlx5_vdpa_info(mvdev, "%s\n", #_status); \
  171. } while (0)
  172. /* TODO: cross-endian support */
  173. static inline bool mlx5_vdpa_is_little_endian(struct mlx5_vdpa_dev *mvdev)
  174. {
  175. return virtio_legacy_is_little_endian() ||
  176. (mvdev->actual_features & BIT_ULL(VIRTIO_F_VERSION_1));
  177. }
  178. static u16 mlx5vdpa16_to_cpu(struct mlx5_vdpa_dev *mvdev, __virtio16 val)
  179. {
  180. return __virtio16_to_cpu(mlx5_vdpa_is_little_endian(mvdev), val);
  181. }
  182. static __virtio16 cpu_to_mlx5vdpa16(struct mlx5_vdpa_dev *mvdev, u16 val)
  183. {
  184. return __cpu_to_virtio16(mlx5_vdpa_is_little_endian(mvdev), val);
  185. }
  186. static u16 ctrl_vq_idx(struct mlx5_vdpa_dev *mvdev)
  187. {
  188. if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_MQ)))
  189. return 2;
  190. return mvdev->max_vqs;
  191. }
  192. static bool is_ctrl_vq_idx(struct mlx5_vdpa_dev *mvdev, u16 idx)
  193. {
  194. return idx == ctrl_vq_idx(mvdev);
  195. }
  196. static void print_status(struct mlx5_vdpa_dev *mvdev, u8 status, bool set)
  197. {
  198. if (status & ~VALID_STATUS_MASK)
  199. mlx5_vdpa_warn(mvdev, "Warning: there are invalid status bits 0x%x\n",
  200. status & ~VALID_STATUS_MASK);
  201. if (!mlx5_vdpa_debug)
  202. return;
  203. mlx5_vdpa_info(mvdev, "driver status %s", set ? "set" : "get");
  204. if (set && !status) {
  205. mlx5_vdpa_info(mvdev, "driver resets the device\n");
  206. return;
  207. }
  208. MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_ACKNOWLEDGE);
  209. MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_DRIVER);
  210. MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_DRIVER_OK);
  211. MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_FEATURES_OK);
  212. MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_NEEDS_RESET);
  213. MLX5_LOG_VIO_STAT(VIRTIO_CONFIG_S_FAILED);
  214. }
  215. static void print_features(struct mlx5_vdpa_dev *mvdev, u64 features, bool set)
  216. {
  217. if (features & ~VALID_FEATURES_MASK)
  218. mlx5_vdpa_warn(mvdev, "There are invalid feature bits 0x%llx\n",
  219. features & ~VALID_FEATURES_MASK);
  220. if (!mlx5_vdpa_debug)
  221. return;
  222. mlx5_vdpa_info(mvdev, "driver %s feature bits:\n", set ? "sets" : "reads");
  223. if (!features)
  224. mlx5_vdpa_info(mvdev, "all feature bits are cleared\n");
  225. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CSUM);
  226. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_CSUM);
  227. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_GUEST_OFFLOADS);
  228. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MTU);
  229. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MAC);
  230. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_TSO4);
  231. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_TSO6);
  232. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_ECN);
  233. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_UFO);
  234. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_TSO4);
  235. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_TSO6);
  236. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_ECN);
  237. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HOST_UFO);
  238. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MRG_RXBUF);
  239. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_STATUS);
  240. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_VQ);
  241. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_RX);
  242. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_VLAN);
  243. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_RX_EXTRA);
  244. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_GUEST_ANNOUNCE);
  245. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_MQ);
  246. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_CTRL_MAC_ADDR);
  247. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_HASH_REPORT);
  248. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_RSS);
  249. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_RSC_EXT);
  250. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_STANDBY);
  251. MLX5_LOG_VIO_FLAG(VIRTIO_NET_F_SPEED_DUPLEX);
  252. MLX5_LOG_VIO_FLAG(VIRTIO_F_NOTIFY_ON_EMPTY);
  253. MLX5_LOG_VIO_FLAG(VIRTIO_F_ANY_LAYOUT);
  254. MLX5_LOG_VIO_FLAG(VIRTIO_F_VERSION_1);
  255. MLX5_LOG_VIO_FLAG(VIRTIO_F_ACCESS_PLATFORM);
  256. MLX5_LOG_VIO_FLAG(VIRTIO_F_RING_PACKED);
  257. MLX5_LOG_VIO_FLAG(VIRTIO_F_ORDER_PLATFORM);
  258. MLX5_LOG_VIO_FLAG(VIRTIO_F_SR_IOV);
  259. }
  260. static int create_tis(struct mlx5_vdpa_net *ndev)
  261. {
  262. struct mlx5_vdpa_dev *mvdev = &ndev->mvdev;
  263. u32 in[MLX5_ST_SZ_DW(create_tis_in)] = {};
  264. void *tisc;
  265. int err;
  266. tisc = MLX5_ADDR_OF(create_tis_in, in, ctx);
  267. MLX5_SET(tisc, tisc, transport_domain, ndev->res.tdn);
  268. err = mlx5_vdpa_create_tis(mvdev, in, &ndev->res.tisn);
  269. if (err)
  270. mlx5_vdpa_warn(mvdev, "create TIS (%d)\n", err);
  271. return err;
  272. }
  273. static void destroy_tis(struct mlx5_vdpa_net *ndev)
  274. {
  275. mlx5_vdpa_destroy_tis(&ndev->mvdev, ndev->res.tisn);
  276. }
  277. #define MLX5_VDPA_CQE_SIZE 64
  278. #define MLX5_VDPA_LOG_CQE_SIZE ilog2(MLX5_VDPA_CQE_SIZE)
  279. static int cq_frag_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_cq_buf *buf, int nent)
  280. {
  281. struct mlx5_frag_buf *frag_buf = &buf->frag_buf;
  282. u8 log_wq_stride = MLX5_VDPA_LOG_CQE_SIZE;
  283. u8 log_wq_sz = MLX5_VDPA_LOG_CQE_SIZE;
  284. int err;
  285. err = mlx5_frag_buf_alloc_node(ndev->mvdev.mdev, nent * MLX5_VDPA_CQE_SIZE, frag_buf,
  286. ndev->mvdev.mdev->priv.numa_node);
  287. if (err)
  288. return err;
  289. mlx5_init_fbc(frag_buf->frags, log_wq_stride, log_wq_sz, &buf->fbc);
  290. buf->cqe_size = MLX5_VDPA_CQE_SIZE;
  291. buf->nent = nent;
  292. return 0;
  293. }
  294. static int umem_frag_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_umem *umem, int size)
  295. {
  296. struct mlx5_frag_buf *frag_buf = &umem->frag_buf;
  297. return mlx5_frag_buf_alloc_node(ndev->mvdev.mdev, size, frag_buf,
  298. ndev->mvdev.mdev->priv.numa_node);
  299. }
  300. static void cq_frag_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_cq_buf *buf)
  301. {
  302. mlx5_frag_buf_free(ndev->mvdev.mdev, &buf->frag_buf);
  303. }
  304. static void *get_cqe(struct mlx5_vdpa_cq *vcq, int n)
  305. {
  306. return mlx5_frag_buf_get_wqe(&vcq->buf.fbc, n);
  307. }
  308. static void cq_frag_buf_init(struct mlx5_vdpa_cq *vcq, struct mlx5_vdpa_cq_buf *buf)
  309. {
  310. struct mlx5_cqe64 *cqe64;
  311. void *cqe;
  312. int i;
  313. for (i = 0; i < buf->nent; i++) {
  314. cqe = get_cqe(vcq, i);
  315. cqe64 = cqe;
  316. cqe64->op_own = MLX5_CQE_INVALID << 4;
  317. }
  318. }
  319. static void *get_sw_cqe(struct mlx5_vdpa_cq *cq, int n)
  320. {
  321. struct mlx5_cqe64 *cqe64 = get_cqe(cq, n & (cq->cqe - 1));
  322. if (likely(get_cqe_opcode(cqe64) != MLX5_CQE_INVALID) &&
  323. !((cqe64->op_own & MLX5_CQE_OWNER_MASK) ^ !!(n & cq->cqe)))
  324. return cqe64;
  325. return NULL;
  326. }
  327. static void rx_post(struct mlx5_vdpa_qp *vqp, int n)
  328. {
  329. vqp->head += n;
  330. vqp->db.db[0] = cpu_to_be32(vqp->head);
  331. }
  332. static void qp_prepare(struct mlx5_vdpa_net *ndev, bool fw, void *in,
  333. struct mlx5_vdpa_virtqueue *mvq, u32 num_ent)
  334. {
  335. struct mlx5_vdpa_qp *vqp;
  336. __be64 *pas;
  337. void *qpc;
  338. vqp = fw ? &mvq->fwqp : &mvq->vqqp;
  339. MLX5_SET(create_qp_in, in, uid, ndev->mvdev.res.uid);
  340. qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
  341. if (vqp->fw) {
  342. /* Firmware QP is allocated by the driver for the firmware's
  343. * use so we can skip part of the params as they will be chosen by firmware
  344. */
  345. qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
  346. MLX5_SET(qpc, qpc, rq_type, MLX5_ZERO_LEN_RQ);
  347. MLX5_SET(qpc, qpc, no_sq, 1);
  348. return;
  349. }
  350. MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
  351. MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
  352. MLX5_SET(qpc, qpc, pd, ndev->mvdev.res.pdn);
  353. MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
  354. MLX5_SET(qpc, qpc, uar_page, ndev->mvdev.res.uar->index);
  355. MLX5_SET(qpc, qpc, log_page_size, vqp->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
  356. MLX5_SET(qpc, qpc, no_sq, 1);
  357. MLX5_SET(qpc, qpc, cqn_rcv, mvq->cq.mcq.cqn);
  358. MLX5_SET(qpc, qpc, log_rq_size, ilog2(num_ent));
  359. MLX5_SET(qpc, qpc, rq_type, MLX5_NON_ZERO_RQ);
  360. pas = (__be64 *)MLX5_ADDR_OF(create_qp_in, in, pas);
  361. mlx5_fill_page_frag_array(&vqp->frag_buf, pas);
  362. }
  363. static int rq_buf_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp, u32 num_ent)
  364. {
  365. return mlx5_frag_buf_alloc_node(ndev->mvdev.mdev,
  366. num_ent * sizeof(struct mlx5_wqe_data_seg), &vqp->frag_buf,
  367. ndev->mvdev.mdev->priv.numa_node);
  368. }
  369. static void rq_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp)
  370. {
  371. mlx5_frag_buf_free(ndev->mvdev.mdev, &vqp->frag_buf);
  372. }
  373. static int qp_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
  374. struct mlx5_vdpa_qp *vqp)
  375. {
  376. struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
  377. int inlen = MLX5_ST_SZ_BYTES(create_qp_in);
  378. u32 out[MLX5_ST_SZ_DW(create_qp_out)] = {};
  379. void *qpc;
  380. void *in;
  381. int err;
  382. if (!vqp->fw) {
  383. vqp = &mvq->vqqp;
  384. err = rq_buf_alloc(ndev, vqp, mvq->num_ent);
  385. if (err)
  386. return err;
  387. err = mlx5_db_alloc(ndev->mvdev.mdev, &vqp->db);
  388. if (err)
  389. goto err_db;
  390. inlen += vqp->frag_buf.npages * sizeof(__be64);
  391. }
  392. in = kzalloc(inlen, GFP_KERNEL);
  393. if (!in) {
  394. err = -ENOMEM;
  395. goto err_kzalloc;
  396. }
  397. qp_prepare(ndev, vqp->fw, in, mvq, mvq->num_ent);
  398. qpc = MLX5_ADDR_OF(create_qp_in, in, qpc);
  399. MLX5_SET(qpc, qpc, st, MLX5_QP_ST_RC);
  400. MLX5_SET(qpc, qpc, pm_state, MLX5_QP_PM_MIGRATED);
  401. MLX5_SET(qpc, qpc, pd, ndev->mvdev.res.pdn);
  402. MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
  403. if (!vqp->fw)
  404. MLX5_SET64(qpc, qpc, dbr_addr, vqp->db.dma);
  405. MLX5_SET(create_qp_in, in, opcode, MLX5_CMD_OP_CREATE_QP);
  406. err = mlx5_cmd_exec(mdev, in, inlen, out, sizeof(out));
  407. kfree(in);
  408. if (err)
  409. goto err_kzalloc;
  410. vqp->mqp.uid = ndev->mvdev.res.uid;
  411. vqp->mqp.qpn = MLX5_GET(create_qp_out, out, qpn);
  412. if (!vqp->fw)
  413. rx_post(vqp, mvq->num_ent);
  414. return 0;
  415. err_kzalloc:
  416. if (!vqp->fw)
  417. mlx5_db_free(ndev->mvdev.mdev, &vqp->db);
  418. err_db:
  419. if (!vqp->fw)
  420. rq_buf_free(ndev, vqp);
  421. return err;
  422. }
  423. static void qp_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_qp *vqp)
  424. {
  425. u32 in[MLX5_ST_SZ_DW(destroy_qp_in)] = {};
  426. MLX5_SET(destroy_qp_in, in, opcode, MLX5_CMD_OP_DESTROY_QP);
  427. MLX5_SET(destroy_qp_in, in, qpn, vqp->mqp.qpn);
  428. MLX5_SET(destroy_qp_in, in, uid, ndev->mvdev.res.uid);
  429. if (mlx5_cmd_exec_in(ndev->mvdev.mdev, destroy_qp, in))
  430. mlx5_vdpa_warn(&ndev->mvdev, "destroy qp 0x%x\n", vqp->mqp.qpn);
  431. if (!vqp->fw) {
  432. mlx5_db_free(ndev->mvdev.mdev, &vqp->db);
  433. rq_buf_free(ndev, vqp);
  434. }
  435. }
  436. static void *next_cqe_sw(struct mlx5_vdpa_cq *cq)
  437. {
  438. return get_sw_cqe(cq, cq->mcq.cons_index);
  439. }
  440. static int mlx5_vdpa_poll_one(struct mlx5_vdpa_cq *vcq)
  441. {
  442. struct mlx5_cqe64 *cqe64;
  443. cqe64 = next_cqe_sw(vcq);
  444. if (!cqe64)
  445. return -EAGAIN;
  446. vcq->mcq.cons_index++;
  447. return 0;
  448. }
  449. static void mlx5_vdpa_handle_completions(struct mlx5_vdpa_virtqueue *mvq, int num)
  450. {
  451. struct mlx5_vdpa_net *ndev = mvq->ndev;
  452. struct vdpa_callback *event_cb;
  453. event_cb = &ndev->event_cbs[mvq->index];
  454. mlx5_cq_set_ci(&mvq->cq.mcq);
  455. /* make sure CQ cosumer update is visible to the hardware before updating
  456. * RX doorbell record.
  457. */
  458. dma_wmb();
  459. rx_post(&mvq->vqqp, num);
  460. if (event_cb->callback)
  461. event_cb->callback(event_cb->private);
  462. }
  463. static void mlx5_vdpa_cq_comp(struct mlx5_core_cq *mcq, struct mlx5_eqe *eqe)
  464. {
  465. struct mlx5_vdpa_virtqueue *mvq = container_of(mcq, struct mlx5_vdpa_virtqueue, cq.mcq);
  466. struct mlx5_vdpa_net *ndev = mvq->ndev;
  467. void __iomem *uar_page = ndev->mvdev.res.uar->map;
  468. int num = 0;
  469. while (!mlx5_vdpa_poll_one(&mvq->cq)) {
  470. num++;
  471. if (num > mvq->num_ent / 2) {
  472. /* If completions keep coming while we poll, we want to
  473. * let the hardware know that we consumed them by
  474. * updating the doorbell record. We also let vdpa core
  475. * know about this so it passes it on the virtio driver
  476. * on the guest.
  477. */
  478. mlx5_vdpa_handle_completions(mvq, num);
  479. num = 0;
  480. }
  481. }
  482. if (num)
  483. mlx5_vdpa_handle_completions(mvq, num);
  484. mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
  485. }
  486. static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent)
  487. {
  488. struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
  489. struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
  490. void __iomem *uar_page = ndev->mvdev.res.uar->map;
  491. u32 out[MLX5_ST_SZ_DW(create_cq_out)];
  492. struct mlx5_vdpa_cq *vcq = &mvq->cq;
  493. __be64 *pas;
  494. int inlen;
  495. void *cqc;
  496. void *in;
  497. int err;
  498. int eqn;
  499. err = mlx5_db_alloc(mdev, &vcq->db);
  500. if (err)
  501. return err;
  502. vcq->mcq.set_ci_db = vcq->db.db;
  503. vcq->mcq.arm_db = vcq->db.db + 1;
  504. vcq->mcq.cqe_sz = 64;
  505. err = cq_frag_buf_alloc(ndev, &vcq->buf, num_ent);
  506. if (err)
  507. goto err_db;
  508. cq_frag_buf_init(vcq, &vcq->buf);
  509. inlen = MLX5_ST_SZ_BYTES(create_cq_in) +
  510. MLX5_FLD_SZ_BYTES(create_cq_in, pas[0]) * vcq->buf.frag_buf.npages;
  511. in = kzalloc(inlen, GFP_KERNEL);
  512. if (!in) {
  513. err = -ENOMEM;
  514. goto err_vzalloc;
  515. }
  516. MLX5_SET(create_cq_in, in, uid, ndev->mvdev.res.uid);
  517. pas = (__be64 *)MLX5_ADDR_OF(create_cq_in, in, pas);
  518. mlx5_fill_page_frag_array(&vcq->buf.frag_buf, pas);
  519. cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
  520. MLX5_SET(cqc, cqc, log_page_size, vcq->buf.frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
  521. /* Use vector 0 by default. Consider adding code to choose least used
  522. * vector.
  523. */
  524. err = mlx5_vector2eqn(mdev, 0, &eqn);
  525. if (err)
  526. goto err_vec;
  527. cqc = MLX5_ADDR_OF(create_cq_in, in, cq_context);
  528. MLX5_SET(cqc, cqc, log_cq_size, ilog2(num_ent));
  529. MLX5_SET(cqc, cqc, uar_page, ndev->mvdev.res.uar->index);
  530. MLX5_SET(cqc, cqc, c_eqn_or_apu_element, eqn);
  531. MLX5_SET64(cqc, cqc, dbr_addr, vcq->db.dma);
  532. err = mlx5_core_create_cq(mdev, &vcq->mcq, in, inlen, out, sizeof(out));
  533. if (err)
  534. goto err_vec;
  535. vcq->mcq.comp = mlx5_vdpa_cq_comp;
  536. vcq->cqe = num_ent;
  537. vcq->mcq.set_ci_db = vcq->db.db;
  538. vcq->mcq.arm_db = vcq->db.db + 1;
  539. mlx5_cq_arm(&mvq->cq.mcq, MLX5_CQ_DB_REQ_NOT, uar_page, mvq->cq.mcq.cons_index);
  540. kfree(in);
  541. return 0;
  542. err_vec:
  543. kfree(in);
  544. err_vzalloc:
  545. cq_frag_buf_free(ndev, &vcq->buf);
  546. err_db:
  547. mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
  548. return err;
  549. }
  550. static void cq_destroy(struct mlx5_vdpa_net *ndev, u16 idx)
  551. {
  552. struct mlx5_vdpa_virtqueue *mvq = &ndev->vqs[idx];
  553. struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
  554. struct mlx5_vdpa_cq *vcq = &mvq->cq;
  555. if (mlx5_core_destroy_cq(mdev, &vcq->mcq)) {
  556. mlx5_vdpa_warn(&ndev->mvdev, "destroy CQ 0x%x\n", vcq->mcq.cqn);
  557. return;
  558. }
  559. cq_frag_buf_free(ndev, &vcq->buf);
  560. mlx5_db_free(ndev->mvdev.mdev, &vcq->db);
  561. }
  562. static void set_umem_size(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num,
  563. struct mlx5_vdpa_umem **umemp)
  564. {
  565. struct mlx5_core_dev *mdev = ndev->mvdev.mdev;
  566. int p_a;
  567. int p_b;
  568. switch (num) {
  569. case 1:
  570. p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_1_buffer_param_a);
  571. p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_1_buffer_param_b);
  572. *umemp = &mvq->umem1;
  573. break;
  574. case 2:
  575. p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_2_buffer_param_a);
  576. p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_2_buffer_param_b);
  577. *umemp = &mvq->umem2;
  578. break;
  579. case 3:
  580. p_a = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_3_buffer_param_a);
  581. p_b = MLX5_CAP_DEV_VDPA_EMULATION(mdev, umem_3_buffer_param_b);
  582. *umemp = &mvq->umem3;
  583. break;
  584. }
  585. (*umemp)->size = p_a * mvq->num_ent + p_b;
  586. }
  587. static void umem_frag_buf_free(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_umem *umem)
  588. {
  589. mlx5_frag_buf_free(ndev->mvdev.mdev, &umem->frag_buf);
  590. }
  591. static int create_umem(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
  592. {
  593. int inlen;
  594. u32 out[MLX5_ST_SZ_DW(create_umem_out)] = {};
  595. void *um;
  596. void *in;
  597. int err;
  598. __be64 *pas;
  599. struct mlx5_vdpa_umem *umem;
  600. set_umem_size(ndev, mvq, num, &umem);
  601. err = umem_frag_buf_alloc(ndev, umem, umem->size);
  602. if (err)
  603. return err;
  604. inlen = MLX5_ST_SZ_BYTES(create_umem_in) + MLX5_ST_SZ_BYTES(mtt) * umem->frag_buf.npages;
  605. in = kzalloc(inlen, GFP_KERNEL);
  606. if (!in) {
  607. err = -ENOMEM;
  608. goto err_in;
  609. }
  610. MLX5_SET(create_umem_in, in, opcode, MLX5_CMD_OP_CREATE_UMEM);
  611. MLX5_SET(create_umem_in, in, uid, ndev->mvdev.res.uid);
  612. um = MLX5_ADDR_OF(create_umem_in, in, umem);
  613. MLX5_SET(umem, um, log_page_size, umem->frag_buf.page_shift - MLX5_ADAPTER_PAGE_SHIFT);
  614. MLX5_SET64(umem, um, num_of_mtt, umem->frag_buf.npages);
  615. pas = (__be64 *)MLX5_ADDR_OF(umem, um, mtt[0]);
  616. mlx5_fill_page_frag_array_perm(&umem->frag_buf, pas, MLX5_MTT_PERM_RW);
  617. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
  618. if (err) {
  619. mlx5_vdpa_warn(&ndev->mvdev, "create umem(%d)\n", err);
  620. goto err_cmd;
  621. }
  622. kfree(in);
  623. umem->id = MLX5_GET(create_umem_out, out, umem_id);
  624. return 0;
  625. err_cmd:
  626. kfree(in);
  627. err_in:
  628. umem_frag_buf_free(ndev, umem);
  629. return err;
  630. }
  631. static void umem_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int num)
  632. {
  633. u32 in[MLX5_ST_SZ_DW(destroy_umem_in)] = {};
  634. u32 out[MLX5_ST_SZ_DW(destroy_umem_out)] = {};
  635. struct mlx5_vdpa_umem *umem;
  636. switch (num) {
  637. case 1:
  638. umem = &mvq->umem1;
  639. break;
  640. case 2:
  641. umem = &mvq->umem2;
  642. break;
  643. case 3:
  644. umem = &mvq->umem3;
  645. break;
  646. }
  647. MLX5_SET(destroy_umem_in, in, opcode, MLX5_CMD_OP_DESTROY_UMEM);
  648. MLX5_SET(destroy_umem_in, in, umem_id, umem->id);
  649. if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out)))
  650. return;
  651. umem_frag_buf_free(ndev, umem);
  652. }
  653. static int umems_create(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  654. {
  655. int num;
  656. int err;
  657. for (num = 1; num <= 3; num++) {
  658. err = create_umem(ndev, mvq, num);
  659. if (err)
  660. goto err_umem;
  661. }
  662. return 0;
  663. err_umem:
  664. for (num--; num > 0; num--)
  665. umem_destroy(ndev, mvq, num);
  666. return err;
  667. }
  668. static void umems_destroy(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  669. {
  670. int num;
  671. for (num = 3; num > 0; num--)
  672. umem_destroy(ndev, mvq, num);
  673. }
  674. static int get_queue_type(struct mlx5_vdpa_net *ndev)
  675. {
  676. u32 type_mask;
  677. type_mask = MLX5_CAP_DEV_VDPA_EMULATION(ndev->mvdev.mdev, virtio_queue_type);
  678. /* prefer split queue */
  679. if (type_mask & MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT)
  680. return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_SPLIT;
  681. WARN_ON(!(type_mask & MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_PACKED));
  682. return MLX5_VIRTIO_EMULATION_VIRTIO_QUEUE_TYPE_PACKED;
  683. }
  684. static bool vq_is_tx(u16 idx)
  685. {
  686. return idx % 2;
  687. }
  688. static u16 get_features_12_3(u64 features)
  689. {
  690. return (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_TSO4)) << 9) |
  691. (!!(features & BIT_ULL(VIRTIO_NET_F_HOST_TSO6)) << 8) |
  692. (!!(features & BIT_ULL(VIRTIO_NET_F_CSUM)) << 7) |
  693. (!!(features & BIT_ULL(VIRTIO_NET_F_GUEST_CSUM)) << 6);
  694. }
  695. static bool counters_supported(const struct mlx5_vdpa_dev *mvdev)
  696. {
  697. return MLX5_CAP_GEN_64(mvdev->mdev, general_obj_types) &
  698. BIT_ULL(MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
  699. }
  700. static int create_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  701. {
  702. int inlen = MLX5_ST_SZ_BYTES(create_virtio_net_q_in);
  703. u32 out[MLX5_ST_SZ_DW(create_virtio_net_q_out)] = {};
  704. void *obj_context;
  705. void *cmd_hdr;
  706. void *vq_ctx;
  707. void *in;
  708. int err;
  709. err = umems_create(ndev, mvq);
  710. if (err)
  711. return err;
  712. in = kzalloc(inlen, GFP_KERNEL);
  713. if (!in) {
  714. err = -ENOMEM;
  715. goto err_alloc;
  716. }
  717. cmd_hdr = MLX5_ADDR_OF(create_virtio_net_q_in, in, general_obj_in_cmd_hdr);
  718. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
  719. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
  720. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
  721. obj_context = MLX5_ADDR_OF(create_virtio_net_q_in, in, obj_context);
  722. MLX5_SET(virtio_net_q_object, obj_context, hw_available_index, mvq->avail_idx);
  723. MLX5_SET(virtio_net_q_object, obj_context, hw_used_index, mvq->used_idx);
  724. MLX5_SET(virtio_net_q_object, obj_context, queue_feature_bit_mask_12_3,
  725. get_features_12_3(ndev->mvdev.actual_features));
  726. vq_ctx = MLX5_ADDR_OF(virtio_net_q_object, obj_context, virtio_q_context);
  727. MLX5_SET(virtio_q, vq_ctx, virtio_q_type, get_queue_type(ndev));
  728. if (vq_is_tx(mvq->index))
  729. MLX5_SET(virtio_net_q_object, obj_context, tisn_or_qpn, ndev->res.tisn);
  730. MLX5_SET(virtio_q, vq_ctx, event_mode, MLX5_VIRTIO_Q_EVENT_MODE_QP_MODE);
  731. MLX5_SET(virtio_q, vq_ctx, queue_index, mvq->index);
  732. MLX5_SET(virtio_q, vq_ctx, event_qpn_or_msix, mvq->fwqp.mqp.qpn);
  733. MLX5_SET(virtio_q, vq_ctx, queue_size, mvq->num_ent);
  734. MLX5_SET(virtio_q, vq_ctx, virtio_version_1_0,
  735. !!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_F_VERSION_1)));
  736. MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr);
  737. MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr);
  738. MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr);
  739. MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr.mkey);
  740. MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id);
  741. MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size);
  742. MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id);
  743. MLX5_SET(virtio_q, vq_ctx, umem_2_size, mvq->umem2.size);
  744. MLX5_SET(virtio_q, vq_ctx, umem_3_id, mvq->umem3.id);
  745. MLX5_SET(virtio_q, vq_ctx, umem_3_size, mvq->umem3.size);
  746. MLX5_SET(virtio_q, vq_ctx, pd, ndev->mvdev.res.pdn);
  747. if (counters_supported(&ndev->mvdev))
  748. MLX5_SET(virtio_q, vq_ctx, counter_set_id, mvq->counter_set_id);
  749. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
  750. if (err)
  751. goto err_cmd;
  752. mvq->fw_state = MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT;
  753. kfree(in);
  754. mvq->virtq_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
  755. return 0;
  756. err_cmd:
  757. kfree(in);
  758. err_alloc:
  759. umems_destroy(ndev, mvq);
  760. return err;
  761. }
  762. static void destroy_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  763. {
  764. u32 in[MLX5_ST_SZ_DW(destroy_virtio_net_q_in)] = {};
  765. u32 out[MLX5_ST_SZ_DW(destroy_virtio_net_q_out)] = {};
  766. MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.opcode,
  767. MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
  768. MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_id, mvq->virtq_id);
  769. MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.uid, ndev->mvdev.res.uid);
  770. MLX5_SET(destroy_virtio_net_q_in, in, general_obj_out_cmd_hdr.obj_type,
  771. MLX5_OBJ_TYPE_VIRTIO_NET_Q);
  772. if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out))) {
  773. mlx5_vdpa_warn(&ndev->mvdev, "destroy virtqueue 0x%x\n", mvq->virtq_id);
  774. return;
  775. }
  776. mvq->fw_state = MLX5_VIRTIO_NET_Q_OBJECT_NONE;
  777. umems_destroy(ndev, mvq);
  778. }
  779. static u32 get_rqpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
  780. {
  781. return fw ? mvq->vqqp.mqp.qpn : mvq->fwqp.mqp.qpn;
  782. }
  783. static u32 get_qpn(struct mlx5_vdpa_virtqueue *mvq, bool fw)
  784. {
  785. return fw ? mvq->fwqp.mqp.qpn : mvq->vqqp.mqp.qpn;
  786. }
  787. static void alloc_inout(struct mlx5_vdpa_net *ndev, int cmd, void **in, int *inlen, void **out,
  788. int *outlen, u32 qpn, u32 rqpn)
  789. {
  790. void *qpc;
  791. void *pp;
  792. switch (cmd) {
  793. case MLX5_CMD_OP_2RST_QP:
  794. *inlen = MLX5_ST_SZ_BYTES(qp_2rst_in);
  795. *outlen = MLX5_ST_SZ_BYTES(qp_2rst_out);
  796. *in = kzalloc(*inlen, GFP_KERNEL);
  797. *out = kzalloc(*outlen, GFP_KERNEL);
  798. if (!*in || !*out)
  799. goto outerr;
  800. MLX5_SET(qp_2rst_in, *in, opcode, cmd);
  801. MLX5_SET(qp_2rst_in, *in, uid, ndev->mvdev.res.uid);
  802. MLX5_SET(qp_2rst_in, *in, qpn, qpn);
  803. break;
  804. case MLX5_CMD_OP_RST2INIT_QP:
  805. *inlen = MLX5_ST_SZ_BYTES(rst2init_qp_in);
  806. *outlen = MLX5_ST_SZ_BYTES(rst2init_qp_out);
  807. *in = kzalloc(*inlen, GFP_KERNEL);
  808. *out = kzalloc(MLX5_ST_SZ_BYTES(rst2init_qp_out), GFP_KERNEL);
  809. if (!*in || !*out)
  810. goto outerr;
  811. MLX5_SET(rst2init_qp_in, *in, opcode, cmd);
  812. MLX5_SET(rst2init_qp_in, *in, uid, ndev->mvdev.res.uid);
  813. MLX5_SET(rst2init_qp_in, *in, qpn, qpn);
  814. qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
  815. MLX5_SET(qpc, qpc, remote_qpn, rqpn);
  816. MLX5_SET(qpc, qpc, rwe, 1);
  817. pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
  818. MLX5_SET(ads, pp, vhca_port_num, 1);
  819. break;
  820. case MLX5_CMD_OP_INIT2RTR_QP:
  821. *inlen = MLX5_ST_SZ_BYTES(init2rtr_qp_in);
  822. *outlen = MLX5_ST_SZ_BYTES(init2rtr_qp_out);
  823. *in = kzalloc(*inlen, GFP_KERNEL);
  824. *out = kzalloc(MLX5_ST_SZ_BYTES(init2rtr_qp_out), GFP_KERNEL);
  825. if (!*in || !*out)
  826. goto outerr;
  827. MLX5_SET(init2rtr_qp_in, *in, opcode, cmd);
  828. MLX5_SET(init2rtr_qp_in, *in, uid, ndev->mvdev.res.uid);
  829. MLX5_SET(init2rtr_qp_in, *in, qpn, qpn);
  830. qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
  831. MLX5_SET(qpc, qpc, mtu, MLX5_QPC_MTU_256_BYTES);
  832. MLX5_SET(qpc, qpc, log_msg_max, 30);
  833. MLX5_SET(qpc, qpc, remote_qpn, rqpn);
  834. pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
  835. MLX5_SET(ads, pp, fl, 1);
  836. break;
  837. case MLX5_CMD_OP_RTR2RTS_QP:
  838. *inlen = MLX5_ST_SZ_BYTES(rtr2rts_qp_in);
  839. *outlen = MLX5_ST_SZ_BYTES(rtr2rts_qp_out);
  840. *in = kzalloc(*inlen, GFP_KERNEL);
  841. *out = kzalloc(MLX5_ST_SZ_BYTES(rtr2rts_qp_out), GFP_KERNEL);
  842. if (!*in || !*out)
  843. goto outerr;
  844. MLX5_SET(rtr2rts_qp_in, *in, opcode, cmd);
  845. MLX5_SET(rtr2rts_qp_in, *in, uid, ndev->mvdev.res.uid);
  846. MLX5_SET(rtr2rts_qp_in, *in, qpn, qpn);
  847. qpc = MLX5_ADDR_OF(rst2init_qp_in, *in, qpc);
  848. pp = MLX5_ADDR_OF(qpc, qpc, primary_address_path);
  849. MLX5_SET(ads, pp, ack_timeout, 14);
  850. MLX5_SET(qpc, qpc, retry_count, 7);
  851. MLX5_SET(qpc, qpc, rnr_retry, 7);
  852. break;
  853. default:
  854. goto outerr_nullify;
  855. }
  856. return;
  857. outerr:
  858. kfree(*in);
  859. kfree(*out);
  860. outerr_nullify:
  861. *in = NULL;
  862. *out = NULL;
  863. }
  864. static void free_inout(void *in, void *out)
  865. {
  866. kfree(in);
  867. kfree(out);
  868. }
  869. /* Two QPs are used by each virtqueue. One is used by the driver and one by
  870. * firmware. The fw argument indicates whether the subjected QP is the one used
  871. * by firmware.
  872. */
  873. static int modify_qp(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, bool fw, int cmd)
  874. {
  875. int outlen;
  876. int inlen;
  877. void *out;
  878. void *in;
  879. int err;
  880. alloc_inout(ndev, cmd, &in, &inlen, &out, &outlen, get_qpn(mvq, fw), get_rqpn(mvq, fw));
  881. if (!in || !out)
  882. return -ENOMEM;
  883. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, outlen);
  884. free_inout(in, out);
  885. return err;
  886. }
  887. static int connect_qps(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  888. {
  889. int err;
  890. err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_2RST_QP);
  891. if (err)
  892. return err;
  893. err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_2RST_QP);
  894. if (err)
  895. return err;
  896. err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_RST2INIT_QP);
  897. if (err)
  898. return err;
  899. err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_RST2INIT_QP);
  900. if (err)
  901. return err;
  902. err = modify_qp(ndev, mvq, true, MLX5_CMD_OP_INIT2RTR_QP);
  903. if (err)
  904. return err;
  905. err = modify_qp(ndev, mvq, false, MLX5_CMD_OP_INIT2RTR_QP);
  906. if (err)
  907. return err;
  908. return modify_qp(ndev, mvq, true, MLX5_CMD_OP_RTR2RTS_QP);
  909. }
  910. struct mlx5_virtq_attr {
  911. u8 state;
  912. u16 available_index;
  913. u16 used_index;
  914. };
  915. static int query_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
  916. struct mlx5_virtq_attr *attr)
  917. {
  918. int outlen = MLX5_ST_SZ_BYTES(query_virtio_net_q_out);
  919. u32 in[MLX5_ST_SZ_DW(query_virtio_net_q_in)] = {};
  920. void *out;
  921. void *obj_context;
  922. void *cmd_hdr;
  923. int err;
  924. out = kzalloc(outlen, GFP_KERNEL);
  925. if (!out)
  926. return -ENOMEM;
  927. cmd_hdr = MLX5_ADDR_OF(query_virtio_net_q_in, in, general_obj_in_cmd_hdr);
  928. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_QUERY_GENERAL_OBJECT);
  929. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
  930. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
  931. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
  932. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, outlen);
  933. if (err)
  934. goto err_cmd;
  935. obj_context = MLX5_ADDR_OF(query_virtio_net_q_out, out, obj_context);
  936. memset(attr, 0, sizeof(*attr));
  937. attr->state = MLX5_GET(virtio_net_q_object, obj_context, state);
  938. attr->available_index = MLX5_GET(virtio_net_q_object, obj_context, hw_available_index);
  939. attr->used_index = MLX5_GET(virtio_net_q_object, obj_context, hw_used_index);
  940. kfree(out);
  941. return 0;
  942. err_cmd:
  943. kfree(out);
  944. return err;
  945. }
  946. static bool is_valid_state_change(int oldstate, int newstate)
  947. {
  948. switch (oldstate) {
  949. case MLX5_VIRTIO_NET_Q_OBJECT_STATE_INIT:
  950. return newstate == MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY;
  951. case MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY:
  952. return newstate == MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND;
  953. case MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND:
  954. case MLX5_VIRTIO_NET_Q_OBJECT_STATE_ERR:
  955. default:
  956. return false;
  957. }
  958. }
  959. static int modify_virtqueue(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq, int state)
  960. {
  961. int inlen = MLX5_ST_SZ_BYTES(modify_virtio_net_q_in);
  962. u32 out[MLX5_ST_SZ_DW(modify_virtio_net_q_out)] = {};
  963. void *obj_context;
  964. void *cmd_hdr;
  965. void *in;
  966. int err;
  967. if (mvq->fw_state == MLX5_VIRTIO_NET_Q_OBJECT_NONE)
  968. return 0;
  969. if (!is_valid_state_change(mvq->fw_state, state))
  970. return -EINVAL;
  971. in = kzalloc(inlen, GFP_KERNEL);
  972. if (!in)
  973. return -ENOMEM;
  974. cmd_hdr = MLX5_ADDR_OF(modify_virtio_net_q_in, in, general_obj_in_cmd_hdr);
  975. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_MODIFY_GENERAL_OBJECT);
  976. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_NET_Q);
  977. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->virtq_id);
  978. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
  979. obj_context = MLX5_ADDR_OF(modify_virtio_net_q_in, in, obj_context);
  980. MLX5_SET64(virtio_net_q_object, obj_context, modify_field_select,
  981. MLX5_VIRTQ_MODIFY_MASK_STATE);
  982. MLX5_SET(virtio_net_q_object, obj_context, state, state);
  983. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, inlen, out, sizeof(out));
  984. kfree(in);
  985. if (!err)
  986. mvq->fw_state = state;
  987. return err;
  988. }
  989. static int counter_set_alloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  990. {
  991. u32 in[MLX5_ST_SZ_DW(create_virtio_q_counters_in)] = {};
  992. u32 out[MLX5_ST_SZ_DW(create_virtio_q_counters_out)] = {};
  993. void *cmd_hdr;
  994. int err;
  995. if (!counters_supported(&ndev->mvdev))
  996. return 0;
  997. cmd_hdr = MLX5_ADDR_OF(create_virtio_q_counters_in, in, hdr);
  998. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_CREATE_GENERAL_OBJECT);
  999. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
  1000. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
  1001. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out));
  1002. if (err)
  1003. return err;
  1004. mvq->counter_set_id = MLX5_GET(general_obj_out_cmd_hdr, out, obj_id);
  1005. return 0;
  1006. }
  1007. static void counter_set_dealloc(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  1008. {
  1009. u32 in[MLX5_ST_SZ_DW(destroy_virtio_q_counters_in)] = {};
  1010. u32 out[MLX5_ST_SZ_DW(destroy_virtio_q_counters_out)] = {};
  1011. if (!counters_supported(&ndev->mvdev))
  1012. return;
  1013. MLX5_SET(destroy_virtio_q_counters_in, in, hdr.opcode, MLX5_CMD_OP_DESTROY_GENERAL_OBJECT);
  1014. MLX5_SET(destroy_virtio_q_counters_in, in, hdr.obj_id, mvq->counter_set_id);
  1015. MLX5_SET(destroy_virtio_q_counters_in, in, hdr.uid, ndev->mvdev.res.uid);
  1016. MLX5_SET(destroy_virtio_q_counters_in, in, hdr.obj_type, MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
  1017. if (mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out)))
  1018. mlx5_vdpa_warn(&ndev->mvdev, "dealloc counter set 0x%x\n", mvq->counter_set_id);
  1019. }
  1020. static int setup_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  1021. {
  1022. u16 idx = mvq->index;
  1023. int err;
  1024. if (!mvq->num_ent)
  1025. return 0;
  1026. if (mvq->initialized)
  1027. return 0;
  1028. err = cq_create(ndev, idx, mvq->num_ent);
  1029. if (err)
  1030. return err;
  1031. err = qp_create(ndev, mvq, &mvq->fwqp);
  1032. if (err)
  1033. goto err_fwqp;
  1034. err = qp_create(ndev, mvq, &mvq->vqqp);
  1035. if (err)
  1036. goto err_vqqp;
  1037. err = connect_qps(ndev, mvq);
  1038. if (err)
  1039. goto err_connect;
  1040. err = counter_set_alloc(ndev, mvq);
  1041. if (err)
  1042. goto err_counter;
  1043. err = create_virtqueue(ndev, mvq);
  1044. if (err)
  1045. goto err_connect;
  1046. if (mvq->ready) {
  1047. err = modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
  1048. if (err) {
  1049. mlx5_vdpa_warn(&ndev->mvdev, "failed to modify to ready vq idx %d(%d)\n",
  1050. idx, err);
  1051. goto err_connect;
  1052. }
  1053. }
  1054. mvq->initialized = true;
  1055. return 0;
  1056. err_connect:
  1057. counter_set_dealloc(ndev, mvq);
  1058. err_counter:
  1059. qp_destroy(ndev, &mvq->vqqp);
  1060. err_vqqp:
  1061. qp_destroy(ndev, &mvq->fwqp);
  1062. err_fwqp:
  1063. cq_destroy(ndev, idx);
  1064. return err;
  1065. }
  1066. static void suspend_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  1067. {
  1068. struct mlx5_virtq_attr attr;
  1069. if (!mvq->initialized)
  1070. return;
  1071. if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
  1072. return;
  1073. if (modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_SUSPEND))
  1074. mlx5_vdpa_warn(&ndev->mvdev, "modify to suspend failed\n");
  1075. if (query_virtqueue(ndev, mvq, &attr)) {
  1076. mlx5_vdpa_warn(&ndev->mvdev, "failed to query virtqueue\n");
  1077. return;
  1078. }
  1079. mvq->avail_idx = attr.available_index;
  1080. mvq->used_idx = attr.used_index;
  1081. }
  1082. static void suspend_vqs(struct mlx5_vdpa_net *ndev)
  1083. {
  1084. int i;
  1085. for (i = 0; i < ndev->mvdev.max_vqs; i++)
  1086. suspend_vq(ndev, &ndev->vqs[i]);
  1087. }
  1088. static void teardown_vq(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  1089. {
  1090. if (!mvq->initialized)
  1091. return;
  1092. suspend_vq(ndev, mvq);
  1093. destroy_virtqueue(ndev, mvq);
  1094. counter_set_dealloc(ndev, mvq);
  1095. qp_destroy(ndev, &mvq->vqqp);
  1096. qp_destroy(ndev, &mvq->fwqp);
  1097. cq_destroy(ndev, mvq->index);
  1098. mvq->initialized = false;
  1099. }
  1100. static int create_rqt(struct mlx5_vdpa_net *ndev)
  1101. {
  1102. int rqt_table_size = roundup_pow_of_two(ndev->rqt_size);
  1103. int act_sz = roundup_pow_of_two(ndev->cur_num_vqs / 2);
  1104. __be32 *list;
  1105. void *rqtc;
  1106. int inlen;
  1107. void *in;
  1108. int i, j;
  1109. int err;
  1110. inlen = MLX5_ST_SZ_BYTES(create_rqt_in) + rqt_table_size * MLX5_ST_SZ_BYTES(rq_num);
  1111. in = kzalloc(inlen, GFP_KERNEL);
  1112. if (!in)
  1113. return -ENOMEM;
  1114. MLX5_SET(create_rqt_in, in, uid, ndev->mvdev.res.uid);
  1115. rqtc = MLX5_ADDR_OF(create_rqt_in, in, rqt_context);
  1116. MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
  1117. MLX5_SET(rqtc, rqtc, rqt_max_size, rqt_table_size);
  1118. list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
  1119. for (i = 0, j = 0; i < act_sz; i++, j += 2)
  1120. list[i] = cpu_to_be32(ndev->vqs[j % ndev->cur_num_vqs].virtq_id);
  1121. MLX5_SET(rqtc, rqtc, rqt_actual_size, act_sz);
  1122. err = mlx5_vdpa_create_rqt(&ndev->mvdev, in, inlen, &ndev->res.rqtn);
  1123. kfree(in);
  1124. if (err)
  1125. return err;
  1126. return 0;
  1127. }
  1128. #define MLX5_MODIFY_RQT_NUM_RQS ((u64)1)
  1129. static int modify_rqt(struct mlx5_vdpa_net *ndev, int num)
  1130. {
  1131. int act_sz = roundup_pow_of_two(num / 2);
  1132. __be32 *list;
  1133. void *rqtc;
  1134. int inlen;
  1135. void *in;
  1136. int i, j;
  1137. int err;
  1138. inlen = MLX5_ST_SZ_BYTES(modify_rqt_in) + act_sz * MLX5_ST_SZ_BYTES(rq_num);
  1139. in = kzalloc(inlen, GFP_KERNEL);
  1140. if (!in)
  1141. return -ENOMEM;
  1142. MLX5_SET(modify_rqt_in, in, uid, ndev->mvdev.res.uid);
  1143. MLX5_SET64(modify_rqt_in, in, bitmask, MLX5_MODIFY_RQT_NUM_RQS);
  1144. rqtc = MLX5_ADDR_OF(modify_rqt_in, in, ctx);
  1145. MLX5_SET(rqtc, rqtc, list_q_type, MLX5_RQTC_LIST_Q_TYPE_VIRTIO_NET_Q);
  1146. list = MLX5_ADDR_OF(rqtc, rqtc, rq_num[0]);
  1147. for (i = 0, j = 0; i < act_sz; i++, j = j + 2)
  1148. list[i] = cpu_to_be32(ndev->vqs[j % num].virtq_id);
  1149. MLX5_SET(rqtc, rqtc, rqt_actual_size, act_sz);
  1150. err = mlx5_vdpa_modify_rqt(&ndev->mvdev, in, inlen, ndev->res.rqtn);
  1151. kfree(in);
  1152. if (err)
  1153. return err;
  1154. return 0;
  1155. }
  1156. static void destroy_rqt(struct mlx5_vdpa_net *ndev)
  1157. {
  1158. mlx5_vdpa_destroy_rqt(&ndev->mvdev, ndev->res.rqtn);
  1159. }
  1160. static int create_tir(struct mlx5_vdpa_net *ndev)
  1161. {
  1162. #define HASH_IP_L4PORTS \
  1163. (MLX5_HASH_FIELD_SEL_SRC_IP | MLX5_HASH_FIELD_SEL_DST_IP | MLX5_HASH_FIELD_SEL_L4_SPORT | \
  1164. MLX5_HASH_FIELD_SEL_L4_DPORT)
  1165. static const u8 rx_hash_toeplitz_key[] = { 0x2c, 0xc6, 0x81, 0xd1, 0x5b, 0xdb, 0xf4, 0xf7,
  1166. 0xfc, 0xa2, 0x83, 0x19, 0xdb, 0x1a, 0x3e, 0x94,
  1167. 0x6b, 0x9e, 0x38, 0xd9, 0x2c, 0x9c, 0x03, 0xd1,
  1168. 0xad, 0x99, 0x44, 0xa7, 0xd9, 0x56, 0x3d, 0x59,
  1169. 0x06, 0x3c, 0x25, 0xf3, 0xfc, 0x1f, 0xdc, 0x2a };
  1170. void *rss_key;
  1171. void *outer;
  1172. void *tirc;
  1173. void *in;
  1174. int err;
  1175. in = kzalloc(MLX5_ST_SZ_BYTES(create_tir_in), GFP_KERNEL);
  1176. if (!in)
  1177. return -ENOMEM;
  1178. MLX5_SET(create_tir_in, in, uid, ndev->mvdev.res.uid);
  1179. tirc = MLX5_ADDR_OF(create_tir_in, in, ctx);
  1180. MLX5_SET(tirc, tirc, disp_type, MLX5_TIRC_DISP_TYPE_INDIRECT);
  1181. MLX5_SET(tirc, tirc, rx_hash_symmetric, 1);
  1182. MLX5_SET(tirc, tirc, rx_hash_fn, MLX5_RX_HASH_FN_TOEPLITZ);
  1183. rss_key = MLX5_ADDR_OF(tirc, tirc, rx_hash_toeplitz_key);
  1184. memcpy(rss_key, rx_hash_toeplitz_key, sizeof(rx_hash_toeplitz_key));
  1185. outer = MLX5_ADDR_OF(tirc, tirc, rx_hash_field_selector_outer);
  1186. MLX5_SET(rx_hash_field_select, outer, l3_prot_type, MLX5_L3_PROT_TYPE_IPV4);
  1187. MLX5_SET(rx_hash_field_select, outer, l4_prot_type, MLX5_L4_PROT_TYPE_TCP);
  1188. MLX5_SET(rx_hash_field_select, outer, selected_fields, HASH_IP_L4PORTS);
  1189. MLX5_SET(tirc, tirc, indirect_table, ndev->res.rqtn);
  1190. MLX5_SET(tirc, tirc, transport_domain, ndev->res.tdn);
  1191. err = mlx5_vdpa_create_tir(&ndev->mvdev, in, &ndev->res.tirn);
  1192. kfree(in);
  1193. return err;
  1194. }
  1195. static void destroy_tir(struct mlx5_vdpa_net *ndev)
  1196. {
  1197. mlx5_vdpa_destroy_tir(&ndev->mvdev, ndev->res.tirn);
  1198. }
  1199. #define MAX_STEERING_ENT 0x8000
  1200. #define MAX_STEERING_GROUPS 2
  1201. static int mlx5_vdpa_add_mac_vlan_rules(struct mlx5_vdpa_net *ndev, u8 *mac,
  1202. u16 vid, bool tagged,
  1203. struct mlx5_flow_handle **ucast,
  1204. struct mlx5_flow_handle **mcast)
  1205. {
  1206. struct mlx5_flow_destination dest = {};
  1207. struct mlx5_flow_act flow_act = {};
  1208. struct mlx5_flow_handle *rule;
  1209. struct mlx5_flow_spec *spec;
  1210. void *headers_c;
  1211. void *headers_v;
  1212. u8 *dmac_c;
  1213. u8 *dmac_v;
  1214. int err;
  1215. spec = kvzalloc(sizeof(*spec), GFP_KERNEL);
  1216. if (!spec)
  1217. return -ENOMEM;
  1218. spec->match_criteria_enable = MLX5_MATCH_OUTER_HEADERS;
  1219. headers_c = MLX5_ADDR_OF(fte_match_param, spec->match_criteria, outer_headers);
  1220. headers_v = MLX5_ADDR_OF(fte_match_param, spec->match_value, outer_headers);
  1221. dmac_c = MLX5_ADDR_OF(fte_match_param, headers_c, outer_headers.dmac_47_16);
  1222. dmac_v = MLX5_ADDR_OF(fte_match_param, headers_v, outer_headers.dmac_47_16);
  1223. eth_broadcast_addr(dmac_c);
  1224. ether_addr_copy(dmac_v, mac);
  1225. if (ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VLAN)) {
  1226. MLX5_SET(fte_match_set_lyr_2_4, headers_c, cvlan_tag, 1);
  1227. MLX5_SET_TO_ONES(fte_match_set_lyr_2_4, headers_c, first_vid);
  1228. }
  1229. if (tagged) {
  1230. MLX5_SET(fte_match_set_lyr_2_4, headers_v, cvlan_tag, 1);
  1231. MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_vid, vid);
  1232. }
  1233. flow_act.action = MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
  1234. dest.type = MLX5_FLOW_DESTINATION_TYPE_TIR;
  1235. dest.tir_num = ndev->res.tirn;
  1236. rule = mlx5_add_flow_rules(ndev->rxft, spec, &flow_act, &dest, 1);
  1237. if (IS_ERR(rule))
  1238. return PTR_ERR(rule);
  1239. *ucast = rule;
  1240. memset(dmac_c, 0, ETH_ALEN);
  1241. memset(dmac_v, 0, ETH_ALEN);
  1242. dmac_c[0] = 1;
  1243. dmac_v[0] = 1;
  1244. rule = mlx5_add_flow_rules(ndev->rxft, spec, &flow_act, &dest, 1);
  1245. kvfree(spec);
  1246. if (IS_ERR(rule)) {
  1247. err = PTR_ERR(rule);
  1248. goto err_mcast;
  1249. }
  1250. *mcast = rule;
  1251. return 0;
  1252. err_mcast:
  1253. mlx5_del_flow_rules(*ucast);
  1254. return err;
  1255. }
  1256. static void mlx5_vdpa_del_mac_vlan_rules(struct mlx5_vdpa_net *ndev,
  1257. struct mlx5_flow_handle *ucast,
  1258. struct mlx5_flow_handle *mcast)
  1259. {
  1260. mlx5_del_flow_rules(ucast);
  1261. mlx5_del_flow_rules(mcast);
  1262. }
  1263. static u64 search_val(u8 *mac, u16 vlan, bool tagged)
  1264. {
  1265. u64 val;
  1266. if (!tagged)
  1267. vlan = MLX5V_UNTAGGED;
  1268. val = (u64)vlan << 48 |
  1269. (u64)mac[0] << 40 |
  1270. (u64)mac[1] << 32 |
  1271. (u64)mac[2] << 24 |
  1272. (u64)mac[3] << 16 |
  1273. (u64)mac[4] << 8 |
  1274. (u64)mac[5];
  1275. return val;
  1276. }
  1277. static struct macvlan_node *mac_vlan_lookup(struct mlx5_vdpa_net *ndev, u64 value)
  1278. {
  1279. struct macvlan_node *pos;
  1280. u32 idx;
  1281. idx = hash_64(value, 8); // tbd 8
  1282. hlist_for_each_entry(pos, &ndev->macvlan_hash[idx], hlist) {
  1283. if (pos->macvlan == value)
  1284. return pos;
  1285. }
  1286. return NULL;
  1287. }
  1288. static int mac_vlan_add(struct mlx5_vdpa_net *ndev, u8 *mac, u16 vlan, bool tagged) // vlan -> vid
  1289. {
  1290. struct macvlan_node *ptr;
  1291. u64 val;
  1292. u32 idx;
  1293. int err;
  1294. val = search_val(mac, vlan, tagged);
  1295. if (mac_vlan_lookup(ndev, val))
  1296. return -EEXIST;
  1297. ptr = kzalloc(sizeof(*ptr), GFP_KERNEL);
  1298. if (!ptr)
  1299. return -ENOMEM;
  1300. err = mlx5_vdpa_add_mac_vlan_rules(ndev, ndev->config.mac, vlan, tagged,
  1301. &ptr->ucast_rule, &ptr->mcast_rule);
  1302. if (err)
  1303. goto err_add;
  1304. ptr->macvlan = val;
  1305. idx = hash_64(val, 8);
  1306. hlist_add_head(&ptr->hlist, &ndev->macvlan_hash[idx]);
  1307. return 0;
  1308. err_add:
  1309. kfree(ptr);
  1310. return err;
  1311. }
  1312. static void mac_vlan_del(struct mlx5_vdpa_net *ndev, u8 *mac, u16 vlan, bool tagged)
  1313. {
  1314. struct macvlan_node *ptr;
  1315. ptr = mac_vlan_lookup(ndev, search_val(mac, vlan, tagged));
  1316. if (!ptr)
  1317. return;
  1318. hlist_del(&ptr->hlist);
  1319. mlx5_vdpa_del_mac_vlan_rules(ndev, ptr->ucast_rule, ptr->mcast_rule);
  1320. kfree(ptr);
  1321. }
  1322. static void clear_mac_vlan_table(struct mlx5_vdpa_net *ndev)
  1323. {
  1324. struct macvlan_node *pos;
  1325. struct hlist_node *n;
  1326. int i;
  1327. for (i = 0; i < MLX5V_MACVLAN_SIZE; i++) {
  1328. hlist_for_each_entry_safe(pos, n, &ndev->macvlan_hash[i], hlist) {
  1329. hlist_del(&pos->hlist);
  1330. mlx5_vdpa_del_mac_vlan_rules(ndev, pos->ucast_rule, pos->mcast_rule);
  1331. kfree(pos);
  1332. }
  1333. }
  1334. }
  1335. static int setup_steering(struct mlx5_vdpa_net *ndev)
  1336. {
  1337. struct mlx5_flow_table_attr ft_attr = {};
  1338. struct mlx5_flow_namespace *ns;
  1339. int err;
  1340. ft_attr.max_fte = MAX_STEERING_ENT;
  1341. ft_attr.autogroup.max_num_groups = MAX_STEERING_GROUPS;
  1342. ns = mlx5_get_flow_namespace(ndev->mvdev.mdev, MLX5_FLOW_NAMESPACE_BYPASS);
  1343. if (!ns) {
  1344. mlx5_vdpa_warn(&ndev->mvdev, "failed to get flow namespace\n");
  1345. return -EOPNOTSUPP;
  1346. }
  1347. ndev->rxft = mlx5_create_auto_grouped_flow_table(ns, &ft_attr);
  1348. if (IS_ERR(ndev->rxft)) {
  1349. mlx5_vdpa_warn(&ndev->mvdev, "failed to create flow table\n");
  1350. return PTR_ERR(ndev->rxft);
  1351. }
  1352. err = mac_vlan_add(ndev, ndev->config.mac, 0, false);
  1353. if (err)
  1354. goto err_add;
  1355. return 0;
  1356. err_add:
  1357. mlx5_destroy_flow_table(ndev->rxft);
  1358. return err;
  1359. }
  1360. static void teardown_steering(struct mlx5_vdpa_net *ndev)
  1361. {
  1362. clear_mac_vlan_table(ndev);
  1363. mlx5_destroy_flow_table(ndev->rxft);
  1364. }
  1365. static virtio_net_ctrl_ack handle_ctrl_mac(struct mlx5_vdpa_dev *mvdev, u8 cmd)
  1366. {
  1367. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1368. struct mlx5_control_vq *cvq = &mvdev->cvq;
  1369. virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
  1370. struct mlx5_core_dev *pfmdev;
  1371. size_t read;
  1372. u8 mac[ETH_ALEN], mac_back[ETH_ALEN];
  1373. pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
  1374. switch (cmd) {
  1375. case VIRTIO_NET_CTRL_MAC_ADDR_SET:
  1376. read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)mac, ETH_ALEN);
  1377. if (read != ETH_ALEN)
  1378. break;
  1379. if (!memcmp(ndev->config.mac, mac, 6)) {
  1380. status = VIRTIO_NET_OK;
  1381. break;
  1382. }
  1383. if (is_zero_ether_addr(mac))
  1384. break;
  1385. if (!is_zero_ether_addr(ndev->config.mac)) {
  1386. if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
  1387. mlx5_vdpa_warn(mvdev, "failed to delete old MAC %pM from MPFS table\n",
  1388. ndev->config.mac);
  1389. break;
  1390. }
  1391. }
  1392. if (mlx5_mpfs_add_mac(pfmdev, mac)) {
  1393. mlx5_vdpa_warn(mvdev, "failed to insert new MAC %pM into MPFS table\n",
  1394. mac);
  1395. break;
  1396. }
  1397. /* backup the original mac address so that if failed to add the forward rules
  1398. * we could restore it
  1399. */
  1400. memcpy(mac_back, ndev->config.mac, ETH_ALEN);
  1401. memcpy(ndev->config.mac, mac, ETH_ALEN);
  1402. /* Need recreate the flow table entry, so that the packet could forward back
  1403. */
  1404. mac_vlan_del(ndev, mac_back, 0, false);
  1405. if (mac_vlan_add(ndev, ndev->config.mac, 0, false)) {
  1406. mlx5_vdpa_warn(mvdev, "failed to insert forward rules, try to restore\n");
  1407. /* Although it hardly run here, we still need double check */
  1408. if (is_zero_ether_addr(mac_back)) {
  1409. mlx5_vdpa_warn(mvdev, "restore mac failed: Original MAC is zero\n");
  1410. break;
  1411. }
  1412. /* Try to restore original mac address to MFPS table, and try to restore
  1413. * the forward rule entry.
  1414. */
  1415. if (mlx5_mpfs_del_mac(pfmdev, ndev->config.mac)) {
  1416. mlx5_vdpa_warn(mvdev, "restore mac failed: delete MAC %pM from MPFS table failed\n",
  1417. ndev->config.mac);
  1418. }
  1419. if (mlx5_mpfs_add_mac(pfmdev, mac_back)) {
  1420. mlx5_vdpa_warn(mvdev, "restore mac failed: insert old MAC %pM into MPFS table failed\n",
  1421. mac_back);
  1422. }
  1423. memcpy(ndev->config.mac, mac_back, ETH_ALEN);
  1424. if (mac_vlan_add(ndev, ndev->config.mac, 0, false))
  1425. mlx5_vdpa_warn(mvdev, "restore forward rules failed: insert forward rules failed\n");
  1426. break;
  1427. }
  1428. status = VIRTIO_NET_OK;
  1429. break;
  1430. default:
  1431. break;
  1432. }
  1433. return status;
  1434. }
  1435. static int change_num_qps(struct mlx5_vdpa_dev *mvdev, int newqps)
  1436. {
  1437. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1438. int cur_qps = ndev->cur_num_vqs / 2;
  1439. int err;
  1440. int i;
  1441. if (cur_qps > newqps) {
  1442. err = modify_rqt(ndev, 2 * newqps);
  1443. if (err)
  1444. return err;
  1445. for (i = ndev->cur_num_vqs - 1; i >= 2 * newqps; i--)
  1446. teardown_vq(ndev, &ndev->vqs[i]);
  1447. ndev->cur_num_vqs = 2 * newqps;
  1448. } else {
  1449. ndev->cur_num_vqs = 2 * newqps;
  1450. for (i = cur_qps * 2; i < 2 * newqps; i++) {
  1451. err = setup_vq(ndev, &ndev->vqs[i]);
  1452. if (err)
  1453. goto clean_added;
  1454. }
  1455. err = modify_rqt(ndev, 2 * newqps);
  1456. if (err)
  1457. goto clean_added;
  1458. }
  1459. return 0;
  1460. clean_added:
  1461. for (--i; i >= 2 * cur_qps; --i)
  1462. teardown_vq(ndev, &ndev->vqs[i]);
  1463. ndev->cur_num_vqs = 2 * cur_qps;
  1464. return err;
  1465. }
  1466. static virtio_net_ctrl_ack handle_ctrl_mq(struct mlx5_vdpa_dev *mvdev, u8 cmd)
  1467. {
  1468. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1469. virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
  1470. struct mlx5_control_vq *cvq = &mvdev->cvq;
  1471. struct virtio_net_ctrl_mq mq;
  1472. size_t read;
  1473. u16 newqps;
  1474. switch (cmd) {
  1475. case VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET:
  1476. /* This mq feature check aligns with pre-existing userspace
  1477. * implementation.
  1478. *
  1479. * Without it, an untrusted driver could fake a multiqueue config
  1480. * request down to a non-mq device that may cause kernel to
  1481. * panic due to uninitialized resources for extra vqs. Even with
  1482. * a well behaving guest driver, it is not expected to allow
  1483. * changing the number of vqs on a non-mq device.
  1484. */
  1485. if (!MLX5_FEATURE(mvdev, VIRTIO_NET_F_MQ))
  1486. break;
  1487. read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, (void *)&mq, sizeof(mq));
  1488. if (read != sizeof(mq))
  1489. break;
  1490. newqps = mlx5vdpa16_to_cpu(mvdev, mq.virtqueue_pairs);
  1491. if (newqps < VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN ||
  1492. newqps > ndev->rqt_size)
  1493. break;
  1494. if (ndev->cur_num_vqs == 2 * newqps) {
  1495. status = VIRTIO_NET_OK;
  1496. break;
  1497. }
  1498. if (!change_num_qps(mvdev, newqps))
  1499. status = VIRTIO_NET_OK;
  1500. break;
  1501. default:
  1502. break;
  1503. }
  1504. return status;
  1505. }
  1506. static virtio_net_ctrl_ack handle_ctrl_vlan(struct mlx5_vdpa_dev *mvdev, u8 cmd)
  1507. {
  1508. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1509. virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
  1510. struct mlx5_control_vq *cvq = &mvdev->cvq;
  1511. __virtio16 vlan;
  1512. size_t read;
  1513. u16 id;
  1514. if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VLAN)))
  1515. return status;
  1516. switch (cmd) {
  1517. case VIRTIO_NET_CTRL_VLAN_ADD:
  1518. read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &vlan, sizeof(vlan));
  1519. if (read != sizeof(vlan))
  1520. break;
  1521. id = mlx5vdpa16_to_cpu(mvdev, vlan);
  1522. if (mac_vlan_add(ndev, ndev->config.mac, id, true))
  1523. break;
  1524. status = VIRTIO_NET_OK;
  1525. break;
  1526. case VIRTIO_NET_CTRL_VLAN_DEL:
  1527. read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &vlan, sizeof(vlan));
  1528. if (read != sizeof(vlan))
  1529. break;
  1530. id = mlx5vdpa16_to_cpu(mvdev, vlan);
  1531. mac_vlan_del(ndev, ndev->config.mac, id, true);
  1532. status = VIRTIO_NET_OK;
  1533. break;
  1534. default:
  1535. break;
  1536. }
  1537. return status;
  1538. }
  1539. static void mlx5_cvq_kick_handler(struct work_struct *work)
  1540. {
  1541. virtio_net_ctrl_ack status = VIRTIO_NET_ERR;
  1542. struct virtio_net_ctrl_hdr ctrl;
  1543. struct mlx5_vdpa_wq_ent *wqent;
  1544. struct mlx5_vdpa_dev *mvdev;
  1545. struct mlx5_control_vq *cvq;
  1546. struct mlx5_vdpa_net *ndev;
  1547. size_t read, write;
  1548. int err;
  1549. wqent = container_of(work, struct mlx5_vdpa_wq_ent, work);
  1550. mvdev = wqent->mvdev;
  1551. ndev = to_mlx5_vdpa_ndev(mvdev);
  1552. cvq = &mvdev->cvq;
  1553. down_write(&ndev->reslock);
  1554. if (!(mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK))
  1555. goto out;
  1556. if (!(ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
  1557. goto out;
  1558. if (!cvq->ready)
  1559. goto out;
  1560. while (true) {
  1561. err = vringh_getdesc_iotlb(&cvq->vring, &cvq->riov, &cvq->wiov, &cvq->head,
  1562. GFP_ATOMIC);
  1563. if (err <= 0)
  1564. break;
  1565. read = vringh_iov_pull_iotlb(&cvq->vring, &cvq->riov, &ctrl, sizeof(ctrl));
  1566. if (read != sizeof(ctrl))
  1567. break;
  1568. cvq->received_desc++;
  1569. switch (ctrl.class) {
  1570. case VIRTIO_NET_CTRL_MAC:
  1571. status = handle_ctrl_mac(mvdev, ctrl.cmd);
  1572. break;
  1573. case VIRTIO_NET_CTRL_MQ:
  1574. status = handle_ctrl_mq(mvdev, ctrl.cmd);
  1575. break;
  1576. case VIRTIO_NET_CTRL_VLAN:
  1577. status = handle_ctrl_vlan(mvdev, ctrl.cmd);
  1578. break;
  1579. default:
  1580. break;
  1581. }
  1582. /* Make sure data is written before advancing index */
  1583. smp_wmb();
  1584. write = vringh_iov_push_iotlb(&cvq->vring, &cvq->wiov, &status, sizeof(status));
  1585. vringh_complete_iotlb(&cvq->vring, cvq->head, write);
  1586. vringh_kiov_cleanup(&cvq->riov);
  1587. vringh_kiov_cleanup(&cvq->wiov);
  1588. if (vringh_need_notify_iotlb(&cvq->vring))
  1589. vringh_notify(&cvq->vring);
  1590. cvq->completed_desc++;
  1591. queue_work(mvdev->wq, &wqent->work);
  1592. break;
  1593. }
  1594. out:
  1595. up_write(&ndev->reslock);
  1596. }
  1597. static void mlx5_vdpa_kick_vq(struct vdpa_device *vdev, u16 idx)
  1598. {
  1599. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1600. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1601. struct mlx5_vdpa_virtqueue *mvq;
  1602. if (!is_index_valid(mvdev, idx))
  1603. return;
  1604. if (unlikely(is_ctrl_vq_idx(mvdev, idx))) {
  1605. if (!mvdev->wq || !mvdev->cvq.ready)
  1606. return;
  1607. queue_work(mvdev->wq, &ndev->cvq_ent.work);
  1608. return;
  1609. }
  1610. mvq = &ndev->vqs[idx];
  1611. if (unlikely(!mvq->ready))
  1612. return;
  1613. iowrite16(idx, ndev->mvdev.res.kick_addr);
  1614. }
  1615. static int mlx5_vdpa_set_vq_address(struct vdpa_device *vdev, u16 idx, u64 desc_area,
  1616. u64 driver_area, u64 device_area)
  1617. {
  1618. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1619. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1620. struct mlx5_vdpa_virtqueue *mvq;
  1621. if (!is_index_valid(mvdev, idx))
  1622. return -EINVAL;
  1623. if (is_ctrl_vq_idx(mvdev, idx)) {
  1624. mvdev->cvq.desc_addr = desc_area;
  1625. mvdev->cvq.device_addr = device_area;
  1626. mvdev->cvq.driver_addr = driver_area;
  1627. return 0;
  1628. }
  1629. mvq = &ndev->vqs[idx];
  1630. mvq->desc_addr = desc_area;
  1631. mvq->device_addr = device_area;
  1632. mvq->driver_addr = driver_area;
  1633. return 0;
  1634. }
  1635. static void mlx5_vdpa_set_vq_num(struct vdpa_device *vdev, u16 idx, u32 num)
  1636. {
  1637. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1638. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1639. struct mlx5_vdpa_virtqueue *mvq;
  1640. if (!is_index_valid(mvdev, idx) || is_ctrl_vq_idx(mvdev, idx))
  1641. return;
  1642. mvq = &ndev->vqs[idx];
  1643. mvq->num_ent = num;
  1644. }
  1645. static void mlx5_vdpa_set_vq_cb(struct vdpa_device *vdev, u16 idx, struct vdpa_callback *cb)
  1646. {
  1647. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1648. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1649. ndev->event_cbs[idx] = *cb;
  1650. if (is_ctrl_vq_idx(mvdev, idx))
  1651. mvdev->cvq.event_cb = *cb;
  1652. }
  1653. static void mlx5_cvq_notify(struct vringh *vring)
  1654. {
  1655. struct mlx5_control_vq *cvq = container_of(vring, struct mlx5_control_vq, vring);
  1656. if (!cvq->event_cb.callback)
  1657. return;
  1658. cvq->event_cb.callback(cvq->event_cb.private);
  1659. }
  1660. static void set_cvq_ready(struct mlx5_vdpa_dev *mvdev, bool ready)
  1661. {
  1662. struct mlx5_control_vq *cvq = &mvdev->cvq;
  1663. cvq->ready = ready;
  1664. if (!ready)
  1665. return;
  1666. cvq->vring.notify = mlx5_cvq_notify;
  1667. }
  1668. static void mlx5_vdpa_set_vq_ready(struct vdpa_device *vdev, u16 idx, bool ready)
  1669. {
  1670. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1671. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1672. struct mlx5_vdpa_virtqueue *mvq;
  1673. int err;
  1674. if (!mvdev->actual_features)
  1675. return;
  1676. if (!is_index_valid(mvdev, idx))
  1677. return;
  1678. if (is_ctrl_vq_idx(mvdev, idx)) {
  1679. set_cvq_ready(mvdev, ready);
  1680. return;
  1681. }
  1682. mvq = &ndev->vqs[idx];
  1683. if (!ready) {
  1684. suspend_vq(ndev, mvq);
  1685. } else {
  1686. err = modify_virtqueue(ndev, mvq, MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY);
  1687. if (err) {
  1688. mlx5_vdpa_warn(mvdev, "modify VQ %d to ready failed (%d)\n", idx, err);
  1689. ready = false;
  1690. }
  1691. }
  1692. mvq->ready = ready;
  1693. }
  1694. static bool mlx5_vdpa_get_vq_ready(struct vdpa_device *vdev, u16 idx)
  1695. {
  1696. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1697. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1698. if (!is_index_valid(mvdev, idx))
  1699. return false;
  1700. if (is_ctrl_vq_idx(mvdev, idx))
  1701. return mvdev->cvq.ready;
  1702. return ndev->vqs[idx].ready;
  1703. }
  1704. static int mlx5_vdpa_set_vq_state(struct vdpa_device *vdev, u16 idx,
  1705. const struct vdpa_vq_state *state)
  1706. {
  1707. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1708. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1709. struct mlx5_vdpa_virtqueue *mvq;
  1710. if (!is_index_valid(mvdev, idx))
  1711. return -EINVAL;
  1712. if (is_ctrl_vq_idx(mvdev, idx)) {
  1713. mvdev->cvq.vring.last_avail_idx = state->split.avail_index;
  1714. return 0;
  1715. }
  1716. mvq = &ndev->vqs[idx];
  1717. if (mvq->fw_state == MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY) {
  1718. mlx5_vdpa_warn(mvdev, "can't modify available index\n");
  1719. return -EINVAL;
  1720. }
  1721. mvq->used_idx = state->split.avail_index;
  1722. mvq->avail_idx = state->split.avail_index;
  1723. return 0;
  1724. }
  1725. static int mlx5_vdpa_get_vq_state(struct vdpa_device *vdev, u16 idx, struct vdpa_vq_state *state)
  1726. {
  1727. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1728. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1729. struct mlx5_vdpa_virtqueue *mvq;
  1730. struct mlx5_virtq_attr attr;
  1731. int err;
  1732. if (!is_index_valid(mvdev, idx))
  1733. return -EINVAL;
  1734. if (is_ctrl_vq_idx(mvdev, idx)) {
  1735. state->split.avail_index = mvdev->cvq.vring.last_avail_idx;
  1736. return 0;
  1737. }
  1738. mvq = &ndev->vqs[idx];
  1739. /* If the virtq object was destroyed, use the value saved at
  1740. * the last minute of suspend_vq. This caters for userspace
  1741. * that cares about emulating the index after vq is stopped.
  1742. */
  1743. if (!mvq->initialized) {
  1744. /* Firmware returns a wrong value for the available index.
  1745. * Since both values should be identical, we take the value of
  1746. * used_idx which is reported correctly.
  1747. */
  1748. state->split.avail_index = mvq->used_idx;
  1749. return 0;
  1750. }
  1751. err = query_virtqueue(ndev, mvq, &attr);
  1752. if (err) {
  1753. mlx5_vdpa_warn(mvdev, "failed to query virtqueue\n");
  1754. return err;
  1755. }
  1756. state->split.avail_index = attr.used_index;
  1757. return 0;
  1758. }
  1759. static u32 mlx5_vdpa_get_vq_align(struct vdpa_device *vdev)
  1760. {
  1761. return PAGE_SIZE;
  1762. }
  1763. static u32 mlx5_vdpa_get_vq_group(struct vdpa_device *vdev, u16 idx)
  1764. {
  1765. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1766. if (is_ctrl_vq_idx(mvdev, idx))
  1767. return MLX5_VDPA_CVQ_GROUP;
  1768. return MLX5_VDPA_DATAVQ_GROUP;
  1769. }
  1770. enum { MLX5_VIRTIO_NET_F_GUEST_CSUM = 1 << 9,
  1771. MLX5_VIRTIO_NET_F_CSUM = 1 << 10,
  1772. MLX5_VIRTIO_NET_F_HOST_TSO6 = 1 << 11,
  1773. MLX5_VIRTIO_NET_F_HOST_TSO4 = 1 << 12,
  1774. };
  1775. static u64 mlx_to_vritio_features(u16 dev_features)
  1776. {
  1777. u64 result = 0;
  1778. if (dev_features & MLX5_VIRTIO_NET_F_GUEST_CSUM)
  1779. result |= BIT_ULL(VIRTIO_NET_F_GUEST_CSUM);
  1780. if (dev_features & MLX5_VIRTIO_NET_F_CSUM)
  1781. result |= BIT_ULL(VIRTIO_NET_F_CSUM);
  1782. if (dev_features & MLX5_VIRTIO_NET_F_HOST_TSO6)
  1783. result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO6);
  1784. if (dev_features & MLX5_VIRTIO_NET_F_HOST_TSO4)
  1785. result |= BIT_ULL(VIRTIO_NET_F_HOST_TSO4);
  1786. return result;
  1787. }
  1788. static u64 get_supported_features(struct mlx5_core_dev *mdev)
  1789. {
  1790. u64 mlx_vdpa_features = 0;
  1791. u16 dev_features;
  1792. dev_features = MLX5_CAP_DEV_VDPA_EMULATION(mdev, device_features_bits_mask);
  1793. mlx_vdpa_features |= mlx_to_vritio_features(dev_features);
  1794. if (MLX5_CAP_DEV_VDPA_EMULATION(mdev, virtio_version_1_0))
  1795. mlx_vdpa_features |= BIT_ULL(VIRTIO_F_VERSION_1);
  1796. mlx_vdpa_features |= BIT_ULL(VIRTIO_F_ACCESS_PLATFORM);
  1797. mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_CTRL_VQ);
  1798. mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_CTRL_MAC_ADDR);
  1799. mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_MQ);
  1800. mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_STATUS);
  1801. mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_MTU);
  1802. mlx_vdpa_features |= BIT_ULL(VIRTIO_NET_F_CTRL_VLAN);
  1803. return mlx_vdpa_features;
  1804. }
  1805. static u64 mlx5_vdpa_get_device_features(struct vdpa_device *vdev)
  1806. {
  1807. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1808. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1809. print_features(mvdev, ndev->mvdev.mlx_features, false);
  1810. return ndev->mvdev.mlx_features;
  1811. }
  1812. static int verify_driver_features(struct mlx5_vdpa_dev *mvdev, u64 features)
  1813. {
  1814. /* Minimum features to expect */
  1815. if (!(features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM)))
  1816. return -EOPNOTSUPP;
  1817. /* Double check features combination sent down by the driver.
  1818. * Fail invalid features due to absence of the depended feature.
  1819. *
  1820. * Per VIRTIO v1.1 specification, section 5.1.3.1 Feature bit
  1821. * requirements: "VIRTIO_NET_F_MQ Requires VIRTIO_NET_F_CTRL_VQ".
  1822. * By failing the invalid features sent down by untrusted drivers,
  1823. * we're assured the assumption made upon is_index_valid() and
  1824. * is_ctrl_vq_idx() will not be compromised.
  1825. */
  1826. if ((features & (BIT_ULL(VIRTIO_NET_F_MQ) | BIT_ULL(VIRTIO_NET_F_CTRL_VQ))) ==
  1827. BIT_ULL(VIRTIO_NET_F_MQ))
  1828. return -EINVAL;
  1829. return 0;
  1830. }
  1831. static int setup_virtqueues(struct mlx5_vdpa_dev *mvdev)
  1832. {
  1833. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1834. int err;
  1835. int i;
  1836. for (i = 0; i < mvdev->max_vqs; i++) {
  1837. err = setup_vq(ndev, &ndev->vqs[i]);
  1838. if (err)
  1839. goto err_vq;
  1840. }
  1841. return 0;
  1842. err_vq:
  1843. for (--i; i >= 0; i--)
  1844. teardown_vq(ndev, &ndev->vqs[i]);
  1845. return err;
  1846. }
  1847. static void teardown_virtqueues(struct mlx5_vdpa_net *ndev)
  1848. {
  1849. struct mlx5_vdpa_virtqueue *mvq;
  1850. int i;
  1851. for (i = ndev->mvdev.max_vqs - 1; i >= 0; i--) {
  1852. mvq = &ndev->vqs[i];
  1853. if (!mvq->initialized)
  1854. continue;
  1855. teardown_vq(ndev, mvq);
  1856. }
  1857. }
  1858. static void update_cvq_info(struct mlx5_vdpa_dev *mvdev)
  1859. {
  1860. if (MLX5_FEATURE(mvdev, VIRTIO_NET_F_CTRL_VQ)) {
  1861. if (MLX5_FEATURE(mvdev, VIRTIO_NET_F_MQ)) {
  1862. /* MQ supported. CVQ index is right above the last data virtqueue's */
  1863. mvdev->max_idx = mvdev->max_vqs;
  1864. } else {
  1865. /* Only CVQ supportted. data virtqueues occupy indices 0 and 1.
  1866. * CVQ gets index 2
  1867. */
  1868. mvdev->max_idx = 2;
  1869. }
  1870. } else {
  1871. /* Two data virtqueues only: one for rx and one for tx */
  1872. mvdev->max_idx = 1;
  1873. }
  1874. }
  1875. static int mlx5_vdpa_set_driver_features(struct vdpa_device *vdev, u64 features)
  1876. {
  1877. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1878. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1879. int err;
  1880. print_features(mvdev, features, true);
  1881. err = verify_driver_features(mvdev, features);
  1882. if (err)
  1883. return err;
  1884. ndev->mvdev.actual_features = features & ndev->mvdev.mlx_features;
  1885. if (ndev->mvdev.actual_features & BIT_ULL(VIRTIO_NET_F_MQ))
  1886. ndev->rqt_size = mlx5vdpa16_to_cpu(mvdev, ndev->config.max_virtqueue_pairs);
  1887. else
  1888. ndev->rqt_size = 1;
  1889. ndev->cur_num_vqs = 2 * ndev->rqt_size;
  1890. update_cvq_info(mvdev);
  1891. return err;
  1892. }
  1893. static void mlx5_vdpa_set_config_cb(struct vdpa_device *vdev, struct vdpa_callback *cb)
  1894. {
  1895. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1896. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1897. ndev->config_cb = *cb;
  1898. }
  1899. #define MLX5_VDPA_MAX_VQ_ENTRIES 256
  1900. static u16 mlx5_vdpa_get_vq_num_max(struct vdpa_device *vdev)
  1901. {
  1902. return MLX5_VDPA_MAX_VQ_ENTRIES;
  1903. }
  1904. static u32 mlx5_vdpa_get_device_id(struct vdpa_device *vdev)
  1905. {
  1906. return VIRTIO_ID_NET;
  1907. }
  1908. static u32 mlx5_vdpa_get_vendor_id(struct vdpa_device *vdev)
  1909. {
  1910. return PCI_VENDOR_ID_MELLANOX;
  1911. }
  1912. static u8 mlx5_vdpa_get_status(struct vdpa_device *vdev)
  1913. {
  1914. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  1915. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1916. print_status(mvdev, ndev->mvdev.status, false);
  1917. return ndev->mvdev.status;
  1918. }
  1919. static int save_channel_info(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq)
  1920. {
  1921. struct mlx5_vq_restore_info *ri = &mvq->ri;
  1922. struct mlx5_virtq_attr attr = {};
  1923. int err;
  1924. if (mvq->initialized) {
  1925. err = query_virtqueue(ndev, mvq, &attr);
  1926. if (err)
  1927. return err;
  1928. }
  1929. ri->avail_index = attr.available_index;
  1930. ri->used_index = attr.used_index;
  1931. ri->ready = mvq->ready;
  1932. ri->num_ent = mvq->num_ent;
  1933. ri->desc_addr = mvq->desc_addr;
  1934. ri->device_addr = mvq->device_addr;
  1935. ri->driver_addr = mvq->driver_addr;
  1936. ri->restore = true;
  1937. return 0;
  1938. }
  1939. static int save_channels_info(struct mlx5_vdpa_net *ndev)
  1940. {
  1941. int i;
  1942. for (i = 0; i < ndev->mvdev.max_vqs; i++) {
  1943. memset(&ndev->vqs[i].ri, 0, sizeof(ndev->vqs[i].ri));
  1944. save_channel_info(ndev, &ndev->vqs[i]);
  1945. }
  1946. return 0;
  1947. }
  1948. static void mlx5_clear_vqs(struct mlx5_vdpa_net *ndev)
  1949. {
  1950. int i;
  1951. for (i = 0; i < ndev->mvdev.max_vqs; i++)
  1952. memset(&ndev->vqs[i], 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
  1953. }
  1954. static void restore_channels_info(struct mlx5_vdpa_net *ndev)
  1955. {
  1956. struct mlx5_vdpa_virtqueue *mvq;
  1957. struct mlx5_vq_restore_info *ri;
  1958. int i;
  1959. mlx5_clear_vqs(ndev);
  1960. init_mvqs(ndev);
  1961. for (i = 0; i < ndev->mvdev.max_vqs; i++) {
  1962. mvq = &ndev->vqs[i];
  1963. ri = &mvq->ri;
  1964. if (!ri->restore)
  1965. continue;
  1966. mvq->avail_idx = ri->avail_index;
  1967. mvq->used_idx = ri->used_index;
  1968. mvq->ready = ri->ready;
  1969. mvq->num_ent = ri->num_ent;
  1970. mvq->desc_addr = ri->desc_addr;
  1971. mvq->device_addr = ri->device_addr;
  1972. mvq->driver_addr = ri->driver_addr;
  1973. }
  1974. }
  1975. static int mlx5_vdpa_change_map(struct mlx5_vdpa_dev *mvdev,
  1976. struct vhost_iotlb *iotlb, unsigned int asid)
  1977. {
  1978. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  1979. int err;
  1980. suspend_vqs(ndev);
  1981. err = save_channels_info(ndev);
  1982. if (err)
  1983. goto err_mr;
  1984. teardown_driver(ndev);
  1985. mlx5_vdpa_destroy_mr_asid(mvdev, asid);
  1986. err = mlx5_vdpa_create_mr(mvdev, iotlb, asid);
  1987. if (err)
  1988. goto err_mr;
  1989. if (!(mvdev->status & VIRTIO_CONFIG_S_DRIVER_OK) || mvdev->suspended)
  1990. goto err_mr;
  1991. restore_channels_info(ndev);
  1992. err = setup_driver(mvdev);
  1993. if (err)
  1994. goto err_setup;
  1995. return 0;
  1996. err_setup:
  1997. mlx5_vdpa_destroy_mr_asid(mvdev, asid);
  1998. err_mr:
  1999. return err;
  2000. }
  2001. /* reslock must be held for this function */
  2002. static int setup_driver(struct mlx5_vdpa_dev *mvdev)
  2003. {
  2004. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2005. int err;
  2006. WARN_ON(!rwsem_is_locked(&ndev->reslock));
  2007. if (ndev->setup) {
  2008. mlx5_vdpa_warn(mvdev, "setup driver called for already setup driver\n");
  2009. err = 0;
  2010. goto out;
  2011. }
  2012. err = setup_virtqueues(mvdev);
  2013. if (err) {
  2014. mlx5_vdpa_warn(mvdev, "setup_virtqueues\n");
  2015. goto out;
  2016. }
  2017. err = create_rqt(ndev);
  2018. if (err) {
  2019. mlx5_vdpa_warn(mvdev, "create_rqt\n");
  2020. goto err_rqt;
  2021. }
  2022. err = create_tir(ndev);
  2023. if (err) {
  2024. mlx5_vdpa_warn(mvdev, "create_tir\n");
  2025. goto err_tir;
  2026. }
  2027. err = setup_steering(ndev);
  2028. if (err) {
  2029. mlx5_vdpa_warn(mvdev, "setup_steering\n");
  2030. goto err_fwd;
  2031. }
  2032. ndev->setup = true;
  2033. return 0;
  2034. err_fwd:
  2035. destroy_tir(ndev);
  2036. err_tir:
  2037. destroy_rqt(ndev);
  2038. err_rqt:
  2039. teardown_virtqueues(ndev);
  2040. out:
  2041. return err;
  2042. }
  2043. /* reslock must be held for this function */
  2044. static void teardown_driver(struct mlx5_vdpa_net *ndev)
  2045. {
  2046. WARN_ON(!rwsem_is_locked(&ndev->reslock));
  2047. if (!ndev->setup)
  2048. return;
  2049. teardown_steering(ndev);
  2050. destroy_tir(ndev);
  2051. destroy_rqt(ndev);
  2052. teardown_virtqueues(ndev);
  2053. ndev->setup = false;
  2054. }
  2055. static void clear_vqs_ready(struct mlx5_vdpa_net *ndev)
  2056. {
  2057. int i;
  2058. for (i = 0; i < ndev->mvdev.max_vqs; i++)
  2059. ndev->vqs[i].ready = false;
  2060. ndev->mvdev.cvq.ready = false;
  2061. }
  2062. static int setup_cvq_vring(struct mlx5_vdpa_dev *mvdev)
  2063. {
  2064. struct mlx5_control_vq *cvq = &mvdev->cvq;
  2065. int err = 0;
  2066. if (mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)) {
  2067. u16 idx = cvq->vring.last_avail_idx;
  2068. err = vringh_init_iotlb(&cvq->vring, mvdev->actual_features,
  2069. MLX5_CVQ_MAX_ENT, false,
  2070. (struct vring_desc *)(uintptr_t)cvq->desc_addr,
  2071. (struct vring_avail *)(uintptr_t)cvq->driver_addr,
  2072. (struct vring_used *)(uintptr_t)cvq->device_addr);
  2073. if (!err)
  2074. cvq->vring.last_avail_idx = cvq->vring.last_used_idx = idx;
  2075. }
  2076. return err;
  2077. }
  2078. static void mlx5_vdpa_set_status(struct vdpa_device *vdev, u8 status)
  2079. {
  2080. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2081. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2082. int err;
  2083. print_status(mvdev, status, true);
  2084. down_write(&ndev->reslock);
  2085. if ((status ^ ndev->mvdev.status) & VIRTIO_CONFIG_S_DRIVER_OK) {
  2086. if (status & VIRTIO_CONFIG_S_DRIVER_OK) {
  2087. err = setup_cvq_vring(mvdev);
  2088. if (err) {
  2089. mlx5_vdpa_warn(mvdev, "failed to setup control VQ vring\n");
  2090. goto err_setup;
  2091. }
  2092. err = setup_driver(mvdev);
  2093. if (err) {
  2094. mlx5_vdpa_warn(mvdev, "failed to setup driver\n");
  2095. goto err_setup;
  2096. }
  2097. } else {
  2098. mlx5_vdpa_warn(mvdev, "did not expect DRIVER_OK to be cleared\n");
  2099. goto err_clear;
  2100. }
  2101. }
  2102. ndev->mvdev.status = status;
  2103. up_write(&ndev->reslock);
  2104. return;
  2105. err_setup:
  2106. mlx5_vdpa_destroy_mr(&ndev->mvdev);
  2107. ndev->mvdev.status |= VIRTIO_CONFIG_S_FAILED;
  2108. err_clear:
  2109. up_write(&ndev->reslock);
  2110. }
  2111. static void init_group_to_asid_map(struct mlx5_vdpa_dev *mvdev)
  2112. {
  2113. int i;
  2114. /* default mapping all groups are mapped to asid 0 */
  2115. for (i = 0; i < MLX5_VDPA_NUMVQ_GROUPS; i++)
  2116. mvdev->group2asid[i] = 0;
  2117. }
  2118. static int mlx5_vdpa_reset(struct vdpa_device *vdev)
  2119. {
  2120. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2121. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2122. print_status(mvdev, 0, true);
  2123. mlx5_vdpa_info(mvdev, "performing device reset\n");
  2124. down_write(&ndev->reslock);
  2125. teardown_driver(ndev);
  2126. clear_vqs_ready(ndev);
  2127. mlx5_vdpa_destroy_mr(&ndev->mvdev);
  2128. ndev->mvdev.status = 0;
  2129. ndev->mvdev.suspended = false;
  2130. ndev->cur_num_vqs = 0;
  2131. ndev->mvdev.cvq.received_desc = 0;
  2132. ndev->mvdev.cvq.completed_desc = 0;
  2133. memset(ndev->event_cbs, 0, sizeof(*ndev->event_cbs) * (mvdev->max_vqs + 1));
  2134. ndev->mvdev.actual_features = 0;
  2135. init_group_to_asid_map(mvdev);
  2136. ++mvdev->generation;
  2137. if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
  2138. if (mlx5_vdpa_create_mr(mvdev, NULL, 0))
  2139. mlx5_vdpa_warn(mvdev, "create MR failed\n");
  2140. }
  2141. up_write(&ndev->reslock);
  2142. return 0;
  2143. }
  2144. static size_t mlx5_vdpa_get_config_size(struct vdpa_device *vdev)
  2145. {
  2146. return sizeof(struct virtio_net_config);
  2147. }
  2148. static void mlx5_vdpa_get_config(struct vdpa_device *vdev, unsigned int offset, void *buf,
  2149. unsigned int len)
  2150. {
  2151. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2152. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2153. if (offset + len <= sizeof(struct virtio_net_config))
  2154. memcpy(buf, (u8 *)&ndev->config + offset, len);
  2155. }
  2156. static void mlx5_vdpa_set_config(struct vdpa_device *vdev, unsigned int offset, const void *buf,
  2157. unsigned int len)
  2158. {
  2159. /* not supported */
  2160. }
  2161. static u32 mlx5_vdpa_get_generation(struct vdpa_device *vdev)
  2162. {
  2163. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2164. return mvdev->generation;
  2165. }
  2166. static int set_map_data(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb,
  2167. unsigned int asid)
  2168. {
  2169. bool change_map;
  2170. int err;
  2171. err = mlx5_vdpa_handle_set_map(mvdev, iotlb, &change_map, asid);
  2172. if (err) {
  2173. mlx5_vdpa_warn(mvdev, "set map failed(%d)\n", err);
  2174. return err;
  2175. }
  2176. if (change_map)
  2177. err = mlx5_vdpa_change_map(mvdev, iotlb, asid);
  2178. return err;
  2179. }
  2180. static int mlx5_vdpa_set_map(struct vdpa_device *vdev, unsigned int asid,
  2181. struct vhost_iotlb *iotlb)
  2182. {
  2183. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2184. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2185. int err = -EINVAL;
  2186. down_write(&ndev->reslock);
  2187. err = set_map_data(mvdev, iotlb, asid);
  2188. up_write(&ndev->reslock);
  2189. return err;
  2190. }
  2191. static void mlx5_vdpa_free(struct vdpa_device *vdev)
  2192. {
  2193. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2194. struct mlx5_core_dev *pfmdev;
  2195. struct mlx5_vdpa_net *ndev;
  2196. ndev = to_mlx5_vdpa_ndev(mvdev);
  2197. free_resources(ndev);
  2198. mlx5_vdpa_destroy_mr(mvdev);
  2199. if (!is_zero_ether_addr(ndev->config.mac)) {
  2200. pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
  2201. mlx5_mpfs_del_mac(pfmdev, ndev->config.mac);
  2202. }
  2203. mlx5_vdpa_free_resources(&ndev->mvdev);
  2204. kfree(ndev->event_cbs);
  2205. kfree(ndev->vqs);
  2206. }
  2207. static struct vdpa_notification_area mlx5_get_vq_notification(struct vdpa_device *vdev, u16 idx)
  2208. {
  2209. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2210. struct vdpa_notification_area ret = {};
  2211. struct mlx5_vdpa_net *ndev;
  2212. phys_addr_t addr;
  2213. if (!is_index_valid(mvdev, idx) || is_ctrl_vq_idx(mvdev, idx))
  2214. return ret;
  2215. /* If SF BAR size is smaller than PAGE_SIZE, do not use direct
  2216. * notification to avoid the risk of mapping pages that contain BAR of more
  2217. * than one SF
  2218. */
  2219. if (MLX5_CAP_GEN(mvdev->mdev, log_min_sf_size) + 12 < PAGE_SHIFT)
  2220. return ret;
  2221. ndev = to_mlx5_vdpa_ndev(mvdev);
  2222. addr = (phys_addr_t)ndev->mvdev.res.phys_kick_addr;
  2223. ret.addr = addr;
  2224. ret.size = PAGE_SIZE;
  2225. return ret;
  2226. }
  2227. static int mlx5_get_vq_irq(struct vdpa_device *vdv, u16 idx)
  2228. {
  2229. return -EOPNOTSUPP;
  2230. }
  2231. static u64 mlx5_vdpa_get_driver_features(struct vdpa_device *vdev)
  2232. {
  2233. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2234. return mvdev->actual_features;
  2235. }
  2236. static int counter_set_query(struct mlx5_vdpa_net *ndev, struct mlx5_vdpa_virtqueue *mvq,
  2237. u64 *received_desc, u64 *completed_desc)
  2238. {
  2239. u32 in[MLX5_ST_SZ_DW(query_virtio_q_counters_in)] = {};
  2240. u32 out[MLX5_ST_SZ_DW(query_virtio_q_counters_out)] = {};
  2241. void *cmd_hdr;
  2242. void *ctx;
  2243. int err;
  2244. if (!counters_supported(&ndev->mvdev))
  2245. return -EOPNOTSUPP;
  2246. if (mvq->fw_state != MLX5_VIRTIO_NET_Q_OBJECT_STATE_RDY)
  2247. return -EAGAIN;
  2248. cmd_hdr = MLX5_ADDR_OF(query_virtio_q_counters_in, in, hdr);
  2249. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, opcode, MLX5_CMD_OP_QUERY_GENERAL_OBJECT);
  2250. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_type, MLX5_OBJ_TYPE_VIRTIO_Q_COUNTERS);
  2251. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, uid, ndev->mvdev.res.uid);
  2252. MLX5_SET(general_obj_in_cmd_hdr, cmd_hdr, obj_id, mvq->counter_set_id);
  2253. err = mlx5_cmd_exec(ndev->mvdev.mdev, in, sizeof(in), out, sizeof(out));
  2254. if (err)
  2255. return err;
  2256. ctx = MLX5_ADDR_OF(query_virtio_q_counters_out, out, counters);
  2257. *received_desc = MLX5_GET64(virtio_q_counters, ctx, received_desc);
  2258. *completed_desc = MLX5_GET64(virtio_q_counters, ctx, completed_desc);
  2259. return 0;
  2260. }
  2261. static int mlx5_vdpa_get_vendor_vq_stats(struct vdpa_device *vdev, u16 idx,
  2262. struct sk_buff *msg,
  2263. struct netlink_ext_ack *extack)
  2264. {
  2265. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2266. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2267. struct mlx5_vdpa_virtqueue *mvq;
  2268. struct mlx5_control_vq *cvq;
  2269. u64 received_desc;
  2270. u64 completed_desc;
  2271. int err = 0;
  2272. down_read(&ndev->reslock);
  2273. if (!is_index_valid(mvdev, idx)) {
  2274. NL_SET_ERR_MSG_MOD(extack, "virtqueue index is not valid");
  2275. err = -EINVAL;
  2276. goto out_err;
  2277. }
  2278. if (idx == ctrl_vq_idx(mvdev)) {
  2279. cvq = &mvdev->cvq;
  2280. received_desc = cvq->received_desc;
  2281. completed_desc = cvq->completed_desc;
  2282. goto out;
  2283. }
  2284. mvq = &ndev->vqs[idx];
  2285. err = counter_set_query(ndev, mvq, &received_desc, &completed_desc);
  2286. if (err) {
  2287. NL_SET_ERR_MSG_MOD(extack, "failed to query hardware");
  2288. goto out_err;
  2289. }
  2290. out:
  2291. err = -EMSGSIZE;
  2292. if (nla_put_string(msg, VDPA_ATTR_DEV_VENDOR_ATTR_NAME, "received_desc"))
  2293. goto out_err;
  2294. if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_VENDOR_ATTR_VALUE, received_desc,
  2295. VDPA_ATTR_PAD))
  2296. goto out_err;
  2297. if (nla_put_string(msg, VDPA_ATTR_DEV_VENDOR_ATTR_NAME, "completed_desc"))
  2298. goto out_err;
  2299. if (nla_put_u64_64bit(msg, VDPA_ATTR_DEV_VENDOR_ATTR_VALUE, completed_desc,
  2300. VDPA_ATTR_PAD))
  2301. goto out_err;
  2302. err = 0;
  2303. out_err:
  2304. up_read(&ndev->reslock);
  2305. return err;
  2306. }
  2307. static void mlx5_vdpa_cvq_suspend(struct mlx5_vdpa_dev *mvdev)
  2308. {
  2309. struct mlx5_control_vq *cvq;
  2310. if (!(mvdev->actual_features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
  2311. return;
  2312. cvq = &mvdev->cvq;
  2313. cvq->ready = false;
  2314. }
  2315. static int mlx5_vdpa_suspend(struct vdpa_device *vdev)
  2316. {
  2317. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2318. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2319. struct mlx5_vdpa_virtqueue *mvq;
  2320. int i;
  2321. mlx5_vdpa_info(mvdev, "suspending device\n");
  2322. down_write(&ndev->reslock);
  2323. ndev->nb_registered = false;
  2324. mlx5_notifier_unregister(mvdev->mdev, &ndev->nb);
  2325. flush_workqueue(ndev->mvdev.wq);
  2326. for (i = 0; i < ndev->cur_num_vqs; i++) {
  2327. mvq = &ndev->vqs[i];
  2328. suspend_vq(ndev, mvq);
  2329. }
  2330. mlx5_vdpa_cvq_suspend(mvdev);
  2331. mvdev->suspended = true;
  2332. up_write(&ndev->reslock);
  2333. return 0;
  2334. }
  2335. static int mlx5_set_group_asid(struct vdpa_device *vdev, u32 group,
  2336. unsigned int asid)
  2337. {
  2338. struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
  2339. if (group >= MLX5_VDPA_NUMVQ_GROUPS)
  2340. return -EINVAL;
  2341. mvdev->group2asid[group] = asid;
  2342. return 0;
  2343. }
  2344. static const struct vdpa_config_ops mlx5_vdpa_ops = {
  2345. .set_vq_address = mlx5_vdpa_set_vq_address,
  2346. .set_vq_num = mlx5_vdpa_set_vq_num,
  2347. .kick_vq = mlx5_vdpa_kick_vq,
  2348. .set_vq_cb = mlx5_vdpa_set_vq_cb,
  2349. .set_vq_ready = mlx5_vdpa_set_vq_ready,
  2350. .get_vq_ready = mlx5_vdpa_get_vq_ready,
  2351. .set_vq_state = mlx5_vdpa_set_vq_state,
  2352. .get_vq_state = mlx5_vdpa_get_vq_state,
  2353. .get_vendor_vq_stats = mlx5_vdpa_get_vendor_vq_stats,
  2354. .get_vq_notification = mlx5_get_vq_notification,
  2355. .get_vq_irq = mlx5_get_vq_irq,
  2356. .get_vq_align = mlx5_vdpa_get_vq_align,
  2357. .get_vq_group = mlx5_vdpa_get_vq_group,
  2358. .get_device_features = mlx5_vdpa_get_device_features,
  2359. .set_driver_features = mlx5_vdpa_set_driver_features,
  2360. .get_driver_features = mlx5_vdpa_get_driver_features,
  2361. .set_config_cb = mlx5_vdpa_set_config_cb,
  2362. .get_vq_num_max = mlx5_vdpa_get_vq_num_max,
  2363. .get_device_id = mlx5_vdpa_get_device_id,
  2364. .get_vendor_id = mlx5_vdpa_get_vendor_id,
  2365. .get_status = mlx5_vdpa_get_status,
  2366. .set_status = mlx5_vdpa_set_status,
  2367. .reset = mlx5_vdpa_reset,
  2368. .get_config_size = mlx5_vdpa_get_config_size,
  2369. .get_config = mlx5_vdpa_get_config,
  2370. .set_config = mlx5_vdpa_set_config,
  2371. .get_generation = mlx5_vdpa_get_generation,
  2372. .set_map = mlx5_vdpa_set_map,
  2373. .set_group_asid = mlx5_set_group_asid,
  2374. .free = mlx5_vdpa_free,
  2375. .suspend = mlx5_vdpa_suspend,
  2376. };
  2377. static int query_mtu(struct mlx5_core_dev *mdev, u16 *mtu)
  2378. {
  2379. u16 hw_mtu;
  2380. int err;
  2381. err = mlx5_query_nic_vport_mtu(mdev, &hw_mtu);
  2382. if (err)
  2383. return err;
  2384. *mtu = hw_mtu - MLX5V_ETH_HARD_MTU;
  2385. return 0;
  2386. }
  2387. static int alloc_resources(struct mlx5_vdpa_net *ndev)
  2388. {
  2389. struct mlx5_vdpa_net_resources *res = &ndev->res;
  2390. int err;
  2391. if (res->valid) {
  2392. mlx5_vdpa_warn(&ndev->mvdev, "resources already allocated\n");
  2393. return -EEXIST;
  2394. }
  2395. err = mlx5_vdpa_alloc_transport_domain(&ndev->mvdev, &res->tdn);
  2396. if (err)
  2397. return err;
  2398. err = create_tis(ndev);
  2399. if (err)
  2400. goto err_tis;
  2401. res->valid = true;
  2402. return 0;
  2403. err_tis:
  2404. mlx5_vdpa_dealloc_transport_domain(&ndev->mvdev, res->tdn);
  2405. return err;
  2406. }
  2407. static void free_resources(struct mlx5_vdpa_net *ndev)
  2408. {
  2409. struct mlx5_vdpa_net_resources *res = &ndev->res;
  2410. if (!res->valid)
  2411. return;
  2412. destroy_tis(ndev);
  2413. mlx5_vdpa_dealloc_transport_domain(&ndev->mvdev, res->tdn);
  2414. res->valid = false;
  2415. }
  2416. static void init_mvqs(struct mlx5_vdpa_net *ndev)
  2417. {
  2418. struct mlx5_vdpa_virtqueue *mvq;
  2419. int i;
  2420. for (i = 0; i < ndev->mvdev.max_vqs; ++i) {
  2421. mvq = &ndev->vqs[i];
  2422. memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
  2423. mvq->index = i;
  2424. mvq->ndev = ndev;
  2425. mvq->fwqp.fw = true;
  2426. mvq->fw_state = MLX5_VIRTIO_NET_Q_OBJECT_NONE;
  2427. }
  2428. for (; i < ndev->mvdev.max_vqs; i++) {
  2429. mvq = &ndev->vqs[i];
  2430. memset(mvq, 0, offsetof(struct mlx5_vdpa_virtqueue, ri));
  2431. mvq->index = i;
  2432. mvq->ndev = ndev;
  2433. }
  2434. }
  2435. struct mlx5_vdpa_mgmtdev {
  2436. struct vdpa_mgmt_dev mgtdev;
  2437. struct mlx5_adev *madev;
  2438. struct mlx5_vdpa_net *ndev;
  2439. };
  2440. static u8 query_vport_state(struct mlx5_core_dev *mdev, u8 opmod, u16 vport)
  2441. {
  2442. u32 out[MLX5_ST_SZ_DW(query_vport_state_out)] = {};
  2443. u32 in[MLX5_ST_SZ_DW(query_vport_state_in)] = {};
  2444. int err;
  2445. MLX5_SET(query_vport_state_in, in, opcode, MLX5_CMD_OP_QUERY_VPORT_STATE);
  2446. MLX5_SET(query_vport_state_in, in, op_mod, opmod);
  2447. MLX5_SET(query_vport_state_in, in, vport_number, vport);
  2448. if (vport)
  2449. MLX5_SET(query_vport_state_in, in, other_vport, 1);
  2450. err = mlx5_cmd_exec_inout(mdev, query_vport_state, in, out);
  2451. if (err)
  2452. return 0;
  2453. return MLX5_GET(query_vport_state_out, out, state);
  2454. }
  2455. static bool get_link_state(struct mlx5_vdpa_dev *mvdev)
  2456. {
  2457. if (query_vport_state(mvdev->mdev, MLX5_VPORT_STATE_OP_MOD_VNIC_VPORT, 0) ==
  2458. VPORT_STATE_UP)
  2459. return true;
  2460. return false;
  2461. }
  2462. static void update_carrier(struct work_struct *work)
  2463. {
  2464. struct mlx5_vdpa_wq_ent *wqent;
  2465. struct mlx5_vdpa_dev *mvdev;
  2466. struct mlx5_vdpa_net *ndev;
  2467. wqent = container_of(work, struct mlx5_vdpa_wq_ent, work);
  2468. mvdev = wqent->mvdev;
  2469. ndev = to_mlx5_vdpa_ndev(mvdev);
  2470. if (get_link_state(mvdev))
  2471. ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
  2472. else
  2473. ndev->config.status &= cpu_to_mlx5vdpa16(mvdev, ~VIRTIO_NET_S_LINK_UP);
  2474. if (ndev->nb_registered && ndev->config_cb.callback)
  2475. ndev->config_cb.callback(ndev->config_cb.private);
  2476. kfree(wqent);
  2477. }
  2478. static int event_handler(struct notifier_block *nb, unsigned long event, void *param)
  2479. {
  2480. struct mlx5_vdpa_net *ndev = container_of(nb, struct mlx5_vdpa_net, nb);
  2481. struct mlx5_eqe *eqe = param;
  2482. int ret = NOTIFY_DONE;
  2483. struct mlx5_vdpa_wq_ent *wqent;
  2484. if (event == MLX5_EVENT_TYPE_PORT_CHANGE) {
  2485. switch (eqe->sub_type) {
  2486. case MLX5_PORT_CHANGE_SUBTYPE_DOWN:
  2487. case MLX5_PORT_CHANGE_SUBTYPE_ACTIVE:
  2488. wqent = kzalloc(sizeof(*wqent), GFP_ATOMIC);
  2489. if (!wqent)
  2490. return NOTIFY_DONE;
  2491. wqent->mvdev = &ndev->mvdev;
  2492. INIT_WORK(&wqent->work, update_carrier);
  2493. queue_work(ndev->mvdev.wq, &wqent->work);
  2494. ret = NOTIFY_OK;
  2495. break;
  2496. default:
  2497. return NOTIFY_DONE;
  2498. }
  2499. return ret;
  2500. }
  2501. return ret;
  2502. }
  2503. static int config_func_mtu(struct mlx5_core_dev *mdev, u16 mtu)
  2504. {
  2505. int inlen = MLX5_ST_SZ_BYTES(modify_nic_vport_context_in);
  2506. void *in;
  2507. int err;
  2508. in = kvzalloc(inlen, GFP_KERNEL);
  2509. if (!in)
  2510. return -ENOMEM;
  2511. MLX5_SET(modify_nic_vport_context_in, in, field_select.mtu, 1);
  2512. MLX5_SET(modify_nic_vport_context_in, in, nic_vport_context.mtu,
  2513. mtu + MLX5V_ETH_HARD_MTU);
  2514. MLX5_SET(modify_nic_vport_context_in, in, opcode,
  2515. MLX5_CMD_OP_MODIFY_NIC_VPORT_CONTEXT);
  2516. err = mlx5_cmd_exec_in(mdev, modify_nic_vport_context, in);
  2517. kvfree(in);
  2518. return err;
  2519. }
  2520. static int mlx5_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
  2521. const struct vdpa_dev_set_config *add_config)
  2522. {
  2523. struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
  2524. struct virtio_net_config *config;
  2525. struct mlx5_core_dev *pfmdev;
  2526. struct mlx5_vdpa_dev *mvdev;
  2527. struct mlx5_vdpa_net *ndev;
  2528. struct mlx5_core_dev *mdev;
  2529. u32 max_vqs;
  2530. u16 mtu;
  2531. int err;
  2532. if (mgtdev->ndev)
  2533. return -ENOSPC;
  2534. mdev = mgtdev->madev->mdev;
  2535. if (!(MLX5_CAP_DEV_VDPA_EMULATION(mdev, virtio_queue_type) &
  2536. MLX5_VIRTIO_EMULATION_CAP_VIRTIO_QUEUE_TYPE_SPLIT)) {
  2537. dev_warn(mdev->device, "missing support for split virtqueues\n");
  2538. return -EOPNOTSUPP;
  2539. }
  2540. max_vqs = min_t(int, MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues),
  2541. 1 << MLX5_CAP_GEN(mdev, log_max_rqt_size));
  2542. if (max_vqs < 2) {
  2543. dev_warn(mdev->device,
  2544. "%d virtqueues are supported. At least 2 are required\n",
  2545. max_vqs);
  2546. return -EAGAIN;
  2547. }
  2548. if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP)) {
  2549. if (add_config->net.max_vq_pairs > max_vqs / 2)
  2550. return -EINVAL;
  2551. max_vqs = min_t(u32, max_vqs, 2 * add_config->net.max_vq_pairs);
  2552. } else {
  2553. max_vqs = 2;
  2554. }
  2555. ndev = vdpa_alloc_device(struct mlx5_vdpa_net, mvdev.vdev, mdev->device, &mlx5_vdpa_ops,
  2556. MLX5_VDPA_NUMVQ_GROUPS, MLX5_VDPA_NUM_AS, name, false);
  2557. if (IS_ERR(ndev))
  2558. return PTR_ERR(ndev);
  2559. ndev->mvdev.mlx_features = mgtdev->mgtdev.supported_features;
  2560. ndev->mvdev.max_vqs = max_vqs;
  2561. mvdev = &ndev->mvdev;
  2562. mvdev->mdev = mdev;
  2563. ndev->vqs = kcalloc(max_vqs, sizeof(*ndev->vqs), GFP_KERNEL);
  2564. ndev->event_cbs = kcalloc(max_vqs + 1, sizeof(*ndev->event_cbs), GFP_KERNEL);
  2565. if (!ndev->vqs || !ndev->event_cbs) {
  2566. err = -ENOMEM;
  2567. goto err_alloc;
  2568. }
  2569. init_mvqs(ndev);
  2570. init_rwsem(&ndev->reslock);
  2571. config = &ndev->config;
  2572. if (add_config->mask & BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MTU)) {
  2573. err = config_func_mtu(mdev, add_config->net.mtu);
  2574. if (err)
  2575. goto err_alloc;
  2576. }
  2577. err = query_mtu(mdev, &mtu);
  2578. if (err)
  2579. goto err_alloc;
  2580. ndev->config.mtu = cpu_to_mlx5vdpa16(mvdev, mtu);
  2581. if (get_link_state(mvdev))
  2582. ndev->config.status |= cpu_to_mlx5vdpa16(mvdev, VIRTIO_NET_S_LINK_UP);
  2583. else
  2584. ndev->config.status &= cpu_to_mlx5vdpa16(mvdev, ~VIRTIO_NET_S_LINK_UP);
  2585. if (add_config->mask & (1 << VDPA_ATTR_DEV_NET_CFG_MACADDR)) {
  2586. memcpy(ndev->config.mac, add_config->net.mac, ETH_ALEN);
  2587. } else {
  2588. err = mlx5_query_nic_vport_mac_address(mdev, 0, 0, config->mac);
  2589. if (err)
  2590. goto err_alloc;
  2591. }
  2592. if (!is_zero_ether_addr(config->mac)) {
  2593. pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
  2594. err = mlx5_mpfs_add_mac(pfmdev, config->mac);
  2595. if (err)
  2596. goto err_alloc;
  2597. ndev->mvdev.mlx_features |= BIT_ULL(VIRTIO_NET_F_MAC);
  2598. }
  2599. config->max_virtqueue_pairs = cpu_to_mlx5vdpa16(mvdev, max_vqs / 2);
  2600. mvdev->vdev.dma_dev = &mdev->pdev->dev;
  2601. err = mlx5_vdpa_alloc_resources(&ndev->mvdev);
  2602. if (err)
  2603. goto err_mpfs;
  2604. if (MLX5_CAP_GEN(mvdev->mdev, umem_uid_0)) {
  2605. err = mlx5_vdpa_create_mr(mvdev, NULL, 0);
  2606. if (err)
  2607. goto err_res;
  2608. }
  2609. err = alloc_resources(ndev);
  2610. if (err)
  2611. goto err_mr;
  2612. ndev->cvq_ent.mvdev = mvdev;
  2613. INIT_WORK(&ndev->cvq_ent.work, mlx5_cvq_kick_handler);
  2614. mvdev->wq = create_singlethread_workqueue("mlx5_vdpa_wq");
  2615. if (!mvdev->wq) {
  2616. err = -ENOMEM;
  2617. goto err_res2;
  2618. }
  2619. ndev->nb.notifier_call = event_handler;
  2620. mlx5_notifier_register(mdev, &ndev->nb);
  2621. ndev->nb_registered = true;
  2622. mvdev->vdev.mdev = &mgtdev->mgtdev;
  2623. err = _vdpa_register_device(&mvdev->vdev, max_vqs + 1);
  2624. if (err)
  2625. goto err_reg;
  2626. mgtdev->ndev = ndev;
  2627. return 0;
  2628. err_reg:
  2629. destroy_workqueue(mvdev->wq);
  2630. err_res2:
  2631. free_resources(ndev);
  2632. err_mr:
  2633. mlx5_vdpa_destroy_mr(mvdev);
  2634. err_res:
  2635. mlx5_vdpa_free_resources(&ndev->mvdev);
  2636. err_mpfs:
  2637. if (!is_zero_ether_addr(config->mac))
  2638. mlx5_mpfs_del_mac(pfmdev, config->mac);
  2639. err_alloc:
  2640. put_device(&mvdev->vdev.dev);
  2641. return err;
  2642. }
  2643. static void mlx5_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev, struct vdpa_device *dev)
  2644. {
  2645. struct mlx5_vdpa_mgmtdev *mgtdev = container_of(v_mdev, struct mlx5_vdpa_mgmtdev, mgtdev);
  2646. struct mlx5_vdpa_dev *mvdev = to_mvdev(dev);
  2647. struct mlx5_vdpa_net *ndev = to_mlx5_vdpa_ndev(mvdev);
  2648. struct workqueue_struct *wq;
  2649. if (ndev->nb_registered) {
  2650. ndev->nb_registered = false;
  2651. mlx5_notifier_unregister(mvdev->mdev, &ndev->nb);
  2652. }
  2653. wq = mvdev->wq;
  2654. mvdev->wq = NULL;
  2655. destroy_workqueue(wq);
  2656. _vdpa_unregister_device(dev);
  2657. mgtdev->ndev = NULL;
  2658. }
  2659. static const struct vdpa_mgmtdev_ops mdev_ops = {
  2660. .dev_add = mlx5_vdpa_dev_add,
  2661. .dev_del = mlx5_vdpa_dev_del,
  2662. };
  2663. static struct virtio_device_id id_table[] = {
  2664. { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
  2665. { 0 },
  2666. };
  2667. static int mlx5v_probe(struct auxiliary_device *adev,
  2668. const struct auxiliary_device_id *id)
  2669. {
  2670. struct mlx5_adev *madev = container_of(adev, struct mlx5_adev, adev);
  2671. struct mlx5_core_dev *mdev = madev->mdev;
  2672. struct mlx5_vdpa_mgmtdev *mgtdev;
  2673. int err;
  2674. mgtdev = kzalloc(sizeof(*mgtdev), GFP_KERNEL);
  2675. if (!mgtdev)
  2676. return -ENOMEM;
  2677. mgtdev->mgtdev.ops = &mdev_ops;
  2678. mgtdev->mgtdev.device = mdev->device;
  2679. mgtdev->mgtdev.id_table = id_table;
  2680. mgtdev->mgtdev.config_attr_mask = BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MACADDR) |
  2681. BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MAX_VQP) |
  2682. BIT_ULL(VDPA_ATTR_DEV_NET_CFG_MTU);
  2683. mgtdev->mgtdev.max_supported_vqs =
  2684. MLX5_CAP_DEV_VDPA_EMULATION(mdev, max_num_virtio_queues) + 1;
  2685. mgtdev->mgtdev.supported_features = get_supported_features(mdev);
  2686. mgtdev->madev = madev;
  2687. err = vdpa_mgmtdev_register(&mgtdev->mgtdev);
  2688. if (err)
  2689. goto reg_err;
  2690. auxiliary_set_drvdata(adev, mgtdev);
  2691. return 0;
  2692. reg_err:
  2693. kfree(mgtdev);
  2694. return err;
  2695. }
  2696. static void mlx5v_remove(struct auxiliary_device *adev)
  2697. {
  2698. struct mlx5_vdpa_mgmtdev *mgtdev;
  2699. mgtdev = auxiliary_get_drvdata(adev);
  2700. vdpa_mgmtdev_unregister(&mgtdev->mgtdev);
  2701. kfree(mgtdev);
  2702. }
  2703. static const struct auxiliary_device_id mlx5v_id_table[] = {
  2704. { .name = MLX5_ADEV_NAME ".vnet", },
  2705. {},
  2706. };
  2707. MODULE_DEVICE_TABLE(auxiliary, mlx5v_id_table);
  2708. static struct auxiliary_driver mlx5v_driver = {
  2709. .name = "vnet",
  2710. .probe = mlx5v_probe,
  2711. .remove = mlx5v_remove,
  2712. .id_table = mlx5v_id_table,
  2713. };
  2714. module_auxiliary_driver(mlx5v_driver);