@@ -244,16 +244,17 @@ static const char *cxl_mem_opcode_to_name(u16 opcode)
244
244
int cxl_internal_send_cmd (struct cxl_memdev_state * mds ,
245
245
struct cxl_mbox_cmd * mbox_cmd )
246
246
{
247
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
247
248
size_t out_size , min_out ;
248
249
int rc ;
249
250
250
- if (mbox_cmd -> size_in > mds -> payload_size ||
251
- mbox_cmd -> size_out > mds -> payload_size )
251
+ if (mbox_cmd -> size_in > cxl_mbox -> payload_size ||
252
+ mbox_cmd -> size_out > cxl_mbox -> payload_size )
252
253
return - E2BIG ;
253
254
254
255
out_size = mbox_cmd -> size_out ;
255
256
min_out = mbox_cmd -> min_out ;
256
- rc = mds -> mbox_send (mds , mbox_cmd );
257
+ rc = cxl_mbox -> mbox_send (cxl_mbox , mbox_cmd );
257
258
/*
258
259
* EIO is reserved for a payload size mismatch and mbox_send()
259
260
* may not return this error.
@@ -353,6 +354,7 @@ static int cxl_mbox_cmd_ctor(struct cxl_mbox_cmd *mbox,
353
354
struct cxl_memdev_state * mds , u16 opcode ,
354
355
size_t in_size , size_t out_size , u64 in_payload )
355
356
{
357
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
356
358
* mbox = (struct cxl_mbox_cmd ) {
357
359
.opcode = opcode ,
358
360
.size_in = in_size ,
@@ -374,7 +376,7 @@ static int cxl_mbox_cmd_ctor(struct cxl_mbox_cmd *mbox,
374
376
375
377
/* Prepare to handle a full payload for variable sized output */
376
378
if (out_size == CXL_VARIABLE_PAYLOAD )
377
- mbox -> size_out = mds -> payload_size ;
379
+ mbox -> size_out = cxl_mbox -> payload_size ;
378
380
else
379
381
mbox -> size_out = out_size ;
380
382
@@ -398,6 +400,8 @@ static int cxl_to_mem_cmd_raw(struct cxl_mem_command *mem_cmd,
398
400
const struct cxl_send_command * send_cmd ,
399
401
struct cxl_memdev_state * mds )
400
402
{
403
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
404
+
401
405
if (send_cmd -> raw .rsvd )
402
406
return - EINVAL ;
403
407
@@ -406,7 +410,7 @@ static int cxl_to_mem_cmd_raw(struct cxl_mem_command *mem_cmd,
406
410
* gets passed along without further checking, so it must be
407
411
* validated here.
408
412
*/
409
- if (send_cmd -> out .size > mds -> payload_size )
413
+ if (send_cmd -> out .size > cxl_mbox -> payload_size )
410
414
return - EINVAL ;
411
415
412
416
if (!cxl_mem_raw_command_allowed (send_cmd -> raw .opcode ))
@@ -494,6 +498,7 @@ static int cxl_validate_cmd_from_user(struct cxl_mbox_cmd *mbox_cmd,
494
498
struct cxl_memdev_state * mds ,
495
499
const struct cxl_send_command * send_cmd )
496
500
{
501
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
497
502
struct cxl_mem_command mem_cmd ;
498
503
int rc ;
499
504
@@ -505,7 +510,7 @@ static int cxl_validate_cmd_from_user(struct cxl_mbox_cmd *mbox_cmd,
505
510
* supports, but output can be arbitrarily large (simply write out as
506
511
* much data as the hardware provides).
507
512
*/
508
- if (send_cmd -> in .size > mds -> payload_size )
513
+ if (send_cmd -> in .size > cxl_mbox -> payload_size )
509
514
return - EINVAL ;
510
515
511
516
/* Sanitize and construct a cxl_mem_command */
@@ -591,6 +596,7 @@ static int handle_mailbox_cmd_from_user(struct cxl_memdev_state *mds,
591
596
u64 out_payload , s32 * size_out ,
592
597
u32 * retval )
593
598
{
599
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
594
600
struct device * dev = mds -> cxlds .dev ;
595
601
int rc ;
596
602
@@ -601,7 +607,7 @@ static int handle_mailbox_cmd_from_user(struct cxl_memdev_state *mds,
601
607
cxl_mem_opcode_to_name (mbox_cmd -> opcode ),
602
608
mbox_cmd -> opcode , mbox_cmd -> size_in );
603
609
604
- rc = mds -> mbox_send (mds , mbox_cmd );
610
+ rc = cxl_mbox -> mbox_send (cxl_mbox , mbox_cmd );
605
611
if (rc )
606
612
goto out ;
607
613
@@ -659,11 +665,12 @@ int cxl_send_cmd(struct cxl_memdev *cxlmd, struct cxl_send_command __user *s)
659
665
static int cxl_xfer_log (struct cxl_memdev_state * mds , uuid_t * uuid ,
660
666
u32 * size , u8 * out )
661
667
{
668
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
662
669
u32 remaining = * size ;
663
670
u32 offset = 0 ;
664
671
665
672
while (remaining ) {
666
- u32 xfer_size = min_t (u32 , remaining , mds -> payload_size );
673
+ u32 xfer_size = min_t (u32 , remaining , cxl_mbox -> payload_size );
667
674
struct cxl_mbox_cmd mbox_cmd ;
668
675
struct cxl_mbox_get_log log ;
669
676
int rc ;
@@ -752,17 +759,18 @@ static void cxl_walk_cel(struct cxl_memdev_state *mds, size_t size, u8 *cel)
752
759
753
760
static struct cxl_mbox_get_supported_logs * cxl_get_gsl (struct cxl_memdev_state * mds )
754
761
{
762
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
755
763
struct cxl_mbox_get_supported_logs * ret ;
756
764
struct cxl_mbox_cmd mbox_cmd ;
757
765
int rc ;
758
766
759
- ret = kvmalloc (mds -> payload_size , GFP_KERNEL );
767
+ ret = kvmalloc (cxl_mbox -> payload_size , GFP_KERNEL );
760
768
if (!ret )
761
769
return ERR_PTR (- ENOMEM );
762
770
763
771
mbox_cmd = (struct cxl_mbox_cmd ) {
764
772
.opcode = CXL_MBOX_OP_GET_SUPPORTED_LOGS ,
765
- .size_out = mds -> payload_size ,
773
+ .size_out = cxl_mbox -> payload_size ,
766
774
.payload_out = ret ,
767
775
/* At least the record number field must be valid */
768
776
.min_out = 2 ,
@@ -910,6 +918,7 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
910
918
enum cxl_event_log_type log ,
911
919
struct cxl_get_event_payload * get_pl )
912
920
{
921
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
913
922
struct cxl_mbox_clear_event_payload * payload ;
914
923
u16 total = le16_to_cpu (get_pl -> record_count );
915
924
u8 max_handles = CXL_CLEAR_EVENT_MAX_HANDLES ;
@@ -920,8 +929,8 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
920
929
int i ;
921
930
922
931
/* Payload size may limit the max handles */
923
- if (pl_size > mds -> payload_size ) {
924
- max_handles = (mds -> payload_size - sizeof (* payload )) /
932
+ if (pl_size > cxl_mbox -> payload_size ) {
933
+ max_handles = (cxl_mbox -> payload_size - sizeof (* payload )) /
925
934
sizeof (__le16 );
926
935
pl_size = struct_size (payload , handles , max_handles );
927
936
}
@@ -979,6 +988,7 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
979
988
static void cxl_mem_get_records_log (struct cxl_memdev_state * mds ,
980
989
enum cxl_event_log_type type )
981
990
{
991
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
982
992
struct cxl_memdev * cxlmd = mds -> cxlds .cxlmd ;
983
993
struct device * dev = mds -> cxlds .dev ;
984
994
struct cxl_get_event_payload * payload ;
@@ -995,7 +1005,7 @@ static void cxl_mem_get_records_log(struct cxl_memdev_state *mds,
995
1005
.payload_in = & log_type ,
996
1006
.size_in = sizeof (log_type ),
997
1007
.payload_out = payload ,
998
- .size_out = mds -> payload_size ,
1008
+ .size_out = cxl_mbox -> payload_size ,
999
1009
.min_out = struct_size (payload , records , 0 ),
1000
1010
};
1001
1011
@@ -1327,6 +1337,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,
1327
1337
struct cxl_region * cxlr )
1328
1338
{
1329
1339
struct cxl_memdev_state * mds = to_cxl_memdev_state (cxlmd -> cxlds );
1340
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
1330
1341
struct cxl_mbox_poison_out * po ;
1331
1342
struct cxl_mbox_poison_in pi ;
1332
1343
int nr_records = 0 ;
@@ -1345,7 +1356,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,
1345
1356
.opcode = CXL_MBOX_OP_GET_POISON ,
1346
1357
.size_in = sizeof (pi ),
1347
1358
.payload_in = & pi ,
1348
- .size_out = mds -> payload_size ,
1359
+ .size_out = cxl_mbox -> payload_size ,
1349
1360
.payload_out = po ,
1350
1361
.min_out = struct_size (po , record , 0 ),
1351
1362
};
@@ -1381,7 +1392,9 @@ static void free_poison_buf(void *buf)
1381
1392
/* Get Poison List output buffer is protected by mds->poison.lock */
1382
1393
static int cxl_poison_alloc_buf (struct cxl_memdev_state * mds )
1383
1394
{
1384
- mds -> poison .list_out = kvmalloc (mds -> payload_size , GFP_KERNEL );
1395
+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
1396
+
1397
+ mds -> poison .list_out = kvmalloc (cxl_mbox -> payload_size , GFP_KERNEL );
1385
1398
if (!mds -> poison .list_out )
1386
1399
return - ENOMEM ;
1387
1400
@@ -1407,6 +1420,19 @@ int cxl_poison_state_init(struct cxl_memdev_state *mds)
1407
1420
}
1408
1421
EXPORT_SYMBOL_NS_GPL (cxl_poison_state_init , CXL );
1409
1422
1423
+ int cxl_mailbox_init (struct cxl_mailbox * cxl_mbox , struct device * host )
1424
+ {
1425
+ if (!cxl_mbox || !host )
1426
+ return - EINVAL ;
1427
+
1428
+ cxl_mbox -> host = host ;
1429
+ mutex_init (& cxl_mbox -> mbox_mutex );
1430
+ rcuwait_init (& cxl_mbox -> mbox_wait );
1431
+
1432
+ return 0 ;
1433
+ }
1434
+ EXPORT_SYMBOL_NS_GPL (cxl_mailbox_init , CXL );
1435
+
1410
1436
struct cxl_memdev_state * cxl_memdev_state_create (struct device * dev )
1411
1437
{
1412
1438
struct cxl_memdev_state * mds ;
@@ -1417,7 +1443,6 @@ struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev)
1417
1443
return ERR_PTR (- ENOMEM );
1418
1444
}
1419
1445
1420
- mutex_init (& mds -> mbox_mutex );
1421
1446
mutex_init (& mds -> event .log_lock );
1422
1447
mds -> cxlds .dev = dev ;
1423
1448
mds -> cxlds .reg_map .host = dev ;
0 commit comments