@@ -306,8 +306,7 @@ static int cxl_pci_setup_mailbox(struct cxl_mem *cxlm)
306
306
return 0 ;
307
307
}
308
308
309
- static void __iomem * cxl_pci_map_regblock (struct pci_dev * pdev ,
310
- struct cxl_register_map * map )
309
+ static int cxl_map_regblock (struct pci_dev * pdev , struct cxl_register_map * map )
311
310
{
312
311
void __iomem * addr ;
313
312
int bar = map -> barno ;
@@ -318,24 +317,27 @@ static void __iomem *cxl_pci_map_regblock(struct pci_dev *pdev,
318
317
if (pci_resource_len (pdev , bar ) < offset ) {
319
318
dev_err (dev , "BAR%d: %pr: too small (offset: %pa)\n" , bar ,
320
319
& pdev -> resource [bar ], & offset );
321
- return NULL ;
320
+ return - ENXIO ;
322
321
}
323
322
324
323
addr = pci_iomap (pdev , bar , 0 );
325
324
if (!addr ) {
326
325
dev_err (dev , "failed to map registers\n" );
327
- return addr ;
326
+ return - ENOMEM ;
328
327
}
329
328
330
329
dev_dbg (dev , "Mapped CXL Memory Device resource bar %u @ %pa\n" ,
331
330
bar , & offset );
332
331
333
- return addr ;
332
+ map -> base = addr + map -> block_offset ;
333
+ return 0 ;
334
334
}
335
335
336
- static void cxl_pci_unmap_regblock (struct pci_dev * pdev , void __iomem * base )
336
+ static void cxl_unmap_regblock (struct pci_dev * pdev ,
337
+ struct cxl_register_map * map )
337
338
{
338
- pci_iounmap (pdev , base );
339
+ pci_iounmap (pdev , map -> base - map -> block_offset );
340
+ map -> base = NULL ;
339
341
}
340
342
341
343
static int cxl_pci_dvsec (struct pci_dev * pdev , int dvsec )
@@ -361,12 +363,12 @@ static int cxl_pci_dvsec(struct pci_dev *pdev, int dvsec)
361
363
return 0 ;
362
364
}
363
365
364
- static int cxl_probe_regs (struct pci_dev * pdev , void __iomem * base ,
365
- struct cxl_register_map * map )
366
+ static int cxl_probe_regs (struct pci_dev * pdev , struct cxl_register_map * map )
366
367
{
367
368
struct cxl_component_reg_map * comp_map ;
368
369
struct cxl_device_reg_map * dev_map ;
369
370
struct device * dev = & pdev -> dev ;
371
+ void __iomem * base = map -> base ;
370
372
371
373
switch (map -> reg_type ) {
372
374
case CXL_REGLOC_RBI_COMPONENT :
@@ -442,7 +444,6 @@ static void cxl_decode_regblock(u32 reg_lo, u32 reg_hi,
442
444
*/
443
445
static int cxl_pci_setup_regs (struct cxl_mem * cxlm )
444
446
{
445
- void __iomem * base ;
446
447
u32 regloc_size , regblocks ;
447
448
int regloc , i , n_maps , ret = 0 ;
448
449
struct device * dev = cxlm -> dev ;
@@ -475,12 +476,12 @@ static int cxl_pci_setup_regs(struct cxl_mem *cxlm)
475
476
if (map -> reg_type > CXL_REGLOC_RBI_MEMDEV )
476
477
continue ;
477
478
478
- base = cxl_pci_map_regblock (pdev , map );
479
- if (! base )
480
- return - ENOMEM ;
479
+ ret = cxl_map_regblock (pdev , map );
480
+ if (ret )
481
+ return ret ;
481
482
482
- ret = cxl_probe_regs (pdev , base + map -> block_offset , map );
483
- cxl_pci_unmap_regblock (pdev , base );
483
+ ret = cxl_probe_regs (pdev , map );
484
+ cxl_unmap_regblock (pdev , map );
484
485
if (ret )
485
486
return ret ;
486
487
0 commit comments