@@ -244,16 +244,17 @@ static const char *cxl_mem_opcode_to_name(u16 opcode)
244244int cxl_internal_send_cmd (struct cxl_memdev_state * mds ,
245245 struct cxl_mbox_cmd * mbox_cmd )
246246{
247+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
247248 size_t out_size , min_out ;
248249 int rc ;
249250
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 )
252253 return - E2BIG ;
253254
254255 out_size = mbox_cmd -> size_out ;
255256 min_out = mbox_cmd -> min_out ;
256- rc = mds -> mbox_send (mds , mbox_cmd );
257+ rc = cxl_mbox -> mbox_send (cxl_mbox , mbox_cmd );
257258 /*
258259 * EIO is reserved for a payload size mismatch and mbox_send()
259260 * may not return this error.
@@ -353,6 +354,7 @@ static int cxl_mbox_cmd_ctor(struct cxl_mbox_cmd *mbox,
353354 struct cxl_memdev_state * mds , u16 opcode ,
354355 size_t in_size , size_t out_size , u64 in_payload )
355356{
357+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
356358 * mbox = (struct cxl_mbox_cmd ) {
357359 .opcode = opcode ,
358360 .size_in = in_size ,
@@ -374,7 +376,7 @@ static int cxl_mbox_cmd_ctor(struct cxl_mbox_cmd *mbox,
374376
375377 /* Prepare to handle a full payload for variable sized output */
376378 if (out_size == CXL_VARIABLE_PAYLOAD )
377- mbox -> size_out = mds -> payload_size ;
379+ mbox -> size_out = cxl_mbox -> payload_size ;
378380 else
379381 mbox -> size_out = out_size ;
380382
@@ -398,6 +400,8 @@ static int cxl_to_mem_cmd_raw(struct cxl_mem_command *mem_cmd,
398400 const struct cxl_send_command * send_cmd ,
399401 struct cxl_memdev_state * mds )
400402{
403+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
404+
401405 if (send_cmd -> raw .rsvd )
402406 return - EINVAL ;
403407
@@ -406,7 +410,7 @@ static int cxl_to_mem_cmd_raw(struct cxl_mem_command *mem_cmd,
406410 * gets passed along without further checking, so it must be
407411 * validated here.
408412 */
409- if (send_cmd -> out .size > mds -> payload_size )
413+ if (send_cmd -> out .size > cxl_mbox -> payload_size )
410414 return - EINVAL ;
411415
412416 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,
494498 struct cxl_memdev_state * mds ,
495499 const struct cxl_send_command * send_cmd )
496500{
501+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
497502 struct cxl_mem_command mem_cmd ;
498503 int rc ;
499504
@@ -505,7 +510,7 @@ static int cxl_validate_cmd_from_user(struct cxl_mbox_cmd *mbox_cmd,
505510 * supports, but output can be arbitrarily large (simply write out as
506511 * much data as the hardware provides).
507512 */
508- if (send_cmd -> in .size > mds -> payload_size )
513+ if (send_cmd -> in .size > cxl_mbox -> payload_size )
509514 return - EINVAL ;
510515
511516 /* Sanitize and construct a cxl_mem_command */
@@ -591,6 +596,7 @@ static int handle_mailbox_cmd_from_user(struct cxl_memdev_state *mds,
591596 u64 out_payload , s32 * size_out ,
592597 u32 * retval )
593598{
599+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
594600 struct device * dev = mds -> cxlds .dev ;
595601 int rc ;
596602
@@ -601,7 +607,7 @@ static int handle_mailbox_cmd_from_user(struct cxl_memdev_state *mds,
601607 cxl_mem_opcode_to_name (mbox_cmd -> opcode ),
602608 mbox_cmd -> opcode , mbox_cmd -> size_in );
603609
604- rc = mds -> mbox_send (mds , mbox_cmd );
610+ rc = cxl_mbox -> mbox_send (cxl_mbox , mbox_cmd );
605611 if (rc )
606612 goto out ;
607613
@@ -659,11 +665,12 @@ int cxl_send_cmd(struct cxl_memdev *cxlmd, struct cxl_send_command __user *s)
659665static int cxl_xfer_log (struct cxl_memdev_state * mds , uuid_t * uuid ,
660666 u32 * size , u8 * out )
661667{
668+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
662669 u32 remaining = * size ;
663670 u32 offset = 0 ;
664671
665672 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 );
667674 struct cxl_mbox_cmd mbox_cmd ;
668675 struct cxl_mbox_get_log log ;
669676 int rc ;
@@ -752,17 +759,18 @@ static void cxl_walk_cel(struct cxl_memdev_state *mds, size_t size, u8 *cel)
752759
753760static struct cxl_mbox_get_supported_logs * cxl_get_gsl (struct cxl_memdev_state * mds )
754761{
762+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
755763 struct cxl_mbox_get_supported_logs * ret ;
756764 struct cxl_mbox_cmd mbox_cmd ;
757765 int rc ;
758766
759- ret = kvmalloc (mds -> payload_size , GFP_KERNEL );
767+ ret = kvmalloc (cxl_mbox -> payload_size , GFP_KERNEL );
760768 if (!ret )
761769 return ERR_PTR (- ENOMEM );
762770
763771 mbox_cmd = (struct cxl_mbox_cmd ) {
764772 .opcode = CXL_MBOX_OP_GET_SUPPORTED_LOGS ,
765- .size_out = mds -> payload_size ,
773+ .size_out = cxl_mbox -> payload_size ,
766774 .payload_out = ret ,
767775 /* At least the record number field must be valid */
768776 .min_out = 2 ,
@@ -910,6 +918,7 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
910918 enum cxl_event_log_type log ,
911919 struct cxl_get_event_payload * get_pl )
912920{
921+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
913922 struct cxl_mbox_clear_event_payload * payload ;
914923 u16 total = le16_to_cpu (get_pl -> record_count );
915924 u8 max_handles = CXL_CLEAR_EVENT_MAX_HANDLES ;
@@ -920,8 +929,8 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
920929 int i ;
921930
922931 /* 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 )) /
925934 sizeof (__le16 );
926935 pl_size = struct_size (payload , handles , max_handles );
927936 }
@@ -979,6 +988,7 @@ static int cxl_clear_event_record(struct cxl_memdev_state *mds,
979988static void cxl_mem_get_records_log (struct cxl_memdev_state * mds ,
980989 enum cxl_event_log_type type )
981990{
991+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
982992 struct cxl_memdev * cxlmd = mds -> cxlds .cxlmd ;
983993 struct device * dev = mds -> cxlds .dev ;
984994 struct cxl_get_event_payload * payload ;
@@ -995,7 +1005,7 @@ static void cxl_mem_get_records_log(struct cxl_memdev_state *mds,
9951005 .payload_in = & log_type ,
9961006 .size_in = sizeof (log_type ),
9971007 .payload_out = payload ,
998- .size_out = mds -> payload_size ,
1008+ .size_out = cxl_mbox -> payload_size ,
9991009 .min_out = struct_size (payload , records , 0 ),
10001010 };
10011011
@@ -1327,6 +1337,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,
13271337 struct cxl_region * cxlr )
13281338{
13291339 struct cxl_memdev_state * mds = to_cxl_memdev_state (cxlmd -> cxlds );
1340+ struct cxl_mailbox * cxl_mbox = & mds -> cxlds .cxl_mbox ;
13301341 struct cxl_mbox_poison_out * po ;
13311342 struct cxl_mbox_poison_in pi ;
13321343 int nr_records = 0 ;
@@ -1345,7 +1356,7 @@ int cxl_mem_get_poison(struct cxl_memdev *cxlmd, u64 offset, u64 len,
13451356 .opcode = CXL_MBOX_OP_GET_POISON ,
13461357 .size_in = sizeof (pi ),
13471358 .payload_in = & pi ,
1348- .size_out = mds -> payload_size ,
1359+ .size_out = cxl_mbox -> payload_size ,
13491360 .payload_out = po ,
13501361 .min_out = struct_size (po , record , 0 ),
13511362 };
@@ -1381,7 +1392,9 @@ static void free_poison_buf(void *buf)
13811392/* Get Poison List output buffer is protected by mds->poison.lock */
13821393static int cxl_poison_alloc_buf (struct cxl_memdev_state * mds )
13831394{
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 );
13851398 if (!mds -> poison .list_out )
13861399 return - ENOMEM ;
13871400
@@ -1407,6 +1420,19 @@ int cxl_poison_state_init(struct cxl_memdev_state *mds)
14071420}
14081421EXPORT_SYMBOL_NS_GPL (cxl_poison_state_init , CXL );
14091422
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+
14101436struct cxl_memdev_state * cxl_memdev_state_create (struct device * dev )
14111437{
14121438 struct cxl_memdev_state * mds ;
@@ -1417,7 +1443,6 @@ struct cxl_memdev_state *cxl_memdev_state_create(struct device *dev)
14171443 return ERR_PTR (- ENOMEM );
14181444 }
14191445
1420- mutex_init (& mds -> mbox_mutex );
14211446 mutex_init (& mds -> event .log_lock );
14221447 mds -> cxlds .dev = dev ;
14231448 mds -> cxlds .reg_map .host = dev ;
0 commit comments